Compare commits

..

38 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
39 changed files with 3580 additions and 318 deletions

View file

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

View file

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

View file

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

12
.vscode/settings.json vendored Normal file
View file

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

View file

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

3373
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

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

13
postcss.config.cjs Normal file
View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

View file

@ -1,29 +1,26 @@
---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets'
import mlb_ce from '../assets/ce/mlb.webp'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props {
name: string
imageFile: string
mlb: string
mlb: boolean
}
const { mlb, imageFile, name } = Astro.props
const imagePath = `/src/assets/ce/${imageFile}`
const images_ces = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/ce/*.{png,webp}'
)
const images_ces = import.meta.glob<GlobImage>('/src/assets/ce/*.png')
const loadedCEImage = plsLoadImage(images_ces, imagePath)
let mlb_image: string = 'mlbalign'
if (mlb === 'false') {
mlb_image = 'hidemlb'
}
const mlb_image = mlb ? 'mlbalign' : 'hidemlb'
---
<article>
<div>
<Image src={images_ces[imagePath]()} alt={name} class="ce-crop" />
<Image src={loadedCEImage} alt={name} class="ce-crop" />
</div>
<div class={mlb_image}>
<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 type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props {
site: string
@ -9,19 +10,27 @@ export interface Props {
}
const { imageFile, link, site } = Astro.props
const logoAltText = `${site} Logo`
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}'
)
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">
<Image src={images_logos[imagePath]()} alt="" />
<Image src={loadedLogoImage} alt={logoAltText} />
<div>
<h2>{site}</h2>
</div>
</article>
<span class="visually-hidden">{logoAltText}</span>
</a>
<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 {
name: string
@ -11,12 +12,20 @@ export interface Props {
const { link, imageFile, origin, name } = Astro.props
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>
<Image src={images[imagePath]()} alt={name} />
<Image src={loadedImage} alt={name} />
<h2 class="subtext">
{origin}
</h2>
@ -36,10 +45,6 @@ const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/favouri
align-items: center;
}
a:hover {
transform: scale(var(--hover-scale));
}
a {
border-radius: 1rem;
display: flex;
@ -55,25 +60,27 @@ const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/favouri
text-align: center;
transition: transform var(--speed) var(--ease);
text-decoration: none;
&:hover {
transform: scale(var(--hover-scale));
}
a > img {
img {
padding: 0px 0.25em;
width: 90%;
height: auto;
}
}
@media (min-width: 512px) {
a {
padding: 10px 10px;
width: auto;
height: auto;
}
a > img {
img {
padding: 0px 1.5em;
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 logo from '../assets/logo.svg'
import hamburger from 'iconoir/icons/menu.svg'
const hamburger_src_url = `url("${hamburger.src}")`;
---
<header>
<a href="/" rel="noopener noreferrer" aria-label="Home">
<Image src={logo} alt="Website Logo"/>
<a href="/" rel="noopener noreferrer" aria-label="Home" role="navigation">
<Image src={logo} alt="Firq Website Logo"/>
<span class="visually-hidden">Firq Website Logo</span>
</a>
<ul class="desktop">
<slot />
<slot name="desktop"/>
</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>
<slot />
<slot name="mobile"/>
</ul>
<div class="placeholder"></div>
<i class="iconoir-menu"></i>
<div class="hamburger-menu" role="navigation"></div>
</button>
</header>
<style>
<style define:vars={{ hamburger_src_url }}>
header {
z-index: 1000;
position: sticky;
@ -32,7 +35,7 @@ import logo from '../assets/logo.svg'
line-height: 1.5em;
}
header > a {
padding-left: 16px;
margin-left: 16px;
padding-top: 8px;
display: block;
height: 48px;
@ -81,16 +84,6 @@ import logo from '../assets/logo.svg'
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 {
display: none;
padding: 0px;
@ -113,6 +106,17 @@ import logo from '../assets/logo.svg'
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) {
.mobile {
display: none;

View file

@ -1,12 +1,13 @@
---
export interface Props {
currentPage?: string
navtype: "mobile" | "desktop"
link: string
text: string
icon: string
icon: ImageMetadata
}
const { icon, text, link, currentPage } = Astro.props
const { icon, text, link, navtype, currentPage } = Astro.props
let currPage = ''
const slug = link.replace(new RegExp('/', 'g'), '')
@ -17,7 +18,10 @@ if (currentPage === slug) {
currPage = 'current'
}
const icon_src_url = `url("${icon.src}")`;
const fulllink = `/${slug}`
let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
---
<li>
@ -26,14 +30,15 @@ const fulllink = `/${slug}`
rel="noopener noreferrer"
aria-label={text}
class={currPage}
tabindex="0"
role="navigation"
{...extraattributes}
>
<i class={icon}></i>
<div class="icon"></div>
{text}
</a>
</li>
<style>
<style define:vars={{ icon_src_url }}>
li {
align-items: center;
justify-content: center;
@ -41,6 +46,7 @@ const fulllink = `/${slug}`
display: flex;
width: 200px;
}
li > a {
display: inline-flex;
color: white;
@ -52,10 +58,27 @@ const fulllink = `/${slug}`
font-weight: bold;
gap: 0.2em;
}
li > a:hover {
color: var(--c-purplepink);
}
li > a:hover > .icon {
background-color: var(--c-purplepink);
}
.current {
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>

View file

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

View file

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

View file

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

View file

@ -3,7 +3,12 @@ import Navbar from '../components/navbar.astro'
import NavbarEntry from '../components/navbarEntry.astro'
import navdata from '../../static/data/_navdata.json'
import embed from '../assets/embed.png'
import "iconoir/css/iconoir.css"
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 {
title: string
@ -11,6 +16,18 @@ export interface Props {
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
let description
@ -24,9 +41,14 @@ let currPage = 'https://firq.dev/'
if (currentpage !== 'home') {
currPage += currentpage
}
const mapped_navdata = navdata.map((item) => ({
...item,
...{ icon: icons[item.icon] },
}))
---
<!DOCTYPE html>
<!doctype html>
<html lang="en">
<head>
<title>{title}</title>
@ -54,8 +76,13 @@ if (currentpage !== 'home') {
<body>
<Navbar>
{
navdata.map((item) => (
<NavbarEntry currentPage={currentpage} {...item} />
mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} navtype="desktop" {...item} slot="desktop"/>
))
}
{
mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} navtype="mobile" {...item} slot="mobile"/>
))
}
</Navbar>
@ -80,4 +107,15 @@ if (currentpage !== 'home') {
background: var(--c-lightgray);
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>

View file

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

View file

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

View file

@ -6,6 +6,9 @@ description: 'A handful of observations from the cernunnos fight'
author: 'Requiem & Firq'
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
@ -45,3 +48,19 @@ On the first break Cernunnos skill seals your servants. This means on turn 2 you
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.
Ideally you would be able to reuse her third skill on turn 4 but because she gets skill sealed she can't do it.
## Resulting runs
Both Requiem and I managed to get unique TAs done with Scathach (Requiem even with more servants). Those runs are embedded here:
### Firq
This run doesn't use the support Castoria provided by the game and instead makes use of Sherlock instead.
<YoutubeEmbed id="WrHudtdfivA" thumbnail={thumbnail_firq.src}/>
### Requiem
A frontline only run with double Castoria
<YoutubeEmbed id="O1f-go7uJQM" thumbnail={thumbnail_requiem.src}/>

View file

@ -11,6 +11,7 @@ import TaSection from '../layouts/taSection.astro'
import TaCard from '../components/taCard.astro'
import tadata from '../../static/data/_tadata.json'
import featured_data from '../../static/data/_featureddata.json'
import FgotaHero from '../components/fgotaHero.astro'
const important_data = tadata.filter(function (el) {
return [
@ -36,6 +37,7 @@ const description = 'A collection of TAs previously completed be Firq.'
currentpage="ta-collection"
descriptionOverride={description}
>
<FgotaHero />
<TaSection title="Notable TAs" abovetext="My most notable TAs">
{important_data.map((item) => <TaCard {...item} />)}
</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",
"imageFile": "merciless_one.png",
"mlb": "true"
"mlb": true
},
{
"name": "Ox-Demon King",
"imageFile": "ox-demon.png",
"mlb": "true"
"mlb": true
},
{
"name": "Holy Maiden's Teachings",
"imageFile": "maidens_teachings.png",
"mlb": "true"
"mlb": true
},
{
"name": "Kaleidoscope",
"imageFile": "kaleidoscope.png",
"mlb": "true"
"mlb": true
},
{
"name": "The Black Grail",
"imageFile": "black_grail.png",
"mlb": "true"
"mlb": true
},
{
"name": "A Fragment Of 2030",
"imageFile": "2030.png",
"mlb": "true"
"mlb": true
},
{
"name": "Outrage",
"imageFile": "outrage.png",
"mlb": "false"
"mlb": false
},
{
"name": "Vessel of the Saint",
"imageFile": "vessel.png",
"mlb": "false"
"mlb": false
},
{
"name": "Devilish Bodhisattva",
"imageFile": "devilish_bodhisattva.png",
"mlb": "true"
"mlb": true
},
{
"name": "500-Year Obsession",
"imageFile": "500.png",
"mlb": "true"
"mlb": true
},
{
"name": "Prisma Cosmos",
"imageFile": "prisma_cosmos.png",
"mlb": "true"
"mlb": true
}
]

View file

@ -2,26 +2,26 @@
{
"link": "/",
"text": "Home",
"icon": "iconoir-home"
"icon": "home"
},
{
"link": "/servants",
"text": "Servants",
"icon": "iconoir-task-list"
"icon": "servants"
},
{
"link": "/ta-collection",
"text": "TA Collection",
"icon": "iconoir-database"
"icon": "ta_collection"
},
{
"link": "/blog",
"text": "Blog",
"icon": "iconoir-bookmark-book"
"icon": "blog"
},
{
"link": "/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",
"level": "120",
"np": "5",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "10",
"servantImageFile": "skadi_03.png",
"bondceImageFile": "skadi.png",
@ -13,7 +23,7 @@
"name": "Skadi",
"level": "70",
"np": "1",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "1",
"servantImageFile": "skadi_02.png",
"bondceImageFile": "skadi.png",
@ -23,7 +33,7 @@
"name": "Skadi",
"level": "1",
"np": "1",
"skills": "10 / X / X ",
"skills": "10 / X / X",
"ml": "1",
"servantImageFile": "skadi_01.png",
"bondceImageFile": "skadi.png",
@ -33,18 +43,18 @@
"name": "Koyanskaya of Light",
"level": "90",
"np": "1",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "Not Unlocked",
"servantImageFile": "koyanlight_01.png",
"bondceImageFile": "koyanlight.png",
"bond10": false
"bond10": true
},
{
"name": "Castoria",
"level": "90",
"np": "1",
"skills": "10 / 10 / 10 ",
"ml": "7",
"skills": "10 / 10 / 10",
"ml": "10",
"servantImageFile": "castoria_02.png",
"bondceImageFile": "castoria.png",
"bond10": true
@ -53,7 +63,7 @@
"name": "Castoria",
"level": "70",
"np": "1",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "1",
"servantImageFile": "castoria_01.png",
"bondceImageFile": "castoria.png",
@ -63,17 +73,17 @@
"name": "Oberon",
"level": "90",
"np": "1",
"skills": "10 / 10 / 10 ",
"ml": "Not Unlocked",
"skills": "10 / 10 / 10",
"ml": "1",
"servantImageFile": "oberon_02.png",
"bondceImageFile": "oberon.png",
"bond10": false
"bond10": true
},
{
"name": "Merlin",
"level": "90",
"np": "1",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "Not Unlocked",
"servantImageFile": "merlin_03.png",
"bondceImageFile": "merlin.png",
@ -83,7 +93,7 @@
"name": "Merlin",
"level": "70",
"np": "1",
"skills": "9 / 1 / 9 ",
"skills": "9 / 1 / 9",
"ml": "Not Unlocked",
"servantImageFile": "merlin_01.png",
"bondceImageFile": "merlin.png",
@ -93,7 +103,7 @@
"name": "Waver",
"level": "90",
"np": "1",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "Not Unlocked",
"servantImageFile": "waver_02.png",
"bondceImageFile": "waver.png",
@ -103,7 +113,7 @@
"name": "Reines",
"level": "90",
"np": "1",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "9",
"servantImageFile": "reines_01.png",
"bondceImageFile": "reines.png",
@ -113,7 +123,7 @@
"name": "Tamamo-no-Mae",
"level": "90",
"np": "2",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "Not Unlocked",
"servantImageFile": "tamamo_03.png",
"bondceImageFile": "tamamo.png",
@ -123,7 +133,7 @@
"name": "Van Gogh",
"level": "90",
"np": "1",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "10",
"servantImageFile": "gogh_01.png",
"bondceImageFile": "gogh.png",
@ -133,7 +143,7 @@
"name": "Miss Crane",
"level": "90",
"np": "1",
"skills": "10 / 10 / 10 ",
"skills": "10 / 10 / 10",
"ml": "Not Unlocked",
"servantImageFile": "crane_01.png",
"bondceImageFile": "crane.png",
@ -143,8 +153,8 @@
"name": "Ashiya Douman",
"level": "90",
"np": "1",
"skills": "9 / 9 / 10 ",
"ml": "Not Unlocked",
"skills": "9 / 9 / 10",
"ml": "10",
"servantImageFile": "douman_01.png",
"bondceImageFile": "douman.png",
"bond10": false
@ -153,27 +163,47 @@
"name": "Himiko",
"level": "90",
"np": "1",
"skills": "9 / 9 / 9 ",
"skills": "9 / 9 / 9",
"ml": "Not Unlocked",
"servantImageFile": "himiko_03.png",
"bondceImageFile": "himiko.png",
"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)",
"level": "90",
"np": "1",
"skills": "10 / 10 / 9 ",
"skills": "10 / 10 / 10",
"ml": "Not Unlocked",
"servantImageFile": "bride_03.png",
"bondceImageFile": "bride.png",
"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)",
"level": "80",
"np": "5",
"skills": "9 / 10 / 10 ",
"skills": "9 / 10 / 9",
"ml": "Not Unlocked",
"servantImageFile": "santagale_01.png",
"bondceImageFile": "santagale.png",
@ -183,7 +213,7 @@
"name": "Nightingale (Santa)",
"level": "60",
"np": "1",
"skills": "1 / 10 / 10 ",
"skills": "1 / 10 / 10",
"ml": "Not Unlocked",
"servantImageFile": "santagale_01.png",
"bondceImageFile": "santagale.png",
@ -193,7 +223,7 @@
"name": "Elisabeth Báthory",
"level": "40",
"np": "1",
"skills": "9 / 9 / X ",
"skills": "9 / 9 / X",
"ml": "Not Unlocked",
"servantImageFile": "liz_01.png",
"bondceImageFile": "liz.png",
@ -203,7 +233,7 @@
"name": "Wu Zetian",
"level": "60",
"np": "1",
"skills": "9 / 1 / 9 ",
"skills": "10 / 9 / 10",
"ml": "Not Unlocked",
"servantImageFile": "wu_01.png",
"bondceImageFile": "wu.png",
@ -213,7 +243,7 @@
"name": "Ibaraki-Douji",
"level": "40",
"np": "1",
"skills": "8 / 8 / X ",
"skills": "9 / 10 / X ",
"ml": "Not Unlocked",
"servantImageFile": "ibaraki_02.png",
"bondceImageFile": "ibaraki.png",
@ -223,7 +253,7 @@
"name": "Calamity Jane",
"level": "60",
"np": "1",
"skills": "1 / 9 / 9 ",
"skills": "1 / 9 / 9",
"ml": "Not Unlocked",
"servantImageFile": "jane_02.png",
"bondceImageFile": "jane.png",
@ -233,7 +263,7 @@
"name": "Chiron",
"level": "60",
"np": "1",
"skills": "1 / 9 / 9 ",
"skills": "1 / 10 / 10",
"ml": "Not Unlocked",
"servantImageFile": "chiron_01.png",
"bondceImageFile": "chiron.png",

View file

@ -310,5 +310,21 @@
"date": "2023-12-16",
"servantImageFile": "shishou.png",
"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"
}
]