wow
Some checks failed
/ print-content (push) Failing after 1m44s

This commit is contained in:
암냥 2026-09-05 03:06:34 +09:00
commit f64e9d2e4c
22 changed files with 757 additions and 366 deletions

124
bun.lock
View file

@ -5,6 +5,7 @@
"": { "": {
"name": "imnya-ng", "name": "imnya-ng",
"dependencies": { "dependencies": {
"@sun-typeface/suit": "^2.0.5",
"astro": "7.0.2", "astro": "7.0.2",
"clsx": "^2.1.1", "clsx": "^2.1.1",
}, },
@ -12,7 +13,6 @@
"@biomejs/biome": "2.4.16", "@biomejs/biome": "2.4.16",
"@tailwindcss/vite": "^4.2.2", "@tailwindcss/vite": "^4.2.2",
"tailwindcss": "^4.2.2", "tailwindcss": "^4.2.2",
"tw-animate-css": "^1.4.0",
}, },
}, },
}, },
@ -259,56 +259,6 @@
"@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="],
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.4", "", { "os": "android", "cpu": "arm" }, "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ=="],
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.4", "", { "os": "android", "cpu": "arm64" }, "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw=="],
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA=="],
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg=="],
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g=="],
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw=="],
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.4", "", { "os": "linux", "cpu": "arm" }, "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA=="],
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.4", "", { "os": "linux", "cpu": "arm" }, "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w=="],
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg=="],
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A=="],
"@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.4", "", { "os": "linux", "cpu": "none" }, "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ=="],
"@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.4", "", { "os": "linux", "cpu": "none" }, "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw=="],
"@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg=="],
"@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A=="],
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.4", "", { "os": "linux", "cpu": "none" }, "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA=="],
"@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.4", "", { "os": "linux", "cpu": "none" }, "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw=="],
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ=="],
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ=="],
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg=="],
"@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA=="],
"@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.4", "", { "os": "none", "cpu": "arm64" }, "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg=="],
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw=="],
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA=="],
"@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.4", "", { "os": "win32", "cpu": "x64" }, "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw=="],
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.4", "", { "os": "win32", "cpu": "x64" }, "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw=="],
"@shikijs/core": ["@shikijs/core@4.1.0", "", { "dependencies": { "@shikijs/primitive": "4.1.0", "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ=="], "@shikijs/core": ["@shikijs/core@4.1.0", "", { "dependencies": { "@shikijs/primitive": "4.1.0", "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ=="],
"@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.1.0", "", { "dependencies": { "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ=="], "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.1.0", "", { "dependencies": { "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ=="],
@ -325,6 +275,8 @@
"@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
"@sun-typeface/suit": ["@sun-typeface/suit@2.0.5", "", {}, "sha512-NJ0hxmQgDjDBFkocQ7rxx3wPahJbj3uATfXudN3oj6hh/rAedElhdYBbsSwz4qJsdjac6aW6cqK6R1bpsNGOaQ=="],
"@tailwindcss/node": ["@tailwindcss/node@4.3.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.21.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.0" } }, "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g=="], "@tailwindcss/node": ["@tailwindcss/node@4.3.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.21.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.0" } }, "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g=="],
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.0", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.0", "@tailwindcss/oxide-darwin-arm64": "4.3.0", "@tailwindcss/oxide-darwin-x64": "4.3.0", "@tailwindcss/oxide-freebsd-x64": "4.3.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", "@tailwindcss/oxide-linux-x64-musl": "4.3.0", "@tailwindcss/oxide-wasm32-wasi": "4.3.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" } }, "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg=="], "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.0", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.0", "@tailwindcss/oxide-darwin-arm64": "4.3.0", "@tailwindcss/oxide-darwin-x64": "4.3.0", "@tailwindcss/oxide-freebsd-x64": "4.3.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", "@tailwindcss/oxide-linux-x64-musl": "4.3.0", "@tailwindcss/oxide-wasm32-wasi": "4.3.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" } }, "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg=="],
@ -367,8 +319,6 @@
"@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
"@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="],
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="],
@ -633,8 +583,6 @@
"rolldown": ["rolldown@1.1.3", "", { "dependencies": { "@oxc-project/types": "=0.137.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.3", "@rolldown/binding-darwin-arm64": "1.1.3", "@rolldown/binding-darwin-x64": "1.1.3", "@rolldown/binding-freebsd-x64": "1.1.3", "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", "@rolldown/binding-linux-arm64-gnu": "1.1.3", "@rolldown/binding-linux-arm64-musl": "1.1.3", "@rolldown/binding-linux-ppc64-gnu": "1.1.3", "@rolldown/binding-linux-s390x-gnu": "1.1.3", "@rolldown/binding-linux-x64-gnu": "1.1.3", "@rolldown/binding-linux-x64-musl": "1.1.3", "@rolldown/binding-openharmony-arm64": "1.1.3", "@rolldown/binding-wasm32-wasi": "1.1.3", "@rolldown/binding-win32-arm64-msvc": "1.1.3", "@rolldown/binding-win32-x64-msvc": "1.1.3" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g=="], "rolldown": ["rolldown@1.1.3", "", { "dependencies": { "@oxc-project/types": "=0.137.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.3", "@rolldown/binding-darwin-arm64": "1.1.3", "@rolldown/binding-darwin-x64": "1.1.3", "@rolldown/binding-freebsd-x64": "1.1.3", "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", "@rolldown/binding-linux-arm64-gnu": "1.1.3", "@rolldown/binding-linux-arm64-musl": "1.1.3", "@rolldown/binding-linux-ppc64-gnu": "1.1.3", "@rolldown/binding-linux-s390x-gnu": "1.1.3", "@rolldown/binding-linux-x64-gnu": "1.1.3", "@rolldown/binding-linux-x64-musl": "1.1.3", "@rolldown/binding-openharmony-arm64": "1.1.3", "@rolldown/binding-wasm32-wasi": "1.1.3", "@rolldown/binding-win32-arm64-msvc": "1.1.3", "@rolldown/binding-win32-x64-msvc": "1.1.3" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g=="],
"rollup": ["rollup@4.60.4", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.4", "@rollup/rollup-android-arm64": "4.60.4", "@rollup/rollup-darwin-arm64": "4.60.4", "@rollup/rollup-darwin-x64": "4.60.4", "@rollup/rollup-freebsd-arm64": "4.60.4", "@rollup/rollup-freebsd-x64": "4.60.4", "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", "@rollup/rollup-linux-arm-musleabihf": "4.60.4", "@rollup/rollup-linux-arm64-gnu": "4.60.4", "@rollup/rollup-linux-arm64-musl": "4.60.4", "@rollup/rollup-linux-loong64-gnu": "4.60.4", "@rollup/rollup-linux-loong64-musl": "4.60.4", "@rollup/rollup-linux-ppc64-gnu": "4.60.4", "@rollup/rollup-linux-ppc64-musl": "4.60.4", "@rollup/rollup-linux-riscv64-gnu": "4.60.4", "@rollup/rollup-linux-riscv64-musl": "4.60.4", "@rollup/rollup-linux-s390x-gnu": "4.60.4", "@rollup/rollup-linux-x64-gnu": "4.60.4", "@rollup/rollup-linux-x64-musl": "4.60.4", "@rollup/rollup-openbsd-x64": "4.60.4", "@rollup/rollup-openharmony-arm64": "4.60.4", "@rollup/rollup-win32-arm64-msvc": "4.60.4", "@rollup/rollup-win32-ia32-msvc": "4.60.4", "@rollup/rollup-win32-x64-gnu": "4.60.4", "@rollup/rollup-win32-x64-msvc": "4.60.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g=="],
"satteri": ["satteri@0.9.2", "", { "dependencies": { "@types/estree-jsx": "^1.0.5", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3" }, "optionalDependencies": { "@bruits/satteri-darwin-arm64": "0.9.2", "@bruits/satteri-darwin-x64": "0.9.2", "@bruits/satteri-linux-arm64-gnu": "0.9.2", "@bruits/satteri-linux-arm64-musl": "0.9.2", "@bruits/satteri-linux-x64-gnu": "0.9.2", "@bruits/satteri-linux-x64-musl": "0.9.2", "@bruits/satteri-wasm32-wasi": "0.9.2", "@bruits/satteri-win32-arm64-msvc": "0.9.2", "@bruits/satteri-win32-x64-msvc": "0.9.2" } }, "sha512-IDJTE5SzEg9PqtdZEToQ3bjlfQ/zM+/HNaBFrwPdZbtk9IL1RWVFvzR8EMIrC0JYybJNKZS8FL45GNSAMX/6Xg=="], "satteri": ["satteri@0.9.2", "", { "dependencies": { "@types/estree-jsx": "^1.0.5", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3" }, "optionalDependencies": { "@bruits/satteri-darwin-arm64": "0.9.2", "@bruits/satteri-darwin-x64": "0.9.2", "@bruits/satteri-linux-arm64-gnu": "0.9.2", "@bruits/satteri-linux-arm64-musl": "0.9.2", "@bruits/satteri-linux-x64-gnu": "0.9.2", "@bruits/satteri-linux-x64-musl": "0.9.2", "@bruits/satteri-wasm32-wasi": "0.9.2", "@bruits/satteri-win32-arm64-msvc": "0.9.2", "@bruits/satteri-win32-x64-msvc": "0.9.2" } }, "sha512-IDJTE5SzEg9PqtdZEToQ3bjlfQ/zM+/HNaBFrwPdZbtk9IL1RWVFvzR8EMIrC0JYybJNKZS8FL45GNSAMX/6Xg=="],
"sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="],
@ -675,16 +623,12 @@
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
"ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
"ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
"uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
"undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="],
"unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
"unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], "unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="],
@ -707,7 +651,7 @@
"vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
"vite": ["vite@7.3.3", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA=="], "vite": ["vite@8.1.0", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "~1.1.2", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q=="],
"vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
@ -743,72 +687,14 @@
"anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
"astro/vite": ["vite@8.1.0", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "~1.1.2", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q=="],
"csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
"dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
"is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
"rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "vite/tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
"vite/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
"astro/vite/tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
"csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
"vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
"vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
"vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
"vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
"vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
"vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
"vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
"vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
"vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
"vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
"vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
"vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
"vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
"vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
"vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
"vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
"vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
"vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
"vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
"vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
"vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
"vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
"vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
"vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
"vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
"vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
} }
} }

