Compare commits

...

16 commits
0.2.1 ... main

Author SHA1 Message Date
Firq 123f600f6f
Fixed linting issues
All checks were successful
/ astro-check (push) Successful in 45s
2024-07-18 22:06:30 +02:00
Firq 2a208c60c8
Using latest for now
All checks were successful
/ astro-check (push) Successful in 21s
2024-07-18 22:04:51 +02:00
Firq 75d498852f
Switch to custom node-alpine image
Some checks failed
/ astro-check (push) Failing after 28s
2024-07-18 21:57:59 +02:00
Firq 96df246781
Fixed Workflow
Some checks failed
/ astro-check (push) Failing after 12m33s
2024-07-18 21:35:30 +02:00
Firq 89189da621
Workflow improvements
Some checks failed
/ astro-check (push) Failing after 43s
2024-07-18 21:29:12 +02:00
Firq 57cf29e71c
Navbar improvements
All checks were successful
/ build-site (push) Successful in 1m0s
/ checking (push) Successful in 15s
/ publish (push) Successful in 1m16s
2024-07-16 21:11:28 +02:00
Firq 034d769e7e
Switched to alpine containers
All checks were successful
/ checking (push) Successful in 56s
/ publish (push) Successful in 9s
/ build-site (push) Successful in 1m17s
2024-07-16 20:21:53 +02:00
Firq 5e4da25f8d
Fixed Docker File
All checks were successful
/ checking (push) Successful in 14s
/ publish (push) Successful in 6s
/ build-site (push) Successful in 2m23s
2024-07-16 19:46:53 +02:00
Firq 1975bbc8d2
Fixed darkreader issue
All checks were successful
/ checking (push) Successful in 11s
/ publish (push) Successful in 7s
/ build-site (push) Successful in 8m7s
2024-07-16 19:30:04 +02:00
Firq d67e426f15
Less shifting UI
All checks were successful
/ checking (push) Successful in 13s
/ publish (push) Successful in 7s
/ build-site (push) Successful in 1m59s
2024-07-16 18:43:22 +02:00
Firq 1f1bc5a7db
More Redesign 2
All checks were successful
/ build-site (push) Successful in 1m58s
/ checking (push) Successful in 20s
/ publish (push) Successful in 7s
2024-07-15 22:38:41 +02:00
Firq 5da1dde6a6
More Redesign
All checks were successful
/ checking (push) Successful in 14s
/ build-site (push) Successful in 1m46s
/ publish (push) Successful in 7s
2024-07-15 17:53:42 +02:00
Firq 9e61582456
Coloring of stuff
All checks were successful
/ checking (push) Successful in 13s
/ build-site (push) Successful in 1m46s
/ publish (push) Successful in 7s
/ unlighthouse (push) Successful in 54s
/ deploy-unlighthouse-files (push) Successful in 9s
/ deploy-unlighthouse-site (push) Successful in 6s
2024-07-15 15:28:08 +02:00
Firq 9c2c7f7818
Redesign Part 2
All checks were successful
/ checking (push) Successful in 14s
/ build-site (push) Successful in 2m12s
/ publish (push) Successful in 8s
2024-07-15 14:39:52 +02:00
Firq f1bb9b80ca
Redesign
All checks were successful
/ checking (push) Successful in 13s
/ build-site (push) Successful in 2m20s
/ publish (push) Successful in 1m4s
2024-07-14 21:15:16 +02:00
Firq 0b4bca36ed
Pinned Docker versions and preemptively fixed issues with ARIA
All checks were successful
/ checking (push) Successful in 13s
/ build-site (push) Successful in 2m22s
/ publish (push) Successful in 7s
/ deploy-unlighthouse-files (push) Successful in 6s
/ unlighthouse (push) Successful in 40s
/ deploy-unlighthouse-site (push) Successful in 6s
2024-06-20 22:26:56 +02:00
36 changed files with 2169 additions and 1663 deletions

View file

