Compare commits

..

No commits in common. "main" and "0.1.18" have entirely different histories.
main ... 0.1.18

38 changed files with 302 additions and 3518 deletions

View file

@ -40,14 +40,13 @@ jobs:
runs-on: docker runs-on: docker
steps: steps:
- name: Release New Version - name: Release New Version
uses: https://code.forgejo.org/actions/forgejo-release@v1 uses: actions/forgejo-release@v1
with: with:
direction: upload direction: upload
url: https://forgejo.neshweb.net url: https://forgejo.neshweb.net
release-dir: release release-dir: release
token: ${{ secrets.FORGEJO_TOKEN }} token: ${{ secrets.FORGEJO_TOKEN }}
tag: ${{ github.ref_name }} tag: ${{ github.ref_name }}
prerelease: true
# doesn't work atm # doesn't work atm
# unlighthouse: # unlighthouse:

View file

@ -40,7 +40,7 @@ jobs:
runs-on: docker runs-on: docker
steps: steps:
- name: Release New Version - name: Release New Version
uses: https://code.forgejo.org/actions/forgejo-release@v1 uses: actions/forgejo-release@v1
with: with:
direction: upload direction: upload
url: https://forgejo.neshweb.net url: https://forgejo.neshweb.net

View file

@ -23,7 +23,6 @@ jobs:
deploy-unlighthouse-files: deploy-unlighthouse-files:
needs: [ unlighthouse ] needs: [ unlighthouse ]
if: success()
runs-on: docker runs-on: docker
env: env:
DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
@ -68,7 +67,6 @@ jobs:
deploy-unlighthouse-site: deploy-unlighthouse-site:
needs: [ deploy-unlighthouse-files ] needs: [ deploy-unlighthouse-files ]
if: success()
runs-on: docker runs-on: docker
env: env:
DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
@ -93,6 +91,5 @@ jobs:
key: ${{ secrets.SSH_PRIVATE_KEY }} key: ${{ secrets.SSH_PRIVATE_KEY }}
script: | script: |
PATH="$HOME/.local/bin:$PATH" PATH="$HOME/.local/bin:$PATH"
screen -ls | grep 'firq_dev-unlighthouse' | awk '{print $1}' | xargs -I % -t screen -X -S % quit
cd firq_dev cd firq_dev
screen -S firq_dev-unlighthouse -dm serve unlighthouse/ -p ${{ secrets.UNLIGHTHOUSE_DEPLOY_PORT }} screen -S firq_dev-unlighthouse -dm serve unlighthouse/ -p ${{ secrets.UNLIGHTHOUSE_DEPLOY_PORT }}

12
.vscode/settings.json vendored
View file

@ -1,12 +0,0 @@
{
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/Thumbs.db": true,
"**/__pycache__": true
},
"hide-files.files": []
}

View file

@ -1,6 +1,8 @@
import { defineConfig } from 'astro/config'; import { defineConfig } from 'astro/config';
import sitemap from "@astrojs/sitemap"; import sitemap from "@astrojs/sitemap";
// https://astro.build/config
import mdx from "@astrojs/mdx"; import mdx from "@astrojs/mdx";
// https://astro.build/config // https://astro.build/config

3373
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
{ {
"name": "@firq/fgosite", "name": "@firq/fgosite",
"type": "module", "type": "module",
"version": "0.1.27", "version": "0.1.18",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
@ -15,14 +15,8 @@
"@astrojs/check": "^0.3.3", "@astrojs/check": "^0.3.3",
"@astrojs/mdx": "^2.0.3", "@astrojs/mdx": "^2.0.3",
"@astrojs/sitemap": "^3.0.3", "@astrojs/sitemap": "^3.0.3",
"astro": "^4.2.1", "astro": "^4.0.7",
"autoprefixer": "^10.4.16",
"iconoir": "^7.2.0", "iconoir": "^7.2.0",
"postcss-preset-env": "^9.3.0",
"typescript": "^5.3.3" "typescript": "^5.3.3"
}, }
"browserslist": [
"last 2 versions",
">0.5% and not dead"
]
} }

View file

