Compare commits

..

2 commits

Author SHA1 Message Date
c5af572d38
Formatted astro files
All checks were successful
/ checking (push) Successful in 23s
/ build-site (push) Successful in 2m14s
/ release (push) Successful in 7s
2024-01-02 23:58:10 +01:00
04ec083b19
Added more runs, prettier formatting 2024-01-02 23:54:49 +01:00
28 changed files with 276 additions and 138 deletions

View file

@ -1,7 +1,7 @@
on: on:
push: push:
branches: branches:
- "**" - '**'
jobs: jobs:
checking: checking:

View file

@ -66,7 +66,6 @@ deploy-site:
- ssh $DEPLOY_USER@$DEPLOY_HOST 'PATH="$HOME/.local/bin:$PATH"; cd fgo-ta_com; find public -maxdepth 1 -printf "%p\n"; screen -S fgo-ta_com-public -dm serve public/ -p 9200' - ssh $DEPLOY_USER@$DEPLOY_HOST 'PATH="$HOME/.local/bin:$PATH"; cd fgo-ta_com; find public -maxdepth 1 -printf "%p\n"; screen -S fgo-ta_com-public -dm serve public/ -p 9200'
- echo "Website is up on https://fgo-ta.com" - echo "Website is up on https://fgo-ta.com"
redeploy-site: redeploy-site:
stage: scripts stage: scripts
when: manual when: manual

View file

@ -1,6 +1,6 @@
{ {
"trailingComma": "es5", "trailingComma": "es5",
"tabWidth": 2, "tabWidth": 2,
"semi": false, "semi": false,
"singleQuote": true "singleQuote": true
} }

View file

@ -1,5 +1,5 @@
import { defineConfig } from 'astro/config'; import { defineConfig } from 'astro/config'
import sitemap from "@astrojs/sitemap"; import sitemap from '@astrojs/sitemap'
export default defineConfig({ export default defineConfig({
sitemap: true, sitemap: true,
@ -7,5 +7,5 @@ export default defineConfig({
outDir: 'dist', outDir: 'dist',
publicDir: 'static', publicDir: 'static',
site: 'https://fgo-ta.com/', site: 'https://fgo-ta.com/',
integrations: [sitemap()] integrations: [sitemap()],
}); })

67
package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "fgo-ta-com-website", "name": "fgo-ta-com-website",
"version": "0.1.5", "version": "0.1.7",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "fgo-ta-com-website", "name": "fgo-ta-com-website",
"version": "0.1.5", "version": "0.1.7",
"dependencies": { "dependencies": {
"@astro-community/astro-embed-youtube": "^0.4.3", "@astro-community/astro-embed-youtube": "^0.4.3",
"@astrojs/check": "^0.3.4", "@astrojs/check": "^0.3.4",
@ -16,6 +16,10 @@
"iconoir": "^7.3.0", "iconoir": "^7.3.0",
"postcss-preset-env": "^9.3.0", "postcss-preset-env": "^9.3.0",
"typescript": "^5.3.3" "typescript": "^5.3.3"
},
"devDependencies": {
"prettier": "^3.1.1",
"prettier-plugin-astro": "^0.12.3"
} }
}, },
"node_modules/@ampproject/remapping": { "node_modules/@ampproject/remapping": {
@ -6273,6 +6277,41 @@
"node": ">=8.15" "node": ">=8.15"
} }
}, },
"node_modules/prettier": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz",
"integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==",
"devOptional": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/prettier-plugin-astro": {
"version": "0.12.3",
"resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.12.3.tgz",
"integrity": "sha512-GthUSu3zCvmtVyqlArosez0xE08vSJ0R1sWurxIWpABaCkNGYFANoUdFkqmIo54EV2uPLGcVJzOucWvCjPBWvg==",
"devOptional": true,
"dependencies": {
"@astrojs/compiler": "^1.5.5",
"prettier": "^3.0.0",
"sass-formatter": "^0.7.6"
},
"engines": {
"node": "^14.15.0 || >=16.0.0"
}
},
"node_modules/prettier-plugin-astro/node_modules/@astrojs/compiler": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-1.8.2.tgz",
"integrity": "sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==",
"devOptional": true
},
"node_modules/prismjs": { "node_modules/prismjs": {
"version": "1.29.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
@ -7050,6 +7089,12 @@
"queue-microtask": "^1.2.2" "queue-microtask": "^1.2.2"
} }
}, },
"node_modules/s.color": {
"version": "0.0.15",
"resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz",
"integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==",
"devOptional": true
},
"node_modules/safe-buffer": { "node_modules/safe-buffer": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -7074,6 +7119,15 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"node_modules/sass-formatter": {
"version": "0.7.8",
"resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.8.tgz",
"integrity": "sha512-7fI2a8THglflhhYis7k06eUf92VQuJoXzEs2KRP0r1bluFxKFvLx0Ns7c478oYGM0fPfrr846ZRWVi2MAgHt9Q==",
"devOptional": true,
"dependencies": {
"suf-log": "^2.5.3"
}
},
"node_modules/sax": { "node_modules/sax": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
@ -7418,6 +7472,15 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/suf-log": {
"version": "2.5.3",
"resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz",
"integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==",
"devOptional": true,
"dependencies": {
"s.color": "0.0.15"
}
},
"node_modules/supports-color": { "node_modules/supports-color": {
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",

View file

@ -1,7 +1,7 @@
{ {
"name": "fgo-ta-com-website", "name": "fgo-ta-com-website",
"type": "module", "type": "module",
"version": "0.1.6", "version": "0.1.7",
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
"start": "astro dev", "start": "astro dev",
@ -22,5 +22,9 @@
"browserslist": [ "browserslist": [
"last 2 versions", "last 2 versions",
">0.5% and not dead" ">0.5% and not dead"
] ],
"devDependencies": {
"prettier": "^3.1.1",
"prettier-plugin-astro": "^0.12.3"
}
} }

View file

@ -4,17 +4,22 @@
"etag": true, "etag": true,
"headers": [ "headers": [
{ {
"source" : "**/*.@(jpg|jpeg|gif|png|webp|svg)", "source": "**/*.@(jpg|jpeg|gif|png|webp|svg)",
"headers" : [{ "headers": [
"key" : "Cache-Control", {
"value" : "no-cache" "key": "Cache-Control",
}] "value": "no-cache"
}, { }
"source" : "404.html", ]
"headers" : [{ },
"key" : "Cache-Control", {
"value" : "no-cache" "source": "404.html",
}] "headers": [
{
"key": "Cache-Control",
"value": "no-cache"
}
]
} }
] ]
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View file

@ -1,63 +1,65 @@
--- ---
interface Props { interface Props {
title: string; title: string
body: string; body: string
href: string; href: string
} }
const { href, title, body } = Astro.props; const { href, title, body } = Astro.props
--- ---
<li class="link-card"> <li class="link-card">
<a href={href}> <a href={href}>
<h2> <h2>
{title} {title}
<span>&rarr;</span> <span>&rarr;</span>
</h2> </h2>
<p> <p>
{body} {body}
</p> </p>
</a> </a>
</li> </li>
<style> <style>
.link-card { .link-card {
list-style: none; list-style: none;
display: flex; display: flex;
padding: 0.25rem; padding: 0.25rem;
background-color: white; background-color: white;
background-image: none; background-image: none;
background-size: 400%; background-size: 400%;
border-radius: 0.6rem; border-radius: 0.6rem;
background-position: 100%; background-position: 100%;
transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1); transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1);
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); box-shadow:
} 0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -2px rgba(0, 0, 0, 0.1);
}
.link-card > a { .link-card > a {
width: 100%; width: 100%;
text-decoration: none; text-decoration: none;
line-height: 1.4; line-height: 1.4;
padding: 1rem 1.3rem; padding: 1rem 1.3rem;
border-radius: 0.35rem; border-radius: 0.35rem;
color: #111; color: #111;
background-color: white; background-color: white;
opacity: 0.8; opacity: 0.8;
} }
h2 { h2 {
margin: 0; margin: 0;
font-size: 1.25rem; font-size: 1.25rem;
transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1); transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1);
} }
p { p {
margin-top: 0.5rem; margin-top: 0.5rem;
margin-bottom: 0; margin-bottom: 0;
color: #444; color: #444;
} }
.link-card:is(:hover, :focus-within) { .link-card:is(:hover, :focus-within) {
background-position: 0; background-position: 0;
background-image: var(--accent-gradient); background-image: var(--accent-gradient);
} }
.link-card:is(:hover, :focus-within) h2 { .link-card:is(:hover, :focus-within) h2 {
color: rgb(var(--accent)); color: rgb(var(--accent));
} }
</style> </style>

