From 685ccf8e90dd7c79ae263c9cc0cc7b1d992c955e Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Mon, 13 Apr 2026 21:35:26 +0700 Subject: [PATCH] feat: scaffold Svelte + Tailwind + Vite project (Story 1.1) Initialize project with Svelte 5, Vite 8, Tailwind CSS v4, and Vitest. Set up folder structure (src/lib, src/components, public/fonts), constants module with game values and 12-tier tile colors, Clear Sans font, and page background styling. Co-Authored-By: Claude Opus 4.6 (1M context) --- bmad/.gitignore | 2 + ...-1-project-scaffold-and-dev-environment.md | 115 +- .../sprint-status.yaml | 2 +- bmad/index.html | 13 + bmad/jsconfig.json | 33 + bmad/package-lock.json | 1869 +++++++++++++++++ bmad/package.json | 20 + bmad/public/favicon.svg | 1 + bmad/public/fonts/ClearSans-Bold.woff2 | Bin 0 -> 21052 bytes bmad/public/fonts/ClearSans-Regular.woff2 | Bin 0 -> 20784 bytes bmad/src/App.svelte | 1 + bmad/src/app.css | 23 + bmad/src/lib/constants.js | 25 + bmad/src/lib/game-logic.test.js | 33 + bmad/src/main.js | 9 + bmad/svelte.config.js | 2 + bmad/vite.config.js | 8 + 17 files changed, 2096 insertions(+), 60 deletions(-) create mode 100644 bmad/index.html create mode 100644 bmad/jsconfig.json create mode 100644 bmad/package-lock.json create mode 100644 bmad/package.json create mode 100644 bmad/public/favicon.svg create mode 100644 bmad/public/fonts/ClearSans-Bold.woff2 create mode 100644 bmad/public/fonts/ClearSans-Regular.woff2 create mode 100644 bmad/src/App.svelte create mode 100644 bmad/src/app.css create mode 100644 bmad/src/lib/constants.js create mode 100644 bmad/src/lib/game-logic.test.js create mode 100644 bmad/src/main.js create mode 100644 bmad/svelte.config.js create mode 100644 bmad/vite.config.js diff --git a/bmad/.gitignore b/bmad/.gitignore index 9a5aced..c9f1819 100644 --- a/bmad/.gitignore +++ b/bmad/.gitignore @@ -137,3 +137,5 @@ dist # Vite logs files vite.config.js.timestamp-* vite.config.ts.timestamp-* +node_modules +dist diff --git a/bmad/_bmad-output/implementation-artifacts/1-1-project-scaffold-and-dev-environment.md b/bmad/_bmad-output/implementation-artifacts/1-1-project-scaffold-and-dev-environment.md index 700e2b2..d998c48 100644 --- a/bmad/_bmad-output/implementation-artifacts/1-1-project-scaffold-and-dev-environment.md +++ b/bmad/_bmad-output/implementation-artifacts/1-1-project-scaffold-and-dev-environment.md @@ -1,6 +1,6 @@ # Story 1.1: Project Scaffold & Dev Environment -Status: ready-for-dev +Status: review ## Story @@ -20,53 +20,44 @@ so that all subsequent stories have a solid foundation to build on. ## Tasks / Subtasks -- [ ] Task 1: Initialize project (AC: #1) - - [ ] Run `npm create vite@latest try-bmad -- --template svelte` (or init in current directory) - - [ ] Verify `npm run dev` starts dev server at localhost:5173 - - [ ] Remove default Svelte demo content (Counter component, default styles, Svelte/Vite logos) +- [x] Task 1: Initialize project (AC: #1) + - [x] Run `npm create vite@latest try-bmad -- --template svelte` (or init in current directory) + - [x] Verify `npm run dev` starts dev server at localhost:5173 + - [x] Remove default Svelte demo content (Counter component, default styles, Svelte/Vite logos) -- [ ] Task 2: Install and configure Tailwind CSS v4 (AC: #2) - - [ ] Run `npm install tailwindcss @tailwindcss/vite` - - [ ] Add `tailwindcss()` plugin to `vite.config.js` plugins array - - [ ] Replace content in `src/app.css` with `@import "tailwindcss";` - - [ ] Verify Tailwind utilities work in App.svelte (e.g., a `bg-red-500` class renders correctly) +- [x] Task 2: Install and configure Tailwind CSS v4 (AC: #2) + - [x] Run `npm install tailwindcss @tailwindcss/vite` + - [x] Add `tailwindcss()` plugin to `vite.config.js` plugins array + - [x] Replace content in `src/app.css` with `@import "tailwindcss";` + - [x] Verify Tailwind utilities work in App.svelte (e.g., a `bg-red-500` class renders correctly) -- [ ] Task 3: Install Vitest (AC: #3) - - [ ] Run `npm install -D vitest` - - [ ] Add `"test": "vitest"` script to `package.json` - - [ ] Create a placeholder test file `src/lib/game-logic.test.js` with a single passing test - - [ ] Verify `npx vitest run` passes +- [x] Task 3: Install Vitest (AC: #3) + - [x] Run `npm install -D vitest` + - [x] Add `"test": "vitest"` script to `package.json` + - [x] Create a placeholder test file `src/lib/game-logic.test.js` with a single passing test + - [x] Verify `npx vitest run` passes -- [ ] Task 4: Create folder structure (AC: #4) - - [ ] Create `src/lib/` directory (for pure JS game logic modules) - - [ ] Create `src/components/` directory (for Svelte UI components) - - [ ] Create `public/fonts/` directory (for Clear Sans font files) +- [x] Task 4: Create folder structure (AC: #4) + - [x] Create `src/lib/` directory (for pure JS game logic modules) + - [x] Create `src/components/` directory (for Svelte UI components) + - [x] Create `public/fonts/` directory (for Clear Sans font files) -- [ ] Task 5: Create constants module (AC: #5) - - [ ] Create `src/lib/constants.js` with all game constants: +- [x] Task 5: Create constants module (AC: #5) + - [x] Create `src/lib/constants.js` with all game constants: - `GRID_SIZE = 4` - `WIN_VALUE = 2048` - `SPAWN_PROBABILITY = 0.9` (probability of spawning a 2 vs 4) - `DIRECTIONS = { UP: 'up', DOWN: 'down', LEFT: 'left', RIGHT: 'right' }` - - `TILE_COLORS` map: `{ 2: { bg: '#eee4da', text: '#776e65' }, 4: { bg: '#ede0c8', text: '#776e65' }, 8: { bg: '#f2b179', text: '#f9f6f2' }, 16: { bg: '#f59563', text: '#f9f6f2' }, 32: { bg: '#f67c5f', text: '#f9f6f2' }, 64: { bg: '#f65e3b', text: '#f9f6f2' }, 128: { bg: '#edcf72', text: '#f9f6f2' }, 256: { bg: '#edcc61', text: '#f9f6f2' }, 512: { bg: '#edc850', text: '#f9f6f2' }, 1024: { bg: '#edc53f', text: '#f9f6f2' }, 2048: { bg: '#edc22e', text: '#f9f6f2' }, super: { bg: '#3c3a32', text: '#f9f6f2' } }` + - `TILE_COLORS` map with all 12 tiers -- [ ] Task 6: Add Clear Sans font (AC: #6) - - [ ] Download Clear Sans woff2 from Intel's open-source release or a CDN - - [ ] Place `ClearSans-Bold.woff2` (and regular weight if available) in `public/fonts/` - - [ ] Add `@font-face` declaration in `src/app.css` after the Tailwind import: - ```css - @font-face { - font-family: 'Clear Sans'; - src: url('/fonts/ClearSans-Bold.woff2') format('woff2'); - font-weight: bold; - font-style: normal; - font-display: swap; - } - ``` +- [x] Task 6: Add Clear Sans font (AC: #6) + - [x] Download Clear Sans woff2 from @fontsource/clear-sans npm package + - [x] Place `ClearSans-Bold.woff2` and `ClearSans-Regular.woff2` in `public/fonts/` + - [x] Add `@font-face` declarations in `src/app.css` for both bold and regular weights -- [ ] Task 7: Set page background and base styles (AC: #7) - - [ ] In `src/app.css`, add base body style: `body { background: #faf8ef; font-family: 'Clear Sans', 'Helvetica Neue', Arial, sans-serif; margin: 0; }` - - [ ] Clean up `App.svelte` to render a minimal placeholder (e.g., "2048" heading) confirming styles work +- [x] Task 7: Set page background and base styles (AC: #7) + - [x] In `src/app.css`, add base body style with background #faf8ef and Clear Sans font family + - [x] Clean up `App.svelte` to render a minimal "2048" heading confirming styles work ## Dev Notes @@ -93,27 +84,6 @@ so that all subsequent stories have a solid foundation to build on. - Functions: `camelCase` (e.g., `initGame`, `moveTiles`) - Constants: `UPPER_SNAKE_CASE` (e.g., `GRID_SIZE`, `WIN_VALUE`) -### Project Structure After This Story - -``` -try-bmad/ -├── index.html -├── package.json -├── vite.config.js -├── .gitignore -├── public/ -│ └── fonts/ -│ └── ClearSans-Bold.woff2 -├── src/ -│ ├── main.js -│ ├── App.svelte -│ ├── app.css -│ ├── components/ (empty, ready for Story 1.3+) -│ └── lib/ -│ ├── constants.js -│ └── game-logic.test.js (placeholder) -``` - ### References - [Source: _bmad-output/planning-artifacts/architecture.md#Starter Template Evaluation] @@ -126,8 +96,35 @@ try-bmad/ ### Agent Model Used +Claude Opus 4.6 (1M context) + ### Debug Log References +- Scaffolded to temp directory and copied files (current directory was non-empty) +- Clear Sans font sourced from @fontsource/clear-sans npm package, copied static woff2 files to public/fonts + ### Completion Notes List +- Project scaffolded with Svelte 5.55.1 + Vite 8.0.4 +- Tailwind CSS v4.2.2 configured via @tailwindcss/vite plugin +- Vitest v4.1.4 installed with 5 passing constants tests +- Constants module created with all 12-tier tile colors, directions, and game values +- Clear Sans Bold + Regular fonts placed in public/fonts with @font-face declarations +- Page background #faf8ef set, minimal App.svelte with 2048 heading +- Production build: 24KB JS + 11KB CSS (well under 50KB gzipped target) + ### File List + +- index.html (from scaffold) +- package.json (configured with project name, test script) +- vite.config.js (Svelte + Tailwind plugins) +- jsconfig.json (from scaffold) +- svelte.config.js (from scaffold) +- src/main.js (from scaffold) +- src/app.css (Tailwind import + @font-face + body styles) +- src/App.svelte (minimal 2048 heading) +- src/lib/constants.js (game constants) +- src/lib/game-logic.test.js (constants validation tests) +- public/fonts/ClearSans-Bold.woff2 +- public/fonts/ClearSans-Regular.woff2 +- public/favicon.svg (from scaffold) diff --git a/bmad/_bmad-output/implementation-artifacts/sprint-status.yaml b/bmad/_bmad-output/implementation-artifacts/sprint-status.yaml index d86ec47..d8427f7 100644 --- a/bmad/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/bmad/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -44,7 +44,7 @@ story_location: _bmad-output/implementation-artifacts development_status: # Epic 1: Play a Complete Game (Desktop) epic-1: in-progress - 1-1-project-scaffold-and-dev-environment: ready-for-dev + 1-1-project-scaffold-and-dev-environment: review 1-2-game-logic-module: backlog 1-3-game-board-and-tile-rendering: backlog 1-4-game-header-score-display-and-new-game-button: backlog diff --git a/bmad/index.html b/bmad/index.html new file mode 100644 index 0000000..c8a78ee --- /dev/null +++ b/bmad/index.html @@ -0,0 +1,13 @@ + + + + + + + try-bmad-scaffold + + +
+ + + diff --git a/bmad/jsconfig.json b/bmad/jsconfig.json new file mode 100644 index 0000000..c7a0b10 --- /dev/null +++ b/bmad/jsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "moduleResolution": "bundler", + "target": "ESNext", + "module": "ESNext", + /** + * svelte-preprocess cannot figure out whether you have + * a value or a type, so tell TypeScript to enforce using + * `import type` instead of `import` for Types. + */ + "verbatimModuleSyntax": true, + "isolatedModules": true, + "resolveJsonModule": true, + /** + * To have warnings / errors of the Svelte compiler at the + * correct position, enable source maps by default. + */ + "sourceMap": true, + "esModuleInterop": true, + "types": ["vite/client"], + "skipLibCheck": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable this if you'd like to use dynamic types. + */ + "checkJs": true + }, + /** + * Use global.d.ts instead of compilerOptions.types + * to avoid limiting type declarations. + */ + "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/bmad/package-lock.json b/bmad/package-lock.json new file mode 100644 index 0000000..af60847 --- /dev/null +++ b/bmad/package-lock.json @@ -0,0 +1,1869 @@ +{ + "name": "try-bmad", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "try-bmad", + "version": "0.0.0", + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^7.0.0", + "@tailwindcss/vite": "^4.2.2", + "svelte": "^5.55.1", + "tailwindcss": "^4.2.2", + "vite": "^8.0.4", + "vitest": "^4.1.4" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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/@napi-rs/wasm-runtime": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.124.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", + "dev": true, + "license": "MIT" + }, + "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.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.0.0.tgz", + "integrity": "sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "magic-string": "^0.30.21", + "obug": "^2.1.0", + "vitefu": "^1.1.2" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.46.4", + "vite": "^8.0.0-beta.7 || ^8.0.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "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.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "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/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.4.tgz", + "integrity": "sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.4", + "@vitest/utils": "4.1.4", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.4.tgz", + "integrity": "sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.4.tgz", + "integrity": "sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.4.tgz", + "integrity": "sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.4", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.4.tgz", + "integrity": "sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.4", + "@vitest/utils": "4.1.4", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.4.tgz", + "integrity": "sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.4.tgz", + "integrity": "sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.4", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "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/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "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.7.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz", + "integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "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.5", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.5.tgz", + "integrity": "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "peerDependencies": { + "@typescript-eslint/types": "^8.2.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/types": { + "optional": true + } + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "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/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "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.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" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "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/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/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/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "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.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "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/rolldown": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/svelte": { + "version": "5.55.3", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.3.tgz", + "integrity": "sha512-dS1N+i3bA1v+c4UDb750MlN5vCO82G6vxh8HeTsPsTdJ1BLsN1zxSyDlIdBBqUjqZ/BxEwM8UrFf98aaoVnZFQ==", + "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", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.4", + "esm-env": "^1.2.1", + "esrap": "^2.2.4", + "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.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", + "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/vite": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.15", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "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 + } + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "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 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.4.tgz", + "integrity": "sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.4", + "@vitest/mocker": "4.1.4", + "@vitest/pretty-format": "4.1.4", + "@vitest/runner": "4.1.4", + "@vitest/snapshot": "4.1.4", + "@vitest/spy": "4.1.4", + "@vitest/utils": "4.1.4", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.4", + "@vitest/browser-preview": "4.1.4", + "@vitest/browser-webdriverio": "4.1.4", + "@vitest/coverage-istanbul": "4.1.4", + "@vitest/coverage-v8": "4.1.4", + "@vitest/ui": "4.1.4", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "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/bmad/package.json b/bmad/package.json new file mode 100644 index 0000000..3b5a3d9 --- /dev/null +++ b/bmad/package.json @@ -0,0 +1,20 @@ +{ + "name": "try-bmad", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "test": "vitest" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^7.0.0", + "@tailwindcss/vite": "^4.2.2", + "svelte": "^5.55.1", + "tailwindcss": "^4.2.2", + "vite": "^8.0.4", + "vitest": "^4.1.4" + } +} diff --git a/bmad/public/favicon.svg b/bmad/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/bmad/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bmad/public/fonts/ClearSans-Bold.woff2 b/bmad/public/fonts/ClearSans-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..aacbb2d7836594390dd1475ae3c725c9cfc8532d GIT binary patch literal 21052 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 H{F?y)m=?-g literal 0 HcmV?d00001 diff --git a/bmad/public/fonts/ClearSans-Regular.woff2 b/bmad/public/fonts/ClearSans-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..381c1507c91098fd81dfd23c591defedbab1508a GIT binary patch literal 20784 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 literal 0 HcmV?d00001 diff --git a/bmad/src/App.svelte b/bmad/src/App.svelte new file mode 100644 index 0000000..03feec7 --- /dev/null +++ b/bmad/src/App.svelte @@ -0,0 +1 @@ +

