Compare commits

..

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

47 changed files with 344 additions and 4790 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

@ -2,6 +2,9 @@ on:
push: push:
tags: tags:
- '[0-9]+\.[0-9]+\.[0-9]+' - '[0-9]+\.[0-9]+\.[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+a[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+b[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+rc[0-9]+'
jobs: jobs:
checking: checking:
@ -40,7 +43,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

@ -7,7 +7,7 @@ on:
jobs: jobs:
unlighthouse: unlighthouse:
runs-on: docker runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/unlighthouse:latest container: forgejo.neshweb.net/firq/unlighthouse-docker:latest
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: https://code.forgejo.org/actions/checkout@v3 uses: https://code.forgejo.org/actions/checkout@v3
@ -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

@ -4,7 +4,7 @@ COPY . .
RUN npm i RUN npm i
RUN npm run build RUN npm run build
FROM forgejo.neshweb.net/ci-docker-images/website-serve:latest AS runtime FROM forgejo.neshweb.net/firq/website-serve-docker:latest AS runtime
COPY --from=build /app/dist /public COPY --from=build /app/dist /public
COPY --from=build /app/serve.json /public/serve.json COPY --from=build /app/serve.json /public/serve.json

View file

@ -1,7 +1,7 @@
import { defineConfig } from 'astro/config'; import { defineConfig } from 'astro/config';
// https://astro.build/config
import sitemap from "@astrojs/sitemap"; import sitemap from "@astrojs/sitemap";
import mdx from "@astrojs/mdx";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
@ -10,5 +10,5 @@ export default defineConfig({
outDir: 'dist', outDir: 'dist',
publicDir: 'static', publicDir: 'static',
site: 'https://firq.dev/', site: 'https://firq.dev/',
integrations: [sitemap(), mdx()] integrations: [sitemap()]
}); });

4510
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.11",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
@ -11,18 +11,10 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@astro-community/astro-embed-youtube": "^0.4.3",
"@astrojs/check": "^0.3.3", "@astrojs/check": "^0.3.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": "^6.1.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
}
}
}
};

View file

