Compare commits

..

26 commits

Author SHA1 Message Date
a7bb38b89a
Updated with summer skadi
All checks were successful
/ get-version (push) Successful in 3s
/ astro-check (push) Successful in 13s
/ checking (push) Successful in 14s
/ check-tag (push) Successful in 3s
/ build-site (push) Successful in 1m13s
/ create-release (push) Successful in 7s
/ auto-deploy-dockge (push) Successful in 7s
2024-07-25 14:49:36 +02:00
c72ffef3fc
Testing dockge cli container
All checks were successful
/ astro-check (push) Successful in 15s
/ get-version (push) Successful in 3s
/ check-tag (push) Successful in 3s
/ checking (push) Successful in 26s
/ build-site (push) Successful in 1m8s
/ create-release (push) Successful in 7s
/ auto-deploy-dockge (push) Successful in 10s
2024-07-22 17:51:58 +02:00
5007af517b
Extended dockge test with custom container
All checks were successful
/ get-version (push) Successful in 3s
/ astro-check (push) Successful in 14s
/ check-tag (push) Successful in 3s
/ checking (push) Successful in 13s
/ build-site (push) Successful in 1m7s
/ create-release (push) Successful in 9s
/ auto-deploy-dockge (push) Successful in 23s
2024-07-22 12:46:57 +02:00
a9568375c1
Unpinned Dockge 2024-07-20 18:02:44 +02:00
de68104603
Re-integrate Dockge into preview workflow
All checks were successful
/ get-version (push) Successful in 3s
/ astro-check (push) Successful in 28s
2024-07-20 18:02:22 +02:00
245cac7d87
Dockge Test 3
All checks were successful
/ get-version (push) Successful in 3s
/ astro-check (push) Successful in 13s
/ auto-deploy-dockge (push) Successful in 8s
2024-07-20 18:00:28 +02:00
60330800f9
Dockge Test 2
Some checks failed
/ auto-deploy-dockge (push) Failing after 9s
/ get-version (push) Successful in 2s
/ astro-check (push) Successful in 12s
2024-07-20 17:56:13 +02:00
7a425c4fda
Dockge Test
Some checks failed
/ auto-deploy-dockge (push) Failing after 10s
/ astro-check (push) Successful in 12s
/ get-version (push) Successful in 2s
2024-07-20 17:54:14 +02:00
186b797bb6
Removed Dockge again, switched to alpine images
All checks were successful
/ get-version (push) Successful in 3s
/ astro-check (push) Successful in 13s
/ check-tag (push) Successful in 2s
/ checking (push) Successful in 13s
/ build-site (push) Successful in 1m4s
/ create-release (push) Successful in 6s
2024-07-20 17:02:30 +02:00
bc5f43802f
Testing Dockge CLI in CI 2
Some checks failed
/ get-version (push) Successful in 3s
/ astro-check (push) Successful in 13s
/ checking (push) Successful in 12s
/ create-release (push) Successful in 6s
/ check-tag (push) Successful in 3s
/ build-site (push) Successful in 1m51s
/ auto-deploy-dockge (push) Failing after 8s
2024-07-20 16:56:29 +02:00
be1416a74a
Testing Dockge CLI in CI
Some checks failed
/ get-version (push) Successful in 2s
/ astro-check (push) Successful in 12s
/ checking (push) Successful in 11s
/ check-tag (push) Successful in 2s
/ create-release (push) Successful in 6s
/ build-site (push) Successful in 2m58s
/ auto-deploy-dockge (push) Failing after 0s
2024-07-20 16:47:33 +02:00
1cee0efcad
Bumped version
All checks were successful
/ astro-check (push) Successful in 12s
/ get-version (push) Successful in 2s
/ create-release (push) Successful in 6s
/ check-tag (push) Successful in 2s
/ checking (push) Successful in 12s
/ build-site (push) Successful in 1m31s
2024-07-20 16:35:09 +02:00
45fd654ef1
Fixed weird hovering issues
Some checks failed
/ get-version (push) Successful in 2s
/ astro-check (push) Successful in 13s
/ checking (push) Has been skipped
/ build-site (push) Has been skipped
/ create-release (push) Has been skipped
/ check-tag (push) Failing after 3s
2024-07-20 16:34:21 +02:00
e4b0b87e9f
Fixed issue with version in CI
All checks were successful
/ get-version (push) Successful in 3s
/ astro-check (push) Successful in 12s
2024-07-20 15:59:15 +02:00
cc55ec3a87
Removed unnecessary files
All checks were successful
/ astro-check (push) Successful in 12s
2024-07-20 12:07:33 +02:00
08ae371dbf
Lint fix
All checks were successful
/ astro-check (push) Successful in 15s
2024-07-19 22:54:13 +02:00
a73afacf6c
Major redesign and rewrite
All checks were successful
/ astro-check (push) Successful in 13s
/ checking (push) Successful in 12s
/ check-tag (push) Successful in 2s
/ build-site (push) Successful in 2m6s
/ create-release (push) Successful in 7s
2024-07-19 22:52:35 +02:00
0dca43eb19
Major redesign and rewrite 2024-07-19 22:52:15 +02:00
9cb6ff6ed7
Fixed accessibility issues
All checks were successful
/ checking (push) Successful in 15s
/ build-site (push) Successful in 1m25s
/ publish (push) Successful in 6s
/ unlighthouse (push) Successful in 22s
/ deploy-unlighthouse-files (push) Successful in 6s
/ deploy-unlighthouse-site (push) Successful in 6s
2024-06-20 19:52:34 +02:00
700aa1d223
Bumped unlighthouse docker
All checks were successful
/ checking (push) Successful in 49s
/ unlighthouse (push) Successful in 44s
/ deploy-unlighthouse-files (push) Successful in 6s
/ deploy-unlighthouse-site (push) Successful in 4s
2024-06-20 19:36:16 +02:00
d06655296b
Updated README
Some checks failed
/ publish (push) Successful in 6s
/ build-site (push) Successful in 1m27s
/ checking (push) Successful in 24s
/ deploy-unlighthouse-files (push) Has been skipped
/ unlighthouse (push) Failing after 23s
/ deploy-unlighthouse-site (push) Has been skipped
2024-06-20 19:18:51 +02:00
beae91e5fd
Bumped version
Some checks failed
/ publish (push) Has been skipped
/ build-site (push) Failing after 9s
/ checking (push) Successful in 11s
/ deploy-unlighthouse-files (push) Has been cancelled
/ deploy-unlighthouse-site (push) Has been cancelled
/ unlighthouse (push) Has been cancelled
2024-06-20 18:58:55 +02:00
394e575ca6
Pinned docker images
All checks were successful
/ checking (push) Successful in 16s
2024-06-20 18:58:29 +02:00
1aa9753d8b
Fixed typo
All checks were successful
/ checking (push) Successful in 12s
/ publish (push) Successful in 6s
/ build-site (push) Successful in 1m32s
/ deploy-unlighthouse-files (push) Successful in 6s
/ unlighthouse (push) Successful in 31s
/ deploy-unlighthouse-site (push) Successful in 4s
2024-06-15 19:39:08 +02:00
c4d73c2f98
Fixed typo
All checks were successful
/ build-site (push) Successful in 1m45s
/ publish (push) Successful in 6s
/ checking (push) Successful in 12s
2024-06-15 19:30:25 +02:00
2decf6604b
Updated pipeline syntax to server
All checks were successful
/ checking (push) Successful in 14s
2024-06-15 19:27:54 +02:00
50 changed files with 3732 additions and 4996 deletions