@ -1,13 +0,0 @@
module.exports = {
plugins: {
"postcss-preset-env": {
autoprefixer: { flexbox: "no-2009" },
stage: 2,
features: {
"custom-properties": false,
"custom-media-queries": true,
"nesting-rules": true
}
}
}
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

View file

@ -1,26 +1,29 @@
--- ---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import mlb_ce from '../assets/ce/mlb.webp' import mlb_ce from '../assets/ce/mlb.webp'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
name: string name: string
imageFile: string imageFile: string
mlb: boolean mlb: string
} }
const { mlb, imageFile, name } = Astro.props const { mlb, imageFile, name } = Astro.props
const imagePath = `/src/assets/ce/${imageFile}` const imagePath = `/src/assets/ce/${imageFile}`
const images_ces = import.meta.glob<GlobImage>('/src/assets/ce/*.png') const images_ces = import.meta.glob<{ default: ImageMetadata }>(
const loadedCEImage = plsLoadImage(images_ces, imagePath) '/src/assets/ce/*.{png,webp}'
)
const mlb_image = mlb ? 'mlbalign' : 'hidemlb' let mlb_image: string = 'mlbalign'
if (mlb === 'false') {
mlb_image = 'hidemlb'
}
--- ---
<article> <article>
<div> <div>
<Image src={loadedCEImage} alt={name} class="ce-crop" /> <Image src={images_ces[imagePath]()} alt={name} class="ce-crop" />
</div> </div>
<div class={mlb_image}> <div class={mlb_image}>
<Image src={mlb_ce} alt="Max-limit broken" class="mlb" /> <Image src={mlb_ce} alt="Max-limit broken" class="mlb" />

View file

