Compare commits

...

33 commits
0.1.17 ... main

Author SHA1 Message Date
f5bb4bf78e Merge pull request 'Mergin dev - new header, updated servants' (#29) from dev into main
All checks were successful
/ checking (push) Successful in 14s
/ build-site (push) Successful in 1m41s
/ release (push) Successful in 7s
Reviewed-on: #29
2024-06-15 17:20:51 +00:00
5181739230
Updated Servant list
All checks were successful
/ checking (push) Successful in 14s
2024-06-15 19:17:29 +02:00
449006320c
Fix for 404 and favcard
All checks were successful
/ checking (push) Successful in 13s
2024-01-20 16:21:51 +01:00
483b2cc84b
Hero with reference to fgo-ta.com
All checks were successful
/ publish (push) Successful in 6s
/ checking (push) Successful in 13s
/ build-site (push) Successful in 1m42s
2024-01-19 10:18:05 +01:00
9daf38e537
Added success checks
All checks were successful
/ checking (push) Successful in 10s
2024-01-10 11:45:42 +01:00
da8564f01a
Version Bump
All checks were successful
/ checking (push) Successful in 10s
/ build-site (push) Successful in 1m44s
/ publish (push) Successful in 6s
/ unlighthouse (push) Successful in 31s
/ deploy-unlighthouse-site (push) Successful in 4s
/ deploy-unlighthouse-files (push) Successful in 7s
2024-01-10 11:39:54 +01:00
dd9d0a662f
Fixes for CI
All checks were successful
/ checking (push) Successful in 11s
2024-01-10 11:38:38 +01:00
2a258ac60b package-lock.json
All checks were successful
/ checking (push) Successful in 1m10s
2024-01-07 22:23:05 +01:00
0494694cc9 Merge pull request 'Fix for #27' (#28) from dev into main
All checks were successful
/ release (push) Successful in 11s
/ build-site (push) Successful in 1m11s
/ checking (push) Successful in 5m17s
Reviewed-on: #28
2024-01-06 17:49:12 +00:00
764c5750a6
Fix for #27
Some checks failed
/ checking (push) Has been cancelled
2024-01-06 18:48:19 +01:00
b7db7dd512 Merge pull request '0.1.23 - Multiple Fixes for DX' (#26) from dev into main
All checks were successful
/ release (push) Successful in 6s
/ checking (push) Successful in 10s
/ build-site (push) Successful in 1m16s
Reviewed-on: #26
2024-01-05 00:20:38 +00:00
fcd05dcb09
Fix
All checks were successful
/ checking (push) Successful in 11s
/ build-site (push) Successful in 1m19s
/ publish (push) Successful in 8s
/ unlighthouse (push) Successful in 30s
/ deploy-unlighthouse-files (push) Successful in 7s
/ deploy-unlighthouse-site (push) Successful in 5s
2024-01-05 01:14:28 +01:00
7ed78bceff
Moved nice tools from fgo-ta over
Some checks failed
/ build-site (push) Has been skipped
/ publish (push) Has been skipped
/ checking (push) Failing after 10s
2024-01-05 01:12:19 +01:00
e406bd8764 Merge pull request 'Fixed unlighthouse screen deploy' (#25) from dev into main
All checks were successful
/ checking (push) Successful in 12s
/ unlighthouse (push) Successful in 31s
/ deploy-unlighthouse-files (push) Successful in 8s
/ deploy-unlighthouse-site (push) Successful in 5s
Reviewed-on: #25
2024-01-04 23:08:30 +00:00
064eb975b9
Fixed unlighthouse screen deploy
All checks were successful
/ checking (push) Successful in 13s
2024-01-05 00:07:33 +01:00
d7eb7e9c49 Merge pull request 'CI Improvements' (#24) from dev into main
All checks were successful
/ checking (push) Successful in 41s
/ release (push) Successful in 2m17s
/ build-site (push) Successful in 2m22s
Reviewed-on: #24
2024-01-01 21:13:23 +00:00
3347d2eaf2
bumped version
All checks were successful
/ publish (push) Successful in 10s
/ checking (push) Successful in 45s
/ build-site (push) Successful in 3m34s
2024-01-01 21:36:46 +01:00
3dbdca627e
fixed ci with docker cache
Some checks are pending
/ checking (push) Waiting to run
2024-01-01 21:36:28 +01:00
f2ff4e47cf Merge pull request 'Fixes for Apple and Accessibility' (#23) from dev into main
All checks were successful
/ build-site (push) Successful in 32m23s
/ checking (push) Successful in 1m21s
/ release (push) Successful in 1m51s
Reviewed-on: #23
2024-01-01 20:30:15 +00:00
340f39710e
updated aria roles
All checks were successful
/ build-site (push) Successful in 17m49s
/ checking (push) Successful in 1m43s
/ publish (push) Successful in 2m33s
/ deploy-unlighthouse-files (push) Successful in 12s
/ unlighthouse (push) Successful in 32s
/ deploy-unlighthouse-site (push) Successful in 9s
2024-01-01 20:54:14 +01:00
4b3a8898f6
Better workaround for navbar + hopefully burger fix
All checks were successful
/ checking (push) Successful in 36s
/ build-site (push) Successful in 3m15s
/ publish (push) Successful in 7m3s
/ unlighthouse (push) Successful in 33s
/ deploy-unlighthouse-files (push) Successful in 10s
/ deploy-unlighthouse-site (push) Successful in 12s
2024-01-01 20:10:57 +01:00
b03eba2bd5
Workaround to have tabindex for mobile dropdown but not on desktop
All checks were successful
/ publish (push) Successful in 10s
/ checking (push) Successful in 25s
/ build-site (push) Successful in 3m7s
2024-01-01 19:41:46 +01:00
336c0c0db5
Changed burger positioning
All checks were successful
/ publish (push) Successful in 13s
/ checking (push) Successful in 58s
/ build-site (push) Successful in 3m7s
2024-01-01 18:49:14 +01:00
11b12e55b8
Added tabindex back 2024-01-01 18:47:00 +01:00
bb0fe0bece
Bumped version
All checks were successful
/ build-site (push) Successful in 35m26s
/ publish (push) Successful in 18s
/ checking (push) Successful in 24s
2024-01-01 17:53:56 +01:00
b4702278d2
Accessibility changes + new TAs + Video references for Cern
Some checks failed
/ checking (push) Has been cancelled
2024-01-01 17:53:19 +01:00
9a84cf7fc2 Merge pull request 'Added version to About Page' (#22) from dev into main
All checks were successful
/ checking (push) Successful in 51s
/ release (push) Successful in 8s
/ build-site (push) Successful in 2m17s
Reviewed-on: #22
2023-12-31 18:35:43 +00:00
eeabc4e66f
Added version to About Page
All checks were successful
/ checking (push) Successful in 25s
/ build-site (push) Successful in 2m4s
/ publish (push) Successful in 9s
/ unlighthouse (push) Successful in 33s
/ deploy-unlighthouse-files (push) Successful in 10s
/ deploy-unlighthouse-site (push) Successful in 6s
2023-12-31 16:50:29 +01:00
be896ca00c Merge pull request 'Implemented Postcss' (#21) from dev into main
All checks were successful
/ checking (push) Successful in 20s
/ build-site (push) Successful in 2m9s
/ release (push) Successful in 8s
/ unlighthouse (push) Successful in 32s
/ deploy-unlighthouse-files (push) Successful in 9s
/ deploy-unlighthouse-site (push) Successful in 6s
Reviewed-on: #21
2023-12-29 23:30:52 +00:00
ed9af00592
Postcss (vendor prefixes), etc.
All checks were successful
/ checking (push) Successful in 20s
/ build-site (push) Successful in 2m2s
/ publish (push) Successful in 9s
2023-12-30 00:06:32 +01:00
141b1cffc6
bumped version
All checks were successful
/ build-site (push) Successful in 1m54s
/ release (push) Successful in 8s
/ checking (push) Successful in 43s
2023-12-29 23:38:47 +01:00
e8e6733c9f Merge pull request 'Fixed webkit issue for Iconoir Icons related to mask' (#20) from dev into main
All checks were successful
/ checking (push) Successful in 34s
Reviewed-on: #20
2023-12-29 22:38:12 +00:00
0cac39ba78
Fixed webkit issue
All checks were successful
/ checking (push) Successful in 29s
/ build-site (push) Successful in 1m55s
/ publish (push) Successful in 8s
2023-12-29 23:32:43 +01:00
38 changed files with 3519 additions and 301 deletions

View file

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

View file

@ -23,6 +23,7 @@ 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 }}
@ -67,6 +68,7 @@ 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 }}
@ -91,5 +93,6 @@ 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 Normal file
View file

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

View file

@ -1,8 +1,6 @@
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.17", "version": "0.1.27",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
@ -15,8 +15,14 @@
"@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.0.7", "astro": "^4.2.1",
"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"
]
} }

13
postcss.config.cjs Normal file
View file

@ -0,0 +1,13 @@
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.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

View file

@ -1,29 +1,26 @@
--- ---
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: string mlb: boolean
} }
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<{ default: ImageMetadata }>( const images_ces = import.meta.glob<GlobImage>('/src/assets/ce/*.png')
'/src/assets/ce/*.{png,webp}' const loadedCEImage = plsLoadImage(images_ces, imagePath)
)
let mlb_image: string = 'mlbalign' const mlb_image = mlb ? 'mlbalign' : 'hidemlb'
if (mlb === 'false') {
mlb_image = 'hidemlb'
}
--- ---
<article> <article>
<div> <div>
<Image src={images_ces[imagePath]()} alt={name} class="ce-crop" /> <Image src={loadedCEImage} 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,6 +1,7 @@
--- ---
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
@ -9,19 +10,27 @@ 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<{ default: ImageMetadata }>( const images_logos = import.meta.glob<GlobImage>(
'/src/assets/social/*.{png,webp}' '/src/assets/social/*.{png,webp}'
) )
const loadedLogoImage = plsLoadImage(images_logos, imagePath)
--- ---
<a href={link} target="_blank" rel="noopener noreferrer" aria-label={site}> <a
href={link}
target="_blank"
rel="noopener noreferrer"
aria-label=`${site} - new window`
>
<article class="contact do-hover"> <article class="contact do-hover">
<Image src={images_logos[imagePath]()} alt="" /> <Image src={loadedLogoImage} alt={logoAltText} />
<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,6 +1,7 @@
--- ---
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
@ -11,12 +12,20 @@ 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<{ default: ImageMetadata }>('/src/assets/favourites/*.{png,webp}') const images = import.meta.glob<GlobImage>(
'/src/assets/favourites/*.{png,webp}'
)
const loadedImage = plsLoadImage(images, imagePath)
--- ---
<a href={link} target="_blank" rel="noopener noreferrer"> <a
href={link}
target="_blank"
rel="noopener noreferrer"
aria-label=`${name} - new window`
>
<div class="heading">{name}</div> <div class="heading">{name}</div>
<Image src={images[imagePath]()} alt={name} /> <Image src={loadedImage} alt={name} />
<h2 class="subtext"> <h2 class="subtext">
{origin} {origin}
</h2> </h2>
@ -36,10 +45,6 @@ const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/favouri
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;
@ -55,25 +60,27 @@ const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/favouri
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));
} }
a > img { 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

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

View file

@ -1,12 +1,13 @@
--- ---
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, currentPage } = Astro.props const { icon, text, link, navtype, currentPage } = Astro.props
let currPage = '' let currPage = ''
const slug = link.replace(new RegExp('/', 'g'), '') const slug = link.replace(new RegExp('/', 'g'), '')
@ -19,6 +20,8 @@ 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>
@ -27,7 +30,8 @@ const fulllink = `/${slug}`
rel="noopener noreferrer" rel="noopener noreferrer"
aria-label={text} aria-label={text}
class={currPage} class={currPage}
tabindex="0" role="navigation"
{...extraattributes}
> >
<div class="icon"></div> <div class="icon"></div>
{text} {text}

