From d3483770b63a6795a90a59da9a56097b2356ffe3 Mon Sep 17 00:00:00 2001 From: vikingowl Date: Sun, 26 Apr 2026 15:40:41 +0200 Subject: [PATCH] init frontend --- frontend/.gitignore | 26 + frontend/README.md | 47 ++ frontend/index.html | 13 + frontend/package.json | 25 + frontend/pnpm-lock.yaml | 856 ++++++++++++++++++++++++++++++++ frontend/public/favicon.svg | 1 + frontend/public/icons.svg | 24 + frontend/src/App.svelte | 89 ++++ frontend/src/app.css | 296 +++++++++++ frontend/src/assets/hero.png | Bin 0 -> 13057 bytes frontend/src/assets/svelte.svg | 1 + frontend/src/assets/vite.svg | 1 + frontend/src/lib/Counter.svelte | 10 + frontend/src/main.ts | 9 + frontend/svelte.config.js | 2 + frontend/tsconfig.app.json | 25 + frontend/tsconfig.json | 7 + frontend/tsconfig.node.json | 26 + frontend/vite.config.ts | 7 + 19 files changed, 1465 insertions(+) create mode 100644 frontend/README.md create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/pnpm-lock.yaml create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/public/icons.svg create mode 100644 frontend/src/App.svelte create mode 100644 frontend/src/app.css create mode 100644 frontend/src/assets/hero.png create mode 100644 frontend/src/assets/svelte.svg create mode 100644 frontend/src/assets/vite.svg create mode 100644 frontend/src/lib/Counter.svelte create mode 100644 frontend/src/main.ts create mode 100644 frontend/svelte.config.js create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts diff --git a/frontend/.gitignore b/frontend/.gitignore index e69de29..5c2fe3c 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Svelte check +.svelte-check \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..e6cd94f --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,47 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from 'svelte/store' +export default writable(0) +``` diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..f4f0dc1 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + ui + + +
+ + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..e47d171 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,25 @@ +{ + "name": "ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "pnpm check:app && pnpm check:node", + "check:app": "svelte-check --tsgo --tsconfig ./tsconfig.app.json", + "check:node": "tsgo -p ./tsconfig.node.json", + "check:watch": "svelte-check --tsgo --tsconfig ./tsconfig.app.json --watch" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^7.0.0", + "@tsconfig/svelte": "^5.0.8", + "@types/node": "^24.12.2", + "@typescript/native-preview": "7.0.0-dev.20260426.1", + "svelte": "^5.55.5", + "svelte-check": "^4.4.6", + "typescript": "^6.0.3", + "vite": "^8.0.10" + } +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..512d733 --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,856 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@sveltejs/vite-plugin-svelte': + specifier: ^7.0.0 + version: 7.0.0(svelte@5.55.5)(vite@8.0.10(@types/node@24.12.2)) + '@tsconfig/svelte': + specifier: ^5.0.8 + version: 5.0.8 + '@types/node': + specifier: ^24.12.2 + version: 24.12.2 + '@typescript/native-preview': + specifier: 7.0.0-dev.20260426.1 + version: 7.0.0-dev.20260426.1 + svelte: + specifier: ^5.55.5 + version: 5.55.5 + svelte-check: + specifier: ^4.4.6 + version: 4.4.6(picomatch@4.0.4)(svelte@5.55.5)(typescript@6.0.3) + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vite: + specifier: ^8.0.10 + version: 8.0.10(@types/node@24.12.2) + +packages: + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} + + '@sveltejs/acorn-typescript@1.0.9': + resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/vite-plugin-svelte@7.0.0': + resolution: {integrity: sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.46.4 + vite: ^8.0.0-beta.7 || ^8.0.0 + + '@tsconfig/svelte@5.0.8': + resolution: {integrity: sha512-UkNnw1/oFEfecR8ypyHIQuWYdkPvHiwcQ78sh+ymIiYoF+uc5H1UBetbjyqT+vgGJ3qQN6nhucJviX6HesWtKQ==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260426.1': + resolution: {integrity: sha512-HzGvERpIFO7p6pMljPN1fIOHqAv2oMeVIqYLSt27TKILkTRpe7fANW3R2OAM+/A+pLtYNNXGDbKl/wR+DHz9KA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260426.1': + resolution: {integrity: sha512-aE17wCPNQ09K4jV7TQYYRYF/Q/6nFS9jLpbyTYHtS+i+0yV1Rrs4VsqboisS1R/iSWsq3m1Yhh3uS4x3/9KUkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260426.1': + resolution: {integrity: sha512-6OfhODChD1N6FX+ITzA1lny3WX6uew/Nw9kN7uWhymXlM3/vE0qtaAfsMpgdHdCbTPgcdpGaNFhbcMieju9Vdg==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/native-preview-linux-arm@7.0.0-dev.20260426.1': + resolution: {integrity: sha512-/XJRC8B6JeOOb2/iek/BrzW4r5Nut+fkucG7ntEOQn63IRTsfP+AfJdJodG1VIwXOleNlFgG4RtYTUsvcbDJhg==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/native-preview-linux-x64@7.0.0-dev.20260426.1': + resolution: {integrity: sha512-KPDpjmLo/4xY8ugfMGFm7Ona/1igPzZveLt/C0rb6/jNPYuShumRfKYnItGDRXBlmecJY/04lrqkWqQjhtSSPg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260426.1': + resolution: {integrity: sha512-I7ThiopxuNKX/iAcwgMwsm6L32GOwmwLOyPwQmXjh5c3VD2acq3FYyZRDJVk0aUUy1w6bTbODlo5ZHoPnlZtvw==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/native-preview-win32-x64@7.0.0-dev.20260426.1': + resolution: {integrity: sha512-4624MJq72vN4H1msiWVBqAIyerJRi5Ni/U6eeE1A1Opqg4c4QoalYQQ+5h5RIuaZ6rY+9kvUn+SjsvbZwyLbjQ==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@typescript/native-preview@7.0.0-dev.20260426.1': + resolution: {integrity: sha512-zE7B6TIG4XDYr4Your5E2Bxm1vD2YiPyD8OFG4nD5Odt/uN6gO0Y+T4TIbtGUBmOftMRqEV2Jw1ZC4ka0my1yw==} + engines: {node: '>=16.20.0'} + hasBin: true + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devalue@5.7.1: + resolution: {integrity: sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==} + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esrap@2.2.5: + resolution: {integrity: sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + postcss@8.5.11: + resolution: {integrity: sha512-5dDj8+lmvA8XB78SmzGI8NlQoksv7IfutGWeVZxiixHbO+p4LDPT3wuG/D9sM/wrjZZ9I+Siy/e117vbFPxSZg==} + engines: {node: ^10 || ^12 || >=14} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + svelte-check@4.4.6: + resolution: {integrity: sha512-kP1zG81EWaFe9ZyTv4ZXv44Csi6Pkdpb7S3oj6m+K2ec/IcDg/a8LsFsnVLqm2nxtkSwsd5xPj/qFkTBgXHXjg==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte@5.55.5: + resolution: {integrity: sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw==} + engines: {node: '>=18'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + vite@8.0.10: + resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + +snapshots: + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.127.0': {} + + '@rolldown/binding-android-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.17': {} + + '@sveltejs/acorn-typescript@1.0.9(acorn@8.16.0)': + dependencies: + acorn: 8.16.0 + + '@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.55.5)(vite@8.0.10(@types/node@24.12.2))': + dependencies: + deepmerge: 4.3.1 + magic-string: 0.30.21 + obug: 2.1.1 + svelte: 5.55.5 + vite: 8.0.10(@types/node@24.12.2) + vitefu: 1.1.3(vite@8.0.10(@types/node@24.12.2)) + + '@tsconfig/svelte@5.0.8': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/estree@1.0.8': {} + + '@types/node@24.12.2': + dependencies: + undici-types: 7.16.0 + + '@types/trusted-types@2.0.7': {} + + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260426.1': + optional: true + + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260426.1': + optional: true + + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260426.1': + optional: true + + '@typescript/native-preview-linux-arm@7.0.0-dev.20260426.1': + optional: true + + '@typescript/native-preview-linux-x64@7.0.0-dev.20260426.1': + optional: true + + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260426.1': + optional: true + + '@typescript/native-preview-win32-x64@7.0.0-dev.20260426.1': + optional: true + + '@typescript/native-preview@7.0.0-dev.20260426.1': + optionalDependencies: + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260426.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260426.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260426.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260426.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260426.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260426.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260426.1 + + acorn@8.16.0: {} + + aria-query@5.3.1: {} + + axobject-query@4.1.0: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + clsx@2.1.1: {} + + deepmerge@4.3.1: {} + + detect-libc@2.1.2: {} + + devalue@5.7.1: {} + + esm-env@1.2.2: {} + + esrap@2.2.5: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fsevents@2.3.3: + optional: true + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + locate-character@3.0.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mri@1.2.0: {} + + nanoid@3.3.11: {} + + obug@2.1.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + postcss@8.5.11: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + readdirp@4.1.2: {} + + rolldown@1.0.0-rc.17: + dependencies: + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + source-map-js@1.2.1: {} + + svelte-check@4.4.6(picomatch@4.0.4)(svelte@5.55.5)(typescript@6.0.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.55.5 + typescript: 6.0.3 + transitivePeerDependencies: + - picomatch + + svelte@5.55.5: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) + '@types/estree': 1.0.8 + '@types/trusted-types': 2.0.7 + acorn: 8.16.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.7.1 + esm-env: 1.2.2 + esrap: 2.2.5 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + transitivePeerDependencies: + - '@typescript-eslint/types' + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tslib@2.8.1: + optional: true + + typescript@6.0.3: {} + + undici-types@7.16.0: {} + + vite@8.0.10(@types/node@24.12.2): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.11 + rolldown: 1.0.0-rc.17 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.12.2 + fsevents: 2.3.3 + + vitefu@1.1.3(vite@8.0.10(@types/node@24.12.2)): + optionalDependencies: + vite: 8.0.10(@types/node@24.12.2) + + zimmerframe@1.1.4: {} diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/icons.svg b/frontend/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/frontend/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte new file mode 100644 index 0000000..dafc575 --- /dev/null +++ b/frontend/src/App.svelte @@ -0,0 +1,89 @@ + + +
+
+ + Svelte logo + Vite logo +
+
+

Get started

+

Edit src/App.svelte and save to test HMR

+
+ +
+ +
+ +
+
+ +

Documentation

+

Your questions, answered

+ +
+
+ +

Connect with us

+

Join the Vite community

+ +
+
+ +
+
diff --git a/frontend/src/app.css b/frontend/src/app.css new file mode 100644 index 0000000..527d4fb --- /dev/null +++ b/frontend/src/app.css @@ -0,0 +1,296 @@ +:root { + --text: #6b6375; + --text-h: #08060d; + --bg: #fff; + --border: #e5e4e7; + --code-bg: #f4f3ec; + --accent: #aa3bff; + --accent-bg: rgba(170, 59, 255, 0.1); + --accent-border: rgba(170, 59, 255, 0.5); + --social-bg: rgba(244, 243, 236, 0.5); + --shadow: + rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; + + --sans: system-ui, 'Segoe UI', Roboto, sans-serif; + --heading: system-ui, 'Segoe UI', Roboto, sans-serif; + --mono: ui-monospace, Consolas, monospace; + + font: 18px/145% var(--sans); + letter-spacing: 0.18px; + color-scheme: light dark; + color: var(--text); + background: var(--bg); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + @media (max-width: 1024px) { + font-size: 16px; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --text: #9ca3af; + --text-h: #f3f4f6; + --bg: #16171d; + --border: #2e303a; + --code-bg: #1f2028; + --accent: #c084fc; + --accent-bg: rgba(192, 132, 252, 0.15); + --accent-border: rgba(192, 132, 252, 0.5); + --social-bg: rgba(47, 48, 58, 0.5); + --shadow: + rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; + } + + #social .button-icon { + filter: invert(1) brightness(2); + } +} + +body { + margin: 0; +} + +h1, +h2 { + font-family: var(--heading); + font-weight: 500; + color: var(--text-h); +} + +h1 { + font-size: 56px; + letter-spacing: -1.68px; + margin: 32px 0; + @media (max-width: 1024px) { + font-size: 36px; + margin: 20px 0; + } +} +h2 { + font-size: 24px; + line-height: 118%; + letter-spacing: -0.24px; + margin: 0 0 8px; + @media (max-width: 1024px) { + font-size: 20px; + } +} +p { + margin: 0; +} + +code, +.counter { + font-family: var(--mono); + display: inline-flex; + border-radius: 4px; + color: var(--text-h); +} + +code { + font-size: 15px; + line-height: 135%; + padding: 4px 8px; + background: var(--code-bg); +} + +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#app { + width: 1126px; + max-width: 100%; + margin: 0 auto; + text-align: center; + border-inline: 1px solid var(--border); + min-height: 100svh; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/frontend/src/assets/hero.png b/frontend/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/svelte.svg b/frontend/src/assets/svelte.svg new file mode 100644 index 0000000..c5e0848 --- /dev/null +++ b/frontend/src/assets/svelte.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/vite.svg b/frontend/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/frontend/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/frontend/src/lib/Counter.svelte b/frontend/src/lib/Counter.svelte new file mode 100644 index 0000000..5f046bd --- /dev/null +++ b/frontend/src/lib/Counter.svelte @@ -0,0 +1,10 @@ + + + diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 0000000..664a057 --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,9 @@ +import { mount } from 'svelte' +import './app.css' +import App from './App.svelte' + +const app = mount(App, { + target: document.getElementById('app')!, +}) + +export default app diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js new file mode 100644 index 0000000..0cf7db3 --- /dev/null +++ b/frontend/svelte.config.js @@ -0,0 +1,2 @@ +/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */ +export default {} diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..39b569d --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "incremental": true, + "target": "es2023", + "module": "esnext", + "types": ["svelte", "vite/client"], + "noEmit": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "moduleDetection": "force", + + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..27f2b67 --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "incremental": true, + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + "strict": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..d32eba1 --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte()], +})