View file

@ -1,17 +1,33 @@
on: on:
push: push:
tags: tags:
- '[0-9]+\.[0-9]+\.[0-9]+pre[0-9]+' - '[0-9]+\.[0-9]+\.[0-9]+-pre\.[0-9]+'
jobs: jobs:
checking: check-tag:
runs-on: docker runs-on: docker
container: node:lts steps:
- name: Checking Out Repository Code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Check if Version in package.json matches Tag
run: |
VERSION=$(npm pkg get version --workspaces=false | tr -d \")
if test $VERSION != "${{ github.ref_name }}"; then
echo "Expected Version is: '${{ github.ref_name }}' actual Version is: '$VERSION'";
exit 1
else
echo "Version is: '$VERSION'";
fi
checking:
needs: [ check-tag ]
runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/node-alpine-git:latest
steps: steps:
- name: Checkout source code - name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3 uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages - name: Install packages
run: npm install run: npm i
- name: Run astro check (linting + static analysis) - name: Run astro check (linting + static analysis)
run: npm run astro check run: npm run astro check
@ -22,19 +38,19 @@ jobs:
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub - name: Log into Docker Package Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: forgejo.neshweb.net registry: forgejo.neshweb.net
username: ${{ secrets.FORGEJO_USERNAME }} username: ${{ secrets.FORGEJO_USERNAME }}
password: ${{ secrets.FORGEJO_TOKEN }} password: ${{ secrets.FORGEJO_TOKEN }}
- name: Push to Package Registry - name: Build and push to Docker Package Registry
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
with: with:
push: true push: true
tags: forgejo.neshweb.net/firq/firq-dev-website:${{ github.ref_name }}, forgejo.neshweb.net/firq/firq-dev-website:preview tags: forgejo.neshweb.net/firq/firq-dev-website:${{ github.ref_name }}, forgejo.neshweb.net/firq/firq-dev-website:preview
publish: create-release:
needs: [ build-site ] needs: [ build-site ]
if: success() if: success()
runs-on: docker runs-on: docker
@ -49,22 +65,18 @@ jobs:
tag: ${{ github.ref_name }} tag: ${{ github.ref_name }}
prerelease: true prerelease: true
# doesn't work atm auto-deploy-dockge:
# unlighthouse: needs: [ build-site ]
# needs: [publish] if: success()
# if: success() runs-on: docker
# runs-on: docker container: forgejo.neshweb.net/firq/dockge-cli:0.1.1-c.2
# container: registry.gitlab.com/gitlab-ci-utils/lighthouse:latest steps:
# services: - name: Configure Dockge CLI
# website: run: |
# image: forgejo.neshweb.net/firq/firq-dev-website:preview dockge host '${{ vars.DOCKGE_HOST }}'
# steps: dockge login --user '${{ secrets.DOCKGE_USER }}' --password '${{ secrets.DOCKGE_CREDENTIAL }}'
# - name: Install Dependencies - name: Check status and redeploy
# run: npm install @unlighthouse/cli puppeteer run: |
# - name: Run unlighthouse dockge status firq-dev-preview
# run: node_modules/.bin/unlighthouse-ci dockge update firq-dev-preview
# - name: Upload reports dockge status firq-dev-preview
# uses: actions/upload-artifact@v3
# with:
# name: unlighthouse-reports
# path: unlighthouse-reports/

View file

@ -4,14 +4,30 @@ on:
- '[0-9]+\.[0-9]+\.[0-9]+' - '[0-9]+\.[0-9]+\.[0-9]+'
jobs: jobs:
checking: check-tag:
runs-on: docker runs-on: docker
container: node:lts steps:
- name: Checking Out Repository Code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Check if Version in package.json matches Tag
run: |
VERSION=$(npm pkg get version --workspaces=false | tr -d \")
if test $VERSION != "${{ github.ref_name }}"; then
echo "Expected Version is: '${{ github.ref_name }}' actual Version is: '$VERSION'";
exit 1
else
echo "Version is: '$VERSION'";
fi
checking:
needs: [ check-tag ]
runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/node-alpine-git:latest
steps: steps:
- name: Checkout source code - name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3 uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages - name: Install packages
run: npm install run: npm i
- name: Run astro check (linting + static analysis) - name: Run astro check (linting + static analysis)
run: npm run astro check run: npm run astro check
@ -22,19 +38,19 @@ jobs:
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub - name: Log into Docker Package Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: forgejo.neshweb.net registry: forgejo.neshweb.net
username: ${{ secrets.FORGEJO_USERNAME }} username: ${{ secrets.FORGEJO_USERNAME }}
password: ${{ secrets.FORGEJO_TOKEN }} password: ${{ secrets.FORGEJO_TOKEN }}
- name: Push to Package Registry - name: Build and push to Docker Package Registry
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
with: with:
push: true push: true
tags: forgejo.neshweb.net/firq/firq-dev-website:${{ github.ref_name }}, forgejo.neshweb.net/firq/firq-dev-website:latest tags: forgejo.neshweb.net/firq/firq-dev-website:${{ github.ref_name }}, forgejo.neshweb.net/firq/firq-dev-website:latest
release: create-release:
needs: [ build-site ] needs: [ build-site ]
if: success() if: success()
runs-on: docker runs-on: docker

View file

@ -1,16 +1,25 @@
on: on:
push: push:
branches: branches:
- "**" - '**'
jobs: jobs:
checking: get-version:
runs-on: docker runs-on: docker
container: node:lts steps:
- name: Checking Out Repository Code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Check if Version in package.json matches Tag
run: |
VERSION=$(npm pkg get version --workspaces=false | tr -d \")
echo "Version is: '$VERSION'";
astro-check:
runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/node-alpine-git:latest
steps: steps:
- name: Checkout source code - name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3 uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages - name: Install packages
run: npm install run: npm i
- name: Run astro check (linting + static analysis) - name: Run astro check (linting + static analysis)
run: npm run astro check run: npm run astro check

View file

@ -1,18 +1,17 @@
on: on:
push: push:
tags: tags:
- '[0-9]+\.[0-9]+\.[0-9]+unlighthouse[0-9]+' - '[0-9]+\.[0-9]+\.[0-9]+-ulh\.[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+ulh[0-9]+'
jobs: jobs:
unlighthouse: unlighthouse:
runs-on: docker runs-on: docker
container: forgejo.neshweb.net/ci-docker-images/unlighthouse:latest container: forgejo.neshweb.net/ci-docker-images/unlighthouse:0.2.1
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: https://code.forgejo.org/actions/checkout@v3 uses: https://code.forgejo.org/actions/checkout@v3
- name: Run unlighthouse - name: Run unlighthouse
run: unlighthouse-ci --site "https://preview.firq.dev/" run: unlighthouse-ci --site "https://preview.firq.dev/" --disable-dynamic-sampling
- name: Prepare artifacts - name: Prepare artifacts
run: cp serve.json unlighthouse-reports run: cp serve.json unlighthouse-reports
- name: Upload reports - name: Upload reports

6
.gitignore vendored
View file

@ -4,6 +4,12 @@ dist/
public/ public/
maintenance/ maintenance/
# astro stuff
.astro/
# config stuff
.vscode/
# Temp Scripts # Temp Scripts
scripts/ scripts/

View file

@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
.vscode/launch.json vendored
View file

@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

12
.vscode/settings.json vendored
View file

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

View file

@ -1,16 +1,15 @@
FROM node:lts AS build FROM node:22-alpine AS build
WORKDIR /app WORKDIR /app
COPY . . COPY . .
RUN npm i RUN npm i
RUN npm run astro telemetry disable
RUN npm run build RUN npm run build
FROM forgejo.neshweb.net/ci-docker-images/website-serve:latest AS runtime FROM forgejo.neshweb.net/ci-docker-images/website-serve:2 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
RUN rm -r /public/data/ RUN rm -r /public/data/
ENV PORT 8081
EXPOSE 8081 EXPOSE 8081
CMD serve public/ -p 8081
CMD [ "serve", "public/", "-p", "8081" ]

View file

@ -2,43 +2,6 @@
This is build using [Astro](https://astro.build) This is build using [Astro](https://astro.build)
## 🚀 Project Structure
```
/
├── static/
│ ├── favicon.svg
│ └── other files ...
├── src/
│ ├── components/
│ │ ├── servantCard.astro
│ │ ├── ceCard.astro
│ │ ├── contactCard.astro
│ │ └── taCard.astro
│ │
│ ├── layouts/
│ │ ├── customFooter.astro
│ │ ├── baseSection.astro
│ │ ├── taSection.astro
│ │ ├── contactSection.astro
│ │ └── Layout.astro
│ │
│ └── pages/
│ └── index.astro
├── .gitlab-ci.yml
├── astro.config.mjs
└── package.json
```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
More routes will follow soon
Any static assets, like images, can be placed in the `static/` directory.
## 🧞 Astro-Specific Commands ## 🧞 Astro-Specific Commands
All commands are run from the root of the project, from a terminal: All commands are run from the root of the project, from a terminal:
@ -51,4 +14,3 @@ All commands are run from the root of the project, from a terminal:
| `npm run preview` | Preview your build locally, before deploying | | `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro preview` | | `npm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
| `npm run astro --help` | Get help using the Astro CLI | | `npm run astro --help` | Get help using the Astro CLI |

7718
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.27", "version": "0.2.0-pre.8",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
@ -11,15 +11,17 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@astro-community/astro-embed-youtube": "^0.4.3", "@astro-community/astro-embed-youtube": "^0.5.2",
"@astrojs/check": "^0.3.3", "@astrojs/check": "^0.8.1",
"@astrojs/mdx": "^2.0.3", "@astrojs/mdx": "^3.1.3",
"@astrojs/sitemap": "^3.0.3", "@astrojs/sitemap": "^3.1.6",
"astro": "^4.2.1", "@fontsource/work-sans": "^5.0.18",
"autoprefixer": "^10.4.16", "astro": "^4.11.5",
"iconoir": "^7.2.0", "astro-meta-tags": "^0.3.0",
"postcss-preset-env": "^9.3.0", "autoprefixer": "^10.4.19",
"typescript": "^5.3.3" "iconoir": "^7.7.0",
"postcss-preset-env": "^9.6.0",
"typescript": "^5.5.3"
}, },
"browserslist": [ "browserslist": [
"last 2 versions", "last 2 versions",

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View file

@ -1,8 +1,9 @@
--- ---
export interface Props { export interface Props {
url: string | undefined url: string
slug: string
title: string title: string
pubdate: string pubdate: Date
description: string description: string
author: string author: string
} }
@ -12,11 +13,11 @@ const options_date: Intl.DateTimeFormatOptions = {
month: 'long', month: 'long',
day: '2-digit', day: '2-digit',
} }
const { author, description, pubdate, url, title } = Astro.props const { author, description, pubdate, url, title, slug } = Astro.props
const date = new Date(pubdate).toLocaleDateString('en-GB', options_date) const date = new Date(pubdate).toLocaleDateString('en-GB', options_date)
--- ---
<a href={url} rel="noopener noreferrer"> <a href={`${url}/${slug}`} rel="noopener noreferrer">
<div class="circle"></div> <div class="circle"></div>
<article> <article>
<h2>{title}</h2> <h2>{title}</h2>
@ -29,38 +30,14 @@ const date = new Date(pubdate).toLocaleDateString('en-GB', options_date)
.circle { .circle {
display: none; display: none;
} }
@media (min-width: 900px) {
.circle {
margin: 1rem 1rem 1rem 0rem;
position: relative;
display: flex;
visibility: visible;
height: 1.5rem;
width: 1.5rem;
border-radius: 40%;
background-color: var(--c-darkpurple);
transition: transform var(--speed) var(--ease);
}
a:hover > .circle {
height: 1.75rem;
width: 1.75rem;
translate: -0.125rem;
margin-right: 0.825rem;
}
article {
margin-left: 0.5rem;
}
}
a { a {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
display: flex; display: flex;
text-decoration: none; text-decoration: none;
height: auto; height: fit-content;
margin: 0.5rem; margin: 0px 0.5rem;
width: 100%; width: 100%;
} }
p { p {
@ -88,8 +65,8 @@ const date = new Date(pubdate).toLocaleDateString('en-GB', options_date)
flex: 1; flex: 1;
flex-wrap: wrap; flex-wrap: wrap;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: center;
align-content: flex-start; align-content: center;
justify-content: center; justify-content: center;
background-color: var(--c-darkergray); background-color: var(--c-darkergray);
padding: 10px; padding: 10px;
@ -98,7 +75,47 @@ const date = new Date(pubdate).toLocaleDateString('en-GB', options_date)
min-height: 100%; min-height: 100%;
border-radius: 1.25rem; border-radius: 1.25rem;
} }
a:hover > article { a:hover > article {
transform: scaleY(102.5%) scaleX(101%); transform: scaleY(102.5%) scaleX(101%);
transition: transform var(--speed) var(--ease);
}
@media (min-width: 900px) {
.circle {
margin: 1rem 0.5rem 1rem 0.5rem;
position: relative;
display: flex;
visibility: visible;
height: 1rem;
width: 1rem;
background-color: var(--c-darkpurple);
border-style: solid;
border-width: 0.25rem;
border-color: var(--c-lightgray);
border-radius: 40%;
transition: transform var(--speed) var(--ease);
}
a:hover > .circle {
height: 1.25rem;
width: 1.25rem;
translate: -0.125rem;
margin-right: 4px;
}
a:hover article {
border-color: var(--c-darkpurple);
transform: none;
}
article {
border-style: solid;
border-width: 2px;
border-color: var(--c-darkergray);
align-items: flex-start;
align-content: flex-start;
margin-left: 0.5rem;
}
} }
</style> </style>

View file

@ -1,8 +1,8 @@
--- ---
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 type { GlobImage } from '../../types/generic'
import { plsLoadImage } from '../utils/tools' import { plsLoadImage } from '../../utils/tools'
export interface Props { export interface Props {
name: string name: string

View file

@ -1,7 +1,7 @@
--- ---
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic' import type { GlobImage } from '../../types/generic'
import { plsLoadImage } from '../utils/tools' import { plsLoadImage } from '../../utils/tools'
export interface Props { export interface Props {
site: string site: string
@ -25,7 +25,7 @@ const loadedLogoImage = plsLoadImage(images_logos, imagePath)
aria-label=`${site} - new window` aria-label=`${site} - new window`
> >
<article class="contact do-hover"> <article class="contact do-hover">
<Image src={loadedLogoImage} alt={logoAltText} /> <Image src={loadedLogoImage} alt={logoAltText} loading={'eager'}/>
<div> <div>
<h2>{site}</h2> <h2>{site}</h2>
</div> </div>
@ -63,6 +63,7 @@ const loadedLogoImage = plsLoadImage(images_logos, imagePath)
article:hover div { article:hover div {
border-radius: 1.25rem; border-radius: 1.25rem;
padding: 0 0.5rem; padding: 0 0.5rem;
margin: unset;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -71,6 +72,9 @@ const loadedLogoImage = plsLoadImage(images_logos, imagePath)
height: calc(var(--size-value)); height: calc(var(--size-value));
width: calc(var(--size-value) - 1rem); width: calc(var(--size-value) - 1rem);
opacity: 90%; opacity: 90%;
border-style: solid;
border-width: 10px;
border-color: var(--c-darkgray);
z-index: 100; z-index: 100;
position: absolute; position: absolute;
} }

View file

@ -1,7 +1,7 @@
--- ---
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic' import type { GlobImage } from '../../types/generic'
import { plsLoadImage } from '../utils/tools' import { plsLoadImage } from '../../utils/tools'
export interface Props { export interface Props {
name: string name: string
@ -25,7 +25,7 @@ const loadedImage = plsLoadImage(images, imagePath)
aria-label=`${name} - new window` aria-label=`${name} - new window`
> >
<div class="heading">{name}</div> <div class="heading">{name}</div>
<Image src={loadedImage} alt={name} /> <Image src={loadedImage} alt={name} loading={'eager'}/>
<h2 class="subtext"> <h2 class="subtext">
{origin} {origin}
</h2> </h2>

View file

@ -1,7 +1,7 @@
--- ---
import { Image } from 'astro:assets'; import { Image } from 'astro:assets';
import type { GlobImage } from '../types/generic' import type { GlobImage } from '../../types/generic'
import { plsLoadImage } from '../utils/tools' import { plsLoadImage } from '../../utils/tools'
export interface Props { export interface Props {
name: string name: string

View file

@ -1,7 +1,7 @@
--- ---
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic' import type { GlobImage } from '../../types/generic'
import { plsLoadImage } from '../utils/tools' import { plsLoadImage } from '../../utils/tools'
export interface Props { export interface Props {
date: string date: string

View file

@ -1,7 +1,7 @@
--- ---
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic' import type { GlobImage } from '../../types/generic'
import { plsLoadImage } from '../utils/tools' import { plsLoadImage } from '../../utils/tools'
export interface Props { export interface Props {
title: string title: string
@ -20,7 +20,7 @@ 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={loadedImage} alt={logoAltText} loading={'eager'}/>
<div> <div>
<h2>{title}</h2> <h2>{title}</h2>
</div> </div>
@ -70,6 +70,9 @@ const loadedImage = plsLoadImage(images_logos, imagePath)
opacity: 90%; opacity: 90%;
z-index: 100; z-index: 100;
position: absolute; position: absolute;
border-style: solid;
border-width: 10px;
border-color: var(--c-darkgray);
} }
article:hover h2 { article:hover h2 {

View file

@ -1,4 +1,9 @@
--- ---
export interface Props {
fadeout?: boolean
}
const { fadeout } = Astro.props
const display = fadeout ? "": "display: none"
--- ---
<div> <div>
@ -6,22 +11,33 @@
I am currently working on a site to catalogue past and future TAs.<br/> 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> Check it out at <a href="https://fgo-ta.com">fgo-ta.com</a>
</span> </span>
<div class="fade" style={display}></div>
</div> </div>
<style> <style>
div { div {
display: flex; display: flex;
width: 100%; width: 100%;
height: 5em; flex-wrap: nowrap;
background-color: var(--c-gray); flex-flow: column;
background-color: var(--c-darkergray);
text-align: center; text-align: center;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
color: white; color: white;
font-size: 1.5em; font-size: 1.5em;
padding: 2rem 0rem 0rem 0rem;
} }
a { a {
color: var(--c-darkpurple); text-align: center;
text-decoration: none; text-decoration: none;
color: var(--c-darkpurple);
}
.fade {
margin-top: 3rem;
background: linear-gradient(to bottom, transparent, var(--c-lightgray));
height: 2.5rem;
width: 100%;
} }
</style> </style>

View file

@ -1,19 +1,25 @@
--- ---
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' import hamburger from 'iconoir/icons/menu.svg'
const hamburger_src_url = `url("${hamburger.src}")`; const hamburger_src_url = `url("${hamburger.src}")`
--- ---
<header> <header>
<a href="/" rel="noopener noreferrer" aria-label="Home" role="navigation"> <a href="/" rel="noopener noreferrer" aria-label="Home" role="button">
<Image src={logo} alt="Firq Website Logo"/> <Image src={logo} alt="" loading="eager"/>
<span class="visually-hidden">Firq Website Logo</span> <span class="visually-hidden">Logo</span>
</a> </a>
<ul class="desktop"> <ul class="desktop">
<slot name="desktop" /> <slot name="desktop" />
</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()"
role="button"
>
<ul> <ul>
<slot name="mobile" /> <slot name="mobile" />
</ul> </ul>
@ -27,12 +33,13 @@ const hamburger_src_url = `url("${hamburger.src}")`;
z-index: 1000; z-index: 1000;
position: sticky; position: sticky;
top: 0px; top: 0px;
background-color: var(--c-darkgray); background-color: var(--c-darkergray);
display: flex; display: flex;
height: auto; height: auto;
width: 100%; width: 100%;
align-items: flex-start; align-items: flex-start;
line-height: 1.5em; line-height: 1.5em;
border-bottom: 2px solid var(--c-darkpurple) ;
} }
header > a { header > a {
margin-left: 16px; margin-left: 16px;
@ -61,7 +68,7 @@ const hamburger_src_url = `url("${hamburger.src}")`;
line-height: 1.5em; line-height: 1.5em;
} }
.mobile > ul { .mobile > ul {
background-color: var(--c-darkgray); background-color: var(--c-darkergray);
align-items: center; align-items: center;
flex-wrap: wrap; flex-wrap: wrap;
flex-direction: column; flex-direction: column;
@ -78,7 +85,7 @@ const hamburger_src_url = `url("${hamburger.src}")`;
.mobile { .mobile {
display: flex; display: flex;
background-color: var(--c-darkgray); background-color: var(--c-darkergray);
border: 0px; border: 0px;
width: 100%; width: 100%;
height: 64px; height: 64px;
@ -108,13 +115,14 @@ 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;
mask-size: cover;
background-color: white; background-color: white;
width: 2rem; width: 2.25rem;
height: 2rem; height: 2.25rem;
position: static; position: static;
align-self: flex-start; align-self: flex-start;
margin-right: 1rem; margin-right: 1rem;
margin-top: 1rem; margin-top: 0.825rem;
} }
@media (min-width: 1140px) { @media (min-width: 1140px) {

View file

@ -1,7 +1,7 @@
--- ---
export interface Props { export interface Props {
currentPage?: string currentPage?: string
navtype: "mobile" | "desktop" navtype: 'mobile' | 'desktop'
link: string link: string
text: string text: string
icon: ImageMetadata icon: ImageMetadata
@ -18,10 +18,10 @@ if (currentPage === slug) {
currPage = 'current' currPage = 'current'
} }
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"} : {} let extraattributes = navtype === 'mobile' ? { tabindex: '0' } : {}
--- ---
<li> <li>
@ -30,7 +30,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="button"
{...extraattributes} {...extraattributes}
> >
<div class="icon"></div> <div class="icon"></div>
@ -60,11 +60,11 @@ let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
} }
li > a:hover { li > a:hover {
color: var(--c-purplepink); color: var(--c-purplepink) !important;
} }
li > a:hover > .icon { li > a:hover > .icon {
background-color: var(--c-purplepink); background-color: var(--c-purplepink) !important;
} }
.current { .current {

View file

@ -0,0 +1,109 @@
---
import '@fontsource/work-sans/800.css'
import '@fontsource/work-sans/600.css'
export interface Props {
maintext: string
subtext: string
fadeout?: boolean
baseurl?: string
returnbutton?: boolean
}
const { maintext, subtext, fadeout, baseurl, returnbutton } = Astro.props
const displayFadeout = fadeout ? "": "display: none"
const displayBackButton = returnbutton ? "": "display: none"
---
<div class="wrap">
<div class="head">{maintext}</div>
<div class="sub">{subtext}</div>
<a href=`/${baseurl}` style={displayBackButton}>&lt;&lt; Back to {baseurl}</a>
<div class="fade" style={displayFadeout}></div>
</div>
<style>
a {
font-weight: 600;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif;
color: white;
margin: 1rem 0px 0px;
padding: 0.5rem 0.75rem;
text-decoration: none;
background-color: var(--c-lightgray);
border-radius: 10px;
border-style: solid;
border-width: 2px;
border-color: var(--c-lightgray);
text-transform: capitalize;
}
a:hover {
border-color: var(--c-darkpurple);
}
.wrap {
position: relative;
width: 100%;
display: flex;
text-align: center;
align-items: center;
flex-wrap: wrap;
flex-direction: column;
color: var(--c-lighter);
background-color: var(--c-darkergray);
}
.fade {
margin-top: 2rem;
background: linear-gradient(to bottom, transparent, var(--c-lightgray));
height: 2.5rem;
width: 100%;
}
.head {
hyphens: auto;
padding-top: 2rem;
font-size: 2rem;
font-weight: 800;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial,
sans-serif;
}
.sub {
font-size: 0.75rem;
font-weight: 600;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial,
sans-serif;
margin-top: 0.5em;
}
.head {
color: var(--c-darkpurple);
}
@supports (background-clip: text) {
.head {
background: linear-gradient(125deg, var(--c-darkpurple), var(--c-purplepink), var(--c-reddish) );
background-clip: text;
color: transparent;
}
}
@media (min-width: 620px) {
.head {
hyphens: none;
font-size: 3rem;
}
.sub {
font-size: 0.75rem;
}
}
@media (min-width: 1000px) {
.head {
font-size: 4rem;
}
.sub {
font-size: 1rem;
}
}
</style>

View file

@ -0,0 +1,75 @@
---
import '@fontsource/work-sans/800.css'
---
<div class="wrap">
<div class="head">Hi, I'm <span class="fancy">Firq</span></div>
<div class="sub">Nice to meet you</div>
<div class="fade"></div>
</div>
<style>
.wrap {
position: relative;
width: 100%;
display: flex;
text-align: center;
align-items: center;
flex-wrap: wrap;
flex-direction: column;
color: var(--c-lighter);
background-color: var(--c-darkergray);
}
.fade {
margin-top: 1.5rem;
background: linear-gradient(to bottom, transparent, var(--c-lightgray));
height: 2.5rem;
width: 100%;
}
.head {
padding-top: 2rem;
font-size: 3rem;
font-weight: 800;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial,
sans-serif;
}
.sub {
font-size: 1rem;
font-weight: 800;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial,
sans-serif;
}
.fancy {
color: var(--c-darkpurple);
}
@supports (background-clip: text) {
.fancy {
background: linear-gradient(125deg, var(--c-darkpurple), var(--c-purplepink), var(--c-reddish) );
background-clip: text;
color: transparent;
}
}
@media (min-width: 620px) {
.head {
font-size: 4rem;
}
.sub {
font-size: 1.25rem;
}
}
@media (min-width: 1000px) {
.head {
font-size: 6rem;
}
.sub {
font-size: 1.5rem;
}
}
</style>

View file

@ -89,7 +89,7 @@ The container is also published to the docker registry that the Forgejo instance
Since my website is now using a docker container instead of the previous `rsync` + `screen` approach, a new deployment solution was needed. Since my website is now using a docker container instead of the previous `rsync` + `screen` approach, a new deployment solution was needed.
In the end, Neshura proposed to use <a href="https://github.com/louislam/dockge" target="_blank" rel="noopener noreferrer" style="font-style: unset">Dockge</a>, a new, simple container management tool build by the developer of the beloved uptime-kuma. With that set up, getting the website only was really really easy: In the end, Neshura proposed to use <a href="https://github.com/louislam/dockge" target="_blank" rel="noopener noreferrer" >Dockge</a>, a new, simple container management tool build by the developer of the beloved uptime-kuma. With that set up, getting the website only was really really easy:
1. Create a new stack 1. Create a new stack
2. Add a container entry 2. Add a container entry
@ -161,4 +161,4 @@ In the end, I must say migrating was a lot more painless than expected. Sure, Fo
I also updated my about page to now reflect the migration, as the old technologies weren't up-to-date anymore. I also updated my about page to now reflect the migration, as the old technologies weren't up-to-date anymore.
If you want to check out the repository by yourself, feel free to do so. <a href="https://forgejo.neshweb.net/Firq/firq-dev-website" target="_blank" rel="noopener noreferrer" style="font-style: unset">It is available on Neshuras Forgejo instance</a> If you want to check out the repository by yourself, feel free to do so. <a href="https://forgejo.neshweb.net/Firq/firq-dev-website" target="_blank" rel="noopener noreferrer" >It is available on Neshuras Forgejo instance</a>

View file

@ -18,10 +18,10 @@ it doesn't interact with the hitrate, but if you have proof that this is differe
Instant Kill & Instant Death: One of the most rejected systems to exist in FGO. Most players know of it, but discard it because of its unreliability and uselessness against stronger enemies. In this article, I want to dive a bit into the workings of Instant Kill and help you understand how you can, in specific scenarios, use it to your advantage. Instant Kill & Instant Death: One of the most rejected systems to exist in FGO. Most players know of it, but discard it because of its unreliability and uselessness against stronger enemies. In this article, I want to dive a bit into the workings of Instant Kill and help you understand how you can, in specific scenarios, use it to your advantage.
There are a multitude of servants that have access to instant-kill, but I will only highlight a few here (You can view the full list on <a href="https://gamepress.gg/grandorder/instant-death" target="_blank" rel="noopener noreferrer" style="font-style: unset">Gamepress</a>) There are a multitude of servants that have access to instant-kill, but I will only highlight a few here (You can view the full list on <a href="https://gamepress.gg/grandorder/instant-death" target="_blank" rel="noopener noreferrer" >Gamepress</a>)
- **Nitocris (Caster)**: The most prominent figure, as she has easy access to her instant-killing NP and a skill that increases her death hit rate - **Nitocris (Caster)**: The most prominent figure, as she has easy access to her instant-killing NP and a skill that increases her death hit rate
- **Void Shiki (Saber)**: Another Example of an AOE Instant-Kill servant who also has access to Death Resist debuffs. One quest in her release event even specifically used the Instant Kill mechanic (<a href="https://apps.atlasacademy.io/db/NA/quest/94021308/1" target="_blank" rel="noopener noreferrer" style="font-style: unset">Quest Link here</a>) - **Void Shiki (Saber)**: Another Example of an AOE Instant-Kill servant who also has access to Death Resist debuffs. One quest in her release event even specifically used the Instant Kill mechanic (<a href="https://apps.atlasacademy.io/db/NA/quest/94021308/1" target="_blank" rel="noopener noreferrer" >Quest Link here</a>)
- **King Hassan (Assassin)**: The only servant that can afflict enemies with instant death on normal attacks (Note: David can do this as well, but only if he has his Bond CE equipped) - **King Hassan (Assassin)**: The only servant that can afflict enemies with instant death on normal attacks (Note: David can do this as well, but only if he has his Bond CE equipped)
But since Instant Kill is based on probability, most players are relucatant to use it in their farming compositions. This thems from the different death rates enemies have: But since Instant Kill is based on probability, most players are relucatant to use it in their farming compositions. This thems from the different death rates enemies have:
@ -53,10 +53,10 @@ The parameters here are the following:
## Example ## Example
The main reason this came up was because of a farming comp used in <a href="https://apps.atlasacademy.io/db/NA/quest/94061820/1" target="_blank" rel="noopener noreferrer" style="font-style: unset">Hunting Quest XI - Day 5 - Pride+</a>. The node is structured The main reason this came up was because of a farming comp used in <a href="https://apps.atlasacademy.io/db/NA/quest/94061820/1" target="_blank" rel="noopener noreferrer" >Hunting Quest XI - Day 5 - Pride+</a>. The node is structured
into a 2 - 1 - 1 Layout, meaning using a dual-DPS setup would be the way to go. into a 2 - 1 - 1 Layout, meaning using a dual-DPS setup would be the way to go.
Looking at the stats for the first wave, it made sense to use Nitocris: Both Ghouls have a 100% Death Rate <a href="https://apps.atlasacademy.io/db/NA/enemy/9940700" target="_blank" rel="noopener noreferrer" style="font-style: unset">according to Atlas Academy</a>. Looking at the stats for the first wave, it made sense to use Nitocris: Both Ghouls have a 100% Death Rate <a href="https://apps.atlasacademy.io/db/NA/enemy/9940700" target="_blank" rel="noopener noreferrer" >according to Atlas Academy</a>.
I went with using Nitocris, since she has a 100% NP charge and a skill that increases her Instant Death rate by 100%. Not needing any additional charge meant that no other buffs or AOE charges needed to be used on turn 1. I went with using Nitocris, since she has a 100% NP charge and a skill that increases her Instant Death rate by 100%. Not needing any additional charge meant that no other buffs or AOE charges needed to be used on turn 1.

16
src/content/config.ts Normal file
View file

@ -0,0 +1,16 @@
import { z, defineCollection } from 'astro:content'
const blogCollection = defineCollection({
type: 'content', // v2.5.0 and later
schema: z.object({
title: z.string(),
tags: z.array(z.string()),
pubDate: z.date(),
description: z.string(),
author: z.string(),
}),
})
export const collections = {
blog: blogCollection,
}

1
src/env.d.ts vendored
View file

@ -1 +1,2 @@
/// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" /> /// <reference types="astro/client" />

View file

@ -1,6 +1,6 @@
--- ---
import Navbar from '../components/navbar.astro' import Navbar from '../components/navbar/navbar.astro'
import NavbarEntry from '../components/navbarEntry.astro' import NavbarEntry from '../components/navbar/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'
@ -77,12 +77,22 @@ 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}
navtype="desktop"
{...item}
slot="desktop"
/>
)) ))
} }
{ {
mapped_navdata.map((item) => ( mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} navtype="mobile" {...item} slot="mobile"/> <NavbarEntry
currentPage={currentpage}
navtype="mobile"
{...item}
slot="mobile"
/>
)) ))
} }
</Navbar> </Navbar>
@ -98,10 +108,12 @@ const mapped_navdata = navdata.map((item) => ({
--c-darkgray: #1e1e1e; --c-darkgray: #1e1e1e;
--c-duskgray: #242424; --c-duskgray: #242424;
--c-gray: #2e2e2e; --c-gray: #2e2e2e;
--c-lighter: #eee;
--c-lightgray: #3e3e3e; --c-lightgray: #3e3e3e;
--c-darkpurple: #b86cff; --c-darkpurple: #b86cff;
--c-purplepink: #c105ff; --c-purplepink: #c105ff;
--c-darkergray: #1b1b1b; --c-darkergray: #1b1b1b;
--c-reddish: #ff0077;
} }
body { body {
background: var(--c-lightgray); background: var(--c-lightgray);

View file

@ -1,74 +0,0 @@
---
export interface Props {
title: string
}
const { title } = Astro.props
---
<section class="base">
<h1>{title}</h1>
<div>
<slot />
</div>
</section>
<style>
h1 {
font-size: 40px;
line-height: 48px;
letter-spacing: -1px;
color: white;
font-size: 2.25rem;
margin-top: 1rem;
margin-bottom: 0;
margin-left: auto;
margin-right: auto;
padding: 0.25rem 0.75rem;
max-width: max-content;
background-color: var(--c-darkgray);
padding: 0.25rem 1.5rem;
border-radius: 0.5rem;
padding-bottom: 0.5rem;
}
div {
row-gap: 1em;
column-gap: 1em;
justify-content: center;
align-self: center;
display: flex;
flex-flow: row wrap;
padding: 1em;
color: white;
font-size: 1em;
}
.base {
margin-left: 1rem;
margin-right: 1rem;
}
@media (min-width: 400px) {
.base {
margin-left: 3rem;
margin-right: 3rem;
}
}
@media (min-width: 1500px) {
.base {
margin-left: 10%;
margin-right: 10%;
}
}
@media (min-width: 512px) {
div {
justify-content: left;
}
}
@media (min-width: 520px) {
h1 {
margin: 0.5rem 0.75rem 0.5rem 0.75rem;
}
}
</style>

View file

@ -1,4 +1,5 @@
--- ---
import SmallTitle from '../components/titles/smallTitle.astro'
import Layout from './Layout.astro' import Layout from './Layout.astro'
const { frontmatter } = Astro.props const { frontmatter } = Astro.props
@ -13,15 +14,12 @@ const date = new Date(frontmatter.pubDate).toLocaleDateString(
'en-GB', 'en-GB',
options_date options_date
) )
const subtext = `Written by ${frontmatter.author} • Published on ${date}`
--- ---
<Layout title={title} currentpage="blog" descriptionOverride={description}> <Layout title={title} currentpage="blog" descriptionOverride={description}>
<a href="/blog"><i class="iconoir-fast-arrow-left"></i>Back to all posts</a> <SmallTitle maintext={frontmatter.title} subtext={subtext} fadeout={true} returnbutton={true} baseurl='blog'/>
<div> <div>
<h1>
{frontmatter.title}
</h1>
<p>by {frontmatter.author} • Published on {date}</p>
<article> <article>
<slot /> <slot />
</article> </article>

View file

@ -1,36 +1,59 @@
--- ---
export interface Props { export interface Props {
title: string title: string
titlehidden?: boolean
displayLine?: boolean
} }
const { title, titlehidden, displayLine } = Astro.props
const { title } = Astro.props const display = titlehidden ? "display: none" : ""
const line = displayLine ? "flex" : "none"
--- ---
<section> <section>
<h1>{title}</h1> <h1 style={display}>{title}</h1>
<div class="wrapper"> <div class="wrapper">
<div class="start hightlighter"></div>
<div class="line"></div> <div class="line"></div>
<slot /> <slot />
<div class="drop"></div> <div class="drop hightlighter"></div>
</div> </div>
</section> </section>
<style> <style define:vars={{ line }}>
.drop { section {
padding-left: 0.25em;
padding-right: 0.25em;
padding-bottom: 5rem;
}
.hightlighter {
left: 0;
right: 0;
display: flex; display: flex;
position: absolute; position: absolute;
visibility: visible; visibility: visible;
left: 0;
right: 0;
bottom: -5rem;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
height: 1.5rem; height: 1.5rem;
width: 1.5rem; width: 1.5rem;
}
.drop {
bottom: -5rem;
border-radius: 0% 50% 50% 50%; border-radius: 0% 50% 50% 50%;
transform: rotate(45deg); transform: rotate(45deg);
background-color: var(--c-darkpurple); background-color: var(--c-darkpurple);
} }
.start {
top: -2rem;
border-radius: 40%;
border-style: solid;
border-width: 0.25rem;
border-color: var(--c-lightgray);
background-color: var(--c-darkpurple);
}
.line { .line {
display: flex; display: flex;
position: absolute; position: absolute;
@ -46,30 +69,31 @@ const { title } = Astro.props
z-index: -1; z-index: -1;
} }
h1 { h1 {
font-size: 40px;
line-height: 48px; line-height: 48px;
letter-spacing: -1px; letter-spacing: -1px;
color: white; color: white;
font-size: 2.25rem; font-size: 1.6rem;
margin-top: 1rem; margin-top: 1rem;
margin-bottom: 0; margin-bottom: 0;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
padding: 0.25rem 0.75rem;
max-width: max-content; max-width: max-content;
background-color: var(--c-darkgray); background-color: var(--c-darkgray);
padding: 0.25rem 1.5rem; padding: 0.25rem 1.5rem;
border-radius: 0.5rem; border-radius: 0.5rem;
padding-bottom: 0.5rem; padding-bottom: 0.5rem;
justify-self: center;
text-align: center;
} }
.wrapper { .wrapper {
margin: 2rem 3rem 0.5rem 3rem; margin: 2rem 2rem 0.5rem 2rem;
display: flex; display: flex;
flex-flow: column wrap; flex-flow: column wrap;
row-gap: 1em; row-gap: 1em;
column-gap: 1em; column-gap: 1em;
align-self: center; align-self: center;
align-items: stretch; align-items: stretch;
align-content: center;
justify-content: space-around; justify-content: space-around;
padding: 1em; padding: 1em;
color: white; color: white;
@ -80,21 +104,41 @@ const { title } = Astro.props
.drop { .drop {
margin-left: 1.5rem; margin-left: 1.5rem;
} }
.start {
margin-left: 1.25rem;
}
.line { .line {
margin-left: 2.1rem; margin-left: 2.1rem;
} }
h1 { h1 {
margin-left: 3rem; margin-left: 3rem;
font-size: 1.85rem;
} }
} }
@media (min-width: 1500px) { @media (min-width: 1500px) {
.wrapper { .wrapper {
margin-left: 20rem; margin-left: 15rem;
margin-right: 20rem; margin-right: 15rem;
flex-direction: row;
}
section {
padding-bottom: unset;
}
.drop, .start, .line {
display: var(--line);
margin-left: 2rem;
}
.start {
margin-left: 1.75rem;
}
.line {
margin-left: 2.6rem;
height: calc(100% + 6rem);
translate: 0px -2rem;
} }
h1 { h1 {
margin-left: 20rem; margin-left: 15rem;
margin-right: 20rem; margin-right: 15rem;
} }
} }
</style> </style>

View file

@ -1,8 +1,10 @@
--- ---
import '@fontsource/work-sans/500.css'
import '@fontsource/work-sans/600.css'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import Layout from '../layouts/Layout.astro' import Layout from '../layouts/Layout.astro'
import BaseSection from '../layouts/baseSection.astro'
import sadshishou from '../assets/shishousad.webp' import sadshishou from '../assets/shishousad.webp'
import SmallTitle from '../components/titles/smallTitle.astro'
const description = "Error. This shouldn't happen :/" const description = "Error. This shouldn't happen :/"
--- ---
@ -12,7 +14,7 @@ const description = "Error. This shouldn't happen :/"
currentpage="404" currentpage="404"
descriptionOverride={description} descriptionOverride={description}
> >
<BaseSection title="FirqhundredandFirq - Not Found"> <SmallTitle maintext='Error' subtext='FirqhundredandFirq - Not Found' fadeout={true}/>
<div> <div>
<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>
@ -20,44 +22,51 @@ const description = "Error. This shouldn't happen :/"
&lt;&lt; Go back home &lt;&lt; Go back home
</a> </a>
</div> </div>
</BaseSection>
</Layout> </Layout>
<style> <style>
div { div {
padding: 0px 2rem;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: nowrap;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
h2 { h2 {
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif;
font-weight: 500;
color: white; color: white;
font-size: 2rem; font-size: 1.25rem;
font-weight: bold;
margin-top: 1rem; margin-top: 1rem;
max-width: max-content; max-width: max-content;
}
a {
display: flex;
align-items: center;
justify-content: center;
width: 75%;
text-align: center; text-align: center;
color: white; font-style: italic;
background-color: var(--c-gray);
padding: 0.5rem 0px;
margin-bottom: 2rem;
text-decoration: none;
font-size: 1.5rem;
font-weight: bold;
&:hover {
color: var(--c-darkpurple);
} }
a {
text-align: center;
width: fit-content;
font-weight: 600;
font-family: 'Work Sans', 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif;
color: white;
margin: 1rem 0px 0px;
padding: 0.5rem 0.75rem;
text-decoration: none;
background-color: var(--c-darkergray);
border-radius: 10px;
border-style: solid;
border-width: 2px;
border-color: var(--c-darkergray);
text-transform: capitalize;
}
a:hover {
border-color: var(--c-darkpurple);
} }
img { img {
width: 256px; width: 200px;
height: 256px; height: auto;
border-radius: 10%;
} }
</style> </style>

View file

@ -1,17 +1,19 @@
--- ---
import Layout from '../layouts/Layout.astro' import Layout from '../layouts/Layout.astro'
import AboutSection from '../layouts/aboutSection.astro'
import ContactSection from '../layouts/contactSection.astro' import ContactSection from '../layouts/contactSection.astro'
import ContactCard from '../components/contactCard.astro' import ContactCard from '../components/cards/contactCard.astro'
import contactdata from '../../static/data/_contactdata.json' import contactdata from '../../static/data/_contactdata.json'
import CustomFooter from '../layouts/customFooter.astro' import CustomFooter from '../layouts/customFooter.astro'
import TechnologyCard from '../components/technologyCard.astro' import TechnologyCard from '../components/cards/technologyCard.astro'
import technologydata from '../../static/data/_technologydata.json' import technologydata from '../../static/data/_technologydata.json'
import SmallTitle from '../components/titles/smallTitle.astro'
const description = const description =
"A summary of the technologies used as well as my contact information. You'll also find disclaimers and thank you notes for the people that helped me." "A summary of the technologies used as well as my contact information. You'll also find disclaimers and thank you notes for the people that helped me."
const subtext =
"This is a small sideproject that I'm creating. First time doing webdev in general, and first project using Typescript."
--- ---
<Layout <Layout
@ -19,10 +21,7 @@ const description =
currentpage="about" currentpage="about"
descriptionOverride={description} descriptionOverride={description}
> >
<AboutSection title="About"> <SmallTitle maintext="About" subtext={subtext} fadeout={true} />
This is a small sideproject that I'm creating. First time doing webdev in
general, and first project using Typescript.
</AboutSection>
<ContactSection title="Technologies used"> <ContactSection title="Technologies used">
{technologydata.map((item) => <TechnologyCard {...item} />)} {technologydata.map((item) => <TechnologyCard {...item} />)}
</ContactSection> </ContactSection>

View file

@ -1,35 +0,0 @@
---
import Layout from '../layouts/Layout.astro'
import BlogCard from '../components/blogCard.astro'
import BlogSection from '../layouts/blogSection.astro'
const description =
'My own small blog. Topics include FGO, TA, Programming, web technologies and more!'
const allPosts = await Astro.glob('../pages/blog/*.{md,mdx}')
allPosts.sort(
(a, b) =>
Date.parse(b.frontmatter.pubDate) - Date.parse(a.frontmatter.pubDate)
)
---
<Layout
title="Blog - Firq FGO Site"
currentpage="blog"
descriptionOverride={description}
>
<BlogSection title="Blog Articles">
{
allPosts.map((post) => (
<BlogCard
url={post.url}
title={post.frontmatter.title}
pubdate={post.frontmatter.pubDate}
description={post.frontmatter.description}
author={post.frontmatter.author}
/>
))
}
</BlogSection>
</Layout>
<style></style>

View file

@ -0,0 +1,17 @@
---
import { getCollection } from 'astro:content'
export async function getStaticPaths() {
const blogEntries = await getCollection('blog')
return blogEntries.map((entry) => ({
params: { slug: entry.slug },
props: { entry },
}))
}
const { entry } = Astro.props
const { Content } = await entry.render()
---
<Content />

View file

@ -0,0 +1,39 @@
---
import Layout from '../../layouts/Layout.astro'
import BlogCard from '../../components/cards/blogCard.astro'
import BlogSection from '../../layouts/blogSection.astro'
import SmallTitle from '../../components/titles/smallTitle.astro'
import { getCollection } from 'astro:content'
const description =
'My own small blog. Topics include FGO, TA, Programming, web technologies and more!'
const blogEntries = await getCollection('blog')
blogEntries.sort(
(a, b) =>
(b.data.pubDate.valueOf() - a.data.pubDate.valueOf() )
)
---
<Layout
title="Blog - Firq FGO Site"
currentpage="blog"
descriptionOverride={description}
>
<SmallTitle maintext="Blog Articles" subtext="" fadeout={true} />
<BlogSection title="Blog Articles" displayLine={true} titlehidden={true}>
{
blogEntries.map((post) => (
<BlogCard
url="blog"
slug={post.slug}
title={post.data.title}
pubdate={post.data.pubDate}
description={post.data.description}
author={post.data.author}
/>
))
}
</BlogSection>
</Layout>
<style></style>

View file

@ -1,9 +1,9 @@
--- ---
import Layout from '../layouts/Layout.astro' import Layout from '../layouts/Layout.astro'
import Hero from '../components/hero.astro'
import BaseSection from '../layouts/baseSection.astro' import BaseSection from '../layouts/baseSection.astro'
import FavouriteCard from '../components/favouriteCard.astro' import FavouriteCard from '../components/cards/favouriteCard.astro'
import favouritesdata from '../../static/data/_favouritesdata.json' import favouritesdata from '../../static/data/_favouritesdata.json'
import Hi from '../components/titles/title.astro'
const description = const description =
'The very own page of Firq for providing informating about TA servants, listing past TA achievements and hosting a blog for talking about FGO, Programming and other stuff' 'The very own page of Firq for providing informating about TA servants, listing past TA achievements and hosting a blog for talking about FGO, Programming and other stuff'
@ -14,7 +14,7 @@ const description =
currentpage="home" currentpage="home"
descriptionOverride={description} descriptionOverride={description}
> >
<Hero /> <Hi />
<BaseSection title="Favourites"> <BaseSection title="Favourites">
{favouritesdata.map((item) => <FavouriteCard {...item} />)} {favouritesdata.map((item) => <FavouriteCard {...item} />)}
</BaseSection> </BaseSection>

View file

@ -2,11 +2,12 @@
import Layout from '../layouts/Layout.astro' import Layout from '../layouts/Layout.astro'
import BaseSection from '../layouts/baseSection.astro' import BaseSection from '../layouts/baseSection.astro'
import ServantCard from '../components/servantCard.astro' import ServantCard from '../components/cards/servantCard.astro'
import servantdata from '../../static/data/_servantdata.json' import servantdata from '../../static/data/_servantdata.json'
import CeCard from '../components/ceCard.astro' import CeCard from '../components/cards/ceCard.astro'
import cedata from '../../static/data/_cedata.json' import cedata from '../../static/data/_cedata.json'
import SmallTitle from '../components/titles/smallTitle.astro'
const description = const description =
'A list of all the servants and ces that Firq can offer up on support for TA.' 'A list of all the servants and ces that Firq can offer up on support for TA.'
@ -17,6 +18,7 @@ const description =
currentpage="servants" currentpage="servants"
descriptionOverride={description} descriptionOverride={description}
> >
<SmallTitle maintext='TA Offering' subtext='Servants and CEs I can offer for your TAs' fadeout={true}/>
<BaseSection title="Servants"> <BaseSection title="Servants">
{servantdata.map((item) => <ServantCard {...item} />)} {servantdata.map((item) => <ServantCard {...item} />)}
</BaseSection> </BaseSection>

View file

@ -8,10 +8,11 @@
import Layout from '../layouts/Layout.astro' import Layout from '../layouts/Layout.astro'
import TaSection from '../layouts/taSection.astro' import TaSection from '../layouts/taSection.astro'
import TaCard from '../components/taCard.astro' import TaCard from '../components/cards/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' import FgotaHero from '../components/fgotaHero.astro'
import SmallTitle from '../components/titles/smallTitle.astro'
const important_data = tadata.filter(function (el) { const important_data = tadata.filter(function (el) {
return [ return [
@ -37,7 +38,8 @@ const description = 'A collection of TAs previously completed be Firq.'
currentpage="ta-collection" currentpage="ta-collection"
descriptionOverride={description} descriptionOverride={description}
> >
<FgotaHero /> <SmallTitle maintext='TA Collection' subtext=''/>
<FgotaHero fadeout={true}/>
<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>

View file

@ -10,5 +10,11 @@
"origin": "Fate/Grand Order", "origin": "Fate/Grand Order",
"imageFile": "skadi.png", "imageFile": "skadi.png",
"link": "https://twitter.com/firq_ow/status/1544321985995489280" "link": "https://twitter.com/firq_ow/status/1544321985995489280"
},
{
"name": "Summer Skadi",
"origin": "Fate/Grand Order",
"imageFile": "summerskadi.png",
"link": "https://twitter.com/firq_ow/status/1816355501216596073"
} }
] ]

View file

@ -9,6 +9,16 @@
"bondceImageFile": "scathach.png", "bondceImageFile": "scathach.png",
"bond10": true "bond10": true
}, },
{
"name": "Summer Skadi",
"level": "120",
"np": "5",
"skills": "10 / 10 / 10",
"ml": "10",
"servantImageFile": "summerskadi_03.png",
"bondceImageFile": "summerskadi.png",
"bond10": false
},
{ {
"name": "Skadi", "name": "Skadi",
"level": "120", "level": "120",
@ -190,7 +200,7 @@
"bond10": false "bond10": false
}, },
{ {
"name": "Taigon Wang", "name": "Taigong Wang",
"level": "70", "level": "70",
"np": "1", "np": "1",
"skills": "10 / 9 / 10", "skills": "10 / 9 / 10",