aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPinapelz <yukais@pinapelz.com>2026-06-14 23:01:14 -0700
committerPinapelz <yukais@pinapelz.com>2026-06-14 23:01:14 -0700
commit8cb5c1f9d544ff86c2c5f65cc0df477f4ac7ac00 (patch)
tree84f1ddc98959ed7c1af882c429a6efb6c16a1f3e
parent47ad1dc45350519e261842b861d9335bc8957972 (diff)
update site
-rw-r--r--astro.config.mjs7
-rw-r--r--package.json4
-rw-r--r--pnpm-lock.yaml452
-rw-r--r--pnpm-workspace.yaml3
-rw-r--r--public/pfp.pngbin0 -> 293263 bytes
-rw-r--r--src/components/DiscordStatus.astro79
-rw-r--r--src/components/Header.astro2
-rw-r--r--src/layouts/Layout.astro1
-rw-r--r--src/pages/about.astro195
-rw-r--r--src/pages/index.astro231
-rw-r--r--src/styles/global.css1
-rw-r--r--tailwind.config.js8
12 files changed, 580 insertions, 403 deletions
diff --git a/astro.config.mjs b/astro.config.mjs
index 461bd30..0fa79e5 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -1,8 +1,9 @@
import { defineConfig } from 'astro/config';
-
-import tailwind from "@astrojs/tailwind";
+import tailwindcss from "@tailwindcss/vite";
// https://astro.build/config
export default defineConfig({
- integrations: [tailwind()]
+ vite: {
+ plugins: [tailwindcss()],
+ },
}); \ No newline at end of file
diff --git a/package.json b/package.json
index 01726dc..626f43f 100644
--- a/package.json
+++ b/package.json
@@ -10,12 +10,12 @@
"astro": "astro"
},
"dependencies": {
- "@astrojs/tailwind": "^6.0.2",
"@fortawesome/fontawesome-free": "^7.2.0",
+ "@tailwindcss/vite": "^4.0.0",
"astro": "^6.3.7",
"astro-single-file": "^1.1.0",
"html-minifier-terser": "^7.2.0",
"jsdom": "^29.1.1",
- "tailwindcss": "^4.3.0"
+ "tailwindcss": "^4.0.0"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b20210d..56f05b8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,15 +8,15 @@ importers:
.:
dependencies:
- '@astrojs/tailwind':
- specifier: ^6.0.2
- version: 6.0.2(astro@6.3.7(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(rollup@4.60.4)(terser@5.48.0)(yaml@2.9.0))(tailwindcss@4.3.0)
'@fortawesome/fontawesome-free':
specifier: ^7.2.0
version: 7.2.0
+ '@tailwindcss/vite':
+ specifier: ^4.0.0
+ version: 4.3.1(vite@7.3.3(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))
astro:
specifier: ^6.3.7
- version: 6.3.7(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(rollup@4.60.4)(terser@5.48.0)(yaml@2.9.0)
+ version: 6.3.7(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.48.0)(yaml@2.9.0)
astro-single-file:
specifier: ^1.1.0
version: 1.1.0
@@ -27,8 +27,8 @@ importers:
specifier: ^29.1.1
version: 29.1.1
tailwindcss:
- specifier: ^4.3.0
- version: 4.3.0
+ specifier: ^4.0.0
+ version: 4.3.1
packages:
@@ -60,12 +60,6 @@ packages:
resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==}
engines: {node: '>=22.12.0'}
- '@astrojs/tailwind@6.0.2':
- resolution: {integrity: sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==}
- peerDependencies:
- astro: ^3.0.0 || ^4.0.0 || ^5.0.0
- tailwindcss: ^3.0.24
-
'@astrojs/telemetry@3.3.2':
resolution: {integrity: sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==}
engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
@@ -467,6 +461,9 @@ packages:
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -661,6 +658,100 @@ packages:
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+ '@tailwindcss/node@4.3.1':
+ resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==}
+
+ '@tailwindcss/oxide-android-arm64@4.3.1':
+ resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.1':
+ resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.3.1':
+ resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.1':
+ resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
+ resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==}
+ engines: {node: '>= 20'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
+ resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
+ resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
+ resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.1':
+ resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.1':
+ resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
+ resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
+ resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.3.1':
+ resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==}
+ engines: {node: '>= 20'}
+
+ '@tailwindcss/vite@4.3.1':
+ resolution: {integrity: sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==}
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7 || ^8
+
'@types/debug@4.1.13':
resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
@@ -718,13 +809,6 @@ packages:
engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true
- autoprefixer@10.5.0:
- resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==}
- engines: {node: ^10 || ^12 || >=14}
- hasBin: true
- peerDependencies:
- postcss: ^8.1.0
-
axobject-query@4.1.0:
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
@@ -732,31 +816,18 @@ packages:
bail@2.0.2:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
- baseline-browser-mapping@2.10.32:
- resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
bidi-js@1.0.3:
resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
- browserslist@4.28.2:
- resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
camel-case@4.1.2:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
- caniuse-lite@1.0.30001793:
- resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==}
-
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -895,8 +966,9 @@ packages:
resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
engines: {node: '>=4'}
- electron-to-chromium@1.5.361:
- resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==}
+ enhanced-resolve@5.21.6:
+ resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
+ engines: {node: '>=10.13.0'}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
@@ -918,10 +990,6 @@ packages:
engines: {node: '>=18'}
hasBin: true
- escalade@3.2.0:
- resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
- engines: {node: '>=6'}
-
escape-string-regexp@5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
@@ -964,9 +1032,6 @@ packages:
resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==}
engines: {node: '>=20'}
- fraction.js@5.3.4:
- resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
-
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -979,6 +1044,9 @@ packages:
github-slugger@2.0.0:
resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
h3@1.15.11:
resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==}
@@ -1059,8 +1127,8 @@ packages:
resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
engines: {node: '>=16'}
- jiti@1.21.7:
- resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
+ jiti@2.7.0:
+ resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
js-yaml@4.1.1:
@@ -1079,78 +1147,80 @@ packages:
jsonc-parser@3.3.1:
resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
- lightningcss-darwin-arm64@1.30.1:
- resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==}
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
- lightningcss-darwin-x64@1.30.1:
- resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==}
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
- lightningcss-freebsd-x64@1.30.1:
- resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==}
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
- lightningcss-linux-arm-gnueabihf@1.30.1:
- resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==}
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
- lightningcss-linux-arm64-gnu@1.30.1:
- resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==}
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- lightningcss-linux-arm64-musl@1.30.1:
- resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
- lightningcss-linux-x64-gnu@1.30.1:
- resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
- lightningcss-linux-x64-musl@1.30.1:
- resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
- lightningcss-win32-arm64-msvc@1.30.1:
- resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
- lightningcss-win32-x64-msvc@1.30.1:
- resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==}
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
- lightningcss@1.30.1:
- resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==}
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
engines: {node: '>= 12.0.0'}
- lilconfig@3.1.3:
- resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
- engines: {node: '>=14'}
-
longest-streak@3.1.0:
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
@@ -1327,10 +1397,6 @@ packages:
node-mock-http@1.0.4:
resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==}
- node-releases@2.0.46:
- resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==}
- engines: {node: '>=18'}
-
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -1397,21 +1463,6 @@ packages:
resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
engines: {node: '>=12'}
- postcss-load-config@4.0.2:
- resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
- engines: {node: '>= 14'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
-
- postcss-value-parser@4.2.0:
- resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
-
postcss@8.5.15:
resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==}
engines: {node: ^10 || ^12 || >=14}
@@ -1552,9 +1603,12 @@ packages:
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
- tailwindcss@4.3.0:
- resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==}
- hasBin: true
+ tailwindcss@4.3.1:
+ resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==}
+
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+ engines: {node: '>=6'}
terser@5.48.0:
resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==}
@@ -1711,12 +1765,6 @@ packages:
uploadthing:
optional: true
- update-browserslist-db@1.2.3:
- resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
-
vfile-location@5.0.3:
resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
@@ -1884,16 +1932,6 @@ snapshots:
dependencies:
prismjs: 1.30.0
- '@astrojs/tailwind@6.0.2(astro@6.3.7(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(rollup@4.60.4)(terser@5.48.0)(yaml@2.9.0))(tailwindcss@4.3.0)':
- dependencies:
- astro: 6.3.7(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(rollup@4.60.4)(terser@5.48.0)(yaml@2.9.0)
- autoprefixer: 10.5.0(postcss@8.5.15)
- postcss: 8.5.15
- postcss-load-config: 4.0.2(postcss@8.5.15)
- tailwindcss: 4.3.0
- transitivePeerDependencies:
- - ts-node
-
'@astrojs/telemetry@3.3.2':
dependencies:
ci-info: 4.4.0
@@ -2148,6 +2186,11 @@ snapshots:
'@jridgewell/sourcemap-codec': 1.5.5
'@jridgewell/trace-mapping': 0.3.31
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/source-map@0.3.11':
@@ -2287,6 +2330,74 @@ snapshots:
'@shikijs/vscode-textmate@10.0.2': {}
+ '@tailwindcss/node@4.3.1':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.21.6
+ jiti: 2.7.0
+ lightningcss: 1.32.0
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.3.1
+
+ '@tailwindcss/oxide-android-arm64@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-x64@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
+ optional: true
+
+ '@tailwindcss/oxide@4.3.1':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.3.1
+ '@tailwindcss/oxide-darwin-arm64': 4.3.1
+ '@tailwindcss/oxide-darwin-x64': 4.3.1
+ '@tailwindcss/oxide-freebsd-x64': 4.3.1
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.1
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.1
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.1
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.1
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.1
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.1
+
+ '@tailwindcss/vite@4.3.1(vite@7.3.3(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))':
+ dependencies:
+ '@tailwindcss/node': 4.3.1
+ '@tailwindcss/oxide': 4.3.1
+ tailwindcss: 4.3.1
+ vite: 7.3.3(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)
+
'@types/debug@4.1.13':
dependencies:
'@types/ms': 2.1.0
@@ -2333,7 +2444,7 @@ snapshots:
astro-single-file@1.1.0: {}
- astro@6.3.7(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(rollup@4.60.4)(terser@5.48.0)(yaml@2.9.0):
+ astro@6.3.7(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.48.0)(yaml@2.9.0):
dependencies:
'@astrojs/compiler': 4.0.0
'@astrojs/internal-helpers': 0.9.1
@@ -2385,8 +2496,8 @@ snapshots:
unist-util-visit: 5.1.0
unstorage: 1.17.5
vfile: 6.0.3
- vite: 7.3.3(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.48.0)(yaml@2.9.0)
- vitefu: 1.1.3(vite@7.3.3(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.48.0)(yaml@2.9.0))
+ vite: 7.3.3(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)
+ vitefu: 1.1.3(vite@7.3.3(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))
xxhash-wasm: 1.1.0
yargs-parser: 22.0.0
zod: 4.4.3
@@ -2426,35 +2537,16 @@ snapshots:
- uploadthing
- yaml
- autoprefixer@10.5.0(postcss@8.5.15):
- dependencies:
- browserslist: 4.28.2
- caniuse-lite: 1.0.30001793
- fraction.js: 5.3.4
- picocolors: 1.1.1
- postcss: 8.5.15
- postcss-value-parser: 4.2.0
-
axobject-query@4.1.0: {}
bail@2.0.2: {}
- baseline-browser-mapping@2.10.32: {}
-
bidi-js@1.0.3:
dependencies:
require-from-string: 2.0.2
boolbase@1.0.0: {}
- browserslist@4.28.2:
- dependencies:
- baseline-browser-mapping: 2.10.32
- caniuse-lite: 1.0.30001793
- electron-to-chromium: 1.5.361
- node-releases: 2.0.46
- update-browserslist-db: 1.2.3(browserslist@4.28.2)
-
buffer-from@1.1.2: {}
camel-case@4.1.2:
@@ -2462,8 +2554,6 @@ snapshots:
pascal-case: 3.1.2
tslib: 2.8.1
- caniuse-lite@1.0.30001793: {}
-
ccount@2.0.1: {}
character-entities-html4@2.1.0: {}
@@ -2549,8 +2639,7 @@ snapshots:
destr@2.0.5: {}
- detect-libc@2.1.2:
- optional: true
+ detect-libc@2.1.2: {}
devalue@5.8.1: {}
@@ -2585,7 +2674,10 @@ snapshots:
dset@3.1.4: {}
- electron-to-chromium@1.5.361: {}
+ enhanced-resolve@5.21.6:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
entities@4.5.0: {}
@@ -2624,8 +2716,6 @@ snapshots:
'@esbuild/win32-ia32': 0.27.7
'@esbuild/win32-x64': 0.27.7
- escalade@3.2.0: {}
-
escape-string-regexp@5.0.0: {}
estree-walker@2.0.2: {}
@@ -2658,8 +2748,6 @@ snapshots:
dependencies:
tiny-inflate: 1.0.3
- fraction.js@5.3.4: {}
-
fsevents@2.3.3:
optional: true
@@ -2669,6 +2757,8 @@ snapshots:
github-slugger@2.0.0: {}
+ graceful-fs@4.2.11: {}
+
h3@1.15.11:
dependencies:
cookie-es: 1.2.3
@@ -2808,8 +2898,7 @@ snapshots:
dependencies:
is-inside-container: 1.0.0
- jiti@1.21.7:
- optional: true
+ jiti@2.7.0: {}
js-yaml@4.1.1:
dependencies:
@@ -2843,53 +2932,54 @@ snapshots:
jsonc-parser@3.3.1: {}
- lightningcss-darwin-arm64@1.30.1:
+ lightningcss-android-arm64@1.32.0:
optional: true
- lightningcss-darwin-x64@1.30.1:
+ lightningcss-darwin-arm64@1.32.0:
optional: true
- lightningcss-freebsd-x64@1.30.1:
+ lightningcss-darwin-x64@1.32.0:
optional: true
- lightningcss-linux-arm-gnueabihf@1.30.1:
+ lightningcss-freebsd-x64@1.32.0:
optional: true
- lightningcss-linux-arm64-gnu@1.30.1:
+ lightningcss-linux-arm-gnueabihf@1.32.0:
optional: true
- lightningcss-linux-arm64-musl@1.30.1:
+ lightningcss-linux-arm64-gnu@1.32.0:
optional: true
- lightningcss-linux-x64-gnu@1.30.1:
+ lightningcss-linux-arm64-musl@1.32.0:
optional: true
- lightningcss-linux-x64-musl@1.30.1:
+ lightningcss-linux-x64-gnu@1.32.0:
optional: true
- lightningcss-win32-arm64-msvc@1.30.1:
+ lightningcss-linux-x64-musl@1.32.0:
optional: true
- lightningcss-win32-x64-msvc@1.30.1:
+ lightningcss-win32-arm64-msvc@1.32.0:
optional: true
- lightningcss@1.30.1:
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
+
+ lightningcss@1.32.0:
dependencies:
detect-libc: 2.1.2
optionalDependencies:
- lightningcss-darwin-arm64: 1.30.1
- lightningcss-darwin-x64: 1.30.1
- lightningcss-freebsd-x64: 1.30.1
- lightningcss-linux-arm-gnueabihf: 1.30.1
- lightningcss-linux-arm64-gnu: 1.30.1
- lightningcss-linux-arm64-musl: 1.30.1
- lightningcss-linux-x64-gnu: 1.30.1
- lightningcss-linux-x64-musl: 1.30.1
- lightningcss-win32-arm64-msvc: 1.30.1
- lightningcss-win32-x64-msvc: 1.30.1
- optional: true
-
- lilconfig@3.1.3: {}
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
longest-streak@3.1.0: {}
@@ -3247,8 +3337,6 @@ snapshots:
node-mock-http@1.0.4: {}
- node-releases@2.0.46: {}
-
normalize-path@3.0.0: {}
nth-check@2.1.1:
@@ -3321,15 +3409,6 @@ snapshots:
picomatch@4.0.4: {}
- postcss-load-config@4.0.2(postcss@8.5.15):
- dependencies:
- lilconfig: 3.1.3
- yaml: 2.9.0
- optionalDependencies:
- postcss: 8.5.15
-
- postcss-value-parser@4.2.0: {}
-
postcss@8.5.15:
dependencies:
nanoid: 3.3.12
@@ -3567,7 +3646,9 @@ snapshots:
symbol-tree@3.2.4: {}
- tailwindcss@4.3.0: {}
+ tailwindcss@4.3.1: {}
+
+ tapable@2.3.3: {}
terser@5.48.0:
dependencies:
@@ -3687,12 +3768,6 @@ snapshots:
ofetch: 1.5.1
ufo: 1.6.4
- update-browserslist-db@1.2.3(browserslist@4.28.2):
- dependencies:
- browserslist: 4.28.2
- escalade: 3.2.0
- picocolors: 1.1.1
-
vfile-location@5.0.3:
dependencies:
'@types/unist': 3.0.3
@@ -3708,7 +3783,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite@7.3.3(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.48.0)(yaml@2.9.0):
+ vite@7.3.3(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0):
dependencies:
esbuild: 0.27.7
fdir: 6.5.0(picomatch@4.0.4)
@@ -3719,14 +3794,14 @@ snapshots:
optionalDependencies:
'@types/node': 24.3.0
fsevents: 2.3.3
- jiti: 1.21.7
- lightningcss: 1.30.1
+ jiti: 2.7.0
+ lightningcss: 1.32.0
terser: 5.48.0
yaml: 2.9.0
- vitefu@1.1.3(vite@7.3.3(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.48.0)(yaml@2.9.0)):
+ vitefu@1.1.3(vite@7.3.3(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)):
optionalDependencies:
- vite: 7.3.3(@types/node@24.3.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.48.0)(yaml@2.9.0)
+ vite: 7.3.3(@types/node@24.3.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)
w3c-xmlserializer@5.0.0:
dependencies:
@@ -3754,7 +3829,8 @@ snapshots:
xxhash-wasm@1.1.0: {}
- yaml@2.9.0: {}
+ yaml@2.9.0:
+ optional: true
yargs-parser@22.0.0: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index c564c89..83c78e9 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,3 +1,6 @@
+allowBuilds:
+ esbuild: true
+ sharp: true
ignoredBuiltDependencies:
- esbuild
- sharp
diff --git a/public/pfp.png b/public/pfp.png
new file mode 100644
index 0000000..55db960
--- /dev/null
+++ b/public/pfp.png
Binary files differ
diff --git a/src/components/DiscordStatus.astro b/src/components/DiscordStatus.astro
deleted file mode 100644
index 46bebf9..0000000
--- a/src/components/DiscordStatus.astro
+++ /dev/null
@@ -1,79 +0,0 @@
----
-const statusColors = {
- online: "#43b581",
- idle: "#faa61a",
- dnd: "#f04747",
- offline: "#747f8d",
-};
-
-const statusText = {
- online: "Online",
- idle: "Idle",
- dnd: "Do Not Disturb",
- offline: "Offline",
-}
-
----
-<section id="discord-status">
- <img src="https://assets-global.website-files.com/6257adef93867e50d84d30e2/636e0a6ca814282eca7172c6_icon_clyde_white_RGB.svg" alt="Discord Avatar" />
- <h2><span id="status-text"></span></h2>
-</section>
-
-<style>
- #discord-status {
- display: flex;
- align-items: center;
- padding: 15px;
- border-radius: 10px;
- color: white;
- transition: background-color 0.3s ease-in-out;
- }
-
- #discord-status img {
- width: 30px;
- height: 30px;
- border-radius: 50%;
- margin-right: 20px;
- }
-
- #discord-status h2 {
- font-size: 1.2rem;
- }
-
- #discord-status p {
- font-size: 1rem;
- opacity: 0.8;
- }
-</style>
-
-<script>
- const API_URL = "https://api.lanyard.rest/v1/users/246787839570739211";
-
- fetch(API_URL)
- .then(response => response.json())
- .then(data => {
- const discordUser = data.data.discord_user;
- const discordStatus = data.data.discord_status;
-
- const statusColors = {
- online: "#43b581",
- idle: "#faa61a",
- dnd: "#f04747",
- offline: "#747f8d",
- };
-
- const statusText = {
- online: "Online",
- idle: "Idle",
- dnd: "Do Not Disturb",
- offline: "Offline",
- };
-
- const statusSection = document.getElementById("discord-status");
- const statusTextElement = document.getElementById("status-text");
-
- statusSection.style.backgroundColor = statusColors[discordStatus];
- statusTextElement.textContent = statusText[discordStatus];
- })
- .catch(error => console.error(error));
-</script> \ No newline at end of file
diff --git a/src/components/Header.astro b/src/components/Header.astro
index dac9a78..9089797 100644
--- a/src/components/Header.astro
+++ b/src/components/Header.astro
@@ -9,7 +9,7 @@
</nav>
<img
id="profilePic"
- src="https://files.pinapelz.com/21994085.png"
+ src="/pfp.png"
alt="Profile Picture"
/>
</header>
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro
index 8d6bb61..59126b3 100644
--- a/src/layouts/Layout.astro
+++ b/src/layouts/Layout.astro
@@ -5,6 +5,7 @@ interface Props {
const { title } = Astro.props;
import Header from "../components/Header.astro";
+import "../styles/global.css";
---
<!doctype html>
diff --git a/src/pages/about.astro b/src/pages/about.astro
index 2a2b720..da121e5 100644
--- a/src/pages/about.astro
+++ b/src/pages/about.astro
@@ -1,6 +1,5 @@
---
import Layout from "../layouts/Layout.astro";
-import DiscordStatus from "../components/DiscordStatus.astro";
---
<Layout title="About">
@@ -33,13 +32,10 @@ import DiscordStatus from "../components/DiscordStatus.astro";
>
Contact Me
</a>
- <a href="https://discord.com/users/246787839570739211">
- <DiscordStatus />
- </a>
</div>
</div>
<img
- src="https://files.pinapelz.com/21994085.png"
+ src="/pfp.png"
width="400"
height="400"
alt="pinapelz profile pic"
@@ -196,7 +192,7 @@ import DiscordStatus from "../components/DiscordStatus.astro";
</div>
</div>
- <p class="text-gray-400 text-xl font-bold mt-24">
+ <p class="text-gray-400 text-xl font-bold">
Front End Technologies:
</p>
@@ -303,7 +299,7 @@ import DiscordStatus from "../components/DiscordStatus.astro";
</svg>
</div>
- <p class="text-gray-400 text-xl font-bold mt-24">Dev Ops:</p>
+ <p class="text-gray-400 text-xl font-bold">Dev Ops:</p>
<div class="svg-container">
<svg
@@ -347,6 +343,63 @@ import DiscordStatus from "../components/DiscordStatus.astro";
</div>
</div>
</div>
+ <div class="container px-4 md:px-6 mx-auto mt-16">
+ <section class="interests-panel" aria-labelledby="interests-heading">
+ <div class="interests-intro">
+ <p class="eyebrow">More About Me</p>
+ <h2 id="interests-heading">Personal Interests</h2>
+ <p>
+ I enjoy exploring ideas that blend technical curiosity with creative
+ problem-solving. Most of the projects I build start from my own hobbies
+ and interests turning "what if"
+ ideas into software that I genuinely find useful. So here's a glance at
+ my personal hobbies/interests.
+ </p>
+ </div>
+
+ <div class="interests-grid">
+ <article class="interest-card">
+ <span class="interest-number">01</span>
+ <h3>Self-Hosting</h3>
+ <p>
+ I'm interested in software that gives people ownership over their data and
+ communities. From running personal services to exploring decentralized
+ platforms like Matrix, I enjoy learning how independent systems work.
+ </p>
+ </article>
+
+ <article class="interest-card">
+ <span class="interest-number">02</span>
+ <h3>Linux</h3>
+ <p>
+ Arch Linux has been my daily driver for years. I enjoy customizing my
+ environment, understanding how systems work under the hood, and exploring
+ the open-source ecosystem.
+ </p>
+ </article>
+
+ <article class="interest-card">
+ <span class="interest-number">03</span>
+ <h3>Gaming</h3>
+ <p>
+ MMOs (FFXIV), visual novels (AI: The Sommnium Files), and JRPGs (Persona) are some of my favorite genres. I'm drawn to
+ games with rich worlds and systems that encourage
+ long-term progression and discovery. I also particularly enjoy rhythm games, ones that are entirely skill based (SDVX).
+ </p>
+ </article>
+
+ <article class="interest-card">
+ <span class="interest-number">04</span>
+ <h3>Anime & K-Pop</h3>
+ <p>
+ I've always enjoyed being part of online fandom communities. Following new
+ releases, discussions, and fan-created content has inspired several ideas
+ for projects and community-focused tools. (NMIXX, Slice of Life Anime)
+ </p>
+ </article>
+ </div>
+ </section>
+ </div>
</section>
<style>
.svg-container {
@@ -359,5 +412,133 @@ import DiscordStatus from "../components/DiscordStatus.astro";
width: 75px;
height: 75px;
}
+
+ .interests-panel {
+ position: relative;
+ overflow: hidden;
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ border-radius: 2rem;
+ padding: clamp(1.5rem, 4vw, 3rem);
+ background:
+ radial-gradient(circle at top left, rgba(204, 102, 102, 0.35), transparent 34rem),
+ linear-gradient(135deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.03));
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.28);
+ }
+
+ .interests-panel::before {
+ content: "";
+ position: absolute;
+ inset: 1rem;
+ pointer-events: none;
+ border: 1px dashed rgba(255, 255, 255, 0.14);
+ border-radius: 1.5rem;
+ }
+
+ .interests-intro {
+ position: relative;
+ max-width: 680px;
+ margin-bottom: 2rem;
+ color: white;
+ }
+
+ .interests-intro .eyebrow {
+ width: fit-content;
+ margin-bottom: 0.75rem;
+ border-radius: 999px;
+ background: rgba(204, 102, 102, 0.16);
+ padding: 0.35rem 0.85rem;
+ color: #ffb3b3;
+ font-size: 0.78rem;
+ font-weight: 700;
+ letter-spacing: 0.16em;
+ text-transform: uppercase;
+ }
+
+ .interests-intro h2 {
+ font-size: clamp(2.25rem, 6vw, 4.75rem);
+ font-weight: 800;
+ line-height: 0.95;
+ letter-spacing: -0.06em;
+ }
+
+ .interests-intro p:not(.eyebrow) {
+ margin-top: 1rem;
+ color: rgba(255, 255, 255, 0.72);
+ font-size: 1.05rem;
+ line-height: 1.8;
+ }
+
+ .interests-grid {
+ position: relative;
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 1rem;
+ }
+
+ .interest-card {
+ min-height: 230px;
+ border-radius: 1.35rem;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ background: rgba(19, 21, 26, 0.78);
+ padding: 1.25rem;
+ color: white;
+ transition:
+ transform 180ms ease,
+ border-color 180ms ease,
+ background 180ms ease;
+ }
+
+ .interest-card:nth-child(even) {
+ transform: translateY(1.25rem);
+ }
+
+ .interest-card:hover {
+ transform: translateY(-0.35rem);
+ border-color: rgba(255, 179, 179, 0.42);
+ background: rgba(35, 24, 29, 0.9);
+ }
+
+ .interest-card:nth-child(even):hover {
+ transform: translateY(0.85rem);
+ }
+
+ .interest-number {
+ display: inline-flex;
+ margin-bottom: 3.5rem;
+ color: #cc6666;
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-size: 0.9rem;
+ font-weight: 800;
+ }
+
+ .interest-card h3 {
+ margin-bottom: 0.65rem;
+ font-size: 1.25rem;
+ font-weight: 800;
+ letter-spacing: -0.03em;
+ }
+
+ .interest-card p {
+ color: rgba(255, 255, 255, 0.64);
+ font-size: 0.95rem;
+ line-height: 1.7;
+ }
+
+ @media (max-width: 1024px) {
+ .interests-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+ }
+
+ @media (max-width: 640px) {
+ .interests-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .interest-card:nth-child(even),
+ .interest-card:nth-child(even):hover {
+ transform: none;
+ }
+ }
</style>
</Layout>
diff --git a/src/pages/index.astro b/src/pages/index.astro
index dea00f2..68d8a2c 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -1,137 +1,138 @@
---
import Layout from "../layouts/Layout.astro";
-import SocialNavbar from '../components/SocialNavbar.astro';
+import SocialNavbar from "../components/SocialNavbar.astro";
import ShapesBackground from "../components/ShapesBackground.astro";
---
<Layout title="Pinapelz">
- <div class="center-wrapper">
- <main>
- <h1 class="welcome-message">
- <span class="welcome-text-gradient">Welcome</span> 👋
- </h1>
- <p class="introduction">
- I'm <span class="text-gradient">Yukai Shan</span>, a Software Engineering
- student at UC Irvine
- </p>
- <p class="introduction">
- Sometimes I make cool things. Feel free to go and check them out!
- </p>
- <SocialNavbar/>
- </main>
- </div>
- <ShapesBackground/>
- <script>
+ <div class="center-wrapper">
+ <main>
+ <h1 class="welcome-message">
+ <span class="welcome-text-gradient">Welcome</span> 👋
+ </h1>
+ <p class="introduction">
+ I'm <span class="text-gradient">Pinapelz</span>, a Software
+ Engineering graduate passionate about open-source software and
+ building fun and interesting things.
+ </p>
+ <p class="introduction">Some of them even work.</p>
+ </main>
+ <SocialNavbar />
+ </div>
+</Layout>
+<ShapesBackground />
+<script>
const welcomeMessages = [
- 'print("Hello World")',
- "Hello there",
- "Bonjour",
- "こにちは",
- "你好",
- "Ahoy!",
+ 'print("Hello World")',
+ "Hello there",
+ "Bonjour",
+ "こにちは",
+ "你好",
+ "Ahoy!",
];
let currentIndex = 0;
const h1 = document.querySelector(
- "h1.welcome-message span.welcome-text-gradient"
+ "h1.welcome-message span.welcome-text-gradient",
);
function typeMessage(message) {
- let i = 0;
- h1.textContent = "";
- const interval = setInterval(() => {
- if (i < message.length) {
- h1.textContent += message[i];
- i++;
- } else {
- clearInterval(interval);
- currentIndex = (currentIndex + 1) % welcomeMessages.length;
- setTimeout(() => {
- h1.classList.add("slide-out");
- setTimeout(() => {
- typeMessage(welcomeMessages[currentIndex]);
- h1.classList.remove("slide-out");
- }, 1000);
- }, 3000);
- }
- }, 100);
+ let i = 0;
+ h1.textContent = "";
+ const interval = setInterval(() => {
+ if (i < message.length) {
+ h1.textContent += message[i];
+ i++;
+ } else {
+ clearInterval(interval);
+ currentIndex = (currentIndex + 1) % welcomeMessages.length;
+ setTimeout(() => {
+ h1.classList.add("slide-out");
+ setTimeout(() => {
+ typeMessage(welcomeMessages[currentIndex]);
+ h1.classList.remove("slide-out");
+ }, 1000);
+ }, 3000);
+ }
+ }, 100);
}
typeMessage(welcomeMessages[currentIndex]);
- </script>
-</Layout>
+</script>
+
<style>
- @import url("https://fonts.googleapis.com/css?family=Noto:400,700");
+ @import url("https://fonts.googleapis.com/css?family=Noto:400,700");
- * {
- margin: 0px;
- padding: 0px;
- }
+ * {
+ margin: 0px;
+ padding: 0px;
+ }
- body {
- font-family: "Noto", sans-serif;
- height: 100%;
- }
- main {
- margin: auto;
- padding: 1rem;
- width: 800px;
- max-width: calc(100% - 2rem);
- color: white;
- font-size: 20px;
- line-height: 1.6;
- }
- .astro-a {
- position: absolute;
- top: -32px;
- left: 50%;
- transform: translatex(-50%);
- width: 220px;
- height: auto;
- z-index: -1;
- }
- h1 {
- font-size: 3.5rem;
- font-weight: 700;
- line-height: 1;
- text-align: center;
- margin-bottom: 1em;
- transition: transform 0.3s ease-in-out;
- }
+ body {
+ font-family: "Noto", sans-serif;
+ height: 100%;
+ }
+ main {
+ margin: 0 auto;
+ padding: 1rem;
+ width: 800px;
+ max-width: calc(100% - 2rem);
+ color: white;
+ font-size: 20px;
+ line-height: 1.6;
+ }
+ .astro-a {
+ position: absolute;
+ top: -32px;
+ left: 50%;
+ transform: translatex(-50%);
+ width: 220px;
+ height: auto;
+ z-index: -1;
+ }
+ h1 {
+ font-size: 3.5rem;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ margin-bottom: 1em;
+ transition: transform 0.3s ease-in-out;
+ }
- h1:hover {
- transform: scale(1.1);
- }
- .welcome-text-gradient {
- background-image: var(--accent-gradient-purp);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-size: 400%;
- background-position: 0%;
- transition: background-position 0.3s ease-in-out;
- }
- .text-gradient {
- background-image: var(--accent-gradient);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-size: 400%;
- background-position: 0%;
- transition: background-position 0.3s ease-in-out;
- }
- .slide-out {
- transform: translateX(-100%);
- transition: transform 0.5s ease-in-out;
- }
- .introduction {
- font-size: 1.5rem;
- text-align: center;
- color: #ffffffbd;
- }
+ h1:hover {
+ transform: scale(1.1);
+ }
+ .welcome-text-gradient {
+ background-image: var(--accent-gradient-purp);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-size: 400%;
+ background-position: 0%;
+ transition: background-position 0.3s ease-in-out;
+ }
+ .text-gradient {
+ background-image: var(--accent-gradient);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-size: 400%;
+ background-position: 0%;
+ transition: background-position 0.3s ease-in-out;
+ }
+ .slide-out {
+ transform: translateX(-100%);
+ transition: transform 0.5s ease-in-out;
+ }
+ .introduction {
+ font-size: 1.5rem;
+ text-align: center;
+ color: #ffffffbd;
+ }
- .center-wrapper {
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- height: 90vh;
- }
+ .center-wrapper {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ gap: 0.75rem;
+ min-height: 90vh;
+ }
</style>
diff --git a/src/styles/global.css b/src/styles/global.css
new file mode 100644
index 0000000..f1d8c73
--- /dev/null
+++ b/src/styles/global.css
@@ -0,0 +1 @@
+@import "tailwindcss";
diff --git a/tailwind.config.js b/tailwind.config.js
deleted file mode 100644
index b15a05a..0000000
--- a/tailwind.config.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/** @type {import('tailwindcss').Config} */
-export default {
- content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
- theme: {
- extend: {},
- },
- plugins: [],
-} \ No newline at end of file
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage