From 0e5df471acae2cb96c4ccccffc1c77b322d81bbd Mon Sep 17 00:00:00 2001 From: Kat Suricata Date: Fri, 11 Sep 2026 12:49:27 -0400 Subject: [PATCH] Scaffold SvelteKit static site with generated palette tokens - sv create: minimal template, TS, prettier, eslint, adapter-static, kit@next - Static assets (ports, wallpaper, images, icons) moved to static/ - src/lib/palette.ts is the site single source of truth for colour - vite plugin regenerates src/lib/generated/tokens.css from palette.ts - Global app.css ported from style.css shared sections; all raw hex/rgba values replaced with token references or color-mix derivations --- .gitignore | 27 +- .npmrc | 1 + .prettierignore | 10 + eslint.config.js | 41 + package.json | 38 + pnpm-lock.yaml | 1818 +++++++++++++++++ pnpm-workspace.yaml | 2 + prettier.config.js | 11 + src/app.d.ts | 13 + src/app.html | 32 + src/lib/palette.ts | 276 +++ src/lib/styles/app.css | 1052 ++++++++++ src/lib/styles/normalize.css | 290 +++ src/routes/+layout.svelte | 7 + src/routes/+layout.ts | 1 + src/routes/+page.svelte | 2 + .../apple-touch-icon.png | Bin digitalrust.webp => static/digitalrust.webp | Bin digitalrust2.webp => static/digitalrust2.webp | Bin .../digitalrust2t.webp | Bin digitalrust3.webp => static/digitalrust3.webp | Bin .../digitalrust3t.webp | Bin digitalrust4.webp => static/digitalrust4.webp | Bin .../digitalrust4t.webp | Bin digitalrustt.webp => static/digitalrustt.webp | Bin favicon-96x96.png => static/favicon-96x96.png | Bin favicon.ico => static/favicon.ico | Bin favicon.svg => static/favicon.svg | 0 {ports => static/ports}/DigitalRustKDE.colors | 0 {ports => static/ports}/DigitalRustKate.theme | 0 .../ports}/DigitalRustKonsole.colorscheme | 0 .../ports}/DigitalRustPtyxis.palette | 0 {ports => static/ports}/DigitalRustfish.theme | 0 {ports => static/ports}/agentskill.zip | Bin {ports => static/ports}/digital-rust-ghostty | 0 {ports => static/ports}/digitalrustpi/LICENSE | 0 .../ports}/digitalrustpi/README.md | 0 .../ports}/digitalrustpi/digital-rust.json | 0 .../ports}/digitalrustpi/package.json | 0 .../ports}/digitalrustpi/screenshot.webp | Bin {ports => static/ports}/vscode/.gitattributes | 0 {ports => static/ports}/vscode/.gitignore | 0 {ports => static/ports}/vscode/.vscodeignore | 0 {ports => static/ports}/vscode/CHANGELOG.md | 0 {ports => static/ports}/vscode/LICENSE.md | 0 {ports => static/ports}/vscode/README.md | 0 {ports => static/ports}/vscode/icon.png | Bin {ports => static/ports}/vscode/package.json | 0 .../vscode/screenshots/digitalrust.webp | Bin .../themes/Digital Rust-color-theme.json | 0 static/robots.txt | 3 + site.webmanifest => static/site.webmanifest | 0 .../wallpaper}/Digital Rust.png | Bin .../wallpaper}/Digital Rust.svg | 0 .../wallpaper}/Digital Rust.webp | Bin .../web-app-manifest-192x192.png | Bin .../web-app-manifest-512x512.png | Bin tsconfig.json | 9 + vite.config.ts | 44 + 59 files changed, 3676 insertions(+), 1 deletion(-) create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 prettier.config.js create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/lib/palette.ts create mode 100644 src/lib/styles/app.css create mode 100644 src/lib/styles/normalize.css create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+layout.ts create mode 100644 src/routes/+page.svelte rename apple-touch-icon.png => static/apple-touch-icon.png (100%) rename digitalrust.webp => static/digitalrust.webp (100%) rename digitalrust2.webp => static/digitalrust2.webp (100%) rename digitalrust2t.webp => static/digitalrust2t.webp (100%) rename digitalrust3.webp => static/digitalrust3.webp (100%) rename digitalrust3t.webp => static/digitalrust3t.webp (100%) rename digitalrust4.webp => static/digitalrust4.webp (100%) rename digitalrust4t.webp => static/digitalrust4t.webp (100%) rename digitalrustt.webp => static/digitalrustt.webp (100%) rename favicon-96x96.png => static/favicon-96x96.png (100%) rename favicon.ico => static/favicon.ico (100%) rename favicon.svg => static/favicon.svg (100%) rename {ports => static/ports}/DigitalRustKDE.colors (100%) rename {ports => static/ports}/DigitalRustKate.theme (100%) rename {ports => static/ports}/DigitalRustKonsole.colorscheme (100%) rename {ports => static/ports}/DigitalRustPtyxis.palette (100%) rename {ports => static/ports}/DigitalRustfish.theme (100%) rename {ports => static/ports}/agentskill.zip (100%) rename {ports => static/ports}/digital-rust-ghostty (100%) rename {ports => static/ports}/digitalrustpi/LICENSE (100%) rename {ports => static/ports}/digitalrustpi/README.md (100%) rename {ports => static/ports}/digitalrustpi/digital-rust.json (100%) rename {ports => static/ports}/digitalrustpi/package.json (100%) rename {ports => static/ports}/digitalrustpi/screenshot.webp (100%) rename {ports => static/ports}/vscode/.gitattributes (100%) rename {ports => static/ports}/vscode/.gitignore (100%) rename {ports => static/ports}/vscode/.vscodeignore (100%) rename {ports => static/ports}/vscode/CHANGELOG.md (100%) rename {ports => static/ports}/vscode/LICENSE.md (100%) rename {ports => static/ports}/vscode/README.md (100%) rename {ports => static/ports}/vscode/icon.png (100%) rename {ports => static/ports}/vscode/package.json (100%) rename {ports => static/ports}/vscode/screenshots/digitalrust.webp (100%) rename {ports => static/ports}/vscode/themes/Digital Rust-color-theme.json (100%) create mode 100644 static/robots.txt rename site.webmanifest => static/site.webmanifest (100%) rename {wallpaper => static/wallpaper}/Digital Rust.png (100%) rename {wallpaper => static/wallpaper}/Digital Rust.svg (100%) rename {wallpaper => static/wallpaper}/Digital Rust.webp (100%) rename web-app-manifest-192x192.png => static/web-app-manifest-192x192.png (100%) rename web-app-manifest-512x512.png => static/web-app-manifest-512x512.png (100%) create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore index 6a4d224..85b33db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,27 @@ woff2/ -.crush/ \ No newline at end of file +.crush/ + +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +/src/lib/generated/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ab8a9a5 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,10 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ +src/lib/generated/ diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..ed35999 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,41 @@ +import prettier from 'eslint-config-prettier'; +import path from 'node:path'; +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import { defineConfig, includeIgnoreFile } from 'eslint/config'; +import globals from 'globals'; +import ts from 'typescript-eslint'; + +const gitignorePath = path.resolve(import.meta.dirname, '.gitignore'); + +export default defineConfig( + includeIgnoreFile(gitignorePath), + js.configs.recommended, + ts.configs.recommended, + svelte.configs.recommended, + prettier, + svelte.configs.prettier, + { + languageOptions: { globals: { ...globals.browser, ...globals.node } }, + rules: { + // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + 'no-undef': 'off' + } + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser + } + } + }, + { + // Override or add rule settings here, such as: + // 'svelte/button-has-type': 'error' + rules: {} + } +); diff --git a/package.json b/package.json new file mode 100644 index 0000000..726aaf8 --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "digitalrust", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check . && eslint .", + "format": "prettier --write ." + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@sveltejs/adapter-static": "next", + "@sveltejs/kit": "next", + "@sveltejs/vite-plugin-svelte": "^7.1.2", + "@types/node": "^24", + "eslint": "^10.4.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.19.0", + "globals": "^17.6.0", + "prettier": "^3.8.3", + "prettier-plugin-svelte": "^4.1.0", + "svelte": "^5.56.1", + "svelte-check": "^4.6.0", + "typescript": "^6.0.3", + "typescript-eslint": "^8.60.1", + "vite": "^8.0.16" + }, + "imports": { + "#lib": "./src/lib/index.js", + "#lib/*": "./src/lib/*" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..7a53048 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1818 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.10.0) + '@sveltejs/adapter-static': + specifier: next + version: 4.0.0-next.4(@sveltejs/kit@3.0.0-next.27(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0(@typescript-eslint/types@8.70.0))(vite@8.3.0(@types/node@24.13.4)))(svelte@5.57.0(@typescript-eslint/types@8.70.0))(typescript@6.0.3)(vite@8.3.0(@types/node@24.13.4))) + '@sveltejs/kit': + specifier: next + version: 3.0.0-next.27(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0(@typescript-eslint/types@8.70.0))(vite@8.3.0(@types/node@24.13.4)))(svelte@5.57.0(@typescript-eslint/types@8.70.0))(typescript@6.0.3)(vite@8.3.0(@types/node@24.13.4)) + '@sveltejs/vite-plugin-svelte': + specifier: ^7.1.2 + version: 7.3.0(svelte@5.57.0(@typescript-eslint/types@8.70.0))(vite@8.3.0(@types/node@24.13.4)) + '@types/node': + specifier: ^24 + version: 24.13.4 + eslint: + specifier: ^10.4.1 + version: 10.10.0 + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@10.10.0) + eslint-plugin-svelte: + specifier: ^3.19.0 + version: 3.23.0(eslint@10.10.0)(svelte@5.57.0(@typescript-eslint/types@8.70.0)) + globals: + specifier: ^17.6.0 + version: 17.12.0 + prettier: + specifier: ^3.8.3 + version: 3.9.6 + prettier-plugin-svelte: + specifier: ^4.1.0 + version: 4.1.1(prettier@3.9.6)(svelte@5.57.0(@typescript-eslint/types@8.70.0)) + svelte: + specifier: ^5.56.1 + version: 5.57.0(@typescript-eslint/types@8.70.0) + svelte-check: + specifier: ^4.6.0 + version: 4.7.6(picomatch@4.0.7)(svelte@5.57.0(@typescript-eslint/types@8.70.0))(typescript@6.0.3) + typescript: + specifier: ^6.0.3 + version: 6.0.3 + typescript-eslint: + specifier: ^8.60.1 + version: 8.70.0(eslint@10.10.0)(typescript@6.0.3) + vite: + specifier: ^8.0.16 + version: 8.3.0(@types/node@24.13.4) + +packages: + + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.3': + resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@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'} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@oxc-project/types@0.149.0': + resolution: {integrity: sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@rolldown/binding-android-arm-eabi@1.2.8': + resolution: {integrity: sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.8': + resolution: {integrity: sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.8': + resolution: {integrity: sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.8': + resolution: {integrity: sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.8': + resolution: {integrity: sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': + resolution: {integrity: sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.8': + resolution: {integrity: sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.8': + resolution: {integrity: sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.8': + resolution: {integrity: sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.8': + resolution: {integrity: sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.8': + resolution: {integrity: sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.8': + resolution: {integrity: sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.8': + resolution: {integrity: sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.8': + resolution: {integrity: sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.8': + resolution: {integrity: sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@sveltejs/acorn-typescript@1.0.13': + resolution: {integrity: sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-static@4.0.0-next.4': + resolution: {integrity: sha512-LpHOHYLQctyUASoxlR+m2NYZ9PgQQEpo7Ij8FVs5arLmnGZ3FmFi6RFs5SBk05hzLhmzsUkVcmw8vn7FmWzVJg==} + peerDependencies: + '@sveltejs/kit': ^3.0.0-next.0 + + '@sveltejs/kit@3.0.0-next.27': + resolution: {integrity: sha512-m2R6GvcMhiAbYVKhzRf5mzLSvcXEuy/H0Va72XvxfEl1ZglrSC/321GKYa6idDHPojuRzkyh9EB0jBZmAwf6+Q==} + engines: {node: '>=22.17'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^7.0.0 + svelte: ^5.56.4 + typescript: ^6.0.0 + vite: ^8.0.12 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + + '@sveltejs/load-config@0.2.3': + resolution: {integrity: sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ==} + engines: {node: '>= 18.0.0'} + + '@sveltejs/vite-plugin-svelte@7.3.0': + resolution: {integrity: sha512-QbRoJyD92e9R0ufeQIWRHrCC0ObcqSv/aBDdrQMoU+sypav3cDx5wytdQ6GLdXjEMO6xjrXGzfkUygng8JMv0A==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.46.4 + vite: ^8.0.0-beta.7 || ^8.0.0 + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@24.13.4': + resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==} + + '@typescript-eslint/eslint-plugin@8.70.0': + resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.70.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.70.0': + resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.70.0': + resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.70.0': + resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.70.0': + resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.70.0': + resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.70.0': + resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.70.0': + resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.70.0': + resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.70.0': + resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cookie@2.0.1: + resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + engines: {node: '>=22'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devalue@5.9.2: + resolution: {integrity: sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-svelte@3.23.0: + resolution: {integrity: sha512-n9jRklDqy0+W834568a4ZIZTK7DHXxvvHHxxGP8nNq7N//pOZMubttskHOquyGgfTR4Z05q2NdGNlsTpIEA48w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 || ^10.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.10.0: + resolution: {integrity: sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrap@2.3.7: + resolution: {integrity: sha512-n2nf7fZR3c9yXf0BPEuHuXqT+KW0SJVj4cN5FMEkpCZ3scLjOQWpiccyCxVzCC2q1wubTghuEGzngJY/7Ah0Ow==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + globals@17.12.0: + resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==} + engines: {node: '>=18'} + + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.9: + resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magic-string@1.3.1: + resolution: {integrity: sha512-rm91zr2Ou+XueDTohjQQjdQEcYM6zVi8KVUCG8Ec3vHwUEKrhSdCNyfuIywkA6hcCAteIn0ZOtAHA6eGpiX+Pg==} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-safe-parser@7.1.0: + resolution: {integrity: sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@7.1.6: + resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==} + engines: {node: '>=4'} + + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-svelte@4.1.1: + resolution: {integrity: sha512-wXvbXMjSvb4C9ENWTHXyd+ihakKCsJ6rJhLP6/8HFNj4GkZr48jqL9PoKsl2sk7SyCZRTnJ7O2TTowUpOxP/KA==} + engines: {node: '>=20'} + peerDependencies: + prettier: ^3.0.0 + svelte: ^5.0.0 + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rolldown@1.2.8: + resolution: {integrity: sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + svelte-check@4.7.6: + resolution: {integrity: sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.0.0 || ^6.0.0 + + svelte-eslint-parser@1.8.1: + resolution: {integrity: sha512-5zgKBqAf6V8Jyrmr1jViksyG4NKT8NheYwkdxRaMRDAqpGWi9wR8ktcGrAZbfMn/PHUp1BWzAp0cYQECkWuAMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.34.5} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte@5.57.0: + resolution: {integrity: sha512-NdbDn7fl4be1ViUG0oq/lvG6OZy3oENolV2ONjiqqsfVoeAfzaQAKUcEX3MrQod/Bebv1PgwET9rfXhgn9s4Kg==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.70.0: + resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@8.3.0: + resolution: {integrity: sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 + 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 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zimmerframe@1.1.5: + resolution: {integrity: sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==} + +snapshots: + + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + + '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0)': + dependencies: + eslint: 10.10.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.6 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.7.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.10.0)': + optionalDependencies: + eslint: 10.10.0 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.3': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@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/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + + '@oxc-project/types@0.149.0': {} + + '@polka/url@1.0.0-next.29': {} + + '@rolldown/binding-android-arm-eabi@1.2.8': + optional: true + + '@rolldown/binding-android-arm64@1.2.8': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.8': + optional: true + + '@rolldown/binding-darwin-x64@1.2.8': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.8': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.8': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.8': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.8': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.8': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.8': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.8': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.8': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.8': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.8': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@standard-schema/spec@1.1.0': {} + + '@sveltejs/acorn-typescript@1.0.13(acorn@8.18.0)': + dependencies: + acorn: 8.18.0 + + '@sveltejs/adapter-static@4.0.0-next.4(@sveltejs/kit@3.0.0-next.27(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0(@typescript-eslint/types@8.70.0))(vite@8.3.0(@types/node@24.13.4)))(svelte@5.57.0(@typescript-eslint/types@8.70.0))(typescript@6.0.3)(vite@8.3.0(@types/node@24.13.4)))': + dependencies: + '@sveltejs/kit': 3.0.0-next.27(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0(@typescript-eslint/types@8.70.0))(vite@8.3.0(@types/node@24.13.4)))(svelte@5.57.0(@typescript-eslint/types@8.70.0))(typescript@6.0.3)(vite@8.3.0(@types/node@24.13.4)) + + '@sveltejs/kit@3.0.0-next.27(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0(@typescript-eslint/types@8.70.0))(vite@8.3.0(@types/node@24.13.4)))(svelte@5.57.0(@typescript-eslint/types@8.70.0))(typescript@6.0.3)(vite@8.3.0(@types/node@24.13.4))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + '@standard-schema/spec': 1.1.0 + '@sveltejs/vite-plugin-svelte': 7.3.0(svelte@5.57.0(@typescript-eslint/types@8.70.0))(vite@8.3.0(@types/node@24.13.4)) + cookie: 2.0.1 + devalue: 5.9.2 + esm-env: 1.2.2 + magic-string: 1.3.1 + mrmime: 2.0.1 + sirv: 3.0.2 + svelte: 5.57.0(@typescript-eslint/types@8.70.0) + vite: 8.3.0(@types/node@24.13.4) + optionalDependencies: + typescript: 6.0.3 + + '@sveltejs/load-config@0.2.3': {} + + '@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0(@typescript-eslint/types@8.70.0))(vite@8.3.0(@types/node@24.13.4))': + dependencies: + deepmerge: 4.3.1 + magic-string: 1.3.1 + obug: 2.2.1 + svelte: 5.57.0(@typescript-eslint/types@8.70.0) + vite: 8.3.0(@types/node@24.13.4) + vitefu: 1.1.3(vite@8.3.0(@types/node@24.13.4)) + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@24.13.4': + dependencies: + undici-types: 7.18.2 + + '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(eslint@10.10.0)(typescript@6.0.3))(eslint@10.10.0)(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.70.0(eslint@10.10.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@10.10.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.70.0 + eslint: 10.10.0 + ignore: 7.0.9 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.70.0(eslint@10.10.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.70.0 + debug: 4.4.3 + eslint: 10.10.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.70.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@6.0.3) + '@typescript-eslint/types': 8.70.0 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.70.0': + dependencies: + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 + + '@typescript-eslint/tsconfig-utils@8.70.0(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.70.0(eslint@10.10.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.10.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.70.0': {} + + '@typescript-eslint/typescript-estree@8.70.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.70.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@6.0.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.70.0(eslint@10.10.0)(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) + eslint: 10.10.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.70.0': + dependencies: + '@typescript-eslint/types': 8.70.0 + eslint-visitor-keys: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + + acorn@8.18.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + aria-query@5.3.1: {} + + axobject-query@4.1.0: {} + + balanced-match@4.0.4: {} + + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + + cacheable@2.5.0: + dependencies: + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + clsx@2.1.1: {} + + cookie@2.0.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + detect-libc@2.1.2: {} + + devalue@5.9.2: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@10.1.8(eslint@10.10.0): + dependencies: + eslint: 10.10.0 + + eslint-plugin-svelte@3.23.0(eslint@10.10.0)(svelte@5.57.0(@typescript-eslint/types@8.70.0)): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0) + '@jridgewell/sourcemap-codec': 1.6.0 + eslint: 10.10.0 + esutils: 2.0.3 + globals: 16.5.0 + known-css-properties: 0.37.0 + postcss: 8.5.28 + postcss-load-config: 3.1.4(postcss@8.5.28) + postcss-safe-parser: 7.1.0(postcss@8.5.28) + semver: 7.8.5 + svelte-eslint-parser: 1.8.1(svelte@5.57.0(@typescript-eslint/types@8.70.0)) + optionalDependencies: + svelte: 5.57.0(@typescript-eslint/types@8.70.0) + transitivePeerDependencies: + - ts-node + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.10.0: + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.3 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 11.1.5 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.6 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + esm-env@1.2.2: {} + + espree@10.4.0: + dependencies: + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 4.2.1 + + espree@11.2.0: + dependencies: + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrap@2.3.7(@typescript-eslint/types@8.70.0): + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + optionalDependencies: + '@typescript-eslint/types': 8.70.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + file-entry-cache@11.1.5: + dependencies: + flat-cache: 6.1.23 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@6.1.23: + dependencies: + cacheable: 2.5.0 + flatted: 3.4.4 + hookified: 1.15.1 + + flatted@3.4.4: {} + + fsevents@2.3.3: + optional: true + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@16.5.0: {} + + globals@17.12.0: {} + + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + + hookified@1.15.1: {} + + hookified@2.2.0: {} + + ignore@5.3.2: {} + + ignore@7.0.9: {} + + imurmurhash@0.1.4: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + isexe@2.0.0: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + + known-css-properties@0.37.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + lilconfig@2.1.0: {} + + locate-character@3.0.0: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + magic-string@1.3.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.18: {} + + natural-compare@1.4.0: {} + + obug@2.2.1: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.7: {} + + postcss-load-config@3.1.4(postcss@8.5.28): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.3 + optionalDependencies: + postcss: 8.5.28 + + postcss-safe-parser@7.1.0(postcss@8.5.28): + dependencies: + postcss: 8.5.28 + + postcss-scss@4.0.9(postcss@8.5.28): + dependencies: + postcss: 8.5.28 + + postcss-selector-parser@7.1.6: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.28: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-plugin-svelte@4.1.1(prettier@3.9.6)(svelte@5.57.0(@typescript-eslint/types@8.70.0)): + dependencies: + prettier: 3.9.6 + svelte: 5.57.0(@typescript-eslint/types@8.70.0) + + prettier@3.9.6: {} + + punycode@2.3.1: {} + + qified@0.10.1: + dependencies: + hookified: 2.2.0 + + readdirp@4.1.2: {} + + rolldown@1.2.8: + dependencies: + '@oxc-project/types': 0.149.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.8 + '@rolldown/binding-android-arm64': 1.2.8 + '@rolldown/binding-darwin-arm64': 1.2.8 + '@rolldown/binding-darwin-x64': 1.2.8 + '@rolldown/binding-freebsd-x64': 1.2.8 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.8 + '@rolldown/binding-linux-arm64-gnu': 1.2.8 + '@rolldown/binding-linux-arm64-musl': 1.2.8 + '@rolldown/binding-linux-ppc64-gnu': 1.2.8 + '@rolldown/binding-linux-s390x-gnu': 1.2.8 + '@rolldown/binding-linux-x64-gnu': 1.2.8 + '@rolldown/binding-linux-x64-musl': 1.2.8 + '@rolldown/binding-openharmony-arm64': 1.2.8 + '@rolldown/binding-win32-arm64-msvc': 1.2.8 + '@rolldown/binding-win32-x64-msvc': 1.2.8 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + semver@7.8.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + source-map-js@1.2.1: {} + + svelte-check@4.7.6(picomatch@4.0.7)(svelte@5.57.0(@typescript-eslint/types@8.70.0))(typescript@6.0.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@sveltejs/load-config': 0.2.3 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.7) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.57.0(@typescript-eslint/types@8.70.0) + typescript: 6.0.3 + transitivePeerDependencies: + - picomatch + + svelte-eslint-parser@1.8.1(svelte@5.57.0(@typescript-eslint/types@8.70.0)): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.28 + postcss-scss: 4.0.9(postcss@8.5.28) + postcss-selector-parser: 7.1.6 + semver: 7.8.5 + optionalDependencies: + svelte: 5.57.0(@typescript-eslint/types@8.70.0) + + svelte@5.57.0(@typescript-eslint/types@8.70.0): + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.6.0 + '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) + '@types/estree': 1.0.9 + acorn: 8.18.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.9.2 + esm-env: 1.2.2 + esrap: 2.3.7(@typescript-eslint/types@8.70.0) + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.5 + transitivePeerDependencies: + - '@typescript-eslint/types' + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + totalist@3.0.1: {} + + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.70.0(eslint@10.10.0)(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(eslint@10.10.0)(typescript@6.0.3))(eslint@10.10.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.70.0(eslint@10.10.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(typescript@6.0.3) + eslint: 10.10.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + typescript@6.0.3: {} + + undici-types@7.18.2: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vite@8.3.0(@types/node@24.13.4): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.28 + rolldown: 1.2.8 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.13.4 + fsevents: 2.3.3 + + vitefu@1.1.3(vite@8.3.0(@types/node@24.13.4)): + optionalDependencies: + vite: 8.3.0(@types/node@24.13.4) + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yaml@1.10.3: {} + + yocto-queue@0.1.0: {} + + zimmerframe@1.1.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..5ed0b5a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +allowBuilds: + esbuild: true diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..718ddb8 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,11 @@ +/** @type {import("prettier").Config} */ +const config = { + useTabs: true, + singleQuote: true, + trailingComma: 'none', + printWidth: 100, + plugins: ['prettier-plugin-svelte'], + overrides: [{ files: '*.svelte', options: { parser: 'svelte' } }] +}; + +export default config; diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..6927cd9 --- /dev/null +++ b/src/app.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/lib/palette.ts b/src/lib/palette.ts new file mode 100644 index 0000000..f6f4be0 --- /dev/null +++ b/src/lib/palette.ts @@ -0,0 +1,276 @@ +export interface DrColor { + /** Kebab-case identifier. Becomes the CSS custom property `--`. */ + id: string; + /** Display name. Stable across the spec, the site, and every port. */ + name: string; + hex: string; + /** Role note from the spec palette tables. */ + description?: string; +} + +export const rustRamp: DrColor[] = [ + { id: 'ghost-pixel', name: 'Ghost Pixel', hex: '#f7eae8', description: 'Lightest / White Point (text)' }, + { id: 'phosphor-smoke', name: 'Phosphor Smoke', hex: '#efd5d1' }, + { id: 'phantom-current', name: 'Phantom Current', hex: '#e7c0ba', description: 'Link Colour/Footer Text' }, + { id: 'corrupted-cache', name: 'Corrupted Cache', hex: '#dfaba3' }, + { id: 'copper-trace', name: 'Copper Trace', hex: '#d7968c' }, + { id: 'fatal-error', name: 'Fatal Error', hex: '#cf8175' }, + { id: 'rouge-signal', name: 'Rouge Signal', hex: '#c76c5e' }, + { id: 'amber-alert', name: 'Amber Alert', hex: '#bf5747' }, + { id: 'firewall-breach', name: 'Firewall Breach', hex: '#b74230' }, + { id: 'digital-rust', name: 'Digital Rust', hex: '#af2e1a', description: 'Primary Colour/Primary Accent' }, + { id: 'kernel-panic', name: 'Kernel Panic', hex: '#9d2917' }, + { id: 'data-rot', name: 'Data Rot', hex: '#8c2414' }, + { id: 'bricked-board', name: 'Bricked Board', hex: '#7a2012' }, + { id: 'dark-packet', name: 'Dark Packet', hex: '#691b0f' }, + { id: 'daemon-blood', name: 'Daemon Blood', hex: '#57170d' }, + { id: 'bad-sector', name: 'Bad Sector', hex: '#46120a' }, + { id: 'core-meltdown', name: 'Core Meltdown', hex: '#340d07', description: 'Secondary Background Colour' }, + { id: 'null-pointer', name: 'Null Pointer', hex: '#230905' }, + { id: 'event-horizon', name: 'Event Horizon', hex: '#110402', description: 'Darkest/Black Point (background)' } +]; + +// One-off hexes that have no display name because they are not part of the public palette. +export const internalHex = { + /* Mid-rust surface for active/pressed fills, between Daemon Blood and Dark Packet. */ + surfaceActive: '#5a1810' +} as const; + +// Raw Amber Alert fails WCAG AA for text on base/elevated surfaces; this variant passes. +export const amberAlertText: DrColor = { + id: 'amber-alert-text', + name: 'Amber Alert (text)', + hex: '#cb6353', + description: 'WCAG AA compliant text variant of Amber Alert' +}; + +export interface DrAccentFamily { + /** Family display name, e.g. "Memory Leek". */ + name: string; + /** ANSI slot the base colour fills, e.g. "Green". */ + ansi: string; + base: DrColor; + dim: DrColor; + bright: DrColor; +} + +export const accentFamilies: DrAccentFamily[] = [ + { + name: 'Memory Leek', + ansi: 'Green', + base: { id: 'memory-leek', name: 'Memory Leek', hex: '#8fa667' }, + dim: { id: 'dim-memory-leek', name: 'Dim Memory Leek', hex: '#627247' }, + bright: { id: 'bright-memory-leek', name: 'Bright Memory Leek', hex: '#94a577' } + }, + { + name: 'Stack Overglow', + ansi: 'Yellow', + base: { id: 'stack-overglow', name: 'Stack Overglow', hex: '#d4a759' }, + dim: { id: 'dim-stack-overglow', name: 'Dim Stack Overglow', hex: '#a07e43' }, + bright: { id: 'bright-stack-overglow', name: 'Bright Stack Overglow', hex: '#d3ae6e' } + }, + { + name: 'Blue Screen', + ansi: 'Blue', + base: { id: 'blue-screen', name: 'Blue Screen', hex: '#8791b0' }, + dim: { id: 'dim-blue-screen', name: 'Dim Blue Screen', hex: '#60677c' }, + bright: { id: 'bright-blue-screen', name: 'Bright Blue Screen', hex: '#999eaf' } + }, + { + name: 'Fractured Shell', + ansi: 'Magenta', + base: { id: 'fractured-shell', name: 'Fractured Shell', hex: '#ba5a7d' }, + dim: { id: 'dim-fractured-shell', name: 'Dim Fractured Shell', hex: '#87405a' }, + bright: { id: 'bright-fractured-shell', name: 'Bright Fractured Shell', hex: '#ba6b88' } + }, + { + name: 'Dead Thread', + ansi: 'Cyan', + base: { id: 'dead-thread', name: 'Dead Thread', hex: '#6fa5a0' }, + dim: { id: 'dim-dead-thread', name: 'Dim Dead Thread', hex: '#4c726e' }, + bright: { id: 'bright-dead-thread', name: 'Bright Dead Thread', hex: '#7fa5a1' } + }, + { + name: 'Thermal Throttle', + ansi: 'Orange', + base: { id: 'thermal-throttle', name: 'Thermal Throttle', hex: '#d78556' }, + dim: { id: 'dim-thermal-throttle', name: 'Dim Thermal Throttle', hex: '#ac6d4a' }, + bright: { id: 'bright-thermal-throttle', name: 'Bright Thermal Throttle', hex: '#d6926b' } + } +]; + +export const allColors: DrColor[] = [ + ...rustRamp, + amberAlertText, + ...accentFamilies.flatMap((family) => [family.base, family.dim, family.bright]) +]; + +export const colorsById: ReadonlyMap = new Map( + allColors.map((color) => [color.id, color]) +); + +export function color(id: string): DrColor { + const found = colorsById.get(id); + if (!found) throw new Error(`Unknown Digital Rust colour id: ${id}`); + return found; +} + +export function hexToRgba(hex: string, alpha: number): string { + const value = parseInt(hex.slice(1), 16); + const r = (value >> 16) & 0xff; + const g = (value >> 8) & 0xff; + const b = value & 0xff; + return `rgba(${r}, ${g}, ${b}, ${alpha})`; +} + +function tint(id: string, alpha: number): string { + return hexToRgba(color(id).hex, alpha); +} + +function emitNamedColors(): string { + const ramp = rustRamp + .map((c) => `\t--${c.id}: ${c.hex};`) + .join('\n'); + const accents = accentFamilies + .flatMap((f) => [f.base, f.dim, f.bright]) + .map((c) => `\t--${c.id}: ${c.hex};`) + .join('\n'); + return `\t/* The rust ramp is the neutral scale. There are no separate grays. */\n${ramp}\n\t--${amberAlertText.id}: ${amberAlertText.hex}; /* ${amberAlertText.description} */\n\n\t/* Accent colours, each with dim and bright variants. */\n${accents}`; +} + +export function toTokensCss(): string { + return `/* GENERATED FILE. Edit src/lib/palette.ts, not this file. */ +:root { + color-scheme: dark; +${emitNamedColors()} + + /* Semantic surface tokens */ + --dr-surface-base: var(--event-horizon); + --dr-surface-secondary: var(--null-pointer); + --dr-surface-elevated: var(--core-meltdown); + --dr-surface-highlight: var(--bad-sector); + --dr-surface-active: ${internalHex.surfaceActive}; + + /* Semantic text tokens */ + --dr-text-primary: var(--ghost-pixel); + --dr-text-secondary: var(--phosphor-smoke); + --dr-text-link: var(--phantom-current); + --dr-text-link-hover: var(--fatal-error); + --dr-text-link-visited: var(--corrupted-cache); + --dr-text-on-accent: var(--ghost-pixel); + + /* Semantic action tokens */ + --dr-accent: var(--digital-rust); + --dr-accent-hover: var(--firewall-breach); /* Ghost Pixel on this passes AA (4.66:1); raw Amber Alert does not */ + + /* Semantic feedback tokens */ + --dr-success: var(--memory-leek); + --dr-warning: var(--stack-overglow); + --dr-danger: var(--amber-alert); + --dr-danger-text: var(--amber-alert-text); + --dr-info: var(--dead-thread); + + /* Semantic border colour tokens */ + --dr-border-color: var(--dark-packet); /* the 2px wall on interactive elements */ + --dr-border-color-well: var(--bad-sector); /* recessed input wells */ + --dr-border-color-hover: var(--digital-rust); /* ghost-control hover, focused wells */ + --dr-border-color-invalid: var(--amber-alert); + + /* Border tokens */ + --dr-border: 2px solid var(--dark-packet); + --dr-border-thick: 4px solid var(--dark-packet); /* page/site chrome only (headers, section rules); never on components */ + --dr-border-subtle: 1px solid var(--bad-sector); + --dr-border-focus: 2px solid var(--stack-overglow); + + /* Shadow tokens. No blur shadows: offset solids only. */ + --dr-shadow-offset-sm: 2px 2px 0 0 var(--dr-surface-highlight); + --dr-shadow-offset-md: 3px 3px 0 0 var(--dr-surface-highlight); + --dr-shadow-offset-lg: 4px 4px 0 0 var(--dr-surface-highlight); + --dr-shadow-hover-md: 4px 4px 0 0 var(--dr-surface-highlight); + --dr-shadow-active: 0 0 0 0 var(--dr-surface-highlight); + --dr-shadow-glow-sm: 0 0 10px ${tint('digital-rust', 0.4)}; + --dr-shadow-glow-md: 0 0 20px ${tint('digital-rust', 0.4)}; + --dr-shadow-inner-highlight: inset 0 1px 0 rgba(255, 255, 255, 0.1); + --dr-shadow-inner-lowlight: inset 0 -1px 0 ${tint('event-horizon', 0.6)}; + + /* Interaction tokens (the press cycle) */ + --dr-press-rest: translate(0, 0); + --dr-press-hover: translate(-2px, -2px); + --dr-press-active: translate(2px, 2px); + + /* Focus ring */ + --dr-focus-ring: 2px solid var(--stack-overglow); + --dr-focus-ring-offset: 2px; + + /* Radius tokens. Nothing above 6px. */ + --dr-radius-sm: 2px; + --dr-radius: 4px; + --dr-radius-lg: 6px; + + /* Spacing tokens */ + --dr-space-xs: 0.25rem; + --dr-space-sm: 0.5rem; + --dr-space-md: 1rem; + --dr-space-lg: 1.5rem; + --dr-space-xl: 2.5rem; + --dr-space-2xl: 4rem; + --dr-space-3xl: 6rem; + + /* Type scale tokens */ + --dr-text-xs: 0.75rem; + --dr-text-sm: 0.875rem; + --dr-text-base: 1rem; + --dr-text-lg: 1.25rem; + --dr-text-xl: 1.75rem; + --dr-text-2xl: 2.5rem; + --dr-text-3xl: 4rem; + + /* Motion tokens */ + --dr-duration-fast: 150ms; + --dr-duration-normal: 250ms; + --dr-duration-slow: 400ms; + --dr-ease-default: cubic-bezier(0.4, 0, 0.2, 1); + --dr-ease-out-expo: cubic-bezier(0.22, 1, 0.36, 1); + --dr-transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1); + --dr-transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1); + + /* Z-index tokens */ + --dr-z-content: 10; + --dr-z-noise: 1000; + + /* Scanline colour */ + --dr-scanline: ${tint('digital-rust', 0.03)}; + + /* Semantic tints (badge/diagnostic backgrounds and borders) */ + --memory-leek-10: ${tint('memory-leek', 0.1)}; + --memory-leek-15: ${tint('memory-leek', 0.15)}; + --memory-leek-30: ${tint('memory-leek', 0.3)}; + --dead-thread-10: ${tint('dead-thread', 0.1)}; + --dead-thread-15: ${tint('dead-thread', 0.15)}; + --dead-thread-30: ${tint('dead-thread', 0.3)}; + --amber-alert-10: ${tint('amber-alert', 0.1)}; + --amber-alert-15: ${tint('amber-alert', 0.15)}; + --amber-alert-25: ${tint('amber-alert', 0.25)}; + --stack-overglow-10: ${tint('stack-overglow', 0.1)}; + --stack-overglow-15: ${tint('stack-overglow', 0.15)}; + --stack-overglow-30: ${tint('stack-overglow', 0.3)}; + --phantom-current-15: ${tint('phantom-current', 0.15)}; + --phantom-current-30: ${tint('phantom-current', 0.3)}; + --core-meltdown-40: ${tint('core-meltdown', 0.4)}; /* translucent panel tint (blockquotes, scrims) */ + --event-horizon-95: ${tint('event-horizon', 0.95)}; /* near-opaque warm backdrop (lightboxes) */ + --phosphor-smoke-70: ${tint('phosphor-smoke', 0.7)}; /* de-emphasised body copy (hints) */ + --dr-text-muted: ${tint('phosphor-smoke', 0.5)}; + + /* Font stacks. Illustrative only, NOT a constraint. Any families of + equivalent character (condensed uppercase for heading, slab/humanist + serif or humanist sans for body, tabular monospace for readouts) + satisfy the role; substitute freely to suit the project's font + license and locale. */ + --dr-font-heading: "Rajdhani", "Saira SemiCondensed", "Trebuchet MS", sans-serif; + --dr-font-body: "Zilla Slab", "Bitter", "Source Serif 4", Georgia, serif; + --dr-font-mono: "IBM Plex Mono", "Space Mono", ui-monospace, "Fira Code", + "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", + monospace; +} +`; +} diff --git a/src/lib/styles/app.css b/src/lib/styles/app.css new file mode 100644 index 0000000..9661d86 --- /dev/null +++ b/src/lib/styles/app.css @@ -0,0 +1,1052 @@ +@import "/src/lib/styles/normalize.css"; +@import "/src/lib/generated/tokens.css"; + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-variant-ligatures: common-ligatures discretionary-ligatures no-historical-ligatures contextual; + font-variant-numeric: oldstyle-nums tabular-nums; + hyphens: auto; + font-kerning: normal; + font-optical-sizing: auto; + text-rendering: optimizeLegibility; +} + + +/* ──────────────────────────────────────────── + Base + ──────────────────────────────────────────── */ + +body { + background: var(--dr-surface-base); + color: var(--dr-text-primary); + font-family: var(--dr-font-body); + font-weight: 500; + min-height: 100vh; + padding: var(--dr-space-xl); + position: relative; + overflow-x: hidden; + line-height: 1.6; +} + +/* ── Atmospheric noise texture (non-negotiable) ── */ +body::before { + content: ""; + position: fixed; + inset: 0; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); + opacity: 0.02; + pointer-events: none; + z-index: var(--dr-z-noise); +} + +/* ── Scanline overlay (non-negotiable) ── */ +body::after { + content: ""; + position: fixed; + inset: 0; + background: repeating-linear-gradient(0deg, + transparent, + transparent 2px, + var(--dr-scanline) 2px, + var(--dr-scanline) 4px); + pointer-events: none; + z-index: calc(var(--dr-z-noise) - 1); +} + +.container { + max-width: 1400px; + margin: 0 auto; + position: relative; + z-index: var(--dr-z-content); +} + +/* ──────────────────────────────────────────── + Typography + ──────────────────────────────────────────── */ + +h1, h2, h3, h4, h5, h6 { + font-family: var(--dr-font-heading); + font-variation-settings: "slnt" 0; + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.1; +} + +/* ──────────────────────────────────────────── + Section titles (bracket notation) + ──────────────────────────────────────────── */ + +.section-title { + color: var(--fatal-error); + font-size: var(--dr-text-xl); + margin: var(--dr-space-2xl) 0 var(--dr-space-lg); + text-transform: uppercase; + letter-spacing: 0.1em; + border-left: var(--dr-border-thick); + border-left-color: var(--digital-rust); + padding-left: var(--dr-space-md); + font-family: var(--dr-font-heading); + font-weight: 700; +} + +.section-copy { + color: var(--dr-text-secondary); + margin-bottom: var(--dr-space-md); + max-width: 70ch; +} + +/* ──────────────────────────────────────────── + Buttons (unused on main page but kept aligned) + ──────────────────────────────────────────── */ + +.btn { + display: inline-block; + padding: var(--dr-space-sm) var(--dr-space-lg); + border: 2px solid var(--dark-packet); + background: transparent; + color: var(--dr-text-secondary); + font-family: var(--dr-font-heading); + font-weight: 600; + font-size: var(--dr-text-sm); + border-radius: var(--dr-radius); + cursor: pointer; + transition: transform var(--dr-transition-fast), + box-shadow var(--dr-transition-fast), + background-color var(--dr-transition-fast), + border-color var(--dr-transition-fast), + color var(--dr-transition-fast); + text-transform: uppercase; + letter-spacing: 0.05em; + margin: 0.25rem; + box-shadow: var(--dr-shadow-offset-sm), + var(--dr-shadow-inner-highlight); + text-decoration: none; +} + +.btn:hover { + background: var(--dr-surface-elevated); + border-color: var(--digital-rust); + color: var(--dr-text-primary); + transform: var(--dr-press-hover); + box-shadow: var(--dr-shadow-hover-md), + var(--dr-shadow-inner-highlight); +} + +.btn:active { + transform: var(--dr-press-active); + box-shadow: var(--dr-shadow-active); +} + +.btn:focus-visible { + outline: var(--dr-focus-ring); + outline-offset: var(--dr-focus-ring-offset); +} + +.btn-primary { + background: var(--digital-rust); + border-color: var(--digital-rust); + color: var(--dr-text-on-accent); + box-shadow: var(--dr-shadow-offset-md), + var(--dr-shadow-inner-highlight); +} + +.btn-primary:hover { + background: var(--firewall-breach); + border-color: var(--firewall-breach); + color: var(--dr-text-on-accent); + transform: var(--dr-press-hover); + box-shadow: var(--dr-shadow-hover-md), + var(--dr-shadow-glow-sm), + var(--dr-shadow-inner-highlight); +} + +.btn-primary:active { + transform: var(--dr-press-active); + box-shadow: var(--dr-shadow-active); +} + +.btn-success { + border-color: var(--memory-leek); + color: var(--memory-leek); +} + +.btn-success:hover { + background: var(--memory-leek); + border-color: var(--memory-leek); + color: var(--dr-surface-base); +} + +.btn-warning { + border-color: var(--stack-overglow); + color: var(--stack-overglow); +} + +.btn-warning:hover { + background: var(--stack-overglow); + border-color: var(--stack-overglow); + color: var(--dr-surface-base); +} + +.btn-error { + border-color: var(--amber-alert); + color: var(--amber-alert-text); +} + +.btn-error:hover { + background: var(--firewall-breach); + border-color: var(--firewall-breach); + color: var(--ghost-pixel); +} + +.btn:disabled, +.btn[disabled] { + background: var(--dr-surface-highlight); + border-color: var(--dr-surface-highlight); + color: var(--dr-text-muted, var(--dr-text-muted)); + cursor: not-allowed; + transform: none; + box-shadow: none; + opacity: 0.7; +} + +/* ──────────────────────────────────────────── + Links + ──────────────────────────────────────────── */ + +a { + color: var(--dr-text-link); + text-decoration: underline; + text-underline-offset: 3px; + text-decoration-thickness: 1px; + transition: color var(--dr-transition-fast), + text-decoration-thickness var(--dr-transition-fast); +} + +a:hover { + color: var(--dr-text-link-hover); + text-decoration-thickness: 2px; +} + +a:visited { + color: var(--dr-text-link-visited); +} + +a:active { + color: var(--digital-rust); +} + +/* ──────────────────────────────────────────── + Status messages + ──────────────────────────────────────────── */ + +.status { + padding: var(--dr-space-md); + border-radius: var(--dr-radius); + margin: var(--dr-space-sm) 0; + border: var(--dr-border); + background: var(--dr-surface-elevated); +} + +.status-success { + background: var(--memory-leek-10); + border-color: var(--memory-leek); + color: var(--memory-leek); +} + +.status-warning { + background: var(--stack-overglow-10); + border-color: var(--stack-overglow); + color: var(--stack-overglow); +} + +.status-error { + background: var(--amber-alert-10); + border-color: var(--amber-alert); + color: var(--amber-alert-text); +} + +.status-info { + background: var(--dead-thread-10); + border-color: var(--dead-thread); + color: var(--dead-thread); +} + +/* ──────────────────────────────────────────── + Cursor & blinking + ──────────────────────────────────────────── */ + +.cursor { + display: inline-block; + width: 0.6em; + height: 1.2em; + background: var(--stack-overglow); + vertical-align: text-bottom; +} + +@keyframes blink { + + 0%, + 50% { + opacity: 1; + } + + 51%, + 100% { + opacity: 0; + } +} + +.code, +.code-line, +pre, +code { + hyphens: none; +} + +/* ──────────────────────────────────────────── + Glitch animation (title) + ──────────────────────────────────────────── */ + +@keyframes glitch { + 0% { + text-shadow: 0 0 24px color-mix(in srgb, var(--digital-rust) 70%, transparent), -1px -1px var(--digital-rust), + 1px 1px var(--dead-thread); + transform: translate3d(0, 0, 0); + filter: hue-rotate(0deg) saturate(130%); + clip-path: inset(0 0 0 0); + } + + 4% { + text-shadow: 4px -2px var(--fractured-shell), -4px 2px var(--dead-thread), + 0 0 32px color-mix(in srgb, var(--digital-rust) 80%, transparent); + transform: translate3d(-2px, 1px, 0) skewX(1deg); + filter: hue-rotate(-6deg) saturate(160%); + clip-path: inset(12% 0 28% 0); + } + + 9% { + text-shadow: -6px 0 var(--memory-leek), 6px 0 var(--thermal-throttle), + 0 0 18px color-mix(in srgb, var(--digital-rust) 60%, transparent); + transform: translate3d(2px, -3px, 0) skewY(-1.5deg); + filter: hue-rotate(12deg) saturate(140%); + clip-path: inset(0 0 8% 0); + } + + 15% { + text-shadow: -2px 2px var(--digital-rust), 3px -3px var(--dead-thread), + -1px -1px var(--fractured-shell); + transform: translate3d(-1px, 2px, 0) scale(1.01); + filter: hue-rotate(-18deg) saturate(180%); + clip-path: inset(32% 0 6% 0); + } + + 24% { + text-shadow: 8px 2px var(--amber-alert), -8px -2px var(--dead-thread); + transform: translate3d(3px, -2px, 0) skewX(-1.2deg); + filter: hue-rotate(25deg) saturate(150%); + clip-path: inset(6% 0 40% 0); + } + + 38% { + text-shadow: -3px 0 var(--fractured-shell), 3px 0 color-mix(in srgb, var(--memory-leek) 60%, transparent), + 0 0 26px color-mix(in srgb, var(--digital-rust) 90%, transparent); + transform: translate3d(-4px, 1px, 0) skewY(2deg); + filter: hue-rotate(-32deg) saturate(170%); + clip-path: inset(18% 0 20% 0); + } + + 52% { + text-shadow: 10px -3px var(--dead-thread), -10px 3px var(--thermal-throttle), + 0 0 16px color-mix(in srgb, var(--digital-rust) 40%, transparent); + transform: translate3d(5px, -4px, 0) skewX(2deg) skewY(-1deg); + filter: hue-rotate(38deg) saturate(150%); + clip-path: inset(0 0 0 0); + } + + 67% { + text-shadow: -5px -1px color-mix(in srgb, var(--fatal-error) 90%, transparent), + 5px 1px color-mix(in srgb, var(--dead-thread) 90%, transparent); + transform: translate3d(-3px, 4px, 0) scale(1.015); + filter: hue-rotate(-48deg) saturate(175%) contrast(115%); + clip-path: inset(14% 0 14% 0); + } + + 82% { + text-shadow: 12px 0 color-mix(in srgb, var(--digital-rust) 90%, transparent), -12px 0 color-mix(in srgb, var(--memory-leek) 70%, transparent), + 0 0 40px color-mix(in srgb, var(--digital-rust) 90%, transparent); + transform: translate3d(6px, -2px, 0) skewX(-2deg) skewY(2deg); + filter: hue-rotate(54deg) saturate(210%); + clip-path: inset(48% 0 4% 0); + } + + 100% { + text-shadow: 0 0 24px color-mix(in srgb, var(--digital-rust) 75%, transparent), -1px 1px var(--digital-rust), + 1px -1px var(--dead-thread); + transform: translate3d(0, 0, 0); + filter: hue-rotate(0deg) saturate(130%); + clip-path: inset(0 0 0 0); + } +} + +@media (prefers-reduced-motion: no-preference) { + h1:hover { + animation: glitch 0.9s steps(2, end) infinite alternate; + will-change: transform, text-shadow; + } + + .cursor { + animation: blink 1s infinite; + } +} + +/* ──────────────────────────────────────────── + Footer + ──────────────────────────────────────────── */ + +footer { + margin-top: var(--dr-space-3xl); + padding-top: var(--dr-space-xl); + border-top: var(--dr-border); + text-align: center; + color: var(--copper-trace); + font-size: var(--dr-text-sm); +} + +.footer-tagline { + margin-top: var(--dr-space-md); + color: var(--fatal-error); + font-family: var(--dr-font-heading); + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +/* ──────────────────────────────────────────── + UI Components (Digital Rust UI Specification) + ──────────────────────────────────────────── */ + +/* ── Component demo layout ── */ +.ui-components-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: var(--dr-space-lg); + margin-top: var(--dr-space-lg); +} + +.component-panel { + background: var(--dr-surface-elevated); + border: var(--dr-border); + border-radius: var(--dr-radius); + box-shadow: var(--dr-shadow-offset-md), + var(--dr-shadow-inner-highlight); + padding: var(--dr-space-lg); +} + +.component-panel > h3 { + color: var(--fatal-error); + font-size: var(--dr-text-xs); + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: var(--dr-space-md); + border-bottom: var(--dr-border-subtle); + padding-bottom: var(--dr-space-sm); +} + +.component-row { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--dr-space-sm); + margin-bottom: var(--dr-space-md); +} + +.component-row:last-child { + margin-bottom: 0; +} + +.component-note { + font-family: var(--dr-font-mono); + font-size: var(--dr-text-xs); + color: var(--dr-text-secondary); + margin-top: var(--dr-space-sm); +} + +/* ── Inputs (recessed wells) ── */ +.dr-input, +.dr-textarea { + background: var(--dr-surface-base); + border: 2px solid var(--dr-surface-highlight); + border-radius: var(--dr-radius); + padding: var(--dr-space-sm) 0.75rem; + color: var(--dr-text-primary); + font-family: var(--dr-font-body); + font-size: var(--dr-text-base); + font-weight: 500; + width: 100%; + transition: border-color var(--dr-transition-fast), + box-shadow var(--dr-transition-fast); +} + +.dr-input:hover:not(:focus), +.dr-textarea:hover:not(:focus) { + border-color: var(--dark-packet); +} + +.dr-input:focus, +.dr-textarea:focus { + outline: var(--dr-focus-ring); + outline-offset: var(--dr-focus-ring-offset); + border-color: var(--digital-rust); +} + +.dr-input::placeholder, +.dr-textarea::placeholder { + color: var(--dr-text-muted); + font-style: italic; +} + +.dr-input:disabled, +.dr-textarea:disabled { + border-color: transparent; + color: var(--dr-text-muted); + cursor: not-allowed; +} + +.dr-input[aria-invalid="true"] { + border-color: var(--amber-alert); +} + +.dr-textarea { + min-height: 96px; + resize: vertical; +} + +.dr-field { + margin-bottom: var(--dr-space-md); +} + +.dr-field > label { + display: block; + font-family: var(--dr-font-heading); + font-size: var(--dr-text-xs); + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--dr-text-secondary); + margin-bottom: var(--dr-space-xs); +} + +.dr-field .field-error { + font-size: var(--dr-text-xs); + color: var(--amber-alert-text); + margin-top: var(--dr-space-xs); +} + +/* ── Checkbox ── */ +.dr-checkbox { + display: inline-flex; + align-items: center; + gap: var(--dr-space-sm); + cursor: pointer; + font-size: var(--dr-text-sm); + color: var(--dr-text-secondary); + user-select: none; +} + +.dr-checkbox input { + appearance: none; + -webkit-appearance: none; + width: 18px; + height: 18px; + flex: 0 0 18px; + border: 2px solid var(--dark-packet); + border-radius: var(--dr-radius-sm); + background: var(--dr-surface-base); + box-shadow: var(--dr-shadow-offset-sm); + cursor: pointer; + position: relative; + margin: 0; + transition: transform var(--dr-transition-fast), + box-shadow var(--dr-transition-fast), + background-color var(--dr-transition-fast), + border-color var(--dr-transition-fast); +} + +.dr-checkbox input:hover { + border-color: var(--digital-rust); + transform: var(--dr-press-hover); + box-shadow: var(--dr-shadow-hover-md); +} + +.dr-checkbox input:active { + transform: var(--dr-press-active); + box-shadow: var(--dr-shadow-active); +} + +.dr-checkbox input:focus-visible { + outline: var(--dr-focus-ring); + outline-offset: var(--dr-focus-ring-offset); +} + +.dr-checkbox input:checked { + background: var(--digital-rust); + border-color: var(--digital-rust); +} + +.dr-checkbox input:checked::after { + content: "✓"; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: var(--dr-text-on-accent); + font-size: 12px; + font-weight: 700; + line-height: 1; +} + +.dr-checkbox input:disabled { + border-color: var(--dr-surface-highlight); + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +/* ── Toggle ── */ +.dr-toggle { + display: inline-flex; + align-items: center; + gap: var(--dr-space-sm); + cursor: pointer; + font-size: var(--dr-text-sm); + color: var(--dr-text-secondary); + user-select: none; +} + +.dr-toggle input { + appearance: none; + -webkit-appearance: none; + width: 40px; + height: 22px; + flex: 0 0 40px; + background: var(--dr-surface-highlight); + border: 2px solid var(--dark-packet); + border-radius: var(--dr-radius); + box-shadow: var(--dr-shadow-offset-sm); + cursor: pointer; + position: relative; + margin: 0; + transition: background-color var(--dr-transition-fast), + border-color var(--dr-transition-fast), + box-shadow var(--dr-transition-fast); +} + +.dr-toggle input::after { + content: ""; + position: absolute; + top: 1px; + left: 1px; + width: 14px; + height: 14px; + background: var(--ghost-pixel); + border-radius: var(--dr-radius-sm); + box-shadow: 1px 1px 0 0 var(--dr-surface-highlight), + var(--dr-shadow-inner-lowlight); + transition: transform var(--dr-transition-fast); +} + +.dr-toggle input:checked { + background: var(--digital-rust); + border-color: var(--digital-rust); +} + +.dr-toggle input:checked::after { + transform: translateX(18px); +} + +.dr-toggle input:hover { + border-color: var(--digital-rust); +} + +.dr-toggle input:focus-visible { + outline: var(--dr-focus-ring); + outline-offset: var(--dr-focus-ring-offset); +} + +/* ── Slider ── */ +.dr-slider { + appearance: none; + -webkit-appearance: none; + width: 100%; + height: 4px; + background: var(--dr-surface-base); + border: 1px solid var(--dr-surface-highlight); + border-radius: var(--dr-radius-sm); + cursor: pointer; +} + +.dr-slider::-webkit-slider-thumb { + appearance: none; + -webkit-appearance: none; + width: 16px; + height: 16px; + background: var(--ghost-pixel); + border: 2px solid var(--dark-packet); + border-radius: var(--dr-radius-sm); + box-shadow: var(--dr-shadow-offset-sm), + var(--dr-shadow-inner-lowlight); + cursor: pointer; + transition: transform var(--dr-transition-fast), + box-shadow var(--dr-transition-fast); +} + +.dr-slider::-webkit-slider-thumb:hover { + transform: var(--dr-press-hover); + box-shadow: var(--dr-shadow-hover-md), + var(--dr-shadow-inner-lowlight); +} + +.dr-slider::-webkit-slider-thumb:active { + transform: var(--dr-press-active); + box-shadow: var(--dr-shadow-active); +} + +.dr-slider::-moz-range-thumb { + width: 12px; + height: 12px; + background: var(--ghost-pixel); + border: 2px solid var(--dark-packet); + border-radius: var(--dr-radius-sm); + box-shadow: var(--dr-shadow-offset-sm), + var(--dr-shadow-inner-lowlight); + cursor: pointer; + transition: transform var(--dr-transition-fast), + box-shadow var(--dr-transition-fast); +} + +.dr-slider::-moz-range-progress { + background: var(--digital-rust); + height: 4px; +} + +.dr-slider:focus-visible { + outline: var(--dr-focus-ring); + outline-offset: 4px; +} + +/* ── Tabs ── */ +.dr-tabs { + border: var(--dr-border); + border-radius: var(--dr-radius); + background: var(--dr-surface-secondary); + box-shadow: var(--dr-shadow-offset-sm), + var(--dr-shadow-inner-highlight); + overflow: hidden; +} + +.dr-tab-bar { + display: flex; + background: var(--dr-surface-elevated); + border-bottom: var(--dr-border); +} + +.dr-tab { + padding: var(--dr-space-sm) var(--dr-space-md); + font-family: var(--dr-font-heading); + font-size: var(--dr-text-xs); + font-weight: 600; + letter-spacing: 0.05em; + color: var(--dr-text-secondary); + background: transparent; + border: none; + border-bottom: 2px solid transparent; + cursor: pointer; + transition: color var(--dr-transition-fast), + background-color var(--dr-transition-fast); +} + +.dr-tab:hover { + color: var(--dr-text-primary); + background: var(--dr-surface-highlight); +} + +.dr-tab[aria-selected="true"], +.dr-tab.active { + background: var(--dr-surface-secondary); + color: var(--dr-text-primary); + border-bottom-color: var(--digital-rust); +} + +.dr-tab-body { + padding: var(--dr-space-md); + font-family: var(--dr-font-mono); + font-size: var(--dr-text-sm); + color: var(--dr-text-secondary); +} + +/* ── Menu ── */ +.dr-menu { + background: var(--dr-surface-elevated); + border: var(--dr-border); + border-radius: var(--dr-radius); + box-shadow: var(--dr-shadow-offset-md), + var(--dr-shadow-inner-highlight); + padding: var(--dr-space-xs); + list-style: none; + max-width: 260px; +} + +.dr-menu li { + padding: var(--dr-space-xs) var(--dr-space-sm); + border-radius: var(--dr-radius-sm); + color: var(--dr-text-secondary); + font-size: var(--dr-text-sm); + cursor: pointer; + transition: background-color var(--dr-transition-fast), + color var(--dr-transition-fast); +} + +.dr-menu li:hover, +.dr-menu li[aria-selected="true"] { + background: var(--dr-surface-highlight); + color: var(--dr-text-primary); +} + +.dr-menu .menu-separator { + margin: var(--dr-space-xs) calc(var(--dr-space-xs) * -1); + border-bottom: 1px solid var(--dr-surface-highlight); + padding: 0; + cursor: default; +} + +.dr-menu .menu-separator:hover { + background: transparent; +} + +/* ── Modal / dialog demo ── */ +.dr-modal-demo { + background: var(--dr-surface-elevated); + border: var(--dr-border); + border-radius: var(--dr-radius); + box-shadow: var(--dr-shadow-offset-lg), + var(--dr-shadow-inner-highlight); + padding: var(--dr-space-lg); + max-width: 380px; +} + +.dr-modal-demo h4 { + color: var(--fatal-error); + font-family: var(--dr-font-heading); + font-size: var(--dr-text-sm); + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: var(--dr-space-sm); +} + +.dr-modal-demo p { + font-size: var(--dr-text-sm); + color: var(--dr-text-secondary); + margin-bottom: var(--dr-space-md); +} + +.dr-modal-demo .modal-actions { + display: flex; + justify-content: flex-end; + gap: var(--dr-space-sm); +} + +/* ── Toasts ── */ +.dr-toast { + background: var(--bricked-board); + color: var(--dr-text-primary); + border: var(--dr-border); + border-radius: var(--dr-radius); + box-shadow: var(--dr-shadow-offset-md), + var(--dr-shadow-inner-highlight); + padding: var(--dr-space-sm) var(--dr-space-md); + font-size: var(--dr-text-sm); + margin-bottom: var(--dr-space-sm); +} + +.dr-toast.success { border-left: 3px solid var(--memory-leek); } +.dr-toast.warning { border-left: 3px solid var(--stack-overglow); } +.dr-toast.error { border-left: 3px solid var(--amber-alert); } +.dr-toast.info { border-left: 3px solid var(--dead-thread); } + +/* ── Tooltip ── */ +.dr-tooltip-demo { + display: inline-block; + position: relative; + background: var(--dr-surface-elevated); + border: var(--dr-border); + border-radius: var(--dr-radius); + box-shadow: var(--dr-shadow-offset-md), + var(--dr-shadow-inner-highlight); + padding: var(--dr-space-xs) var(--dr-space-sm); + font-size: var(--dr-text-sm); + color: var(--dr-text-secondary); + max-width: 240px; +} + +/* ── Callouts ── */ +.dr-callout { + background: var(--dr-surface-elevated); + border: var(--dr-border); + border-radius: var(--dr-radius); + box-shadow: var(--dr-shadow-offset-md), + var(--dr-shadow-inner-highlight); + padding: var(--dr-space-md); + margin-bottom: var(--dr-space-md); +} + +.dr-callout .callout-title { + font-family: var(--dr-font-heading); + font-weight: 700; + font-size: var(--dr-text-sm); + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--dr-text-primary); + margin-bottom: var(--dr-space-xs); +} + +.dr-callout p { + font-size: var(--dr-text-sm); + color: var(--dr-text-secondary); +} + +.dr-callout.note { border-left: 3px solid var(--dead-thread); } +.dr-callout.note .callout-title { color: var(--dead-thread); } +.dr-callout.warning { border-left: 3px solid var(--stack-overglow); } +.dr-callout.warning .callout-title { color: var(--stack-overglow); } +.dr-callout.error { border-left: 3px solid var(--amber-alert); } +.dr-callout.error .callout-title { color: var(--amber-alert-text); } + +/* ── Badges (spec-compliant, supplements .badge in UI lab) ── */ +.badge.warn { + color: var(--stack-overglow); + background: var(--stack-overglow-15); + border: 1px solid var(--stack-overglow-30); +} + +.badge.info { + color: var(--dead-thread); + background: var(--dead-thread-15); + border: 1px solid var(--dead-thread-30); +} + +/* ── Status bar demo ── */ +.dr-statusbar { + display: flex; + gap: var(--dr-space-md); + background: var(--bricked-board); + border-top: var(--dr-border); + padding: var(--dr-space-xs) var(--dr-space-sm); + font-family: var(--dr-font-mono); + font-size: var(--dr-text-xs); + color: var(--dr-text-primary); + border-radius: 0 0 var(--dr-radius) var(--dr-radius); +} + +.dr-statusbar .status-success { color: var(--memory-leek); } +.dr-statusbar .status-warning { color: var(--stack-overglow); } +.dr-statusbar .status-error { color: var(--amber-alert-text); } + +/* ──────────────────────────────────────────── + Selection & Focus (design system) + ──────────────────────────────────────────── */ + +::selection { + background: var(--digital-rust); + color: var(--dr-text-on-accent); +} + +:focus-visible { + outline: 2px solid var(--stack-overglow); + outline-offset: 2px; +} + +/* ──────────────────────────────────────────── + Scrollbar (design system) + ──────────────────────────────────────────── */ + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: var(--dark-packet); + border-radius: 4px; + border: 2px solid var(--dr-surface-secondary); +} + +::-webkit-scrollbar-thumb:hover { + background: var(--digital-rust); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--dark-packet) transparent; +} + +/* ──────────────────────────────────────────── + Small mobile / narrow viewport + ──────────────────────────────────────────── */ + +@media (max-width: 480px) { + body { + padding: var(--dr-space-sm); + } + + .container { + padding: 0; + } + + h1 { + font-size: clamp(1.75rem, 10vw, 2.5rem); + letter-spacing: 0.05em; + } + + .token-grid { + grid-template-columns: 1fr; + } + + .color-grid { + grid-template-columns: repeat(auto-fill, minmax(80px, 1fr)); + } + + .color-chip { + height: 72px; + } + + .color-hex { + font-size: 0.6rem; + } + + .ansi-grid { + grid-template-columns: 1fr 1fr; + } +} + +/* ──────────────────────────────────────────── + Reduced motion (design system) + ──────────────────────────────────────────── */ + +@media (prefers-reduced-motion: reduce) { + body::before, body::after { + content: none; + } + + *, *::before, *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} diff --git a/src/lib/styles/normalize.css b/src/lib/styles/normalize.css new file mode 100644 index 0000000..52a3fa9 --- /dev/null +++ b/src/lib/styles/normalize.css @@ -0,0 +1,290 @@ +/* Document + * ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +:where(html) { + line-height: 1.15; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + text-size-adjust: 100%; + /* 2 */ +} + +/* Sections + * ========================================================================== */ + +/** + * Remove the margin in all browsers. (opinionated) + */ + +:where(body) { + margin: 0; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Edge, Firefox, and Safari. + */ + +:where(h1) { + font-size: 2em; + margin-block-end: 0.67em; + margin-block-start: 0.67em; +} + +/* Grouping content + * ========================================================================== */ + +/** + * Remove the margin on nested lists in Chrome, Edge, and Safari. + */ + +:where(dl, ol, ul) :where(dl, ol, ul) { + margin-block-end: 0; + margin-block-start: 0; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Correct the inheritance of border color in Firefox. + */ + +:where(hr) { + box-sizing: content-box; + /* 1 */ + color: inherit; + /* 2 */ + height: 0; + /* 1 */ +} + +/* Text-level semantics + * ========================================================================== */ + +/** + * Add the correct text decoration in Safari. + */ + +:where(abbr[title]) { + text-decoration: underline; + text-decoration: underline dotted; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +:where(b, strong) { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +:where(code, kbd, pre, samp) { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +:where(small) { + font-size: 80%; +} + +/* Tabular data + * ========================================================================== */ + +/** + * 1. Correct table border color in Chrome, Edge, and Safari. + * 2. Remove text indentation from table contents in Chrome, Edge, and Safari. + */ + +:where(table) { + border-color: currentColor; + /* 1 */ + text-indent: 0; + /* 2 */ +} + +/* Forms + * ========================================================================== */ + +/** + * Remove the margin on controls in Safari. + */ + +:where(button, input, select) { + margin: 0; +} + +/** + * Remove the inheritance of text transform in Firefox. + */ + +:where(button) { + text-transform: none; +} + +/** + * Correct the inability to style buttons in iOS and Safari. + */ + +:where(button, + input:is([type="button" i], [type="reset" i], [type="submit" i])) { + -webkit-appearance: button; + appearance: button; +} + +/** + * Add the correct vertical alignment in Chrome, Edge, and Firefox. + */ + +:where(progress) { + vertical-align: baseline; +} + +/** + * Remove the inheritance of text transform in Firefox. + */ + +:where(select) { + text-transform: none; +} + +/** + * Remove the margin in Firefox and Safari. + */ + +:where(textarea) { + margin: 0; +} + +/** + * 1. Correct the odd appearance in Chrome, Edge, and Safari. + * 2. Correct the outline style in Safari. + */ + +:where(input[type="search" i]) { + -webkit-appearance: textfield; + appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Safari. + */ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/** + * Correct the text style of placeholders in Chrome, Edge, and Safari. + */ + +::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; +} + +/** + * Remove the inner padding in Chrome, Edge, and Safari on macOS. + */ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style upload buttons in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/** + * Remove the inner border and padding of focus outlines in Firefox. + */ + +:where(button, + input:is([type="button" i], + [type="color" i], + [type="reset" i], + [type="submit" i]))::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus outline styles unset by the previous rule in Firefox. + */ + +:where(button, + input:is([type="button" i], + [type="color" i], + [type="reset" i], + [type="submit" i]))::-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Remove the additional :invalid styles in Firefox. + */ + +:where(:-moz-ui-invalid) { + box-shadow: none; +} + +/* Interactive + * ========================================================================== */ + +/* + * Add the correct styles in Safari. + */ + +:where(dialog) { + background-color: white; + border: solid; + color: black; + height: -moz-fit-content; + height: fit-content; + left: 0; + margin: auto; + padding: 1em; + position: absolute; + right: 0; + width: -moz-fit-content; + width: fit-content; +} + +:where(dialog:not([open])) { + display: none; +} + +/* + * Add the correct display in all browsers. + */ + +:where(summary) { + display: list-item; +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..98ba0d8 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,7 @@ + + +{@render children()} diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..189f71e --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..cc88df0 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,2 @@ +

Welcome to SvelteKit

+

Visit svelte.dev/docs/kit to read the documentation

diff --git a/apple-touch-icon.png b/static/apple-touch-icon.png similarity index 100% rename from apple-touch-icon.png rename to static/apple-touch-icon.png diff --git a/digitalrust.webp b/static/digitalrust.webp similarity index 100% rename from digitalrust.webp rename to static/digitalrust.webp diff --git a/digitalrust2.webp b/static/digitalrust2.webp similarity index 100% rename from digitalrust2.webp rename to static/digitalrust2.webp diff --git a/digitalrust2t.webp b/static/digitalrust2t.webp similarity index 100% rename from digitalrust2t.webp rename to static/digitalrust2t.webp diff --git a/digitalrust3.webp b/static/digitalrust3.webp similarity index 100% rename from digitalrust3.webp rename to static/digitalrust3.webp diff --git a/digitalrust3t.webp b/static/digitalrust3t.webp similarity index 100% rename from digitalrust3t.webp rename to static/digitalrust3t.webp diff --git a/digitalrust4.webp b/static/digitalrust4.webp similarity index 100% rename from digitalrust4.webp rename to static/digitalrust4.webp diff --git a/digitalrust4t.webp b/static/digitalrust4t.webp similarity index 100% rename from digitalrust4t.webp rename to static/digitalrust4t.webp diff --git a/digitalrustt.webp b/static/digitalrustt.webp similarity index 100% rename from digitalrustt.webp rename to static/digitalrustt.webp diff --git a/favicon-96x96.png b/static/favicon-96x96.png similarity index 100% rename from favicon-96x96.png rename to static/favicon-96x96.png diff --git a/favicon.ico b/static/favicon.ico similarity index 100% rename from favicon.ico rename to static/favicon.ico diff --git a/favicon.svg b/static/favicon.svg similarity index 100% rename from favicon.svg rename to static/favicon.svg diff --git a/ports/DigitalRustKDE.colors b/static/ports/DigitalRustKDE.colors similarity index 100% rename from ports/DigitalRustKDE.colors rename to static/ports/DigitalRustKDE.colors diff --git a/ports/DigitalRustKate.theme b/static/ports/DigitalRustKate.theme similarity index 100% rename from ports/DigitalRustKate.theme rename to static/ports/DigitalRustKate.theme diff --git a/ports/DigitalRustKonsole.colorscheme b/static/ports/DigitalRustKonsole.colorscheme similarity index 100% rename from ports/DigitalRustKonsole.colorscheme rename to static/ports/DigitalRustKonsole.colorscheme diff --git a/ports/DigitalRustPtyxis.palette b/static/ports/DigitalRustPtyxis.palette similarity index 100% rename from ports/DigitalRustPtyxis.palette rename to static/ports/DigitalRustPtyxis.palette diff --git a/ports/DigitalRustfish.theme b/static/ports/DigitalRustfish.theme similarity index 100% rename from ports/DigitalRustfish.theme rename to static/ports/DigitalRustfish.theme diff --git a/ports/agentskill.zip b/static/ports/agentskill.zip similarity index 100% rename from ports/agentskill.zip rename to static/ports/agentskill.zip diff --git a/ports/digital-rust-ghostty b/static/ports/digital-rust-ghostty similarity index 100% rename from ports/digital-rust-ghostty rename to static/ports/digital-rust-ghostty diff --git a/ports/digitalrustpi/LICENSE b/static/ports/digitalrustpi/LICENSE similarity index 100% rename from ports/digitalrustpi/LICENSE rename to static/ports/digitalrustpi/LICENSE diff --git a/ports/digitalrustpi/README.md b/static/ports/digitalrustpi/README.md similarity index 100% rename from ports/digitalrustpi/README.md rename to static/ports/digitalrustpi/README.md diff --git a/ports/digitalrustpi/digital-rust.json b/static/ports/digitalrustpi/digital-rust.json similarity index 100% rename from ports/digitalrustpi/digital-rust.json rename to static/ports/digitalrustpi/digital-rust.json diff --git a/ports/digitalrustpi/package.json b/static/ports/digitalrustpi/package.json similarity index 100% rename from ports/digitalrustpi/package.json rename to static/ports/digitalrustpi/package.json diff --git a/ports/digitalrustpi/screenshot.webp b/static/ports/digitalrustpi/screenshot.webp similarity index 100% rename from ports/digitalrustpi/screenshot.webp rename to static/ports/digitalrustpi/screenshot.webp diff --git a/ports/vscode/.gitattributes b/static/ports/vscode/.gitattributes similarity index 100% rename from ports/vscode/.gitattributes rename to static/ports/vscode/.gitattributes diff --git a/ports/vscode/.gitignore b/static/ports/vscode/.gitignore similarity index 100% rename from ports/vscode/.gitignore rename to static/ports/vscode/.gitignore diff --git a/ports/vscode/.vscodeignore b/static/ports/vscode/.vscodeignore similarity index 100% rename from ports/vscode/.vscodeignore rename to static/ports/vscode/.vscodeignore diff --git a/ports/vscode/CHANGELOG.md b/static/ports/vscode/CHANGELOG.md similarity index 100% rename from ports/vscode/CHANGELOG.md rename to static/ports/vscode/CHANGELOG.md diff --git a/ports/vscode/LICENSE.md b/static/ports/vscode/LICENSE.md similarity index 100% rename from ports/vscode/LICENSE.md rename to static/ports/vscode/LICENSE.md diff --git a/ports/vscode/README.md b/static/ports/vscode/README.md similarity index 100% rename from ports/vscode/README.md rename to static/ports/vscode/README.md diff --git a/ports/vscode/icon.png b/static/ports/vscode/icon.png similarity index 100% rename from ports/vscode/icon.png rename to static/ports/vscode/icon.png diff --git a/ports/vscode/package.json b/static/ports/vscode/package.json similarity index 100% rename from ports/vscode/package.json rename to static/ports/vscode/package.json diff --git a/ports/vscode/screenshots/digitalrust.webp b/static/ports/vscode/screenshots/digitalrust.webp similarity index 100% rename from ports/vscode/screenshots/digitalrust.webp rename to static/ports/vscode/screenshots/digitalrust.webp diff --git a/ports/vscode/themes/Digital Rust-color-theme.json b/static/ports/vscode/themes/Digital Rust-color-theme.json similarity index 100% rename from ports/vscode/themes/Digital Rust-color-theme.json rename to static/ports/vscode/themes/Digital Rust-color-theme.json diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 0000000..b6dd667 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/site.webmanifest b/static/site.webmanifest similarity index 100% rename from site.webmanifest rename to static/site.webmanifest diff --git a/wallpaper/Digital Rust.png b/static/wallpaper/Digital Rust.png similarity index 100% rename from wallpaper/Digital Rust.png rename to static/wallpaper/Digital Rust.png diff --git a/wallpaper/Digital Rust.svg b/static/wallpaper/Digital Rust.svg similarity index 100% rename from wallpaper/Digital Rust.svg rename to static/wallpaper/Digital Rust.svg diff --git a/wallpaper/Digital Rust.webp b/static/wallpaper/Digital Rust.webp similarity index 100% rename from wallpaper/Digital Rust.webp rename to static/wallpaper/Digital Rust.webp diff --git a/web-app-manifest-192x192.png b/static/web-app-manifest-192x192.png similarity index 100% rename from web-app-manifest-192x192.png rename to static/web-app-manifest-192x192.png diff --git a/web-app-manifest-512x512.png b/static/web-app-manifest-512x512.png similarity index 100% rename from web-app-manifest-512x512.png rename to static/web-app-manifest-512x512.png diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a3281b0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "$app/tsconfig", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "sourceMap": true, + "strict": true + }, + "include": ["src"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..eeeb95b --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,44 @@ +import adapter from '@sveltejs/adapter-static'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { mkdirSync, writeFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { defineConfig, type Plugin } from 'vite'; +import { toTokensCss } from './src/lib/palette.ts'; + +const generatedTokens = fileURLToPath(new URL('./src/lib/generated/tokens.css', import.meta.url)); + +// Keeps src/lib/generated/tokens.css in sync with src/lib/palette.ts so the +// site has a single palette source. +function paletteTokens(): Plugin { + const write = () => { + mkdirSync(dirname(generatedTokens), { recursive: true }); + writeFileSync(generatedTokens, toTokensCss()); + }; + return { + name: 'digital-rust-tokens', + buildStart: write, + configureServer(server) { + server.watcher.add(resolve('./src/lib/palette.ts')); + server.watcher.on('change', (file) => { + if (file.endsWith('palette.ts')) write(); + }); + } + }; +} + +export default defineConfig({ + plugins: [ + paletteTokens(), + sveltekit({ + compilerOptions: { + // Force runes mode for the project, except for libraries. Can be removed in svelte 6. + runes: ({ filename }) => + filename.split(/[/\\]/).includes('node_modules') ? undefined : true, + experimental: { async: true } + }, + adapter: adapter(), + experimental: { remoteFunctions: true, forkPreloads: true } + }) + ] +}); -- 2.51.2