Compare commits
No commits in common. "main" and "0.1.21pre1" have entirely different histories.
main
...
0.1.21pre1
|
@ -40,14 +40,13 @@ jobs:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
steps:
|
steps:
|
||||||
- name: Release New Version
|
- name: Release New Version
|
||||||
uses: https://code.forgejo.org/actions/forgejo-release@v1
|
uses: actions/forgejo-release@v1
|
||||||
with:
|
with:
|
||||||
direction: upload
|
direction: upload
|
||||||
url: https://forgejo.neshweb.net
|
url: https://forgejo.neshweb.net
|
||||||
release-dir: release
|
release-dir: release
|
||||||
token: ${{ secrets.FORGEJO_TOKEN }}
|
token: ${{ secrets.FORGEJO_TOKEN }}
|
||||||
tag: ${{ github.ref_name }}
|
tag: ${{ github.ref_name }}
|
||||||
prerelease: true
|
|
||||||
|
|
||||||
# doesn't work atm
|
# doesn't work atm
|
||||||
# unlighthouse:
|
# unlighthouse:
|
||||||
|
|
|
@ -40,7 +40,7 @@ jobs:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
steps:
|
steps:
|
||||||
- name: Release New Version
|
- name: Release New Version
|
||||||
uses: https://code.forgejo.org/actions/forgejo-release@v1
|
uses: actions/forgejo-release@v1
|
||||||
with:
|
with:
|
||||||
direction: upload
|
direction: upload
|
||||||
url: https://forgejo.neshweb.net
|
url: https://forgejo.neshweb.net
|
||||||
|
|
|
@ -23,7 +23,6 @@ jobs:
|
||||||
|
|
||||||
deploy-unlighthouse-files:
|
deploy-unlighthouse-files:
|
||||||
needs: [ unlighthouse ]
|
needs: [ unlighthouse ]
|
||||||
if: success()
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
env:
|
env:
|
||||||
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
||||||
|
@ -68,7 +67,6 @@ jobs:
|
||||||
|
|
||||||
deploy-unlighthouse-site:
|
deploy-unlighthouse-site:
|
||||||
needs: [ deploy-unlighthouse-files ]
|
needs: [ deploy-unlighthouse-files ]
|
||||||
if: success()
|
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
env:
|
env:
|
||||||
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
||||||
|
@ -93,6 +91,5 @@ jobs:
|
||||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||||
script: |
|
script: |
|
||||||
PATH="$HOME/.local/bin:$PATH"
|
PATH="$HOME/.local/bin:$PATH"
|
||||||
screen -ls | grep 'firq_dev-unlighthouse' | awk '{print $1}' | xargs -I % -t screen -X -S % quit
|
|
||||||
cd firq_dev
|
cd firq_dev
|
||||||
screen -S firq_dev-unlighthouse -dm serve unlighthouse/ -p ${{ secrets.UNLIGHTHOUSE_DEPLOY_PORT }}
|
screen -S firq_dev-unlighthouse -dm serve unlighthouse/ -p ${{ secrets.UNLIGHTHOUSE_DEPLOY_PORT }}
|
||||||
|
|
2371
package-lock.json
generated
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@firq/fgosite",
|
"name": "@firq/fgosite",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.1.27",
|
"version": "0.1.21",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "astro dev",
|
"dev": "astro dev",
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
"@astrojs/check": "^0.3.3",
|
"@astrojs/check": "^0.3.3",
|
||||||
"@astrojs/mdx": "^2.0.3",
|
"@astrojs/mdx": "^2.0.3",
|
||||||
"@astrojs/sitemap": "^3.0.3",
|
"@astrojs/sitemap": "^3.0.3",
|
||||||
"astro": "^4.2.1",
|
"astro": "^4.0.7",
|
||||||
"autoprefixer": "^10.4.16",
|
"autoprefixer": "^10.4.16",
|
||||||
"iconoir": "^7.2.0",
|
"iconoir": "^7.2.0",
|
||||||
"postcss-preset-env": "^9.3.0",
|
"postcss-preset-env": "^9.3.0",
|
||||||
|
|
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 68 KiB |
|
@ -1,26 +1,29 @@
|
||||||
---
|
---
|
||||||
|
import type { ImageMetadata } from 'astro'
|
||||||
import { Image } from 'astro:assets'
|
import { Image } from 'astro:assets'
|
||||||
import mlb_ce from '../assets/ce/mlb.webp'
|
import mlb_ce from '../assets/ce/mlb.webp'
|
||||||
import type { GlobImage } from '../types/generic'
|
|
||||||
import { plsLoadImage } from '../utils/tools'
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
name: string
|
name: string
|
||||||
imageFile: string
|
imageFile: string
|
||||||
mlb: boolean
|
mlb: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const { mlb, imageFile, name } = Astro.props
|
const { mlb, imageFile, name } = Astro.props
|
||||||
const imagePath = `/src/assets/ce/${imageFile}`
|
const imagePath = `/src/assets/ce/${imageFile}`
|
||||||
const images_ces = import.meta.glob<GlobImage>('/src/assets/ce/*.png')
|
const images_ces = import.meta.glob<{ default: ImageMetadata }>(
|
||||||
const loadedCEImage = plsLoadImage(images_ces, imagePath)
|
'/src/assets/ce/*.png'
|
||||||
|
)
|
||||||
|
|
||||||
const mlb_image = mlb ? 'mlbalign' : 'hidemlb'
|
let mlb_image: string = 'mlbalign'
|
||||||
|
if (mlb === 'false') {
|
||||||
|
mlb_image = 'hidemlb'
|
||||||
|
}
|
||||||
---
|
---
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
<div>
|
<div>
|
||||||
<Image src={loadedCEImage} alt={name} class="ce-crop" />
|
<Image src={images_ces[imagePath]()} alt={name} class="ce-crop" />
|
||||||
</div>
|
</div>
|
||||||
<div class={mlb_image}>
|
<div class={mlb_image}>
|
||||||
<Image src={mlb_ce} alt="Max-limit broken" class="mlb" />
|
<Image src={mlb_ce} alt="Max-limit broken" class="mlb" />
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
|
import type { ImageMetadata } from 'astro'
|
||||||
import { Image } from 'astro:assets'
|
import { Image } from 'astro:assets'
|
||||||
import type { GlobImage } from '../types/generic'
|
|
||||||
import { plsLoadImage } from '../utils/tools'
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
site: string
|
site: string
|
||||||
|
@ -12,20 +11,14 @@ export interface Props {
|
||||||
const { imageFile, link, site } = Astro.props
|
const { imageFile, link, site } = Astro.props
|
||||||
const logoAltText = `${site} Logo`
|
const logoAltText = `${site} Logo`
|
||||||
const imagePath = `/src/assets/social/${imageFile}`
|
const imagePath = `/src/assets/social/${imageFile}`
|
||||||
const images_logos = import.meta.glob<GlobImage>(
|
const images_logos = import.meta.glob<{ default: ImageMetadata }>(
|
||||||
'/src/assets/social/*.{png,webp}'
|
'/src/assets/social/*.{png,webp}'
|
||||||
)
|
)
|
||||||
const loadedLogoImage = plsLoadImage(images_logos, imagePath)
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<a
|
<a href={link} target="_blank" rel="noopener noreferrer" aria-label=`${site} - new window`>
|
||||||
href={link}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
aria-label=`${site} - new window`
|
|
||||||
>
|
|
||||||
<article class="contact do-hover">
|
<article class="contact do-hover">
|
||||||
<Image src={loadedLogoImage} alt={logoAltText} />
|
<Image src={images_logos[imagePath]()} alt={logoAltText} />
|
||||||
<div>
|
<div>
|
||||||
<h2>{site}</h2>
|
<h2>{site}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
import { Image } from 'astro:assets'
|
import type { ImageMetadata } from 'astro';
|
||||||
import type { GlobImage } from '../types/generic'
|
import { Image } from 'astro:assets';
|
||||||
import { plsLoadImage } from '../utils/tools'
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
name: string
|
name: string
|
||||||
|
@ -12,20 +11,12 @@ export interface Props {
|
||||||
|
|
||||||
const { link, imageFile, origin, name } = Astro.props
|
const { link, imageFile, origin, name } = Astro.props
|
||||||
const imagePath = `/src/assets/favourites/${imageFile}`
|
const imagePath = `/src/assets/favourites/${imageFile}`
|
||||||
const images = import.meta.glob<GlobImage>(
|
const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/favourites/*.{png,webp}')
|
||||||
'/src/assets/favourites/*.{png,webp}'
|
|
||||||
)
|
|
||||||
const loadedImage = plsLoadImage(images, imagePath)
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<a
|
<a href={link} target="_blank" rel="noopener noreferrer" aria-label=`${name} - new window`>
|
||||||
href={link}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
aria-label=`${name} - new window`
|
|
||||||
>
|
|
||||||
<div class="heading">{name}</div>
|
<div class="heading">{name}</div>
|
||||||
<Image src={loadedImage} alt={name} />
|
<Image src={images[imagePath]()} alt={name} />
|
||||||
<h2 class="subtext">
|
<h2 class="subtext">
|
||||||
{origin}
|
{origin}
|
||||||
</h2>
|
</h2>
|
||||||
|
@ -45,6 +36,10 @@ const loadedImage = plsLoadImage(images, imagePath)
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
transform: scale(var(--hover-scale));
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
border-radius: 1rem;
|
border-radius: 1rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -60,27 +55,25 @@ const loadedImage = plsLoadImage(images, imagePath)
|
||||||
text-align: center;
|
text-align: center;
|
||||||
transition: transform var(--speed) var(--ease);
|
transition: transform var(--speed) var(--ease);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|
||||||
&:hover {
|
|
||||||
transform: scale(var(--hover-scale));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
a > img {
|
||||||
padding: 0px 0.25em;
|
padding: 0px 0.25em;
|
||||||
width: 90%;
|
width: 90%;
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 512px) {
|
@media (min-width: 512px) {
|
||||||
a {
|
a {
|
||||||
padding: 10px 10px;
|
padding: 10px 10px;
|
||||||
width: auto;
|
width: auto;
|
||||||
height: auto;
|
height: auto;
|
||||||
img {
|
}
|
||||||
|
|
||||||
|
a > img {
|
||||||
padding: 0px 1.5em;
|
padding: 0px 1.5em;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
}
|
height: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
---
|
|
||||||
---
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<span>
|
|
||||||
I am currently working on a site to catalogue past and future TAs.<br/>
|
|
||||||
Check it out at <a href="https://fgo-ta.com">fgo-ta.com</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
div {
|
|
||||||
display: flex;
|
|
||||||
width: 100%;
|
|
||||||
height: 5em;
|
|
||||||
background-color: var(--c-gray);
|
|
||||||
text-align: center;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: white;
|
|
||||||
font-size: 1.5em;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: var(--c-darkpurple);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -11,14 +11,14 @@ const hamburger_src_url = `url("${hamburger.src}")`;
|
||||||
<span class="visually-hidden">Firq Website Logo</span>
|
<span class="visually-hidden">Firq Website Logo</span>
|
||||||
</a>
|
</a>
|
||||||
<ul class="desktop">
|
<ul class="desktop">
|
||||||
<slot name="desktop"/>
|
<slot />
|
||||||
</ul>
|
</ul>
|
||||||
<button class="mobile" aria-label="Navigation Button" tabindex="0" onclick="this.focus()" role="navigation">
|
<button class="mobile" aria-label="Navigation Button" tabindex="0" onclick="this.focus()">
|
||||||
<ul>
|
<ul>
|
||||||
<slot name="mobile"/>
|
<slot />
|
||||||
</ul>
|
</ul>
|
||||||
<div class="placeholder"></div>
|
<div class="placeholder"></div>
|
||||||
<div class="hamburger-menu" role="navigation"></div>
|
<div class="hamburger-menu" role="menu"></div>
|
||||||
</button>
|
</button>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
@ -109,12 +109,12 @@ const hamburger_src_url = `url("${hamburger.src}")`;
|
||||||
.hamburger-menu {
|
.hamburger-menu {
|
||||||
mask: var(--hamburger_src_url) no-repeat center;
|
mask: var(--hamburger_src_url) no-repeat center;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
width: 2rem;
|
width: 2em;
|
||||||
height: 2rem;
|
height: 2em;
|
||||||
position: static;
|
position: static;
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
margin-right: 1rem;
|
padding-right: 1em;
|
||||||
margin-top: 1rem;
|
padding-top: 2.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 1140px) {
|
@media (min-width: 1140px) {
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
---
|
---
|
||||||
export interface Props {
|
export interface Props {
|
||||||
currentPage?: string
|
currentPage?: string
|
||||||
navtype: "mobile" | "desktop"
|
|
||||||
link: string
|
link: string
|
||||||
text: string
|
text: string
|
||||||
icon: ImageMetadata
|
icon: ImageMetadata
|
||||||
}
|
}
|
||||||
|
|
||||||
const { icon, text, link, navtype, currentPage } = Astro.props
|
const { icon, text, link, currentPage } = Astro.props
|
||||||
|
|
||||||
let currPage = ''
|
let currPage = ''
|
||||||
const slug = link.replace(new RegExp('/', 'g'), '')
|
const slug = link.replace(new RegExp('/', 'g'), '')
|
||||||
|
@ -20,8 +19,6 @@ if (currentPage === slug) {
|
||||||
|
|
||||||
const icon_src_url = `url("${icon.src}")`;
|
const icon_src_url = `url("${icon.src}")`;
|
||||||
const fulllink = `/${slug}`
|
const fulllink = `/${slug}`
|
||||||
|
|
||||||
let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
|
@ -30,8 +27,7 @@ let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label={text}
|
aria-label={text}
|
||||||
class={currPage}
|
class={currPage}
|
||||||
role="navigation"
|
role="menuitem"
|
||||||
{...extraattributes}
|
|
||||||
>
|
>
|
||||||
<div class="icon"></div>
|
<div class="icon"></div>
|
||||||
{text}
|
{text}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
|
import type { ImageMetadata } from 'astro';
|
||||||
import { Image } from 'astro:assets';
|
import { Image } from 'astro:assets';
|
||||||
import type { GlobImage } from '../types/generic'
|
|
||||||
import { plsLoadImage } from '../utils/tools'
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
name: string
|
name: string
|
||||||
|
@ -17,10 +16,8 @@ export interface Props {
|
||||||
const { bond10, ml, bondceImageFile, servantImageFile, np, skills, level, name } = Astro.props
|
const { bond10, ml, bondceImageFile, servantImageFile, np, skills, level, name } = Astro.props
|
||||||
const servantImagePath = `/src/assets/servant/${servantImageFile}`
|
const servantImagePath = `/src/assets/servant/${servantImageFile}`
|
||||||
const bondceImagePath = `/src/assets/ce/bond-ce/${bondceImageFile}`
|
const bondceImagePath = `/src/assets/ce/bond-ce/${bondceImageFile}`
|
||||||
const images_servants = import.meta.glob<GlobImage>('/src/assets/servant/*.{png,webp}')
|
const images_servants = import.meta.glob<{ default: ImageMetadata }>('/src/assets/servant/*.{png,webp}')
|
||||||
const images_bond_ces = import.meta.glob<GlobImage>('/src/assets/ce/bond-ce/*.{png,webp}')
|
const images_bond_ces = import.meta.glob<{ default: ImageMetadata }>('/src/assets/ce/bond-ce/*.{png,webp}')
|
||||||
const loadedServantImage = plsLoadImage(images_servants, servantImagePath)
|
|
||||||
const loadedBondCEImage = plsLoadImage(images_bond_ces, bondceImagePath)
|
|
||||||
|
|
||||||
let bondce_css: string = 'bond-ce'
|
let bondce_css: string = 'bond-ce'
|
||||||
|
|
||||||
|
@ -30,14 +27,14 @@ if (bond10 === false) {
|
||||||
---
|
---
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
<Image src={loadedServantImage} alt={name} />
|
<Image src={images_servants[servantImagePath]()} alt={name} />
|
||||||
<h2 class="subtext">
|
<h2 class="subtext">
|
||||||
Level {level}<br />
|
Level {level}<br />
|
||||||
{skills}<br />
|
{skills}<br />
|
||||||
NP {np}
|
NP {np}
|
||||||
</h2>
|
</h2>
|
||||||
<div class="expand-on-hover">
|
<div class="expand-on-hover">
|
||||||
<Image src={loadedBondCEImage} alt="" class={bondce_css}/>
|
<Image src={images_bond_ces[bondceImagePath]()} alt="" class={bondce_css}/>
|
||||||
<h2 class="subtext">Mana Loading: {ml === 'Not Unlocked' && <br />}{ml}</h2>
|
<h2 class="subtext">Mana Loading: {ml === 'Not Unlocked' && <br />}{ml}</h2>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
---
|
---
|
||||||
|
import type { ImageMetadata } from 'astro'
|
||||||
import { Image } from 'astro:assets'
|
import { Image } from 'astro:assets'
|
||||||
import type { GlobImage } from '../types/generic'
|
|
||||||
import { plsLoadImage } from '../utils/tools'
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
date: string
|
date: string
|
||||||
title: string
|
title: string
|
||||||
|
@ -26,16 +24,13 @@ const targetImagePath = `/src/assets/ta_icons/${targetImageFile}`
|
||||||
const servantImagePath = `/src/assets/ta_icons/ta_servants/${servantImageFile}`
|
const servantImagePath = `/src/assets/ta_icons/ta_servants/${servantImageFile}`
|
||||||
|
|
||||||
const formatted_date = new Date(date).toLocaleDateString('de-DE', options_date)
|
const formatted_date = new Date(date).toLocaleDateString('de-DE', options_date)
|
||||||
const target_images = import.meta.glob<GlobImage>(
|
const target_images = import.meta.glob<{ default: ImageMetadata }>(
|
||||||
'/src/assets/ta_icons/*.{png,webp}'
|
'/src/assets/ta_icons/*.{png,webp}'
|
||||||
)
|
)
|
||||||
const servant_images = import.meta.glob<GlobImage>(
|
const servant_images = import.meta.glob<{ default: ImageMetadata }>(
|
||||||
'/src/assets/ta_icons/ta_servants/*.{png,webp}'
|
'/src/assets/ta_icons/ta_servants/*.{png,webp}'
|
||||||
)
|
)
|
||||||
|
|
||||||
const loadedServantImage = plsLoadImage(servant_images, servantImagePath)
|
|
||||||
const loadedTargetImage = plsLoadImage(target_images, targetImagePath)
|
|
||||||
|
|
||||||
let hasuser = ''
|
let hasuser = ''
|
||||||
if (user !== undefined) {
|
if (user !== undefined) {
|
||||||
hasuser = 'hasuser'
|
hasuser = 'hasuser'
|
||||||
|
@ -44,7 +39,7 @@ if (user !== undefined) {
|
||||||
|
|
||||||
<a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}>
|
<a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}>
|
||||||
<article>
|
<article>
|
||||||
<Image src={loadedTargetImage} alt={title} class="icon" />
|
<Image src={target_images[targetImagePath]()} alt={title} class="icon" />
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<h2>{title}</h2>
|
<h2>{title}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
@ -55,7 +50,7 @@ if (user !== undefined) {
|
||||||
{formatted_date}
|
{formatted_date}
|
||||||
</p>
|
</p>
|
||||||
<div class="expand-on-hover">
|
<div class="expand-on-hover">
|
||||||
<Image src={loadedServantImage} alt="" />
|
<Image src={servant_images[servantImagePath ?? 'undefined']()} alt="" />
|
||||||
<h2>{turns}</h2>
|
<h2>{turns}</h2>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
|
import type { ImageMetadata } from 'astro'
|
||||||
import { Image } from 'astro:assets'
|
import { Image } from 'astro:assets'
|
||||||
import type { GlobImage } from '../types/generic'
|
|
||||||
import { plsLoadImage } from '../utils/tools'
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
title: string
|
title: string
|
||||||
|
@ -12,15 +11,14 @@ export interface Props {
|
||||||
const { imageFile, link, title } = Astro.props
|
const { imageFile, link, title } = Astro.props
|
||||||
const logoAltText = `${title} Logo`
|
const logoAltText = `${title} Logo`
|
||||||
const imagePath = `/src/assets/technologies/${imageFile}`
|
const imagePath = `/src/assets/technologies/${imageFile}`
|
||||||
const images_logos = import.meta.glob<GlobImage>(
|
const images_logos = import.meta.glob<{ default: ImageMetadata }>(
|
||||||
'/src/assets/technologies/*.{png,webp}'
|
'/src/assets/technologies/*.{png,webp}'
|
||||||
)
|
)
|
||||||
const loadedImage = plsLoadImage(images_logos, imagePath)
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}>
|
<a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}>
|
||||||
<article>
|
<article>
|
||||||
<Image src={loadedImage} alt={logoAltText} />
|
<Image src={images_logos[imagePath]()} alt={logoAltText} />
|
||||||
<div>
|
<div>
|
||||||
<h2>{title}</h2>
|
<h2>{title}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -77,12 +77,7 @@ const mapped_navdata = navdata.map((item) => ({
|
||||||
<Navbar>
|
<Navbar>
|
||||||
{
|
{
|
||||||
mapped_navdata.map((item) => (
|
mapped_navdata.map((item) => (
|
||||||
<NavbarEntry currentPage={currentpage} navtype="desktop" {...item} slot="desktop"/>
|
<NavbarEntry currentPage={currentpage} {...item} />
|
||||||
))
|
|
||||||
}
|
|
||||||
{
|
|
||||||
mapped_navdata.map((item) => (
|
|
||||||
<NavbarEntry currentPage={currentpage} navtype="mobile" {...item} slot="mobile"/>
|
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
</Navbar>
|
</Navbar>
|
||||||
|
|
|
@ -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">
|
||||||
<< Go back home
|
<i class="iconoir-fast-arrow-left"></i>Go back home
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</BaseSection>
|
</BaseSection>
|
||||||
|
@ -50,10 +50,10 @@ const description = "Error. This shouldn't happen :/"
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: var(--c-darkpurple);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: var(--c-darkpurple);
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
|
|
|
@ -11,7 +11,6 @@ import TaSection from '../layouts/taSection.astro'
|
||||||
import TaCard from '../components/taCard.astro'
|
import TaCard from '../components/taCard.astro'
|
||||||
import tadata from '../../static/data/_tadata.json'
|
import tadata from '../../static/data/_tadata.json'
|
||||||
import featured_data from '../../static/data/_featureddata.json'
|
import featured_data from '../../static/data/_featureddata.json'
|
||||||
import FgotaHero from '../components/fgotaHero.astro'
|
|
||||||
|
|
||||||
const important_data = tadata.filter(function (el) {
|
const important_data = tadata.filter(function (el) {
|
||||||
return [
|
return [
|
||||||
|
@ -37,7 +36,6 @@ const description = 'A collection of TAs previously completed be Firq.'
|
||||||
currentpage="ta-collection"
|
currentpage="ta-collection"
|
||||||
descriptionOverride={description}
|
descriptionOverride={description}
|
||||||
>
|
>
|
||||||
<FgotaHero />
|
|
||||||
<TaSection title="Notable TAs" abovetext="My most notable TAs">
|
<TaSection title="Notable TAs" abovetext="My most notable TAs">
|
||||||
{important_data.map((item) => <TaCard {...item} />)}
|
{important_data.map((item) => <TaCard {...item} />)}
|
||||||
</TaSection>
|
</TaSection>
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
export interface IconsLookup {
|
|
||||||
[key: string]: ImageMetadata
|
|
||||||
}
|
|
||||||
|
|
||||||
interface GlobGeneric<T> {
|
|
||||||
default: T
|
|
||||||
}
|
|
||||||
|
|
||||||
export type GlobAny = GlobGeneric<any>
|
|
||||||
export type GlobImage = GlobGeneric<ImageMetadata>
|
|
|
@ -1,5 +0,0 @@
|
||||||
export function plsLoadImage(record: Record<string, () => Promise<{default: ImageMetadata}>>, path: string) {
|
|
||||||
const loadedImage = record[path]?.();
|
|
||||||
if (!loadedImage) throw new Error("Asset was not found:" + path);
|
|
||||||
return loadedImage;
|
|
||||||
}
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,14 +1,4 @@
|
||||||
[
|
[
|
||||||
{
|
|
||||||
"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",
|
||||||
|
@ -47,14 +37,14 @@
|
||||||
"ml": "Not Unlocked",
|
"ml": "Not Unlocked",
|
||||||
"servantImageFile": "koyanlight_01.png",
|
"servantImageFile": "koyanlight_01.png",
|
||||||
"bondceImageFile": "koyanlight.png",
|
"bondceImageFile": "koyanlight.png",
|
||||||
"bond10": true
|
"bond10": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Castoria",
|
"name": "Castoria",
|
||||||
"level": "90",
|
"level": "90",
|
||||||
"np": "1",
|
"np": "1",
|
||||||
"skills": "10 / 10 / 10 ",
|
"skills": "10 / 10 / 10 ",
|
||||||
"ml": "10",
|
"ml": "7",
|
||||||
"servantImageFile": "castoria_02.png",
|
"servantImageFile": "castoria_02.png",
|
||||||
"bondceImageFile": "castoria.png",
|
"bondceImageFile": "castoria.png",
|
||||||
"bond10": true
|
"bond10": true
|
||||||
|
@ -74,10 +64,10 @@
|
||||||
"level": "90",
|
"level": "90",
|
||||||
"np": "1",
|
"np": "1",
|
||||||
"skills": "10 / 10 / 10 ",
|
"skills": "10 / 10 / 10 ",
|
||||||
"ml": "1",
|
"ml": "Not Unlocked",
|
||||||
"servantImageFile": "oberon_02.png",
|
"servantImageFile": "oberon_02.png",
|
||||||
"bondceImageFile": "oberon.png",
|
"bondceImageFile": "oberon.png",
|
||||||
"bond10": true
|
"bond10": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Merlin",
|
"name": "Merlin",
|
||||||
|
@ -154,7 +144,7 @@
|
||||||
"level": "90",
|
"level": "90",
|
||||||
"np": "1",
|
"np": "1",
|
||||||
"skills": "9 / 9 / 10 ",
|
"skills": "9 / 9 / 10 ",
|
||||||
"ml": "10",
|
"ml": "Not Unlocked",
|
||||||
"servantImageFile": "douman_01.png",
|
"servantImageFile": "douman_01.png",
|
||||||
"bondceImageFile": "douman.png",
|
"bondceImageFile": "douman.png",
|
||||||
"bond10": false
|
"bond10": false
|
||||||
|
@ -169,41 +159,21 @@
|
||||||
"bondceImageFile": "himiko.png",
|
"bondceImageFile": "himiko.png",
|
||||||
"bond10": false
|
"bond10": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Sherlock Holmes",
|
|
||||||
"level": "90",
|
|
||||||
"np": "1",
|
|
||||||
"skills": "9 / 10 / 9",
|
|
||||||
"ml": "Not Unlocked",
|
|
||||||
"servantImageFile": "sherlock_03.png",
|
|
||||||
"bondceImageFile": "sherlock.png",
|
|
||||||
"bond10": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Nero (Bride)",
|
"name": "Nero (Bride)",
|
||||||
"level": "90",
|
"level": "90",
|
||||||
"np": "1",
|
"np": "1",
|
||||||
"skills": "10 / 10 / 10",
|
"skills": "10 / 10 / 9 ",
|
||||||
"ml": "Not Unlocked",
|
"ml": "Not Unlocked",
|
||||||
"servantImageFile": "bride_03.png",
|
"servantImageFile": "bride_03.png",
|
||||||
"bondceImageFile": "bride.png",
|
"bondceImageFile": "bride.png",
|
||||||
"bond10": false
|
"bond10": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Taigon Wang",
|
|
||||||
"level": "70",
|
|
||||||
"np": "1",
|
|
||||||
"skills": "10 / 9 / 10",
|
|
||||||
"ml": "Not Unlocked",
|
|
||||||
"servantImageFile": "taigong_03.png",
|
|
||||||
"bondceImageFile": "taigong.png",
|
|
||||||
"bond10": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Nightingale (Santa)",
|
"name": "Nightingale (Santa)",
|
||||||
"level": "80",
|
"level": "80",
|
||||||
"np": "5",
|
"np": "5",
|
||||||
"skills": "9 / 10 / 9",
|
"skills": "9 / 10 / 10 ",
|
||||||
"ml": "Not Unlocked",
|
"ml": "Not Unlocked",
|
||||||
"servantImageFile": "santagale_01.png",
|
"servantImageFile": "santagale_01.png",
|
||||||
"bondceImageFile": "santagale.png",
|
"bondceImageFile": "santagale.png",
|
||||||
|
@ -233,7 +203,7 @@
|
||||||
"name": "Wu Zetian",
|
"name": "Wu Zetian",
|
||||||
"level": "60",
|
"level": "60",
|
||||||
"np": "1",
|
"np": "1",
|
||||||
"skills": "10 / 9 / 10",
|
"skills": "9 / 1 / 9 ",
|
||||||
"ml": "Not Unlocked",
|
"ml": "Not Unlocked",
|
||||||
"servantImageFile": "wu_01.png",
|
"servantImageFile": "wu_01.png",
|
||||||
"bondceImageFile": "wu.png",
|
"bondceImageFile": "wu.png",
|
||||||
|
@ -243,7 +213,7 @@
|
||||||
"name": "Ibaraki-Douji",
|
"name": "Ibaraki-Douji",
|
||||||
"level": "40",
|
"level": "40",
|
||||||
"np": "1",
|
"np": "1",
|
||||||
"skills": "9 / 10 / X ",
|
"skills": "8 / 8 / X ",
|
||||||
"ml": "Not Unlocked",
|
"ml": "Not Unlocked",
|
||||||
"servantImageFile": "ibaraki_02.png",
|
"servantImageFile": "ibaraki_02.png",
|
||||||
"bondceImageFile": "ibaraki.png",
|
"bondceImageFile": "ibaraki.png",
|
||||||
|
@ -263,7 +233,7 @@
|
||||||
"name": "Chiron",
|
"name": "Chiron",
|
||||||
"level": "60",
|
"level": "60",
|
||||||
"np": "1",
|
"np": "1",
|
||||||
"skills": "1 / 10 / 10",
|
"skills": "1 / 9 / 9 ",
|
||||||
"ml": "Not Unlocked",
|
"ml": "Not Unlocked",
|
||||||
"servantImageFile": "chiron_01.png",
|
"servantImageFile": "chiron_01.png",
|
||||||
"bondceImageFile": "chiron.png",
|
"bondceImageFile": "chiron.png",
|
||||||
|
|