Compare commits

...

50 commits

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
76c723d516 Merge pull request 'Fixed Iconoir Icons' (#19) from dev into main
All checks were successful
/ build-site (push) Successful in 2m13s
/ checking (push) Successful in 36s
/ release (push) Successful in 7s
Reviewed-on: #19
2023-12-29 22:11:08 +00:00
a24a7af3d8
Bumped version
All checks were successful
/ checking (push) Successful in 28s
2023-12-29 23:10:24 +01:00
91f8c1834a
Migrating to iconoir imports
All checks were successful
/ checking (push) Successful in 23s
/ build-site (push) Successful in 2m6s
/ publish (push) Successful in 9s
/ unlighthouse (push) Successful in 32s
/ deploy-unlighthouse-files (push) Successful in 9s
/ deploy-unlighthouse-site (push) Successful in 7s
2023-12-29 22:57:30 +01:00
719a9ff3de Merge pull request 'Custom Youtube Embed' (#18) from dev into main
All checks were successful
/ build-site (push) Successful in 1m59s
/ release (push) Successful in 8s
/ checking (push) Successful in 1m25s
Reviewed-on: #18
2023-12-29 19:33:42 +00:00
8e4b169404
Bumped version before release
All checks were successful
/ checking (push) Successful in 29s
/ publish (push) Successful in 8s
/ build-site (push) Successful in 2m14s
/ deploy-unlighthouse-site (push) Successful in 6s
/ unlighthouse (push) Successful in 32s
/ deploy-unlighthouse-files (push) Successful in 8s
2023-12-29 20:25:52 +01:00
af83dfa7d8
Improved custom youtube embed component
All checks were successful
/ checking (push) Successful in 51s
/ build-site (push) Successful in 1m58s
/ publish (push) Successful in 8s
/ unlighthouse (push) Successful in 31s
/ deploy-unlighthouse-files (push) Successful in 14s
/ deploy-unlighthouse-site (push) Successful in 8s
2023-12-29 20:20:08 +01:00
5d1da2d3d8
Developed own component to wrap youtube-lite (adds placeholder when JS is off)
All checks were successful
/ publish (push) Successful in 1m19s
/ checking (push) Successful in 1m3s
/ build-site (push) Successful in 2m10s
2023-12-29 20:02:58 +01:00
cb8b53ea63
Testing lite-youtube for embed
All checks were successful
/ checking (push) Successful in 31s
/ publish (push) Successful in 9s
/ build-site (push) Successful in 2m52s
/ unlighthouse (push) Successful in 32s
/ deploy-unlighthouse-files (push) Successful in 8s
/ deploy-unlighthouse-site (push) Successful in 8s
2023-12-29 18:24:44 +01:00
71a6ea0051 Merge pull request 'Caching + Iconoir' (#17) from dev into main
All checks were successful
/ release (push) Successful in 8s
/ checking (push) Successful in 16s
/ build-site (push) Successful in 2m17s
Reviewed-on: #17
2023-12-29 14:28:23 +00:00
2b2ca46214
Updated caching for css
All checks were successful
/ checking (push) Successful in 18s
/ build-site (push) Successful in 2m3s
/ publish (push) Successful in 13s
/ unlighthouse (push) Successful in 33s
/ deploy-unlighthouse-files (push) Successful in 9s
/ deploy-unlighthouse-site (push) Successful in 7s
2023-12-29 15:21:17 +01:00
df9337c684
Bumped version
All checks were successful
/ checking (push) Successful in 19s
/ publish (push) Successful in 8s
/ build-site (push) Successful in 2m7s
/ deploy-unlighthouse-files (push) Successful in 9s
/ deploy-unlighthouse-site (push) Successful in 7s
/ unlighthouse (push) Successful in 53s
2023-12-29 15:05:38 +01:00
7e614b89a8
Moved to iconoir package instead of web stylesheet
All checks were successful
/ checking (push) Successful in 24s
2023-12-29 15:05:13 +01:00
76e0674098
Updated Unlighthouse capturing
All checks were successful
/ checking (push) Successful in 18s
/ unlighthouse (push) Successful in 34s
/ deploy-unlighthouse-files (push) Successful in 9s
/ deploy-unlighthouse-site (push) Successful in 6s
2023-12-29 14:39:08 +01:00
1592815835
Updated version
All checks were successful
/ release (push) Successful in 12s
/ checking (push) Successful in 20s
/ build-site (push) Successful in 2m59s
/ publish (push) Successful in 9s
/ deploy-unlighthouse-files (push) Successful in 10s
/ unlighthouse (push) Successful in 35s
/ deploy-unlighthouse-site (push) Successful in 7s
2023-12-29 13:36:45 +01:00
736abd6a51 Merge pull request 'Updated serve + unlighthouse docker ref' (#16) from dev into main
All checks were successful
/ checking (push) Successful in 14s
Reviewed-on: #16
2023-12-29 12:34:56 +00:00
5bfdb277fc
Updated serve + unlighthouse docker ref
All checks were successful
/ checking (push) Successful in 15s
/ publish (push) Successful in 8s
/ build-site (push) Successful in 2m34s
/ deploy-unlighthouse-site (push) Successful in 7s
/ deploy-unlighthouse-files (push) Successful in 9s
/ unlighthouse (push) Successful in 1m7s
2023-12-29 13:27:44 +01:00
eaab523a2a Merge pull request 'Updated docker to ci-docker-images (migration)' (#15) from dev into main
All checks were successful
/ checking (push) Successful in 13s
/ release (push) Successful in 8s
/ build-site (push) Successful in 2m50s
Reviewed-on: #15
2023-12-28 15:41:00 +00:00
47 changed files with 4787 additions and 342 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

@ -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

View file

@ -7,7 +7,7 @@ on:
jobs: jobs:
unlighthouse: unlighthouse:
runs-on: docker runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/unlighthouse-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
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

@ -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

View file

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

4510
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
{ {
"name": "@firq/fgosite", "name": "@firq/fgosite",
"type": "module", "type": "module",
"version": "0.1.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
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
}
}
}
};

View file

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

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: 145 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

@ -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;

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: 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>

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

@ -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>

View file

@ -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>

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

@ -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)

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

@ -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

View file

@ -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

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

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

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

View file

@ -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",