@ -1,7 +1,6 @@
--- ---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
site: string site: string
@ -10,27 +9,19 @@ export interface Props {
} }
const { imageFile, link, site } = Astro.props const { imageFile, link, site } = Astro.props
const logoAltText = `${site} Logo`
const imagePath = `/src/assets/social/${imageFile}` const imagePath = `/src/assets/social/${imageFile}`
const images_logos = import.meta.glob<GlobImage>( const images_logos = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/social/*.{png,webp}' '/src/assets/social/*.{png,webp}'
) )
const loadedLogoImage = plsLoadImage(images_logos, imagePath)
--- ---
<a <a href={link} target="_blank" rel="noopener noreferrer" aria-label={site}>
href={link}
target="_blank"
rel="noopener noreferrer"
aria-label=`${site} - new window`
>
<article class="contact do-hover"> <article class="contact do-hover">
<Image src={loadedLogoImage} alt={logoAltText} /> <Image src={images_logos[imagePath]()} alt="" />
<div> <div>
<h2>{site}</h2> <h2>{site}</h2>
</div> </div>
</article> </article>
<span class="visually-hidden">{logoAltText}</span>
</a> </a>
<style> <style>

View file

@ -1,7 +1,6 @@
--- ---
import { Image } from 'astro:assets' import type { ImageMetadata } from 'astro';
import type { GlobImage } from '../types/generic' import { Image } from 'astro:assets';
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
name: string name: string
@ -12,20 +11,12 @@ export interface Props {
const { link, imageFile, origin, name } = Astro.props const { link, imageFile, origin, name } = Astro.props
const imagePath = `/src/assets/favourites/${imageFile}` const imagePath = `/src/assets/favourites/${imageFile}`
const images = import.meta.glob<GlobImage>( const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/favourites/*.{png,webp}')
'/src/assets/favourites/*.{png,webp}'
)
const loadedImage = plsLoadImage(images, imagePath)
--- ---
<a <a href={link} target="_blank" rel="noopener noreferrer">
href={link}
target="_blank"
rel="noopener noreferrer"
aria-label=`${name} - new window`
>
<div class="heading">{name}</div> <div class="heading">{name}</div>
<Image src={loadedImage} alt={name} /> <Image src={images[imagePath]()} alt={name} />
<h2 class="subtext"> <h2 class="subtext">
{origin} {origin}
</h2> </h2>
@ -45,6 +36,10 @@ const loadedImage = plsLoadImage(images, imagePath)
align-items: center; align-items: center;
} }
a:hover {
transform: scale(var(--hover-scale));
}
a { a {
border-radius: 1rem; border-radius: 1rem;
display: flex; display: flex;
@ -60,16 +55,12 @@ const loadedImage = plsLoadImage(images, imagePath)
text-align: center; text-align: center;
transition: transform var(--speed) var(--ease); transition: transform var(--speed) var(--ease);
text-decoration: none; text-decoration: none;
}
&:hover { a > img {
transform: scale(var(--hover-scale)); padding: 0px 0.25em;
} width: 90%;
height: auto;
img {
padding: 0px 0.25em;
width: 90%;
height: auto;
}
} }
@media (min-width: 512px) { @media (min-width: 512px) {
@ -77,10 +68,12 @@ const loadedImage = plsLoadImage(images, imagePath)
padding: 10px 10px; padding: 10px 10px;
width: auto; width: auto;
height: auto; height: auto;
img { }
padding: 0px 1.5em;
width: 200px; a > img {
} padding: 0px 1.5em;
width: 200px;
height: auto;
} }
} }

View file

@ -1,27 +0,0 @@
---
---
<div>
<span>
I am currently working on a site to catalogue past and future TAs.<br/>
Check it out at <a href="https://fgo-ta.com">fgo-ta.com</a>
</span>
</div>
<style>
div {
display: flex;
width: 100%;
height: 5em;
background-color: var(--c-gray);
text-align: center;
align-items: center;
justify-content: center;
color: white;
font-size: 1.5em;
}
a {
color: var(--c-darkpurple);
text-decoration: none;
}
</style>

View file

@ -6,19 +6,18 @@ const hamburger_src_url = `url("${hamburger.src}")`;
--- ---
<header> <header>
<a href="/" rel="noopener noreferrer" aria-label="Home" role="navigation"> <a href="/" rel="noopener noreferrer" aria-label="Home">
<Image src={logo} alt="Firq Website Logo"/> <Image src={logo} alt="Website Logo"/>
<span class="visually-hidden">Firq Website Logo</span>
</a> </a>
<ul class="desktop"> <ul class="desktop">
<slot name="desktop"/> <slot />
</ul> </ul>
<button class="mobile" aria-label="Navigation Button" tabindex="0" onclick="this.focus()" role="navigation"> <button class="mobile" aria-label="Navigation Button" tabindex="0" onclick="this.focus()">
<ul> <ul>
<slot name="mobile"/> <slot />
</ul> </ul>
<div class="placeholder"></div> <div class="placeholder"></div>
<div class="hamburger-menu" role="navigation"></div> <div class="hamburger-menu"></div>
</button> </button>
</header> </header>
@ -35,7 +34,7 @@ const hamburger_src_url = `url("${hamburger.src}")`;
line-height: 1.5em; line-height: 1.5em;
} }
header > a { header > a {
margin-left: 16px; padding-left: 16px;
padding-top: 8px; padding-top: 8px;
display: block; display: block;
height: 48px; height: 48px;
@ -108,13 +107,14 @@ const hamburger_src_url = `url("${hamburger.src}")`;
.hamburger-menu { .hamburger-menu {
mask: var(--hamburger_src_url) no-repeat center; mask: var(--hamburger_src_url) no-repeat center;
-webkit-mask: var(--hamburger_src_url) no-repeat center;
background-color: white; background-color: white;
width: 2rem; width: 2em;
height: 2rem; height: 2em;
position: static; position: static;
align-self: flex-start; align-self: flex-start;
margin-right: 1rem; padding-right: 1em;
margin-top: 1rem; padding-top: 2.5em;
} }
@media (min-width: 1140px) { @media (min-width: 1140px) {

View file

@ -1,13 +1,12 @@
--- ---
export interface Props { export interface Props {
currentPage?: string currentPage?: string
navtype: "mobile" | "desktop"
link: string link: string
text: string text: string
icon: ImageMetadata icon: ImageMetadata
} }
const { icon, text, link, navtype, currentPage } = Astro.props const { icon, text, link, currentPage } = Astro.props
let currPage = '' let currPage = ''
const slug = link.replace(new RegExp('/', 'g'), '') const slug = link.replace(new RegExp('/', 'g'), '')
@ -20,8 +19,6 @@ if (currentPage === slug) {
const icon_src_url = `url("${icon.src}")`; const icon_src_url = `url("${icon.src}")`;
const fulllink = `/${slug}` const fulllink = `/${slug}`
let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
--- ---
<li> <li>
@ -30,8 +27,7 @@ let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
rel="noopener noreferrer" rel="noopener noreferrer"
aria-label={text} aria-label={text}
class={currPage} class={currPage}
role="navigation" tabindex="0"
{...extraattributes}
> >
<div class="icon"></div> <div class="icon"></div>
{text} {text}
@ -77,6 +73,7 @@ let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
.icon { .icon {
mask: var(--icon_src_url) no-repeat center; mask: var(--icon_src_url) no-repeat center;
-webkit-mask: var(--icon_src_url) no-repeat center;
background-color: white; background-color: white;
width: 1.4em; width: 1.4em;
height: 1.4em; height: 1.4em;

View file

@ -1,7 +1,6 @@
--- ---
import type { ImageMetadata } from 'astro';
import { Image } from 'astro:assets'; import { Image } from 'astro:assets';
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
name: string name: string
@ -17,10 +16,8 @@ export interface Props {
const { bond10, ml, bondceImageFile, servantImageFile, np, skills, level, name } = Astro.props const { bond10, ml, bondceImageFile, servantImageFile, np, skills, level, name } = Astro.props
const servantImagePath = `/src/assets/servant/${servantImageFile}` const servantImagePath = `/src/assets/servant/${servantImageFile}`
const bondceImagePath = `/src/assets/ce/bond-ce/${bondceImageFile}` const bondceImagePath = `/src/assets/ce/bond-ce/${bondceImageFile}`
const images_servants = import.meta.glob<GlobImage>('/src/assets/servant/*.{png,webp}') const images_servants = import.meta.glob<{ default: ImageMetadata }>('/src/assets/servant/*.{png,webp}')
const images_bond_ces = import.meta.glob<GlobImage>('/src/assets/ce/bond-ce/*.{png,webp}') const images_bond_ces = import.meta.glob<{ default: ImageMetadata }>('/src/assets/ce/bond-ce/*.{png,webp}')
const loadedServantImage = plsLoadImage(images_servants, servantImagePath)
const loadedBondCEImage = plsLoadImage(images_bond_ces, bondceImagePath)
let bondce_css: string = 'bond-ce' let bondce_css: string = 'bond-ce'
@ -30,14 +27,14 @@ if (bond10 === false) {
--- ---
<article> <article>
<Image src={loadedServantImage} alt={name} /> <Image src={images_servants[servantImagePath]()} alt={name} />
<h2 class="subtext"> <h2 class="subtext">
Level {level}<br /> Level {level}<br />
{skills}<br /> {skills}<br />
NP {np} NP {np}
</h2> </h2>
<div class="expand-on-hover"> <div class="expand-on-hover">
<Image src={loadedBondCEImage} alt="" class={bondce_css}/> <Image src={images_bond_ces[bondceImagePath]()} alt="" class={bondce_css}/>
<h2 class="subtext">Mana Loading: {ml === 'Not Unlocked' && <br />}{ml}</h2> <h2 class="subtext">Mana Loading: {ml === 'Not Unlocked' && <br />}{ml}</h2>
</div> </div>
</article> </article>

View file

@ -1,8 +1,6 @@
--- ---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
date: string date: string
title: string title: string
@ -26,16 +24,13 @@ const targetImagePath = `/src/assets/ta_icons/${targetImageFile}`
const servantImagePath = `/src/assets/ta_icons/ta_servants/${servantImageFile}` const servantImagePath = `/src/assets/ta_icons/ta_servants/${servantImageFile}`
const formatted_date = new Date(date).toLocaleDateString('de-DE', options_date) const formatted_date = new Date(date).toLocaleDateString('de-DE', options_date)
const target_images = import.meta.glob<GlobImage>( const target_images = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/ta_icons/*.{png,webp}' '/src/assets/ta_icons/*.{png,webp}'
) )
const servant_images = import.meta.glob<GlobImage>( const servant_images = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/ta_icons/ta_servants/*.{png,webp}' '/src/assets/ta_icons/ta_servants/*.{png,webp}'
) )
const loadedServantImage = plsLoadImage(servant_images, servantImagePath)
const loadedTargetImage = plsLoadImage(target_images, targetImagePath)
let hasuser = '' let hasuser = ''
if (user !== undefined) { if (user !== undefined) {
hasuser = 'hasuser' hasuser = 'hasuser'
@ -44,7 +39,7 @@ if (user !== undefined) {
<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={loadedTargetImage} alt={title} class="icon" /> <Image src={target_images[targetImagePath]()} alt={title} class="icon" />
<div class="title"> <div class="title">
<h2>{title}</h2> <h2>{title}</h2>
</div> </div>
@ -55,7 +50,7 @@ if (user !== undefined) {
{formatted_date} {formatted_date}
</p> </p>
<div class="expand-on-hover"> <div class="expand-on-hover">
<Image src={loadedServantImage} alt="" /> <Image src={servant_images[servantImagePath ?? 'undefined']()} alt="" />
<h2>{turns}</h2> <h2>{turns}</h2>
</div> </div>
</article> </article>

View file

@ -1,7 +1,6 @@
--- ---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
title: string title: string
@ -10,22 +9,19 @@ export interface Props {
} }
const { imageFile, link, title } = Astro.props const { imageFile, link, title } = Astro.props
const logoAltText = `${title} Logo`
const imagePath = `/src/assets/technologies/${imageFile}` const imagePath = `/src/assets/technologies/${imageFile}`
const images_logos = import.meta.glob<GlobImage>( const images_logos = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/technologies/*.{png,webp}' '/src/assets/technologies/*.{png,webp}'
) )
const loadedImage = plsLoadImage(images_logos, imagePath)
--- ---
<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={loadedImage} alt={logoAltText} /> <Image src={images_logos[imagePath]()} alt="" />
<div> <div>
<h2>{title}</h2> <h2>{title}</h2>
</div> </div>
</article> </article>
<span class="visually-hidden">{logoAltText}</span>
</a> </a>
<style> <style>

View file

@ -77,12 +77,7 @@ const mapped_navdata = navdata.map((item) => ({
<Navbar> <Navbar>
{ {
mapped_navdata.map((item) => ( mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} navtype="desktop" {...item} slot="desktop"/> <NavbarEntry currentPage={currentpage} {...item} />
))
}
{
mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} navtype="mobile" {...item} slot="mobile"/>
)) ))
} }
</Navbar> </Navbar>
@ -107,15 +102,4 @@ const mapped_navdata = navdata.map((item) => ({
background: var(--c-lightgray); background: var(--c-lightgray);
margin: 0px; margin: 0px;
} }
.visually-hidden {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
</style> </style>

View file

@ -3,27 +3,23 @@ import okita from '../assets/okita.png'
import atlas from '../assets/atlas.png' import atlas from '../assets/atlas.png'
import foxcat from '../assets/lurker.png' import foxcat from '../assets/lurker.png'
import padoru from '../assets/padoru.png' import padoru from '../assets/padoru.png'
import { Image } from 'astro:assets' import { Image } from 'astro:assets';
import packagejson from '../../package.json'
const version = packagejson.version
const release = `https://forgejo.neshweb.net/Firq/firq-dev-website/releases/tag/${version}`
--- ---
<footer> <footer>
<div> <div>
“Fate/Grand Order” is a trademark of Notes Co., Ltd. | Game Assets © “Fate/Grand Order” is a trademark of Notes Co., Ltd. | Game Assets © Aniplex
Aniplex Inc. used under fair use. | View <a Inc. used under fair use. | View <a
class="linker" class="linker"
href="https://fate-go.us" href="https://fate-go.us"
target="_blank" target="_blank"
rel="noopener noreferrer">the official website</a rel="noopener noreferrer">the official website</a
> for more information.<br /> > for more information.<br />
I am in no way affiliated with Fate/Grand Order, Aniplex, Type Moon or I am in no way affiliated with Fate/Grand Order, Aniplex, Type Moon or Lasengle.
Lasengle. I claim no ownership of any of the assets used that are created by I claim no ownership of any of the assets used that are created by any of the
any of the mentioned companies.<br /> mentioned companies.<br />
All of the opinions expressed are my own and may not reflect those of the All of the opinions expressed are my own and may not reflect those of the asset
asset providers. providers.
</div> </div>
<br /> <br />
<div> <div>
@ -42,8 +38,8 @@ const release = `https://forgejo.neshweb.net/Firq/firq-dev-website/releases/tag/
href="https://mitsunee.com" href="https://mitsunee.com"
target="_blank" target="_blank"
rel="noopener noreferrer">Mitsunee</a rel="noopener noreferrer">Mitsunee</a
> for the support when building this site. I could not have done it without > for the support when building this site. I could not have done it without you
you 🧡 Check out <a 🧡 Check out <a
href="https://fgo.mitsunee.com" href="https://fgo.mitsunee.com"
target="_blank" target="_blank"
rel="noopener noreferrer">FGO Timers here</a rel="noopener noreferrer">FGO Timers here</a
@ -58,8 +54,7 @@ const release = `https://forgejo.neshweb.net/Firq/firq-dev-website/releases/tag/
href="https://mastodon.neshweb.net/@neshura" href="https://mastodon.neshweb.net/@neshura"
target="_blank" target="_blank"
rel="noopener noreferrer">Neshura</a rel="noopener noreferrer">Neshura</a
> for providing me with a place to develop, store and host this site. Check > for providing me with a place to develop, store and host this site. Check out
out
<a href="https://www.neshweb.net" target="_blank" rel="noopener noreferrer" <a href="https://www.neshweb.net" target="_blank" rel="noopener noreferrer"
>his site here</a >his site here</a
> >
@ -78,12 +73,6 @@ const release = `https://forgejo.neshweb.net/Firq/firq-dev-website/releases/tag/
<Image src={padoru} alt="Hashire sori yo ..." /> <Image src={padoru} alt="Hashire sori yo ..." />
</div> </div>
</div> </div>
<br />
<div>
Website version: <a href={release} target="_blank" rel="noopener noreferrer"
>{version}</a
>
</div>
</footer> </footer>
<style> <style>

View file

@ -17,7 +17,7 @@ const description = "Error. This shouldn't happen :/"
<Image src={sadshishou} alt="Sad Shishou" /> <Image src={sadshishou} alt="Sad Shishou" />
<h2>Well ... you were not supposed to end up here.</h2> <h2>Well ... you were not supposed to end up here.</h2>
<a href="/" aria-label="Home" rel="noopener noreferrer"> <a href="/" aria-label="Home" rel="noopener noreferrer">
&lt;&lt; Go back home <i class="iconoir-fast-arrow-left"></i>Go back home
</a> </a>
</div> </div>
</BaseSection> </BaseSection>
@ -50,10 +50,10 @@ const description = "Error. This shouldn't happen :/"
text-decoration: none; text-decoration: none;
font-size: 1.5rem; font-size: 1.5rem;
font-weight: bold; font-weight: bold;
}
&:hover { a:hover {
color: var(--c-darkpurple); color: var(--c-darkpurple);
}
} }
img { img {

View file

@ -6,9 +6,6 @@ description: 'A handful of observations from the cernunnos fight'
author: 'Requiem & Firq' author: 'Requiem & Firq'
tags: ['fgo', 'lostbelt 6', 'cernunnos'] tags: ['fgo', 'lostbelt 6', 'cernunnos']
--- ---
import thumbnail_firq from "../../assets/thumbnails/WrHudtdfivA.jpg"
import thumbnail_requiem from "../../assets/thumbnails/O1f-go7uJQM.jpg"
import YoutubeEmbed from "../../components/youtubeEmbed.astro"
## Foreword ## Foreword
@ -48,19 +45,3 @@ On the first break Cernunnos skill seals your servants. This means on turn 2 you
As an example: As an example:
Let's say I used Alteras third skill turn 1. She has to wait 5 turns to reuse it and on turn 3 Vitch gives her 2 times cooldown reduction. Let's say I used Alteras third skill turn 1. She has to wait 5 turns to reuse it and on turn 3 Vitch gives her 2 times cooldown reduction.
Ideally you would be able to reuse her third skill on turn 4 but because she gets skill sealed she can't do it. Ideally you would be able to reuse her third skill on turn 4 but because she gets skill sealed she can't do it.
## Resulting runs
Both Requiem and I managed to get unique TAs done with Scathach (Requiem even with more servants). Those runs are embedded here:
### Firq
This run doesn't use the support Castoria provided by the game and instead makes use of Sherlock instead.
<YoutubeEmbed id="WrHudtdfivA" thumbnail={thumbnail_firq.src}/>
### Requiem
A frontline only run with double Castoria
<YoutubeEmbed id="O1f-go7uJQM" thumbnail={thumbnail_requiem.src}/>

View file

@ -11,7 +11,6 @@ import TaSection from '../layouts/taSection.astro'
import TaCard from '../components/taCard.astro' import TaCard from '../components/taCard.astro'
import tadata from '../../static/data/_tadata.json' import tadata from '../../static/data/_tadata.json'
import featured_data from '../../static/data/_featureddata.json' import featured_data from '../../static/data/_featureddata.json'
import FgotaHero from '../components/fgotaHero.astro'
const important_data = tadata.filter(function (el) { const important_data = tadata.filter(function (el) {
return [ return [
@ -37,7 +36,6 @@ const description = 'A collection of TAs previously completed be Firq.'
currentpage="ta-collection" currentpage="ta-collection"
descriptionOverride={description} descriptionOverride={description}
> >
<FgotaHero />
<TaSection title="Notable TAs" abovetext="My most notable TAs"> <TaSection title="Notable TAs" abovetext="My most notable TAs">
{important_data.map((item) => <TaCard {...item} />)} {important_data.map((item) => <TaCard {...item} />)}
</TaSection> </TaSection>

View file

@ -1,10 +0,0 @@
export interface IconsLookup {
[key: string]: ImageMetadata
}
interface GlobGeneric<T> {
default: T
}
export type GlobAny = GlobGeneric<any>
export type GlobImage = GlobGeneric<ImageMetadata>

View file

@ -1,5 +0,0 @@
export function plsLoadImage(record: Record<string, () => Promise<{default: ImageMetadata}>>, path: string) {
const loadedImage = record[path]?.();
if (!loadedImage) throw new Error("Asset was not found:" + path);
return loadedImage;
}

View file

@ -2,56 +2,56 @@
{ {
"name": "The Merciless One", "name": "The Merciless One",
"imageFile": "merciless_one.png", "imageFile": "merciless_one.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Ox-Demon King", "name": "Ox-Demon King",
"imageFile": "ox-demon.png", "imageFile": "ox-demon.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Holy Maiden's Teachings", "name": "Holy Maiden's Teachings",
"imageFile": "maidens_teachings.png", "imageFile": "maidens_teachings.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Kaleidoscope", "name": "Kaleidoscope",
"imageFile": "kaleidoscope.png", "imageFile": "kaleidoscope.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "The Black Grail", "name": "The Black Grail",
"imageFile": "black_grail.png", "imageFile": "black_grail.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "A Fragment Of 2030", "name": "A Fragment Of 2030",
"imageFile": "2030.png", "imageFile": "2030.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Outrage", "name": "Outrage",
"imageFile": "outrage.png", "imageFile": "outrage.png",
"mlb": false "mlb": "false"
}, },
{ {
"name": "Vessel of the Saint", "name": "Vessel of the Saint",
"imageFile": "vessel.png", "imageFile": "vessel.png",
"mlb": false "mlb": "false"
}, },
{ {
"name": "Devilish Bodhisattva", "name": "Devilish Bodhisattva",
"imageFile": "devilish_bodhisattva.png", "imageFile": "devilish_bodhisattva.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "500-Year Obsession", "name": "500-Year Obsession",
"imageFile": "500.png", "imageFile": "500.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Prisma Cosmos", "name": "Prisma Cosmos",
"imageFile": "prisma_cosmos.png", "imageFile": "prisma_cosmos.png",
"mlb": true "mlb": "true"
} }
] ]

View file

@ -1,19 +1,9 @@
[ [
{
"name": "Scathach",
"level": "120",
"np": "5",
"skills": "10 / 10 / 10",
"ml": "10",
"servantImageFile": "scathach_03.png",
"bondceImageFile": "scathach.png",
"bond10": true
},
{ {
"name": "Skadi", "name": "Skadi",
"level": "120", "level": "120",
"np": "5", "np": "5",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "10", "ml": "10",
"servantImageFile": "skadi_03.png", "servantImageFile": "skadi_03.png",
"bondceImageFile": "skadi.png", "bondceImageFile": "skadi.png",
@ -23,7 +13,7 @@
"name": "Skadi", "name": "Skadi",
"level": "70", "level": "70",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "1", "ml": "1",
"servantImageFile": "skadi_02.png", "servantImageFile": "skadi_02.png",
"bondceImageFile": "skadi.png", "bondceImageFile": "skadi.png",
@ -33,7 +23,7 @@
"name": "Skadi", "name": "Skadi",
"level": "1", "level": "1",
"np": "1", "np": "1",
"skills": "10 / X / X", "skills": "10 / X / X ",
"ml": "1", "ml": "1",
"servantImageFile": "skadi_01.png", "servantImageFile": "skadi_01.png",
"bondceImageFile": "skadi.png", "bondceImageFile": "skadi.png",
@ -43,18 +33,18 @@
"name": "Koyanskaya of Light", "name": "Koyanskaya of Light",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "koyanlight_01.png", "servantImageFile": "koyanlight_01.png",
"bondceImageFile": "koyanlight.png", "bondceImageFile": "koyanlight.png",
"bond10": true "bond10": false
}, },
{ {
"name": "Castoria", "name": "Castoria",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "10", "ml": "7",
"servantImageFile": "castoria_02.png", "servantImageFile": "castoria_02.png",
"bondceImageFile": "castoria.png", "bondceImageFile": "castoria.png",
"bond10": true "bond10": true
@ -63,7 +53,7 @@
"name": "Castoria", "name": "Castoria",
"level": "70", "level": "70",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "1", "ml": "1",
"servantImageFile": "castoria_01.png", "servantImageFile": "castoria_01.png",
"bondceImageFile": "castoria.png", "bondceImageFile": "castoria.png",
@ -73,17 +63,17 @@
"name": "Oberon", "name": "Oberon",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "1", "ml": "Not Unlocked",
"servantImageFile": "oberon_02.png", "servantImageFile": "oberon_02.png",
"bondceImageFile": "oberon.png", "bondceImageFile": "oberon.png",
"bond10": true "bond10": false
}, },
{ {
"name": "Merlin", "name": "Merlin",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "merlin_03.png", "servantImageFile": "merlin_03.png",
"bondceImageFile": "merlin.png", "bondceImageFile": "merlin.png",
@ -93,7 +83,7 @@
"name": "Merlin", "name": "Merlin",
"level": "70", "level": "70",
"np": "1", "np": "1",
"skills": "9 / 1 / 9", "skills": "9 / 1 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "merlin_01.png", "servantImageFile": "merlin_01.png",
"bondceImageFile": "merlin.png", "bondceImageFile": "merlin.png",
@ -103,7 +93,7 @@
"name": "Waver", "name": "Waver",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "waver_02.png", "servantImageFile": "waver_02.png",
"bondceImageFile": "waver.png", "bondceImageFile": "waver.png",
@ -113,7 +103,7 @@
"name": "Reines", "name": "Reines",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "9", "ml": "9",
"servantImageFile": "reines_01.png", "servantImageFile": "reines_01.png",
"bondceImageFile": "reines.png", "bondceImageFile": "reines.png",
@ -123,7 +113,7 @@
"name": "Tamamo-no-Mae", "name": "Tamamo-no-Mae",
"level": "90", "level": "90",
"np": "2", "np": "2",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "tamamo_03.png", "servantImageFile": "tamamo_03.png",
"bondceImageFile": "tamamo.png", "bondceImageFile": "tamamo.png",
@ -133,7 +123,7 @@
"name": "Van Gogh", "name": "Van Gogh",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "10", "ml": "10",
"servantImageFile": "gogh_01.png", "servantImageFile": "gogh_01.png",
"bondceImageFile": "gogh.png", "bondceImageFile": "gogh.png",
@ -143,7 +133,7 @@
"name": "Miss Crane", "name": "Miss Crane",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "crane_01.png", "servantImageFile": "crane_01.png",
"bondceImageFile": "crane.png", "bondceImageFile": "crane.png",
@ -153,8 +143,8 @@
"name": "Ashiya Douman", "name": "Ashiya Douman",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "9 / 9 / 10", "skills": "9 / 9 / 10 ",
"ml": "10", "ml": "Not Unlocked",
"servantImageFile": "douman_01.png", "servantImageFile": "douman_01.png",
"bondceImageFile": "douman.png", "bondceImageFile": "douman.png",
"bond10": false "bond10": false
@ -163,47 +153,27 @@
"name": "Himiko", "name": "Himiko",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "9 / 9 / 9", "skills": "9 / 9 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "himiko_03.png", "servantImageFile": "himiko_03.png",
"bondceImageFile": "himiko.png", "bondceImageFile": "himiko.png",
"bond10": false "bond10": false
}, },
{
"name": "Sherlock Holmes",
"level": "90",
"np": "1",
"skills": "9 / 10 / 9",
"ml": "Not Unlocked",
"servantImageFile": "sherlock_03.png",
"bondceImageFile": "sherlock.png",
"bond10": false
},
{ {
"name": "Nero (Bride)", "name": "Nero (Bride)",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "bride_03.png", "servantImageFile": "bride_03.png",
"bondceImageFile": "bride.png", "bondceImageFile": "bride.png",
"bond10": false "bond10": false
}, },
{
"name": "Taigon Wang",
"level": "70",
"np": "1",
"skills": "10 / 9 / 10",
"ml": "Not Unlocked",
"servantImageFile": "taigong_03.png",
"bondceImageFile": "taigong.png",
"bond10": false
},
{ {
"name": "Nightingale (Santa)", "name": "Nightingale (Santa)",
"level": "80", "level": "80",
"np": "5", "np": "5",
"skills": "9 / 10 / 9", "skills": "9 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "santagale_01.png", "servantImageFile": "santagale_01.png",
"bondceImageFile": "santagale.png", "bondceImageFile": "santagale.png",
@ -213,7 +183,7 @@
"name": "Nightingale (Santa)", "name": "Nightingale (Santa)",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "1 / 10 / 10", "skills": "1 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "santagale_01.png", "servantImageFile": "santagale_01.png",
"bondceImageFile": "santagale.png", "bondceImageFile": "santagale.png",
@ -223,7 +193,7 @@
"name": "Elisabeth Báthory", "name": "Elisabeth Báthory",
"level": "40", "level": "40",
"np": "1", "np": "1",
"skills": "9 / 9 / X", "skills": "9 / 9 / X ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "liz_01.png", "servantImageFile": "liz_01.png",
"bondceImageFile": "liz.png", "bondceImageFile": "liz.png",
@ -233,7 +203,7 @@
"name": "Wu Zetian", "name": "Wu Zetian",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "10 / 9 / 10", "skills": "9 / 1 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "wu_01.png", "servantImageFile": "wu_01.png",
"bondceImageFile": "wu.png", "bondceImageFile": "wu.png",
@ -243,7 +213,7 @@
"name": "Ibaraki-Douji", "name": "Ibaraki-Douji",
"level": "40", "level": "40",
"np": "1", "np": "1",
"skills": "9 / 10 / X ", "skills": "8 / 8 / X ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "ibaraki_02.png", "servantImageFile": "ibaraki_02.png",
"bondceImageFile": "ibaraki.png", "bondceImageFile": "ibaraki.png",
@ -253,7 +223,7 @@
"name": "Calamity Jane", "name": "Calamity Jane",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "1 / 9 / 9", "skills": "1 / 9 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "jane_02.png", "servantImageFile": "jane_02.png",
"bondceImageFile": "jane.png", "bondceImageFile": "jane.png",
@ -263,7 +233,7 @@
"name": "Chiron", "name": "Chiron",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "1 / 10 / 10", "skills": "1 / 9 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "chiron_01.png", "servantImageFile": "chiron_01.png",
"bondceImageFile": "chiron.png", "bondceImageFile": "chiron.png",

View file

@ -310,21 +310,5 @@
"date": "2023-12-16", "date": "2023-12-16",
"servantImageFile": "shishou.png", "servantImageFile": "shishou.png",
"turns": "3T" "turns": "3T"
},
{
"title": "Tunguska - Beast of Taming 4T (FLO)",
"link": "https://www.youtube.com/watch?v=g6aASJeL-ao",
"targetImageFile": "koyanskayaofdark.png",
"date": "2023-12-26",
"servantImageFile": "shishou.png",
"turns": "4T"
},
{
"title": "Tunguska - Beast IV:L 4T",
"link": "https://www.youtube.com/watch?v=brz21NKMMsY",
"targetImageFile": "beast_4_l.png",
"date": "2023-12-31",
"servantImageFile": "shishou.png",
"turns": "4T"
} }
] ]