View file

@ -12,14 +12,14 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@sun-typeface/suit": "^2.0.5",
"astro": "7.0.2", "astro": "7.0.2",
"clsx": "^2.1.1" "clsx": "^2.1.1"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "2.4.16", "@biomejs/biome": "2.4.16",
"@tailwindcss/vite": "^4.2.2", "@tailwindcss/vite": "^4.2.2",
"tailwindcss": "^4.2.2", "tailwindcss": "^4.2.2"
"tw-animate-css": "^1.4.0"
}, },
"overrides": { "overrides": {
"@types/react": "19.2.2", "@types/react": "19.2.2",

9
public/about/adofai.svg Normal file
View file

@ -0,0 +1,9 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="20.0049" height="20.0049" viewBox="0 0 20.0049 20.0049" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group">
<path id="Vector" d="M3.84244 2.12244C-0.509561 5.52452 -1.27963 11.8104 2.12244 16.1624C5.52452 20.5145 11.8104 21.2845 16.1624 17.8825C20.5144 14.4804 21.2846 8.19445 17.8824 3.84244C14.4804 -0.50956 8.19444 -1.27963 3.84244 2.12244Z" fill="#0B192B"/>
<path id="Vector_2" opacity="0.35" d="M5.96911 4.15762C6.14042 4.00564 6.33486 3.88475 6.54426 3.80004C6.68012 3.70562 6.82646 3.62887 6.97999 3.57152C7.14349 3.48379 7.31769 3.42005 7.49766 3.38212C7.68044 3.28735 7.87587 3.22227 8.07719 3.18912C8.21214 3.14077 8.35157 3.1076 8.49312 3.09019C8.61151 3.05892 8.73234 3.03907 8.85409 3.03089C8.99391 3.00205 9.13617 2.98887 9.27851 2.99159C9.47989 2.95852 9.68476 2.95777 9.88604 2.98937C10.1089 2.96309 10.3343 2.97614 10.5527 3.02797C10.7153 3.02887 10.8772 3.05055 11.0346 3.09252C11.2167 3.11517 11.3948 3.16397 11.5639 3.23755C11.8878 3.28215 12.1958 3.40969 12.4605 3.60882C12.7252 3.80797 12.9385 4.07257 13.0814 4.37914C13.2243 4.68572 13.2924 5.0248 13.2797 5.36632C13.2669 5.70784 13.1738 6.04122 13.0084 6.3369C12.7645 6.77269 12.3778 7.10179 11.9203 7.26286C11.4629 7.42394 10.9658 7.40602 10.5217 7.21245C10.4433 7.2016 10.3656 7.18594 10.289 7.16557C10.2195 7.15687 10.1504 7.14436 10.0822 7.12806C9.98562 7.12764 9.88926 7.11979 9.79386 7.1046C9.70654 7.115 9.61871 7.11936 9.53092 7.11762C9.47044 7.12781 9.40966 7.13489 9.34857 7.13892C9.29651 7.14959 9.24392 7.15827 9.19131 7.1648C9.13202 7.18044 9.07211 7.19324 9.01156 7.2032C8.92839 7.233 8.84349 7.25707 8.75736 7.27524C8.68637 7.31209 8.61341 7.34456 8.53881 7.37246C8.47629 7.40591 8.41216 7.43594 8.34667 7.46242C8.26606 7.51842 8.18171 7.56827 8.09427 7.61159C8.02722 7.67126 7.95647 7.72619 7.88249 7.77606C7.83752 7.81959 7.79064 7.86112 7.74214 7.90006C7.70467 7.93944 7.66547 7.97721 7.62517 8.01339C7.59011 8.05422 7.55359 8.09344 7.51559 8.13105C7.46577 8.19545 7.41237 8.25672 7.35566 8.31455C7.31514 8.38575 7.27062 8.45439 7.22237 8.52012C7.18721 8.58369 7.14891 8.6453 7.10761 8.70472C7.06904 8.79742 7.02404 8.88709 6.97297 8.973C6.94759 9.061 6.91671 9.14721 6.88051 9.23104C6.86527 9.29289 6.84749 9.35437 6.82691 9.41464C6.81589 9.46877 6.80292 9.52262 6.78756 9.57589C6.74456 9.8566 6.64694 10.1254 6.50074 10.3656C6.35454 10.6059 6.16287 10.8125 5.93759 10.9726C5.71232 11.1327 5.45824 11.243 5.19107 11.2966C4.92389 11.3502 4.64932 11.346 4.38432 11.2842C4.11934 11.2225 3.86959 11.1044 3.65051 10.9375C3.43144 10.7705 3.24772 10.5582 3.11071 10.3136C2.97371 10.069 2.88632 9.79734 2.85399 9.51547C2.82166 9.2336 2.84504 8.9475 2.92272 8.67487C2.94202 8.54885 2.97234 8.4249 3.01327 8.30455C3.04314 8.15892 3.08774 8.01697 3.14634 7.88107C3.19686 7.67456 3.27722 7.47715 3.38467 7.2957C3.44959 7.07112 3.55021 6.85939 3.68229 6.66941C3.74741 6.51314 3.83056 6.3657 3.92987 6.23039C4.02181 6.06402 4.13519 5.91157 4.26679 5.77734C4.36082 5.6123 4.47607 5.46149 4.60931 5.3291C4.68616 5.22989 4.77149 5.13817 4.86422 5.0551C4.94602 4.96009 5.03594 4.87305 5.13284 4.79509C5.23362 4.68957 5.34486 4.59555 5.46464 4.51465C5.61447 4.36955 5.78454 4.24914 5.96894 4.15759L5.96911 4.15762Z" fill="#E65836"/>
<path id="Vector_3" d="M6.24429 11.4535C7.09794 10.7321 7.20632 9.45646 6.48637 8.60422C5.76642 7.75199 4.49076 7.64591 3.63711 8.36727C2.78346 9.08866 2.67507 10.3643 3.39502 11.2165C4.11497 12.0688 5.39064 12.1749 6.24429 11.4535Z" fill="#E65836"/>
<path id="Vector_4" opacity="0.35" d="M7.82567 12.8515C8.08254 12.7149 8.36447 12.6383 8.65189 12.6269C8.93931 12.6155 9.22534 12.6696 9.49014 12.7854C9.56832 12.7962 9.64579 12.8119 9.72216 12.8322C9.79187 12.8409 9.86109 12.8534 9.92951 12.8697C10.0262 12.8702 10.1227 12.878 10.2182 12.893C10.3055 12.8827 10.3932 12.8784 10.4809 12.8802C10.5413 12.8701 10.602 12.863 10.663 12.8589C10.7152 12.8482 10.7676 12.8395 10.8202 12.8331C10.8794 12.8175 10.9391 12.8047 10.9995 12.7948C11.0828 12.7649 11.1679 12.7407 11.2543 12.7225C11.3251 12.6858 11.3978 12.6535 11.4722 12.6257C11.5349 12.5921 11.5992 12.562 11.6648 12.5355C11.7455 12.4794 11.83 12.4295 11.9175 12.3861C11.9845 12.3266 12.0552 12.2717 12.1291 12.2218C12.1741 12.1782 12.2209 12.1369 12.2693 12.0979C12.3068 12.0585 12.3458 12.0207 12.3862 11.9846C12.4213 11.9438 12.4578 11.9046 12.4957 11.867C12.5456 11.8025 12.5991 11.7412 12.6559 11.6833C12.6963 11.6123 12.7407 11.5439 12.7888 11.4782C12.824 11.4145 12.8624 11.3528 12.9038 11.2932C12.9424 11.2004 12.9874 11.1106 13.0385 11.0246C13.0639 10.9366 13.0948 10.8504 13.131 10.7666C13.146 10.7046 13.1639 10.6435 13.1843 10.5832C13.1955 10.5289 13.2086 10.4752 13.2237 10.4219C13.3049 9.88759 13.5827 9.40659 13.9976 9.08167C14.0258 9.05961 14.0547 9.03822 14.0843 9.01752C14.4243 8.77919 14.8257 8.65579 15.234 8.66414C15.6423 8.67249 16.0376 8.81219 16.366 9.0642C16.6944 9.31622 16.9399 9.66829 17.0692 10.0725C17.1986 10.4767 17.2052 10.9133 17.0886 11.323C17.0692 11.4491 17.0389 11.5731 16.9981 11.6935C16.9682 11.839 16.9236 11.9809 16.8651 12.1167C16.8146 12.3233 16.7342 12.5208 16.6267 12.7023C16.5617 12.9271 16.4609 13.139 16.3287 13.3291C16.2638 13.4849 16.1809 13.632 16.0819 13.767C15.9899 13.9337 15.8764 14.0864 15.7446 14.2209C15.6505 14.386 15.5351 14.537 15.4017 14.6694C15.325 14.7684 15.2399 14.8598 15.1474 14.9427C15.0655 15.0377 14.9756 15.1248 14.8787 15.2028C14.7779 15.3083 14.6666 15.4023 14.5468 15.4832C14.397 15.6284 14.2269 15.7488 14.0425 15.8404C13.871 15.9925 13.6764 16.1135 13.4668 16.1983C13.3313 16.2924 13.1853 16.369 13.0322 16.4262C12.8685 16.5141 12.6941 16.5779 12.5139 16.6159C12.3309 16.7108 12.1352 16.776 11.9335 16.8091C11.7989 16.8573 11.6598 16.8903 11.5187 16.9076C11.4002 16.9388 11.2794 16.9588 11.1576 16.9671C11.0179 16.996 10.8757 17.0091 10.7334 17.0065C10.5319 17.0396 10.3269 17.0403 10.1256 17.0086C9.90251 17.035 9.67696 17.022 9.45846 16.9698C9.29614 16.969 9.13462 16.9475 8.97752 16.9055C8.79522 16.883 8.61691 16.8341 8.44764 16.7605C8.02719 16.703 7.63609 16.5063 7.33164 16.199C7.02721 15.8917 6.82542 15.4901 6.75587 15.0531C6.68634 14.616 6.75267 14.1664 6.94519 13.7702C7.13771 13.374 7.44629 13.0521 7.82567 12.8515Z" fill="#7DABFF"/>
<path id="Vector_5" d="M16.3749 11.6303C17.2286 10.909 17.3369 9.6333 16.6169 8.78107C15.897 7.92884 14.6213 7.82275 13.7677 8.54414C12.914 9.2655 12.8056 10.5412 13.5256 11.3934C14.2456 12.2456 15.5212 12.3517 16.3749 11.6303Z" fill="#7DABFF"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="13" height="24" viewBox="0 0 13 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 2085664223">
<path id="-" d="M13 13H1V11H13V13Z" fill="black"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 255 B

22
public/about/contest.svg Normal file
View file

@ -0,0 +1,22 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="20" height="11" viewBox="0 0 20 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 664 1" clip-path="url(#clip0_0_9)">
<path id="Vector" d="M5.018 0.625758L6.5517 2.10178L5.90152 2.72754L4.36781 1.25152L1.7602 3.76107H4.24978V4.64606H1.7602L4.36781 7.15562L5.90152 5.6796L6.5517 6.30535L5.018 7.78138L4.36781 8.40713L3.71759 7.78138L0.650211 4.82932L0 4.20357L0.650211 3.57781L3.71759 0.625758L4.36781 0L5.018 0.625758Z" fill="black"/>
<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M13.2544 4.20357L16.3218 1.25153L18.6996 3.53985H20L16.972 0.625765L16.3218 0L15.6716 0.625765L12.6042 3.57781L11.954 4.20357L12.6042 4.82932L15.6716 7.78138L16.3218 8.40713L16.972 7.78138L20 4.8673H18.6996L16.3218 7.15562L13.2544 4.20357Z" fill="black"/>
<path id="Vector_3" fill-rule="evenodd" clip-rule="evenodd" d="M10.3448 1.25153L7.27741 4.20357L8.25611 5.14547L11.3235 2.19343L10.3448 1.25153ZM12.5287 2.10179L12.6239 2.19342L8.90633 5.77123L10.3448 7.15562L10.844 6.67518L11.4942 7.30094L10.995 7.78138L10.3448 8.40713L9.69459 7.78138L6.62722 4.82932L5.977 4.20357L6.62722 3.57781L9.69459 0.625765L10.3448 0L10.995 0.625765L11.9737 1.56766L12.5287 2.10179Z" fill="black"/>
<path id="Vector_4" d="M1.65638 10.0178L1.36777 9.74006L1.07915 10.0178L1.36777 10.2956L1.65638 10.0178Z" fill="black"/>
<path id="Vector_5" d="M4.06008 10.0179L3.64526 9.61858L3.23044 10.0179L3.64526 10.4171L4.06008 10.0179Z" stroke="black" stroke-width="0.1"/>
<path id="Vector_6" d="M16.7695 10.0179L16.3547 9.61858L15.9398 10.0179L16.3547 10.4171L16.7695 10.0179Z" stroke="black" stroke-width="0.1"/>
<path id="Vector_7" d="M18.9208 10.0178L18.6322 9.74006L18.3436 10.0178L18.6322 10.2956L18.9208 10.0178Z" fill="black"/>
<path id="Vector_8" d="M13.7408 10.7922C13.6275 10.7922 13.527 10.7689 13.4392 10.7224C13.3515 10.6758 13.2831 10.6113 13.234 10.5289C13.185 10.4458 13.1604 10.3526 13.1604 10.2496C13.1604 10.1452 13.1846 10.0517 13.233 9.96927C13.282 9.88683 13.3491 9.82264 13.434 9.77676C13.519 9.73023 13.6151 9.70695 13.7221 9.70695C13.8286 9.70695 13.9229 9.73023 14.0051 9.77676C14.088 9.82264 14.1522 9.88683 14.1979 9.96927C14.2441 10.0517 14.2673 10.1452 14.2673 10.2496C14.2673 10.2775 14.2649 10.3081 14.26 10.3414H13.3335V10.1249H13.9833L13.9678 10.1558C13.9678 10.1146 13.9574 10.0777 13.9367 10.0451C13.9166 10.0119 13.888 9.9859 13.8507 9.96728C13.8133 9.94799 13.7705 9.93834 13.7221 9.93834C13.671 9.93834 13.6247 9.94966 13.5833 9.97227C13.5425 9.99423 13.5104 10.0255 13.4869 10.066C13.4641 10.1059 13.4527 10.1521 13.4527 10.2047V10.2855C13.4527 10.3394 13.4651 10.3872 13.49 10.4291C13.5149 10.4704 13.5494 10.5026 13.5936 10.5259C13.6379 10.5491 13.6873 10.5608 13.7419 10.5608C13.7971 10.5608 13.8441 10.5495 13.8828 10.5269C13.9215 10.5043 13.9512 10.473 13.9719 10.4331L14.2279 10.5239C14.1844 10.6077 14.1208 10.6735 14.0372 10.7214C13.9536 10.7686 13.8548 10.7922 13.7408 10.7922Z" fill="black"/>
<path id="Vector_9" d="M12.1551 9.31992H12.4495V10.7643H12.1551V9.31992Z" fill="black"/>
<path id="Vector_10" d="M11.1686 10.2496C11.1686 10.3706 11.1531 10.4714 11.122 10.5518C11.0909 10.6323 11.0456 10.6925 10.9862 10.7324C10.9275 10.7723 10.8556 10.7922 10.7706 10.7922C10.6753 10.7922 10.5896 10.7686 10.5136 10.7214C10.4376 10.6742 10.3782 10.6093 10.3354 10.5269C10.2926 10.4437 10.2711 10.3513 10.2711 10.2496C10.2711 10.1472 10.2926 10.0547 10.3354 9.97227C10.3782 9.88982 10.4376 9.82499 10.5136 9.77775C10.5896 9.73055 10.6753 9.70695 10.7706 9.70695C10.8556 9.70695 10.9275 9.72688 10.9862 9.76679C11.0456 9.80602 11.0909 9.86622 11.122 9.94735C11.1531 10.0278 11.1686 10.1285 11.1686 10.2496L11.0629 9.87551H11.1935V10.6236H11.0629L11.1686 10.2496ZM10.8359 10.5329C10.8877 10.5329 10.934 10.5209 10.9748 10.497C11.0156 10.4724 11.0473 10.4388 11.0701 10.3962C11.093 10.353 11.1043 10.3041 11.1043 10.2496C11.1043 10.1944 11.093 10.1455 11.0701 10.1029C11.0473 10.0597 11.0156 10.0261 10.9748 10.0022C10.934 9.97825 10.8877 9.96628 10.8359 9.96628C10.7841 9.96628 10.7378 9.97825 10.6971 10.0022C10.657 10.0261 10.6252 10.0597 10.6017 10.1029C10.5789 10.1455 10.5675 10.1944 10.5675 10.2496C10.5675 10.3034 10.5789 10.352 10.6017 10.3952C10.6252 10.4384 10.657 10.4724 10.6971 10.497C10.7378 10.5209 10.7841 10.5329 10.8359 10.5329ZM11.0961 10.7643V10.5568L11.1427 10.2496L11.0961 9.97625V9.73486H11.3904V10.7643H11.0961Z" fill="black"/>
<path id="Vector_11" d="M8.54456 9.73486H8.83889V10.7643H8.54456V9.73486ZM9.26585 10.2017C9.26585 10.1266 9.24826 10.0687 9.213 10.0281C9.17844 9.9869 9.12974 9.96628 9.06689 9.96628C9.02404 9.96628 8.98537 9.97661 8.95081 9.99722C8.91626 10.0172 8.88896 10.0484 8.86893 10.091C8.84889 10.1329 8.83889 10.1858 8.83889 10.2496L8.8057 10.0581V9.88747H8.87204L8.8057 10.0581C8.8057 9.98889 8.82126 9.92805 8.85237 9.87551C8.88415 9.82232 8.928 9.7811 8.98396 9.75184C9.03993 9.7219 9.10385 9.70695 9.1757 9.70695C9.25585 9.70695 9.32459 9.72489 9.38193 9.76081C9.43996 9.79673 9.48419 9.84824 9.51459 9.91541C9.545 9.98191 9.56019 10.0614 9.56019 10.1538V10.7643H9.26585V10.2017Z" fill="black"/>
<path id="Vector_12" d="M7.48537 9.73486H7.7797V10.7643H7.48537V9.73486ZM7.63252 9.58324C7.60007 9.58324 7.57037 9.57594 7.54341 9.56131C7.51715 9.54668 7.49607 9.52707 7.48018 9.50247C7.465 9.47719 7.45741 9.44893 7.45741 9.41767C7.45741 9.38642 7.465 9.35815 7.48018 9.33288C7.49607 9.30696 7.51715 9.28699 7.54341 9.27304C7.57037 9.25908 7.60007 9.25207 7.63252 9.25207C7.6657 9.25207 7.69574 9.25908 7.7227 9.27304C7.74963 9.28699 7.77037 9.30696 7.78489 9.33288C7.80007 9.35815 7.80767 9.38642 7.80767 9.41767C7.80767 9.44893 7.80007 9.47719 7.78489 9.50247C7.77037 9.52707 7.74963 9.54668 7.7227 9.56131C7.69574 9.57594 7.6657 9.58324 7.63252 9.58324Z" fill="black"/>
<path id="Vector_13" d="M5.79196 9.31992H6.0987V10.7643H5.79196V9.31992ZM6.09456 9.31992H6.74748V9.59723H6.09456V9.31992ZM6.09456 9.92741H6.68115V10.1887H6.09456V9.92741Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_0_9">
<rect width="20" height="11" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 6 KiB

View file

@ -0,0 +1,9 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 2085664221">
<g id="Vector" opacity="0.8">
<path d="M12.8003 11.7172C12.8003 11.7172 6.00206 12.561 6.07298 8.80549C6.15643 4.37508 10.9842 0.94513 14.7785 0C14.7785 0 10.5187 0.778 7.63218 2.68806C4.74565 4.59812 2.41699 7.25939 2.41699 9.51128C2.41699 11.7632 4.76949 12.8545 5.83994 13.0362C6.91039 13.2178 9.14547 13.332 12.8003 11.7172Z" fill="#00A15D"/>
<path d="M3.05347 24C3.05347 24 8.94334 21.9286 13.6215 17.7906C18.2997 13.6525 19.1371 7.27126 9.50897 9.10154C9.50897 9.10154 13.4475 7.50536 16.2917 7.50536C19.1359 7.50536 22.417 8.02946 22.417 11.2509C22.4194 15.6295 13.9195 23.5405 3.05347 24Z" fill="#0167AC"/>
<path d="M20.3158 1.75341C20.9434 2.81559 20.4481 4.2429 19.2096 4.94111C17.971 5.63933 16.4589 5.34526 15.8313 4.28308C15.2037 3.2209 15.7216 1.83145 16.9369 1.09537C17.9943 0.454805 19.6882 0.691233 20.3158 1.75341Z" fill="#F05A20"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,10 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 2085664225">
<g id="Vector" opacity="0.8">
<path d="M22 18.884V22L13.6048 9.56749L13.5498 6.16145L22 18.884Z" fill="#3F3F3F"/>
<path d="M13.6046 9.56749L10.3533 14.3112V11.1837L13.5496 6.16145L13.6046 9.56749Z" fill="black"/>
<path d="M5.00838 16.4022L9.58168 15.4368L9.3296 15.8043L4.61106 17.2037H2L11.3471 2L12.603 4.3573L5.79958 15.1473L5.00838 16.4022Z" fill="black"/>
<path d="M10.3533 14.3112L9.58168 15.4368L5.00838 16.4022L5.79958 15.1473L10.3533 14.3112Z" fill="#3F3F3F"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 679 B

View file

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="13" height="2" viewBox="0 0 13 2" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 2085664223">
<path id="-" d="M12.792 2H0.791992V0H12.792V2Z" fill="black"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 265 B

View file

@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="12.375" height="3.9375" viewBox="0 0 12.375 3.9375" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="~" d="M8.50781 3.9375C8.10156 3.9375 7.73047 3.88281 7.39453 3.77344C7.05859 3.66406 6.76562 3.53516 6.51562 3.38672C6.26562 3.23828 5.96875 3.04688 5.625 2.8125C5.25 2.53125 4.9375 2.32812 4.6875 2.20312C4.4375 2.07812 4.16406 2.01562 3.86719 2.01562C3.53906 2.01562 3.20703 2.13281 2.87109 2.36719C2.53516 2.60156 2.09375 3.04688 1.54688 3.70312L0 2.41406C0.125 2.25781 0.328125 2.02344 0.609375 1.71094C1 1.30469 1.36328 0.976562 1.69922 0.726562C2.03516 0.476562 2.37891 0.292969 2.73047 0.175781C3.08203 0.0585938 3.46094 0 3.86719 0C4.27344 0 4.64453 0.0507812 4.98047 0.152344C5.31641 0.253906 5.61328 0.378906 5.87109 0.527344C6.12891 0.675781 6.42188 0.875 6.75 1.125C7.14062 1.39062 7.46094 1.58984 7.71094 1.72266C7.96094 1.85547 8.22656 1.92188 8.50781 1.92188C8.83594 1.92188 9.16797 1.80078 9.50391 1.55859C9.83984 1.31641 10.2812 0.875 10.8281 0.234375L12.375 1.52344C12.2656 1.66406 12.0625 1.89844 11.7656 2.22656C11.3906 2.61719 11.0312 2.9375 10.6875 3.1875C10.3438 3.4375 9.99609 3.625 9.64453 3.75C9.29297 3.875 8.91406 3.9375 8.50781 3.9375Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

9
public/about/sunrin.svg Normal file
View file

@ -0,0 +1,9 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 2085664220">
<g id="Vector" opacity="0.8">
<path d="M12.3833 11.7172C12.3833 11.7172 5.58507 12.561 5.65599 8.80549C5.73944 4.37508 10.5672 0.94513 14.3615 0C14.3615 0 10.1017 0.778 7.21518 2.68806C4.32865 4.59812 2 7.25939 2 9.51128C2 11.7632 4.35249 12.8545 5.42295 13.0362C6.4934 13.2178 8.72848 13.332 12.3833 11.7172Z" fill="#00A15D"/>
<path d="M2.63647 24C2.63647 24 8.52635 21.9286 13.2045 17.7906C17.8827 13.6525 18.7201 7.27126 9.09198 9.10154C9.09198 9.10154 13.0305 7.50536 15.8747 7.50536C18.7189 7.50536 22 8.02946 22 11.2509C22.0024 15.6295 13.5025 23.5405 2.63647 24Z" fill="#0167AC"/>
<path d="M19.8988 1.75341C20.5264 2.81559 20.0311 4.2429 18.7926 4.94111C17.554 5.63933 16.0419 5.34526 15.4143 4.28308C14.7867 3.2209 15.3046 1.83145 16.5199 1.09537C17.5773 0.454805 19.2712 0.691233 19.8988 1.75341Z" fill="#F05A20"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

BIN
public/about/whitehat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
public/hero-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 MiB

BIN
public/hero-light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

BIN
public/side.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 MiB

149
src/components/About.astro Normal file
View file

@ -0,0 +1,149 @@
---
import ExperienceRow from "@/components/ExperienceRow.astro";
---
<section
id="about"
data-node-id="4:104"
class="min-h-full snap-start snap-always bg-background text-foreground lg:h-full lg:overflow-hidden"
aria-labelledby="about-title"
>
<div class="grid min-h-full grid-cols-1 lg:h-full lg:grid-cols-2">
<div
class="relative z-10 px-6 py-12 sm:px-10 lg:px-[clamp(52px,5.208vw,100px)] lg:py-[clamp(58px,9.26vh,100px)]"
>
<div
class="max-w-[654px] text-[24px] leading-[1.2] tracking-[-0.02em] lg:leading-none"
>
<p id="about-title">저는 이런 것들을 해왔어요.</p>
<section class="mt-[0.75em]" aria-labelledby="security-title">
<h2
id="security-title"
class="text-[inherit] font-bold leading-[inherit]"
>
Information security
</h2>
<div class="mt-[0.5em] flex flex-col gap-[0.34em]">
<ExperienceRow year="2026" connector="wave">
<img
class="h-[1em] w-[1em] shrink-0"
src="/about/layer7-mark.svg"
alt=""
aria-hidden="true"
/>
<span>선린인터넷고등학교 정보보안 동아리</span>
<img
class="h-[1em] w-[1em] shrink-0 [filter:var(--mono-filter)]"
src="/about/layer7-wordmark.svg"
alt=""
aria-hidden="true"
/>
<span>Layer7</span>
</ExperienceRow>
<ExperienceRow year="2026" connector="wave">
<img
class="h-[1em] w-[1em] shrink-0"
src="/about/sunrin.svg"
alt=""
aria-hidden="true"
/>
<span>선린인터넷고등학교 정보보호과</span>
</ExperienceRow>
<ExperienceRow year="2025" connector="line">
<img
class="h-[1em] w-[1em] shrink-0 object-contain"
src="/about/whitehat.png"
alt=""
aria-hidden="true"
/>
<span>화이트햇스쿨 3기 이수</span>
</ExperienceRow>
</div>
</section>
<section class="mt-[0.75em]" aria-labelledby="software-title">
<h2
id="software-title"
class="text-[inherit] font-bold leading-[inherit]"
>
Software engineering
</h2>
<div class="mt-[0.5em] flex flex-col gap-[0.34em]">
<ExperienceRow year="2025" connector="line">
<img
class="h-[1em] w-[1em] shrink-0"
src="/about/adofai.svg"
alt=""
aria-hidden="true"
/>
<span>ADOFAI.gg</span>
<span class="text-foreground/70"
>Full Stack, Mod Developer</span
>
</ExperienceRow>
<div
class="grid min-w-0 grid-cols-[2.25em_0.55em_minmax(0,1fr)] items-start gap-[0.5em]"
>
<time class="whitespace-nowrap" datetime="2026"
>2026</time
>
<img
class="mt-[0.08em] h-[1em] w-[0.55em] [filter:var(--mono-filter)]"
src="/about/contest-separator.svg"
alt=""
aria-hidden="true"
/>
<div
class="grid min-w-0 grid-cols-[1em_minmax(0,1fr)] items-start gap-[0.34em]"
>
<img
class="mt-[0.22em] h-[0.55em] w-[1em] [filter:var(--mono-filter)]"
src="/about/contest.svg"
alt=""
aria-hidden="true"
/>
<div
class="grid min-w-0 grid-cols-1 gap-[0.35em] lg:grid-cols-[minmax(11em,1.5fr)_minmax(8.6em,1fr)] lg:gap-[0.75em]"
>
<div
class="flex flex-wrap content-start gap-x-[0.5em]"
>
<span>Effect Playing Contest</span>
<span class="text-foreground/70"
>2025 · Finale</span
>
</div>
<div
class="flex flex-col text-foreground/70"
>
<span>Broadcast Engineer</span>
<span>ARG Creator</span>
<span>Full Stack Developer</span>
<span>Mod Developer</span>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
<div
class="relative h-[min(150vw,720px)] min-h-[600px] overflow-hidden lg:h-auto lg:min-h-0"
aria-label="활동 사진"
>
<img
class="absolute inset-0 h-full w-full select-none object-contain"
src="/side.png"
alt="활동 사진 콜라주"
width="3840"
height="4320"
/>
</div>
</div>
</section>

View file

@ -3,8 +3,16 @@ const contacts = [
{ name: "Email", icon: "mail", action: "dialog" }, { name: "Email", icon: "mail", action: "dialog" },
{ name: "Blog", icon: "rss", url: "https://blog.imnya.ng" }, { name: "Blog", icon: "rss", url: "https://blog.imnya.ng" },
{ name: "GitHub", icon: "github", url: "https://github.com/imnyang" }, { name: "GitHub", icon: "github", url: "https://github.com/imnyang" },
{ name: "git.mizuki.guru", icon: "git", url: "https://git.mizuki.guru/imnyang" }, {
{ name: "Instagram", icon: "instagram", url: "https://instagram.com/imnya.ng" }, name: "git.mizuki.guru",
icon: "git",
url: "https://git.mizuki.guru/imnyang",
},
{
name: "Instagram",
icon: "instagram",
url: "https://instagram.com/imnya.ng",
},
{ name: "𝕏", icon: "x", url: "https://x.com/imnya_ng" }, { name: "𝕏", icon: "x", url: "https://x.com/imnya_ng" },
]; ];
@ -16,15 +24,16 @@ const emailContacts = [
const icons: Record<string, string> = { const icons: Record<string, string> = {
mail: `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>`, mail: `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>`,
rss: `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 11a9 9 0 0 1 9 9"/><path d="M4 4a16 16 0 0 1 16 16"/><circle cx="5" cy="19" r="1"/></svg>`, rss: `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 11a9 9 0 0 1 9 9"/><path d="M4 4a16 16 0 0 1 16 16"/><circle cx="5" cy="19" r="1"/></svg>`,
github: `<img src="/icon/github.svg" width="24" height="24" alt="GitHub" class="w-6 h-6" />`, github: `<img src="/icon/github.svg" width="24" height="24" alt="GitHub" class="h-6 w-6 transition-[filter] duration-300 [filter:var(--mono-filter)]" />`,
git: `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" x2="6" y1="3" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>`, git: `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" x2="6" y1="3" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>`,
instagram: `<img src="/icon/instagram.svg" width="18" height="18" alt="Instagram" class="w-4 h-4" />`, instagram: `<img src="/icon/instagram.svg" width="18" height="18" alt="Instagram" class="h-4 w-4 transition-[filter] duration-300 [filter:var(--mono-filter)]" />`,
x: `<p class="text-[20px] font-bold leading-none">𝕏</p>`, x: `<p class="text-[20px] font-bold leading-none">𝕏</p>`,
}; };
--- ---
<div class="flex flex-row space-x-4 relative"> <div class="flex flex-row space-x-4 relative select-none">
{contacts.map((c) => ( {
contacts.map((c) =>
c.action === "dialog" ? ( c.action === "dialog" ? (
<button <button
type="button" type="button"
@ -42,8 +51,9 @@ const icons: Record<string, string> = {
class="flex items-center space-x-2 text-foreground/80 hover:text-foreground transition-colors" class="flex items-center space-x-2 text-foreground/80 hover:text-foreground transition-colors"
set:html={icons[c.icon]} set:html={icons[c.icon]}
/> />
),
) )
))} }
</div> </div>
<!-- Email Dialog --> <!-- Email Dialog -->
@ -55,26 +65,78 @@ const icons: Record<string, string> = {
aria-label="Contact Me" aria-label="Contact Me"
> >
<div id="email-dialog-backdrop" class="absolute inset-0 bg-black/50"></div> <div id="email-dialog-backdrop" class="absolute inset-0 bg-black/50"></div>
<div class="relative z-10 bg-background border border-border rounded-xl shadow-xl p-6 w-full max-w-sm mx-4"> <div
class="relative z-10 bg-background border border-border rounded-xl shadow-xl p-6 w-full max-w-sm mx-4"
>
<h2 class="text-lg font-semibold mb-1">Contact Me</h2> <h2 class="text-lg font-semibold mb-1">Contact Me</h2>
<p class="text-sm text-muted-foreground mb-4">이메일 주소를 클릭하면 복사되고, 더블클릭하면 메일 앱이 열립니다.</p> <p class="text-sm text-muted-foreground mb-4">
이메일 주소를 클릭하면 복사되고, 더블클릭하면 메일 앱이 열립니다.
</p>
<div class="flex flex-col gap-3"> <div class="flex flex-col gap-3">
{emailContacts.map((ec) => ( {
emailContacts.map((ec) => (
<div> <div>
<p class="text-xs text-muted-foreground mb-1">{ec.label}</p> <p class="text-xs text-muted-foreground mb-1">
{ec.label}
</p>
<button <button
type="button" type="button"
data-email={ec.address} data-email={ec.address}
class="email-copy-btn w-full flex items-center gap-3 border border-border rounded-lg px-4 py-2.5 hover:bg-muted transition-colors text-left active:scale-95 transition-transform" class="email-copy-btn w-full flex items-center gap-3 border border-border rounded-lg px-4 py-2.5 hover:bg-muted transition-colors text-left active:scale-95 transition-transform"
> >
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="shrink-0"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg> <svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="shrink-0"
>
<>
<rect
width="20"
height="16"
x="2"
y="4"
rx="2"
/>
<path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" />
</>
</svg>
<span class="flex-1 text-sm">{ec.address}</span> <span class="flex-1 text-sm">{ec.address}</span>
<span class="copy-icon text-muted-foreground"> <span class="copy-icon text-muted-foreground">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg> <svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<>
<rect
width="14"
height="14"
x="8"
y="8"
rx="2"
ry="2"
/>
<path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />
</>
</svg>
</span> </span>
</button> </button>
</div> </div>
))} ))
}
</div> </div>
<div class="mt-5 flex justify-end"> <div class="mt-5 flex justify-end">
<button <button
@ -100,9 +162,13 @@ const icons: Record<string, string> = {
openBtn.addEventListener("click", open); openBtn.addEventListener("click", open);
closeBtn.addEventListener("click", close); closeBtn.addEventListener("click", close);
backdrop.addEventListener("click", close); backdrop.addEventListener("click", close);
document.addEventListener("keydown", (e) => { if (e.key === "Escape") close(); }); document.addEventListener("keydown", (e) => {
if (e.key === "Escape") close();
});
document.querySelectorAll<HTMLButtonElement>(".email-copy-btn").forEach((btn) => { document
.querySelectorAll<HTMLButtonElement>(".email-copy-btn")
.forEach((btn) => {
const email = btn.dataset.email!; const email = btn.dataset.email!;
const copyIcon = btn.querySelector(".copy-icon")!; const copyIcon = btn.querySelector(".copy-icon")!;

View file

@ -0,0 +1,29 @@
---
interface Props {
year: string;
connector: "wave" | "line";
}
const { year, connector } = Astro.props;
const connectorClass =
connector === "wave"
? "h-[0.17em] w-[0.52em] [filter:var(--mono-filter)]"
: "h-[0.1em] w-[0.55em] [filter:var(--mono-filter)]";
---
<div
class="grid min-w-0 grid-cols-[2.25em_0.55em_minmax(0,1fr)] items-center gap-[0.5em]"
>
<time class="whitespace-nowrap" datetime={year}>{year}</time>
<img
class={connectorClass}
src={`/about/separator-${connector}.svg`}
alt=""
aria-hidden="true"
/>
<div
class="flex min-w-0 flex-wrap items-center gap-x-[0.34em] gap-y-[0.2em] lg:flex-nowrap"
>
<slot />
</div>
</div>

117
src/components/Header.astro Normal file
View file

@ -0,0 +1,117 @@
---
const navigationItems = [
{ label: "Home", href: "#home", nodeId: "43:29" },
{ label: "About", href: "#about", nodeId: "43:30" },
{ label: "Projects", href: "#projects", nodeId: "43:32" },
{ label: "Timeline", href: "#timeline", nodeId: "43:36" },
] as const;
const desktopLinkClass =
"text-foreground no-underline transition-opacity duration-150 hover:opacity-55 focus-visible:opacity-55";
const mobileLinkClass =
"block rounded-xl px-3 py-2 text-sm font-semibold text-foreground no-underline transition-colors hover:bg-foreground/5";
---
<header
data-node-id="43:26"
class="fixed inset-x-0 top-0 z-50 flex h-[64px] items-center justify-between overflow-clip border-b border-foreground/[0.06] bg-background/90 px-[clamp(26px,2.5vw,48px)] backdrop-blur-xl transition-colors duration-300 max-md:overflow-visible max-md:px-6"
>
<a
class="shrink-0 text-2xl font-bold leading-[normal] text-foreground no-underline max-md:text-xl"
href="#home"
data-node-id="43:28">@imnya.ng</a
>
<div id="navigation" class="relative flex shrink-0 items-center">
<nav
class="flex shrink-0 items-center gap-4 whitespace-nowrap text-base font-semibold leading-[1.5] tracking-[-0.02em] max-md:hidden"
aria-label="주요 메뉴"
data-node-id="43:40"
>
{
navigationItems.map((item) => (
<a
class={desktopLinkClass}
href={item.href}
data-node-id={item.nodeId}
>
{item.label}
</a>
))
}
</nav>
<button
id="menu-toggle"
type="button"
class="relative hidden h-10 w-10 items-center justify-center rounded-full text-foreground transition-colors hover:bg-foreground/5 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-foreground max-md:flex"
aria-label="메뉴 열기"
aria-controls="mobile-nav"
aria-expanded="false"
>
<span class="sr-only">메뉴</span>
<span
aria-hidden="true"
class="absolute h-px w-5 -translate-y-1.5 bg-foreground"
></span>
<span
aria-hidden="true"
class="absolute h-px w-5 bg-foreground"></span>
<span
aria-hidden="true"
class="absolute h-px w-5 translate-y-1.5 bg-foreground"
></span>
</button>
<nav
id="mobile-nav"
class="absolute right-0 top-[calc(100%+12px)] z-50 hidden min-w-40 flex-col gap-1 rounded-2xl border border-border bg-background p-2 shadow-[0_12px_30px_rgba(0,0,0,0.18)] md:hidden"
aria-label="모바일 메뉴"
>
{
navigationItems.map((item) => (
<a class={mobileLinkClass} href={item.href}>
{item.label}
</a>
))
}
</nav>
</div>
</header>
<script>
const menuToggle =
document.querySelector<HTMLButtonElement>("#menu-toggle");
const mobileNav = document.querySelector<HTMLElement>("#mobile-nav");
const navigation = document.querySelector<HTMLElement>("#navigation");
if (menuToggle && mobileNav && navigation) {
const setMenuOpen = (isOpen: boolean) => {
mobileNav.classList.toggle("hidden", !isOpen);
mobileNav.classList.toggle("flex", isOpen);
menuToggle.setAttribute("aria-expanded", String(isOpen));
menuToggle.setAttribute(
"aria-label",
isOpen ? "메뉴 닫기" : "메뉴 열기",
);
};
menuToggle.addEventListener("click", () => {
setMenuOpen(menuToggle.getAttribute("aria-expanded") !== "true");
});
mobileNav.addEventListener("click", (event) => {
if (event.target instanceof HTMLAnchorElement) setMenuOpen(false);
});
document.addEventListener("keydown", (event) => {
if (event.key === "Escape") setMenuOpen(false);
});
document.addEventListener("click", (event) => {
if (event.target instanceof Node && !navigation.contains(event.target)) {
setMenuOpen(false);
}
});
}
</script>

94
src/components/Hero.astro Normal file
View file

@ -0,0 +1,94 @@
<div
id="home"
data-node-id="1:3"
data-name="imnyang"
class="flex h-full min-h-0 snap-start snap-always flex-col overflow-hidden"
>
<section
class="flex h-[250px] min-h-[250px] min-w-0 flex-none basis-[250px] items-center overflow-clip px-[clamp(26px,2.5vw,48px)] max-md:px-6"
aria-labelledby="hero-title"
data-node-id="43:24"
>
<div class="w-full min-w-0" data-node-id="43:23">
<h1
id="hero-title"
class="m-0 flex h-[250px] w-full max-w-full flex-col justify-center break-words whitespace-nowrap text-[clamp(34px,3.333333vw,64px)] font-bold leading-[normal] tracking-[0] max-md:whitespace-normal max-md:text-[clamp(24px,8vw,48px)] max-md:leading-[1.12]"
>
<span class="block" data-node-id="43:14">
<span class="font-bold">항상 꿈꾸던 것</span><span
class="font-normal text-foreground/50">들을</span
>
</span>
<span class="block" data-node-id="43:16">
<span class="font-bold">현실</span><span
class="font-normal text-foreground/50"
>로 만들어나가는</span
><br class="hidden max-md:block md:hidden" /><span
class="font-bold"> 암냥</span
><span class="font-normal text-foreground/50"
>입니다.</span
>
</span>
</h1>
</div>
</section>
<section
class="min-h-0 w-full min-w-0 flex-1 basis-0 px-[clamp(26px,2.5vw,48px)] max-md:px-6"
data-node-id="44:41"
>
<div
class="relative isolate h-full min-h-0 w-full overflow-hidden rounded-tl-[clamp(10px,0.833333vw,16px)] rounded-tr-[clamp(10px,0.833333vw,16px)]"
data-node-id="42:10"
>
<picture class="contents">
<source
id="hero-theme-source"
media="(prefers-color-scheme: dark)"
srcset="/hero-dark.png"
type="image/png"
/>
<img
class="block h-full w-full object-cover object-center transition-[scale,border-radius,box-shadow] duration-500 ease-[var(--ease-out-expo)] hover:z-10 hover:scale-105 hover:rounded-lg hover:shadow-[0_15px_45px_#0006] motion-reduce:transition-none"
src="/hero-light.png"
alt="벚꽃이 핀 수로에서 보트를 타고 있는 암냥"
width="3840"
height="2160"
fetchpriority="high"
/>
</picture>
<div
aria-hidden="true"
class="pointer-events-none absolute inset-x-0 bottom-0 z-20 h-[min(150px,35%)] bg-gradient-to-b from-transparent via-background/20 to-background backdrop-blur-[2px] [mask-image:linear-gradient(to_bottom,transparent,black_42%)]"
></div>
</div>
</section>
</div>
<script>
const heroThemeSource =
document.querySelector<HTMLSourceElement>("#hero-theme-source");
if (heroThemeSource) {
const syncHeroTheme = () => {
const root = document.documentElement;
if (root.classList.contains("dark")) {
heroThemeSource.media = "all";
heroThemeSource.srcset = "/hero-dark.png";
} else if (root.classList.contains("light")) {
heroThemeSource.media = "all";
heroThemeSource.srcset = "/hero-light.png";
} else {
heroThemeSource.media = "(prefers-color-scheme: dark)";
heroThemeSource.srcset = "/hero-dark.png";
}
};
syncHeroTheme();
new MutationObserver(syncHeroTheme).observe(document.documentElement, {
attributes: true,
attributeFilter: ["class"],
});
}
</script>

View file

@ -1,7 +1,5 @@
@import url("https://cdn.jsdelivr.net/gh/wanteddev/wanted-sans@v1.0.3/packages/wanted-sans/fonts/webfonts/variable/split/WantedSansVariable.min.css"); @import "@sun-typeface/suit/fonts/variable/woff2/SUIT-Variable.css";
@import url('https://cdn.jsdelivr.net/npm/galmuri@latest/dist/galmuri.css');
@import "tailwindcss"; @import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *)); @custom-variant dark (&:is(.dark *));
@ -12,81 +10,73 @@
--color-muted-foreground: var(--muted-foreground); --color-muted-foreground: var(--muted-foreground);
--color-border: var(--border); --color-border: var(--border);
--color-ring: var(--ring); --color-ring: var(--ring);
--font-sans: "SUIT Variable", "SUIT", system-ui, sans-serif;
--radius-sm: calc(var(--radius) * 0.6); --radius-sm: calc(var(--radius) * 0.6);
--radius-md: calc(var(--radius) * 0.8); --radius-md: calc(var(--radius) * 0.8);
--radius-lg: var(--radius); --radius-lg: var(--radius);
} }
@font-face {
font-family: 'BonmyeongjoSourceHanSerif';
src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_two@1.0/NotoSerifKR.woff') format('woff');
font-weight: normal;
font-display: swap;
}
.font-BonmyeongjoSourceHanSerif {
font-family: "BonmyeongjoSourceHanSerif", sans-serif !important;
}
.font-galmuri {
font-family: "Galmuri", sans-serif !important;
}
:root { :root {
--background: hsl(340 40% 98%); color-scheme: light;
--foreground: hsl(315 21% 8%);
--muted: hsl(340 20% 95%); --light-background: hsl(340 40% 98%);
--muted-foreground: hsl(340 10% 60%); --light-foreground: hsl(315 21% 8%);
--border: hsl(340 25% 90%); --light-muted: hsl(340 20% 95%);
--ring: hsl(315 21% 8%); --light-muted-foreground: hsl(340 10% 60%);
--light-border: hsl(340 25% 90%);
--light-ring: hsl(315 21% 8%);
--dark-background: hsl(315 21% 8%);
--dark-foreground: hsl(0 0% 98%);
--dark-muted: hsl(296 18% 15%);
--dark-muted-foreground: hsl(240 5% 68%);
--dark-border: hsl(296 18% 15%);
--dark-ring: hsl(240 4.9% 83.9%);
--background: var(--light-background);
--foreground: var(--light-foreground);
--muted: var(--light-muted);
--muted-foreground: var(--light-muted-foreground);
--border: var(--light-border);
--ring: var(--light-ring);
--radius: 0.625rem; --radius: 0.625rem;
--scrollbar: hsla(340 10% 60% / 0.5); --scrollbar: hsla(340 10% 60% / 0.5);
--scrollbar-hover: hsla(340 10% 60% / 0.8); --scrollbar-hover: hsla(340 10% 60% / 0.8);
--mono-filter: none;
} }
.dark { .dark {
--background: hsl(315 21% 8%); color-scheme: dark;
--foreground: hsl(0 0% 98%); --background: var(--dark-background);
--muted: hsl(296, 18%, 15%); --foreground: var(--dark-foreground);
--muted-foreground: hsl(240 5% 68%); --muted: var(--dark-muted);
--border: hsl(296, 18%, 15%); --muted-foreground: var(--dark-muted-foreground);
--ring: hsl(240 4.9% 83.9%); --border: var(--dark-border);
--ring: var(--dark-ring);
--scrollbar: hsla(340 10% 60% / 0.5); --mono-filter: invert(1);
--scrollbar-hover: hsla(340 10% 60% / 0.8);
} }
@layer base { .light {
* { color-scheme: light;
border-color: var(--border); --background: var(--light-background);
outline-color: color-mix(in srgb, var(--ring) 50%, transparent); --foreground: var(--light-foreground);
} --muted: var(--light-muted);
--muted-foreground: var(--light-muted-foreground);
--border: var(--light-border);
--ring: var(--light-ring);
--mono-filter: none;
}
body { @media (prefers-color-scheme: dark) {
background-color: var(--background); :root:not(.light) {
color: var(--foreground); color-scheme: dark;
font-family: "Wanted Sans Variable", "Wanted Sans", -apple-system, --background: var(--dark-background);
BlinkMacSystemFont, system-ui, "Segoe UI", "Apple SD Gothic Neo", --foreground: var(--dark-foreground);
"Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", --muted: var(--dark-muted);
"Segoe UI Symbol", sans-serif; --muted-foreground: var(--dark-muted-foreground);
--border: var(--dark-border);
--ring: var(--dark-ring);
--mono-filter: invert(1);
} }
} }
/* Fullscreen Scroll Snap */
html {
scroll-behavior: smooth;
}
body {
scroll-snap-type: y mandatory;
}
.snap-section {
scroll-snap-align: start;
scroll-snap-stop: always;
}
strong {
font-weight: 600;
}

View file

@ -1,70 +1,84 @@
--- ---
import DDay from "@/components/DDay.astro"; import About from "@/components/About.astro";
import Projects from "@/components/Projects.astro"; import Header from "@/components/Header.astro";
import Timeline from "@/components/Timeline.astro"; import Hero from "@/components/Hero.astro";
import Contact from "@/components/Contact.astro";
import "@/globals.css"; import "@/globals.css";
import "@/scrollbar.css";
--- ---
<html lang="ko" class="font-sans"> <html lang="ko">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<title>암냥 | imnya.ng</title> <meta name="color-scheme" content="light dark" />
<meta name="description" content="imnyang's Portfolio Site" /> <meta
</head> name="theme-color"
<body class="antialiased"> media="(prefers-color-scheme: light)"
<main content="#fcf8f9"
class="min-h-screen w-screen overflow-y-scroll snap-y snap-mandatory relative"
>
<div
class="max-w-3xl w-full flex flex-row h-auto mx-auto my-8 items-center justify-between lg:px-0 px-8"
>
<div class="flex flex-row gap-4 items-center">
<img
src="/Frame.svg"
alt="logo"
class="w-fit h-fit"
width="30"
height="30"
/> />
<a <meta
href="mailto:me@imnya.ng" name="theme-color"
class="inline-block align-middle leading-none font-BonmyeongjoSourceHanSerif text-3xl text-foreground/70 h-fit" media="(prefers-color-scheme: dark)"
>@imnya.ng</a content="#191014"
/>
<title>암냥 | imnya.ng</title>
<meta
name="description"
content="항상 꿈꾸던 것들을 현실로 만들어나가기 위해..."
/>
</head>
<body
class="m-0 min-w-[320px] overflow-hidden bg-background font-sans text-foreground transition-colors duration-300"
> >
</div> <Header />
<DDay targetDate="2010-11-08T03:00:00+09:00" label="🎂 Birth" />
</div> <main
<section class="mt-[64px] h-[calc(100svh-64px)] snap-y snap-mandatory overflow-x-hidden overflow-y-auto scroll-smooth overscroll-y-contain bg-background transition-colors duration-300 [&::-webkit-scrollbar]:h-[11px] [&::-webkit-scrollbar]:w-[19px] [&::-webkit-scrollbar-thumb]:rounded-2xl [&::-webkit-scrollbar-thumb]:border-[5px] [&::-webkit-scrollbar-thumb]:border-background [&::-webkit-scrollbar-thumb]:bg-[var(--scrollbar)] [&::-webkit-scrollbar-thumb:hover]:bg-[var(--scrollbar-hover)] [&::-webkit-scrollbar-track]:bg-transparent"
id="about"
class="w-full snap-start snap-always flex flex-col items-center justify-center mx-auto px-8 lg:px-0"
> >
<div class="max-w-3xl w-full"> <Hero />
<Contact /> <About />
<br />
<p>항상 꿈에만 있던 것들을 현실로 만들어보는 암냥입니다.</p>
<p>언제나 새로운 것을 배우고, 도전하고 있습니다.</p>
<p>
현재는 정보보안 분야쪽에 관심이 많으며 원래는 소프트웨어 개발에 관심
많았습니다.
</p>
<!-- <p>모두에게 밝은 면만 있는 것은 아닙니다.</p> -->
<br />
<p id="a" class="select-none text-transparent text-[1pt]"></p>
<Projects />
<br />
<Timeline />
<div class="text-muted-foreground text-sm">
<br />
<p>© 2026 imnyang. All rights reserved.</p>
<br />
</div>
</div>
</section>
</main> </main>
</body> </body>
</html> </html>
<script>
const scrollContainer = document.querySelector<HTMLElement>("main");
const inPageLinks =
document.querySelectorAll<HTMLAnchorElement>('a[href^="#"]');
const getTargetScrollTop = (target: HTMLElement) =>
target.offsetTop - (scrollContainer?.offsetTop ?? 0);
if (scrollContainer && window.location.hash) {
requestAnimationFrame(() => {
requestAnimationFrame(() => {
const initialTarget = document.querySelector<HTMLElement>(
window.location.hash,
);
if (initialTarget) {
scrollContainer.scrollTop =
getTargetScrollTop(initialTarget);
}
});
});
}
inPageLinks.forEach((link) => {
link.addEventListener("click", (event) => {
const hash = link.getAttribute("href");
const target = hash
? document.querySelector<HTMLElement>(hash)
: null;
if (!scrollContainer || !target) return;
event.preventDefault();
scrollContainer.scrollTo({
top: getTargetScrollTop(target),
behavior: "smooth",
});
history.pushState(null, "", hash);
});
});
</script>

View file

@ -1,26 +0,0 @@
/* from reset */
::-webkit-scrollbar-track {
background: 0 0;
}
::-webkit-scrollbar-thumb {
background: var(--scrollbar);
border: 5px solid var(--background);
border-radius: 16px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-hover);
}
/* ::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) {
background: var(--theme);
}
*/
/* reset */
::-webkit-scrollbar {
width: 19px;
height: 11px;
}
/* from PaperMod https://github.com/adityatelange/hugo-PaperMod/blob/c98a924842fc7ee0c14212c316c69ede3ad76ca3/assets/css/includes/scroll-bar.css */