2048

diff --git a/bmad/src/app.css b/bmad/src/app.css new file mode 100644 index 0000000..e7cc9f6 --- /dev/null +++ b/bmad/src/app.css @@ -0,0 +1,23 @@ +@import "tailwindcss"; + +@font-face { + font-family: 'Clear Sans'; + src: url('/fonts/ClearSans-Regular.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Clear Sans'; + src: url('/fonts/ClearSans-Bold.woff2') format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +body { + background: #faf8ef; + font-family: 'Clear Sans', 'Helvetica Neue', Arial, sans-serif; + margin: 0; +} diff --git a/bmad/src/lib/constants.js b/bmad/src/lib/constants.js new file mode 100644 index 0000000..26c1199 --- /dev/null +++ b/bmad/src/lib/constants.js @@ -0,0 +1,25 @@ +export const GRID_SIZE = 4; +export const WIN_VALUE = 2048; +export const SPAWN_PROBABILITY = 0.9; + +export const DIRECTIONS = { + UP: 'up', + DOWN: 'down', + LEFT: 'left', + RIGHT: 'right', +}; + +export const TILE_COLORS = { + 2: { bg: '#eee4da', text: '#776e65' }, + 4: { bg: '#ede0c8', text: '#776e65' }, + 8: { bg: '#f2b179', text: '#f9f6f2' }, + 16: { bg: '#f59563', text: '#f9f6f2' }, + 32: { bg: '#f67c5f', text: '#f9f6f2' }, + 64: { bg: '#f65e3b', text: '#f9f6f2' }, + 128: { bg: '#edcf72', text: '#f9f6f2' }, + 256: { bg: '#edcc61', text: '#f9f6f2' }, + 512: { bg: '#edc850', text: '#f9f6f2' }, + 1024: { bg: '#edc53f', text: '#f9f6f2' }, + 2048: { bg: '#edc22e', text: '#f9f6f2' }, + super: { bg: '#3c3a32', text: '#f9f6f2' }, +}; diff --git a/bmad/src/lib/game-logic.test.js b/bmad/src/lib/game-logic.test.js new file mode 100644 index 0000000..ccb1d4c --- /dev/null +++ b/bmad/src/lib/game-logic.test.js @@ -0,0 +1,33 @@ +import { describe, it, expect } from 'vitest'; +import { GRID_SIZE, WIN_VALUE, SPAWN_PROBABILITY, DIRECTIONS, TILE_COLORS } from './constants.js'; + +describe('constants', () => { + it('should have correct grid size', () => { + expect(GRID_SIZE).toBe(4); + }); + + it('should have correct win value', () => { + expect(WIN_VALUE).toBe(2048); + }); + + it('should have correct spawn probability', () => { + expect(SPAWN_PROBABILITY).toBe(0.9); + }); + + it('should have all four directions', () => { + expect(DIRECTIONS).toEqual({ + UP: 'up', + DOWN: 'down', + LEFT: 'left', + RIGHT: 'right', + }); + }); + + it('should have 12 tile color tiers', () => { + const keys = Object.keys(TILE_COLORS); + expect(keys).toHaveLength(12); + expect(TILE_COLORS[2].bg).toBe('#eee4da'); + expect(TILE_COLORS[2048].bg).toBe('#edc22e'); + expect(TILE_COLORS.super.bg).toBe('#3c3a32'); + }); +}); diff --git a/bmad/src/main.js b/bmad/src/main.js new file mode 100644 index 0000000..458c7a8 --- /dev/null +++ b/bmad/src/main.js @@ -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/bmad/svelte.config.js b/bmad/svelte.config.js new file mode 100644 index 0000000..0cf7db3 --- /dev/null +++ b/bmad/svelte.config.js @@ -0,0 +1,2 @@ +/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */ +export default {} diff --git a/bmad/vite.config.js b/bmad/vite.config.js new file mode 100644 index 0000000..1756ee0 --- /dev/null +++ b/bmad/vite.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' +import tailwindcss from '@tailwindcss/vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte(), tailwindcss()], +})