View file

@ -11,9 +11,17 @@ const release = `https://forgejo.neshweb.net/Firq/fgo-ta-com-website/releases/ta
In the future, it will be used to catalogue information around FGO TA and the In the future, it will be used to catalogue information around FGO TA and the
game in general. game in general.
<br /> <br />
<a href="https://firq.dev" target="_blank" rel="noopener noreferrer">Feel free to check out my own site.</a> <a href="https://firq.dev" target="_blank" rel="noopener noreferrer"
>Feel free to check out my own site.</a
>
<br /> <br />
<span class="version">(Website version: <a href={release} target="_blank" rel="noopener noreferrer">{version}</a>)</span> <span class="version"
>(Website version: <a
href={release}
target="_blank"
rel="noopener noreferrer">{version}</a
>)</span
>
</span> </span>
<slot /> <slot />
</div> </div>

View file

@ -1,18 +1,23 @@
--- ---
import { Image } from 'astro:assets'; import { Image } from 'astro:assets'
import logo from '../assets/logo.svg' import logo from '../assets/logo.svg'
import hamburger from 'iconoir/icons/menu.svg' import hamburger from 'iconoir/icons/menu.svg'
const hamburger_src_url = `url("${hamburger.src}")`; const hamburger_src_url = `url("${hamburger.src}")`
--- ---
<header> <header>
<a href="/" rel="noopener noreferrer" aria-label="Home"> <a href="/" rel="noopener noreferrer" aria-label="Home">
<Image src={logo} alt="Website Logo"/> <Image src={logo} alt="Website Logo" />
</a> </a>
<ul class="desktop"> <ul class="desktop">
<slot /> <slot />
</ul> </ul>
<button class="mobile" aria-label="Navigation Button" tabindex="0" onclick="this.focus()"> <button
class="mobile"
aria-label="Navigation Button"
tabindex="0"
onclick="this.focus()"
>
<ul> <ul>
<slot /> <slot />
</ul> </ul>

View file

@ -17,7 +17,7 @@ if (currentPage === slug) {
currPage = 'current' currPage = 'current'
} }
const icon_src_url = `url("${icon.src}")`; const icon_src_url = `url("${icon.src}")`
const fulllink = `/${slug}` const fulllink = `/${slug}`
--- ---

View file

@ -12,7 +12,10 @@ const options_date: Intl.DateTimeFormatOptions = {
day: '2-digit', day: '2-digit',
} }
const { shortdescription, questReleaseDate, url, title } = Astro.props const { shortdescription, questReleaseDate, url, title } = Astro.props
const render_date = new Date(questReleaseDate).toLocaleDateString('en-GB', options_date) const render_date = new Date(questReleaseDate).toLocaleDateString(
'en-GB',
options_date
)
--- ---
<a href={url} rel="noopener noreferrer"> <a href={url} rel="noopener noreferrer">

View file

@ -2,16 +2,15 @@
import type { ImageMetadata } from 'astro' import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
export interface Props { export interface Props {
title: string, title: string
link: string, link: string
date: string, date: string
servant: string, servant: string
turns: string, turns: string
runner: string runner: string
} }
const { turns, runner, date, servant, link, title } = const { turns, runner, date, servant, link, title } = Astro.props
Astro.props
const options_date: Intl.DateTimeFormatOptions = { const options_date: Intl.DateTimeFormatOptions = {
year: 'numeric', year: 'numeric',
@ -25,12 +24,11 @@ const formatted_date = new Date(date).toLocaleDateString('de-DE', options_date)
const servant_images = import.meta.glob<{ default: ImageMetadata }>( const servant_images = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/ta_servants/*.png' '/src/assets/ta_servants/*.png'
) )
--- ---
<a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}> <a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}>
<article> <article>
<Image src={servant_images[servantImagePath]()} alt="" class="icon"/> <Image src={servant_images[servantImagePath]()} alt="" class="icon" />
<div class="title"> <div class="title">
<h2>{title}</h2> <h2>{title}</h2>
</div> </div>

View file

@ -1,26 +1,82 @@
{ {
"info": { "info": {
"title": "Cernunnos", "title": "Cernunnos",
"questReleaseDate": "2023-07-10", "questReleaseDate": "2023-07-10",
"shortdescription": "One of FGOs most notorious boss fights due to up to 100% special defense, strong DoT damage and powerful field effects", "shortdescription": "One of FGOs most notorious boss fights due to up to 100% special defense, strong DoT damage and powerful field effects",
"description": "One of FGOs most notorious boss fights due to up to 100% special defense, strong DoT damage and powerful field effects - and still, the TA community prevailed and created some of the most amazing runs of all time" "description": "One of FGOs most notorious boss fights due to up to 100% special defense, strong DoT damage and powerful field effects - and still, the TA community prevailed and created some of the most amazing runs of all time"
},
"data": [
{
"title": "Shishou 4T (No Castoria)",
"link": "https://www.youtube.com/watch?v=WrHudtdfivA",
"date": "2023-07-19",
"servant": "shishou",
"turns": "4T",
"runner": "Firq"
}, },
"data": [ {
{ "title": "Shishou 4T (FLO)",
"title": "Cernunnos 4T (No Castoria)", "link": "https://www.youtube.com/watch?v=O1f-go7uJQM",
"link": "https://www.youtube.com/watch?v=WrHudtdfivA", "date": "2023-07-19",
"date": "2023-07-19", "servant": "shishou",
"servant": "shishou", "turns": "4T",
"turns": "4T", "runner": "Requiem"
"runner": "Firq" },
}, {
{ "title": "Jalter 4T",
"title": "Cernunnos 4T (FLO)", "link": "https://www.youtube.com/watch?v=VGuXstsJa6k",
"link": "https://www.youtube.com/watch?O1f-go7uJQM", "date": "2023-07-10",
"date": "2023-07-19", "servant": "jalter",
"servant": "shishou", "turns": "4T",
"turns": "4T", "runner": "Ray"
"runner": "Requiem" },
} {
] "title": "Altera 4T",
"link": "https://www.youtube.com/watch?v=BrgJT3gC6sg",
"date": "2023-07-13",
"servant": "altera",
"turns": "4T",
"runner": "Requiem"
},
{
"title": "Astrea 4T (4 Slot)",
"link": "https://www.youtube.com/watch?v=0pwUn_bickU",
"date": "2023-07-17",
"servant": "astrea",
"turns": "4T",
"runner": "Alastair Hale"
},
{
"title": "Meltryllis 4T (4 Slot)",
"link": "https://www.youtube.com/watch?v=B5uZkC40SQc",
"date": "2023-07-21",
"servant": "melt",
"turns": "4T",
"runner": "Zectry"
},
{
"title": "Kijyo Koyo 4T",
"link": "https://www.youtube.com/watch?v=hea0QSvTbkY",
"date": "2023-07-14",
"servant": "koyo",
"turns": "4T",
"runner": "MCR"
},
{
"title": "Charlotte 4T",
"link": "https://www.youtube.com/watch?v=HMD2WLNGxAk",
"date": "2023-07-12",
"servant": "charlotte",
"turns": "4T",
"runner": "Dante09"
},
{
"title": "Gong 4T (4 NPs)",
"link": "https://www.youtube.com/watch?v=qQ82YA4BeGE",
"date": "2023-07-11",
"servant": "gong",
"turns": "4T",
"runner": "BadLuck"
}
]
} }

View file

@ -15,7 +15,7 @@ export interface Props {
const icons: IconsLookup = { const icons: IconsLookup = {
home: home, home: home,
database: database database: database,
} }
const { descriptionOverride, currentpage, title } = Astro.props const { descriptionOverride, currentpage, title } = Astro.props
@ -38,7 +38,7 @@ const mapped_navdata = navdata.map((item) => ({
})) }))
--- ---
<!DOCTYPE html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
<title>{title}</title> <title>{title}</title>

View file

@ -9,14 +9,13 @@ export interface Props {
} }
const { datafile } = Astro.props const { datafile } = Astro.props
const fulldata = import.meta.glob<{ default: any }>( const fulldata = import.meta.glob<{ default: any }>(`../content/data/*.json`)
`../content/data/*.json`
)
const filecontent: filedata = ( const filecontent: filedata = (
await fulldata[`../content/data/${datafile}.json`]() await fulldata[`../content/data/${datafile}.json`]()
)['default'] )['default']
const title = filecontent.info.title const title = filecontent.info.title
filecontent.data.sort((a, b) => Date.parse(b.date) - Date.parse(a.date))
--- ---
<Layout <Layout

View file

@ -9,7 +9,9 @@ const description =
'My own small blog. Topics include FGO, TA, Programming, web technologies and more!' 'My own small blog. Topics include FGO, TA, Programming, web technologies and more!'
const questInfo = [] const questInfo = []
const fulldata = import.meta.glob<{ default: filedata }>(`../content/data/*.json`) const fulldata = import.meta.glob<{ default: filedata }>(
`../content/data/*.json`
)
for (const [key, value] of Object.entries(fulldata)) { for (const [key, value] of Object.entries(fulldata)) {
const url = `${Astro.url}/${findSlug(key)}` const url = `${Astro.url}/${findSlug(key)}`

View file

@ -1,20 +1,14 @@
--- ---
import TaShowcaseLayout from '../../layouts/taShowcaseLayout.astro' import TaShowcaseLayout from '../../layouts/taShowcaseLayout.astro'
import {findSlug} from '../../utils/slugTools' import { findSlug } from '../../utils/slugTools'
export function getStaticPaths() { export function getStaticPaths() {
const fulldata = import.meta.glob<{ default: any }>( const fulldata = import.meta.glob<{ default: any }>(
`../../content/data/*.json` `../../content/data/*.json`
) )
const keylist = Object.keys(fulldata).map( const keylist = Object.keys(fulldata).map((item) => findSlug(item)!)
(item) => findSlug(item)
)
const paths: { params: { slug: string } }[] = [] return keylist.map((slug) => ({ params: { slug } }))
for (const key of keylist) {
paths.push({ params: { slug: key! } })
}
return paths
} }
const { slug } = Astro.params const { slug } = Astro.params

View file

@ -11,7 +11,7 @@ const description =
currentpage="home" currentpage="home"
descriptionOverride={description} descriptionOverride={description}
> >
<Hero /> <Hero />
</Layout> </Layout>
<style></style> <style></style>

View file

@ -1,3 +1,3 @@
export function findSlug(filepath: string) { export function findSlug(filepath: string) {
return filepath.match(/(?:.*[\\/])(.+)(?:\.json)/)?.[1] return filepath.match(/(?:.*[\\/])(.+)(?:\.json)/)?.[1]
} }