From 676b75e7710fb1f0c6ee436f72f38ddcdcd7547b Mon Sep 17 00:00:00 2001 From: vikingowl Date: Thu, 25 Dec 2025 22:53:38 +0100 Subject: [PATCH] Initial commit: SvelteKit 3D printer housing documentation site MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Set up SvelteKit project with TypeScript, i18n support (English/German), dark/light theme toggle, and component-based documentation structure. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .gitignore | 7 + package-lock.json | 2124 +++++++++++++++++++ package.json | 22 + src/app.css | 94 + src/app.d.ts | 13 + src/app.html | 13 + src/lib/components/Checklist.svelte | 104 + src/lib/components/ConfigPlaceholder.svelte | 36 + src/lib/components/Header.svelte | 114 + src/lib/components/Hero.svelte | 77 + src/lib/components/MaterialsList.svelte | 113 + src/lib/components/Navigation.svelte | 74 + src/lib/components/Section.svelte | 27 + src/lib/components/StepList.svelte | 30 + src/lib/components/Table.svelte | 63 + src/lib/components/Warning.svelte | 54 + src/lib/data/materials.ts | 238 +++ src/lib/i18n/de.ts | 335 +++ src/lib/i18n/en.ts | 335 +++ src/lib/i18n/index.ts | 3 + src/lib/stores/language.ts | 50 + src/lib/stores/theme.ts | 54 + src/routes/+layout.svelte | 28 + src/routes/+page.svelte | 347 +++ static/favicon.svg | 8 + svelte.config.js | 18 + tsconfig.json | 14 + vite.config.ts | 7 + 28 files changed, 4402 insertions(+) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/app.css create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/lib/components/Checklist.svelte create mode 100644 src/lib/components/ConfigPlaceholder.svelte create mode 100644 src/lib/components/Header.svelte create mode 100644 src/lib/components/Hero.svelte create mode 100644 src/lib/components/MaterialsList.svelte create mode 100644 src/lib/components/Navigation.svelte create mode 100644 src/lib/components/Section.svelte create mode 100644 src/lib/components/StepList.svelte create mode 100644 src/lib/components/Table.svelte create mode 100644 src/lib/components/Warning.svelte create mode 100644 src/lib/data/materials.ts create mode 100644 src/lib/i18n/de.ts create mode 100644 src/lib/i18n/en.ts create mode 100644 src/lib/i18n/index.ts create mode 100644 src/lib/stores/language.ts create mode 100644 src/lib/stores/theme.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.svelte create mode 100644 static/favicon.svg create mode 100644 svelte.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..630cb5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +.svelte-kit/ +build/ +.env +.env.* +!.env.example +.DS_Store diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1e5be47 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2124 @@ +{ + "name": "druckwerk", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "druckwerk", + "version": "0.0.1", + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.8", + "@sveltejs/kit": "^2.16.0", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tailwindcss/vite": "^4.0.0", + "lucide-svelte": "^0.469.0", + "svelte": "^5.16.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.7.2", + "vite": "^6.0.7" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", + "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", + "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", + "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", + "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", + "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", + "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", + "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", + "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", + "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", + "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", + "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", + "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", + "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", + "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", + "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", + "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", + "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", + "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", + "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", + "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", + "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", + "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.49.2", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.49.2.tgz", + "integrity": "sha512-Vp3zX/qlwerQmHMP6x0Ry1oY7eKKRcOWGc2P59srOp4zcqyn+etJyQpELgOi4+ZSUgteX8Y387NuwruLgGXLUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.3.2", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", + "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.1.tgz", + "integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lucide-svelte": { + "version": "0.469.0", + "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.469.0.tgz", + "integrity": "sha512-PMIJ8jrFqVUsXJz4d1yfAQplaGhNOahwwkzbunha8DhpiD73xqX24n8dE1dPpUk3vcrdWVsHc1y/liHHotOnGQ==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "svelte": "^3 || ^4 || ^5.0.0-next.42" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", + "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.54.0", + "@rollup/rollup-android-arm64": "4.54.0", + "@rollup/rollup-darwin-arm64": "4.54.0", + "@rollup/rollup-darwin-x64": "4.54.0", + "@rollup/rollup-freebsd-arm64": "4.54.0", + "@rollup/rollup-freebsd-x64": "4.54.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", + "@rollup/rollup-linux-arm-musleabihf": "4.54.0", + "@rollup/rollup-linux-arm64-gnu": "4.54.0", + "@rollup/rollup-linux-arm64-musl": "4.54.0", + "@rollup/rollup-linux-loong64-gnu": "4.54.0", + "@rollup/rollup-linux-ppc64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-musl": "4.54.0", + "@rollup/rollup-linux-s390x-gnu": "4.54.0", + "@rollup/rollup-linux-x64-gnu": "4.54.0", + "@rollup/rollup-linux-x64-musl": "4.54.0", + "@rollup/rollup-openharmony-arm64": "4.54.0", + "@rollup/rollup-win32-arm64-msvc": "4.54.0", + "@rollup/rollup-win32-ia32-msvc": "4.54.0", + "@rollup/rollup-win32-x64-gnu": "4.54.0", + "@rollup/rollup-win32-x64-msvc": "4.54.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz", + "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.5.0", + "esm-env": "^1.2.1", + "esrap": "^2.2.1", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9f585b5 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "druckwerk", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.8", + "@sveltejs/kit": "^2.16.0", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "svelte": "^5.16.0", + "typescript": "^5.7.2", + "vite": "^6.0.7", + "@tailwindcss/vite": "^4.0.0", + "tailwindcss": "^4.0.0", + "lucide-svelte": "^0.469.0" + }, + "type": "module" +} diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..4958d27 --- /dev/null +++ b/src/app.css @@ -0,0 +1,94 @@ +@import "tailwindcss"; + +@theme { + /* Wire colors from the guide */ + --color-wire-brown: #8B4513; + --color-wire-blue: #1E90FF; + --color-wire-pe: #9ACD32; + --color-wire-red: #DC2626; + --color-wire-orange: #F97316; + --color-wire-black: #1F2937; + + /* UI colors */ + --color-primary: #1e293b; + --color-primary-light: #334155; + --color-accent: #f97316; + --color-accent-hover: #ea580c; + --color-warning: #EAB308; + --color-danger: #DC2626; + --color-success: #22c55e; + + /* Dark mode backgrounds */ + --color-bg-dark: #0f172a; + --color-bg-dark-secondary: #1e293b; + --color-bg-dark-tertiary: #334155; + + /* Light mode backgrounds */ + --color-bg-light: #f8fafc; + --color-bg-light-secondary: #f1f5f9; + --color-bg-light-tertiary: #e2e8f0; + + /* Text colors */ + --color-text-dark: #f8fafc; + --color-text-dark-muted: #94a3b8; + --color-text-light: #0f172a; + --color-text-light-muted: #64748b; +} + +/* Base styles */ +html { + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; +} + +/* Dark mode by default, light mode when .light class is on html */ +html { + background-color: var(--color-bg-dark); + color: var(--color-text-dark); +} + +html.light { + background-color: var(--color-bg-light); + color: var(--color-text-light); +} + +/* Smooth transitions for theme changes */ +html { + transition: background-color 0.3s ease, color 0.3s ease; +} + +/* Custom scrollbar */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: var(--color-bg-dark-secondary); +} + +html.light ::-webkit-scrollbar-track { + background: var(--color-bg-light-secondary); +} + +::-webkit-scrollbar-thumb { + background: var(--color-primary-light); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--color-accent); +} + +/* Wire color utility classes */ +.wire-l { color: var(--color-wire-brown); } +.wire-n { color: var(--color-wire-blue); } +.wire-pe { color: var(--color-wire-pe); } +.wire-12v { color: var(--color-wire-red); } +.wire-5v { color: var(--color-wire-orange); } +.wire-gnd { color: var(--color-wire-black); } + +.bg-wire-l { background-color: var(--color-wire-brown); } +.bg-wire-n { background-color: var(--color-wire-blue); } +.bg-wire-pe { background-color: var(--color-wire-pe); } +.bg-wire-12v { background-color: var(--color-wire-red); } +.bg-wire-5v { background-color: var(--color-wire-orange); } +.bg-wire-gnd { background-color: var(--color-wire-black); } diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..db1aa5d --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +/// + +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..6244355 --- /dev/null +++ b/src/app.html @@ -0,0 +1,13 @@ + + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/lib/components/Checklist.svelte b/src/lib/components/Checklist.svelte new file mode 100644 index 0000000..4ee52f1 --- /dev/null +++ b/src/lib/components/Checklist.svelte @@ -0,0 +1,104 @@ + + +
+ +
+
+ + {checkedCount} / {totalItems} + + + {Math.round(progress)}% + +
+
+
+
+
+ + + {#each sections as section} +
+

+ {section.title} +

+
    + {#each section.items as item} +
  • + +
  • + {/each} +
+
+ {/each} +
diff --git a/src/lib/components/ConfigPlaceholder.svelte b/src/lib/components/ConfigPlaceholder.svelte new file mode 100644 index 0000000..77b502f --- /dev/null +++ b/src/lib/components/ConfigPlaceholder.svelte @@ -0,0 +1,36 @@ + + +
+
+ + {filename} +
+ +

+ {title} +

+ +
+ + # {placeholder || $t.config.esphome.placeholder} + +
+ +
+ + {$t.config.pending} +
+
diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte new file mode 100644 index 0000000..1ba1ef0 --- /dev/null +++ b/src/lib/components/Header.svelte @@ -0,0 +1,114 @@ + + +
+
+
+ + +
+ DW +
+ + DruckWerk + +
+ + + + + + +
+
+ + + {#if mobileMenuOpen} +
+
+
+ + +
+
+
+ {/if} +
diff --git a/src/lib/components/Hero.svelte b/src/lib/components/Hero.svelte new file mode 100644 index 0000000..66bb569 --- /dev/null +++ b/src/lib/components/Hero.svelte @@ -0,0 +1,77 @@ + + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + +
+ + +

+ {$t.hero.title} +

+ + +

+ {$t.hero.subtitle} +

+ + +
+ + + ESP32 + + + + Home Assistant + + + + Dual-Zone + +
+ + +

+ {$t.hero.description} +

+ + + +
+
diff --git a/src/lib/components/MaterialsList.svelte b/src/lib/components/MaterialsList.svelte new file mode 100644 index 0000000..afa44b2 --- /dev/null +++ b/src/lib/components/MaterialsList.svelte @@ -0,0 +1,113 @@ + + +
+ {#each sortedCategories as category} +
+
+

+ {category} +

+
+
+ + + + + + + + + + + {#each groupedMaterials[category] as item} + + + + + + + {/each} + +
+ {$t.materials.columns.article} + + {$t.materials.columns.quantity} + + {$t.materials.columns.specification} + + {$t.materials.columns.link} +
+ {item.article} + + {item.quantity} + + {item.specification} + + {#if item.link} + + + {$t.materials.buyNow} + + {:else} + + + {$t.materials.printedPart} + + {/if} +
+
+
+ {/each} +
diff --git a/src/lib/components/Navigation.svelte b/src/lib/components/Navigation.svelte new file mode 100644 index 0000000..6f2fb41 --- /dev/null +++ b/src/lib/components/Navigation.svelte @@ -0,0 +1,74 @@ + + + diff --git a/src/lib/components/Section.svelte b/src/lib/components/Section.svelte new file mode 100644 index 0000000..6c1b0e0 --- /dev/null +++ b/src/lib/components/Section.svelte @@ -0,0 +1,27 @@ + + +
+
+

+ {title} +

+ {#if subtitle} +

+ {subtitle} +

+ {/if} +
+
+ {@render children()} +
+
diff --git a/src/lib/components/StepList.svelte b/src/lib/components/StepList.svelte new file mode 100644 index 0000000..54c309f --- /dev/null +++ b/src/lib/components/StepList.svelte @@ -0,0 +1,30 @@ + + +
+ {#if title} +

+ {title} +

+ {/if} +
    + {#each steps as step, index} +
  1. + + {index + 1} + + + {step} + +
  2. + {/each} +
+
diff --git a/src/lib/components/Table.svelte b/src/lib/components/Table.svelte new file mode 100644 index 0000000..63f3957 --- /dev/null +++ b/src/lib/components/Table.svelte @@ -0,0 +1,63 @@ + + +
+ + {#if caption} + + {/if} + + + {#each columns as column} + + {/each} + + + + {#each rows as row} + + {#each columns as column} + + {/each} + + {/each} + +
+ {caption} +
+ {column.header} +
+ + {#if column.wireColor} + + {/if} + {row[column.key]} + +
+
diff --git a/src/lib/components/Warning.svelte b/src/lib/components/Warning.svelte new file mode 100644 index 0000000..aad1d71 --- /dev/null +++ b/src/lib/components/Warning.svelte @@ -0,0 +1,54 @@ + + +
+
+ +
+ {#if title} +

{title}

+ {/if} +
+ {@render children()} +
+
+
+
diff --git a/src/lib/data/materials.ts b/src/lib/data/materials.ts new file mode 100644 index 0000000..3082125 --- /dev/null +++ b/src/lib/data/materials.ts @@ -0,0 +1,238 @@ +export interface Material { + category: string; + article: string; + quantity: string; + specification: string; + link: string | null; +} + +export const materials: Material[] = [ + // Möbel + { + category: 'Möbel', + article: 'IKEA Tisch', + quantity: '1', + specification: '55x55cm Grundfläche; 50cm Höhe', + link: 'https://www.amazon.de/s?k=ikea+tisch+55x55' + }, + + // Holz + { + category: 'Holz', + article: 'OSB Platten', + quantity: '3', + specification: '9–12mm für Seiten & Rückwand', + link: 'https://www.amazon.de/s?k=osb+platte+10mm' + }, + + // Tür + { + category: 'Tür', + article: 'Plexiglas Acryl', + quantity: '1', + specification: '4–6mm Fronttür', + link: 'https://www.amazon.de/s?k=plexiglas+4mm' + }, + + // Druckteile + { + category: 'Druckteile', + article: 'Corner Brackets', + quantity: '12', + specification: 'PETG', + link: null + }, + { + category: 'Druckteile', + article: 'Türscharniere', + quantity: '2', + specification: 'PETG', + link: null + }, + { + category: 'Druckteile', + article: 'Türgriff', + quantity: '1', + specification: 'PETG', + link: null + }, + { + category: 'Druckteile', + article: 'Türanschläge', + quantity: '2–4', + specification: 'PETG', + link: null + }, + { + category: 'Druckteile', + article: 'WAGO Halter 221', + quantity: '4–6', + specification: 'PETG', + link: null + }, + { + category: 'Druckteile', + article: 'Kabelklemme', + quantity: '1', + specification: 'Zugentlastung, PETG', + link: null + }, + + // Strom + { + category: 'Strom', + article: 'IEC C14 Entry mit Sicherung', + quantity: '1', + specification: '5x20mm Sicherung', + link: 'https://www.amazon.de/s?k=iec+c14+einbaubuchse+sicherung' + }, + { + category: 'Strom', + article: 'Feinsicherung T5A', + quantity: '1', + specification: '250V träge', + link: 'https://www.amazon.de/s?k=5x20mm+t5a' + }, + { + category: 'Strom', + article: 'Dual Output PSU', + quantity: '1', + specification: '230V → 12V + 5V', + link: 'https://www.amazon.de/s?k=12v+5v+dual+power+supply' + }, + + // Verdrahtung + { + category: 'Verdrahtung', + article: 'WAGO 221 Klemmen', + quantity: '1 Set', + specification: '3- & 5-polig', + link: 'https://www.amazon.de/s?k=wago+221' + }, + { + category: 'Verdrahtung', + article: 'AC Kabel', + quantity: '2m', + specification: 'H05VV-F 3x1.0mm²', + link: 'https://www.amazon.de/s?k=h05vv-f+3x1+0' + }, + { + category: 'Verdrahtung', + article: 'DC Kabel 12V', + quantity: '5m', + specification: '2x0.75mm² rot/schwarz', + link: 'https://www.amazon.de/s?k=silikonkabel+2x0.75' + }, + { + category: 'Verdrahtung', + article: 'DC Kabel 5V', + quantity: '3m', + specification: '2x0.5mm² orange/schwarz', + link: 'https://www.amazon.de/s?k=silikonkabel+orange' + }, + { + category: 'Verdrahtung', + article: 'Aderendhülsen', + quantity: '1 Set', + specification: '0.25–1.5mm²', + link: 'https://www.amazon.de/s?k=aderendhülsen' + }, + { + category: 'Verdrahtung', + article: 'Crimpzange', + quantity: '1', + specification: 'für Aderendhülsen', + link: 'https://www.amazon.de/s?k=crimpzange' + }, + { + category: 'Verdrahtung', + article: 'Schrumpfschlauch', + quantity: '1 Set', + specification: '3:1 mit Kleber', + link: 'https://www.amazon.de/s?k=schrumpfschlauch' + }, + { + category: 'Verdrahtung', + article: 'Kabelverschraubung', + quantity: '1', + specification: 'M20 / PG13.5', + link: 'https://www.amazon.de/s?k=kabelverschraubung+m20' + }, + + // Controller + { + category: 'Controller', + article: 'ESP32 DevKit', + quantity: '1', + specification: 'WROOM-32', + link: 'https://www.amazon.de/s?k=esp32+devkit' + }, + + // Sensorik + { + category: 'Sensorik', + article: 'BME280', + quantity: '1', + specification: 'I2C Temp/Feuchte', + link: 'https://www.amazon.de/s?k=bme280' + }, + + // Elektronik + { + category: 'Elektronik', + article: 'MOSFET PWM Modul', + quantity: '5', + specification: 'Logic-Level 12V', + link: 'https://www.amazon.de/s?k=mosfet+pwm+12v' + }, + + // Lüfter + { + category: 'Lüfter', + article: '120mm PWM Lüfter', + quantity: '4', + specification: '1 Zuluft, 3 Abluft', + link: 'https://www.amazon.de/s?k=120mm+pwm+l%C3%BCfter' + }, + + // Filter + { + category: 'Filter', + article: 'Aktivkohlefilter 120mm', + quantity: '1', + specification: 'Abluft', + link: 'https://www.amazon.de/s?k=120mm+aktivkohlefilter' + }, + + // Beleuchtung + { + category: 'Beleuchtung', + article: 'LED Strip 12V', + quantity: '1', + specification: '10mm warmweiß', + link: 'https://www.amazon.de/s?k=12v+led+strip+10mm' + }, + { + category: 'Beleuchtung', + article: 'LED Alu Profil Diffusor', + quantity: '6', + specification: '10mm', + link: 'https://www.amazon.de/s?k=led+profil+10mm' + }, + + // Werkzeug + { + category: 'Werkzeug', + article: 'Lötkolben', + quantity: '1', + specification: 'regelbar', + link: 'https://www.amazon.de/s?k=lötkolben' + }, + { + category: 'Werkzeug', + article: 'Multimeter', + quantity: '1', + specification: 'Spannungsprüfung', + link: 'https://www.amazon.de/s?k=multimeter' + } +]; diff --git a/src/lib/i18n/de.ts b/src/lib/i18n/de.ts new file mode 100644 index 0000000..e5e7a24 --- /dev/null +++ b/src/lib/i18n/de.ts @@ -0,0 +1,335 @@ +export const de = { + // Header & Navigation + nav: { + overview: 'Überblick', + materials: 'Materialien', + standards: 'Standards', + mechanical: 'Mechanik', + zones: 'Zonen', + acWiring: 'AC-Verdrahtung', + dcDistribution: 'DC-Verteilung', + leds: 'LEDs', + fans: 'Lüfter', + esp32: 'ESP32', + panel: 'Panel', + software: 'Software', + config: 'Konfiguration', + checklist: 'Checkliste', + extensions: 'Erweiterungen' + }, + + // Hero Section + hero: { + title: 'DruckWerk', + subtitle: 'Professionelles 3D-Drucker Gehäuse', + tagline: 'ESP32 gesteuert | Home Assistant Integration | Dual-Zone Design', + description: 'Ein IKEA-Tisch wird zu einem geschlossenen, belüfteten Druckergehäuse mit fester 230V-Einspeisung, interner AC-Verteilung über WAGO, und ESP32-Steuerung.' + }, + + // Overview Section + overview: { + title: 'Gesamtüberblick', + subtitle: 'Was entsteht', + features: [ + 'Feste 230V-Einspeisung über IEC C14', + 'Interne AC-Verteilung über WAGO', + 'Fest angeschlossener Drucker (kein Stecker innen)', + 'Dual-Output-PSU (12V + 5V)', + 'ESP32-Steuerung (PWM für LEDs & Lüfter)', + 'Home-Assistant-Integration', + 'Sauber getrennte AC- und DC-Zonen', + 'Vollständig servicefähiger Aufbau' + ], + conclusion: { + title: 'Fazit', + points: [ + 'Keine Bastellösung', + 'Kein Overengineering', + 'Maschinenbau-sauber' + ], + benefits: 'So kannst du später umbauen, reparieren und erweitern - ohne alles neu zu machen.' + } + }, + + // Materials Section + materials: { + title: 'Materialliste', + subtitle: 'Alle benötigten Komponenten', + categories: { + furniture: 'Möbel', + wood: 'Holz', + door: 'Tür', + printed: '3D-Druckteile', + power: 'Strom', + wiring: 'Verdrahtung', + controller: 'Controller', + sensors: 'Sensorik', + electronics: 'Elektronik', + fans: 'Lüfter', + filter: 'Filter', + lighting: 'Beleuchtung', + tools: 'Werkzeug' + }, + columns: { + article: 'Artikel', + quantity: 'Menge', + specification: 'Spezifikation', + link: 'Link' + }, + printedPart: '3D-Druck', + buyNow: 'Kaufen' + }, + + // Standards Section + standards: { + title: 'Farb- & Spannungsstandard', + subtitle: 'Verbindlich für alle Verbindungen', + voltage: 'Spannung', + color: 'Farbe', + acSection: 'AC (Wechselstrom)', + dcSection: 'DC (Gleichstrom)', + logicSection: 'Logik' + }, + + // Mechanical Build Section + mechanical: { + title: 'Mechanischer Aufbau', + tableAndEnclosure: { + title: 'Tisch & Gehäuse', + steps: [ + 'IKEA-Tisch aufstellen', + 'OSB-Platten zuschneiden: links, rechts, hinten', + 'OSB mit gedruckten Corner-Brackets montieren (Material: PETG, Vorbohren 2,5-3mm, Holzschrauben)', + 'Obere Tischplatte bleibt frei nutzbar' + ] + }, + door: { + title: 'Tür', + steps: [ + 'Plexiglas zuschneiden', + 'Gedruckte Scharniere montieren', + 'Türgriff + Anschläge montieren', + 'Optional: Dichtung (Moosgummi) für leiseres & dichteres Gehäuse' + ] + } + }, + + // Zones Section + zones: { + title: 'Zonenkonzept', + subtitle: 'Wichtig: Strikte Trennung', + acZone: { + title: 'AC-Zone (230V)', + components: [ + 'IEC C14', + 'WAGO-Klemmen L / N / PE', + 'Dual-Output-PSU', + 'Druckerkabel (fest)' + ], + note: 'Abgedeckt mit 3D-gedrucktem Cover' + }, + dcZone: { + title: 'DC-Zone (12V / 5V)', + components: [ + 'WAGO-Busse', + 'MOSFET-Module', + 'ESP32', + 'Sensoren', + 'LEDs / Lüfter' + ], + note: 'Keine 230V hier' + } + }, + + // AC Wiring Section + acWiring: { + title: 'AC-Teil (230V)', + warning: 'Nur spannungsfrei arbeiten!', + iecEntry: { + title: 'IEC C14 einbauen', + steps: [ + 'Ausschnitt nach Datenblatt sägen', + 'IEC C14 einsetzen und verschrauben', + 'Sicherung einsetzen (T5A, 5×20 mm)' + ] + }, + wagoHolder: { + title: 'WAGO-Halter (AC)', + steps: [ + 'Gedruckte WAGO-Halter (221-413) montieren', + 'Drei Klemmen: L, N, PE', + 'Halter auf Elektronik-Backplate schrauben', + 'Abdeckung vorbereiten (wird später montiert)' + ] + }, + iecToWago: { + title: 'IEC C14 → WAGO', + note: 'Aderendhülsen verwenden, keine losen Litzen' + }, + printer: { + title: 'Drucker anschließen (fest)', + steps: [ + 'Druckerkabel durch Kabelverschraubung (M20/PG13.5) führen', + 'Innen Zugentlastung setzen', + 'Schuko-Stecker abschneiden', + 'Adern abisolieren + Aderendhülsen', + 'Anschluss an WAGO (Braun→L, Blau→N, Gelb-Grün→PE)' + ], + note: 'Drucker ist jetzt Teil der festen Installation' + }, + psu: { + title: 'Dual-Output-PSU anschließen (AC-Seite)', + note: 'Von denselben WAGOs: L, N, PE (falls vorhanden). PSU fest verschrauben.' + } + }, + + // DC Distribution Section + dcDistribution: { + title: 'DC-Teil – Stromverteilung', + wagoBuses: { + title: 'WAGO-Busse (DC)', + description: 'Gedruckte Halter für:', + buses: ['12V+', '5V+', 'GND (gemeinsam)'], + recommendation: 'Empfohlen: WAGO 221-415 (5-polig)' + }, + psuToWago: { + title: 'PSU → DC-WAGOs', + note: '12V- und 5V-GND dürfen gemeinsam sein' + } + }, + + // LEDs Section + leds: { + title: 'LEDs (PWM, 12V)', + mechanics: { + title: 'Mechanik', + description: '6 LED-Segmente in Alu-Profilen mit Diffusor. Je Bein: vorne 1 Segment, hinten 2 Segmente.' + }, + electrical: { + title: 'Elektrik', + description: 'LED+ direkt an 12V+, LED- über MOSFET Drain.', + mosfet: 'MOSFET: Source → GND, Gate → ESP32 PWM-Pin', + pwm: 'PWM-Frequenz: 1–5 kHz' + } + }, + + // Fans Section + fans: { + title: 'Lüfter & Aktivkohle (PWM)', + layout: { + title: 'Layout', + items: ['1× Zuluft', '2× Abluft', '1× Aktivkohle'] + }, + electrical: { + title: 'Elektrik (pro Lüfter)', + description: 'Lüfter+ direkt 12V+, Lüfter- über MOSFET Drain.', + mosfet: 'MOSFET: Source → GND, Gate → ESP32 PWM-Pin', + pwm: 'PWM-Frequenz: 20–25 kHz (leise)' + } + }, + + // ESP32 Section + esp32: { + title: 'ESP32 & Sensorik', + power: { + title: 'Versorgung', + description: 'ESP32 VIN/5V → 5V+ (orange), GND → GND' + }, + voltage: { + title: '3,3V', + description: 'Kommt onboard vom ESP32. Kein Buck nötig, nur kurze Leitungen.' + }, + bme280: { + title: 'BME280 Sensor', + description: 'I2C Temperatur & Feuchte' + } + }, + + // Panel Section + panel: { + title: 'Taster / Panel (optional)', + description: 'Taster → GPIO mit Pull-Up', + functions: ['Licht AN/AUS', 'Lüfter Boost', 'Reset'] + }, + + // Software Section + software: { + title: 'Software (Überblick)', + esphome: { + title: 'ESPHome', + features: [ + 'PWM Outputs: LEDs, Zuluft, Abluft 1, Abluft 2, Aktivkohle', + 'BME280 Sensor', + 'Fail-Safe: bei Verbindungsverlust → Lüfter auf 50%' + ] + }, + homeAssistant: { + title: 'Home Assistant', + features: [ + 'Bambu-Integration (Status)', + 'Automationen: PLA/ABS Profil, Nachlauf Aktivkohle, Übertemperatur' + ] + } + }, + + // Config Section + config: { + title: 'Konfiguration', + esphome: { + title: 'ESPHome Konfiguration', + filename: 'esphome.yaml', + placeholder: 'Konfiguration wird hinzugefügt...' + }, + homeAssistant: { + title: 'Home Assistant Automationen', + filename: 'automations.yaml', + placeholder: 'Konfiguration wird hinzugefügt...' + }, + pending: 'Konfiguration ausstehend' + }, + + // Checklist Section + checklist: { + title: 'Abschluss-Checkliste', + subtitle: 'Pflicht vor Inbetriebnahme', + electrical: { + title: 'Elektrisch', + items: [ + 'PE durchgängig', + 'AC & DC getrennt', + 'AC-WAGOs abgedeckt', + 'Zugentlastung gesetzt', + 'Keine offenen 230V-Teile' + ] + }, + functional: { + title: 'Funktional', + items: [ + 'LEDs dimmen sauber', + 'Lüfter PWM leise', + 'Temp/Feuchte sichtbar', + 'HASS erreichbar' + ] + } + }, + + // Extensions Section + extensions: { + title: 'Nächste sinnvolle Erweiterungen', + subtitle: 'Optional', + items: [ + 'Rauch-/VOC-Sensor', + 'Türkontakt', + 'Geräuschprofil-Automationen', + 'Druck-abhängige Lüftersteuerung' + ] + }, + + // Common + common: { + warning: 'Warnung', + note: 'Hinweis', + tip: 'Tipp', + important: 'Wichtig' + } +}; diff --git a/src/lib/i18n/en.ts b/src/lib/i18n/en.ts new file mode 100644 index 0000000..ba8cc7d --- /dev/null +++ b/src/lib/i18n/en.ts @@ -0,0 +1,335 @@ +export const en = { + // Header & Navigation + nav: { + overview: 'Overview', + materials: 'Materials', + standards: 'Standards', + mechanical: 'Mechanical', + zones: 'Zones', + acWiring: 'AC Wiring', + dcDistribution: 'DC Distribution', + leds: 'LEDs', + fans: 'Fans', + esp32: 'ESP32', + panel: 'Panel', + software: 'Software', + config: 'Configuration', + checklist: 'Checklist', + extensions: 'Extensions' + }, + + // Hero Section + hero: { + title: 'DruckWerk', + subtitle: 'Professional 3D Printer Enclosure', + tagline: 'ESP32 Controlled | Home Assistant Integration | Dual-Zone Design', + description: 'An IKEA table transformed into a sealed, ventilated printer enclosure with fixed 230V power input, internal AC distribution via WAGO, and ESP32 control.' + }, + + // Overview Section + overview: { + title: 'Overview', + subtitle: 'What We Are Building', + features: [ + 'Fixed 230V power input via IEC C14', + 'Internal AC distribution via WAGO', + 'Permanently connected printer (no internal plug)', + 'Dual-output PSU (12V + 5V)', + 'ESP32 control (PWM for LEDs & fans)', + 'Home Assistant integration', + 'Cleanly separated AC and DC zones', + 'Fully serviceable design' + ], + conclusion: { + title: 'Conclusion', + points: [ + 'Not a DIY hack', + 'Not over-engineered', + 'Machine-building clean' + ], + benefits: 'This allows you to modify, repair, and extend later - without redoing everything.' + } + }, + + // Materials Section + materials: { + title: 'Materials List', + subtitle: 'All Required Components', + categories: { + furniture: 'Furniture', + wood: 'Wood', + door: 'Door', + printed: '3D Printed Parts', + power: 'Power', + wiring: 'Wiring', + controller: 'Controller', + sensors: 'Sensors', + electronics: 'Electronics', + fans: 'Fans', + filter: 'Filter', + lighting: 'Lighting', + tools: 'Tools' + }, + columns: { + article: 'Article', + quantity: 'Qty', + specification: 'Specification', + link: 'Link' + }, + printedPart: '3D Print', + buyNow: 'Buy' + }, + + // Standards Section + standards: { + title: 'Color & Voltage Standard', + subtitle: 'Mandatory for All Connections', + voltage: 'Voltage', + color: 'Color', + acSection: 'AC (Alternating Current)', + dcSection: 'DC (Direct Current)', + logicSection: 'Logic' + }, + + // Mechanical Build Section + mechanical: { + title: 'Mechanical Build', + tableAndEnclosure: { + title: 'Table & Enclosure', + steps: [ + 'Set up IKEA table', + 'Cut OSB panels: left, right, back', + 'Mount OSB with printed corner brackets (Material: PETG, pre-drill 2.5-3mm, wood screws)', + 'Top table surface remains usable' + ] + }, + door: { + title: 'Door', + steps: [ + 'Cut plexiglass', + 'Mount printed hinges', + 'Mount door handle + stops', + 'Optional: Seal (foam rubber) for quieter & tighter enclosure' + ] + } + }, + + // Zones Section + zones: { + title: 'Zone Concept', + subtitle: 'Important: Strict Separation', + acZone: { + title: 'AC Zone (230V)', + components: [ + 'IEC C14', + 'WAGO terminals L / N / PE', + 'Dual-output PSU', + 'Printer cable (fixed)' + ], + note: 'Covered with 3D-printed cover' + }, + dcZone: { + title: 'DC Zone (12V / 5V)', + components: [ + 'WAGO buses', + 'MOSFET modules', + 'ESP32', + 'Sensors', + 'LEDs / Fans' + ], + note: 'No 230V here' + } + }, + + // AC Wiring Section + acWiring: { + title: 'AC Section (230V)', + warning: 'Only work when power is off!', + iecEntry: { + title: 'Install IEC C14', + steps: [ + 'Cut opening per datasheet', + 'Insert and screw in IEC C14', + 'Insert fuse (T5A, 5×20 mm)' + ] + }, + wagoHolder: { + title: 'WAGO Holder (AC)', + steps: [ + 'Mount printed WAGO holders (221-413)', + 'Three terminals: L, N, PE', + 'Screw holder to electronics backplate', + 'Prepare cover (mounted later)' + ] + }, + iecToWago: { + title: 'IEC C14 → WAGO', + note: 'Use ferrules, no loose strands' + }, + printer: { + title: 'Connect Printer (permanent)', + steps: [ + 'Feed printer cable through cable gland (M20/PG13.5)', + 'Add strain relief inside', + 'Cut off Schuko plug', + 'Strip wires + add ferrules', + 'Connect to WAGO (Brown→L, Blue→N, Yellow-Green→PE)' + ], + note: 'Printer is now part of the fixed installation' + }, + psu: { + title: 'Connect Dual-Output PSU (AC side)', + note: 'From same WAGOs: L, N, PE (if available). Screw PSU down firmly.' + } + }, + + // DC Distribution Section + dcDistribution: { + title: 'DC Section – Power Distribution', + wagoBuses: { + title: 'WAGO Buses (DC)', + description: 'Printed holders for:', + buses: ['12V+', '5V+', 'GND (shared)'], + recommendation: 'Recommended: WAGO 221-415 (5-pole)' + }, + psuToWago: { + title: 'PSU → DC WAGOs', + note: '12V and 5V GND can be shared' + } + }, + + // LEDs Section + leds: { + title: 'LEDs (PWM, 12V)', + mechanics: { + title: 'Mechanics', + description: '6 LED segments in aluminum profiles with diffuser. Per leg: front 1 segment, back 2 segments.' + }, + electrical: { + title: 'Electrical', + description: 'LED+ direct to 12V+, LED- via MOSFET drain.', + mosfet: 'MOSFET: Source → GND, Gate → ESP32 PWM pin', + pwm: 'PWM frequency: 1–5 kHz' + } + }, + + // Fans Section + fans: { + title: 'Fans & Carbon Filter (PWM)', + layout: { + title: 'Layout', + items: ['1× Intake', '2× Exhaust', '1× Carbon Filter'] + }, + electrical: { + title: 'Electrical (per fan)', + description: 'Fan+ direct 12V+, Fan- via MOSFET drain.', + mosfet: 'MOSFET: Source → GND, Gate → ESP32 PWM pin', + pwm: 'PWM frequency: 20–25 kHz (quiet)' + } + }, + + // ESP32 Section + esp32: { + title: 'ESP32 & Sensors', + power: { + title: 'Power Supply', + description: 'ESP32 VIN/5V → 5V+ (orange), GND → GND' + }, + voltage: { + title: '3.3V', + description: 'Comes from ESP32 onboard. No buck needed, keep wires short.' + }, + bme280: { + title: 'BME280 Sensor', + description: 'I2C Temperature & Humidity' + } + }, + + // Panel Section + panel: { + title: 'Buttons / Panel (optional)', + description: 'Button → GPIO with pull-up', + functions: ['Light ON/OFF', 'Fan Boost', 'Reset'] + }, + + // Software Section + software: { + title: 'Software (Overview)', + esphome: { + title: 'ESPHome', + features: [ + 'PWM Outputs: LEDs, Intake, Exhaust 1, Exhaust 2, Carbon Filter', + 'BME280 Sensor', + 'Fail-safe: on connection loss → fans at 50%' + ] + }, + homeAssistant: { + title: 'Home Assistant', + features: [ + 'Bambu integration (status)', + 'Automations: PLA/ABS profile, carbon filter follow-up, overtemperature' + ] + } + }, + + // Config Section + config: { + title: 'Configuration', + esphome: { + title: 'ESPHome Configuration', + filename: 'esphome.yaml', + placeholder: 'Configuration coming soon...' + }, + homeAssistant: { + title: 'Home Assistant Automations', + filename: 'automations.yaml', + placeholder: 'Configuration coming soon...' + }, + pending: 'Configuration pending' + }, + + // Checklist Section + checklist: { + title: 'Final Checklist', + subtitle: 'Mandatory Before Operation', + electrical: { + title: 'Electrical', + items: [ + 'PE continuous', + 'AC & DC separated', + 'AC WAGOs covered', + 'Strain relief set', + 'No exposed 230V parts' + ] + }, + functional: { + title: 'Functional', + items: [ + 'LEDs dim smoothly', + 'Fan PWM quiet', + 'Temp/humidity visible', + 'HASS reachable' + ] + } + }, + + // Extensions Section + extensions: { + title: 'Recommended Future Extensions', + subtitle: 'Optional', + items: [ + 'Smoke/VOC sensor', + 'Door contact', + 'Noise profile automations', + 'Print-dependent fan control' + ] + }, + + // Common + common: { + warning: 'Warning', + note: 'Note', + tip: 'Tip', + important: 'Important' + } +}; diff --git a/src/lib/i18n/index.ts b/src/lib/i18n/index.ts new file mode 100644 index 0000000..1b1d9e0 --- /dev/null +++ b/src/lib/i18n/index.ts @@ -0,0 +1,3 @@ +export { de } from './de'; +export { en } from './en'; +export type { Language } from '$lib/stores/language'; diff --git a/src/lib/stores/language.ts b/src/lib/stores/language.ts new file mode 100644 index 0000000..724ecb0 --- /dev/null +++ b/src/lib/stores/language.ts @@ -0,0 +1,50 @@ +import { writable, derived } from 'svelte/store'; +import { browser } from '$app/environment'; +import { de } from '$lib/i18n/de'; +import { en } from '$lib/i18n/en'; + +export type Language = 'de' | 'en'; + +const translations = { de, en }; + +function createLanguageStore() { + const storedLang = browser ? localStorage.getItem('language') as Language : null; + const browserLang = browser ? navigator.language.split('-')[0] : 'de'; + const initialLang: Language = storedLang || (browserLang === 'en' ? 'en' : 'de'); + + const { subscribe, set } = writable(initialLang); + + return { + subscribe, + set: (value: Language) => { + if (browser) { + localStorage.setItem('language', value); + document.documentElement.lang = value; + } + set(value); + }, + toggle: () => { + let current: Language = 'de'; + subscribe(v => current = v)(); + const newLang = current === 'de' ? 'en' : 'de'; + if (browser) { + localStorage.setItem('language', newLang); + document.documentElement.lang = newLang; + } + set(newLang); + }, + init: () => { + if (browser) { + const stored = localStorage.getItem('language') as Language; + const browserLang = navigator.language.split('-')[0]; + const lang = stored || (browserLang === 'en' ? 'en' : 'de'); + document.documentElement.lang = lang; + set(lang); + } + } + }; +} + +export const language = createLanguageStore(); + +export const t = derived(language, ($language) => translations[$language]); diff --git a/src/lib/stores/theme.ts b/src/lib/stores/theme.ts new file mode 100644 index 0000000..596c06c --- /dev/null +++ b/src/lib/stores/theme.ts @@ -0,0 +1,54 @@ +import { writable } from 'svelte/store'; +import { browser } from '$app/environment'; + +type Theme = 'dark' | 'light'; + +function createThemeStore() { + const storedTheme = browser ? localStorage.getItem('theme') as Theme : null; + const prefersDark = browser ? window.matchMedia('(prefers-color-scheme: dark)').matches : true; + const initialTheme: Theme = storedTheme || (prefersDark ? 'dark' : 'light'); + + const { subscribe, set, update } = writable(initialTheme); + + return { + subscribe, + set: (value: Theme) => { + if (browser) { + localStorage.setItem('theme', value); + if (value === 'light') { + document.documentElement.classList.add('light'); + } else { + document.documentElement.classList.remove('light'); + } + } + set(value); + }, + toggle: () => { + update(current => { + const newTheme = current === 'dark' ? 'light' : 'dark'; + if (browser) { + localStorage.setItem('theme', newTheme); + if (newTheme === 'light') { + document.documentElement.classList.add('light'); + } else { + document.documentElement.classList.remove('light'); + } + } + return newTheme; + }); + }, + init: () => { + if (browser) { + const stored = localStorage.getItem('theme') as Theme; + const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + const theme = stored || (prefersDark ? 'dark' : 'light'); + if (theme === 'light') { + document.documentElement.classList.add('light'); + } + set(theme); + } + } + }; +} + +export const theme = createThemeStore(); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..a156ece --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,28 @@ + + + + DruckWerk - 3D Printer Enclosure + + +
+ + +
+
+ {@render children()} +
+
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..fbc77bd --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,347 @@ + + + + + +
+
+
+

Features

+
    + {#each $t.overview.features as feature} +
  • + + {feature} +
  • + {/each} +
+
+
+

{$t.overview.conclusion.title}

+
    + {#each $t.overview.conclusion.points as point} +
  • + + {point} +
  • + {/each} +
+

+ {$t.overview.conclusion.benefits} +

+
+
+
+ + +
+ +
+ + +
+
+
+

{$t.standards.acSection}

+ + +
+

{$t.standards.dcSection}

+
+ + + + + +
+
+ + +
+
+ + +
+
+
+

{$t.zones.acZone.title}

+
    + {#each $t.zones.acZone.components as component} +
  • • {component}
  • + {/each} +
+

+ → {$t.zones.acZone.note} +

+
+
+

{$t.zones.dcZone.title}

+
    + {#each $t.zones.dcZone.components as component} +
  • • {component}
  • + {/each} +
+

+ → {$t.zones.dcZone.note} +

+
+
+
+ + +
+ +

{$t.acWiring.warning}

+
+ +
+ + + +
+

{$t.acWiring.iecToWago.title}

+
+ +

{$t.acWiring.iecToWago.note}

+
+ + + + + +

{$t.acWiring.printer.note}

+
+ +
+

{$t.acWiring.psu.title}

+

{$t.acWiring.psu.note}

+
+ + + + +
+
+
+

{$t.dcDistribution.wagoBuses.title}

+

{$t.dcDistribution.wagoBuses.description}

+
    + {#each $t.dcDistribution.wagoBuses.buses as bus} +
  • • {bus}
  • + {/each} +
+

{$t.dcDistribution.wagoBuses.recommendation}

+
+ +
+

{$t.dcDistribution.psuToWago.title}

+
+ +

{$t.dcDistribution.psuToWago.note}

+
+ + + + + +
+
+
+

{$t.leds.mechanics.title}

+

{$t.leds.mechanics.description}

+
+
+

{$t.leds.electrical.title}

+

{$t.leds.electrical.description}

+

{$t.leds.electrical.mosfet}

+

{$t.leds.electrical.pwm}

+
+
+
+ + +
+
+
+

{$t.fans.layout.title}

+
    + {#each $t.fans.layout.items as item} +
  • • {item}
  • + {/each} +
+
+
+

{$t.fans.electrical.title}

+

{$t.fans.electrical.description}

+

{$t.fans.electrical.mosfet}

+

{$t.fans.electrical.pwm}

+
+
+
+ + +
+
+
+

{$t.esp32.power.title}

+

{$t.esp32.power.description}

+
+
+

{$t.esp32.voltage.title}

+

{$t.esp32.voltage.description}

+
+
+

{$t.esp32.bme280.title}

+

{$t.esp32.bme280.description}

+
+
+ +
+
+ + + + +
+
+

{$t.panel.description}

+

Functions:

+
    + {#each $t.panel.functions as func} +
  • • {func}
  • + {/each} +
+
+
+ + +
+
+
+

{$t.software.esphome.title}

+
    + {#each $t.software.esphome.features as feature} +
  • • {feature}
  • + {/each} +
+
+
+

{$t.software.homeAssistant.title}

+
    + {#each $t.software.homeAssistant.features as feature} +
  • • {feature}
  • + {/each} +
+
+
+ + +
+

{$t.config.title}

+ + +
+
+ + +
+ +
+ + +
+
+
    + {#each $t.extensions.items as item} +
  • + + {item} +
  • + {/each} +
+
+
+ + +
+

+ DruckWerk - Built with Svelte & Tailwind CSS +

+
diff --git a/static/favicon.svg b/static/favicon.svg new file mode 100644 index 0000000..0a15cf2 --- /dev/null +++ b/static/favicon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..700fe58 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,18 @@ +import adapter from '@sveltejs/adapter-static'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter({ + pages: 'build', + assets: 'build', + fallback: 'index.html', + precompress: false, + strict: true + }) + } +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a8f10c8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..bf699a8 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import tailwindcss from '@tailwindcss/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit()] +});