Compare commits
50 commits
0.1.13pre1
...
main
Author | SHA1 | Date | |
---|---|---|---|
f5bb4bf78e | |||
5181739230 | |||
449006320c | |||
483b2cc84b | |||
9daf38e537 | |||
da8564f01a | |||
dd9d0a662f | |||
2a258ac60b | |||
0494694cc9 | |||
764c5750a6 | |||
b7db7dd512 | |||
fcd05dcb09 | |||
7ed78bceff | |||
e406bd8764 | |||
064eb975b9 | |||
d7eb7e9c49 | |||
3347d2eaf2 | |||
3dbdca627e | |||
f2ff4e47cf | |||
340f39710e | |||
4b3a8898f6 | |||
b03eba2bd5 | |||
336c0c0db5 | |||
11b12e55b8 | |||
bb0fe0bece | |||
b4702278d2 | |||
9a84cf7fc2 | |||
eeabc4e66f | |||
be896ca00c | |||
ed9af00592 | |||
141b1cffc6 | |||
e8e6733c9f | |||
0cac39ba78 | |||
76c723d516 | |||
a24a7af3d8 | |||
91f8c1834a | |||
719a9ff3de | |||
8e4b169404 | |||
af83dfa7d8 | |||
5d1da2d3d8 | |||
cb8b53ea63 | |||
71a6ea0051 | |||
2b2ca46214 | |||
df9337c684 | |||
7e614b89a8 | |||
76e0674098 | |||
1592815835 | |||
736abd6a51 | |||
5bfdb277fc | |||
eaab523a2a |
|
@ -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:
|
||||||
|
|
|
@ -2,9 +2,6 @@ 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:
|
||||||
|
@ -43,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
|
||||||
|
|
|
@ -7,7 +7,7 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
unlighthouse:
|
unlighthouse:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container: forgejo.neshweb.net/ci-docker-images/unlighthouse-docker:latest
|
container: forgejo.neshweb.net/ci-docker-images/unlighthouse: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,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
|
@ -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": []
|
||||||
|
}
|
|
@ -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-docker:latest AS runtime
|
FROM forgejo.neshweb.net/ci-docker-images/website-serve: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
|
||||||
|
|
|
@ -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()]
|
integrations: [sitemap(), mdx()]
|
||||||
});
|
});
|
4510
package-lock.json
generated
16
package.json
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@firq/fgosite",
|
"name": "@firq/fgosite",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.1.13",
|
"version": "0.1.27",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "astro dev",
|
"dev": "astro dev",
|
||||||
|
@ -11,10 +11,18 @@
|
||||||
"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.0.7",
|
"astro": "^4.2.1",
|
||||||
"iconoir": "^6.1.0",
|
"autoprefixer": "^10.4.16",
|
||||||
|
"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
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
|
@ -14,7 +14,7 @@
|
||||||
"source" : "**/*.css",
|
"source" : "**/*.css",
|
||||||
"headers" : [{
|
"headers" : [{
|
||||||
"key" : "Cache-Control",
|
"key" : "Cache-Control",
|
||||||
"value" : "max-age=86400"
|
"value" : "max-age=31536000"
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
BIN
src/assets/ce/bond-ce/scathach.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
src/assets/ce/bond-ce/sherlock.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
src/assets/ce/bond-ce/taigong.png
Normal file
After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 20 KiB |
BIN
src/assets/servant/scathach_03.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
src/assets/servant/sherlock_03.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
src/assets/servant/taigong_03.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
src/assets/ta_icons/beast_4_l.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
src/assets/ta_icons/koyanskayaofdark.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
src/assets/thumbnails/O1f-go7uJQM.jpg
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
src/assets/thumbnails/UwbNp_dB_VU.jpg
Normal file
After Width: | Height: | Size: 145 KiB |
BIN
src/assets/thumbnails/WrHudtdfivA.jpg
Normal file
After Width: | Height: | Size: 144 KiB |
|
@ -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" />
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
27
src/components/fgotaHero.astro
Normal 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>
|
|
@ -1,25 +1,28 @@
|
||||||
---
|
---
|
||||||
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">
|
<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>
|
||||||
<i class="iconoir-menu"></i>
|
<div class="hamburger-menu" role="navigation"></div>
|
||||||
</button>
|
</button>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<style>
|
<style define:vars={{ hamburger_src_url }}>
|
||||||
header {
|
header {
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
|
@ -32,7 +35,7 @@ import logo from '../assets/logo.svg'
|
||||||
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;
|
||||||
|
@ -81,16 +84,6 @@ import logo from '../assets/logo.svg'
|
||||||
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;
|
||||||
|
@ -113,6 +106,17 @@ import logo from '../assets/logo.svg'
|
||||||
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;
|
||||||
|
|
|
@ -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: string
|
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'), '')
|
||||||
|
@ -17,7 +18,10 @@ 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>
|
||||||
|
@ -26,14 +30,15 @@ const fulllink = `/${slug}`
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label={text}
|
aria-label={text}
|
||||||
class={currPage}
|
class={currPage}
|
||||||
tabindex="0"
|
role="navigation"
|
||||||
|
{...extraattributes}
|
||||||
>
|
>
|
||||||
<i class={icon}></i>
|
<div class="icon"></div>
|
||||||
{text}
|
{text}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<style>
|
<style define:vars={{ icon_src_url }}>
|
||||||
li {
|
li {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
@ -41,6 +46,7 @@ const fulllink = `/${slug}`
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
li > a {
|
li > a {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
color: white;
|
color: white;
|
||||||
|
@ -52,10 +58,27 @@ const fulllink = `/${slug}`
|
||||||
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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
61
src/components/youtubeEmbed.astro
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
---
|
||||||
|
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>
|
|
@ -4,12 +4,30 @@ 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 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
|
||||||
currentpage: string
|
currentpage: string
|
||||||
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
|
||||||
|
|
||||||
|
@ -23,9 +41,14 @@ 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>
|
||||||
|
@ -49,16 +72,17 @@ if (currentpage !== 'home') {
|
||||||
<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>
|
||||||
{
|
{
|
||||||
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>
|
||||||
|
@ -83,4 +107,15 @@ if (currentpage !== 'home') {
|
||||||
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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
<< 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;
|
||||||
|
|
|
@ -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')
|
const allPosts = await Astro.glob('../pages/blog/*.{md,mdx}')
|
||||||
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)
|
||||||
|
|
|
@ -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}/>
|
|
@ -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-docker:latest AS runtime
|
FROM forgejo.neshweb.net/ci-docker-images/website-serve: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-docker:latest
|
container: forgejo.neshweb.net/ci-docker-images/unlighthouse: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
|
||||||
|
|
|
@ -6,6 +6,8 @@ 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"
|
||||||
|
@ -103,9 +105,8 @@ 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.
|
||||||
|
|
||||||
<div style="width: 100%; display: flex; justify-content: center; padding-top: 0.75rem">
|
<YoutubeEmbed id="UwbNp_dB_VU" thumbnail={thumbnail.src}/>
|
||||||
<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
|
||||||
|
|
|
@ -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
|
@ -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
|
@ -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;
|
||||||
|
}
|
|
@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -2,26 +2,26 @@
|
||||||
{
|
{
|
||||||
"link": "/",
|
"link": "/",
|
||||||
"text": "Home",
|
"text": "Home",
|
||||||
"icon": "iconoir-home"
|
"icon": "home"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"link": "/servants",
|
"link": "/servants",
|
||||||
"text": "Servants",
|
"text": "Servants",
|
||||||
"icon": "iconoir-task-list"
|
"icon": "servants"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"link": "/ta-collection",
|
"link": "/ta-collection",
|
||||||
"text": "TA Collection",
|
"text": "TA Collection",
|
||||||
"icon": "iconoir-database"
|
"icon": "ta_collection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"link": "/blog",
|
"link": "/blog",
|
||||||
"text": "Blog",
|
"text": "Blog",
|
||||||
"icon": "iconoir-bookmark-book"
|
"icon": "blog"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"link": "/about",
|
"link": "/about",
|
||||||
"text": "About",
|
"text": "About",
|
||||||
"icon": "iconoir-mail"
|
"icon": "about"
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -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",
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -3,7 +3,7 @@ export default {
|
||||||
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
||||||
},
|
},
|
||||||
ci: {
|
ci: {
|
||||||
budget: 90,
|
budget: 50,
|
||||||
buildStatic: true
|
buildStatic: true
|
||||||
},
|
},
|
||||||
outputPath: "unlighthouse-reports",
|
outputPath: "unlighthouse-reports",
|
||||||
|
|