@ -14,7 +14,7 @@
"source" : "**/*.css", "source" : "**/*.css",
"headers" : [{ "headers" : [{
"key" : "Cache-Control", "key" : "Cache-Control",
"value" : "max-age=31536000" "value" : "max-age=86400"
}] }]
}, },
{ {

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: 145 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,27 +55,25 @@ 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 {
transform: scale(var(--hover-scale));
} }
img { a > img {
padding: 0px 0.25em; padding: 0px 0.25em;
width: 90%; width: 90%;
height: auto; height: auto;
} }
}
@media (min-width: 512px) { @media (min-width: 512px) {
a { a {
padding: 10px 10px; padding: 10px 10px;
width: auto; width: auto;
height: auto; height: auto;
img { }
a > img {
padding: 0px 1.5em; padding: 0px 1.5em;
width: 200px; 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

@ -1,28 +1,25 @@
--- ---
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'
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> <i class="iconoir-menu"></i>
</button> </button>
</header> </header>
<style define:vars={{ hamburger_src_url }}> <style>
header { header {
z-index: 1000; z-index: 1000;
position: sticky; position: sticky;
@ -35,7 +32,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;
@ -84,6 +81,16 @@ const hamburger_src_url = `url("${hamburger.src}")`;
height: 64px; height: 64px;
} }
.mobile > i {
position: static;
color: white;
font-weight: bold;
font-size: 2em;
align-self: flex-start;
padding-right: 1em;
padding-top: 1.15rem;
}
.mobile > ul { .mobile > ul {
display: none; display: none;
padding: 0px; padding: 0px;
@ -106,17 +113,6 @@ const hamburger_src_url = `url("${hamburger.src}")`;
justify-self: top; justify-self: top;
} }
.hamburger-menu {
mask: var(--hamburger_src_url) no-repeat center;
background-color: white;
width: 2rem;
height: 2rem;
position: static;
align-self: flex-start;
margin-right: 1rem;
margin-top: 1rem;
}
@media (min-width: 1140px) { @media (min-width: 1140px) {
.mobile { .mobile {
display: none; display: none;

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: string
} }
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'), '')
@ -18,10 +17,7 @@ if (currentPage === slug) {
currPage = 'current' currPage = 'current'
} }
const icon_src_url = `url("${icon.src}")`;
const fulllink = `/${slug}` const fulllink = `/${slug}`
let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
--- ---
<li> <li>
@ -30,15 +26,14 @@ 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> <i class={icon}></i>
{text} {text}
</a> </a>
</li> </li>
<style define:vars={{ icon_src_url }}> <style>
li { li {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -46,7 +41,6 @@ let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
display: flex; display: flex;
width: 200px; width: 200px;
} }
li > a { li > a {
display: inline-flex; display: inline-flex;
color: white; color: white;
@ -58,27 +52,10 @@ let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
font-weight: bold; font-weight: bold;
gap: 0.2em; gap: 0.2em;
} }
li > a:hover { li > a:hover {
color: var(--c-purplepink); color: var(--c-purplepink);
} }
li > a:hover > .icon {
background-color: var(--c-purplepink);
}
.current { .current {
color: var(--c-darkpurple) !important; color: var(--c-darkpurple) !important;
} }
.current > .icon {
background-color: var(--c-darkpurple) !important;
}
.icon {
mask: var(--icon_src_url) no-repeat center;
background-color: white;
width: 1.4em;
height: 1.4em;
}
</style> </style>

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

@ -1,61 +0,0 @@
---
import { YouTube } from '@astro-community/astro-embed-youtube'
export interface Props {
id: string
thumbnail: string
}
const { id, thumbnail } = Astro.props
---
<div class="youtube-center">
<noscript style="display: flex; justify-content: center;">
<style>
lite-youtube {
display: none;
}
</style>
<div class="warningtext">
<span>
To view the video, enable JavaScript or<br /><a
href=`https://www.youtube.com/watch?v=${id}`
target="_blank"
rel="noopener noreferrer">watch it on YouTube</a
>
</span>
</div>
</noscript>
<YouTube id={id} poster={thumbnail} />
</div>
<style>
.youtube-center {
width: 100%;
display: flex;
justify-content: center;
}
lite-youtube {
width: 100%;
max-height: 360px;
max-width: 640px;
}
.warningtext {
display: flex;
justify-content: center;
background-color: var(--c-darkgray);
width: 640px;
height: 360px;
}
span {
text-align: center;
margin-top: 20%;
}
span > a {
font-style: unset;
font-weight: bold;
}
</style>

View file

@ -2,13 +2,6 @@
import Navbar from '../components/navbar.astro' import Navbar from '../components/navbar.astro'
import NavbarEntry from '../components/navbarEntry.astro' import NavbarEntry from '../components/navbarEntry.astro'
import navdata from '../../static/data/_navdata.json' import navdata from '../../static/data/_navdata.json'
import embed from '../assets/embed.png'
import home from 'iconoir/icons/home.svg'
import servants from 'iconoir/icons/task-list.svg'
import ta_collection from 'iconoir/icons/database.svg'
import blog from 'iconoir/icons/bookmark-book.svg'
import about from 'iconoir/icons/mail.svg'
export interface Props { export interface Props {
title: string title: string
@ -16,18 +9,6 @@ export interface Props {
descriptionOverride?: string descriptionOverride?: string
} }
interface IconsLookup {
[key: string]: ImageMetadata
}
const icons: IconsLookup = {
home: home,
servants: servants,
ta_collection: ta_collection,
blog: blog,
about: about,
}
const { descriptionOverride, currentpage, title } = Astro.props const { descriptionOverride, currentpage, title } = Astro.props
let description let description
@ -41,14 +22,9 @@ let currPage = 'https://firq.dev/'
if (currentpage !== 'home') { if (currentpage !== 'home') {
currPage += currentpage currPage += currentpage
} }
const mapped_navdata = navdata.map((item) => ({
...item,
...{ icon: icons[item.icon] },
}))
--- ---
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>{title}</title> <title>{title}</title>
@ -60,7 +36,7 @@ const mapped_navdata = navdata.map((item) => ({
<meta property="og:title" content={title} /> <meta property="og:title" content={title} />
<meta property="og:url" content={currPage} /> <meta property="og:url" content={currPage} />
<meta property="og:description" content={description} /> <meta property="og:description" content={description} />
<meta property="og:image" content={embed.src} /> <meta property="og:image" content="/assets/embed.png" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:locale" content="en_US" /> <meta property="og:locale" content="en_US" />
<meta name="theme-color" content="#b86cff" /> <meta name="theme-color" content="#b86cff" />
@ -72,17 +48,16 @@ const mapped_navdata = navdata.map((item) => ({
<link rel="icon" type="image/ico" href="/favicon.ico" /> <link rel="icon" type="image/ico" href="/favicon.ico" />
<link rel="sitemap" href="/sitemap-index.xml" /> <link rel="sitemap" href="/sitemap-index.xml" />
<link href="https://mastodon.neshweb.net/@Firq" rel="me" /> <link href="https://mastodon.neshweb.net/@Firq" rel="me" />
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/gh/iconoir-icons/iconoir@main/css/iconoir.css"
/>
</head> </head>
<body> <body>
<Navbar> <Navbar>
{ {
mapped_navdata.map((item) => ( 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 +82,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 {
color: var(--c-darkpurple);
} }
a:hover {
color: var(--c-darkpurple);
} }
img { img {

View file

@ -5,7 +5,7 @@ import BlogSection from '../layouts/blogSection.astro'
const description = 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 allPosts = await Astro.glob('../pages/blog/*.{md,mdx}') const allPosts = await Astro.glob('../pages/blog/*.md')
allPosts.sort( allPosts.sort(
(a, b) => (a, b) =>
Date.parse(b.frontmatter.pubDate) - Date.parse(a.frontmatter.pubDate) Date.parse(b.frontmatter.pubDate) - Date.parse(a.frontmatter.pubDate)

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

@ -2,7 +2,7 @@
layout: ../../layouts/blogPost.astro layout: ../../layouts/blogPost.astro
title: 'Migrating to Forgejo' title: 'Migrating to Forgejo'
pubDate: 2023-12-23 pubDate: 2023-12-23
description: 'My short recollection of migrating this site + CI to Forgejo' description: 'My small recollection of migrating this site + CI to Forgejo'
author: 'Firq' author: 'Firq'
tags: ['astro', 'docker', 'forgejo'] tags: ['astro', 'docker', 'forgejo']
--- ---
@ -58,7 +58,7 @@ COPY . .
RUN npm i RUN npm i
RUN npm run build RUN npm run build
FROM forgejo.neshweb.net/ci-docker-images/website-serve:latest AS runtime FROM forgejo.neshweb.net/firq/website-serve-docker:latest AS runtime
COPY --from=build /app/dist /public COPY --from=build /app/dist /public
COPY --from=build /app/serve.json /public/serve.json COPY --from=build /app/serve.json /public/serve.json
@ -138,7 +138,7 @@ With this container, the CI step to actually run the tests became a lot easier:
jobs: jobs:
unlighthouse: unlighthouse:
runs-on: docker runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/unlighthouse:latest container: forgejo.neshweb.net/firq/unlighthouse-docker:latest
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: https://code.forgejo.org/actions/checkout@v3 uses: https://code.forgejo.org/actions/checkout@v3

View file

@ -6,8 +6,6 @@ description: 'Blog post talking about instant death in FGO, how you can take adv
author: 'Firq' author: 'Firq'
tags: ['fgo', 'games'] tags: ['fgo', 'games']
--- ---
import thumbnail from "../../assets/thumbnails/UwbNp_dB_VU.jpg"
import YoutubeEmbed from "../../components/youtubeEmbed.astro"
> **Disclaimer**<br/> > **Disclaimer**<br/>
> While writing this, Requiem and I faced a bit of a challenge concerning death rate calculations. Case in point is the passive "Item Construction" > While writing this, Requiem and I faced a bit of a challenge concerning death rate calculations. Case in point is the passive "Item Construction"
@ -105,8 +103,9 @@ For other skill levels, this looks like this (_Her S1 scales from 50% to 100%_)
In the end, this resulted in the following comp that worked like a charm. In the end, this resulted in the following comp that worked like a charm.
<YoutubeEmbed id="UwbNp_dB_VU" thumbnail={thumbnail.src}/> <div style="width: 100%; display: flex; justify-content: center; padding-top: 0.75rem">
<iframe width="640" height="360" src="https://www.youtube-nocookie.com/embed/UwbNp_dB_VU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"></iframe>
</div>
## Conclusion ## Conclusion

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

@ -2,26 +2,26 @@
{ {
"link": "/", "link": "/",
"text": "Home", "text": "Home",
"icon": "home" "icon": "iconoir-home"
}, },
{ {
"link": "/servants", "link": "/servants",
"text": "Servants", "text": "Servants",
"icon": "servants" "icon": "iconoir-task-list"
}, },
{ {
"link": "/ta-collection", "link": "/ta-collection",
"text": "TA Collection", "text": "TA Collection",
"icon": "ta_collection" "icon": "iconoir-database"
}, },
{ {
"link": "/blog", "link": "/blog",
"text": "Blog", "text": "Blog",
"icon": "blog" "icon": "iconoir-bookmark-book"
}, },
{ {
"link": "/about", "link": "/about",
"text": "About", "text": "About",
"icon": "about" "icon": "iconoir-mail"
} }
] ]

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"
} }
] ]

View file

@ -3,7 +3,7 @@ export default {
args: ["--no-sandbox", "--disable-setuid-sandbox"], args: ["--no-sandbox", "--disable-setuid-sandbox"],
}, },
ci: { ci: {
budget: 50, budget: 90,
buildStatic: true buildStatic: true
}, },
outputPath: "unlighthouse-reports", outputPath: "unlighthouse-reports",