fix: remove duplicate dates on articles
This commit is contained in:
parent
78b0780e12
commit
8eb41f8fa4
28 changed files with 230 additions and 38 deletions
14
package-lock.json
generated
14
package-lock.json
generated
|
@ -25,7 +25,7 @@
|
|||
"@iconify-json/mdi": "^1.2.3",
|
||||
"@tailwindcss/typography": "^0.5.16",
|
||||
"@types/node": "^22.14.0",
|
||||
"npm-check-updates": "^17.1.16",
|
||||
"npm-check-updates": "^17.1.18",
|
||||
"prettier": "^3.5.3",
|
||||
"prettier-plugin-astro": "^0.14.1",
|
||||
"prettier-plugin-tailwindcss": "^0.6.11"
|
||||
|
@ -5930,9 +5930,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/npm-check-updates": {
|
||||
"version": "17.1.16",
|
||||
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.16.tgz",
|
||||
"integrity": "sha512-9nohkfjLRzLfsLVGbO34eXBejvrOOTuw5tvNammH73KEFG5XlFoi3G2TgjTExHtnrKWCbZ+mTT+dbNeSjASIPw==",
|
||||
"version": "17.1.18",
|
||||
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.18.tgz",
|
||||
"integrity": "sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
|
@ -7654,9 +7654,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "6.2.4",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz",
|
||||
"integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==",
|
||||
"version": "6.2.5",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz",
|
||||
"integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.25.0",
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
"@iconify-json/mdi": "^1.2.3",
|
||||
"@tailwindcss/typography": "^0.5.16",
|
||||
"@types/node": "^22.14.0",
|
||||
"npm-check-updates": "^17.1.16",
|
||||
"npm-check-updates": "^17.1.18",
|
||||
"prettier": "^3.5.3",
|
||||
"prettier-plugin-astro": "^0.14.1",
|
||||
"prettier-plugin-tailwindcss": "^0.6.11"
|
||||
|
|
|
@ -9,11 +9,6 @@ import RelatedArticles from "@components/RelatedArticles.astro";
|
|||
const { article, isPost = false } = Astro.props;
|
||||
const { Content } = await article.render();
|
||||
|
||||
let datesMatch = false;
|
||||
if (article.data.date.getTime() == article.data.updated?.getTime()) {
|
||||
datesMatch = true;
|
||||
}
|
||||
|
||||
const listFormatter = new Intl.ListFormat("en-GB", {
|
||||
style: "long",
|
||||
type: "conjunction",
|
||||
|
@ -41,7 +36,7 @@ const listFormatter = new Intl.ListFormat("en-GB", {
|
|||
<div class="flex items-center gap-2">
|
||||
<Icon name="mdi:calendar" />
|
||||
{
|
||||
datesMatch ? (
|
||||
!article.data.updated ? (
|
||||
<p title="Date">
|
||||
<FormattedDate date={article.data.date} />
|
||||
</p>
|
||||
|
|
212
src/content/posts/website/index.mdx
Normal file
212
src/content/posts/website/index.mdx
Normal file
|
@ -0,0 +1,212 @@
|
|||
---
|
||||
title: "Website"
|
||||
date: 2025-04-07
|
||||
description: "An overview of what I am using to host my digital content."
|
||||
image:
|
||||
url: "showcase.avif"
|
||||
alt: "Website showcase"
|
||||
categories: ["personal"]
|
||||
tags: ["self-host", "forgejo", "docker", "vps"]
|
||||
draft: true
|
||||
---
|
||||
|
||||
This post will outline my workflow of using a self-hosted Forgejo instance and Actions runner to automatically deploy my personal site and any software releases, all without having to rely on another provider.
|
||||
|
||||

|
||||
|
||||
## Steps
|
||||
|
||||
### Private image access login?
|
||||
|
||||
```sh
|
||||
echo '<token>' | docker login code.troylusty.com -u troy --password-stdin
|
||||
```
|
||||
|
||||
```sh
|
||||
echo $(htpasswd -nB user) | sed -e s/\\$/\\$\\$/g
|
||||
```
|
||||
|
||||
### Aliases for updating VPS and pruning Docker
|
||||
|
||||
```sh
|
||||
echo 'alias dockerclean="docker system prune -a --volumes"' >> .bashrc
|
||||
echo 'alias updateall="sudo apt update && sudo apt upgrade && sudo apt autoremove"' >> .bashrc
|
||||
```
|
||||
|
||||
Thanks to [Tech Tales](https://tech-tales.blog/posts/2025/01-forgejo-runner-update) for the clean instructions on how to setup an Actions runner with Forgejo.
|
||||
|
||||
```sh
|
||||
docker compose run --rm forgejo-runner 'forgejo-runner' 'generate-config' > forgejo-runner/config.yml
|
||||
```
|
||||
|
||||
Setup `container.docker_host: "unix:///var/run/docker.sock"` and `container.network: "forgejo"` and any labels such as `runner.labels: ["ubuntu-latest:docker://gitea/runner-images:ubuntu-latest"]`
|
||||
|
||||
```
|
||||
docker compose run --rm -it forgejo-runner 'forgejo-runner' 'register'
|
||||
```
|
||||
|
||||
Input `http://forgejo:3000` as the domain since forgejo is the container name in Docker and port 3000 is its relevant port.
|
||||
|
||||
## Docker compose
|
||||
|
||||
```yaml
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:latest
|
||||
container_name: traefik
|
||||
command:
|
||||
- "--providers.docker"
|
||||
- "--providers.docker.exposedbydefault=false"
|
||||
- "--entryPoints.websecure.address=:443"
|
||||
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
|
||||
- "--certificatesresolvers.myresolver.acme.email=traefik@troylusty.com"
|
||||
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
|
||||
- "--entrypoints.web.address=:80"
|
||||
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
|
||||
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
|
||||
- "--ping=true"
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
- "traefik.http.middlewares.securityHeaders.headers.stsSeconds=31536000"
|
||||
- "traefik.http.middlewares.securityHeaders.headers.stsIncludeSubdomains=true"
|
||||
- "traefik.http.middlewares.securityHeaders.headers.frameDeny=true"
|
||||
- "traefik.http.middlewares.securityHeaders.headers.contentTypeNosniff=true"
|
||||
- "traefik.http.middlewares.securityHeaders.headers.contentSecurityPolicy=default-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; base-uri 'none'; form-action 'self'; object-src 'none'; frame-ancestors 'none'; upgrade-insecure-requests"
|
||||
- "traefik.http.middlewares.securityHeaders.headers.referrerPolicy=no-referrer"
|
||||
- "traefik.http.middlewares.securityHeaders.headers.permissionsPolicy=accelerometer=(), autoplay=(), camera=(), cross-origin-isolated=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(self), usb=(), web-share=(), xr-spatial-tracking=(), clipboard-read=(), clipboard-write=(), gamepad=(), hid=(), idle-detection=(), interest-cohort=(), serial=(), unload=()"
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- letsencrypt:/letsencrypt
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- traefik
|
||||
healthcheck:
|
||||
test: ["CMD", "traefik", "healthcheck", "--ping"]
|
||||
depends_on:
|
||||
watchtower:
|
||||
condition: service_healthy
|
||||
|
||||
watchtower:
|
||||
image: containrrr/watchtower:latest
|
||||
command: --label-enable --interval 1800 --rolling-restart --cleanup --remove-volumes
|
||||
container_name: watchtower
|
||||
networks:
|
||||
- traefik
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- /home/troy/.docker/config.json:/config.json
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "/watchtower", "--health-check"]
|
||||
|
||||
personalsite:
|
||||
image: code.troylusty.com/troy/troylusty.com:latest
|
||||
container_name: personalsite
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.personalsite.rule=Host(`troylusty.com`)"
|
||||
- "traefik.http.routers.personalsite.entrypoints=websecure"
|
||||
- "traefik.http.routers.personalsite.tls.certresolver=myresolver"
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
- "traefik.http.routers.personalsite.middlewares=securityHeaders"
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- traefik
|
||||
depends_on:
|
||||
traefik:
|
||||
condition: service_healthy
|
||||
|
||||
zolapress:
|
||||
image: code.troylusty.com/troy/zolapress:latest
|
||||
container_name: zolapress
|
||||
profiles:
|
||||
- donotstart
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.zolapress.rule=Host(`edu.troylusty.com`)"
|
||||
- "traefik.http.routers.zolapress.entrypoints=websecure"
|
||||
- "traefik.http.routers.zolapress.tls.certresolver=myresolver"
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
- "traefik.http.middlewares.auth.basicauth.users=troy:$$2y$$05$$fgVNzDsxXDq4co3aTh/OMOKZdLzUiM9XPEU5DXCivc9sYUZy/oq1W"
|
||||
- "traefik.http.routers.zolapress.middlewares=securityHeaders, auth"
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- traefik
|
||||
depends_on:
|
||||
traefik:
|
||||
condition: service_healthy
|
||||
|
||||
unduck:
|
||||
image: code.troylusty.com/troy/unduck:latest
|
||||
container_name: unduck
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.unduck.rule=Host(`unduck.troylusty.com`)"
|
||||
- "traefik.http.routers.unduck.entrypoints=websecure"
|
||||
- "traefik.http.routers.unduck.tls.certresolver=myresolver"
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
- "traefik.http.routers.unduck.middlewares=securityHeaders"
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- traefik
|
||||
depends_on:
|
||||
traefik:
|
||||
condition: service_healthy
|
||||
|
||||
forgejo:
|
||||
image: codeberg.org/forgejo/forgejo:10
|
||||
container_name: forgejo
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- traefik
|
||||
- forgejo
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.forgejo.rule=Host(`code.troylusty.com`)"
|
||||
- "traefik.http.routers.forgejo.entrypoints=websecure"
|
||||
- "traefik.http.routers.forgejo.tls.certresolver=myresolver"
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
- "traefik.http.routers.forgejo.middlewares=securityHeaders"
|
||||
- "traefik.http.services.forgejo.loadbalancer.server.port=3000"
|
||||
- "traefik.docker.network=traefik"
|
||||
volumes:
|
||||
- ./forgejo:/data
|
||||
ports:
|
||||
- "2222:22"
|
||||
depends_on:
|
||||
traefik:
|
||||
condition: service_healthy
|
||||
|
||||
forgejo-runner:
|
||||
image: code.forgejo.org/forgejo/runner:6.0.1
|
||||
container_name: forgejo-runner
|
||||
user: 0:0
|
||||
depends_on:
|
||||
forgejo:
|
||||
condition: service_started
|
||||
networks:
|
||||
- forgejo
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
volumes:
|
||||
- ./forgejo-runner:/data
|
||||
- ./forgejo-runner/config.yml:/data/config.yml
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
restart: unless-stopped
|
||||
command: forgejo-runner -c /data/config.yml daemon
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
external: false
|
||||
name: traefik
|
||||
forgejo:
|
||||
external: false
|
||||
name: forgejo
|
||||
|
||||
volumes:
|
||||
letsencrypt:
|
||||
```
|
BIN
src/content/posts/website/showcase.avif
Normal file
BIN
src/content/posts/website/showcase.avif
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
|
@ -2,7 +2,6 @@
|
|||
title: "3D Package Design"
|
||||
description: "3D Package Design inspired by the work of Derek Elliott."
|
||||
date: 2020-08-16
|
||||
updated: 2020-08-16
|
||||
image:
|
||||
{ url: "troy-lusty-3d-package-design.avif", alt: "3D package design frame" }
|
||||
tags: ["blender"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "A Long Way Down (Demo)"
|
||||
description: "A short, atmospheric linear adventure created for my FdA Games and Interactive Design degree."
|
||||
date: 2023-05-11
|
||||
updated: 2023-05-11
|
||||
featured: true
|
||||
image: { url: "alwd-img1.avif", alt: "A Long Way Down Intro Showcase" }
|
||||
tags: ["unreal engine", "blender", "inkscape"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Astronaut"
|
||||
description: "Lighting and camera test."
|
||||
date: 2022-03-28
|
||||
updated: 2022-03-28
|
||||
image: { url: "troy-lusty-astronaut.avif", alt: "Astronaut final piece" }
|
||||
tags: ["blender", "davinci resolve"]
|
||||
categories: ["personal"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Digital Artefact: Corridor (Incomplete)"
|
||||
description: "A virtual production horror environment made in Unreal Engine 5 and inspired by The Shining."
|
||||
date: 2023-01-20
|
||||
updated: 2023-01-20
|
||||
image:
|
||||
{
|
||||
url: "troy-lusty-highresscreenshot05012023-2.avif",
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Discord Bot"
|
||||
description: "AQA Computer Science NEA project based around creating a Discord bot."
|
||||
date: 2020-03-31
|
||||
updated: 2020-03-31
|
||||
image: { url: "discord.avif", alt: "Discord bot" }
|
||||
tags: ["python"]
|
||||
categories: ["education"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Firespline"
|
||||
description: "A fire animation test presented in a small cave scene."
|
||||
date: 2022-01-06
|
||||
updated: 2022-01-06
|
||||
image: { url: "troy-lusty-firespline.avif", alt: "Firespline frame" }
|
||||
tags: ["blender", "davinci resolve"]
|
||||
categories: ["personal"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Kraken in the Cupboard"
|
||||
description: "Mythical depiction of the Kraken bursting its way out of a bookcase cupboard."
|
||||
date: 2021-12-11
|
||||
updated: 2021-12-11
|
||||
image: { url: "troy-lusty-kraken.avif", alt: "Kraken in the Cupboard final" }
|
||||
tags: ["blender"]
|
||||
categories: ["personal"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Logofolio"
|
||||
description: "An ongoing collection of branding and logos designs."
|
||||
date: 2021-06-16
|
||||
updated: 2021-06-16
|
||||
image: { url: "troy-lusty-logofolio.avif", alt: "Logofolio title" }
|
||||
collection: true
|
||||
tags: ["blender", "pixelmator", "affinity photo", "affinity designer"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Megascans Artworks"
|
||||
description: "A small collection of artworks made with Megascans assets."
|
||||
date: 2021-01-29
|
||||
updated: 2021-01-29
|
||||
collection: true
|
||||
image: { url: "troy-lusty-forest-fire.avif", alt: "Forest fire" }
|
||||
tags: ["quixel megascans", "blender"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Mortis"
|
||||
description: "1 Corinthians 15:26 - The last enemy to be destroyed is death."
|
||||
date: 2022-12-10
|
||||
updated: 2022-12-10
|
||||
image:
|
||||
{
|
||||
url: "troy-lusty-mortis.avif",
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Nightmare"
|
||||
description: "Little Nightmares inspired game demo and environment completed for my college final major project."
|
||||
date: 2021-04-21
|
||||
updated: 2021-04-21
|
||||
image: { url: "troy-lusty-nightmare.avif", alt: "Nightmare Frame 0600" }
|
||||
tags: ["unreal engine", "blender", "davinci resolve", "photoshop", "zbrush"]
|
||||
categories: ["education"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Packard"
|
||||
description: "A simple RSS aggregator meant to allow you to take a quick glance at what's occurring in topics you care about."
|
||||
date: 2025-01-12
|
||||
updated: 2025-01-12
|
||||
image: { url: "packard.avif", alt: "Packard GitHub v0.0.1 Release" }
|
||||
tags: ["rust", "rss aggregator"]
|
||||
categories: ["personal"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Pasikdhar"
|
||||
description: "Depiction of the staircase in my home being haunted by a night terror."
|
||||
date: 2023-07-25
|
||||
updated: 2023-07-25
|
||||
image:
|
||||
{
|
||||
url: "troy-lusty-pasikdhar-final.avif",
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Sixth Form Artworks"
|
||||
description: "Assorted artwork completed in my time at sixth form."
|
||||
date: 2020-02-21
|
||||
updated: 2020-02-21
|
||||
collection: true
|
||||
image:
|
||||
{
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Studying Spider"
|
||||
description: "A smart little spider made within a couple lessons at college."
|
||||
date: 2022-01-27
|
||||
updated: 2022-01-27
|
||||
image: { url: "troy-lusty-studying-spider.avif", alt: "Studying Spider" }
|
||||
tags: ["blender"]
|
||||
categories: ["personal"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Terry's Mango Juice 'N' Stuff"
|
||||
description: "Themed mango juice render done to test combining 3D product rendering with 2D packaging work."
|
||||
date: 2021-09-10
|
||||
updated: 2021-09-10
|
||||
image:
|
||||
{
|
||||
url: "troy-lusty-terrys-mango.avif",
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "The Batman"
|
||||
description: "The Bat and The Cat Trailer Shot Remake in Unreal Engine 5 & DaVinci Resolve."
|
||||
date: 2022-06-13
|
||||
updated: 2022-06-13
|
||||
featured: true
|
||||
image: { url: "troy-lusty-batman.avif", alt: "Frame from the final video" }
|
||||
tags:
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Tomb"
|
||||
description: "A moody sacrifice scene taking place in a tomb created to test SSGI in Blender Eevee."
|
||||
date: 2021-07-14
|
||||
updated: 2021-07-14
|
||||
image: { url: "troy-lusty-tomb.avif", alt: "Tomb final" }
|
||||
tags: ["blender", "affinity photo"]
|
||||
categories: ["personal"]
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "UntitledArmy Inspired Character"
|
||||
description: "A stylised character design inspired by the work of UntitledArmy."
|
||||
date: 2022-01-22
|
||||
updated: 2022-01-22
|
||||
image:
|
||||
{
|
||||
url: "troy-lusty-untitledarmy.avif",
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "WebBoss (Work experience)"
|
||||
description: "Designs created for WebBoss as part of my work experience in sixth form."
|
||||
date: 2019-06-15
|
||||
updated: 2019-06-15
|
||||
image: { url: "swimboss.avif", alt: "WebBoss SwimBoss" }
|
||||
tags: ["adobe xd", "adobe photoshop"]
|
||||
categories: ["client work"]
|
||||
|
|
6
src/icons/cat.svg
Normal file
6
src/icons/cat.svg
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="894.49" height="469.63" version="1.1" viewBox="0 0 236.67 124.26" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="translate(-14.138 -70.162)">
|
||||
<path d="m127.62 70.168c-8.2954 0.02321-42.603 1.3047-60.61 20.243-15.698 16.51-38.209 42.724-48.005 54.231-3.0462 3.5782-4.8629 5.7341-4.8629 5.7341l4.9889 2.5192 30.696 15.496s15.971 12.517 21.441 11.791c8.3522-1.1083 12.418-3.9027 16.676-15.967 4.2579-12.064 13.587-30.244 13.587-30.244s2.3056-7.033 2.7351-11.626c0.50179-5.3654 5.6984-18.845 10.29-22.708 4.2494-3.576 9.5814-8.1617 13.13 4.2571 3.5482 12.419 8.5145 33.354 13.482 37.612 4.9675 4.2579 8.5162 8.8705 11.71 8.5157s7.4506-1e-3 10.999-3.5493c3.5482-3.5482 16.42-18.782 22.355-15.611 2.1392 1.1428 2.4694 3.5357 1.4185 6.031-2.3125 5.491-6.3862 23.774-5.3218 31.935 1.0645 8.1609 6.0315 26.612 14.902 25.547 8.8706-1.0645 53.579-6.0325 53.579-6.0325s-7.8055-58.9-34.772-81.609c-26.967-22.709-45.772-37.256-86.577-36.546 0 0-0.65483-0.02321-1.8399-0.02031zm-3.2014 79.664s-6.4645 11.471-3.6198 17.631c2.8447 6.1602 9.8265-17.631 3.6198-17.631zm29.768 10.203c-0.30642-2e-3 -0.63762 0.0435-0.99567 0.14248 0 0-3.6887 10.162 0.47684 16.066 2.6042 3.6908 6.7494-16.167 0.51883-16.208z" fill="currentColor" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="0" stroke-width="11.516" style="paint-order:markers stroke fill"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
|
@ -11,10 +11,10 @@ import icon from "public/assets/icon.png";
|
|||
<div class="animate-reveal flex items-center justify-between opacity-0">
|
||||
<div class="flex-1 space-y-1.5">
|
||||
<h1
|
||||
class="animate-reveal text-start text-3xl font-semibold break-words opacity-0"
|
||||
class="animate-reveal flex flex-col text-start text-3xl font-semibold opacity-0 sm:block"
|
||||
>
|
||||
<span class="text-secondary">{CV.TITLE}</span><span
|
||||
class="text-tertiary ml-2">{CV.DESCRIPTION}</span
|
||||
<span class="text-secondary text-nowrap">{CV.TITLE}</span><span
|
||||
class="text-tertiary sm:ml-2">{CV.DESCRIPTION}</span
|
||||
>
|
||||
</h1>
|
||||
<p class="text-secondary/70 max-w-md text-pretty">Digital designer.</p><p
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
import Layout from "@layouts/Layout.astro";
|
||||
import { SITE } from "@consts";
|
||||
import Button from "@components/Button.astro";
|
||||
---
|
||||
|
||||
<Layout title="404" description={SITE.DESCRIPTION}>
|
||||
|
|
Loading…
Add table
Reference in a new issue