View file

@ -1,6 +1,7 @@
--- ---
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
@ -16,8 +17,10 @@ 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<{ default: ImageMetadata }>('/src/assets/servant/*.{png,webp}') const images_servants = import.meta.glob<GlobImage>('/src/assets/servant/*.{png,webp}')
const images_bond_ces = import.meta.glob<{ default: ImageMetadata }>('/src/assets/ce/bond-ce/*.{png,webp}') const images_bond_ces = import.meta.glob<GlobImage>('/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'
@ -27,14 +30,14 @@ if (bond10 === false) {
--- ---
<article> <article>
<Image src={images_servants[servantImagePath]()} alt={name} /> <Image src={loadedServantImage} 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={images_bond_ces[bondceImagePath]()} alt="" class={bondce_css}/> <Image src={loadedBondCEImage} 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,6 +1,8 @@
--- ---
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
@ -24,13 +26,16 @@ 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<{ default: ImageMetadata }>( const target_images = import.meta.glob<GlobImage>(
'/src/assets/ta_icons/*.{png,webp}' '/src/assets/ta_icons/*.{png,webp}'
) )
const servant_images = import.meta.glob<{ default: ImageMetadata }>( const servant_images = import.meta.glob<GlobImage>(
'/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'
@ -39,7 +44,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={target_images[targetImagePath]()} alt={title} class="icon" /> <Image src={loadedTargetImage} alt={title} class="icon" />
<div class="title"> <div class="title">
<h2>{title}</h2> <h2>{title}</h2>
</div> </div>
@ -50,7 +55,7 @@ if (user !== undefined) {
{formatted_date} {formatted_date}
</p> </p>
<div class="expand-on-hover"> <div class="expand-on-hover">
<Image src={servant_images[servantImagePath ?? 'undefined']()} alt="" /> <Image src={loadedServantImage} alt="" />
<h2>{turns}</h2> <h2>{turns}</h2>
</div> </div>
</article> </article>

View file

@ -1,6 +1,7 @@
--- ---
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
@ -9,19 +10,22 @@ 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<{ default: ImageMetadata }>( const images_logos = import.meta.glob<GlobImage>(
'/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={images_logos[imagePath]()} alt="" /> <Image src={loadedImage} alt={logoAltText} />
<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,7 +77,12 @@ const mapped_navdata = navdata.map((item) => ({
<Navbar> <Navbar>
{ {
mapped_navdata.map((item) => ( mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} {...item} /> <NavbarEntry currentPage={currentpage} navtype="desktop" {...item} slot="desktop"/>
))
}
{
mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} navtype="mobile" {...item} slot="mobile"/>
)) ))
} }
</Navbar> </Navbar>
@ -102,4 +107,15 @@ 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,23 +3,27 @@ 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 © Aniplex “Fate/Grand Order” is a trademark of Notes Co., Ltd. | Game Assets ©
Inc. used under fair use. | View <a Aniplex 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 Lasengle. I am in no way affiliated with Fate/Grand Order, Aniplex, Type Moon or
I claim no ownership of any of the assets used that are created by any of the Lasengle. I claim no ownership of any of the assets used that are created by
mentioned companies.<br /> any of the mentioned companies.<br />
All of the opinions expressed are my own and may not reflect those of the asset All of the opinions expressed are my own and may not reflect those of the
providers. asset providers.
</div> </div>
<br /> <br />
<div> <div>
@ -38,8 +42,8 @@ import { Image } from 'astro:assets';
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 you > for the support when building this site. I could not have done it without
🧡 Check out <a you 🧡 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
@ -54,7 +58,8 @@ import { Image } from 'astro:assets';
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 out > for providing me with a place to develop, store and host this site. Check
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
> >
@ -73,6 +78,12 @@ import { Image } from 'astro:assets';
<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">
<i class="iconoir-fast-arrow-left"></i>Go back home &lt;&lt; Go back home
</a> </a>
</div> </div>
</BaseSection> </BaseSection>
@ -50,11 +50,11 @@ 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;
}
a:hover { &:hover {
color: var(--c-darkpurple); color: var(--c-darkpurple);
} }
}
img { img {
width: 256px; width: 256px;

View file

@ -6,6 +6,9 @@ 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
@ -45,3 +48,19 @@ 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,6 +11,7 @@ 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 [
@ -36,6 +37,7 @@ 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>

10
src/types/generic.ts Normal file
View file

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

5
src/utils/tools.ts Normal file
View file

@ -0,0 +1,5 @@
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,9 +1,19 @@
[ [
{
"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",
@ -13,7 +23,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",
@ -23,7 +33,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",
@ -33,18 +43,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": false "bond10": true
}, },
{ {
"name": "Castoria", "name": "Castoria",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10 ", "skills": "10 / 10 / 10",
"ml": "7", "ml": "10",
"servantImageFile": "castoria_02.png", "servantImageFile": "castoria_02.png",
"bondceImageFile": "castoria.png", "bondceImageFile": "castoria.png",
"bond10": true "bond10": true
@ -53,7 +63,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",
@ -63,17 +73,17 @@
"name": "Oberon", "name": "Oberon",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10 ", "skills": "10 / 10 / 10",
"ml": "Not Unlocked", "ml": "1",
"servantImageFile": "oberon_02.png", "servantImageFile": "oberon_02.png",
"bondceImageFile": "oberon.png", "bondceImageFile": "oberon.png",
"bond10": false "bond10": true
}, },
{ {
"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",
@ -83,7 +93,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",
@ -93,7 +103,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",
@ -103,7 +113,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",
@ -113,7 +123,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",
@ -123,7 +133,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",
@ -133,7 +143,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",
@ -143,8 +153,8 @@
"name": "Ashiya Douman", "name": "Ashiya Douman",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "9 / 9 / 10 ", "skills": "9 / 9 / 10",
"ml": "Not Unlocked", "ml": "10",
"servantImageFile": "douman_01.png", "servantImageFile": "douman_01.png",
"bondceImageFile": "douman.png", "bondceImageFile": "douman.png",
"bond10": false "bond10": false
@ -153,27 +163,47 @@
"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 / 9 ", "skills": "10 / 10 / 10",
"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 / 10 ", "skills": "9 / 10 / 9",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "santagale_01.png", "servantImageFile": "santagale_01.png",
"bondceImageFile": "santagale.png", "bondceImageFile": "santagale.png",
@ -183,7 +213,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",
@ -193,7 +223,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",
@ -203,7 +233,7 @@
"name": "Wu Zetian", "name": "Wu Zetian",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "9 / 1 / 9 ", "skills": "10 / 9 / 10",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "wu_01.png", "servantImageFile": "wu_01.png",
"bondceImageFile": "wu.png", "bondceImageFile": "wu.png",
@ -213,7 +243,7 @@
"name": "Ibaraki-Douji", "name": "Ibaraki-Douji",
"level": "40", "level": "40",
"np": "1", "np": "1",
"skills": "8 / 8 / X ", "skills": "9 / 10 / X ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "ibaraki_02.png", "servantImageFile": "ibaraki_02.png",
"bondceImageFile": "ibaraki.png", "bondceImageFile": "ibaraki.png",
@ -223,7 +253,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",
@ -233,7 +263,7 @@
"name": "Chiron", "name": "Chiron",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "1 / 9 / 9 ", "skills": "1 / 10 / 10",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "chiron_01.png", "servantImageFile": "chiron_01.png",
"bondceImageFile": "chiron.png", "bondceImageFile": "chiron.png",

View file

@ -310,5 +310,21 @@
"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"
} }
] ]