@ -4,38 +4,54 @@ on:
- '[0-9]+\.[0-9]+\.[0-9]+-pre\.[0-9]+'
jobs:
checking:
check-tag:
runs-on: docker
container: node:lts
steps:
- name: Checking Out Repository Code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Check if Version in package.json matches Tag
run: |
VERSION=$(cat package.json | grep "version" | sed 's/.*://' | tr -d , | tr -d \" | tr -d " " )
if test $VERSION != "${{ github.ref_name }}"; then
echo "Expected Version is: '${{ github.ref_name }}' actual Version is: '$VERSION'";
exit 1
else
echo "Version is: '$VERSION'";
fi
checking:
needs: [ check-tag ]
runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/node-alpine-git:latest
steps:
- name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages
run: npm install
run: npm i
- name: Run astro check (linting + static analysis)
run: npm run astro check
build-site:
needs: [checking]
needs: [ checking ]
if: success()
runs-on: dind
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
- name: Log into Docker Package Registry
uses: docker/login-action@v3
with:
registry: forgejo.neshweb.net
username: ${{ secrets.FORGEJO_USERNAME }}
password: ${{ secrets.FORGEJO_TOKEN }}
- name: Push to Package Registry
- name: Build and push to Docker Package Registry
uses: docker/build-push-action@v5
with:
push: true
tags: forgejo.neshweb.net/firq/fgo-ta-com-website:${{ github.ref_name }}, forgejo.neshweb.net/firq/fgo-ta-com-website:preview
publish:
needs: [build-site]
create-release:
needs: [ build-site ]
if: success()
runs-on: docker
steps:

View file

@ -4,38 +4,54 @@ on:
- '[0-9]+\.[0-9]+\.[0-9]+'
jobs:
checking:
check-tag:
runs-on: docker
container: node:lts
steps:
- name: Checking Out Repository Code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Check if Version in package.json matches Tag
run: |
VERSION=$(cat package.json | grep "version" | sed 's/.*://' | tr -d , | tr -d \" | tr -d " " )
if test $VERSION != "${{ github.ref_name }}"; then
echo "Expected Version is: '${{ github.ref_name }}' actual Version is: '$VERSION'";
exit 1
else
echo "Version is: '$VERSION'";
fi
checking:
needs: [ check-tag ]
runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/node-alpine-git:latest
steps:
- name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages
run: npm install
run: npm i
- name: Run astro check (linting + static analysis)
run: npm run astro check
build-site:
needs: [checking]
needs: [ checking ]
if: success()
runs-on: dind
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
- name: Log into Docker Package Registry
uses: docker/login-action@v3
with:
registry: forgejo.neshweb.net
username: ${{ secrets.FORGEJO_USERNAME }}
password: ${{ secrets.FORGEJO_TOKEN }}
- name: Push to Package Registry
- name: Build and push to Docker Package Registry
uses: docker/build-push-action@v5
with:
push: true
tags: forgejo.neshweb.net/firq/fgo-ta-com-website:${{ github.ref_name }}, forgejo.neshweb.net/firq/fgo-ta-com-website:latest
release:
needs: [build-site]
create-release:
needs: [ build-site ]
if: success()
runs-on: docker
steps:

View file

@ -4,13 +4,13 @@ on:
- '**'
jobs:
checking:
astro-check:
runs-on: docker
container: node:lts
container: forgejo.neshweb.net/ci-docker-images/node-alpine-git:latest
steps:
- name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages
run: npm install
run: npm i
- name: Run astro check (linting + static analysis)
run: npm run astro check

View file

@ -1,13 +1,12 @@
on:
push:
tags:
- '[0-9]+\.[0-9]+\.[0-9]+-unlighthouse\.[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+-ulh\.[0-9]+'
jobs:
unlighthouse:
runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/unlighthouse:latest
container: forgejo.neshweb.net/ci-docker-images/unlighthouse:0.2.1
steps:
- name: Checkout repository
uses: https://code.forgejo.org/actions/checkout@v3

View file

@ -1,15 +1,16 @@
FROM node:21.5 AS build
FROM node:22-alpine AS build
WORKDIR /site
COPY . .
RUN npm i
RUN npm run astro telemetry disable
RUN npm run build
FROM forgejo.neshweb.net/ci-docker-images/website-serve:latest AS runtime
FROM forgejo.neshweb.net/ci-docker-images/website-serve:2 AS runtime
COPY --from=build /site/dist /public
COPY --from=build /site/serve.json /public/serve.json
ENV PORT 8081
ENV PORT=8081
EXPOSE 8081
CMD [ "serve", "public/", "-p", "8081" ]
CMD serve public/ -p ${PORT}

2856
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
{
"name": "fgo-ta-com-website",
"type": "module",
"version": "0.2.1",
"version": "0.2.2-pre.10",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
@ -10,15 +10,16 @@
"astro": "astro"
},
"dependencies": {
"@astro-community/astro-embed-youtube": "^0.4.3",
"@astrojs/check": "^0.5.10",
"@astrojs/sitemap": "^3.1.4",
"astro": "^4.7.0",
"astro-meta-tags": "^0.1.3",
"autoprefixer": "^10.4.16",
"iconoir": "^7.3.0",
"postcss-preset-env": "^9.3.0",
"typescript": "^5.3.3"
"@astro-community/astro-embed-youtube": "^0.5.2",
"@astrojs/check": "^0.8.1",
"@astrojs/sitemap": "^3.1.6",
"@fontsource/work-sans": "^5.0.18",
"astro": "^4.11.5",
"astro-meta-tags": "^0.3.0",
"autoprefixer": "^10.4.19",
"iconoir": "^7.7.0",
"postcss-preset-env": "^9.6.0",
"typescript": "^5.5.3"
},
"browserslist": [
"last 2 versions",

View file

@ -1,5 +1,11 @@
---
import packagejson from '../../package.json'
export interface Props {
fadeout?: boolean
}
const { fadeout } = Astro.props
const display = fadeout ? "": "display: none"
const version = packagejson.version
const release = `https://forgejo.neshweb.net/Firq/fgo-ta-com-website/releases/tag/${version}`
---
@ -8,36 +14,34 @@ const release = `https://forgejo.neshweb.net/Firq/fgo-ta-com-website/releases/ta
<span>
This site is a project by Firq.
<br />
In the future, it will be used to catalogue information around FGO TA and the
game in general.
<br />
<a href="https://firq.dev" target="_blank" rel="noopener noreferrer"
>Feel free to check out my personal site.</a
>
<br />
<span class="version"
>( Website version: <a
>Website version: <a
href={release}
target="_blank"
rel="noopener noreferrer">{version}</a
> )</span
></span
>
</span>
<slot />
<div class="fade" style={display}></div>
</div>
<style>
div {
display: flex;
width: 100%;
max-height: auto;
background-color: var(--c-duskgray);
flex-wrap: nowrap;
flex-flow: column;
background-color: var(--c-darkergray);
text-align: center;
align-items: center;
justify-content: center;
color: white;
font-size: 1.5em;
padding: 2rem 0rem;
padding: 2rem 0rem 0rem 0rem;
}
a {
text-align: center;
@ -45,7 +49,14 @@ const release = `https://forgejo.neshweb.net/Firq/fgo-ta-com-website/releases/ta
color: var(--c-darkpurple);
}
.fade {
margin-top: 3rem;
background: linear-gradient(to bottom, transparent, var(--c-lightgray));
height: 2.5rem;
width: 100%;
}
.version {
font-size: 0.7em;
font-size: 0.65em;
}
</style>

View file

@ -0,0 +1,121 @@
---
export interface Props {
title: string
releaseDate: Date
shortdescription: string
link: string,
hlcolor: string,
}
const options_date: Intl.DateTimeFormatOptions = {
year: 'numeric',
month: 'long',
day: '2-digit',
}
const { releaseDate, title, link, hlcolor } = Astro.props
const render_date = releaseDate.toLocaleDateString('en-GB', options_date)
---
<a href={link} target="_blank" rel="noopener noreferrer">
<div class="circle"></div>
<article>
<h2>{title}</h2>
<h3>{render_date}</h3>
<!-- <p>{shortdescription}</p> -->
</article>
</a>
<style define:vars={{ hlcolor }}>
.circle {
display: none;
}
a {
align-items: center;
justify-content: center;
display: flex;
text-decoration: none;
height: fit-content;
margin: 0px 0.5rem;
width: 100%;
}
p {
color: white;
text-align: left;
font-size: 1em;
margin: 0px 0.5em;
}
article > h2 {
margin: 0px 0.5rem;
color: var(--hlcolor);
font-size: 1.2rem;
line-height: normal;
text-decoration: none;
}
article > h3 {
margin: 0px 0.5rem;
color: white;
font-size: 1rem;
line-height: normal;
text-decoration: none;
}
article {
display: flex;
flex: 1;
flex-wrap: wrap;
flex-direction: column;
align-items: center;
align-content: center;
justify-content: center;
background: var(--c-duskgray); /* linear-gradient(175deg, var(--c-duskgray), var(--c-duskgray), var(--c-duskgray), var(--hlcolor)); */
padding: 10px;
text-align: center;
transition: transform var(--speed) var(--ease);
min-height: 100%;
border-radius: 1.25rem;
border-style: solid;
border-width: 2px;
border-color: var(--c-darkergray);
}
a:hover > article {
transform: scaleY(102.5%) scaleX(101%);
transition: transform var(--speed) var(--ease);
}
@media (min-width: 900px) {
.circle {
margin: 1rem 0.5rem 1rem 0.5rem;
position: relative;
display: flex;
visibility: visible;
height: 1rem;
width: 1rem;
background-color: var(--c-darkpurple);
border-style: solid;
border-width: 0.25rem;
border-color: var(--c-lightgray);
border-radius: 40%;
transition: transform var(--speed) var(--ease);
}
a:hover > .circle {
height: 1.25rem;
width: 1.25rem;
translate: -0.125rem;
margin-right: 4px;
}
a:hover article {
border-color: var(--hlcolor);
transform: none;
}
article {
align-items: flex-start;
align-content: flex-start;
margin-left: 0.5rem;
}
}
</style>

View file

@ -0,0 +1,125 @@
---
export interface Props {
baseurl: string
slug: string
title: string
releaseDate: Date
shortdescription: string
}
const options_date: Intl.DateTimeFormatOptions = {
year: 'numeric',
month: 'long',
day: '2-digit',
}
const { shortdescription, releaseDate, slug, title, baseurl } = Astro.props
const url = `/${baseurl}/${slug}`
const render_date = releaseDate.toLocaleDateString(
'en-GB',
options_date
)
---
<a href={url} rel="noopener noreferrer">
<div class="circle"></div>
<article>
<h2>{title}</h2>
<h3>{render_date}</h3>
<p>{shortdescription}</p>
</article>
</a>
<style>
.circle {
display: none;
}
a {
align-items: center;
justify-content: center;
display: flex;
text-decoration: none;
height: fit-content;
margin: 0px 0.5rem;
width: 100%;
}
p {
color: white;
text-align: left;
font-size: 1.1em;
margin: 0.5em;
}
article > h2 {
margin: 0.3rem 0.5rem;
color: var(--c-darkpurple);
font-size: 1.5rem;
line-height: normal;
text-decoration: none;
}
article > h3 {
margin: 0.2em 0.5rem;
color: white;
font-size: 1rem;
line-height: normal;
text-decoration: none;
}
article {
display: flex;
flex: 1;
flex-wrap: wrap;
flex-direction: column;
align-items: center;
align-content: center;
justify-content: center;
background-color: var(--c-darkergray);
padding: 10px;
text-align: center;
transition: transform var(--speed) var(--ease);
min-height: 100%;
border-radius: 1.25rem;
}
a:hover > article {
transform: scaleY(102.5%) scaleX(101%);
transition: transform var(--speed) var(--ease);
}
@media (min-width: 900px) {
.circle {
margin: 1rem 0.5rem 1rem 0.5rem;
position: relative;
display: flex;
visibility: visible;
height: 1rem;
width: 1rem;
background-color: var(--c-darkpurple);
border-style: solid;
border-width: 0.25rem;
border-color: var(--c-lightgray);
border-radius: 40%;
transition: transform var(--speed) var(--ease);
}
a:hover > .circle {
height: 1.25rem;
width: 1.25rem;
translate: -0.125rem;
margin-right: 4px;
}
a:hover article {
border-color: var(--c-darkpurple);
transform: none;
}
article {
border-style: solid;
border-width: 2px;
border-color: var(--c-darkergray);
align-items: flex-start;
align-content: flex-start;
margin-left: 0.5rem;
}
}
</style>

View file

@ -7,7 +7,7 @@ const hamburger_src_url = `url("${hamburger.src}")`
<header>
<a href="/" rel="noopener noreferrer" aria-label="Home" role="button">
<Image src={logo} alt="FGO TA Logo" loading="eager"/>
<Image src={logo} alt="" loading="eager"/>
<span class="visually-hidden">Logo</span>
</a>
<ul class="desktop">
@ -18,7 +18,7 @@ const hamburger_src_url = `url("${hamburger.src}")`
aria-label="Navigation Button"
tabindex="0"
onclick="this.focus()"
role="navigation"
role="button"
>
<ul>
<slot name="mobile" />
@ -33,12 +33,13 @@ const hamburger_src_url = `url("${hamburger.src}")`
z-index: 1000;
position: sticky;
top: 0px;
background-color: var(--c-darkgray);
background-color: var(--c-darkergray);
display: flex;
height: auto;
width: 100%;
align-items: flex-start;
line-height: 1.5em;
border-bottom: 2px solid var(--c-darkpurple) ;
}
header > a {
margin-left: 16px;
@ -67,7 +68,7 @@ const hamburger_src_url = `url("${hamburger.src}")`
line-height: 1.5em;
}
.mobile > ul {
background-color: var(--c-darkgray);
background-color: var(--c-darkergray);
align-items: center;
flex-wrap: wrap;
flex-direction: column;
@ -84,7 +85,7 @@ const hamburger_src_url = `url("${hamburger.src}")`
.mobile {
display: flex;
background-color: var(--c-darkgray);
background-color: var(--c-darkergray);
border: 0px;
width: 100%;
height: 64px;
@ -114,13 +115,14 @@ const hamburger_src_url = `url("${hamburger.src}")`
.hamburger-menu {
mask: var(--hamburger_src_url) no-repeat center;
mask-size: cover;
background-color: white;
width: 2rem;
height: 2rem;
width: 2.25rem;
height: 2.25rem;
position: static;
align-self: flex-start;
margin-right: 1rem;
margin-top: 1rem;
margin-top: 0.825rem;
}
@media (min-width: 1140px) {

View file

@ -0,0 +1,108 @@
---
import '@fontsource/work-sans/800.css'
import '@fontsource/work-sans/600.css'
export interface Props {
maintext: string
subtext: string
fadeout?: boolean
baseurl?: string
returnbutton?: boolean
}
const { maintext, subtext, fadeout, baseurl, returnbutton } = Astro.props
const displayFadeout = fadeout ? "": "display: none"
const displayBackButton = returnbutton ? "": "display: none"
---
<div class="wrap">
<div class="head">{maintext}</div>
<div class="sub">{subtext}</div>
<a href=`/${baseurl}` style={displayBackButton}>&lt&lt Back to {baseurl}</a>
<div class="fade" style={displayFadeout}></div>
</div>
<style>
a {
font-weight: 600;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif;
color: white;
margin: 1rem 0px 0px;
padding: 0.5rem 0.75rem;
text-decoration: none;
background-color: var(--c-lightgray);
border-radius: 10px;
border-style: solid;
border-width: 2px;
border-color: var(--c-lightgray);
text-transform: capitalize;
}
a:hover {
border-color: var(--c-darkpurple);
}
.wrap {
position: relative;
width: 100%;
display: flex;
text-align: center;
align-items: center;
flex-wrap: wrap;
flex-direction: column;
color: var(--c-lighter);
background-color: var(--c-darkergray);
}
.fade {
margin-top: 2rem;
background: linear-gradient(to bottom, transparent, var(--c-lightgray));
height: 2.5rem;
width: 100%;
}
.head {
hyphens: auto;
padding-top: 2rem;
font-size: 2rem;
font-weight: 800;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial,
sans-serif;
}
.sub {
font-size: 0.75rem;
font-weight: 600;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial,
sans-serif;
}
.head {
color: var(--c-darkpurple);
}
@supports (background-clip: text) {
.head {
background: linear-gradient(125deg, var(--c-darkpurple), var(--c-purplepink), var(--c-reddish) );
background-clip: text;
color: transparent;
}
}
@media (min-width: 620px) {
.head {
hyphens: none;
font-size: 3rem;
}
.sub {
font-size: 0.75rem;
}
}
@media (min-width: 1000px) {
.head {
font-size: 4rem;
}
.sub {
font-size: 1rem;
}
}
</style>

View file

@ -0,0 +1,84 @@
---
import '@fontsource/work-sans/800.css'
export interface Props {
maintext: string
subtext: string
fadeout?: boolean
}
const { maintext, subtext, fadeout } = Astro.props
const display = fadeout ? "": "display: none"
---
<div class="wrap">
<div class="head">{maintext}</div>
<div class="sub">{subtext}</div>
<div class="fade" style={display}></div>
</div>
<style>
.wrap {
position: relative;
width: 100%;
display: flex;
text-align: center;
align-items: center;
flex-wrap: wrap;
flex-direction: column;
color: var(--c-lighter);
background-color: var(--c-darkergray);
}
.fade {
margin-top: 2rem;
background: linear-gradient(to bottom, transparent, var(--c-lightgray));
height: 2.5rem;
width: 100%;
}
.head {
hyphens: auto;
padding-top: 2rem;
font-size: 4rem;
font-weight: 800;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial,
sans-serif;
}
.sub {
font-size: 1.5rem;
font-weight: 800;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial,
sans-serif;
}
.head {
color: var(--c-darkpurple);
}
@supports (background-clip: text) {
.head {
background: linear-gradient(125deg, var(--c-darkpurple), var(--c-purplepink), var(--c-reddish) );
background-clip: text;
color: transparent;
}
}
@media (min-width: 620px) {
.head {
hyphens: none;
font-size: 6rem;
}
.sub {
font-size: 1.5rem;
}
}
@media (min-width: 1000px) {
.head {
font-size: 8rem;
}
.sub {
font-size: 2rem;
}
}
</style>

View file

@ -0,0 +1,11 @@
{
"info": {
"title": "Appends and Level 120",
"releaseDate": "2022-05-23",
"shortdescription": "Release of Append Skills and increased level cap of 120 with the Servant Coins Update",
"releaseNumber": 1,
"type": "event"
},
"link": "https://fategrandorder.fandom.com/wiki/FGO_Summer_2021_Event_Revival_(US)#Game_Updates",
"color": "#d4af37"
}

View file

@ -0,0 +1,11 @@
{
"info": {
"title": "Castoria",
"releaseDate": "2022-07-04",
"shortdescription": "Release of Castoria during the 5rd Anniversary of the game",
"releaseNumber": 1,
"type": "event"
},
"link": "https://apps.atlasacademy.io/db/NA/servant/284/",
"color": "#0b67fb"
}

View file

@ -0,0 +1,11 @@
{
"info": {
"title": "Koyanskaya of Light",
"releaseDate": "2023-07-03",
"shortdescription": "Release of Koyanskaya of Light during the 6th Anniversary of the game",
"releaseNumber": 1,
"type": "event"
},
"link": "https://apps.atlasacademy.io/db/NA/servant/314/",
"color": "#f7281f"
}

View file

@ -0,0 +1,11 @@
{
"info": {
"title": "Oberon",
"releaseDate": "2023-07-10",
"shortdescription": "Release of Oberon during the Lostbelt 6 Conclusion Campaign",
"releaseNumber": 1,
"type": "event"
},
"link": "https://apps.atlasacademy.io/db/NA/servant/316/",
"color": "#f7281f"
}

View file

@ -0,0 +1,11 @@
{
"info": {
"title": "Scathach-Skadi",
"releaseDate": "2020-07-06",
"shortdescription": "Release of Scathach-Skadi during the 3rd Anniversary of the game",
"releaseNumber": 1,
"type": "event"
},
"link": "https://apps.atlasacademy.io/db/NA/servant/215/",
"color": "#0eb31d"
}

View file

@ -14,7 +14,7 @@ const entry = z.object({
const quest = z.object({
questTitle: z.string(),
description: z.string(),
data: z.array(entry)
data: z.array(entry),
})
// Basic info block for page
@ -23,6 +23,7 @@ const info = z.object({
releaseDate: z.string().transform((str) => new Date(str)),
shortdescription: z.string(),
releaseNumber: z.number().default(1),
type: z.enum(["quest", "event", "group"]).default("quest")
})
// Combined ta data collection schema
@ -34,7 +35,23 @@ const taData = defineCollection({
}),
})
const groupDescription = defineCollection({
type: 'data',
schema: z.object({ info: info }),
})
const changes = defineCollection({
type: 'data',
schema: z.object({
info: info,
link: z.string().url(),
color: z.string(),
}),
})
export const collections = {
taInfoData: taData,
teslafest: taData,
groups: groupDescription,
changes: changes,
}

View file

@ -0,0 +1,9 @@
{
"info": {
"title": "Lostbelt 6 - Avalon le Fae",
"releaseDate": "2023-06-06",
"shortdescription": "The 6th Lostbelt, the journey into the Fairy Kingdom of Queen Morgan - do you have what it takes for some of the most difficult content of this game?",
"releaseNumber": 1,
"type": "group"
}
}

View file

@ -2,7 +2,8 @@
"info": {
"title": "Beast IV:L",
"releaseDate": "2023-12-26",
"shortdescription": "An interesting conclusion to Tunguska to say the least"
"shortdescription": "An interesting conclusion to Tunguska to say the least",
"type": "quest"
},
"quests": [
{

View file

@ -3,7 +3,8 @@
"title": "Case Files Rerun 2024",
"releaseDate": "2024-01-10",
"shortdescription": "The rerun of the collaboration event with the Case Files franchise - and the return of old challenges as well as a new challenge quest.",
"releaseNumber": 1
"releaseNumber": 1,
"type": "quest"
},
"quests": [
{

View file

@ -1,9 +1,10 @@
{
"info": {
"title": "Devilish Bodhisattva",
"releaseDate": "2022-06-21",
"releaseDate": "2019-04-23",
"shortdescription": "One of the most infamous fights in FGO, Full Power Beast III:R",
"releaseNumber": 1
"releaseNumber": 1,
"type": "quest"
},
"quests": [
{

View file

@ -1,13 +1,14 @@
{
"info": {
"title": "[Lostbelt 6] Albion",
"title": "Albion",
"releaseDate": "2023-07-10",
"shortdescription": "Albion shows up with a new mechanic, but will it be enough?",
"releaseNumber": 1
"releaseNumber": 1,
"type": "quest"
},
"quests": [
{
"questTitle": "[Lostbelt 6] Albion",
"questTitle": "Albion",
"description": "Albion shows up with a new mechanic, but will it be enough? No, because the mechanics are only seen as a small challenge and were quickly rendered a sideeffect during this quest - to the dismay of Melusine",
"data": [
{

View file

@ -1,13 +1,14 @@
{
"info": {
"title": "[Lostbelt 6] Cernunnos",
"title": "Cernunnos",
"releaseDate": "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",
"releaseNumber": 2
"releaseNumber": 2,
"type": "quest"
},
"quests": [
{
"questTitle": "[Lostbelt 6] Cernunnos",
"questTitle": "Cernunnos",
"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": [
{

View file

@ -1,13 +1,14 @@
{
"info": {
"title": "[Lostbelt 6] Queen Morgan",
"title": "Queen Morgan",
"releaseDate": "2023-06-20",
"shortdescription": "The fight against the Lostbelt 6 Queen as the conclusion of LB 6 Part 2",
"releaseNumber": 1
"releaseNumber": 1,
"type": "quest"
},
"quests": [
{
"questTitle": "[Lostbelt 6] Queen Morgan",
"questTitle": "Queen Morgan",
"description": "The fight against the Lostbelt 6 Queen as the conclusion of LB 6 Part 2 - Interesting field effects and a berserker enemy were making this fight interesting, as Morgan is hitting like an actual truck, meaning support cycling was a lot easier than usual.",
"data": [
{

View file

@ -2,13 +2,13 @@
"info": {
"title": "The Green Comet",
"releaseDate": "2024-03-21",
"shortdescription": "When Achillis decends, he brings swith him destruction ...",
"shortdescription": "When Achillis decends, he brings with him destruction ...",
"releaseNumber": 6
},
"quests": [
{
"questTitle": "The Green Comet",
"description": "When Achillis decends, he brings swith him destruction - time to teach him that this is a bad thing!",
"description": "When Achillis decends, he brings with him destruction - time to teach him that this is a bad thing!",
"data": [
{
"title": "Kama 2T",

View file

@ -58,6 +58,8 @@ const mapped_navdata = navdata.map((item) => ({
<meta property="og:type" content="website" />
<meta property="og:locale" content="en_US" />
<meta name="theme-color" content="#b86cff" />
<!-- Disable DarkReader, as site is already in dark mode -->
<meta name="darkreader-lock" content="this site only has darkmode">
<!-- Links -->
<link rel="icon" type="image/ico" href="/favicon.ico" />
<link rel="sitemap" href="/sitemap-index.xml" />
@ -103,6 +105,8 @@ const mapped_navdata = navdata.map((item) => ({
--c-lighterpurple: #c98fff;
--c-purplepink: #c105ff;
--c-darkergray: #1b1b1b;
--c-reddish: #ff0077;
--c-lighter: #eee;
}
body {
background: var(--c-lightgray);

View file

@ -1,41 +1,59 @@
---
export interface Props {
title: string
titlehidden?: boolean
displayLine?: boolean
}
const { title } = Astro.props
const { title, titlehidden, displayLine } = Astro.props
const display = titlehidden ? "display: none" : ""
const line = displayLine ? "flex" : "none"
---
<section>
<h1>{title}</h1>
<h1 style={display}>{title}</h1>
<div class="wrapper">
<div class="start hightlighter"></div>
<div class="line"></div>
<slot />
<div class="drop"></div>
<div class="drop hightlighter"></div>
</div>
</section>
<style>
<style define:vars={{ line }}>
section {
padding-left: 0.25em;
padding-right: 0.25em;
padding-bottom: 5rem;
}
.drop {
.hightlighter {
left: 0;
right: 0;
display: flex;
position: absolute;
visibility: visible;
left: 0;
right: 0;
bottom: -5rem;
margin-left: auto;
margin-right: auto;
height: 1.5rem;
width: 1.5rem;
}
.drop {
bottom: -5rem;
border-radius: 0% 50% 50% 50%;
transform: rotate(45deg);
background-color: var(--c-darkpurple);
}
.start {
top: -2rem;
border-radius: 40%;
border-style: solid;
border-width: 0.25rem;
border-color: var(--c-lightgray);
background-color: var(--c-darkpurple);
}
.line {
display: flex;
position: absolute;
@ -86,6 +104,9 @@ const { title } = Astro.props
.drop {
margin-left: 1.5rem;
}
.start {
margin-left: 1.25rem;
}
.line {
margin-left: 2.1rem;
}
@ -103,11 +124,17 @@ const { title } = Astro.props
section {
padding-bottom: unset;
}
.drop {
display: none;
.drop, .start, .line {
display: var(--line);
margin-left: 2rem;
}
.start {
margin-left: 1.75rem;
}
.line {
display: none;
margin-left: 2.6rem;
height: calc(100% + 6rem);
translate: 0px -2rem;
}
h1 {
margin-left: 15rem;

View file

@ -5,17 +5,18 @@ import TACard from '../components/taCard.astro'
import { plsLoadTAEntry } from '../utils/tools'
import { Image } from 'astro:assets'
import lizsad from '../assets/lizsad.png'
import SmallTitle from '../components/smallTitle.astro'
export interface Props {
collection: "teslafest" | "taInfoData"
collection: 'teslafest' | 'taInfoData'
collectionKey: string
baseurl: "database" | "teslafest"
baseurl: string
}
const { collection, collectionKey, baseurl } = Astro.props
const taEntry = await plsLoadTAEntry(collectionKey, collection)
const pagetitle = `${taEntry.info.title} - FGO TA`
const displaystate = taEntry.quests[0].data.length > 0 ? "none" : "flex"
const displaystate = taEntry.quests[0].data.length > 0 ? 'none' : 'flex'
---
<Layout
@ -23,7 +24,13 @@ const displaystate = taEntry.quests[0].data.length > 0 ? "none" : "flex"
currentpage="database-entry"
descriptionOverride={taEntry.info.shortdescription}
>
<a href=`/${baseurl}`>&lt&lt Back to database</a>
<SmallTitle
maintext={taEntry.info.title}
subtext={taEntry.info.shortdescription}
fadeout={true}
baseurl={baseurl}
returnbutton={true}
/>
{
taEntry.quests.map((item) => (
<BaseSection title={item.questTitle} description={item.description}>
@ -36,7 +43,12 @@ const displaystate = taEntry.quests[0].data.length > 0 ? "none" : "flex"
))
}
<div style=`display: ${displaystate}` class="overridewrapper">
<Image class="overrideimage" src={lizsad} alt="Sad override if there are no runs" loading="eager"></Image>
<Image
class="overrideimage"
src={lizsad}
alt="Sad override if there are no runs"
loading="eager"
/>
</div>
<div class="placeholder"></div>
</Layout>

View file

@ -0,0 +1,116 @@
---
import { getCollection } from 'astro:content'
import TaShowcaseLayout from '../../layouts/taShowcaseLayout.astro'
import Layout from '../../layouts/Layout.astro'
import DatabaseSection from '../../layouts/databaseSection.astro'
import QuestListing from '../../components/listings/questListingCard.astro'
import SmallTitle from '../../components/smallTitle.astro'
interface store {
slug: string
group: boolean
questinfo:
| undefined
| {
slug: string
info: {
title: string
releaseDate: Date
shortdescription: string
releaseNumber: number
}
}[]
pageinfo:
| undefined
| {
title: string
shortdescription: string
}
}
export async function getStaticPaths() {
const fulldata = await getCollection('taInfoData')
const slugdata: store[] = fulldata.map((data) => {
return {
slug: data.id,
group: false,
questinfo: undefined,
pageinfo: undefined,
}
})
const groupdata = await getCollection('groups')
const groups: store[] = groupdata.map((data) => {
return {
slug: data.id,
group: true,
questinfo: undefined,
pageinfo: undefined,
}
})
const full = slugdata.concat(groups as any)
full.map((data) => {
if (data.group) {
const coll = fulldata.filter((d) => d.id.startsWith(data.slug))
data.questinfo = coll.map((d) => {
return { slug: d.id, info: d.data.info }
})
data.questinfo.sort(
(a, b) =>
b.info.releaseDate.valueOf() - a.info.releaseDate.valueOf() ||
b.info.releaseNumber - a.info.releaseNumber
)
const page = groupdata.find((d) => d.id === data.slug)
data.pageinfo = page?.data.info
}
})
return full.map((data) => ({
params: { slug: data.slug },
props: {
key: data.slug,
group: data.group,
questinfo: data.questinfo,
pageinfo: data.pageinfo,
},
}))
}
const { key, group, questinfo, pageinfo } = Astro.props
---
{
!group && (
<TaShowcaseLayout
collection="taInfoData"
collectionKey={key}
baseurl="database"
/>
)
}
{
group && (
<Layout
title={`${pageinfo!.title} - TA Database - FGO TA`}
currentpage="database"
descriptionOverride={pageinfo!.shortdescription}
>
<SmallTitle
maintext={pageinfo!.title}
subtext={pageinfo!.shortdescription}
fadeout={true}
baseurl="database"
returnbutton={true}
/>
<DatabaseSection title="" titlehidden={true}>
{questinfo!.map((quest) => (
<QuestListing