From 8a5b3762dab48b88359416e0946169175ff898a2 Mon Sep 17 00:00:00 2001 From: Rahul Date: Mon, 7 Sep 2026 16:55:25 +0530 Subject: [PATCH 01/26] chore: add repo metadata and cleanup starter assets Add package.json description/keywords/repository for the public Webvoltz profile listing, commit the ESLint/Prettier/Husky/commitlint/ Gitleaks tooling baseline, and remove unused Vite/React starter assets (react.svg, default vite.svg favicon replaced with a project favicon). --- .editorconfig | 9 + .gitignore | 12 + .gitleaks.toml | 4 + .husky/commit-msg | 1 + .husky/pre-commit | 10 + .prettierignore | 17 + .prettierrc.json | 12 + README.md | 200 ++- commitlint.config.cjs | 23 + eslint.config.js | 70 +- index.html | 29 +- lint-staged.config.mjs | 4 + package.json | 38 +- pnpm-lock.yaml | 2107 +++++++++++++++++++++++++++- pnpm-workspace.yaml | 2 + public/favicon.svg | 14 + public/vite.svg | 1 - scripts/generateVenue.ts | 81 +- src/App.tsx | 89 +- src/assets/react.svg | 1 - src/components/BookingSummary.tsx | 267 ++-- src/components/Seat.tsx | 277 ++-- src/components/Section.tsx | 296 ++-- src/components/SectionSkeleton.tsx | 44 +- src/components/Stage.tsx | 25 +- src/components/VenueMap.tsx | 93 +- src/hooks/useVenue.ts | 46 +- src/index.css | 2 +- src/interfaces/venue.interfaces.ts | 50 +- src/main.tsx | 10 +- src/store/seatStore.ts | 125 +- tsconfig.app.json | 4 +- tsconfig.json | 2 +- tsconfig.node.json | 6 +- vite.config.ts | 11 +- 35 files changed, 3239 insertions(+), 743 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitleaks.toml create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 commitlint.config.cjs create mode 100644 lint-staged.config.mjs create mode 100644 pnpm-workspace.yaml create mode 100644 public/favicon.svg delete mode 100644 public/vite.svg delete mode 100644 src/assets/react.svg diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..86a63dc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.gitignore b/.gitignore index a547bf3..abfdc49 100644 --- a/.gitignore +++ b/.gitignore @@ -11,11 +11,23 @@ node_modules dist dist-ssr *.local +coverage +.vite/ +.npm/ + +.env +.env.* +!.env.example + +src/generated/ +public/generated/ +*.generated.* # Editor directories and files .vscode/* !.vscode/extensions.json .idea +.claude/ .DS_Store *.suo *.ntvs* diff --git a/.gitleaks.toml b/.gitleaks.toml new file mode 100644 index 0000000..5844738 --- /dev/null +++ b/.gitleaks.toml @@ -0,0 +1,4 @@ +title = "Interactive Event Seating Map secret scanning" + +[extend] +useDefault = true diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..da99483 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx --no -- commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..10304c2 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,10 @@ +#!/usr/bin/env sh +set -eu + +if ! command -v gitleaks >/dev/null 2>&1; then + echo "gitleaks 8.30.x is required before committing." >&2 + exit 1 +fi + +git diff --cached --no-ext-diff --unified=0 | gitleaks stdin --config .gitleaks.toml --redact --no-banner +npx lint-staged diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..43269ef --- /dev/null +++ b/.prettierignore @@ -0,0 +1,17 @@ +dist/ +coverage/ +node_modules/ +.claude/ + +src/generated/ +public/generated/ +**/*.generated.* + +package-lock.json +npm-shrinkwrap.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +public/venue.json diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..642543d --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,12 @@ +{ + "arrowParens": "always", + "bracketSameLine": false, + "endOfLine": "lf", + "printWidth": 100, + "semi": true, + "singleAttributePerLine": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false +} diff --git a/README.md b/README.md index f8a6410..cd23651 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,193 @@ # Event Seating Map -A high-performance, interactive seating map for large venues. Built to handle 15,000+ seats with smooth performance and a premium user experience. +[![Node Version](https://img.shields.io/badge/node-%3E%3D24%20%3C25-339933?logo=node.js&logoColor=white)](https://nodejs.org) +[![React Version](https://img.shields.io/badge/react-19.2-149ECA?logo=react&logoColor=white)](https://react.dev) +[![pnpm](https://img.shields.io/badge/pnpm-package%20manager-F69220?logo=pnpm&logoColor=white)](https://pnpm.io) -##Quick Start +A high-performance, interactive seating map for large venues, built to handle 15,000+ seats with smooth panning, zooming, and keyboard navigation. -Get the project running in seconds: +--- -1. **Install dependencies:** +## ๐Ÿš€ Features + +- **Large-scale rendering**: Thousands of seats render smoothly using SVG optimization. +- **Map navigation**: Click-and-drag panning with smart zoom in/out controls. +- **Accessibility**: Full arrow-key navigation between seats, keyboard-selectable seats (`role="checkbox"`). +- **Persisted selection**: Selected seats survive a page refresh (Zustand + `localStorage`). +- **Responsive layout**: A collapsible booking sidebar on mobile, side-by-side on desktop. + +--- + +## ๐Ÿ› ๏ธ Tech Stack + +### Application + +- **Core**: React 19, TypeScript +- **State Management**: Zustand (with persisted seat selection) +- **Styling**: Tailwind CSS +- **Build Tool**: Vite + +### Engineering standards & tooling + +- **Testing**: Vitest +- **Linting/Formatting**: ESLint (React, hooks, jsx-a11y, type-checked TypeScript rules) + Prettier +- **Git hooks**: Husky (`pre-commit` โ†’ Gitleaks + lint-staged, `commit-msg` โ†’ commitlint) +- **Commit convention**: Conventional Commits, enforced by commitlint +- **Secret scanning**: Gitleaks (local pre-commit + full-history scan in CI) +- **CI**: GitHub Actions (`secret-scan`, `quality`, `commitlint`, `test`, `build`) + +See [Engineering standards](#-engineering-standards) below for details. + +--- + +## ๐Ÿ“‚ Repository Structure + +```text +โ”œโ”€โ”€ public/ +โ”‚ โ””โ”€โ”€ venue.json # Generated seating data served to the client +โ”œโ”€โ”€ scripts/ +โ”‚ โ””โ”€โ”€ generateVenue.ts # Generates public/venue.json +โ”œโ”€โ”€ src/ +โ”‚ โ”œโ”€โ”€ components/ # VenueMap, Section, Seat, Stage, BookingSummary, ... +โ”‚ โ”œโ”€โ”€ hooks/ +โ”‚ โ”‚ โ””โ”€โ”€ useVenue.ts # Fetches and exposes public/venue.json +โ”‚ โ”œโ”€โ”€ store/ +โ”‚ โ”‚ โ””โ”€โ”€ seatStore.ts # Zustand store (zoom, active section, selected seats) +โ”‚ โ”œโ”€โ”€ interfaces/ +โ”‚ โ”‚ โ””โ”€โ”€ venue.interfaces.ts +โ”‚ โ”œโ”€โ”€ App.tsx +โ”‚ โ””โ”€โ”€ main.tsx +โ”œโ”€โ”€ .github/workflows/ci.yml # CI pipeline +โ”œโ”€โ”€ .husky/ # pre-commit / commit-msg hooks +โ””โ”€โ”€ README.md +``` + +--- + +## โš™๏ธ Getting Started + +### Prerequisites + +- **Node.js** `>=24 <25` (see `engines` in `package.json`) +- **pnpm** (this project uses pnpm, not npm/yarn โ€” a `pnpm-lock.yaml` is committed) +- **Gitleaks v8.30.1** on `PATH` โ€” required by the pre-commit hook (see [Secret scanning](#secret-scanning-gitleaks)) + +### Installation & Setup + +1. **Clone the repository** + + ```bash + git clone git@github.com:webvoltz/Interactive-Event-Seating-Map.git + cd Interactive-Event-Seating-Map + ``` + +2. **Install dependencies** + + ```bash pnpm install + ``` + +3. **Install the Husky git hooks** (one-time, after cloning) + + ```bash + pnpm run prepare + ``` + +### Running Locally + +```bash +pnpm dev +``` + +The app expects seat data at `public/venue.json`; a sample file is already checked in. Regenerate it any time with: + +```bash +pnpm run generate:venue +``` + +--- + +## ๐Ÿ”’ Environment Variables + +There are **no environment variables** โ€” seating data is served from the static `public/venue.json`, not an API. If a real backend is introduced later, add a Zod-validated env module rather than reading `import.meta.env` directly in components. + +--- + +## ๐Ÿงช Running Tests + +```bash +pnpm test +``` + +--- + +## ๐Ÿ“ Engineering standards + +This project follows the React engineering standards. + +### Code quality + +- **ESLint** (`eslint.config.js`) lints `.js/.jsx/.ts/.tsx` with `eslint-plugin-react`, + `eslint-plugin-react-hooks`, `eslint-plugin-jsx-a11y`, and type-checked + `typescript-eslint` rules (`no-floating-promises`, `no-misused-promises`, `no-unsafe-*`, + `consistent-type-imports`). `pnpm run lint` fails on any warning (`--max-warnings=0`). +- **Prettier** (`.prettierrc.json`) is the single source of formatting truth. Run + `pnpm run format`, or let the pre-commit hook format staged files for you. +- **TypeScript** runs in strict mode plus `noUncheckedIndexedAccess` and + `exactOptionalPropertyTypes` โ€” guard indexed access explicitly instead of asserting it away. +- `pnpm run quality` runs format-check, lint, and typecheck together โ€” this is what CI runs too. + +### Git hooks (Husky) + +Installed via `pnpm run prepare`. Two hooks live in `.husky/`: + +- **`pre-commit`** โ€” scans the staged diff with Gitleaks, then runs `lint-staged` + (ESLint `--fix` + Prettier) on the files you're committing. +- **`commit-msg`** โ€” runs `commitlint` against your commit message. + +Don't bypass either hook with `--no-verify` to get past a genuine failure โ€” fix the issue instead. + +### Commit messages + +Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/), checked by `commitlint.config.cjs`: + +- Header (first line) must be โ‰ค 100 characters. +- `type` must be one of: `build`, `chore`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `style`, `test`. + +Example: `fix: prevent seat selection past the 8-seat limit` + +### Secret scanning (Gitleaks) + +The pre-commit hook requires the `gitleaks` binary on `PATH` and **fails closed** if it's missing: + +1. Download [Gitleaks v8.30.1](https://github.com/gitleaks/gitleaks/releases/tag/v8.30.1) for your platform. +2. Verify it per your usual tooling-verification process and put the `gitleaks` executable on `PATH`. +3. Confirm `gitleaks version` works. + +GitHub Actions independently re-scans full repository history with the same pinned version, so a bypassed local hook is still caught in CI. + +**False positives:** investigate every finding first. Only add a narrowly scoped exception in `.gitleaks.toml` after a real secret has been ruled out, with a comment explaining why โ€” never a blanket allowlist โ€” and re-run the scan afterward. + +### Continuous integration -2. **Generate venue data (Optional):** - npx ts-node scripts/generateVenue.ts +`.github/workflows/ci.yml` runs on every push and pull request: -3. **Start development server:** - pnpm dev +| Job | What it does | +| ------------- | --------------------------------------------------- | +| `secret-scan` | Gitleaks over full repository history. | +| `quality` | `pnpm run quality` (format check, lint, typecheck). | +| `commitlint` | Lints the commit range being pushed/merged. | +| `test` | `pnpm test`. | +| `build` | `pnpm run build`. | -## Key Features +All jobs must pass before merging. -- Handles thousands of seats smoothly using SVG optimization. -- Intuitive click-and-drag panning and smart zoom. -- Full support for arrow-key navigation between seats. -- Remembers your selected seats even after a page refresh. -- Works beautifully on both desktop and mobile devices. +--- -## Tech Stack +## ๐Ÿค Contributing -- **React + TypeScript** โ€“ Core logic and type safety. -- **Tailwind CSS** โ€“ Modern, responsive styling. -- **Zustand** โ€“ Lightweight and fast state management. -- **Vite** โ€“ Lightning-fast build tool. +1. Fork or branch from `main`. +2. Create your feature branch (`git checkout -b feature/amazing-feature`). +3. Commit your changes following the [commit convention](#commit-messages) (`git commit -m 'feat: add amazing feature'`). +4. Run `pnpm run quality && pnpm test && pnpm run build` before pushing. +5. Push to the branch and open a pull request. diff --git a/commitlint.config.cjs b/commitlint.config.cjs new file mode 100644 index 0000000..4a731e8 --- /dev/null +++ b/commitlint.config.cjs @@ -0,0 +1,23 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'header-max-length': [2, 'always', 100], + 'type-enum': [ + 2, + 'always', + [ + 'build', + 'chore', + 'ci', + 'docs', + 'feat', + 'fix', + 'perf', + 'refactor', + 'revert', + 'style', + 'test', + ], + ], + }, +}; diff --git a/eslint.config.js b/eslint.config.js index 5e6b472..8aaa2f9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,23 +1,67 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' -import { defineConfig, globalIgnores } from 'eslint/config' +import eslint from '@eslint/js'; +import { defineConfig, globalIgnores } from 'eslint/config'; +import prettier from 'eslint-config-prettier/flat'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; +import react from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; -export default defineConfig([ - globalIgnores(['dist']), +const sourceFiles = ['**/*.{js,jsx,ts,tsx}']; +const typedFiles = ['**/*.{ts,tsx}']; + +export default defineConfig( + globalIgnores([ + 'dist/**', + 'coverage/**', + 'src/generated/**', + 'public/generated/**', + '**/*.generated.*', + ]), { - files: ['**/*.{ts,tsx}'], + files: sourceFiles, extends: [ - js.configs.recommended, - tseslint.configs.recommended, + eslint.configs.recommended, + react.configs.flat.recommended, + react.configs.flat['jsx-runtime'], reactHooks.configs.flat.recommended, reactRefresh.configs.vite, + jsxA11y.flatConfigs.recommended, ], languageOptions: { - ecmaVersion: 2020, globals: globals.browser, }, + settings: { + react: { + version: 'detect', + }, + }, + rules: { + 'no-console': ['warn', { allow: ['warn', 'error'] }], + 'react/prop-types': 'off', + }, + }, + { + files: typedFiles, + extends: [tseslint.configs.recommendedTypeChecked], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + rules: { + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-misused-promises': 'error', + }, + }, + { + files: ['scripts/**'], + rules: { + 'no-console': 'off', + }, }, -]) + prettier, +); diff --git a/index.html b/index.html index 02f7e28..885ce3c 100644 --- a/index.html +++ b/index.html @@ -1,17 +1,18 @@ + + + + + + Event Seating + - - - - - - Event Seating - - - -
- - - - \ No newline at end of file + +
+ + + diff --git a/lint-staged.config.mjs b/lint-staged.config.mjs new file mode 100644 index 0000000..c6366cb --- /dev/null +++ b/lint-staged.config.mjs @@ -0,0 +1,4 @@ +export default { + '*.{cjs,js,jsx,mjs,ts,tsx}': ['eslint --fix --max-warnings=0', 'prettier --write'], + '*.{json,css,scss,sass,less,md,mdx,yaml,yml}': 'prettier --write', +}; diff --git a/package.json b/package.json index aa27f6f..91f804b 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,36 @@ { "name": "event-seating", + "description": "High-performance React seating map for 15,000+ interactive seats, rendered with section-level SVG virtualization and Zustand-persisted selection.", + "repository": { + "type": "git", + "url": "git+https://github.com/webvoltz/Interactive-Event-Seating-Map.git" + }, + "keywords": [ + "react", + "typescript", + "vite", + "zustand", + "svg", + "performance", + "accessibility" + ], "private": true, "version": "0.0.0", "type": "module", + "engines": { + "node": ">=24 <25" + }, "scripts": { "dev": "vite", "build": "tsc -b && vite build", - "lint": "eslint .", + "format": "prettier --write .", + "format:check": "prettier --check .", + "lint": "eslint . --max-warnings=0", + "prepare": "husky", "preview": "vite preview", + "quality": "pnpm format:check && pnpm lint && pnpm typecheck", + "test": "vitest run --passWithNoTests", + "typecheck": "tsc -b", "generate:venue": "ts-node scripts/generateVenue.ts" }, "dependencies": { @@ -18,18 +41,27 @@ "zustand": "^5.0.9" }, "devDependencies": { + "@commitlint/cli": "^21.2.2", + "@commitlint/config-conventional": "^21.2.2", "@eslint/js": "^9.39.1", "@types/node": "^24.10.1", "@types/react": "^19.2.5", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^5.1.1", "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.24", "globals": "^16.5.0", + "husky": "^9.1.7", + "lint-staged": "^17.5.0", + "prettier": "^3.9.6", "ts-node": "^10.9.2", "typescript": "~5.9.3", "typescript-eslint": "^8.46.4", - "vite": "^7.2.4" + "vite": "^7.2.4", + "vitest": "^5.0.0" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9c34bd..3566842 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)) react: specifier: ^19.2.0 version: 19.2.3 @@ -24,6 +24,12 @@ importers: specifier: ^5.0.9 version: 5.0.9(@types/react@19.2.7)(react@19.2.3) devDependencies: + '@commitlint/cli': + specifier: ^21.2.2 + version: 21.2.2(@types/node@24.10.4)(conventional-commits-parser@7.1.2)(typescript@5.9.3) + '@commitlint/config-conventional': + specifier: ^21.2.2 + version: 21.2.2 '@eslint/js': specifier: ^9.39.1 version: 9.39.2 @@ -38,10 +44,19 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)) eslint: specifier: ^9.39.1 version: 9.39.2(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-jsx-a11y: + specifier: ^6.10.2 + version: 6.10.2(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react: + specifier: ^7.37.5 + version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^7.0.1 version: 7.0.1(eslint@9.39.2(jiti@2.6.1)) @@ -51,6 +66,15 @@ importers: globals: specifier: ^16.5.0 version: 16.5.0 + husky: + specifier: ^9.1.7 + version: 9.1.7 + lint-staged: + specifier: ^17.5.0 + version: 17.5.0 + prettier: + specifier: ^3.9.6 + version: 3.9.6 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@24.10.4)(typescript@5.9.3) @@ -62,7 +86,10 @@ importers: version: 8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.2.4 - version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2) + version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) + vitest: + specifier: ^5.0.0 + version: 5.0.0(@types/node@24.10.4)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)) packages: @@ -149,6 +176,91 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@commitlint/cli@21.2.2': + resolution: {integrity: sha512-a+6hQxIxnpdvSvS2apvttPNbEliYsVC3PqFYDiiB2kjbwIsQsj1urvQ4Tkf70pKYozPalKAuRQmm/GHwndduqA==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@commitlint/config-conventional@21.2.2': + resolution: {integrity: sha512-NxA37SZviusFUEYOQZ5hNnZ1h7O/KiemPkxjOlpzKJNnWxThiwc6/SaZhaPa8fyLvfRBAywhQhJJk8XESHWlpQ==} + engines: {node: '>=22.12.0'} + + '@commitlint/config-validator@21.2.0': + resolution: {integrity: sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA==} + engines: {node: '>=22.12.0'} + + '@commitlint/ensure@21.2.0': + resolution: {integrity: sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg==} + engines: {node: '>=22.12.0'} + + '@commitlint/execute-rule@21.0.1': + resolution: {integrity: sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==} + engines: {node: '>=22.12.0'} + + '@commitlint/format@21.2.2': + resolution: {integrity: sha512-v6fvxZSc/AvVMROlr3H34+1766bZSYApRUSCAMjWamStPjKMvZ8GdvVA5YW/VQNgbFTmcMz6OYmSTJEvIjPrfA==} + engines: {node: '>=22.12.0'} + + '@commitlint/is-ignored@21.2.2': + resolution: {integrity: sha512-9UoKNgfFE3LU7FrzierCvk3CdDfMDeVGC86qZiT/n0TIjfq/dmZ9MHuXd45OTNRa26ZanmJRxEtmiXk/lEJihg==} + engines: {node: '>=22.12.0'} + + '@commitlint/lint@21.2.2': + resolution: {integrity: sha512-Fy8JxEBzdmsYWFude/61GxXu5O+wEymwiRK2z9GL9R8mCsXphCoGxAFc5iHn5mjlfcSrhiiONE+ksf4KOjnaPg==} + engines: {node: '>=22.12.0'} + + '@commitlint/load@21.2.2': + resolution: {integrity: sha512-0Tt6wDPX167cjKC5D4zhm0+20wJJG+TN/TKovMOspfSe78rOnKX+MNzlVNiu6HyQPZChPJ8QBH31MVt6Bb8fCg==} + engines: {node: '>=22.12.0'} + + '@commitlint/message@21.2.0': + resolution: {integrity: sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g==} + engines: {node: '>=22.12.0'} + + '@commitlint/parse@21.2.2': + resolution: {integrity: sha512-MEkobPfvRp+z06Wro8HMG1BDGHzZmj82A1LH1nWeG3ipHpg/x4m6v3wEDvMBIKjRFUnfR3nBeFs3MVCr7UdAmg==} + engines: {node: '>=22.12.0'} + + '@commitlint/read@21.2.1': + resolution: {integrity: sha512-hUW7EJQnNTL0vPOmVMNK4CrnrNBN0nN+JJHReFkdHO5y4iyHeEmTBwuC15OCqUTjxWo7idnH1LftfpWVIaPWIA==} + engines: {node: '>=22.12.0'} + + '@commitlint/resolve-extends@21.2.2': + resolution: {integrity: sha512-RPkJ/IFi7sMUUVbZLqwWFtWw/zRDcfFsmrPSiTMrt5wb7AdxOr86EGQFvmGzef5QKV5IPBWWCujqVTw1RWX44A==} + engines: {node: '>=22.12.0'} + + '@commitlint/rules@21.2.2': + resolution: {integrity: sha512-eplQzyYkBjYB1HyyRj8hkcK11Y9DU9nuBz7uOKEd6NpE9NGDytLFCAnlRE+OoiK/5sHEJsaz2RGhuWBvYzIbNA==} + engines: {node: '>=22.12.0'} + + '@commitlint/to-lines@21.0.1': + resolution: {integrity: sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==} + engines: {node: '>=22.12.0'} + + '@commitlint/top-level@21.2.0': + resolution: {integrity: sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ==} + engines: {node: '>=22.12.0'} + + '@commitlint/types@21.2.0': + resolution: {integrity: sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw==} + engines: {node: '>=22.12.0'} + + '@conventional-changelog/git-client@3.1.2': + resolution: {integrity: sha512-jZqwnJwf7nboIlAcw/mkOjVa6DexCcUOgT2oOQgkoi3z9vR8tGFkcMy2BFcYwjhL9sYcDDXkRQDayiDieCoW7A==} + engines: {node: '>=22'} + peerDependencies: + conventional-commits-filter: ^6.0.1 + conventional-commits-parser: ^7.1.2 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + + '@conventional-changelog/template@1.4.0': + resolution: {integrity: sha512-aalGyl7dbB5PArRebDIX43ZvBlXrYm9uWzGJ26t+4SzJVPsOuvfILGGbw5X4yX7i50YEmJ8zvbiWnqH/AAnZqg==} + engines: {node: '>=22'} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -419,56 +531,67 @@ packages: resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.54.0': resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.54.0': resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.54.0': resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.54.0': resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.54.0': resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.54.0': resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.54.0': resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.54.0': resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.54.0': resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.54.0': resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.54.0': resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} @@ -495,6 +618,14 @@ packages: cpu: [x64] os: [win32] + '@simple-libs/child-process-utils@2.0.0': + resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==} + engines: {node: '>=22'} + + '@simple-libs/stream-utils@2.0.0': + resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} + engines: {node: '>=22'} + '@tailwindcss/node@4.1.18': resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} @@ -533,24 +664,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -609,6 +744,12 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -691,6 +832,20 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/mocker@5.0.0': + resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/spy@5.0.0': + resolution: {integrity: sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -708,16 +863,86 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argue-cli@3.2.0: + resolution: {integrity: sha512-VipTB0gXgGIFO2Rg9yEVN5wLt2AurJcZqDbgmYSwPwsykhLrQhs240/bfceev4w68lI8JshoOJIk9uW7tFzROw==} + engines: {node: '>=22'} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.13.0: + resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -736,6 +961,18 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -743,10 +980,18 @@ packages: caniuse-lite@1.0.30001762: resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -757,9 +1002,39 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + conventional-changelog-angular@9.4.0: + resolution: {integrity: sha512-HdxRxuS8bBXVIuo4V82gvSwAXT0vYQUizrjs/izmPg5JdDstr8v8I5hduGL3iQbG+o310dUDxC4+LetuS5hu9w==} + engines: {node: '>=22'} + + conventional-changelog-conventionalcommits@10.4.0: + resolution: {integrity: sha512-Rriac6ZrAlVm6cy9Bz4NSp+WMHpwNXoPIYex+HjCgduAVUSbnew29DQjQw0C4g9u3HtSYzGiGY+pdBXAZo+4aA==} + engines: {node: '>=22'} + + conventional-commits-parser@7.1.2: + resolution: {integrity: sha512-O+x4N2yH+ijvqWlIyTHsXTAP+algNWgGbjY2duCe8w2vUMvUB95cLRslCPfTMQyLAKlet3bhZTdu6ozn4M+QJQ==} + engines: {node: '>=22'} + hasBin: true + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cosmiconfig-typescript-loader@6.3.0: + resolution: {integrity: sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' + + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -770,6 +1045,21 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -782,6 +1072,14 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -790,13 +1088,76 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enhanced-resolve@5.18.4: resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} + engines: {node: '>= 0.4'} + + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} + esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} @@ -810,6 +1171,18 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint-plugin-react-hooks@7.0.1: resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} engines: {node: '>=18'} @@ -821,6 +1194,12 @@ packages: peerDependencies: eslint: '>=8.40' + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -836,6 +1215,7 @@ packages: eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -859,10 +1239,17 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -872,6 +1259,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.1.7: + resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -896,19 +1286,61 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + global-directory@5.0.0: + resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} + engines: {node: '>=20'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -917,19 +1349,55 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -946,17 +1414,131 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -976,9 +1558,15 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -987,9 +1575,20 @@ packages: engines: {node: '>=6'} hasBin: true + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -1029,24 +1628,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -1064,6 +1667,14 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@17.5.0: + resolution: {integrity: sha512-ah2qsNtvKP1+Ak4rAvEEIvcXDLjjbr/xmxCvlequxqEOFYk0qINcZcRxD3Ic8wRn7/oQ8+wC9s0DfDrdMVCRFg==} + engines: {node: '>=22.22.1'} + hasBin: true + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1071,15 +1682,26 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.2.3: + resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1098,13 +1720,53 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} + engines: {node: '>= 0.4'} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1117,6 +1779,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1125,6 +1791,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1132,6 +1801,14 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -1140,6 +1817,14 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1149,6 +1834,9 @@ packages: peerDependencies: react: ^19.2.3 + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} @@ -1157,15 +1845,48 @@ packages: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} + hasBin: true + rollup@4.54.0: resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -1178,6 +1899,18 @@ packages: engines: {node: '>=10'} hasBin: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1186,10 +1919,78 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + engines: {node: '>=20'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.1.0: + resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -1198,6 +1999,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} @@ -1205,10 +2010,26 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tinybench@6.1.4: + resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} + engines: {node: '>=20.0.0'} + + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + ts-api-utils@2.3.0: resolution: {integrity: sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==} engines: {node: '>=18.12'} @@ -1233,6 +2054,22 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + typescript-eslint@8.51.0: resolution: {integrity: sha512-jh8ZuM5oEh2PSdyQG9YAEM1TCGuWenLSuSUhf/irbVUNW9O5FhbFVONviN2TgMTBnUmyHv7E56rYnfLZK6TkiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1245,6 +2082,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -1300,18 +2141,101 @@ packages: yaml: optional: true - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + vitest@5.0.0: + resolution: {integrity: sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.0 + '@vitest/browser-preview': 5.0.0 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.0 + '@vitest/coverage-v8': 5.0.0 + '@vitest/ui': 5.0.0 + happy-dom: '*' + jsdom: '*' + vite: ^6.4.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 + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.1.0: + resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -1461,6 +2385,125 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@commitlint/cli@21.2.2(@types/node@24.10.4)(conventional-commits-parser@7.1.2)(typescript@5.9.3)': + dependencies: + '@commitlint/config-conventional': 21.2.2 + '@commitlint/format': 21.2.2 + '@commitlint/lint': 21.2.2 + '@commitlint/load': 21.2.2(@types/node@24.10.4)(typescript@5.9.3) + '@commitlint/read': 21.2.1(conventional-commits-parser@7.1.2) + '@commitlint/types': 21.2.0 + tinyexec: 1.3.1 + yargs: 18.1.0 + transitivePeerDependencies: + - '@types/node' + - conventional-commits-filter + - conventional-commits-parser + - typescript + + '@commitlint/config-conventional@21.2.2': + dependencies: + '@commitlint/types': 21.2.0 + conventional-changelog-conventionalcommits: 10.4.0 + + '@commitlint/config-validator@21.2.0': + dependencies: + '@commitlint/types': 21.2.0 + ajv: 8.20.0 + + '@commitlint/ensure@21.2.0': + dependencies: + '@commitlint/types': 21.2.0 + es-toolkit: 1.52.0 + + '@commitlint/execute-rule@21.0.1': {} + + '@commitlint/format@21.2.2': + dependencies: + '@commitlint/types': 21.2.0 + picocolors: 1.1.1 + + '@commitlint/is-ignored@21.2.2': + dependencies: + '@commitlint/types': 21.2.0 + semver: 7.7.3 + + '@commitlint/lint@21.2.2': + dependencies: + '@commitlint/is-ignored': 21.2.2 + '@commitlint/parse': 21.2.2 + '@commitlint/rules': 21.2.2 + '@commitlint/types': 21.2.0 + + '@commitlint/load@21.2.2(@types/node@24.10.4)(typescript@5.9.3)': + dependencies: + '@commitlint/config-validator': 21.2.0 + '@commitlint/execute-rule': 21.0.1 + '@commitlint/resolve-extends': 21.2.2 + '@commitlint/types': 21.2.0 + cosmiconfig: 9.0.2(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.3.0(@types/node@24.10.4)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3) + es-toolkit: 1.52.0 + is-plain-obj: 4.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@21.2.0': {} + + '@commitlint/parse@21.2.2': + dependencies: + '@commitlint/types': 21.2.0 + conventional-changelog-angular: 9.4.0 + conventional-commits-parser: 7.1.2 + + '@commitlint/read@21.2.1(conventional-commits-parser@7.1.2)': + dependencies: + '@commitlint/top-level': 21.2.0 + '@commitlint/types': 21.2.0 + '@conventional-changelog/git-client': 3.1.2(conventional-commits-parser@7.1.2) + tinyexec: 1.3.1 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + + '@commitlint/resolve-extends@21.2.2': + dependencies: + '@commitlint/config-validator': 21.2.0 + '@commitlint/types': 21.2.0 + es-toolkit: 1.52.0 + global-directory: 5.0.0 + resolve-from: 5.0.0 + + '@commitlint/rules@21.2.2': + dependencies: + '@commitlint/ensure': 21.2.0 + '@commitlint/message': 21.2.0 + '@commitlint/to-lines': 21.0.1 + '@commitlint/types': 21.2.0 + + '@commitlint/to-lines@21.0.1': {} + + '@commitlint/top-level@21.2.0': + dependencies: + escalade: 3.2.0 + + '@commitlint/types@21.2.0': + dependencies: + conventional-commits-parser: 7.1.2 + picocolors: 1.1.1 + + '@conventional-changelog/git-client@3.1.2(conventional-commits-parser@7.1.2)': + dependencies: + '@simple-libs/child-process-utils': 2.0.0 + '@simple-libs/stream-utils': 2.0.0 + semver: 7.7.3 + optionalDependencies: + conventional-commits-parser: 7.1.2 + + '@conventional-changelog/template@1.4.0': {} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -1692,6 +2735,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.54.0': optional: true + '@simple-libs/child-process-utils@2.0.0': + dependencies: + '@simple-libs/stream-utils': 2.0.0 + + '@simple-libs/stream-utils@2.0.0': {} + '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 @@ -1753,12 +2802,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) '@tsconfig/node10@1.0.12': {} @@ -1789,6 +2838,13 @@ snapshots: dependencies: '@babel/types': 7.28.5 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} @@ -1896,7 +2952,7 @@ snapshots: '@typescript-eslint/types': 8.51.0 eslint-visitor-keys: 4.2.1 - '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2))': + '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -1904,10 +2960,21 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.53 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) transitivePeerDependencies: - supports-color + '@vitest/mocker@5.0.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0))': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.0 + estree-walker: 3.0.3 + magic-string: 1.2.3 + optionalDependencies: + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) + + '@vitest/spy@5.0.0': {} + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -1925,14 +2992,100 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.7 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@6.3.0: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@6.2.3: {} + arg@4.1.3: {} argparse@2.0.1: {} + argue-cli@3.2.0: {} + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + ast-types-flow@0.0.8: {} + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.13.0: {} + + axobject-query@4.1.0: {} + balanced-match@1.0.2: {} baseline-browser-mapping@2.9.11: {} @@ -1954,15 +3107,40 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} caniuse-lite@1.0.30001762: {} + chai@6.2.2: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1971,8 +3149,37 @@ snapshots: concat-map@0.0.1: {} + conventional-changelog-angular@9.4.0: + dependencies: + '@conventional-changelog/template': 1.4.0 + + conventional-changelog-conventionalcommits@10.4.0: + dependencies: + '@conventional-changelog/template': 1.4.0 + + conventional-commits-parser@7.1.2: + dependencies: + '@simple-libs/stream-utils': 2.0.0 + argue-cli: 3.2.0 + convert-source-map@2.0.0: {} + cosmiconfig-typescript-loader@6.3.0(@types/node@24.10.4)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3): + dependencies: + '@types/node': 24.10.4 + cosmiconfig: 9.0.2(typescript@5.9.3) + jiti: 2.6.1 + typescript: 5.9.3 + + cosmiconfig@9.0.2(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + create-require@1.1.1: {} cross-spawn@7.0.6: @@ -1983,23 +3190,190 @@ snapshots: csstype@3.2.3: {} + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + debug@4.4.3: dependencies: ms: 2.1.3 deep-is@0.1.4: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + detect-libc@2.1.2: {} diff@4.0.2: {} + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + electron-to-chromium@1.5.267: {} + emoji-regex@10.6.0: {} + + emoji-regex@9.2.2: {} + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.2 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.22 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.4.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 + + es-module-lexer@2.3.2: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.4 + + es-to-primitive@1.3.4: + dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es-toolkit@1.52.0: {} + esbuild@0.27.2: optionalDependencies: '@esbuild/aix-ppc64': 0.27.2 @@ -2033,6 +3407,29 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.13.0 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.39.2(jiti@2.6.1) + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): dependencies: '@babel/core': 7.28.5 @@ -2048,6 +3445,28 @@ snapshots: dependencies: eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.4.0 + eslint: 9.39.2(jiti@2.6.1) + estraverse: 5.3.0 + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.7 + semver: 6.3.1 + string.prototype.matchall: 4.1.0 + string.prototype.repeat: 1.0.0 + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -2114,18 +3533,30 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} + expect-type@1.4.0: {} + fast-deep-equal@3.1.3: {} fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fast-uri@3.1.7: {} + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -2142,29 +3573,112 @@ snapshots: flatted@3.3.3: {} + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + + function.prototype.name@1.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + es-define-property: 1.0.1 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 + is-callable: 1.2.7 + is-document.all: 1.0.0 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 + global-directory@5.0.0: + dependencies: + ini: 6.0.0 + globals@14.0.0: {} globals@16.5.0: {} + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + graceful-fs@4.2.11: {} + has-bigints@1.1.0: {} + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + hermes-estree@0.25.1: {} hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 + husky@9.1.7: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -2176,14 +3690,141 @@ snapshots: imurmurhash@0.1.4: {} + ini@6.0.0: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-plain-obj@4.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + isexe@2.0.0: {} + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + jiti@2.6.1: {} js-tokens@4.0.0: {} @@ -2196,16 +3837,33 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -2260,12 +3918,26 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + lines-and-columns@1.2.4: {} + + lint-staged@17.5.0: + dependencies: + picomatch: 4.0.7 + string-argv: 0.3.2 + tinyexec: 1.3.1 + optionalDependencies: + yaml: 2.9.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 lodash.merge@4.6.2: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -2274,8 +3946,14 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@1.2.3: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-error@1.3.6: {} + math-intrinsics@1.1.0: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -2290,8 +3968,53 @@ snapshots: natural-compare@1.4.0: {} + node-exports-info@1.6.2: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + node-releases@2.0.27: {} + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + obug@2.1.4: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -2301,6 +4024,13 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -2313,14 +4043,27 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + path-exists@4.0.0: {} path-key@3.1.1: {} + path-parse@1.0.7: {} + picocolors@1.1.1: {} picomatch@4.0.3: {} + picomatch@4.0.7: {} + + possible-typed-array-names@1.1.0: {} + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -2329,6 +4072,14 @@ snapshots: prelude-ls@1.2.1: {} + prettier@3.9.6: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + punycode@2.3.1: {} react-dom@19.2.3(react@19.2.3): @@ -2336,12 +4087,47 @@ snapshots: react: 19.2.3 scheduler: 0.27.0 + react-is@16.13.1: {} + react-refresh@0.18.0: {} react@19.2.3: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + require-from-string@2.0.2: {} + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.2 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + rollup@4.54.0: dependencies: '@types/estree': 1.0.8 @@ -2370,35 +4156,196 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.54.0 fsevents: 2.3.3 + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + scheduler@0.27.0: {} semver@6.3.1: {} semver@7.7.3: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + source-map-js@1.2.1: {} + stackback@0.0.2: {} + + std-env@4.2.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-argv@0.3.2: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string-width@8.2.2: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.matchall@4.1.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.1 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + strip-json-comments@3.1.1: {} supports-color@7.2.0: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + tailwindcss@4.1.18: {} tapable@2.3.0: {} + tinybench@6.1.4: {} + + tinyexec@1.3.0: {} + + tinyexec@1.3.1: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + ts-api-utils@2.3.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -2425,6 +4372,39 @@ snapshots: dependencies: prelude-ls: 1.2.1 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typescript-eslint@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.51.0(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -2438,6 +4418,13 @@ snapshots: typescript@5.9.3: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + undici-types@7.16.0: {} update-browserslist-db@1.2.3(browserslist@4.28.1): @@ -2452,7 +4439,7 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2): + vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -2465,15 +4452,105 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 + yaml: 2.9.0 + + vitest@5.0.0(@types/node@24.10.4)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)): + dependencies: + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)) + chai: 6.2.2 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 1.2.3 + obug: 2.1.4 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 6.1.4 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.10.4 + transitivePeerDependencies: + - msw + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.2.0 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.22 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.22: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 which@2.0.2: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + y18n@5.0.8: {} + yallist@3.1.1: {} + yaml@2.9.0: + optional: true + + yargs-parser@22.0.0: {} + + yargs@18.1.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.2.2 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..5ed0b5a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +allowBuilds: + esbuild: true diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..59db5b6 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/vite.svg b/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scripts/generateVenue.ts b/scripts/generateVenue.ts index 3e93571..0a0265f 100644 --- a/scripts/generateVenue.ts +++ b/scripts/generateVenue.ts @@ -1,4 +1,4 @@ -import fs from "fs"; +import fs from 'fs'; const MAP_WIDTH = 2400; const MAP_HEIGHT = 2400; @@ -13,52 +13,45 @@ const CENTER_Y = MAP_HEIGHT / 2; let seatCounter = 1; const sections = Array.from({ length: SECTIONS }, (_, sectionIndex) => { - const startAngle = (2 * Math.PI * sectionIndex) / SECTIONS; - const endAngle = (2 * Math.PI * (sectionIndex + 1)) / SECTIONS; - - return { - id: `S-${sectionIndex + 1}`, - label: `Section ${sectionIndex + 1}`, - transform: { x: 0, y: 0, scale: 1 }, - rows: Array.from({ length: ROWS_PER_SECTION }, (_, rowIndex) => { - const radius = 300 + rowIndex * 12; - - return { - index: rowIndex + 1, - seats: Array.from({ length: SEATS_PER_ROW }, (_, seatIndex) => { - const angle = - startAngle + - ((endAngle - startAngle) * seatIndex) / SEATS_PER_ROW; - - const x = Math.round(CENTER_X + Math.cos(angle) * radius); - const y = Math.round(CENTER_Y + Math.sin(angle) * radius); - - return { - id: `SEAT-${seatCounter++}`, - col: seatIndex + 1, - x, - y, - priceTier: - rowIndex < 5 ? 1 : rowIndex < 15 ? 2 : 3, - status: "available" - }; - }) - }; - }) - }; + const startAngle = (2 * Math.PI * sectionIndex) / SECTIONS; + const endAngle = (2 * Math.PI * (sectionIndex + 1)) / SECTIONS; + + return { + id: `S-${sectionIndex + 1}`, + label: `Section ${sectionIndex + 1}`, + transform: { x: 0, y: 0, scale: 1 }, + rows: Array.from({ length: ROWS_PER_SECTION }, (_, rowIndex) => { + const radius = 300 + rowIndex * 12; + + return { + index: rowIndex + 1, + seats: Array.from({ length: SEATS_PER_ROW }, (_, seatIndex) => { + const angle = startAngle + ((endAngle - startAngle) * seatIndex) / SEATS_PER_ROW; + + const x = Math.round(CENTER_X + Math.cos(angle) * radius); + const y = Math.round(CENTER_Y + Math.sin(angle) * radius); + + return { + id: `SEAT-${seatCounter++}`, + col: seatIndex + 1, + x, + y, + priceTier: rowIndex < 5 ? 1 : rowIndex < 15 ? 2 : 3, + status: 'available', + }; + }), + }; + }), + }; }); const venue = { - venueId: "mega-arena", - name: "Metropolis Mega Arena", - map: { width: MAP_WIDTH, height: MAP_HEIGHT }, - sections + venueId: 'mega-arena', + name: 'Metropolis Mega Arena', + map: { width: MAP_WIDTH, height: MAP_HEIGHT }, + sections, }; -fs.writeFileSync( - "public/venue.json", - JSON.stringify(venue, null, 2) -); - -console.log("seats generated") +fs.writeFileSync('public/venue.json', JSON.stringify(venue, null, 2)); +console.log('seats generated'); diff --git a/src/App.tsx b/src/App.tsx index 4099bae..147e8ae 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,11 +1,11 @@ -import VenueMap from "./components/VenueMap" -import { useVenue } from "./hooks/useVenue" -import BookingSummary from "./components/BookingSummary" -import { useEffect, useState, useRef } from "react" -import { useVenueStore } from "./store/seatStore" +import VenueMap from './components/VenueMap'; +import { useVenue } from './hooks/useVenue'; +import BookingSummary from './components/BookingSummary'; +import { useEffect, useState, useRef } from 'react'; +import { useVenueStore } from './store/seatStore'; const App = () => { - const { venue, error, loading } = useVenue() + const { venue, error, loading } = useVenue(); const zoom = useVenueStore((s) => s.zoom); const setZoom = useVenueStore((s) => s.setZoom); const selectedSeatsCount = useVenueStore((s) => s.selectedSeats.size); @@ -28,7 +28,7 @@ const App = () => { for (const section of venue.sections) { for (const row of section.rows) { - if (row.seats.some(s => s.id === firstSeatId)) { + if (row.seats.some((s) => s.id === firstSeatId)) { sectionToOpen = section.id; break; } @@ -80,13 +80,14 @@ const App = () => { setIsDragging(false); }; - if (loading) return ( -
-
-
- ); - if (error) return
Error: {error}
- if (!venue) return
No venue data
+ if (loading) + return ( +
+
+
+ ); + if (error) return
Error: {error}
; + if (!venue) return
No venue data
; return (
@@ -95,24 +96,36 @@ const App = () => { className="md:hidden fixed top-4 left-4 z-[60] bg-blue-600 text-white px-4 py-2 rounded-full shadow-lg font-bold text-sm flex items-center gap-2" > - + Booking ({selectedSeatsCount}) -
+ `} + >
@@ -120,12 +133,15 @@ const App = () => {
{showSidebar && ( -
setShowSidebar(false)} /> )} + {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- mouse-drag panning is a progressive enhancement over native scroll; seats remain keyboard-navigable */}
{ className="cursor-pointer bg-white hover:bg-gray-50 text-gray-700 p-2 md:p-3 rounded-full shadow-lg border border-gray-200 transition-colors" title="Zoom In" > - + + + +
- ) -} + ); +}; -export default App \ No newline at end of file +export default App; diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/BookingSummary.tsx b/src/components/BookingSummary.tsx index 0cd1d1f..a0ab0a4 100644 --- a/src/components/BookingSummary.tsx +++ b/src/components/BookingSummary.tsx @@ -1,148 +1,159 @@ -import { useVenueStore } from "../store/seatStore"; -import type { Venue } from "../interfaces/venue.interfaces"; -import { useMemo } from "react"; +import { useVenueStore } from '../store/seatStore'; +import type { Venue } from '../interfaces/venue.interfaces'; +import { useMemo } from 'react'; interface BookingSummaryProps { - venue: Venue; + venue: Venue; } export default function BookingSummary({ venue }: BookingSummaryProps) { - const selectedSeats = useVenueStore((s) => s.selectedSeats); - const clearSelection = useVenueStore((s) => s.clearSelection); + const selectedSeats = useVenueStore((s) => s.selectedSeats); + const clearSelection = useVenueStore((s) => s.clearSelection); + // Get selected seat details + const selectedSeatDetails = useMemo(() => { + const details: { id: string; label: string; price: number; tier: number }[] = []; + if (selectedSeats.size === 0) return details; - // Get selected seat details - const selectedSeatDetails = useMemo(() => { - const details: { id: string; label: string; price: number; tier: number }[] = []; - if (selectedSeats.size === 0) return details; + const tierPrices: Record = { + 1: 7000, + 2: 3000, + 3: 1500, + }; - const tierPrices: Record = { - 1: 7000, - 2: 3000, - 3: 1500, - }; - - venue.sections.forEach(section => { - section.rows.forEach(row => { - row.seats.forEach(seat => { - if (selectedSeats.has(seat.id)) { - details.push({ - id: seat.id, - label: `${section.label} | Row ${row.index} | Seat ${seat.col}`, - price: tierPrices[seat.priceTier] || 50, - tier: seat.priceTier - }); - } - }); + venue.sections.forEach((section) => { + section.rows.forEach((row) => { + row.seats.forEach((seat) => { + if (selectedSeats.has(seat.id)) { + details.push({ + id: seat.id, + label: `${section.label} | Row ${row.index} | Seat ${seat.col}`, + price: tierPrices[seat.priceTier] || 50, + tier: seat.priceTier, }); + } }); - return details; - }, [venue, selectedSeats]); - - const total = selectedSeatDetails.reduce((sum, item) => sum + item.price, 0); + }); + }); + return details; + }, [venue, selectedSeats]); - return ( -
-
-

- {venue?.name} -

-
+ const total = selectedSeatDetails.reduce((sum, item) => sum + item.price, 0); -
+ return ( +
+
+

+ {venue?.name} +

+
-
-

Price Tiers

-
-
-
-
- Tier 1 -
- 7000$ -
-
-
-
- Tier 2 -
- 3000$ -
-
-
-
- Tier 3 -
- 1500$ -
-
- -

Seat Status

-
-
-
- Selected -
-
-
- Sold -
-
-
- Reserved -
-
-
- Held -
-
-
+
+
+

+ Price Tiers +

+
+
+
+
+ Tier 1 +
+ 7000$ +
+
+
+
+ Tier 2 +
+ 3000$ +
+
+
+
+ Tier 3 +
+ 1500$ +
+
-
-

- Selected Seats ({selectedSeats.size}/8) - {selectedSeats.size > 0 && ( - - )} -

+

+ Seat Status +

+
+
+
+ Selected +
+
+
+ Sold +
+
+
+ Reserved +
+
+
+ Held +
+
+
- {selectedSeats.size === 0 ? ( -
-

Select seats from the map

-
- ) : ( -
- {selectedSeatDetails.map((item) => ( -
-
-

{item.label}

-

Standard Ticket

-
- {item.price} -
- ))} -
- )} -
+
+

+ Selected Seats ({selectedSeats.size}/8) + {selectedSeats.size > 0 && ( + + )} +

-
-
- Total Amount - {total}$ -
- + {selectedSeats.size === 0 ? ( +
+

Select seats from the map

+
+ ) : ( +
+ {selectedSeatDetails.map((item) => ( +
+
+

{item.label}

+

Standard Ticket

+
+ {item.price}
+ ))}
+ )} +
+ +
+
+ Total Amount + {total}$ +
+
- ); +
+
+ ); } diff --git a/src/components/Seat.tsx b/src/components/Seat.tsx index 406d136..00ac364 100644 --- a/src/components/Seat.tsx +++ b/src/components/Seat.tsx @@ -1,142 +1,157 @@ -import { memo } from "react"; -import type { ISeat, Row } from "../interfaces/venue.interfaces"; -import { useVenueStore } from "../store/seatStore"; +import { memo } from 'react'; +import type { ISeat, Row } from '../interfaces/venue.interfaces'; +import { useVenueStore } from '../store/seatStore'; interface SeatsProps { - rows: Row[]; + rows: Row[]; } const Seats = memo(function Seats({ rows }: SeatsProps) { - const selectedSeats = useVenueStore((s) => s.selectedSeats); - const toggleSeat = useVenueStore((s) => s.toggleSeat); - - const handleInteraction = (e: React.MouseEvent | React.KeyboardEvent, seat: ISeat, isUnavailable: boolean) => { - e.stopPropagation(); - if (!isUnavailable) { - toggleSeat(seat.id); - const target = e.currentTarget || document.getElementById(`seat-${seat.id}`); - if (target && typeof (target as HTMLElement).focus === 'function') { - (target as HTMLElement).focus(); + const selectedSeats = useVenueStore((s) => s.selectedSeats); + const toggleSeat = useVenueStore((s) => s.toggleSeat); + + const handleInteraction = ( + e: React.MouseEvent | React.KeyboardEvent, + seat: ISeat, + isUnavailable: boolean, + ) => { + e.stopPropagation(); + if (!isUnavailable) { + toggleSeat(seat.id); + const target = e.currentTarget || document.getElementById(`seat-${seat.id}`); + if (target && typeof (target as HTMLElement).focus === 'function') { + (target as HTMLElement).focus(); + } + } + }; + + const handleKeyDown = ( + e: React.KeyboardEvent, + seat: ISeat, + rowIndex: number, + seatIndex: number, + isUnavailable: boolean, + ) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + handleInteraction(e, seat, isUnavailable); + return; + } + + if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) { + e.preventDefault(); + let nextRowIdx = rowIndex; + let nextSeatIdx = seatIndex; + + if (e.key === 'ArrowRight') nextSeatIdx++; + if (e.key === 'ArrowLeft') nextSeatIdx--; + if (e.key === 'ArrowUp') nextRowIdx++; + if (e.key === 'ArrowDown') nextRowIdx--; + + if (nextRowIdx >= 0 && nextRowIdx < rows.length) { + const targetRowSeats = rows[nextRowIdx]?.seats; + const firstSeat = targetRowSeats?.[0]; + if (!targetRowSeats || !firstSeat) return; + + if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { + let closest = firstSeat; + let minDiff = Math.abs(closest.x - seat.x); + + targetRowSeats.forEach((s) => { + const diff = Math.abs(s.x - seat.x); + if (diff < minDiff) { + minDiff = diff; + closest = s; } - } - }; - - const handleKeyDown = (e: React.KeyboardEvent, seat: ISeat, rowIndex: number, seatIndex: number, isUnavailable: boolean) => { - if (e.key === "Enter" || e.key === " ") { - e.preventDefault(); - handleInteraction(e, seat, isUnavailable); - return; - } - - if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) { - e.preventDefault(); - let nextRowIdx = rowIndex; - let nextSeatIdx = seatIndex; - - if (e.key === "ArrowRight") nextSeatIdx++; - if (e.key === "ArrowLeft") nextSeatIdx--; - if (e.key === "ArrowUp") nextRowIdx++; - if (e.key === "ArrowDown") nextRowIdx--; - - if (nextRowIdx >= 0 && nextRowIdx < rows.length) { - const targetRowSeats = rows[nextRowIdx].seats; - - if (e.key === "ArrowUp" || e.key === "ArrowDown") { - let closest = targetRowSeats[0]; - let minDiff = Math.abs(closest.x - seat.x); - - targetRowSeats.forEach((s) => { - const diff = Math.abs(s.x - seat.x); - if (diff < minDiff) { - minDiff = diff; - closest = s; - } - }); - document.getElementById(`seat-${closest.id}`)?.focus(); - } else { - const currentRow = rows[rowIndex]; - if (nextSeatIdx >= 0 && nextSeatIdx < currentRow.seats.length) { - const targetSeat = currentRow.seats[nextSeatIdx]; - document.getElementById(`seat-${targetSeat.id}`)?.focus(); - } - } + }); + document.getElementById(`seat-${closest.id}`)?.focus(); + } else { + const currentRow = rows[rowIndex]; + if (currentRow && nextSeatIdx >= 0 && nextSeatIdx < currentRow.seats.length) { + const targetSeat = currentRow.seats[nextSeatIdx]; + if (targetSeat) { + document.getElementById(`seat-${targetSeat.id}`)?.focus(); } + } } - }; - - - return ( - <> - {rows.map((row, rowIndex) => - row.seats.map((seat, seatIndex) => { - const isSelected = selectedSeats.has(seat.id); - const isSold = seat.status === "sold"; - const isReserved = seat.status === "reserved"; - const isHeld = seat.status === "held"; - const isUnavailable = isSold || isReserved || isHeld; - - let fill = "white"; - let stroke = "#059669"; - - const tierColors: Record = { - 1: "#eab308", - 2: "#6b7280", - 3: "#f97316", - }; - - if (isSold) { - fill = "#d1d5db"; - stroke = "none"; - } else if (isReserved) { - fill = "#fbbf24"; - stroke = "none"; - } else if (isHeld) { - fill = "#f87171"; - stroke = "none"; - } else if (isSelected) { - fill = "#10b981"; - stroke = "none"; - } else { - stroke = tierColors[seat.priceTier] || "#059669"; - } - - const label = `Row ${row.index} Seat ${seat.col}, Price $${seat.priceTier}, ${seat.status}`; - - return ( - handleInteraction(e, seat, isUnavailable)} - onKeyDown={(e) => handleKeyDown(e, seat, rowIndex, seatIndex, isUnavailable)} - role="checkbox" - aria-checked={isSelected} - aria-label={label} - aria-disabled={isUnavailable} - tabIndex={isUnavailable ? -1 : 0} - className="focus:outline-none group" - > - - - ); - }) - )} - - ); + } + } + }; + + return ( + <> + {rows.map((row, rowIndex) => + row.seats.map((seat, seatIndex) => { + const isSelected = selectedSeats.has(seat.id); + const isSold = seat.status === 'sold'; + const isReserved = seat.status === 'reserved'; + const isHeld = seat.status === 'held'; + const isUnavailable = isSold || isReserved || isHeld; + + let fill = 'white'; + let stroke = '#059669'; + + const tierColors: Record = { + 1: '#eab308', + 2: '#6b7280', + 3: '#f97316', + }; + + if (isSold) { + fill = '#d1d5db'; + stroke = 'none'; + } else if (isReserved) { + fill = '#fbbf24'; + stroke = 'none'; + } else if (isHeld) { + fill = '#f87171'; + stroke = 'none'; + } else if (isSelected) { + fill = '#10b981'; + stroke = 'none'; + } else { + stroke = tierColors[seat.priceTier] || '#059669'; + } + + const label = `Row ${row.index} Seat ${seat.col}, Price $${seat.priceTier}, ${seat.status}`; + + return ( + handleInteraction(e, seat, isUnavailable)} + onKeyDown={(e) => handleKeyDown(e, seat, rowIndex, seatIndex, isUnavailable)} + role="checkbox" + aria-checked={isSelected} + aria-label={label} + aria-disabled={isUnavailable} + tabIndex={isUnavailable ? -1 : 0} + className="focus:outline-none group" + > + + + ); + }), + )} + + ); }); export default Seats; diff --git a/src/components/Section.tsx b/src/components/Section.tsx index ab68bce..4019117 100644 --- a/src/components/Section.tsx +++ b/src/components/Section.tsx @@ -1,154 +1,156 @@ -import { memo, useMemo, useEffect } from "react"; -import { useVenueStore } from "../store/seatStore"; -import type { Section } from "../interfaces/venue.interfaces"; -import Seats from "./Seat"; +import { memo, useMemo, useEffect } from 'react'; +import { useVenueStore } from '../store/seatStore'; +import type { Section } from '../interfaces/venue.interfaces'; +import Seats from './Seat'; function Section({ section }: { section: Section }) { - const activeSectionId = useVenueStore( - (s) => s.activeSectionId - ); - const setZoom = useVenueStore((s) => s.setZoom); - const setActiveSection = useVenueStore((s) => s.setActiveSection); - - const isActive = activeSectionId === section.id; - - useEffect(() => { - if (isActive) { - let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; - section.rows.forEach(row => { - row.seats.forEach(seat => { - minX = Math.min(minX, seat.x); - minY = Math.min(minY, seat.y); - maxX = Math.max(maxX, seat.x); - maxY = Math.max(maxY, seat.y); - }); - }); - - const centerX = (minX + maxX) / 2; - const centerY = (minY + maxY) / 2; - - const timer = setTimeout(() => { - const mapContainer = document.querySelector('main.overflow-auto'); - if (mapContainer) { - const currentZoom = useVenueStore.getState().zoom; - const scrollX = (centerX * currentZoom) - (mapContainer.clientWidth / 2); - const scrollY = (centerY * currentZoom) - (mapContainer.clientHeight / 2); - - mapContainer.scrollTo({ - left: Math.max(0, scrollX), - top: Math.max(0, scrollY), - behavior: 'smooth' - }); - } - }, 150); - return () => clearTimeout(timer); + const activeSectionId = useVenueStore((s) => s.activeSectionId); + const setZoom = useVenueStore((s) => s.setZoom); + const setActiveSection = useVenueStore((s) => s.setActiveSection); + + const isActive = activeSectionId === section.id; + + useEffect(() => { + if (isActive) { + let minX = Infinity, + minY = Infinity, + maxX = -Infinity, + maxY = -Infinity; + section.rows.forEach((row) => { + row.seats.forEach((seat) => { + minX = Math.min(minX, seat.x); + minY = Math.min(minY, seat.y); + maxX = Math.max(maxX, seat.x); + maxY = Math.max(maxY, seat.y); + }); + }); + + const centerX = (minX + maxX) / 2; + const centerY = (minY + maxY) / 2; + + const timer = setTimeout(() => { + const mapContainer = document.querySelector('main.overflow-auto'); + if (mapContainer) { + const currentZoom = useVenueStore.getState().zoom; + const scrollX = centerX * currentZoom - mapContainer.clientWidth / 2; + const scrollY = centerY * currentZoom - mapContainer.clientHeight / 2; + + mapContainer.scrollTo({ + left: Math.max(0, scrollX), + top: Math.max(0, scrollY), + behavior: 'smooth', + }); } - }, [isActive, section]); - - const coverPath = useMemo(() => { - if (!section.rows.length) return ""; - - const firstRow = section.rows[0]; - const lastRow = section.rows[section.rows.length - 1]; - - let d = `M ${firstRow.seats[0].x} ${firstRow.seats[0].y}`; - - for (let i = 1; i < firstRow.seats.length; i++) { - d += ` L ${firstRow.seats[i].x} ${firstRow.seats[i].y}`; - } - - for (let i = lastRow.seats.length - 1; i >= 0; i--) { - d += ` L ${lastRow.seats[i].x} ${lastRow.seats[i].y}`; - } - - d += " Z"; - return d; - }, [section]); - - const { labelPos, explodeOffset } = useMemo(() => { - if (!section.rows.length) return { labelPos: { x: 0, y: 0 }, explodeOffset: { x: 0, y: 0 } }; - - const firstRowMid = section.rows[0].seats[Math.floor(section.rows[0].seats.length / 2)]; - const lastRowMid = section.rows[section.rows.length - 1].seats[Math.floor(section.rows[section.rows.length - 1].seats.length / 2)]; - - const centerX = (firstRowMid.x + lastRowMid.x) / 2; - const centerY = (firstRowMid.y + lastRowMid.y) / 2; - const labelPosition = { x: centerX, y: centerY }; - - const venueCenterX = 1200; - const venueCenterY = 1200; - const dx = centerX - venueCenterX; - const dy = centerY - venueCenterY; - const dist = Math.sqrt(dx * dx + dy * dy); - - const gap = 40; - let offX = 0; - let offY = 0; - - if (dist > 0) { - offX = (dx / dist) * gap; - offY = (dy / dist) * gap; - } - - return { - labelPos: labelPosition, - explodeOffset: { x: offX, y: offY } - }; - }, [section]); - - return ( - { - e.stopPropagation(); - const newActiveId = isActive ? null : section.id; - setActiveSection(newActiveId); - if (newActiveId) setZoom(1.5); - }} - style={{ cursor: "pointer" }} - transform={`translate(${explodeOffset.x} ${explodeOffset.y})`} - > - {isActive ? ( - <> - e.stopPropagation()} - style={{ cursor: "default" }} - /> - - - ) : ( - - - - - - {section.label} - - - - )} + }, 150); + return () => clearTimeout(timer); + } + }, [isActive, section]); + + const coverPath = useMemo(() => { + const firstRow = section.rows[0]; + const lastRow = section.rows[section.rows.length - 1]; + const firstSeat = firstRow?.seats[0]; + if (!firstRow || !lastRow || !firstSeat) return ''; + + let d = `M ${firstSeat.x} ${firstSeat.y}`; + + for (let i = 1; i < firstRow.seats.length; i++) { + const s = firstRow.seats[i]; + if (s) d += ` L ${s.x} ${s.y}`; + } + + for (let i = lastRow.seats.length - 1; i >= 0; i--) { + const s = lastRow.seats[i]; + if (s) d += ` L ${s.x} ${s.y}`; + } + + d += ' Z'; + return d; + }, [section]); + + const { labelPos, explodeOffset } = useMemo(() => { + const emptyResult = { labelPos: { x: 0, y: 0 }, explodeOffset: { x: 0, y: 0 } }; + + const firstRow = section.rows[0]; + const lastRow = section.rows[section.rows.length - 1]; + if (!firstRow || !lastRow) return emptyResult; + + const firstRowMid = firstRow.seats[Math.floor(firstRow.seats.length / 2)]; + const lastRowMid = lastRow.seats[Math.floor(lastRow.seats.length / 2)]; + if (!firstRowMid || !lastRowMid) return emptyResult; + + const centerX = (firstRowMid.x + lastRowMid.x) / 2; + const centerY = (firstRowMid.y + lastRowMid.y) / 2; + const labelPosition = { x: centerX, y: centerY }; + + const venueCenterX = 1200; + const venueCenterY = 1200; + const dx = centerX - venueCenterX; + const dy = centerY - venueCenterY; + const dist = Math.sqrt(dx * dx + dy * dy); + + const gap = 40; + let offX = 0; + let offY = 0; + + if (dist > 0) { + offX = (dx / dist) * gap; + offY = (dy / dist) * gap; + } + + return { + labelPos: labelPosition, + explodeOffset: { x: offX, y: offY }, + }; + }, [section]); + + return ( + { + e.stopPropagation(); + const newActiveId = isActive ? null : section.id; + setActiveSection(newActiveId); + if (newActiveId) setZoom(1.5); + }} + style={{ cursor: 'pointer' }} + transform={`translate(${explodeOffset.x} ${explodeOffset.y})`} + > + {isActive ? ( + <> + e.stopPropagation()} + style={{ cursor: 'default' }} + /> + + + ) : ( + + + + + + {section.label} + - ); + )} + + ); } export default memo(Section); diff --git a/src/components/SectionSkeleton.tsx b/src/components/SectionSkeleton.tsx index 8096620..59f97ea 100644 --- a/src/components/SectionSkeleton.tsx +++ b/src/components/SectionSkeleton.tsx @@ -1,27 +1,27 @@ -import { memo } from "react"; -import type { Row } from "../interfaces/venue.interfaces"; +import { memo } from 'react'; +import type { Row } from '../interfaces/venue.interfaces'; function SectionSkeleton({ rows }: { rows: Row[] }) { - return ( - <> - {rows.map((row, rowIndex) => - row.seats - .filter((_, i) => i % 6 === 0) - .map((seat, seatIndex) => ( - - )) - )} - - ); + return ( + <> + {rows.map((row, rowIndex) => + row.seats + .filter((_, i) => i % 6 === 0) + .map((seat, seatIndex) => ( + + )), + )} + + ); } export default memo(SectionSkeleton); diff --git a/src/components/Stage.tsx b/src/components/Stage.tsx index 89d453f..3f50f24 100644 --- a/src/components/Stage.tsx +++ b/src/components/Stage.tsx @@ -1,21 +1,8 @@ export const Stage = () => ( - - - - STAGE - - + + + + STAGE + + ); diff --git a/src/components/VenueMap.tsx b/src/components/VenueMap.tsx index b8e836b..d9976fa 100644 --- a/src/components/VenueMap.tsx +++ b/src/components/VenueMap.tsx @@ -1,47 +1,56 @@ -import type { Venue } from "../interfaces/venue.interfaces"; -import Section from "./Section"; -import { useVenueStore } from "../store/seatStore"; +import type { Venue } from '../interfaces/venue.interfaces'; +import Section from './Section'; +import { useVenueStore } from '../store/seatStore'; export default function VenueMap({ venue, zoom = 1 }: { venue: Venue; zoom?: number }) { - return ( - { - useVenueStore.getState().setActiveSection(null); - }} - > - - - + return ( + { + useVenueStore.getState().setActiveSection(null); + }} + > + + + - STAGE - + + STAGE + + - {venue.sections.map((section) => ( -
- ))} -
- ); + {venue.sections.map((section) => ( +
+ ))} + + ); } diff --git a/src/hooks/useVenue.ts b/src/hooks/useVenue.ts index 84a4aee..269c99e 100644 --- a/src/hooks/useVenue.ts +++ b/src/hooks/useVenue.ts @@ -1,26 +1,34 @@ -import { useEffect, useState } from "react"; -import type { Venue } from "../interfaces/venue.interfaces"; +import { useEffect, useState } from 'react'; +import type { Venue } from '../interfaces/venue.interfaces'; export function useVenue() { - const [venue, setVenue] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); + const [venue, setVenue] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); - useEffect(() => { - fetchVenue(); - }, []); + useEffect(() => { + let cancelled = false; const fetchVenue = async () => { - try { - const response = await fetch('/venue.json'); - const data = await response.json(); - setVenue(data); - setLoading(false); - } catch (error) { - setError('Failed to load venue data'); - setLoading(false); - } + try { + const response = await fetch('/venue.json'); + const data = (await response.json()) as Venue; + if (cancelled) return; + setVenue(data); + setLoading(false); + } catch { + if (cancelled) return; + setError('Failed to load venue data'); + setLoading(false); + } }; - return { venue, loading, error }; -} \ No newline at end of file + void fetchVenue(); + + return () => { + cancelled = true; + }; + }, []); + + return { venue, loading, error }; +} diff --git a/src/index.css b/src/index.css index a461c50..d4b5078 100644 --- a/src/index.css +++ b/src/index.css @@ -1 +1 @@ -@import "tailwindcss"; \ No newline at end of file +@import 'tailwindcss'; diff --git a/src/interfaces/venue.interfaces.ts b/src/interfaces/venue.interfaces.ts index f9d6e8c..50b3e94 100644 --- a/src/interfaces/venue.interfaces.ts +++ b/src/interfaces/venue.interfaces.ts @@ -1,35 +1,35 @@ -export type SeatStatus = "available" | "reserved" | "sold" | "held"; +export type SeatStatus = 'available' | 'reserved' | 'sold' | 'held'; export interface ISeat { - id: string; - col: number; - x: number; - y: number; - priceTier: number; - status: SeatStatus; + id: string; + col: number; + x: number; + y: number; + priceTier: number; + status: SeatStatus; } export interface Row { - index: number; - seats: ISeat[]; + index: number; + seats: ISeat[]; } export interface Section { - id: string; - label: string; - transform: { - x: number; - y: number; - scale: number; - }; - rows: Row[]; + id: string; + label: string; + transform: { + x: number; + y: number; + scale: number; + }; + rows: Row[]; } export interface Venue { - venueId: string; - name: string; - map: { - width: number; - height: number; - }; - sections: Section[]; -} \ No newline at end of file + venueId: string; + name: string; + map: { + width: number; + height: number; + }; + sections: Section[]; +} diff --git a/src/main.tsx b/src/main.tsx index bef5202..2239905 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,10 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import './index.css'; +import App from './App.tsx'; createRoot(document.getElementById('root')!).render( , -) +); diff --git a/src/store/seatStore.ts b/src/store/seatStore.ts index a617483..4f03811 100644 --- a/src/store/seatStore.ts +++ b/src/store/seatStore.ts @@ -1,68 +1,73 @@ -import { create } from "zustand"; -import { persist } from "zustand/middleware"; +import { create } from 'zustand'; +import { persist } from 'zustand/middleware'; +import type { PersistStorage, StorageValue } from 'zustand/middleware'; interface VenueState { - activeSectionId: string | null; - selectedSeats: Set; - zoom: number; - setActiveSection: (id: string | null) => void; - setZoom: (zoom: number) => void; - toggleSeat: (seatId: string) => void; - clearSelection: () => void; + activeSectionId: string | null; + selectedSeats: Set; + zoom: number; + setActiveSection: (id: string | null) => void; + setZoom: (zoom: number) => void; + toggleSeat: (seatId: string) => void; + clearSelection: () => void; } -export const useVenueStore = create()( - persist( - (set) => ({ - activeSectionId: null, - selectedSeats: new Set(), - zoom: 0.4, - setActiveSection: (id) => set({ activeSectionId: id }), - setZoom: (zoom) => set({ zoom }), +type PersistedVenueState = Pick; + +interface SerializedVenueState { + selectedSeats: string[]; +} - toggleSeat: (seatId) => set((state) => { - const newSelected = new Set(state.selectedSeats); - if (newSelected.has(seatId)) { - newSelected.delete(seatId); - } else { - if (newSelected.size >= 8) { - alert("You can select a maximum of 8 seats."); - return state; - } - newSelected.add(seatId); - } - return { selectedSeats: newSelected }; - }), +const venueStorage: PersistStorage = { + getItem: (name) => { + const str = localStorage.getItem(name); + if (!str) return null; + const { state, version } = JSON.parse(str) as StorageValue; + return { + state: { selectedSeats: new Set(state.selectedSeats) }, + ...(version !== undefined && { version }), + }; + }, + setItem: (name, value) => { + const serialized: StorageValue = { + state: { selectedSeats: Array.from(value.state.selectedSeats) }, + ...(value.version !== undefined && { version: value.version }), + }; + localStorage.setItem(name, JSON.stringify(serialized)); + }, + removeItem: (name) => localStorage.removeItem(name), +}; - clearSelection: () => set({ selectedSeats: new Set() }) +export const useVenueStore = create()( + persist( + (set) => ({ + activeSectionId: null, + selectedSeats: new Set(), + zoom: 0.4, + setActiveSection: (id) => set({ activeSectionId: id }), + setZoom: (zoom) => set({ zoom }), + + toggleSeat: (seatId) => + set((state) => { + const newSelected = new Set(state.selectedSeats); + if (newSelected.has(seatId)) { + newSelected.delete(seatId); + } else { + if (newSelected.size >= 8) { + alert('You can select a maximum of 8 seats.'); + return state; + } + newSelected.add(seatId); + } + return { selectedSeats: newSelected }; }), - { - name: "venue-storage", - storage: { - getItem: (name) => { - const str = localStorage.getItem(name); - if (!str) return null; - const { state } = JSON.parse(str); - return { - state: { - ...state, - selectedSeats: new Set(state.selectedSeats || []), - }, - }; - }, - setItem: (name, value) => { - const { state } = value; - const serialized = { - state: { - ...state, - selectedSeats: Array.from(state.selectedSeats || []), - }, - }; - localStorage.setItem(name, JSON.stringify(serialized)); - }, - removeItem: (name) => localStorage.removeItem(name), - }, - partialize: (state) => ({ selectedSeats: state.selectedSeats }), - } - ) + + clearSelection: () => set({ selectedSeats: new Set() }), + }), + { + name: 'venue-storage', + storage: venueStorage, + partialize: (state) => ({ selectedSeats: state.selectedSeats }), + }, + ), ); diff --git a/tsconfig.app.json b/tsconfig.app.json index a9b5a59..8bb5019 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -22,7 +22,9 @@ "noUnusedParameters": true, "erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true + "noUncheckedSideEffectImports": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true }, "include": ["src"] } diff --git a/tsconfig.json b/tsconfig.json index 897259d..9905aae 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,4 +12,4 @@ "strict": true, "noImplicitAny": true } -} \ No newline at end of file +} diff --git a/tsconfig.node.json b/tsconfig.node.json index 8a67f62..36f73f0 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -20,7 +20,9 @@ "noUnusedParameters": true, "erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true + "noUncheckedSideEffectImports": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true }, - "include": ["vite.config.ts"] + "include": ["vite.config.ts", "scripts"] } diff --git a/vite.config.ts b/vite.config.ts index a10811b..6e7f528 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,8 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' -import tailwindcss from '@tailwindcss/vite' +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import tailwindcss from '@tailwindcss/vite'; // https://vite.dev/config/ export default defineConfig({ - plugins: [react(), tailwindcss(),], - -}) + plugins: [react(), tailwindcss()], +}); From 9a0a13efa4d712aa35d74e8826c5e7b28c09e4fa Mon Sep 17 00:00:00 2001 From: Rahul Date: Mon, 7 Sep 2026 16:56:14 +0530 Subject: [PATCH 02/26] chore: update frontend dependencies Bump react, zustand, tailwindcss, vite, eslint, and typescript-eslint to their latest versions within existing semver ranges. Clears all 40 pnpm audit advisories (28 high, 10 moderate, 2 low) that were pinned in the lockfile against older transitive resolutions. --- package.json | 30 +- pnpm-lock.yaml | 1681 +++++++++++++++++++++++++----------------------- 2 files changed, 881 insertions(+), 830 deletions(-) diff --git a/package.json b/package.json index 91f804b..cf83e91 100644 --- a/package.json +++ b/package.json @@ -34,34 +34,34 @@ "generate:venue": "ts-node scripts/generateVenue.ts" }, "dependencies": { - "@tailwindcss/vite": "^4.1.18", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "tailwindcss": "^4.1.18", - "zustand": "^5.0.9" + "@tailwindcss/vite": "^4.3.3", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "tailwindcss": "^4.3.3", + "zustand": "^5.0.15" }, "devDependencies": { "@commitlint/cli": "^21.2.2", "@commitlint/config-conventional": "^21.2.2", - "@eslint/js": "^9.39.1", - "@types/node": "^24.10.1", - "@types/react": "^19.2.5", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^5.1.1", - "eslint": "^9.39.1", + "@eslint/js": "^9.39.5", + "@types/node": "^24.13.3", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", + "@vitejs/plugin-react": "^5.2.0", + "eslint": "^9.39.5", "eslint-config-prettier": "^10.1.8", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.24", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.4.26", "globals": "^16.5.0", "husky": "^9.1.7", "lint-staged": "^17.5.0", "prettier": "^3.9.6", "ts-node": "^10.9.2", "typescript": "~5.9.3", - "typescript-eslint": "^8.46.4", - "vite": "^7.2.4", + "typescript-eslint": "^8.69.0", + "vite": "^7.3.6", "vitest": "^5.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3566842..df90830 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,60 +9,60 @@ importers: .: dependencies: '@tailwindcss/vite': - specifier: ^4.1.18 - version: 4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)) + specifier: ^4.3.3 + version: 4.3.3(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) react: - specifier: ^19.2.0 - version: 19.2.3 + specifier: ^19.2.8 + version: 19.2.8 react-dom: - specifier: ^19.2.0 - version: 19.2.3(react@19.2.3) + specifier: ^19.2.8 + version: 19.2.8(react@19.2.8) tailwindcss: - specifier: ^4.1.18 - version: 4.1.18 + specifier: ^4.3.3 + version: 4.3.3 zustand: - specifier: ^5.0.9 - version: 5.0.9(@types/react@19.2.7)(react@19.2.3) + specifier: ^5.0.15 + version: 5.0.15(@types/react@19.2.18)(react@19.2.8) devDependencies: '@commitlint/cli': specifier: ^21.2.2 - version: 21.2.2(@types/node@24.10.4)(conventional-commits-parser@7.1.2)(typescript@5.9.3) + version: 21.2.2(@types/node@24.13.3)(conventional-commits-parser@7.1.2)(typescript@5.9.3) '@commitlint/config-conventional': specifier: ^21.2.2 version: 21.2.2 '@eslint/js': - specifier: ^9.39.1 - version: 9.39.2 + specifier: ^9.39.5 + version: 9.39.5 '@types/node': - specifier: ^24.10.1 - version: 24.10.4 + specifier: ^24.13.3 + version: 24.13.3 '@types/react': - specifier: ^19.2.5 - version: 19.2.7 + specifier: ^19.2.18 + version: 19.2.18 '@types/react-dom': - specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.7) + specifier: ^19.2.7 + version: 19.2.7(@types/react@19.2.18) '@vitejs/plugin-react': - specifier: ^5.1.1 - version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)) + specifier: ^5.2.0 + version: 5.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) eslint: - specifier: ^9.39.1 - version: 9.39.2(jiti@2.6.1) + specifier: ^9.39.5 + version: 9.39.5(jiti@2.7.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@9.39.2(jiti@2.6.1)) + version: 6.10.2(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react-hooks: - specifier: ^7.0.1 - version: 7.0.1(eslint@9.39.2(jiti@2.6.1)) + specifier: ^7.1.1 + version: 7.1.1(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react-refresh: - specifier: ^0.4.24 - version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) + specifier: ^0.4.26 + version: 0.4.26(eslint@9.39.5(jiti@2.7.0)) globals: specifier: ^16.5.0 version: 16.5.0 @@ -77,103 +77,103 @@ importers: version: 3.9.6 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@24.10.4)(typescript@5.9.3) + version: 10.9.2(@types/node@24.13.3)(typescript@5.9.3) typescript: specifier: ~5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.46.4 - version: 8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.69.0 + version: 8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) vite: - specifier: ^7.2.4 - version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) + specifier: ^7.3.6 + version: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) vitest: specifier: ^5.0.0 - version: 5.0.0(@types/node@24.10.4)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)) + version: 5.0.0(@types/node@24.13.3)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) packages: - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.5': - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@commitlint/cli@21.2.2': @@ -265,164 +265,164 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -431,8 +431,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': @@ -443,12 +443,12 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.7': + resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.2': - resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -459,12 +459,16 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -485,8 +489,8 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -494,127 +498,151 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@rolldown/pluginutils@1.0.0-beta.53': - resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} - '@rollup/rollup-android-arm-eabi@4.54.0': - resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} + '@rollup/rollup-android-arm-eabi@4.63.1': + resolution: {integrity: sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.54.0': - resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} + '@rollup/rollup-android-arm64@4.63.1': + resolution: {integrity: sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.54.0': - resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} + '@rollup/rollup-darwin-arm64@4.63.1': + resolution: {integrity: sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.54.0': - resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} + '@rollup/rollup-darwin-x64@4.63.1': + resolution: {integrity: sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.54.0': - resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} + '@rollup/rollup-freebsd-arm64@4.63.1': + resolution: {integrity: sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.54.0': - resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} + '@rollup/rollup-freebsd-x64@4.63.1': + resolution: {integrity: sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.54.0': - resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.63.1': + resolution: {integrity: sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.54.0': - resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} + '@rollup/rollup-linux-arm-musleabihf@4.63.1': + resolution: {integrity: sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.54.0': - resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} + '@rollup/rollup-linux-arm64-gnu@4.63.1': + resolution: {integrity: sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.54.0': - resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} + '@rollup/rollup-linux-arm64-musl@4.63.1': + resolution: {integrity: sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.54.0': - resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} + '@rollup/rollup-linux-loong64-gnu@4.63.1': + resolution: {integrity: sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.54.0': - resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} + '@rollup/rollup-linux-loong64-musl@4.63.1': + resolution: {integrity: sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.63.1': + resolution: {integrity: sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.54.0': - resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} + '@rollup/rollup-linux-ppc64-musl@4.63.1': + resolution: {integrity: sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.63.1': + resolution: {integrity: sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.54.0': - resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} + '@rollup/rollup-linux-riscv64-musl@4.63.1': + resolution: {integrity: sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.54.0': - resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} + '@rollup/rollup-linux-s390x-gnu@4.63.1': + resolution: {integrity: sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.54.0': - resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} + '@rollup/rollup-linux-x64-gnu@4.63.1': + resolution: {integrity: sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.54.0': - resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} + '@rollup/rollup-linux-x64-musl@4.63.1': + resolution: {integrity: sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openharmony-arm64@4.54.0': - resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} + '@rollup/rollup-openbsd-x64@4.63.1': + resolution: {integrity: sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.63.1': + resolution: {integrity: sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.54.0': - resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} + '@rollup/rollup-win32-arm64-msvc@4.63.1': + resolution: {integrity: sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.54.0': - resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} + '@rollup/rollup-win32-ia32-msvc@4.63.1': + resolution: {integrity: sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.54.0': - resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} + '@rollup/rollup-win32-x64-gnu@4.63.1': + resolution: {integrity: sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.54.0': - resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} + '@rollup/rollup-win32-x64-msvc@4.63.1': + resolution: {integrity: sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==} cpu: [x64] os: [win32] @@ -626,69 +654,69 @@ packages: resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} engines: {node: '>=22'} - '@tailwindcss/node@4.1.18': - resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} - '@tailwindcss/oxide-android-arm64@4.1.18': - resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} + engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.18': - resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} + engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.18': - resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} + engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.18': - resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} + engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': - resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} + engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': - resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': - resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': - resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.1.18': - resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.1.18': - resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -699,29 +727,29 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': - resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': - resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} + engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.18': - resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} + engines: {node: '>= 20'} - '@tailwindcss/vite@4.1.18': - resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} + '@tailwindcss/vite@4.3.3': + resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} peerDependencies: - vite: ^5.2.0 || ^6 || ^7 + vite: ^5.2.0 || ^6 || ^7 || ^8 - '@tsconfig/node10@1.0.12': - resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + '@tsconfig/node10@1.0.13': + resolution: {integrity: sha512-gcLdvR9HO1ZJBypsOGqaP6TFEzb6vIta0KSTLt9NAQ6pXQO3cRgSVyCN6pzYqI9DlJgY71XKO0dpDhCf08b3pg==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -750,87 +778,87 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@24.10.4': - resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} + '@types/node@24.13.3': + resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + '@types/react-dom@19.2.7': + resolution: {integrity: sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.7': - resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} - '@typescript-eslint/eslint-plugin@8.51.0': - resolution: {integrity: sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==} + '@typescript-eslint/eslint-plugin@8.69.0': + resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.51.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^8.69.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.51.0': - resolution: {integrity: sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==} + '@typescript-eslint/parser@8.69.0': + resolution: {integrity: sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.51.0': - resolution: {integrity: sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==} + '@typescript-eslint/project-service@8.69.0': + resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.51.0': - resolution: {integrity: sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==} + '@typescript-eslint/scope-manager@8.69.0': + resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.51.0': - resolution: {integrity: sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==} + '@typescript-eslint/tsconfig-utils@8.69.0': + resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.51.0': - resolution: {integrity: sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==} + '@typescript-eslint/type-utils@8.69.0': + resolution: {integrity: sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.51.0': - resolution: {integrity: sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==} + '@typescript-eslint/types@8.69.0': + resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.51.0': - resolution: {integrity: sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==} + '@typescript-eslint/typescript-estree@8.69.0': + resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.51.0': - resolution: {integrity: sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==} + '@typescript-eslint/utils@8.69.0': + resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.51.0': - resolution: {integrity: sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==} + '@typescript-eslint/visitor-keys@8.69.0': + resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-react@5.1.2': - resolution: {integrity: sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==} + '@vitejs/plugin-react@5.2.0': + resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 '@vitest/mocker@5.0.0': resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==} @@ -851,17 +879,17 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -946,18 +974,24 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.9.11: - resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.11.21: + resolution: {integrity: sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==} + engines: {node: '>=6.0.0'} hasBin: true - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.18: + resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.9: + resolution: {integrity: sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -977,8 +1011,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001762: - resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} + caniuse-lite@1.0.30001810: + resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} @@ -1084,8 +1118,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} doctrine@2.1.0: @@ -1096,8 +1130,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + electron-to-chromium@1.5.422: + resolution: {integrity: sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1105,8 +1139,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} env-paths@2.2.1: @@ -1158,8 +1192,8 @@ packages: es-toolkit@1.52.0: resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -1183,11 +1217,11 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@7.0.1: - resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} engines: {node: '>=18'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 eslint-plugin-react-refresh@0.4.26: resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} @@ -1212,8 +1246,12 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.2: - resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@9.39.5: + resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true @@ -1227,8 +1265,8 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1283,8 +1321,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} @@ -1402,8 +1440,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.8: + resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -1543,11 +1581,15 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true jsesc@3.1.0: @@ -1593,78 +1635,78 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + 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.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + 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.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + 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.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + 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.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + 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.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + 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.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + 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.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + 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.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + 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.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + 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.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} lines-and-columns@1.2.4: @@ -1702,18 +1744,18 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1724,8 +1766,9 @@ packages: resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.54: + resolution: {integrity: sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==} + engines: {node: '>=18'} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -1797,10 +1840,6 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - picomatch@4.0.7: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} @@ -1809,8 +1848,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1829,10 +1868,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - react-dom@19.2.3: - resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} peerDependencies: - react: ^19.2.3 + react: ^19.2.8 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -1841,8 +1880,8 @@ packages: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} - react@19.2.3: - resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} engines: {node: '>=0.10.0'} reflect.getprototypeof@1.0.10: @@ -1870,8 +1909,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - rollup@4.54.0: - resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} + rollup@4.63.1: + resolution: {integrity: sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1894,8 +1933,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -2003,11 +2042,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tailwindcss@4.1.18: - resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} tinybench@6.1.4: @@ -2022,16 +2061,12 @@ packages: resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - ts-api-utils@2.3.0: - resolution: {integrity: sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2070,12 +2105,12 @@ packages: resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} - typescript-eslint@8.51.0: - resolution: {integrity: sha512-jh8ZuM5oEh2PSdyQG9YAEM1TCGuWenLSuSUhf/irbVUNW9O5FhbFVONviN2TgMTBnUmyHv7E56rYnfLZK6TkiA==} + typescript-eslint@8.69.0: + resolution: {integrity: sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} @@ -2086,11 +2121,11 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + update-browserslist-db@1.3.2: + resolution: {integrity: sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2101,8 +2136,8 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - vite@7.3.0: - resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -2250,11 +2285,11 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - zod@4.3.0: - resolution: {integrity: sha512-dXOXgs5b9ulOPotwXMEsAUoUPL2glchysY0RTJYVqJ7bU0Y5gqE1k3v19eCWrJsczrbae/Dt9+ajrJbr8Ot4uw==} + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} - zustand@5.0.9: - resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} + zustand@5.0.15: + resolution: {integrity: sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -2273,25 +2308,25 @@ packages: snapshots: - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.5': {} + '@babel/compat-data@7.29.7': {} - '@babel/core@7.28.5': + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -2301,96 +2336,96 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.5': + '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.9 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.27.1': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helpers@7.28.4': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 - '@babel/parser@7.28.5': + '@babel/parser@7.29.8': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.8 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/template@7.27.2': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@babel/traverse@7.28.5': + '@babel/traverse@7.29.8': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.28.5': + '@babel/types@7.29.8': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - '@commitlint/cli@21.2.2(@types/node@24.10.4)(conventional-commits-parser@7.1.2)(typescript@5.9.3)': + '@commitlint/cli@21.2.2(@types/node@24.13.3)(conventional-commits-parser@7.1.2)(typescript@5.9.3)': dependencies: '@commitlint/config-conventional': 21.2.2 '@commitlint/format': 21.2.2 '@commitlint/lint': 21.2.2 - '@commitlint/load': 21.2.2(@types/node@24.10.4)(typescript@5.9.3) + '@commitlint/load': 21.2.2(@types/node@24.13.3)(typescript@5.9.3) '@commitlint/read': 21.2.1(conventional-commits-parser@7.1.2) '@commitlint/types': 21.2.0 tinyexec: 1.3.1 @@ -2426,7 +2461,7 @@ snapshots: '@commitlint/is-ignored@21.2.2': dependencies: '@commitlint/types': 21.2.0 - semver: 7.7.3 + semver: 7.8.5 '@commitlint/lint@21.2.2': dependencies: @@ -2435,14 +2470,14 @@ snapshots: '@commitlint/rules': 21.2.2 '@commitlint/types': 21.2.0 - '@commitlint/load@21.2.2(@types/node@24.10.4)(typescript@5.9.3)': + '@commitlint/load@21.2.2(@types/node@24.13.3)(typescript@5.9.3)': dependencies: '@commitlint/config-validator': 21.2.0 '@commitlint/execute-rule': 21.0.1 '@commitlint/resolve-extends': 21.2.2 '@commitlint/types': 21.2.0 cosmiconfig: 9.0.2(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.3.0(@types/node@24.10.4)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.3.0(@types/node@24.13.3)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3) es-toolkit: 1.52.0 is-plain-obj: 4.1.0 picocolors: 1.1.1 @@ -2498,7 +2533,7 @@ snapshots: dependencies: '@simple-libs/child-process-utils': 2.0.0 '@simple-libs/stream-utils': 2.0.0 - semver: 7.7.3 + semver: 7.8.5 optionalDependencies: conventional-commits-parser: 7.1.2 @@ -2508,96 +2543,96 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@esbuild/aix-ppc64@0.27.2': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm64@0.27.2': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/android-arm@0.27.2': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/android-x64@0.27.2': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.27.2': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.27.2': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.27.2': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.27.2': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.27.2': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-arm@0.27.2': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ia32@0.27.2': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-loong64@0.27.2': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.27.2': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-ppc64@0.27.2': + '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.27.2': + '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/linux-s390x@0.27.2': + '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/linux-x64@0.27.2': + '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.27.2': + '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.27.2': + '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.27.2': + '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.27.2': + '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.27.2': + '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.27.2': + '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.27.2': + '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-ia32@0.27.2': + '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-x64@0.27.2': + '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5(jiti@2.7.0))': dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.5(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -2609,21 +2644,21 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.7': dependencies: - ajv: 6.12.6 + ajv: 6.15.0 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 + js-yaml: 4.3.2 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.2': {} + '@eslint/js@9.39.5': {} '@eslint/object-schema@2.1.7': {} @@ -2632,20 +2667,25 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -2655,84 +2695,96 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.3': {} + + '@rollup/rollup-android-arm-eabi@4.63.1': + optional: true - '@rolldown/pluginutils@1.0.0-beta.53': {} + '@rollup/rollup-android-arm64@4.63.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.63.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.54.0': + '@rollup/rollup-darwin-x64@4.63.1': optional: true - '@rollup/rollup-android-arm64@4.54.0': + '@rollup/rollup-freebsd-arm64@4.63.1': optional: true - '@rollup/rollup-darwin-arm64@4.54.0': + '@rollup/rollup-freebsd-x64@4.63.1': optional: true - '@rollup/rollup-darwin-x64@4.54.0': + '@rollup/rollup-linux-arm-gnueabihf@4.63.1': optional: true - '@rollup/rollup-freebsd-arm64@4.54.0': + '@rollup/rollup-linux-arm-musleabihf@4.63.1': optional: true - '@rollup/rollup-freebsd-x64@4.54.0': + '@rollup/rollup-linux-arm64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + '@rollup/rollup-linux-arm64-musl@4.63.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.54.0': + '@rollup/rollup-linux-loong64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.54.0': + '@rollup/rollup-linux-loong64-musl@4.63.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.54.0': + '@rollup/rollup-linux-ppc64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.54.0': + '@rollup/rollup-linux-ppc64-musl@4.63.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.54.0': + '@rollup/rollup-linux-riscv64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.54.0': + '@rollup/rollup-linux-riscv64-musl@4.63.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.54.0': + '@rollup/rollup-linux-s390x-gnu@4.63.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.54.0': + '@rollup/rollup-linux-x64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.54.0': + '@rollup/rollup-linux-x64-musl@4.63.1': optional: true - '@rollup/rollup-linux-x64-musl@4.54.0': + '@rollup/rollup-openbsd-x64@4.63.1': optional: true - '@rollup/rollup-openharmony-arm64@4.54.0': + '@rollup/rollup-openharmony-arm64@4.63.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.54.0': + '@rollup/rollup-win32-arm64-msvc@4.63.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.54.0': + '@rollup/rollup-win32-ia32-msvc@4.63.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.54.0': + '@rollup/rollup-win32-x64-gnu@4.63.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.54.0': + '@rollup/rollup-win32-x64-msvc@4.63.1': optional: true '@simple-libs/child-process-utils@2.0.0': @@ -2741,75 +2793,75 @@ snapshots: '@simple-libs/stream-utils@2.0.0': {} - '@tailwindcss/node@4.1.18': + '@tailwindcss/node@4.3.3': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.4 - jiti: 2.6.1 - lightningcss: 1.30.2 + enhanced-resolve: 5.24.5 + jiti: 2.7.0 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.18 + tailwindcss: 4.3.3 - '@tailwindcss/oxide-android-arm64@4.1.18': + '@tailwindcss/oxide-android-arm64@4.3.3': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.18': + '@tailwindcss/oxide-darwin-arm64@4.3.3': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.18': + '@tailwindcss/oxide-darwin-x64@4.3.3': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.18': + '@tailwindcss/oxide-freebsd-x64@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.18': + '@tailwindcss/oxide-linux-x64-musl@4.3.3': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.18': + '@tailwindcss/oxide-wasm32-wasi@4.3.3': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': optional: true - '@tailwindcss/oxide@4.1.18': + '@tailwindcss/oxide@4.3.3': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-x64': 4.1.18 - '@tailwindcss/oxide-freebsd-x64': 4.1.18 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-x64-musl': 4.1.18 - '@tailwindcss/oxide-wasm32-wasi': 4.1.18 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - - '@tailwindcss/vite@4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0))': - dependencies: - '@tailwindcss/node': 4.1.18 - '@tailwindcss/oxide': 4.1.18 - tailwindcss: 4.1.18 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) - - '@tsconfig/node10@1.0.12': {} + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 + + '@tailwindcss/vite@4.3.3(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + tailwindcss: 4.3.3 + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + + '@tsconfig/node10@1.0.13': {} '@tsconfig/node12@1.0.11': {} @@ -2819,24 +2871,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.8 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.8 '@types/chai@5.2.3': dependencies: @@ -2845,147 +2897,147 @@ snapshots: '@types/deep-eql@4.0.2': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} - '@types/node@24.10.4': + '@types/node@24.13.3': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.2 - '@types/react-dom@19.2.3(@types/react@19.2.7)': + '@types/react-dom@19.2.7(@types/react@19.2.18)': dependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.18 - '@types/react@19.2.7': + '@types/react@19.2.18': dependencies: csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.51.0(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.51.0 - '@typescript-eslint/type-utils': 8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.51.0 - eslint: 9.39.2(jiti@2.6.1) - ignore: 7.0.5 + '@typescript-eslint/parser': 8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/type-utils': 8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.69.0 + eslint: 9.39.5(jiti@2.7.0) + ignore: 7.0.8 natural-compare: 1.4.0 - ts-api-utils: 2.3.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.51.0 - '@typescript-eslint/types': 8.51.0 - '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.51.0 + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.51.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.69.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.51.0(typescript@5.9.3) - '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.51.0': + '@typescript-eslint/scope-manager@8.69.0': dependencies: - '@typescript-eslint/types': 8.51.0 - '@typescript-eslint/visitor-keys': 8.51.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 - '@typescript-eslint/tsconfig-utils@8.51.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.69.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.51.0 - '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) - ts-api-utils: 2.3.0(typescript@5.9.3) + eslint: 9.39.5(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.51.0': {} + '@typescript-eslint/types@8.69.0': {} - '@typescript-eslint/typescript-estree@8.51.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.69.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.51.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.51.0(typescript@5.9.3) - '@typescript-eslint/types': 8.51.0 - '@typescript-eslint/visitor-keys': 8.51.0 + '@typescript-eslint/project-service': 8.69.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.3.0(typescript@5.9.3) + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.51.0 - '@typescript-eslint/types': 8.51.0 - '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.51.0': + '@typescript-eslint/visitor-keys@8.69.0': dependencies: - '@typescript-eslint/types': 8.51.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.69.0 + eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0))': + '@vitejs/plugin-react@5.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) - '@rolldown/pluginutils': 1.0.0-beta.53 + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitest/mocker@5.0.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0))': + '@vitest/mocker@5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.0 estree-walker: 3.0.3 magic-string: 1.2.3 optionalDependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) '@vitest/spy@5.0.0': {} - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - acorn: 8.15.0 + acorn: 8.18.0 - acorn-walk@8.3.4: + acorn-walk@8.3.5: dependencies: - acorn: 8.15.0 + acorn: 8.18.0 - acorn@8.15.0: {} + acorn@8.18.0: {} - ajv@6.12.6: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -3088,24 +3140,26 @@ snapshots: balanced-match@1.0.2: {} - baseline-browser-mapping@2.9.11: {} + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.11.21: {} - brace-expansion@1.1.12: + brace-expansion@1.1.18: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@5.0.9: dependencies: - balanced-match: 1.0.2 + balanced-match: 4.0.4 - browserslist@4.28.1: + browserslist@4.28.9: dependencies: - baseline-browser-mapping: 2.9.11 - caniuse-lite: 1.0.30001762 - electron-to-chromium: 1.5.267 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.11.21 + caniuse-lite: 1.0.30001810 + electron-to-chromium: 1.5.422 + node-releases: 2.0.54 + update-browserslist-db: 1.3.2(browserslist@4.28.9) call-bind-apply-helpers@1.0.2: dependencies: @@ -3126,7 +3180,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001762: {} + caniuse-lite@1.0.30001810: {} chai@6.2.2: {} @@ -3164,9 +3218,9 @@ snapshots: convert-source-map@2.0.0: {} - cosmiconfig-typescript-loader@6.3.0(@types/node@24.10.4)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.3.0(@types/node@24.13.3)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@types/node': 24.10.4 + '@types/node': 24.13.3 cosmiconfig: 9.0.2(typescript@5.9.3) jiti: 2.6.1 typescript: 5.9.3 @@ -3175,7 +3229,7 @@ snapshots: dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.2 parse-json: 5.2.0 optionalDependencies: typescript: 5.9.3 @@ -3230,7 +3284,7 @@ snapshots: detect-libc@2.1.2: {} - diff@4.0.2: {} + diff@4.0.4: {} doctrine@2.1.0: dependencies: @@ -3242,16 +3296,16 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.267: {} + electron-to-chromium@1.5.422: {} emoji-regex@10.6.0: {} emoji-regex@9.2.2: {} - enhanced-resolve@5.18.4: + enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 env-paths@2.2.1: {} @@ -3374,44 +3428,44 @@ snapshots: es-toolkit@1.52.0: {} - esbuild@0.27.2: + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)): dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.5(jiti@2.7.0) - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(jiti@2.7.0)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -3421,31 +3475,31 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.5(jiti@2.7.0) hasown: 2.0.4 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 - minimatch: 3.1.2 + minimatch: 3.1.5 object.fromentries: 2.0.8 safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-react-hooks@7.1.1(eslint@9.39.5(jiti@2.7.0)): dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - eslint: 9.39.2(jiti@2.6.1) + '@babel/core': 7.29.7 + '@babel/parser': 7.29.8 + eslint: 9.39.5(jiti@2.7.0) hermes-parser: 0.25.1 - zod: 4.3.0 - zod-validation-error: 4.0.2(zod@4.3.0) + zod: 4.5.4 + zod-validation-error: 4.0.2(zod@4.5.4) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-react-refresh@0.4.26(eslint@9.39.5(jiti@2.7.0)): dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.5(jiti@2.7.0) - eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.5(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -3453,11 +3507,11 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.4.0 - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.5(jiti@2.7.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 + minimatch: 3.1.5 object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 @@ -3476,21 +3530,23 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.2(jiti@2.6.1): + eslint-visitor-keys@5.0.1: {} + + eslint@9.39.5(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.2 + '@eslint/eslintrc': 3.3.7 + '@eslint/js': 9.39.5 '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.12.6 + '@types/estree': 1.0.9 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -3498,7 +3554,7 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -3509,21 +3565,21 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 4.2.1 - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -3535,7 +3591,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -3549,10 +3605,6 @@ snapshots: fast-uri@3.1.7: {} - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 @@ -3568,10 +3620,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.4 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.4.4: {} for-each@0.3.5: dependencies: @@ -3681,7 +3733,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} + ignore@7.0.8: {} import-fresh@3.3.1: dependencies: @@ -3827,9 +3879,11 @@ snapshots: jiti@2.6.1: {} + jiti@2.7.0: {} + js-tokens@4.0.0: {} - js-yaml@4.1.1: + js-yaml@4.3.2: dependencies: argparse: 2.0.1 @@ -3869,54 +3923,54 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.30.2: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.30.2: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.30.2: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.30.2: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.30.2: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 + 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 lines-and-columns@1.2.4: {} @@ -3944,27 +3998,27 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 magic-string@1.2.3: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 make-error@1.3.6: {} math-intrinsics@1.1.0: {} - minimatch@3.1.2: + minimatch@10.2.6: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 5.0.9 - minimatch@9.0.5: + minimatch@3.1.5: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 1.1.18 ms@2.1.3: {} - nanoid@3.3.11: {} + nanoid@3.3.18: {} natural-compare@1.4.0: {} @@ -3975,7 +4029,7 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 - node-releases@2.0.27: {} + node-releases@2.0.54: {} object-assign@4.1.1: {} @@ -4045,7 +4099,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4058,15 +4112,13 @@ snapshots: picocolors@1.1.1: {} - picomatch@4.0.3: {} - picomatch@4.0.7: {} possible-typed-array-names@1.1.0: {} - postcss@8.5.6: + postcss@8.5.28: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -4082,16 +4134,16 @@ snapshots: punycode@2.3.1: {} - react-dom@19.2.3(react@19.2.3): + react-dom@19.2.8(react@19.2.8): dependencies: - react: 19.2.3 + react: 19.2.8 scheduler: 0.27.0 react-is@16.13.1: {} react-refresh@0.18.0: {} - react@19.2.3: {} + react@19.2.8: {} reflect.getprototypeof@1.0.10: dependencies: @@ -4128,32 +4180,36 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rollup@4.54.0: + rollup@4.63.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.54.0 - '@rollup/rollup-android-arm64': 4.54.0 - '@rollup/rollup-darwin-arm64': 4.54.0 - '@rollup/rollup-darwin-x64': 4.54.0 - '@rollup/rollup-freebsd-arm64': 4.54.0 - '@rollup/rollup-freebsd-x64': 4.54.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 - '@rollup/rollup-linux-arm-musleabihf': 4.54.0 - '@rollup/rollup-linux-arm64-gnu': 4.54.0 - '@rollup/rollup-linux-arm64-musl': 4.54.0 - '@rollup/rollup-linux-loong64-gnu': 4.54.0 - '@rollup/rollup-linux-ppc64-gnu': 4.54.0 - '@rollup/rollup-linux-riscv64-gnu': 4.54.0 - '@rollup/rollup-linux-riscv64-musl': 4.54.0 - '@rollup/rollup-linux-s390x-gnu': 4.54.0 - '@rollup/rollup-linux-x64-gnu': 4.54.0 - '@rollup/rollup-linux-x64-musl': 4.54.0 - '@rollup/rollup-openharmony-arm64': 4.54.0 - '@rollup/rollup-win32-arm64-msvc': 4.54.0 - '@rollup/rollup-win32-ia32-msvc': 4.54.0 - '@rollup/rollup-win32-x64-gnu': 4.54.0 - '@rollup/rollup-win32-x64-msvc': 4.54.0 + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.1 + '@rollup/rollup-android-arm64': 4.63.1 + '@rollup/rollup-darwin-arm64': 4.63.1 + '@rollup/rollup-darwin-x64': 4.63.1 + '@rollup/rollup-freebsd-arm64': 4.63.1 + '@rollup/rollup-freebsd-x64': 4.63.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.1 + '@rollup/rollup-linux-arm-musleabihf': 4.63.1 + '@rollup/rollup-linux-arm64-gnu': 4.63.1 + '@rollup/rollup-linux-arm64-musl': 4.63.1 + '@rollup/rollup-linux-loong64-gnu': 4.63.1 + '@rollup/rollup-linux-loong64-musl': 4.63.1 + '@rollup/rollup-linux-ppc64-gnu': 4.63.1 + '@rollup/rollup-linux-ppc64-musl': 4.63.1 + '@rollup/rollup-linux-riscv64-gnu': 4.63.1 + '@rollup/rollup-linux-riscv64-musl': 4.63.1 + '@rollup/rollup-linux-s390x-gnu': 4.63.1 + '@rollup/rollup-linux-x64-gnu': 4.63.1 + '@rollup/rollup-linux-x64-musl': 4.63.1 + '@rollup/rollup-openbsd-x64': 4.63.1 + '@rollup/rollup-openharmony-arm64': 4.63.1 + '@rollup/rollup-win32-arm64-msvc': 4.63.1 + '@rollup/rollup-win32-ia32-msvc': 4.63.1 + '@rollup/rollup-win32-x64-gnu': 4.63.1 + '@rollup/rollup-win32-x64-msvc': 4.63.1 fsevents: 2.3.3 safe-array-concat@1.1.4: @@ -4179,7 +4235,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.3: {} + semver@7.8.5: {} set-function-length@1.2.2: dependencies: @@ -4326,9 +4382,9 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tailwindcss@4.1.18: {} + tailwindcss@4.3.3: {} - tapable@2.3.0: {} + tapable@2.3.3: {} tinybench@6.1.4: {} @@ -4336,33 +4392,28 @@ snapshots: tinyexec@1.3.1: {} - tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - ts-api-utils@2.3.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 - ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3): + ts-node@10.9.2(@types/node@24.13.3)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 + '@tsconfig/node10': 1.0.13 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.10.4 - acorn: 8.15.0 - acorn-walk: 8.3.4 + '@types/node': 24.13.3 + acorn: 8.18.0 + acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 - diff: 4.0.2 + diff: 4.0.4 make-error: 1.3.6 typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 @@ -4405,13 +4456,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.51.0(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4425,11 +4476,11 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@7.16.0: {} + undici-types@7.18.2: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.3.2(browserslist@4.28.9): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.9 escalade: 3.2.0 picocolors: 1.1.1 @@ -4439,25 +4490,25 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0): + vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): dependencies: - esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.54.0 - tinyglobby: 0.2.15 + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + postcss: 8.5.28 + rollup: 4.63.1 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.10.4 + '@types/node': 24.13.3 fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 + jiti: 2.7.0 + lightningcss: 1.32.0 yaml: 2.9.0 - vitest@5.0.0(@types/node@24.10.4)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)): + vitest@5.0.0(@types/node@24.13.3)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0)) + '@vitest/mocker': 5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) chai: 6.2.2 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -4468,10 +4519,10 @@ snapshots: tinybench: 6.1.4 tinyexec: 1.3.0 tinyglobby: 0.2.17 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.10.4 + '@types/node': 24.13.3 transitivePeerDependencies: - msw @@ -4555,13 +4606,13 @@ snapshots: yocto-queue@0.1.0: {} - zod-validation-error@4.0.2(zod@4.3.0): + zod-validation-error@4.0.2(zod@4.5.4): dependencies: - zod: 4.3.0 + zod: 4.5.4 - zod@4.3.0: {} + zod@4.5.4: {} - zustand@5.0.9(@types/react@19.2.7)(react@19.2.3): + zustand@5.0.15(@types/react@19.2.18)(react@19.2.8): optionalDependencies: - '@types/react': 19.2.7 - react: 19.2.3 + '@types/react': 19.2.18 + react: 19.2.8 From 08956ec8fc6f4064a6a5280abe4cf3f9f14f2333 Mon Sep 17 00:00:00 2001 From: Rahul Date: Mon, 7 Sep 2026 16:58:04 +0530 Subject: [PATCH 03/26] refactor: replace alert flows with controlled ui state Replace the two alert() call sites (8-seat cap, fake payment redirect) with controlled UI state: seatStore now exposes an aria-live feedback message rendered by a new Toast component, and BookingSummary shows an inline confirmation panel instead of blocking on a browser dialog. --- src/App.tsx | 3 +++ src/components/BookingSummary.tsx | 36 +++++++++++++++++++------- src/components/Toast.tsx | 43 +++++++++++++++++++++++++++++++ src/store/seatStore.ts | 21 ++++++++++++--- 4 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 src/components/Toast.tsx diff --git a/src/App.tsx b/src/App.tsx index 147e8ae..b23a143 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,7 @@ import VenueMap from './components/VenueMap'; import { useVenue } from './hooks/useVenue'; import BookingSummary from './components/BookingSummary'; +import Toast from './components/Toast'; import { useEffect, useState, useRef } from 'react'; import { useVenueStore } from './store/seatStore'; @@ -197,6 +198,8 @@ const App = () => {
+ +
); }; diff --git a/src/components/BookingSummary.tsx b/src/components/BookingSummary.tsx index a0ab0a4..807ffdf 100644 --- a/src/components/BookingSummary.tsx +++ b/src/components/BookingSummary.tsx @@ -1,6 +1,6 @@ import { useVenueStore } from '../store/seatStore'; import type { Venue } from '../interfaces/venue.interfaces'; -import { useMemo } from 'react'; +import { useMemo, useState } from 'react'; interface BookingSummaryProps { venue: Venue; @@ -9,6 +9,12 @@ interface BookingSummaryProps { export default function BookingSummary({ venue }: BookingSummaryProps) { const selectedSeats = useVenueStore((s) => s.selectedSeats); const clearSelection = useVenueStore((s) => s.clearSelection); + const [confirmedTotal, setConfirmedTotal] = useState(null); + + const handleClear = () => { + setConfirmedTotal(null); + clearSelection(); + }; // Get selected seat details const selectedSeatDetails = useMemo(() => { @@ -105,7 +111,7 @@ export default function BookingSummary({ venue }: BookingSummaryProps) { Selected Seats ({selectedSeats.size}/8) {selectedSeats.size > 0 && (
- + > + Proceed to Pay + + )}
diff --git a/src/components/Toast.tsx b/src/components/Toast.tsx new file mode 100644 index 0000000..a8afb29 --- /dev/null +++ b/src/components/Toast.tsx @@ -0,0 +1,43 @@ +import { useEffect } from 'react'; +import { useVenueStore } from '../store/seatStore'; + +const AUTO_DISMISS_MS = 4000; + +export default function Toast() { + const feedback = useVenueStore((s) => s.feedback); + const clearFeedback = useVenueStore((s) => s.clearFeedback); + + useEffect(() => { + if (!feedback) return; + const timer = setTimeout(clearFeedback, AUTO_DISMISS_MS); + return () => clearTimeout(timer); + }, [feedback, clearFeedback]); + + if (!feedback) return null; + + const isError = feedback.type === 'error'; + + return ( +
+
+

{feedback.message}

+ +
+
+ ); +} diff --git a/src/store/seatStore.ts b/src/store/seatStore.ts index 4f03811..13dff56 100644 --- a/src/store/seatStore.ts +++ b/src/store/seatStore.ts @@ -2,14 +2,23 @@ import { create } from 'zustand'; import { persist } from 'zustand/middleware'; import type { PersistStorage, StorageValue } from 'zustand/middleware'; +export const MAX_SELECTABLE_SEATS = 8; + +interface Feedback { + type: 'info' | 'error'; + message: string; +} + interface VenueState { activeSectionId: string | null; selectedSeats: Set; zoom: number; + feedback: Feedback | null; setActiveSection: (id: string | null) => void; setZoom: (zoom: number) => void; toggleSeat: (seatId: string) => void; clearSelection: () => void; + clearFeedback: () => void; } type PersistedVenueState = Pick; @@ -44,6 +53,7 @@ export const useVenueStore = create()( activeSectionId: null, selectedSeats: new Set(), zoom: 0.4, + feedback: null, setActiveSection: (id) => set({ activeSectionId: id }), setZoom: (zoom) => set({ zoom }), @@ -53,9 +63,13 @@ export const useVenueStore = create()( if (newSelected.has(seatId)) { newSelected.delete(seatId); } else { - if (newSelected.size >= 8) { - alert('You can select a maximum of 8 seats.'); - return state; + if (newSelected.size >= MAX_SELECTABLE_SEATS) { + return { + feedback: { + type: 'error', + message: `You can select a maximum of ${MAX_SELECTABLE_SEATS} seats.`, + }, + }; } newSelected.add(seatId); } @@ -63,6 +77,7 @@ export const useVenueStore = create()( }), clearSelection: () => set({ selectedSeats: new Set() }), + clearFeedback: () => set({ feedback: null }), }), { name: 'venue-storage', From 9863ab5355f80142babfa2184a029e8ce01c03ab Mon Sep 17 00:00:00 2001 From: Rahul Date: Mon, 7 Sep 2026 16:59:56 +0530 Subject: [PATCH 04/26] test: add seating interaction coverage Configure Vitest with jsdom + Testing Library and cover the core booking flows: seat selection/deselection, the 8-seat cap surfacing feedback instead of alert(), clearing the selection, the persisted- seats localStorage round trip, and arrow-key/Enter/Space keyboard navigation across rows including skipping unavailable seats. --- package.json | 4 + pnpm-lock.yaml | 506 ++++++++++++++++++++++++++++++++++- src/components/Seat.test.tsx | 96 +++++++ src/store/seatStore.test.ts | 72 +++++ src/test/setup.ts | 7 + vite.config.ts | 6 +- 6 files changed, 688 insertions(+), 3 deletions(-) create mode 100644 src/components/Seat.test.tsx create mode 100644 src/store/seatStore.test.ts create mode 100644 src/test/setup.ts diff --git a/package.json b/package.json index cf83e91..713d394 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,9 @@ "@commitlint/cli": "^21.2.2", "@commitlint/config-conventional": "^21.2.2", "@eslint/js": "^9.39.5", + "@testing-library/jest-dom": "^7.0.1", + "@testing-library/react": "^16.3.3", + "@testing-library/user-event": "^14.6.7", "@types/node": "^24.13.3", "@types/react": "^19.2.18", "@types/react-dom": "^19.2.7", @@ -56,6 +59,7 @@ "eslint-plugin-react-refresh": "^0.4.26", "globals": "^16.5.0", "husky": "^9.1.7", + "jsdom": "^30.0.1", "lint-staged": "^17.5.0", "prettier": "^3.9.6", "ts-node": "^10.9.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index df90830..82e14c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,15 @@ importers: '@eslint/js': specifier: ^9.39.5 version: 9.39.5 + '@testing-library/jest-dom': + specifier: ^7.0.1 + version: 7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))) + '@testing-library/react': + specifier: ^16.3.3 + version: 16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@testing-library/user-event': + specifier: ^14.6.7 + version: 14.6.7(@testing-library/dom@10.4.1) '@types/node': specifier: ^24.13.3 version: 24.13.3 @@ -69,6 +78,9 @@ importers: husky: specifier: ^9.1.7 version: 9.1.7 + jsdom: + specifier: ^30.0.1 + version: 30.0.1 lint-staged: specifier: ^17.5.0 version: 17.5.0 @@ -89,10 +101,21 @@ importers: version: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) vitest: specifier: ^5.0.0 - version: 5.0.0(@types/node@24.13.3)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + version: 5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) packages: + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} + + '@asamuzakjp/css-color@6.0.7': + resolution: {integrity: sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==} + engines: {node: ^22.13.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@8.3.2': + resolution: {integrity: sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==} + engines: {node: ^22.13.0 || >=24.0.0} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -164,6 +187,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} @@ -176,6 +203,10 @@ packages: resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + '@commitlint/cli@21.2.2': resolution: {integrity: sha512-a+6hQxIxnpdvSvS2apvttPNbEliYsVC3PqFYDiiB2kjbwIsQsj1urvQ4Tkf70pKYozPalKAuRQmm/GHwndduqA==} engines: {node: '>=22.12.0'} @@ -265,6 +296,42 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@csstools/color-helpers@6.1.1': + resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==} + engines: {node: '>=20.19.0'} + + '@csstools/css-calc@3.3.0': + resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-color-parser@4.2.2': + resolution: {integrity: sha512-3QKjR/vxyjcSXBLgb6lP0S3MGdvwbmqSsvLPbYdVORqPDc8FX1HAJ0Spk38bxaRXgvENTA47tlhhbb5Z2e8hEg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.12': + resolution: {integrity: sha512-3vLQK+dXxhBMR2Wx99PTCifE+vHtW2ndZWyla8yK813ev6oGhyn8Lja8jCyGAWTJ+LEYZK7EVtJxrDj8ztevJw==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} @@ -459,6 +526,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -748,6 +824,41 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@7.0.1': + resolution: {integrity: sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==} + engines: {node: '>=22', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@testing-library/dom': '>=10 <11' + vitest: '>= 0.32' + peerDependenciesMeta: + vitest: + optional: true + + '@testing-library/react@16.3.3': + resolution: {integrity: sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@testing-library/user-event@14.6.7': + resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@tsconfig/node10@1.0.13': resolution: {integrity: sha512-gcLdvR9HO1ZJBypsOGqaP6TFEzb6vIta0KSTLt9NAQ6pXQO3cRgSVyCN6pzYqI9DlJgY71XKO0dpDhCf08b3pg==} @@ -760,6 +871,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -894,6 +1008,10 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + ansi-regex@6.3.0: resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} engines: {node: '>=12'} @@ -902,6 +1020,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -916,6 +1038,9 @@ packages: resolution: {integrity: sha512-VipTB0gXgGIFO2Rg9yEVN5wLt2AurJcZqDbgmYSwPwsykhLrQhs240/bfceev4w68lI8JshoOJIk9uW7tFzROw==} engines: {node: '>=22'} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -983,6 +1108,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + brace-expansion@1.1.18: resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} @@ -1076,12 +1204,23 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -1103,6 +1242,9 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1114,6 +1256,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -1126,6 +1272,12 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1143,6 +1295,10 @@ packages: resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -1431,6 +1587,10 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -1452,6 +1612,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + ini@6.0.0: resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -1531,6 +1695,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -1592,6 +1759,15 @@ packages: resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true + jsdom@30.0.1: + resolution: {integrity: sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + peerDependencies: + canvas: ^3.2.3 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -1728,9 +1904,17 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -1744,6 +1928,13 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@10.2.6: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} @@ -1826,6 +2017,9 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1861,6 +2055,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -1876,6 +2074,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} @@ -1884,6 +2085,10 @@ packages: resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} engines: {node: '>=0.10.0'} + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -1926,6 +2131,10 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -2030,6 +2239,10 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2042,6 +2255,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tailwindcss@4.3.3: resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} @@ -2065,6 +2281,21 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tldts-core@7.4.11: + resolution: {integrity: sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==} + + tldts@7.4.11: + resolution: {integrity: sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==} + hasBin: true + + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -2124,6 +2355,10 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici@8.10.2: + resolution: {integrity: sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==} + engines: {node: '>=22.19.0'} + update-browserslist-db@1.3.2: resolution: {integrity: sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==} hasBin: true @@ -2217,6 +2452,26 @@ packages: jsdom: optional: true + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + whatwg-url@17.1.0: + resolution: {integrity: sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==} + engines: {node: ^22.14.0 || >=24.0.0} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -2251,6 +2506,13 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -2308,6 +2570,23 @@ packages: snapshots: + '@adobe/css-tools@4.5.0': {} + + '@asamuzakjp/css-color@6.0.7': + dependencies: + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + lru-cache: 11.5.2 + + '@asamuzakjp/dom-selector@8.3.2': + dependencies: + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -2397,6 +2676,8 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 + '@babel/runtime@7.29.7': {} + '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -2420,6 +2701,10 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + '@commitlint/cli@21.2.2(@types/node@24.13.3)(conventional-commits-parser@7.1.2)(typescript@5.9.3)': dependencies: '@commitlint/config-conventional': 21.2.2 @@ -2543,6 +2828,30 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@csstools/color-helpers@6.1.1': {} + + '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-color-parser@4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.1.1 + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.12(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + '@esbuild/aix-ppc64@0.28.2': optional: true @@ -2667,6 +2976,8 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@exodus/bytes@1.15.1': {} + '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -2861,6 +3172,43 @@ snapshots: tailwindcss: 4.3.3 vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)))': + dependencies: + '@adobe/css-tools': 4.5.0 + '@testing-library/dom': 10.4.1 + aria-query: 5.3.2 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + optionalDependencies: + vitest: 5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + + '@testing-library/react@16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 7.29.7 + '@testing-library/dom': 10.4.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + optionalDependencies: + '@types/react': 19.2.18 + '@types/react-dom': 19.2.7(@types/react@19.2.18) + + '@testing-library/user-event@14.6.7(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + '@tsconfig/node10@1.0.13': {} '@tsconfig/node12@1.0.11': {} @@ -2869,6 +3217,8 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.8 @@ -3051,12 +3401,16 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-regex@5.0.1: {} + ansi-regex@6.3.0: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} arg@4.1.3: {} @@ -3065,6 +3419,10 @@ snapshots: argue-cli@3.2.0: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -3144,6 +3502,10 @@ snapshots: baseline-browser-mapping@2.11.21: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + brace-expansion@1.1.18: dependencies: balanced-match: 1.0.2 @@ -3242,10 +3604,24 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css.escape@1.5.1: {} + csstype@3.2.3: {} damerau-levenshtein@1.0.8: {} + data-urls@7.0.0: + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -3268,6 +3644,8 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.6.0: {} + deep-is@0.1.4: {} define-data-property@1.1.4: @@ -3282,6 +3660,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + dequal@2.0.3: {} + detect-libc@2.1.2: {} diff@4.0.4: {} @@ -3290,6 +3670,10 @@ snapshots: dependencies: esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3307,6 +3691,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 + entities@8.0.0: {} + env-paths@2.2.1: {} error-ex@1.3.4: @@ -3729,6 +4115,12 @@ snapshots: dependencies: hermes-estree: 0.25.1 + html-encoding-sniffer@6.0.0: + dependencies: + '@exodus/bytes': 1.15.1 + transitivePeerDependencies: + - '@noble/hashes' + husky@9.1.7: {} ignore@5.3.2: {} @@ -3742,6 +4134,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + ini@6.0.0: {} internal-slot@1.1.0: @@ -3825,6 +4219,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -3887,6 +4283,32 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@30.0.1: + dependencies: + '@asamuzakjp/css-color': 6.0.7 + '@asamuzakjp/dom-selector': 8.3.2 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.12(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 + css-tree: 3.2.1 + data-urls: 7.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.2 + undici: 8.10.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 17.1.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -3992,10 +4414,14 @@ snapshots: dependencies: js-tokens: 4.0.0 + lru-cache@11.5.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lz-string@1.5.0: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -4008,6 +4434,10 @@ snapshots: math-intrinsics@1.1.0: {} + mdn-data@2.27.1: {} + + min-indent@1.0.1: {} + minimatch@10.2.6: dependencies: brace-expansion: 5.0.9 @@ -4104,6 +4534,10 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse5@8.0.1: + dependencies: + entities: 8.0.0 + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -4126,6 +4560,12 @@ snapshots: prettier@3.9.6: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -4141,10 +4581,17 @@ snapshots: react-is@16.13.1: {} + react-is@17.0.2: {} + react-refresh@0.18.0: {} react@19.2.8: {} + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.9 @@ -4231,6 +4678,10 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scheduler@0.27.0: {} semver@6.3.1: {} @@ -4374,6 +4825,10 @@ snapshots: dependencies: ansi-regex: 6.3.0 + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@3.1.1: {} supports-color@7.2.0: @@ -4382,6 +4837,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} + tailwindcss@4.3.3: {} tapable@2.3.3: {} @@ -4397,6 +4854,20 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 + tldts-core@7.4.11: {} + + tldts@7.4.11: + dependencies: + tldts-core: 7.4.11 + + tough-cookie@6.0.2: + dependencies: + tldts: 7.4.11 + + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -4478,6 +4949,8 @@ snapshots: undici-types@7.18.2: {} + undici@8.10.2: {} + update-browserslist-db@1.3.2(browserslist@4.28.9): dependencies: browserslist: 4.28.9 @@ -4505,7 +4978,7 @@ snapshots: lightningcss: 1.32.0 yaml: 2.9.0 - vitest@5.0.0(@types/node@24.13.3)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + vitest@5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): dependencies: '@types/chai': 5.2.3 '@vitest/mocker': 5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) @@ -4523,9 +4996,34 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.13.3 + jsdom: 30.0.1 transitivePeerDependencies: - msw + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + webidl-conversions@8.0.1: {} + + whatwg-mimetype@5.0.0: {} + + whatwg-url@16.0.1: + dependencies: + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' + + whatwg-url@17.1.0: + dependencies: + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -4584,6 +5082,10 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@5.0.8: {} yallist@3.1.1: {} diff --git a/src/components/Seat.test.tsx b/src/components/Seat.test.tsx new file mode 100644 index 0000000..8ba403c --- /dev/null +++ b/src/components/Seat.test.tsx @@ -0,0 +1,96 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import { render, fireEvent } from '@testing-library/react'; +import type { Row } from '../interfaces/venue.interfaces'; +import { useVenueStore } from '../store/seatStore'; +import Seats from './Seat'; + +// Two aligned rows of three seats so Arrow{Up,Down} land on a predictable +// nearest-x match, and Arrow{Left,Right} walk within a row. +const rows: Row[] = [ + { + index: 1, + seats: [ + { id: 'A1', col: 1, x: 0, y: 0, priceTier: 1, status: 'available' }, + { id: 'A2', col: 2, x: 10, y: 0, priceTier: 1, status: 'available' }, + { id: 'A3', col: 3, x: 20, y: 0, priceTier: 1, status: 'available' }, + ], + }, + { + index: 2, + seats: [ + { id: 'B1', col: 1, x: 0, y: 10, priceTier: 1, status: 'available' }, + { id: 'B2', col: 2, x: 10, y: 10, priceTier: 1, status: 'available' }, + { id: 'B3', col: 3, x: 20, y: 10, priceTier: 1, status: 'sold' }, + ], + }, +]; + +const renderSeats = () => render({}); + +const resetStore = () => { + useVenueStore.setState({ + activeSectionId: null, + selectedSeats: new Set(), + zoom: 0.4, + feedback: null, + }); +}; + +describe('Seats keyboard navigation and selection', () => { + beforeEach(resetStore); + + it('moves focus right and left within a row on ArrowRight/ArrowLeft', () => { + renderSeats(); + + const seatA2 = document.getElementById('seat-A2')!; + seatA2.focus(); + fireEvent.keyDown(seatA2, { key: 'ArrowRight' }); + expect(document.activeElement).toBe(document.getElementById('seat-A3')); + + fireEvent.keyDown(document.activeElement as Element, { key: 'ArrowLeft' }); + expect(document.activeElement).toBe(document.getElementById('seat-A2')); + }); + + it('moves focus to the nearest seat in the row above/below on ArrowUp/ArrowDown', () => { + renderSeats(); + + const seatA2 = document.getElementById('seat-A2')!; + seatA2.focus(); + + fireEvent.keyDown(seatA2, { key: 'ArrowUp' }); + expect(document.activeElement).toBe(document.getElementById('seat-B2')); + + fireEvent.keyDown(document.activeElement as Element, { key: 'ArrowDown' }); + expect(document.activeElement).toBe(document.getElementById('seat-A2')); + }); + + it('toggles selection with Enter and Space', () => { + renderSeats(); + const seatA1 = document.getElementById('seat-A1')!; + seatA1.focus(); + + fireEvent.keyDown(seatA1, { key: 'Enter' }); + expect(useVenueStore.getState().selectedSeats.has('A1')).toBe(true); + expect(seatA1.getAttribute('aria-checked')).toBe('true'); + + fireEvent.keyDown(seatA1, { key: ' ' }); + expect(useVenueStore.getState().selectedSeats.has('A1')).toBe(false); + }); + + it('toggles selection on click', () => { + renderSeats(); + const seatA2 = document.getElementById('seat-A2')!; + + fireEvent.click(seatA2); + expect(useVenueStore.getState().selectedSeats.has('A2')).toBe(true); + }); + + it('ignores interaction on unavailable (sold) seats', () => { + renderSeats(); + const seatB3 = document.getElementById('seat-B3')!; + + fireEvent.click(seatB3); + expect(useVenueStore.getState().selectedSeats.has('B3')).toBe(false); + expect(seatB3.getAttribute('tabindex')).toBe('-1'); + }); +}); diff --git a/src/store/seatStore.test.ts b/src/store/seatStore.test.ts new file mode 100644 index 0000000..f3d6dbb --- /dev/null +++ b/src/store/seatStore.test.ts @@ -0,0 +1,72 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import { MAX_SELECTABLE_SEATS, useVenueStore } from './seatStore'; + +const resetStore = () => { + useVenueStore.setState({ + activeSectionId: null, + selectedSeats: new Set(), + zoom: 0.4, + feedback: null, + }); + localStorage.clear(); +}; + +describe('seatStore', () => { + beforeEach(resetStore); + + it('selects a seat via toggleSeat', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + expect(useVenueStore.getState().selectedSeats.has('SEAT-1')).toBe(true); + }); + + it('deselects an already-selected seat via toggleSeat', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().toggleSeat('SEAT-1'); + expect(useVenueStore.getState().selectedSeats.has('SEAT-1')).toBe(false); + }); + + it('enforces the max-seat rule and surfaces feedback instead of throwing/alerting', () => { + for (let i = 1; i <= MAX_SELECTABLE_SEATS; i++) { + useVenueStore.getState().toggleSeat(`SEAT-${i}`); + } + expect(useVenueStore.getState().selectedSeats.size).toBe(MAX_SELECTABLE_SEATS); + + useVenueStore.getState().toggleSeat('SEAT-overflow'); + + expect(useVenueStore.getState().selectedSeats.size).toBe(MAX_SELECTABLE_SEATS); + expect(useVenueStore.getState().selectedSeats.has('SEAT-overflow')).toBe(false); + expect(useVenueStore.getState().feedback).toEqual({ + type: 'error', + message: `You can select a maximum of ${MAX_SELECTABLE_SEATS} seats.`, + }); + }); + + it('clears the selection via clearSelection', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().toggleSeat('SEAT-2'); + useVenueStore.getState().clearSelection(); + expect(useVenueStore.getState().selectedSeats.size).toBe(0); + }); + + it('persists and restores selected seats across a save/reload cycle', async () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().toggleSeat('SEAT-2'); + + // Zustand's persist middleware writes to storage asynchronously (microtask). + await Promise.resolve(); + + const raw = localStorage.getItem('venue-storage'); + expect(raw).not.toBeNull(); + + const parsed = JSON.parse(raw as string) as { state: { selectedSeats: string[] } }; + expect(parsed.state.selectedSeats.sort()).toEqual(['SEAT-1', 'SEAT-2']); + + // Simulate a fresh load: reset in-memory state, then rehydrate from the same storage key. + useVenueStore.setState({ selectedSeats: new Set() }); + const rehydrated = new Set(parsed.state.selectedSeats); + useVenueStore.setState({ selectedSeats: rehydrated }); + + expect(useVenueStore.getState().selectedSeats.has('SEAT-1')).toBe(true); + expect(useVenueStore.getState().selectedSeats.has('SEAT-2')).toBe(true); + }); +}); diff --git a/src/test/setup.ts b/src/test/setup.ts new file mode 100644 index 0000000..01d18c2 --- /dev/null +++ b/src/test/setup.ts @@ -0,0 +1,7 @@ +import '@testing-library/jest-dom/vitest'; +import { afterEach } from 'vitest'; +import { cleanup } from '@testing-library/react'; + +afterEach(() => { + cleanup(); +}); diff --git a/vite.config.ts b/vite.config.ts index 6e7f528..c188cb5 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,12 @@ -import { defineConfig } from 'vite'; +import { defineConfig } from 'vitest/config'; import react from '@vitejs/plugin-react'; import tailwindcss from '@tailwindcss/vite'; // https://vite.dev/config/ export default defineConfig({ plugins: [react(), tailwindcss()], + test: { + environment: 'jsdom', + setupFiles: ['./src/test/setup.ts'], + }, }); From b256034de1dfc5cfc55f526228e7107246d47784 Mon Sep 17 00:00:00 2001 From: Rahul Date: Mon, 7 Sep 2026 17:00:21 +0530 Subject: [PATCH 05/26] ci: add validation workflow Add GitHub Actions pipeline running on every push/PR: install (frozen lockfile), quality (format-check + lint + typecheck), test, build, plus a full-history Gitleaks secret scan and commitlint on the commit range being merged. --- .github/workflows/ci.yml | 110 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..16dc2d6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,110 @@ +name: CI + +on: + push: + branches: ['**'] + pull_request: + workflow_dispatch: + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + NODE_VERSION: '24' + PNPM_VERSION: '10' + +jobs: + secret-scan: + name: Secret scan + runs-on: ubuntu-latest + container: + image: ghcr.io/gitleaks/gitleaks:v8.30.1 + options: --entrypoint '' + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - run: gitleaks git --config .gitleaks.toml --redact --verbose . + + quality: + name: Quality + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + - uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm run quality + + commitlint: + name: Commit lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + - uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + - run: pnpm install --frozen-lockfile + - name: Lint commit range + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }} + BEFORE_SHA: ${{ github.event.before }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + run: | + set -eu + if [ -n "${BASE_SHA:-}" ]; then + npx --no -- commitlint --from "$BASE_SHA" --to "$HEAD_SHA" --verbose + elif [ -n "${BEFORE_SHA:-}" ] && [ "$BEFORE_SHA" != "0000000000000000000000000000000000000000" ]; then + npx --no -- commitlint --from "$BEFORE_SHA" --to "$HEAD_SHA" --verbose + else + git fetch origin "$DEFAULT_BRANCH:refs/remotes/origin/$DEFAULT_BRANCH" + BASE="$(git merge-base "$HEAD_SHA" "origin/$DEFAULT_BRANCH")" + if [ "$BASE" = "$HEAD_SHA" ]; then + git log -1 --format=%B "$HEAD_SHA" | npx --no -- commitlint --verbose + else + npx --no -- commitlint --from "$BASE" --to "$HEAD_SHA" --verbose + fi + fi + + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + - uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm test + + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + - uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm run build From 39e4958fb65956128ae18f35a423f1b9a92c23c0 Mon Sep 17 00:00:00 2001 From: Rahul Date: Mon, 7 Sep 2026 17:04:17 +0530 Subject: [PATCH 06/26] docs: expand seating map architecture readme Add the problem statement, 15,000+ seat rendering notes (section- level SVG collapsing), the case for SVG over canvas/WebGL, the Zustand persistence strategy, accessibility notes, and a Mermaid architecture diagram to the README, plus docs/engineering-notes.md covering the tradeoffs and remaining performance bottlenecks in detail. --- README.md | 103 ++++++++++++++++++++++++++++++++++++-- docs/engineering-notes.md | 67 +++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 4 deletions(-) create mode 100644 docs/engineering-notes.md diff --git a/README.md b/README.md index cd23651..143c88d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,93 @@ [![React Version](https://img.shields.io/badge/react-19.2-149ECA?logo=react&logoColor=white)](https://react.dev) [![pnpm](https://img.shields.io/badge/pnpm-package%20manager-F69220?logo=pnpm&logoColor=white)](https://pnpm.io) -A high-performance, interactive seating map for large venues, built to handle 15,000+ seats with smooth panning, zooming, and keyboard navigation. +A high-performance, interactive seating map for large venues, built to handle **15,000+ seats** +with smooth panning, zooming, keyboard navigation, and persisted selection โ€” without shipping a +canvas/WebGL engine or a virtualization library. + +--- + +## ๐ŸŽฏ Problem statement + +A venue booking UI has to render every seat in a venue (this project's sample data: 10 sections ร— +30 rows ร— 50 seats = **15,000 seats**) as an individually selectable, keyboard-navigable element, +while staying responsive to pan, zoom, and selection changes. Rendering 15,000 live SVG nodes at +once is the naive approach โ€” and it's slow: every zoom/selection change forces the browser to +diff, layout, and paint tens of thousands of DOM nodes. This project's core engineering problem is +keeping the map interactive at that scale using nothing heavier than React + SVG. + +## ๐Ÿ“ธ Screenshot + +> _A screenshot/GIF of the running map (pan, zoom, section drill-in, seat selection) belongs here._ +> This environment couldn't produce one without installing a browser automation toolchain outside +> this repo's dependency scope โ€” run `pnpm dev` locally and drop an image at `docs/screenshot.png` +> to replace this note. + +--- + +## ๐Ÿ—๏ธ Architecture & performance + +```mermaid +flowchart TD + A[App] --> B["useVenue()
fetch /venue.json"] + A --> C[VenueMap] + C --> D["Section ร— 10
(memoized)"] + D -->|inactive| E["Collapsed <path> cover shape
(1 SVG node per section)"] + D -->|active| F["Seats
(memoized)"] + F --> G["~1,500 <rect> seat nodes
(one section's worth)"] + A --> H["seatStore (Zustand)
selection ยท zoom ยท active section"] + H -.->|persist selectedSeats| I[(localStorage)] + F -.reads/writes.-> H + A --> J[Toast
aria-live feedback] + H -.->|feedback| J +``` + +### 15,000+ seat rendering: section-level collapsing + +The map never mounts all 15,000 seats as DOM nodes at once. [`Section.tsx`](src/components/Section.tsx) +renders each **inactive** section as a single collapsed `` "cover" shape traced around its +outer row (one SVG node, regardless of how many seats it contains). Only the **one active** section +โ€” the one the user clicked into โ€” mounts individual seat `` nodes via [`Seat.tsx`](src/components/Seat.tsx). +That caps live, interactive seat nodes at ~1,500 (one section) instead of 15,000, at any given time. + +This is a deliberate alternative to two heavier options: + +- **Canvas/WebGL**: gives raw rendering throughput but throws away native SVG accessibility + (focus, `role`, `aria-*`) and hit-testing โ€” you'd have to reimplement both by hand. +- **Row/column virtualization** (`react-window`/`react-virtualized`): built for linear lists, not + an SVG coordinate space with seats laid out on radial rows. Section-level collapsing matches this + venue's natural UX unit (users think in sections, not in a scrollable seat list) and needs no + extra dependency. + +`Section` and `Seats` are both `React.memo`-wrapped, so panning, zooming, or selecting a seat in +one section doesn't force every other (already-collapsed) section to re-render or recompute its +cover path. + +### Zustand persistence strategy + +Selected seats survive a page refresh via Zustand's `persist` middleware โ€” but `selectedSeats` is +a `Set`, and `JSON.stringify` can't round-trip a `Set` on its own. [`seatStore.ts`](src/store/seatStore.ts) +supplies a custom `PersistStorage` that serializes `Set โ†” string[]` on `getItem`/`setItem`, +so `localStorage` only ever stores an array, while the in-memory store keeps `O(1)` `has()`/`add()`/ +`delete()` lookups for selection toggling. `partialize` scopes persistence to `selectedSeats` only โ€” +`zoom`, `activeSectionId`, and transient `feedback` state are intentionally not persisted. + +See [`docs/engineering-notes.md`](docs/engineering-notes.md) for the tradeoffs behind these +decisions and where they'd need to change at greater scale. + +--- + +## โ™ฟ Accessibility + +- Every seat is a real interactive element: `role="checkbox"`, `aria-checked` reflecting selection, + `aria-label` describing row/seat/price/status, and `aria-disabled` for sold/reserved/held seats. +- **Roving keyboard navigation**: only the active section's seats are focusable (`tabIndex={0}`, + or `-1` when unavailable). Arrow keys move focus seat-to-seat โ€” `ArrowLeft`/`ArrowRight` within a + row, `ArrowUp`/`ArrowDown` to the nearest seat (by x-position) in the adjacent row โ€” and + `Enter`/`Space` toggle selection, matching native checkbox semantics. +- Feedback that used to be a blocking `alert()` (hitting the 8-seat cap, the payment stub) is now + an `aria-live="polite"` [`Toast`](src/components/Toast.tsx) region and inline confirmation state, + so screen readers announce it without interrupting keyboard flow. --- @@ -29,7 +115,7 @@ A high-performance, interactive seating map for large venues, built to handle 15 ### Engineering standards & tooling -- **Testing**: Vitest +- **Testing**: Vitest + Testing Library (jsdom) - **Linting/Formatting**: ESLint (React, hooks, jsx-a11y, type-checked TypeScript rules) + Prettier - **Git hooks**: Husky (`pre-commit` โ†’ Gitleaks + lint-staged, `commit-msg` โ†’ commitlint) - **Commit convention**: Conventional Commits, enforced by commitlint @@ -43,18 +129,22 @@ See [Engineering standards](#-engineering-standards) below for details. ## ๐Ÿ“‚ Repository Structure ```text +โ”œโ”€โ”€ docs/ +โ”‚ โ””โ”€โ”€ engineering-notes.md # Tradeoffs and performance bottlenecks โ”œโ”€โ”€ public/ โ”‚ โ””โ”€โ”€ venue.json # Generated seating data served to the client โ”œโ”€โ”€ scripts/ โ”‚ โ””โ”€โ”€ generateVenue.ts # Generates public/venue.json โ”œโ”€โ”€ src/ -โ”‚ โ”œโ”€โ”€ components/ # VenueMap, Section, Seat, Stage, BookingSummary, ... +โ”‚ โ”œโ”€โ”€ components/ # VenueMap, Section, Seat, Stage, BookingSummary, Toast, ... โ”‚ โ”œโ”€โ”€ hooks/ โ”‚ โ”‚ โ””โ”€โ”€ useVenue.ts # Fetches and exposes public/venue.json โ”‚ โ”œโ”€โ”€ store/ -โ”‚ โ”‚ โ””โ”€โ”€ seatStore.ts # Zustand store (zoom, active section, selected seats) +โ”‚ โ”‚ โ””โ”€โ”€ seatStore.ts # Zustand store (zoom, active section, selected seats, feedback) โ”‚ โ”œโ”€โ”€ interfaces/ โ”‚ โ”‚ โ””โ”€โ”€ venue.interfaces.ts +โ”‚ โ”œโ”€โ”€ test/ +โ”‚ โ”‚ โ””โ”€โ”€ setup.ts # Vitest + Testing Library setup โ”‚ โ”œโ”€โ”€ App.tsx โ”‚ โ””โ”€โ”€ main.tsx โ”œโ”€โ”€ .github/workflows/ci.yml # CI pipeline @@ -119,6 +209,11 @@ There are **no environment variables** โ€” seating data is served from the stati pnpm test ``` +Covers seat selection/deselection, the 8-seat selection cap, clearing the selection, the +persisted-seats `localStorage` round trip, and keyboard navigation (arrow keys, Enter/Space, +skipping unavailable seats) โ€” see [`src/store/seatStore.test.ts`](src/store/seatStore.test.ts) and +[`src/components/Seat.test.tsx`](src/components/Seat.test.tsx). + --- ## ๐Ÿ“ Engineering standards diff --git a/docs/engineering-notes.md b/docs/engineering-notes.md new file mode 100644 index 0000000..36e766c --- /dev/null +++ b/docs/engineering-notes.md @@ -0,0 +1,67 @@ +# Engineering notes + +This document records the tradeoffs behind the seating map's performance-critical decisions, and +the bottlenecks they leave in place. It's aimed at anyone extending this codebase who needs to know +_why_ something works the way it does before changing it. + +## Why section-level collapsing instead of a virtualization library + +`react-window`/`react-virtualized` virtualize a linear (or grid) list by only mounting the rows +currently in the scroll viewport. That model doesn't map cleanly onto this venue: seats are laid +out on radial rows around a stage (see [`scripts/generateVenue.ts`](../scripts/generateVenue.ts)), +not a scrollable list, and the interaction unit users care about is a **section**, not a row. + +Instead, [`Section.tsx`](../src/components/Section.tsx) renders each inactive section as a single +collapsed `` and defers mounting any seat nodes until the user clicks into it. This is simpler +than adapting a list-virtualization library to a 2D radial layout, needs no extra dependency, and +naturally matches the venue's real-world browsing pattern (pick a section, then pick a seat). + +**Bottleneck this leaves in place:** the _active_ section still mounts all of its seats at once +(~1,500 in the current 10ร—30ร—50 sample venue). That's fine at this scale, but a venue with, say, +5,000 seats in a single section would need row-level virtualization _within_ the active section โ€” +this codebase doesn't have that yet. + +## Why SVG over Canvas/WebGL + +SVG gives native accessibility (`role`, `aria-*`, real DOM focus) and hit-testing for free โ€” every +seat is a real, individually focusable element without any custom hit-testing code. Canvas/WebGL +would render faster at very large scale, but every one of those things (focus order, screen-reader +semantics, click targets) would need to be reimplemented by hand against an off-screen model. + +**Where this stops scaling:** SVG's per-node overhead (DOM presence, style recalculation, event +listener) becomes the bottleneck somewhere in the tens-of-thousands of simultaneously-mounted +nodes โ€” this project stays well under that by only ever mounting one section's seats. If a future +requirement needs _all_ sections' seats interactive simultaneously (e.g., a full-venue heatmap), +that's the point to reach for Canvas with a manual hit-testing layer, or a WebGL instanced-rendering +approach, accepting the accessibility rebuild that comes with it. + +## `memo()` boundaries and render cost + +`Section` and `Seats` (in [`Seat.tsx`](../src/components/Seat.tsx)) are both `React.memo`-wrapped so +that panning/zooming or selecting a seat in one section doesn't re-render every other section's +already-collapsed cover path. Within `Seats`, per-seat fill/stroke colors and the tier-color map are +recomputed on every render of that component โ€” acceptable at ~1,500 seats, but the first thing to +hoist out (e.g., derive style from a lookup keyed by `status`/`priceTier` computed once) if a +section's seat count grows materially. + +## `localStorage` persistence limits + +[`seatStore.ts`](../src/store/seatStore.ts) persists `selectedSeats` to `localStorage` via a custom +`PersistStorage` that serializes the `Set` to a plain array. This is enough for the current +scope (survive a page refresh, single device, no login) but has real limits: + +- `localStorage` has a per-origin size ceiling (typically ~5โ€“10MB depending on browser) โ€” irrelevant + at 8 selected seats, but the pattern shouldn't be reused to persist large datasets. +- No cross-device or cross-session sync โ€” selections don't follow a user between browsers or + devices, and there's no server-side hold/reservation, so two tabs (or two people) could both + believe they've selected the same seat. +- A real backend would replace this with a server-held reservation (with a TTL/hold expiry) and use + `localStorage` only as an optimistic local echo, not the source of truth. + +## Known remaining gaps + +- No virtualization within an active section's own seat list (see above). +- The "Proceed to Pay" flow (see [`BookingSummary.tsx`](../src/components/BookingSummary.tsx)) is an + intentional UI stub โ€” it shows an inline confirmation, not a real payment integration. +- Seat availability (`sold`/`reserved`/`held`) is static sample data with no live update mechanism + (no websocket/polling) โ€” a second user selecting the same seat isn't reflected without a refresh. From 3559ecef4e19c7818b90358f1f79ea17571de6f6 Mon Sep 17 00:00:00 2001 From: Rahul Date: Mon, 7 Sep 2026 17:10:36 +0530 Subject: [PATCH 07/26] ci: bump actions to Node 24 runtime majors actions/checkout@v4, actions/setup-node@v4, and pnpm/action-setup@v4 still run on the Node.js 20 runtime, which GitHub Actions now flags as deprecated. Bump each to its v5 major, where all three switched to Node.js 24. --- .github/workflows/ci.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16dc2d6..d8dfa72 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: image: ghcr.io/gitleaks/gitleaks:v8.30.1 options: --entrypoint '' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 - run: gitleaks git --config .gitleaks.toml --redact --verbose . @@ -31,11 +31,11 @@ jobs: name: Quality runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v5 with: version: ${{ env.PNPM_VERSION }} - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: ${{ env.NODE_VERSION }} cache: pnpm @@ -46,13 +46,13 @@ jobs: name: Commit lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 with: version: ${{ env.PNPM_VERSION }} - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: ${{ env.NODE_VERSION }} cache: pnpm @@ -83,11 +83,11 @@ jobs: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v5 with: version: ${{ env.PNPM_VERSION }} - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: ${{ env.NODE_VERSION }} cache: pnpm @@ -98,11 +98,11 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v5 with: version: ${{ env.PNPM_VERSION }} - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: ${{ env.NODE_VERSION }} cache: pnpm From 169e0d7e591a042125d2c2988aedd0277fe79251 Mon Sep 17 00:00:00 2001 From: Rahul Date: Tue, 8 Sep 2026 14:47:38 +0530 Subject: [PATCH 08/26] feat: add booking history and rework responsive layout across the app - Add Booking History: past purchases list, click a booking to highlight its seats on the map - Make the sidebar responsive: full-screen drawer below 1024px, persistent panel above it - Pin Total/Proceed to Pay outside the scroll area so it stays reachable with many seats picked - Add a confirm dialog before clearing selected seats, replacing the instant clear action - Trap focus behind open drawers/dialogs so keyboard users can't reach hidden controls - Add page title/description, robots.txt, and llms.txt for search engines and AI crawlers - Remove unused Stage/SectionSkeleton components and refresh generated sample data - Update and extend tests to cover booking history and the new store actions --- .gitattributes | 1 + README.md | 64 +- docs/engineering-notes.md | 16 +- docs/screenshots/booking-history.png | Bin 0 -> 269038 bytes docs/screenshots/overview.png | Bin 0 -> 306945 bytes docs/screenshots/seat-selection.png | Bin 0 -> 342304 bytes docs/ui-ux-and-business-logic-flow.md | 717 ++ index.html | 6 +- public/llms.txt | 6 + public/robots.txt | 2 + public/venue.json | 8980 ++++++++++++------------ scripts/generateVenue.ts | 30 +- src/App.tsx | 236 +- src/components/BookingHistoryPanel.tsx | 123 + src/components/BookingSummary.tsx | 189 +- src/components/ConfirmDialog.tsx | 90 + src/components/Icon.tsx | 37 + src/components/IconButton.tsx | 32 + src/components/Seat.test.tsx | 12 + src/components/Seat.tsx | 148 +- src/components/SeatSelectionFooter.tsx | 49 + src/components/SeatSelectionPanel.tsx | 81 + src/components/Section.tsx | 49 +- src/components/SectionSkeleton.tsx | 27 - src/components/Stage.tsx | 8 - src/components/VenueMap.tsx | 36 +- src/hooks/useVenue.ts | 13 +- src/index.css | 102 + src/store/seatStore.test.ts | 103 +- src/store/seatStore.ts | 78 +- src/utils/rowLetter.ts | 14 + src/utils/seatIndex.ts | 42 + src/utils/venueBounds.ts | 42 + 33 files changed, 6508 insertions(+), 4825 deletions(-) create mode 100644 .gitattributes create mode 100644 docs/screenshots/booking-history.png create mode 100644 docs/screenshots/overview.png create mode 100644 docs/screenshots/seat-selection.png create mode 100644 docs/ui-ux-and-business-logic-flow.md create mode 100644 public/llms.txt create mode 100644 public/robots.txt create mode 100644 src/components/BookingHistoryPanel.tsx create mode 100644 src/components/ConfirmDialog.tsx create mode 100644 src/components/Icon.tsx create mode 100644 src/components/IconButton.tsx create mode 100644 src/components/SeatSelectionFooter.tsx create mode 100644 src/components/SeatSelectionPanel.tsx delete mode 100644 src/components/SectionSkeleton.tsx delete mode 100644 src/components/Stage.tsx create mode 100644 src/utils/rowLetter.ts create mode 100644 src/utils/seatIndex.ts create mode 100644 src/utils/venueBounds.ts diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/README.md b/README.md index 143c88d..e38c8a9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![pnpm](https://img.shields.io/badge/pnpm-package%20manager-F69220?logo=pnpm&logoColor=white)](https://pnpm.io) A high-performance, interactive seating map for large venues, built to handle **15,000+ seats** -with smooth panning, zooming, keyboard navigation, and persisted selection โ€” without shipping a +with smooth panning, zooming, keyboard navigation, and persisted selection - without shipping a canvas/WebGL engine or a virtualization library. --- @@ -15,16 +15,26 @@ canvas/WebGL engine or a virtualization library. A venue booking UI has to render every seat in a venue (this project's sample data: 10 sections ร— 30 rows ร— 50 seats = **15,000 seats**) as an individually selectable, keyboard-navigable element, while staying responsive to pan, zoom, and selection changes. Rendering 15,000 live SVG nodes at -once is the naive approach โ€” and it's slow: every zoom/selection change forces the browser to +once is the naive approach - and it's slow: every zoom/selection change forces the browser to diff, layout, and paint tens of thousands of DOM nodes. This project's core engineering problem is keeping the map interactive at that scale using nothing heavier than React + SVG. -## ๐Ÿ“ธ Screenshot +## ๐Ÿ“ธ Screenshots -> _A screenshot/GIF of the running map (pan, zoom, section drill-in, seat selection) belongs here._ -> This environment couldn't produce one without installing a browser automation toolchain outside -> this repo's dependency scope โ€” run `pnpm dev` locally and drop an image at `docs/screenshot.png` -> to replace this note. +**Overview** - the full venue map with all 10 sections collapsed, and the Booking History sidebar +in its default state. + +![Venue overview](docs/screenshots/overview.png) + +**Section drill-in & seat selection** - every seat status (available, selected, sold, reserved, +held) visible at once, with the live selected-seats list and running total in the sidebar. + +![Seat selection](docs/screenshots/seat-selection.png) + +**Booking History** - completed purchases are grouped and listed; clicking one highlights its +exact seats back on the map. + +![Booking history with a highlighted past booking](docs/screenshots/booking-history.png) --- @@ -49,14 +59,15 @@ flowchart TD The map never mounts all 15,000 seats as DOM nodes at once. [`Section.tsx`](src/components/Section.tsx) renders each **inactive** section as a single collapsed `` "cover" shape traced around its -outer row (one SVG node, regardless of how many seats it contains). Only the **one active** section -โ€” the one the user clicked into โ€” mounts individual seat `` nodes via [`Seat.tsx`](src/components/Seat.tsx). -That caps live, interactive seat nodes at ~1,500 (one section) instead of 15,000, at any given time. +outer row (one SVG node, regardless of how many seats it contains). Only the **one active** +section (the one the user clicked into) mounts individual seat `` nodes via +[`Seat.tsx`](src/components/Seat.tsx). That caps live, interactive seat nodes at ~1,500 (one +section) instead of 15,000, at any given time. This is a deliberate alternative to two heavier options: - **Canvas/WebGL**: gives raw rendering throughput but throws away native SVG accessibility - (focus, `role`, `aria-*`) and hit-testing โ€” you'd have to reimplement both by hand. + (focus, `role`, `aria-*`) and hit-testing - you'd have to reimplement both by hand. - **Row/column virtualization** (`react-window`/`react-virtualized`): built for linear lists, not an SVG coordinate space with seats laid out on radial rows. Section-level collapsing matches this venue's natural UX unit (users think in sections, not in a scrollable seat list) and needs no @@ -68,11 +79,11 @@ cover path. ### Zustand persistence strategy -Selected seats survive a page refresh via Zustand's `persist` middleware โ€” but `selectedSeats` is +Selected seats survive a page refresh via Zustand's `persist` middleware - but `selectedSeats` is a `Set`, and `JSON.stringify` can't round-trip a `Set` on its own. [`seatStore.ts`](src/store/seatStore.ts) supplies a custom `PersistStorage` that serializes `Set โ†” string[]` on `getItem`/`setItem`, so `localStorage` only ever stores an array, while the in-memory store keeps `O(1)` `has()`/`add()`/ -`delete()` lookups for selection toggling. `partialize` scopes persistence to `selectedSeats` only โ€” +`delete()` lookups for selection toggling. `partialize` scopes persistence to `selectedSeats` only - `zoom`, `activeSectionId`, and transient `feedback` state are intentionally not persisted. See [`docs/engineering-notes.md`](docs/engineering-notes.md) for the tradeoffs behind these @@ -85,8 +96,8 @@ decisions and where they'd need to change at greater scale. - Every seat is a real interactive element: `role="checkbox"`, `aria-checked` reflecting selection, `aria-label` describing row/seat/price/status, and `aria-disabled` for sold/reserved/held seats. - **Roving keyboard navigation**: only the active section's seats are focusable (`tabIndex={0}`, - or `-1` when unavailable). Arrow keys move focus seat-to-seat โ€” `ArrowLeft`/`ArrowRight` within a - row, `ArrowUp`/`ArrowDown` to the nearest seat (by x-position) in the adjacent row โ€” and + or `-1` when unavailable). Arrow keys move focus seat-to-seat - `ArrowLeft`/`ArrowRight` within a + row, `ArrowUp`/`ArrowDown` to the nearest seat (by x-position) in the adjacent row - and `Enter`/`Space` toggle selection, matching native checkbox semantics. - Feedback that used to be a blocking `alert()` (hitting the 8-seat cap, the payment stub) is now an `aria-live="polite"` [`Toast`](src/components/Toast.tsx) region and inline confirmation state, @@ -130,7 +141,8 @@ See [Engineering standards](#-engineering-standards) below for details. ```text โ”œโ”€โ”€ docs/ -โ”‚ โ””โ”€โ”€ engineering-notes.md # Tradeoffs and performance bottlenecks +โ”‚ โ”œโ”€โ”€ engineering-notes.md # Tradeoffs and performance bottlenecks +โ”‚ โ””โ”€โ”€ screenshots/ # README screenshots โ”œโ”€โ”€ public/ โ”‚ โ””โ”€โ”€ venue.json # Generated seating data served to the client โ”œโ”€โ”€ scripts/ @@ -159,8 +171,8 @@ See [Engineering standards](#-engineering-standards) below for details. ### Prerequisites - **Node.js** `>=24 <25` (see `engines` in `package.json`) -- **pnpm** (this project uses pnpm, not npm/yarn โ€” a `pnpm-lock.yaml` is committed) -- **Gitleaks v8.30.1** on `PATH` โ€” required by the pre-commit hook (see [Secret scanning](#secret-scanning-gitleaks)) +- **pnpm** (this project uses pnpm, not npm/yarn - a `pnpm-lock.yaml` is committed) +- **Gitleaks v8.30.1** on `PATH` - required by the pre-commit hook (see [Secret scanning](#secret-scanning-gitleaks)) ### Installation & Setup @@ -199,7 +211,7 @@ pnpm run generate:venue ## ๐Ÿ”’ Environment Variables -There are **no environment variables** โ€” seating data is served from the static `public/venue.json`, not an API. If a real backend is introduced later, add a Zod-validated env module rather than reading `import.meta.env` directly in components. +There are **no environment variables** - seating data is served from the static `public/venue.json`, not an API. If a real backend is introduced later, add a Zod-validated env module rather than reading `import.meta.env` directly in components. --- @@ -211,7 +223,7 @@ pnpm test Covers seat selection/deselection, the 8-seat selection cap, clearing the selection, the persisted-seats `localStorage` round trip, and keyboard navigation (arrow keys, Enter/Space, -skipping unavailable seats) โ€” see [`src/store/seatStore.test.ts`](src/store/seatStore.test.ts) and +skipping unavailable seats) - see [`src/store/seatStore.test.ts`](src/store/seatStore.test.ts) and [`src/components/Seat.test.tsx`](src/components/Seat.test.tsx). --- @@ -229,18 +241,18 @@ This project follows the React engineering standards. - **Prettier** (`.prettierrc.json`) is the single source of formatting truth. Run `pnpm run format`, or let the pre-commit hook format staged files for you. - **TypeScript** runs in strict mode plus `noUncheckedIndexedAccess` and - `exactOptionalPropertyTypes` โ€” guard indexed access explicitly instead of asserting it away. -- `pnpm run quality` runs format-check, lint, and typecheck together โ€” this is what CI runs too. + `exactOptionalPropertyTypes` - guard indexed access explicitly instead of asserting it away. +- `pnpm run quality` runs format-check, lint, and typecheck together - this is what CI runs too. ### Git hooks (Husky) Installed via `pnpm run prepare`. Two hooks live in `.husky/`: -- **`pre-commit`** โ€” scans the staged diff with Gitleaks, then runs `lint-staged` +- **`pre-commit`** - scans the staged diff with Gitleaks, then runs `lint-staged` (ESLint `--fix` + Prettier) on the files you're committing. -- **`commit-msg`** โ€” runs `commitlint` against your commit message. +- **`commit-msg`** - runs `commitlint` against your commit message. -Don't bypass either hook with `--no-verify` to get past a genuine failure โ€” fix the issue instead. +Don't bypass either hook with `--no-verify` to get past a genuine failure - fix the issue instead. ### Commit messages @@ -261,7 +273,7 @@ The pre-commit hook requires the `gitleaks` binary on `PATH` and **fails closed* GitHub Actions independently re-scans full repository history with the same pinned version, so a bypassed local hook is still caught in CI. -**False positives:** investigate every finding first. Only add a narrowly scoped exception in `.gitleaks.toml` after a real secret has been ruled out, with a comment explaining why โ€” never a blanket allowlist โ€” and re-run the scan afterward. +**False positives:** investigate every finding first. Only add a narrowly scoped exception in `.gitleaks.toml` after a real secret has been ruled out, with a comment explaining why - never a blanket allowlist - and re-run the scan afterward. ### Continuous integration diff --git a/docs/engineering-notes.md b/docs/engineering-notes.md index 36e766c..2656850 100644 --- a/docs/engineering-notes.md +++ b/docs/engineering-notes.md @@ -18,19 +18,19 @@ naturally matches the venue's real-world browsing pattern (pick a section, then **Bottleneck this leaves in place:** the _active_ section still mounts all of its seats at once (~1,500 in the current 10ร—30ร—50 sample venue). That's fine at this scale, but a venue with, say, -5,000 seats in a single section would need row-level virtualization _within_ the active section โ€” +5,000 seats in a single section would need row-level virtualization _within_ the active section - this codebase doesn't have that yet. ## Why SVG over Canvas/WebGL -SVG gives native accessibility (`role`, `aria-*`, real DOM focus) and hit-testing for free โ€” every +SVG gives native accessibility (`role`, `aria-*`, real DOM focus) and hit-testing for free - every seat is a real, individually focusable element without any custom hit-testing code. Canvas/WebGL would render faster at very large scale, but every one of those things (focus order, screen-reader semantics, click targets) would need to be reimplemented by hand against an off-screen model. **Where this stops scaling:** SVG's per-node overhead (DOM presence, style recalculation, event listener) becomes the bottleneck somewhere in the tens-of-thousands of simultaneously-mounted -nodes โ€” this project stays well under that by only ever mounting one section's seats. If a future +nodes - this project stays well under that by only ever mounting one section's seats. If a future requirement needs _all_ sections' seats interactive simultaneously (e.g., a full-venue heatmap), that's the point to reach for Canvas with a manual hit-testing layer, or a WebGL instanced-rendering approach, accepting the accessibility rebuild that comes with it. @@ -40,7 +40,7 @@ approach, accepting the accessibility rebuild that comes with it. `Section` and `Seats` (in [`Seat.tsx`](../src/components/Seat.tsx)) are both `React.memo`-wrapped so that panning/zooming or selecting a seat in one section doesn't re-render every other section's already-collapsed cover path. Within `Seats`, per-seat fill/stroke colors and the tier-color map are -recomputed on every render of that component โ€” acceptable at ~1,500 seats, but the first thing to +recomputed on every render of that component - acceptable at ~1,500 seats, but the first thing to hoist out (e.g., derive style from a lookup keyed by `status`/`priceTier` computed once) if a section's seat count grows materially. @@ -50,9 +50,9 @@ section's seat count grows materially. `PersistStorage` that serializes the `Set` to a plain array. This is enough for the current scope (survive a page refresh, single device, no login) but has real limits: -- `localStorage` has a per-origin size ceiling (typically ~5โ€“10MB depending on browser) โ€” irrelevant +- `localStorage` has a per-origin size ceiling (typically ~5โ€“10MB depending on browser) - irrelevant at 8 selected seats, but the pattern shouldn't be reused to persist large datasets. -- No cross-device or cross-session sync โ€” selections don't follow a user between browsers or +- No cross-device or cross-session sync - selections don't follow a user between browsers or devices, and there's no server-side hold/reservation, so two tabs (or two people) could both believe they've selected the same seat. - A real backend would replace this with a server-held reservation (with a TTL/hold expiry) and use @@ -62,6 +62,6 @@ scope (survive a page refresh, single device, no login) but has real limits: - No virtualization within an active section's own seat list (see above). - The "Proceed to Pay" flow (see [`BookingSummary.tsx`](../src/components/BookingSummary.tsx)) is an - intentional UI stub โ€” it shows an inline confirmation, not a real payment integration. + intentional UI stub - it shows an inline confirmation, not a real payment integration. - Seat availability (`sold`/`reserved`/`held`) is static sample data with no live update mechanism - (no websocket/polling) โ€” a second user selecting the same seat isn't reflected without a refresh. + (no websocket/polling) - a second user selecting the same seat isn't reflected without a refresh. diff --git a/docs/screenshots/booking-history.png b/docs/screenshots/booking-history.png new file mode 100644 index 0000000000000000000000000000000000000000..2878885a2fe437db82428576b3653d6b7d7a39a4 GIT binary patch literal 269038 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 J7Tfq={T~;q_Rs(T literal 0 HcmV?d00001 diff --git a/docs/screenshots/overview.png b/docs/screenshots/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..526392cf8023b698df8274f4176df954f3631baf GIT binary patch literal 306945 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

5}XNGe$Yfk#0k%bi- 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�Fn?w}_H4DhT%tUDI+;N(W9&;v; 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 AdjJ3c literal 0 HcmV?d00001 diff --git a/docs/screenshots/seat-selection.png b/docs/screenshots/seat-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..17913209085baf5101cefd5af33371afacc49cc0 GIT binary patch literal 342304 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�WAQa4-(FsR%)Y5M%JYR+Q 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
v>5dcgmfk)3-%ht=#37H`EMD9NoIGXon(iH%| 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
yu$-B1CKTRVLq?v)LUY z(+jzyeysCRv~hjK;@cFU;^Xm!A}u&7`aIMq_?aWpNxhe@E72*(j;{Tfb6vK(S>pJc zFm&jJ^1C@rSXjGFPN6!2AQQtW5X)I&<8O5N$))xnp8s$`y<77;&n$*+(S(P~iPP4P zG#OQnZo$X24n!=&OI|;fciaaCUdI2efcjVA52d~Be=bNe8L_{o@9}A6{z*x~Aw%&Shh~en^sjMvscvE+!-@Y)1(0W5 zlqIToZre{V{&uhB=!*4P{iwBR0o&39Tg717)T||ty32VT&qSpVdf!+dhLU&XIZ;zf zIHD--*d+z_uj0O+fjThNWDcWTIYvy(QoH%2KTM!LrcwCil@@dksvFzm;l ztb@eB^ajY6d5-n0xW)G)5$wO;PW|E#t~+I`(bW^{o#1(R!FFM40wG7Fy}K(X4aim3^?$=AH`}pWgtn-}_C|6P`U6CAITuF49HVWlAfS zPAPZG`--DU4%mu^Ek)u+A41P{63=I3w`?jYQV^~UGFJZitIp%VDsm(#8N2-po%*8 zpycEm^Sj9xsTS#(yPlPkYY`Isz>dQ}Ae*d0h7BoUV~&ga#tN$a`?s0YcIroZn?4Kg z$JMw=1axh67@WjRElK=SM)7=~#&xlHNrz<5wov82)x%5so`?UN<^JS@WZUqf7OFeB znfx1`ul7tU-ACtq`Jkkj^X8vNwb=m|m1l^Lj)pda*o#{#AW%Y$BtMJTKuY%H?UbWg zFa?Exp_^n(gVmhVjaN-Svo-=d5ts4?;7y=i93Ak#dBb!y@Eb8-ZLLvao<)^Uk8s}d zPgP2rP^seV(W)!o`55vt8#Co->w18h$+mTE<<={pEdR@el*jH$%k}x;jI_`fkxuhL z;ixe;p(C&B1zCjK(#*(+h3AK%!k$Ag7r-bvR2vEmq(@v`Pm8>H5k-Sq`F-U|Fd0St zp9wbVNv=9Y@bMH5B%wZe-p#$Q;JgLm=iG@B-)H8zvx6pqZRw+uoqzoZffxY9ffAts zSh{pnVB_@?)X&as7>1HMI->xu09Uj-FU*h1i}g%m%(X5B#-d z;02|OTwLqNoSc{;{+u@@YH6qY{0ocvw{MTrkG}|^) zY}DxJ_Ty{pHkWRPUj-7+B^�rslAlV1oasaqs8f!Nx6)mM# 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 literal 0 HcmV?d00001 diff --git a/docs/ui-ux-and-business-logic-flow.md b/docs/ui-ux-and-business-logic-flow.md new file mode 100644 index 0000000..f8a8400 --- /dev/null +++ b/docs/ui-ux-and-business-logic-flow.md @@ -0,0 +1,717 @@ +# UI/UX & Business Logic - Technical Flow + +This document walks through **exactly how the current codebase behaves**, end to end: every UI +state, every interaction, and every business rule, with the file/line it lives in. It complements +[`README.md`](../README.md) (project overview, setup) and +[`engineering-notes.md`](engineering-notes.md) (performance tradeoffs) - this file is the "what +happens when you click X" reference. + +--- + +## 1. Architecture at a glance + +```mermaid +flowchart TD + A["App.tsx
loading/error/data states, zoom, pan, mobile sidebar"] --> B["useVenue()
fetch /venue.json"] + A --> C[VenueMap.tsx] + A --> D[BookingSummary.tsx] + A --> E[Toast.tsx] + C --> F["Section.tsx ร— 10
collapsed or active"] + F -->|active only| G["Seat.tsx (Seats)
~1,500 seat + label nodes"] + A --> H["seatStore (Zustand)
zoom ยท activeSectionId ยท selectedSeats ยท soldSeats ยท bookings ยท viewingBookingId ยท feedback"] + H -.persist.-> I[(localStorage: selectedSeats + soldSeats + bookings)] + D -.reads/writes.-> H + G -.reads/writes.-> H + F -.reads/writes.-> H + H -.feedback.-> E +``` + +Single-page app, no router. `App.tsx` owns page-level UI state (loading/error, mobile sidebar, +mouse-drag panning); `seatStore` (Zustand) owns cross-component venue state (zoom, which section is +open, which seats are selected/sold, transient toast feedback). + +--- + +## 2. Data model + +[`venue.interfaces.ts`](../src/interfaces/venue.interfaces.ts): + +```ts +SeatStatus = 'available' | 'reserved' | 'sold' | 'held' +ISeat = { id, col, x, y, priceTier, status } +Row = { index, seats: ISeat[] } +Section = { id, label, transform, rows: Row[] } +Venue = { venueId, name, map: { width, height }, sections: Section[] } +``` + +Generated once by [`scripts/generateVenue.ts`](../scripts/generateVenue.ts) into +`public/venue.json`: **10 sections ร— 30 rows ร— 50 seats = 15,000 seats**, arranged radially around +a 2400ร—2400 coordinate space. Price tier by row index: rows 0โ€“4 โ†’ tier 1 (front, priciest), 5โ€“14 โ†’ +tier 2, 15โ€“29 โ†’ tier 3 (back, cheapest). `status` is seeded per seat (~70% `available`, ~15% +`sold`, ~10% `reserved`, ~5% `held` - see ยง14) rather than uniformly `available`. + +`x`/`y` per seat are pre-computed polar coordinates (already resolved to cartesian) - no +trigonometry happens at render time, only at generation time. + +--- + +## 3. State: `seatStore` ([`seatStore.ts`](../src/store/seatStore.ts)) + +| Field | Type | Persisted? | Set by | +| ------------------ | ------------------------- | ---------------------- | ------------------------------------------------------------------------------- | +| `zoom` | `number` | โŒ | fit-on-load effect, zoom buttons, section open/close, resume-selection effect | +| `activeSectionId` | `string \| null` | โŒ | clicking/keying a section, clicking the empty map background, viewing a booking | +| `selectedSeats` | `Set` | โœ… (custom serializer) | `toggleSeat`, `clearSelection`, `confirmPurchase` (empties it) | +| `soldSeats` | `Set` | โœ… (custom serializer) | `confirmPurchase` (adds the seats just paid for) | +| `bookings` | `Booking[]` | โœ… (plain JSON) | `confirmPurchase` (prepends the new booking; newest first) | +| `viewingBookingId` | `string \| null` | โŒ | `viewBooking`/`clearViewingBooking`, cleared by any `toggleSeat` call | +| `feedback` | `{type, message} \| null` | โŒ | `toggleSeat` (max-seat cap), cleared by `Toast` after 4s or dismiss | + +**Persistence**: `partialize` scopes `localStorage` (`key: venue-storage`) to `selectedSeats`, +`soldSeats`, **and** `bookings`. Since `Set` isn't JSON-native, a custom `PersistStorage` converts +each `Set โ†” string[]` on `getItem`/`setItem` (`bookings` is a plain array of plain objects, +so it round-trips through `JSON.stringify`/`parse` with no custom conversion needed) - `zoom`, +`activeSectionId`, `viewingBookingId`, and `feedback` are intentionally transient and reset on +reload. + +**`toggleSeat(seatId)`** - the core selection rule: + +``` +if already selected โ†’ remove it +else if selectedSeats.size >= MAX_SELECTABLE_SEATS (8) โ†’ set feedback (error toast), no-op +else โ†’ add it +``` + +Also always clears `viewingBookingId` - starting or editing a live selection supersedes browsing +past booking history, so the two sidebar modes (ยง8) never end up fighting over what the map should +show. No server round-trip, no optimistic-lock/race handling - purely local `Set` mutation. + +**`confirmPurchase(total)`** - the checkout transition (see ยง14 for the full picture): + +```ts +const newBooking: Booking = { + id: `BK-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, + seatIds: Array.from(state.selectedSeats), + total, + createdAt: Date.now(), +}; +return { + soldSeats: new Set([...state.soldSeats, ...state.selectedSeats]), + selectedSeats: new Set(), + bookings: [newBooking, ...state.bookings], + viewingBookingId: newBooking.id, +}; +``` + +Moves whatever's currently selected into `soldSeats` (persisted, so it survives a reload), records +it as one `Booking` grouping those seats together (so history can show/highlight them as a unit +rather than as loose entries in the flat `soldSeats` set), immediately "views" that new booking, +and empties the cart - as opposed to `clearSelection()`, which just abandons the cart with no sale. +`total` is passed in by the caller +([`BookingSummary.tsx`](../src/components/BookingSummary.tsx), via +[`SeatSelectionFooter.tsx`](../src/components/SeatSelectionFooter.tsx)'s Proceed to Pay button) +rather than computed here, since per-seat pricing lives in `venue` data the store doesn't hold. + +**`viewBooking(id)` / `clearViewingBooking()`** - set/clear which past booking (if any) should +currently render its seats with the highlight ring described in ยง7; driven entirely by +[`BookingHistoryPanel.tsx`](../src/components/BookingHistoryPanel.tsx) (ยง8). + +--- + +## 4. Boot sequence & top-level UI states ([`App.tsx`](../src/App.tsx)) + +`useVenue()` ([`useVenue.ts`](../src/hooks/useVenue.ts)) fetches `/venue.json` once on mount and +exposes `{ venue, loading, error, refetch }`. `App` renders one of four exclusive states: + +1. **Loading** - centered spinner, `role="status" aria-live="polite"`, visible "Loading seating + mapโ€ฆ" label. +2. **Error** - `role="alert"` card (icon, message, **Try again** button calling `refetch()`, which + re-runs the fetch effect via an internal retry-token state). +3. **No venue** (fetch succeeded but returned nothing) - plain empty-state card. +4. **Main app** - the seating map + booking sidebar (below). + +### Fit-to-viewport zoom (runs once venue loads) + +``` +availableWidth = mapContainer.clientWidth - 64 (fallback: window.innerWidth - sidebar - 64) +availableHeight = mapContainer.clientHeight - 64 (fallback: window.innerHeight - 64) +bounds = getVenueContentBounds(venue) // seats' real x/y extent + padding - see below +fitScale = min(availableWidth / bounds.width, availableHeight / bounds.height, 4) ร— 0.96 +``` + +Uses the _real_ container size (via `mapContainerRef`), checking **both** dimensions - a +width-only calculation was an earlier bug that let the map render taller than the viewport. The +trailing `ร— 0.96` (`FIT_SAFETY_MARGIN`) guarantees a small buffer so the fitted content never lands +exactly at the container's edge, which would otherwise risk forcing a scrollbar on its own - an +artifact of measuring `clientWidth`/`clientHeight` before vs. after a scrollbar appears. + +`computeFitZoom()` is shared between this effect and the **Reset view** button (ยง5), so the two +can never drift out of sync with each other. + +**Resume-selection branch**: if `selectedSeats` was restored from `localStorage` (non-empty), the +effect instead finds which section contains the first selected seat, calls +`setActiveSection(that section)` and `setZoom(2.5)`, and skips the fit-zoom entirely - so reloading +mid-selection drops you back into that section, already zoomed in. + +--- + +## 5. Zoom & pan + +| Control | Behavior | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **`+` / `โˆ’` buttons** | `zoom ยฑ 0.2`. Floor: `0.2` (`MIN_ZOOM`). **No ceiling** - zoom can increase indefinitely. Does _not_ try to keep any point centered; it's a plain `setZoom(...)` call. | +| **Reset view button** | Calls `setActiveSection(null)` (collapses whatever section is open) then re-runs the same `computeFitZoom()` the initial load uses - a one-click way back to the clean default view. | +| **Click-drag** | `onMouseDown` captures `{clientX + scrollLeft, clientY + scrollTop}` as an anchor; `onMouseMove` sets `scrollLeft/Top = anchor โˆ’ currentClientXY`. Cursor swaps `grab` โ†” `grabbing`. | +| **Native scroll / touch** | The map container is a plain `overflow-auto` element, so trackpad/touch scrolling works for free alongside the custom drag handler. | +| **Section click** | Sets `zoom = 5` (in [`Section.tsx`](../src/components/Section.tsx)) - high enough that seat numbers/row letters (see ยง7) are legible immediately, not just after manual zooming. | + +Every zoom change (buttons, reset, section open/close) animates smoothly rather than snapping: the +`` in `VenueMap.tsx` carries `style={{ transition: 'width 300ms ease-out, height 300ms +ease-out' }}`. Modern browsers treat an ``'s `width`/`height` as CSS-animatable presentation +properties, so this alone is enough - no JS-driven interpolation loop needed. Confirmed by sampling +the rendered width mid-transition in a real browser (e.g. partway between the pre- and post-zoom +values, not an instant jump). + +The map wrapper uses Tailwind's `items-center-safe`/`justify-center-safe` (flex "safe" alignment): +content is centered while it fits the viewport, but once it overflows, alignment falls back to +normal start-aligned/fully-scrollable behavior instead of making one side unreachable - the classic +flexbox-centering-plus-overflow trap. + +**A real, fixed bug worth knowing about**: the map `` must carry `shrink-0` - as a flex child +it would otherwise be silently compressed along the row axis (default `flex-shrink: 1`), squashing +the circle and capping horizontal scroll at the container's own width. See +[`VenueMap.tsx`](../src/components/VenueMap.tsx). + +**A second, subtler bug in the same area, since fixed**: fitting the zoom to the venue's _content_ +bounds (above) isn't enough on its own - `VenueMap.tsx`'s `` used to always render at the +_full_ `venue.map.width/height` (2400ร—2400) canvas size scaled by zoom, regardless of what zoom was +chosen for. Since the content only occupies ~54% of that canvas, the rendered DOM element was still +oversized relative to the viewport in whatever dimension wasn't the binding constraint, which forced +a permanent scrollbar even though nothing was actually being clipped. The fix: +[`getVenueContentBounds()`](../src/utils/venueBounds.ts) is now also used inside `VenueMap.tsx` to +crop the SVG's own `viewBox`/`width`/`height` to the content region - so the rendered element's size +matches what's actually drawn, not the full padded canvas. Because that changes the SVG's own pixel +origin (the viewBox's top-left is now `bounds.minX`/`minY`, not `0, 0`), +[`Section.tsx`](../src/components/Section.tsx)'s scroll-to-center effect (ยง6) has to subtract that +offset before scaling by zoom - it now takes `bounds` as a prop for exactly that. + +--- + +## 6. Section interaction ([`Section.tsx`](../src/components/Section.tsx)) + +Each of the 10 sections is one ``, clickable **and** keyboard +operable (`Enter`/`Space`), with `aria-expanded` and a descriptive `aria-label`. + +- **Collapsed** (default): renders as a single traced `` "cover" shape (outline of its outer + row), a section-label ``, and a subtle hover/focus ring - one SVG node regardless of how + many seats the section holds. +- **Active** (clicked/activated): swaps to an invisible hit-target overlay `` (so clicking + inside the section's silhouette doesn't bubble up and deactivate it) plus ``, + which mounts every seat in that section individually. +- Clicking a section toggles it: opening one sets `zoom = 5`; clicking the already-open section (or + clicking empty map background, handled in `VenueMap.tsx`) closes it, leaving zoom as-is. +- On becoming active, a `useEffect` computes the section's bounding-box center and smooth-scrolls + the map container to it (150ms delay to let the zoom/DOM update land first). +- `Section` is `React.memo`-wrapped - panning, zooming, or selecting a seat inside the active + section never re-renders the other 9 (collapsed) sections. + +**Open/close fade animation**: the active and collapsed branches both render into a `` (`@keyframes section-activate` in `index.css`, a 250ms opacity +0โ†’1 fade, skipped under `prefers-reduced-motion`), so swapping between them fades in rather than +snapping. **A real, fixed bug worth knowing about**: giving both branches the _same_ class name +isn't enough on its own - since both branches render the same element type (``) at the same +position in the tree, React reconciles them as an in-place _update_ of one persistent DOM node +rather than an unmount+remount. The `section-activate` class was present on that node continuously +across the toggle, so its computed `animation-name` never actually changed, and CSS never +restarts an animation that isn't changing - the fade silently never played, even though the class +was "correctly" applied in both branches. Fixed with `key="active"` / `key="collapsed"` on the two +``s, which forces React to treat them as distinct elements and genuinely remount on every +toggle, so the animation restarts every time. Confirmed in a real browser: sampling opacity ~30ms +and ~90ms after clicking a (previously-collapsed) section shows it ramping through intermediate +values (e.g. `0.40` โ†’ `0.90`) before settling at `1`, rather than reading `1` throughout. + +--- + +## 7. Seat interaction ([`Seat.tsx`](../src/components/Seat.tsx)) + +Only rendered for the one active section (~1,500 `` nodes at once, never all +15,000). Each seat: + +- Square ``, `3ร—3` units, `rx=0.35` (a clean rounded square, not the circular "dot" look an + earlier, proportionally-larger corner radius produced at small render sizes). +- Fill/stroke colors come from CSS custom properties defined once in + [`index.css`](../src/index.css)'s `@theme` block (`--color-seat-*`, `--color-tier-*`) - a single + source of truth shared with the legend swatches in `BookingSummary`, so they can't drift apart. +- **Seat number** (`seat.col`) and a **row letter** (`A, B, โ€ฆ Z, AA, AB, โ€ฆ`, spreadsheet-style, so + it never runs out) render as `` - but _only_ once `zoom >= 2`. Below that threshold the + ~1,500 extra label nodes simply aren't mounted at all, rather than rendering illegibly small text. +- `role="checkbox"`, `aria-checked`, `aria-disabled` (sold/reserved/held), `aria-label` describing + row/seat/price/status, `tabIndex={0}` (or `-1` if unavailable) - real roving-focus keyboard + navigation, not a custom widget bolted onto a `

`. + +**Color states** (fill unless noted): + +| State | Fill | Stroke | +| --------- | ------------- | --------------------------------------------------------- | +| Available | white | tier color (border only) | +| Selected | emerald green | white ring (blue while it still has keyboard/click focus) | +| Sold | light gray | none | +| Reserved | amber | none | +| Held | red | none | + +**Click / Enter / Space** โ†’ `toggleSeat(seat.id)` (store) then `.focus()` the element - so keyboard +users land exactly where they just acted. + +**Arrow-key navigation** (`handleKeyDown`): + +- `ArrowLeft`/`ArrowRight` โ†’ focus `seatIndex ยฑ 1` within the same row. +- `ArrowUp`/`ArrowDown` โ†’ focus `rowIndex ยฑ 1`, choosing whichever seat in that row has the + **closest `x` coordinate** (rows curve, so "same column" isn't a fixed index) - a linear scan + over that row's seats. + +A seat counts as unavailable (`sold`/`reserved`/`held`) if either `seat.status` says so, **or** its +ID is in the persisted `soldSeats` set (see ยง14) - either way it's `tabIndex={-1}` and ignored by +both click and keyboard handlers (`isUnavailable` guard at the top of `handleInteraction`). + +**Booking-history highlight**: independent of the table above, a seat whose ID is in the currently +`viewingBookingId` booking's `seatIds` (see ยง8) additionally gets a violet ring +(`--color-booking-highlight`) plus a continuously-looping `seat-highlight-pulse` glow +(`filter: drop-shadow(...)`, `prefers-reduced-motion`-gated) - layered on top of, not replacing, +its normal status color (almost always "sold", since bookings are only ever created from a +completed purchase). It's deliberately a looping indicator rather than a one-shot flash: it's +meant to keep marking "these are the seats from the booking you're looking at" for as long as that +booking stays open in history, not to celebrate a single moment. + +--- + +## 8. Booking sidebar & checkout ([`BookingSummary.tsx`](../src/components/BookingSummary.tsx)) + +`BookingSummary` is a thin container with three stacked regions: a fixed header, a **scrollable** +middle region, and (only in selection mode) a **pinned, non-scrolling footer**: + +``` +
+ + +``` + +``` +showSelectionPanel = selectedSeats.size > 0 || confirmedTotal !== null +``` + +- **[`SeatSelectionPanel.tsx`](../src/components/SeatSelectionPanel.tsx)** - the scrollable + selected-seats list, shown the moment the user selects a seat. +- **[`SeatSelectionFooter.tsx`](../src/components/SeatSelectionFooter.tsx)** - Total Amount + + Proceed to Pay, rendered as `BookingSummary`'s own sibling **outside** the scrollable region. + **A real, fixed bug worth knowing about**: this used to live inside the same + `overflow-y-auto` region as the seat list (as part of `SeatSelectionPanel`) - with 8 seats + selected (the max), Proceed to Pay could end up scrolled below the fold, technically reachable + but not actually visible without scrolling past every seat row first, which fails the plain + expectation that a primary checkout action stays put. Splitting it into its own component and + rendering it as a pinned footer (not inside the `overflow-y-auto` div) fixes this regardless of + how many seats are selected or how tall the venue's own legend/list content gets. `total` is + computed once in `BookingSummary` (via the same shared `buildSeatIndex(venue)`) and passed down, + since the footer needs it but lives outside the component that used to own that calculation. +- **[`BookingHistoryPanel.tsx`](../src/components/BookingHistoryPanel.tsx)** - the default view, + shown whenever nothing is currently selected and no just-completed purchase is still on screen. + +The switch is automatic and has no separate "mode" state of its own - it's a pure function of +`selectedSeats.size` and the local `confirmedTotal` (see below), so selecting a seat, clearing the +cart, or finishing a purchase all naturally land on the right panel with no explicit transition +code. + +- **Price Tiers / Seat Status legend** - static reference using the same shared color tokens as the + map. Tier names/prices come from a shared `TIERS` map in + [`utils/seatIndex.ts`](../src/utils/seatIndex.ts): `1 โ†’ Premium Stand ($7000)`, + `2 โ†’ Standard Stand ($3000)`, `3 โ†’ Gallery Stand ($1500)` (fallback `Standard Ticket`/`$50` for + an unrecognized tier number) - the same module both panels below use, so seat pricing/labels + can't drift between them. + +### `SeatSelectionPanel.tsx` + +- **Selected Seats list** - derived via `useMemo` from `buildSeatIndex(venue)` (one + seatId โ†’ `{section, row, seatCol, tierName, price}` lookup, built once per venue and shared with + Booking History rather than re-walking `venue.sections` separately in each place); each entry + shows `Section | Row | Seat `, its price, and its tier name as the subtitle. The + row is shown as the same letter the map uses (via the shared + [`rowLetter`](../src/utils/rowLetter.ts) helper) rather than the raw 1-based `row.index` - those + two used to disagree ("Row 15" in the sidebar for the seat labeled "P" on the map). +- **Total** - `sum` of the selected seats' prices, recomputed on every selection change. +- **Clear** - visible only when โ‰ฅ1 seat selected; opens a [`ConfirmDialog`](../src/components/ConfirmDialog.tsx) + ("Clear all selected seats?") rather than clearing immediately - confirming calls + `clearSelection()`. This abandons the cart - it does **not** mark anything sold. The dialog is + rendered via `createPortal(..., document.body)`: without it, `position: fixed` inside it would be + contained by the sidebar wrapper's own `translate-x-*` transform (used for the mobile slide-in), + not the real viewport - a CSS `transform` on any ancestor creates a new containing block for + fixed descendants, which silently confined the dialog+backdrop to the sidebar's own column. The + dialog also sets `inert` on the `#root` app element for as long as it's open (removed on + unmount), so keyboard `Tab` can't reach seats/buttons behind it - the backdrop button alone only + ever blocked mouse clicks, not focus navigation. + +### `SeatSelectionFooter.tsx` + +- **Total** - `sum` of the selected seats' prices, computed in `BookingSummary` (not here) and + passed down as a prop, since this component is rendered outside the scrollable region + `SeatSelectionPanel` lives in and needs its own copy of the total regardless. +- **Proceed to Pay**: + - Disabled (gray) while `selectedSeats.size === 0`. + - On click, `BookingSummary` (the parent) captures `total` into local `confirmedTotal` state + **and calls `confirmPurchase(total)`** - the selected seats move into the persisted `soldSeats` + set, a new `Booking` record is prepended to `bookings`, that new booking becomes the one + "viewed" (`viewingBookingId`), and the cart empties. See ยง14 for the full lifecycle. + - Renders an inline `role="status"` confirmation panel ("Booking confirmed - {total}$") in place + of the button for `CONFIRMATION_DISPLAY_MS` (3000ms), after which `confirmedTotal` resets to + `null` - at that point `selectedSeats.size` is already `0`, so the sidebar automatically falls + back to Booking History, now showing the just-completed booking as its newest (and still + "viewed"/highlighted) entry. The payment step itself is still a UI stub - no payment provider, + no server call, no real order record; see + [`engineering-notes.md`](engineering-notes.md#known-remaining-gaps). + +### `BookingHistoryPanel.tsx` + +- Reads `bookings: Booking[]` from the store (`{id, seatIds, total, createdAt}`, persisted, newest + first - see [`seatStore.ts`](../src/store/seatStore.ts)). Empty state shows the same illustrative + seat-grid icon style as the selection panel's old empty state, with "No bookings yet". +- Each card shows the formatted date/time, seat count, a representative section label (the first + seat's section, or `"
-
- Tier 1 +
+ {getTier(1).name}
- 7000$ + ${getTier(1).price}
-
- Tier 2 +
+ {getTier(2).name}
- 3000$ + ${getTier(2).price}
-
- Tier 3 +
+ {getTier(3).name}
- 1500$ + ${getTier(3).price}
-

+

Seat Status -

+
-
+
Selected
-
+
Sold
-
+
Reserved
-
+
Held
-
-

- Selected Seats ({selectedSeats.size}/8) - {selectedSeats.size > 0 && ( - - )} -

- - {selectedSeats.size === 0 ? ( -
-

Select seats from the map

-
- ) : ( -
- {selectedSeatDetails.map((item) => ( -
-
-

{item.label}

-

Standard Ticket

-
- {item.price} -
- ))} -
- )} -
- -
-
- Total Amount - {total}$ -
- {confirmedTotal !== null ? ( -
-

- Booking confirmed — {confirmedTotal}$ -

-

A confirmation has been sent to you.

-
- ) : ( - - )} -
+ {showSelectionPanel ? ( + + ) : ( + + )} + + {showSelectionPanel && ( + + )} ); } diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx new file mode 100644 index 0000000..1f7b701 --- /dev/null +++ b/src/components/ConfirmDialog.tsx @@ -0,0 +1,90 @@ +import { useEffect } from 'react'; +import { createPortal } from 'react-dom'; + +interface ConfirmDialogProps { + title: string; + message: string; + confirmLabel: string; + cancelLabel?: string; + onConfirm: () => void; + onCancel: () => void; +} + +export default function ConfirmDialog({ + title, + message, + confirmLabel, + cancelLabel = 'Cancel', + onConfirm, + onCancel, +}: ConfirmDialogProps) { + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') onCancel(); + }; + document.addEventListener('keydown', handleKeyDown); + return () => document.removeEventListener('keydown', handleKeyDown); + }, [onCancel]); + + // The backdrop button already blocks mouse clicks on the app behind it, + // but Tab navigation could still reach it (a real gap, not just a visual + // one - screen-reader/keyboard users could otherwise select or clear + // seats while this dialog is "modally" open). `inert` removes the app + // root from both focus and hit-testing entirely, for as long as the + // dialog is mounted. + useEffect(() => { + const appRoot = document.getElementById('root'); + appRoot?.setAttribute('inert', ''); + return () => { + appRoot?.removeAttribute('inert'); + }; + }, []); + + // Rendered via a portal straight into rather than in place: the + // sidebar wrapper in App.tsx carries an active translate-x-* transform + // (for its mobile slide-in/out), and a `transform` on any ancestor creates + // a new containing block for `position: fixed` descendants - so without + // the portal, "fixed inset-0" here would size itself to that sidebar box + // instead of the actual viewport, confining the dialog to the left column. + return createPortal( +
+ + +
+ + , + document.body, + ); +} diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx new file mode 100644 index 0000000..7b960f7 --- /dev/null +++ b/src/components/Icon.tsx @@ -0,0 +1,37 @@ +const PATHS = { + menu: 'M4 6h16M4 12h16M4 18h16', + close: 'M6 18L18 6M6 6l12 12', + 'zoom-in': 'M12 5v14M5 12h14', + 'zoom-out': 'M5 12h14', + // Traced from a reference "zoom reset" icon (magnifying glass whose lens + // is a circular arrow), whose original viewBox was 21x21 - coordinates + // below are that path scaled by 24/21 to fit our shared 24x24 viewBox. + 'reset-view': + 'M4 9.71C4 12.87 6.56 15.43 9.71 15.43C12.87 15.43 15.43 12.87 15.43 9.71C15.43 6.56 12.87 4 9.71 4C7.88 4 6.25 4.86 5.21 6.2M5.14 1.71L5.14 6.29L9.71 6.29M20 20L13.85 13.85', + 'chevron-left': 'M15 6l-6 6 6 6', +} as const; + +export type IconName = keyof typeof PATHS; + +interface IconProps { + name: IconName; + className?: string; +} + +export default function Icon({ name, className = 'w-5 h-5' }: IconProps) { + return ( + + ); +} diff --git a/src/components/IconButton.tsx b/src/components/IconButton.tsx new file mode 100644 index 0000000..d6a643b --- /dev/null +++ b/src/components/IconButton.tsx @@ -0,0 +1,32 @@ +import Icon, { type IconName } from './Icon'; + +interface IconButtonProps { + icon: IconName; + label: string; + onClick: () => void; + className?: string; + /** Extra classes applied to the icon itself (e.g. a rotation transition), + * on top of its default size - for buttons whose glyph animates + * independently of the button's own position/visibility. */ + iconClassName?: string; +} + +export default function IconButton({ + icon, + label, + onClick, + className = '', + iconClassName = '', +}: IconButtonProps) { + return ( + + ); +} diff --git a/src/components/Seat.test.tsx b/src/components/Seat.test.tsx index 8ba403c..d29011e 100644 --- a/src/components/Seat.test.tsx +++ b/src/components/Seat.test.tsx @@ -31,6 +31,7 @@ const resetStore = () => { useVenueStore.setState({ activeSectionId: null, selectedSeats: new Set(), + soldSeats: new Set(), zoom: 0.4, feedback: null, }); @@ -93,4 +94,15 @@ describe('Seats keyboard navigation and selection', () => { expect(useVenueStore.getState().selectedSeats.has('B3')).toBe(false); expect(seatB3.getAttribute('tabindex')).toBe('-1'); }); + + it('treats a seat in soldSeats as unavailable even if its data status is available', () => { + useVenueStore.setState({ soldSeats: new Set(['A2']) }); + renderSeats(); + const seatA2 = document.getElementById('seat-A2')!; + + fireEvent.click(seatA2); + expect(useVenueStore.getState().selectedSeats.has('A2')).toBe(false); + expect(seatA2.getAttribute('tabindex')).toBe('-1'); + expect(seatA2.getAttribute('aria-disabled')).toBe('true'); + }); }); diff --git a/src/components/Seat.tsx b/src/components/Seat.tsx index 00ac364..1a55bba 100644 --- a/src/components/Seat.tsx +++ b/src/components/Seat.tsx @@ -1,14 +1,46 @@ -import { memo } from 'react'; +import { memo, useMemo } from 'react'; import type { ISeat, Row } from '../interfaces/venue.interfaces'; import { useVenueStore } from '../store/seatStore'; +import { rowLetter } from '../utils/rowLetter'; interface SeatsProps { rows: Row[]; } +const TIER_STROKE: Record = { + 1: 'var(--color-tier-1)', + 2: 'var(--color-tier-2)', + 3: 'var(--color-tier-3)', +}; + +// A near-square seat with a light radius reads as a seat, not a dot, once +// zoomed in - a plain circle-reading dot only happened because the previous +// rx (0.5) was half the shape's own width, which looks circular at any scale. +const SEAT_SIZE = 3; +const SEAT_RADIUS = 0.35; + +// Seat numbers/row letters are only worth mounting once they'd actually be +// legible - below this zoom they'd just be illegible flyspecks, so skip the +// extra ~1,500 text nodes entirely rather than render invisible detail. +const LABEL_ZOOM_THRESHOLD = 2; + const Seats = memo(function Seats({ rows }: SeatsProps) { const selectedSeats = useVenueStore((s) => s.selectedSeats); + const soldSeats = useVenueStore((s) => s.soldSeats); + const bookings = useVenueStore((s) => s.bookings); + const viewingBookingId = useVenueStore((s) => s.viewingBookingId); const toggleSeat = useVenueStore((s) => s.toggleSeat); + const zoom = useVenueStore((s) => s.zoom); + const showLabels = zoom >= LABEL_ZOOM_THRESHOLD; + + // Seats belonging to whichever past booking is currently being viewed + // from Booking History, if any - highlighted on top of their normal + // status coloring (almost always "sold") rather than replacing it. + const highlightedSeatIds = useMemo(() => { + if (!viewingBookingId) return null; + const booking = bookings.find((b) => b.id === viewingBookingId); + return booking ? new Set(booking.seatIds) : null; + }, [bookings, viewingBookingId]); const handleInteraction = ( e: React.MouseEvent | React.KeyboardEvent, @@ -83,37 +115,51 @@ const Seats = memo(function Seats({ rows }: SeatsProps) { {rows.map((row, rowIndex) => row.seats.map((seat, seatIndex) => { const isSelected = selectedSeats.has(seat.id); - const isSold = seat.status === 'sold'; + // Sold if the sample data says so, or if it was bought in this + // browser via confirmPurchase() - see seatStore.ts. + const isSold = seat.status === 'sold' || soldSeats.has(seat.id); const isReserved = seat.status === 'reserved'; const isHeld = seat.status === 'held'; const isUnavailable = isSold || isReserved || isHeld; - let fill = 'white'; - let stroke = '#059669'; - - const tierColors: Record = { - 1: '#eab308', - 2: '#6b7280', - 3: '#f97316', - }; + let fill = 'var(--color-seat-available)'; + let stroke = 'var(--color-seat-available-stroke)'; + let strokeWidth = 0.35; + let textColor = '#334155'; // slate-700 - reads on white/light fills if (isSold) { - fill = '#d1d5db'; + fill = 'var(--color-seat-sold)'; stroke = 'none'; } else if (isReserved) { - fill = '#fbbf24'; + fill = 'var(--color-seat-reserved)'; stroke = 'none'; } else if (isHeld) { - fill = '#f87171'; + fill = 'var(--color-seat-held)'; stroke = 'none'; + textColor = 'white'; } else if (isSelected) { - fill = '#10b981'; - stroke = 'none'; + // A visible ring (not just a fill swap) makes "selected" read as + // a checked state at a glance, matching a real ticket-booking UI. + fill = 'var(--color-seat-selected)'; + stroke = 'white'; + strokeWidth = 0.4; + textColor = 'white'; } else { - stroke = tierColors[seat.priceTier] || '#059669'; + stroke = TIER_STROKE[seat.priceTier] || 'var(--color-seat-available-stroke)'; } - const label = `Row ${row.index} Seat ${seat.col}, Price $${seat.priceTier}, ${seat.status}`; + const isHighlighted = highlightedSeatIds?.has(seat.id) ?? false; + if (isHighlighted) { + // Layered on top of whatever status color already applies + // (almost always "sold") rather than replacing it, so the seat + // still reads as sold while also standing out as "part of the + // booking you're viewing". + stroke = 'var(--color-booking-highlight)'; + strokeWidth = 0.5; + } + + const effectiveStatus = isSold ? 'sold' : seat.status; + const label = `Row ${rowLetter(rowIndex)} Seat ${seat.col}, Price $${seat.priceTier}, ${effectiveStatus}`; return ( + {showLabels && ( + + {seat.col} + + )} ); }), )} + {showLabels && + rows.map((row, rowIndex) => { + const first = row.seats[0]; + const second = row.seats[1]; + if (!first || !second) return null; + // One seat-step further back along the row's own curve, so the + // label sits where "the next seat to the left" would be. + const labelX = first.x + (first.x - second.x); + const labelY = first.y + (first.y - second.y); + + return ( + + {rowLetter(rowIndex)} + + ); + })} ); }); diff --git a/src/components/SeatSelectionFooter.tsx b/src/components/SeatSelectionFooter.tsx new file mode 100644 index 0000000..f90f0d3 --- /dev/null +++ b/src/components/SeatSelectionFooter.tsx @@ -0,0 +1,49 @@ +import { useVenueStore } from '../store/seatStore'; + +interface SeatSelectionFooterProps { + total: number; + confirmedTotal: number | null; + onConfirmPurchase: (total: number) => void; +} + +// Rendered outside the sidebar's scrollable region (see BookingSummary.tsx) +// so Total Amount / Proceed to Pay stay reachable without scrolling past +// however many seats are currently selected. +export default function SeatSelectionFooter({ + total, + confirmedTotal, + onConfirmPurchase, +}: SeatSelectionFooterProps) { + const selectedSeatsCount = useVenueStore((s) => s.selectedSeats.size); + + return ( +
+
+ Total Amount + ${total} +
+ {confirmedTotal !== null ? ( +
+

Booking confirmed — {confirmedTotal}$

+

A confirmation has been sent to you.

+
+ ) : ( + + )} +
+ ); +} diff --git a/src/components/SeatSelectionPanel.tsx b/src/components/SeatSelectionPanel.tsx new file mode 100644 index 0000000..6fb6e86 --- /dev/null +++ b/src/components/SeatSelectionPanel.tsx @@ -0,0 +1,81 @@ +import { useMemo, useState } from 'react'; +import { useVenueStore } from '../store/seatStore'; +import type { Venue } from '../interfaces/venue.interfaces'; +import { buildSeatIndex } from '../utils/seatIndex'; +import ConfirmDialog from './ConfirmDialog'; + +interface SeatSelectionPanelProps { + venue: Venue; +} + +export default function SeatSelectionPanel({ venue }: SeatSelectionPanelProps) { + const selectedSeats = useVenueStore((s) => s.selectedSeats); + const clearSelection = useVenueStore((s) => s.clearSelection); + const [showClearConfirm, setShowClearConfirm] = useState(false); + + const seatIndex = useMemo(() => buildSeatIndex(venue), [venue]); + + const handleClear = () => { + clearSelection(); + setShowClearConfirm(false); + }; + + const selectedSeatDetails = useMemo(() => { + const details: { id: string; label: string; price: number; tierName: string }[] = []; + selectedSeats.forEach((seatId) => { + const entry = seatIndex.get(seatId); + if (!entry) return; + details.push({ + id: seatId, + // Row shown as the same letter the map uses so a sidebar entry and + // its seat on the map read identically - "Row 15" here and "Row O" + // there was the same row, confusingly. + label: `${entry.sectionLabel} | Row ${entry.rowLabel} | Seat ${entry.seatCol}`, + price: entry.price, + tierName: entry.tierName, + }); + }); + return details; + }, [seatIndex, selectedSeats]); + + return ( +
+

+ Selected Seats ({selectedSeats.size}/8) + {selectedSeats.size > 0 && ( + + )} +

+ +
+ {selectedSeatDetails.map((item) => ( +
+
+

{item.label}

+

{item.tierName}

+
+ ${item.price} +
+ ))} +
+ + {showClearConfirm && ( + setShowClearConfirm(false)} + /> + )} +
+ ); +} diff --git a/src/components/Section.tsx b/src/components/Section.tsx index 4019117..3930ccc 100644 --- a/src/components/Section.tsx +++ b/src/components/Section.tsx @@ -1,9 +1,10 @@ import { memo, useMemo, useEffect } from 'react'; import { useVenueStore } from '../store/seatStore'; import type { Section } from '../interfaces/venue.interfaces'; +import type { VenueContentBounds } from '../utils/venueBounds'; import Seats from './Seat'; -function Section({ section }: { section: Section }) { +function Section({ section, bounds }: { section: Section; bounds: VenueContentBounds }) { const activeSectionId = useVenueStore((s) => s.activeSectionId); const setZoom = useVenueStore((s) => s.setZoom); const setActiveSection = useVenueStore((s) => s.setActiveSection); @@ -32,8 +33,12 @@ function Section({ section }: { section: Section }) { const mapContainer = document.querySelector('main.overflow-auto'); if (mapContainer) { const currentZoom = useVenueStore.getState().zoom; - const scrollX = centerX * currentZoom - mapContainer.clientWidth / 2; - const scrollY = centerY * currentZoom - mapContainer.clientHeight / 2; + // The SVG's own pixel origin is the viewBox's top-left corner + // (bounds.minX/minY, cropped to the venue's content - see + // VenueMap.tsx), not absolute coordinate (0, 0), so that offset + // has to be subtracted before scaling by zoom. + const scrollX = (centerX - bounds.minX) * currentZoom - mapContainer.clientWidth / 2; + const scrollY = (centerY - bounds.minY) * currentZoom - mapContainer.clientHeight / 2; mapContainer.scrollTo({ left: Math.max(0, scrollX), @@ -44,7 +49,7 @@ function Section({ section }: { section: Section }) { }, 150); return () => clearTimeout(timer); } - }, [isActive, section]); + }, [isActive, section, bounds]); const coverPath = useMemo(() => { const firstRow = section.rows[0]; @@ -104,19 +109,35 @@ function Section({ section }: { section: Section }) { }; }, [section]); + const toggleActive = () => { + const newActiveId = isActive ? null : section.id; + setActiveSection(newActiveId); + if (newActiveId) setZoom(8); + }; + return ( { e.stopPropagation(); - const newActiveId = isActive ? null : section.id; - setActiveSection(newActiveId); - if (newActiveId) setZoom(1.5); + toggleActive(); + }} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + e.stopPropagation(); + toggleActive(); + } }} + role="button" + tabIndex={0} + aria-expanded={isActive} + aria-label={`Section ${section.label}${isActive ? ', expanded' : ''}`} style={{ cursor: 'pointer' }} + className="group/section focus:outline-none" transform={`translate(${explodeOffset.x} ${explodeOffset.y})`} > {isActive ? ( - <> + - + ) : ( - + - + - {rows.map((row, rowIndex) => - row.seats - .filter((_, i) => i % 6 === 0) - .map((seat, seatIndex) => ( - - )), - )} - - ); -} - -export default memo(SectionSkeleton); diff --git a/src/components/Stage.tsx b/src/components/Stage.tsx deleted file mode 100644 index 3f50f24..0000000 --- a/src/components/Stage.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export const Stage = () => ( - - - - STAGE - - -); diff --git a/src/components/VenueMap.tsx b/src/components/VenueMap.tsx index d9976fa..ea45b08 100644 --- a/src/components/VenueMap.tsx +++ b/src/components/VenueMap.tsx @@ -1,23 +1,33 @@ +import { useMemo } from 'react'; import type { Venue } from '../interfaces/venue.interfaces'; import Section from './Section'; import { useVenueStore } from '../store/seatStore'; +import { getVenueContentBounds } from '../utils/venueBounds'; export default function VenueMap({ venue, zoom = 1 }: { venue: Venue; zoom?: number }) { + // Size/crop the SVG to the venue's actual content extent, not the full map + // canvas - see getVenueContentBounds for why. Sections' own seat + // coordinates are unaffected (they're absolute, in the same coordinate + // space); only what portion of that space the viewBox exposes changes. + const bounds = useMemo(() => getVenueContentBounds(venue), [venue]); + return ( { useVenueStore.getState().setActiveSection(null); }} > @@ -49,7 +59,7 @@ export default function VenueMap({ venue, zoom = 1 }: { venue: Venue; zoom?: num {venue.sections.map((section) => ( -
+
))}
); diff --git a/src/hooks/useVenue.ts b/src/hooks/useVenue.ts index 269c99e..1f43212 100644 --- a/src/hooks/useVenue.ts +++ b/src/hooks/useVenue.ts @@ -1,10 +1,17 @@ -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import type { Venue } from '../interfaces/venue.interfaces'; export function useVenue() { const [venue, setVenue] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); + const [retryToken, setRetryToken] = useState(0); + + const refetch = useCallback(() => { + setLoading(true); + setError(null); + setRetryToken((n) => n + 1); + }, []); useEffect(() => { let cancelled = false; @@ -28,7 +35,7 @@ export function useVenue() { return () => { cancelled = true; }; - }, []); + }, [retryToken]); - return { venue, loading, error }; + return { venue, loading, error, refetch }; } diff --git a/src/index.css b/src/index.css index d4b5078..c17ebe3 100644 --- a/src/index.css +++ b/src/index.css @@ -1 +1,103 @@ @import 'tailwindcss'; + +@theme { + /* Seat status */ + --color-seat-available: #ffffff; + --color-seat-available-stroke: #059669; + --color-seat-selected: #10b981; + --color-seat-sold: #d1d5db; + --color-seat-reserved: #fbbf24; + --color-seat-held: #f87171; + + /* Price tiers (used both as SVG stroke colors and legend swatch borders) */ + --color-tier-1: #eab308; + --color-tier-2: #6b7280; + --color-tier-3: #f97316; + + /* Brand header gradient */ + --color-brand-from: #60a5fa; + --color-brand-to: #818cf8; + + /* Ring shown on a sold seat while its booking is open in Booking History */ + --color-booking-highlight: #7c3aed; +} + +/* Plays once when a seat's rect gains this class (i.e. the instant it + becomes selected) - not a looping blink, since the class stays applied + for as long as the seat stays selected and CSS animations don't repeat + on their own without `infinite`. */ +@keyframes seat-select-pop { + 0% { + transform: scale(0.75); + opacity: 0.35; + } + 55% { + transform: scale(1.2); + opacity: 1; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +.seat-select-pop { + transform-box: fill-box; + transform-origin: center; + animation: seat-select-pop 300ms ease-out; +} + +@media (prefers-reduced-motion: reduce) { + .seat-select-pop { + animation: none; + } +} + +/* Plays once whenever a Section's active/collapsed content mounts (opening + or closing it) - React swaps the two branches instantly with no + transition of its own, so without this the seats (or the collapsed cover + shape) would just snap into view. */ +@keyframes section-activate { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.section-activate { + animation: section-activate 250ms ease-out; +} + +@media (prefers-reduced-motion: reduce) { + .section-activate { + animation: none; + } +} + +/* Continuous (not one-shot) - this is a standing "you're looking at this + booking's seats" indicator for as long as Booking History has one open, + not a celebratory flash, so it loops for the whole time rather than + playing once. */ +@keyframes seat-highlight-pulse { + 0%, + 100% { + filter: drop-shadow(0 0 0 color-mix(in srgb, var(--color-booking-highlight) 70%, transparent)); + } + 50% { + filter: drop-shadow( + 0 0 0.6px color-mix(in srgb, var(--color-booking-highlight) 70%, transparent) + ); + } +} + +.seat-highlight-pulse { + animation: seat-highlight-pulse 1.4s ease-in-out infinite; +} + +@media (prefers-reduced-motion: reduce) { + .seat-highlight-pulse { + animation: none; + } +} diff --git a/src/store/seatStore.test.ts b/src/store/seatStore.test.ts index f3d6dbb..319d977 100644 --- a/src/store/seatStore.test.ts +++ b/src/store/seatStore.test.ts @@ -5,6 +5,9 @@ const resetStore = () => { useVenueStore.setState({ activeSectionId: null, selectedSeats: new Set(), + soldSeats: new Set(), + bookings: [], + viewingBookingId: null, zoom: 0.4, feedback: null, }); @@ -48,6 +51,64 @@ describe('seatStore', () => { expect(useVenueStore.getState().selectedSeats.size).toBe(0); }); + it('confirmPurchase moves selected seats into soldSeats and empties the cart', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().toggleSeat('SEAT-2'); + useVenueStore.getState().confirmPurchase(6000); + + expect(useVenueStore.getState().selectedSeats.size).toBe(0); + expect(useVenueStore.getState().soldSeats.has('SEAT-1')).toBe(true); + expect(useVenueStore.getState().soldSeats.has('SEAT-2')).toBe(true); + }); + + it('confirmPurchase accumulates across multiple purchases rather than overwriting', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().confirmPurchase(3000); + + useVenueStore.getState().toggleSeat('SEAT-2'); + useVenueStore.getState().confirmPurchase(3000); + + expect(useVenueStore.getState().soldSeats.has('SEAT-1')).toBe(true); + expect(useVenueStore.getState().soldSeats.has('SEAT-2')).toBe(true); + }); + + it('confirmPurchase records a Booking grouping the just-bought seats and views it', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().toggleSeat('SEAT-2'); + useVenueStore.getState().confirmPurchase(6000); + + const { bookings, viewingBookingId } = useVenueStore.getState(); + expect(bookings).toHaveLength(1); + expect(bookings[0]?.seatIds.sort()).toEqual(['SEAT-1', 'SEAT-2']); + expect(bookings[0]?.total).toBe(6000); + expect(viewingBookingId).toBe(bookings[0]?.id); + }); + + it('confirmPurchase prepends new bookings so the newest is first', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().confirmPurchase(3000); + useVenueStore.getState().toggleSeat('SEAT-2'); + useVenueStore.getState().confirmPurchase(3000); + + const { bookings } = useVenueStore.getState(); + expect(bookings).toHaveLength(2); + expect(bookings[0]?.seatIds).toEqual(['SEAT-2']); + expect(bookings[1]?.seatIds).toEqual(['SEAT-1']); + }); + + it('toggleSeat clears any booking currently being viewed', () => { + useVenueStore.getState().viewBooking('BK-1'); + useVenueStore.getState().toggleSeat('SEAT-1'); + expect(useVenueStore.getState().viewingBookingId).toBeNull(); + }); + + it('viewBooking and clearViewingBooking control which booking is highlighted', () => { + useVenueStore.getState().viewBooking('BK-1'); + expect(useVenueStore.getState().viewingBookingId).toBe('BK-1'); + useVenueStore.getState().clearViewingBooking(); + expect(useVenueStore.getState().viewingBookingId).toBeNull(); + }); + it('persists and restores selected seats across a save/reload cycle', async () => { useVenueStore.getState().toggleSeat('SEAT-1'); useVenueStore.getState().toggleSeat('SEAT-2'); @@ -58,7 +119,9 @@ describe('seatStore', () => { const raw = localStorage.getItem('venue-storage'); expect(raw).not.toBeNull(); - const parsed = JSON.parse(raw as string) as { state: { selectedSeats: string[] } }; + const parsed = JSON.parse(raw as string) as { + state: { selectedSeats: string[]; soldSeats: string[] }; + }; expect(parsed.state.selectedSeats.sort()).toEqual(['SEAT-1', 'SEAT-2']); // Simulate a fresh load: reset in-memory state, then rehydrate from the same storage key. @@ -69,4 +132,42 @@ describe('seatStore', () => { expect(useVenueStore.getState().selectedSeats.has('SEAT-1')).toBe(true); expect(useVenueStore.getState().selectedSeats.has('SEAT-2')).toBe(true); }); + + it('persists sold seats across a save/reload cycle, surviving a fresh selection', async () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().confirmPurchase(7000); + + await Promise.resolve(); + + const raw = localStorage.getItem('venue-storage'); + const parsed = JSON.parse(raw as string) as { state: { soldSeats: string[] } }; + expect(parsed.state.soldSeats).toEqual(['SEAT-1']); + + // Simulate a fresh load rehydrating from that same storage key. + useVenueStore.setState({ soldSeats: new Set() }); + useVenueStore.setState({ soldSeats: new Set(parsed.state.soldSeats) }); + + expect(useVenueStore.getState().soldSeats.has('SEAT-1')).toBe(true); + }); + + it('persists booking history across a save/reload cycle', async () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().confirmPurchase(7000); + + await Promise.resolve(); + + const raw = localStorage.getItem('venue-storage'); + const parsed = JSON.parse(raw as string) as { + state: { bookings: { id: string; seatIds: string[]; total: number; createdAt: number }[] }; + }; + expect(parsed.state.bookings).toHaveLength(1); + expect(parsed.state.bookings[0]?.seatIds).toEqual(['SEAT-1']); + expect(parsed.state.bookings[0]?.total).toBe(7000); + + // Simulate a fresh load rehydrating from that same storage key. + useVenueStore.setState({ bookings: [] }); + useVenueStore.setState({ bookings: parsed.state.bookings }); + + expect(useVenueStore.getState().bookings).toHaveLength(1); + }); }); diff --git a/src/store/seatStore.ts b/src/store/seatStore.ts index 13dff56..3971d47 100644 --- a/src/store/seatStore.ts +++ b/src/store/seatStore.ts @@ -9,22 +9,46 @@ interface Feedback { message: string; } +// A completed purchase, grouping the seats bought together in one checkout +// so booking history can show/highlight them as one unit rather than as +// loose entries in the flat soldSeats set. +export interface Booking { + id: string; + seatIds: string[]; + total: number; + createdAt: number; +} + interface VenueState { activeSectionId: string | null; selectedSeats: Set; + // Seats bought via confirmPurchase(). There's no backend, so "sold" only + // means "sold in this browser" - it's a local, honest stand-in for a real + // server-side sale record, not a claim about the venue's actual inventory. + soldSeats: Set; + bookings: Booking[]; + // Which past booking's seats should currently be highlighted on the map, + // if any - set when a booking-history entry is clicked, distinct from the + // active seat *selection* (selectedSeats) which drives the checkout flow. + viewingBookingId: string | null; zoom: number; feedback: Feedback | null; setActiveSection: (id: string | null) => void; setZoom: (zoom: number) => void; toggleSeat: (seatId: string) => void; clearSelection: () => void; + confirmPurchase: (total: number) => void; + viewBooking: (id: string) => void; + clearViewingBooking: () => void; clearFeedback: () => void; } -type PersistedVenueState = Pick; +type PersistedVenueState = Pick; interface SerializedVenueState { selectedSeats: string[]; + soldSeats: string[]; + bookings: Booking[]; } const venueStorage: PersistStorage = { @@ -33,13 +57,21 @@ const venueStorage: PersistStorage = { if (!str) return null; const { state, version } = JSON.parse(str) as StorageValue; return { - state: { selectedSeats: new Set(state.selectedSeats) }, + state: { + selectedSeats: new Set(state.selectedSeats), + soldSeats: new Set(state.soldSeats ?? []), + bookings: state.bookings ?? [], + }, ...(version !== undefined && { version }), }; }, setItem: (name, value) => { const serialized: StorageValue = { - state: { selectedSeats: Array.from(value.state.selectedSeats) }, + state: { + selectedSeats: Array.from(value.state.selectedSeats), + soldSeats: Array.from(value.state.soldSeats), + bookings: value.state.bookings, + }, ...(value.version !== undefined && { version: value.version }), }; localStorage.setItem(name, JSON.stringify(serialized)); @@ -52,6 +84,9 @@ export const useVenueStore = create()( (set) => ({ activeSectionId: null, selectedSeats: new Set(), + soldSeats: new Set(), + bookings: [], + viewingBookingId: null, zoom: 0.4, feedback: null, setActiveSection: (id) => set({ activeSectionId: id }), @@ -73,16 +108,49 @@ export const useVenueStore = create()( } newSelected.add(seatId); } - return { selectedSeats: newSelected }; + // Starting/editing a live selection supersedes browsing past + // booking history - drop any "viewing" highlight so the two + // sidebar modes never fight over what the map should show. + return { selectedSeats: newSelected, viewingBookingId: null }; }), clearSelection: () => set({ selectedSeats: new Set() }), + + // The "checkout" transition: move whatever is currently selected into + // soldSeats (permanently unavailable in this browser), record it as + // one Booking (so history can show/highlight it as a unit), and empty + // the cart - as opposed to clearSelection(), which just abandons the + // cart without a sale. + confirmPurchase: (total) => + set((state) => { + const seatIds = Array.from(state.selectedSeats); + const newBooking: Booking = { + id: `BK-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, + seatIds, + total, + createdAt: Date.now(), + }; + return { + soldSeats: new Set([...state.soldSeats, ...state.selectedSeats]), + selectedSeats: new Set(), + bookings: [newBooking, ...state.bookings], + viewingBookingId: newBooking.id, + }; + }), + + viewBooking: (id) => set({ viewingBookingId: id }), + clearViewingBooking: () => set({ viewingBookingId: null }), + clearFeedback: () => set({ feedback: null }), }), { name: 'venue-storage', storage: venueStorage, - partialize: (state) => ({ selectedSeats: state.selectedSeats }), + partialize: (state) => ({ + selectedSeats: state.selectedSeats, + soldSeats: state.soldSeats, + bookings: state.bookings, + }), }, ), ); diff --git a/src/utils/rowLetter.ts b/src/utils/rowLetter.ts new file mode 100644 index 0000000..cb1c7be --- /dev/null +++ b/src/utils/rowLetter.ts @@ -0,0 +1,14 @@ +// Spreadsheet-style row lettering (A, B, ... Z, AA, AB, ...) so it never runs +// out for a section with more than 26 rows. Shared by the map (Seat.tsx) and +// the booking sidebar (BookingSummary.tsx) so a seat's row reads identically +// in both places instead of "Row 15" on one and "Row O" on the other. +export function rowLetter(rowIndex: number): string { + let n = rowIndex + 1; + let out = ''; + while (n > 0) { + n -= 1; + out = String.fromCharCode(65 + (n % 26)) + out; + n = Math.floor(n / 26); + } + return out; +} diff --git a/src/utils/seatIndex.ts b/src/utils/seatIndex.ts new file mode 100644 index 0000000..a414289 --- /dev/null +++ b/src/utils/seatIndex.ts @@ -0,0 +1,42 @@ +import type { Venue } from '../interfaces/venue.interfaces'; +import { rowLetter } from './rowLetter'; + +export const TIERS: Record = { + 1: { name: 'Premium Stand', price: 7000 }, + 2: { name: 'Standard Stand', price: 3000 }, + 3: { name: 'Gallery Stand', price: 1500 }, +}; +const DEFAULT_TIER = { name: 'Standard Ticket', price: 50 }; +export const getTier = (tier: number) => TIERS[tier] ?? DEFAULT_TIER; + +export interface SeatIndexEntry { + sectionId: string; + sectionLabel: string; + rowLabel: string; + seatCol: number; + tierName: string; + price: number; +} + +// One shared seatId -> details lookup, built once per venue, so the +// selection panel and booking history never independently re-derive (and +// risk drifting on) the same row/tier/price data. +export function buildSeatIndex(venue: Venue): Map { + const index = new Map(); + venue.sections.forEach((section) => { + section.rows.forEach((row) => { + row.seats.forEach((seat) => { + const tier = getTier(seat.priceTier); + index.set(seat.id, { + sectionId: section.id, + sectionLabel: section.label, + rowLabel: rowLetter(row.index - 1), + seatCol: seat.col, + tierName: tier.name, + price: tier.price, + }); + }); + }); + }); + return index; +} diff --git a/src/utils/venueBounds.ts b/src/utils/venueBounds.ts new file mode 100644 index 0000000..1fb1755 --- /dev/null +++ b/src/utils/venueBounds.ts @@ -0,0 +1,42 @@ +import type { Venue } from '../interfaces/venue.interfaces'; + +// Room for the section explode offset, strokes, and labels beyond the +// seats' own bounding box. +export const VENUE_CONTENT_PADDING = 120; + +export interface VenueContentBounds { + minX: number; + minY: number; + width: number; + height: number; +} + +// The venue's actual rendered content extent (the seats' real bounding box, +// plus padding) - not the full map canvas (venue.map.width/height), which is +// deliberately padded with generous built-in margin for panning room and the +// section "explode" offset. Shared by VenueMap.tsx (to size/crop the SVG to +// what's actually drawn, instead of the whole oversized canvas) and App.tsx +// (to compute a zoom that fills the viewport with that content) so the two +// can't drift out of sync with each other. +export function getVenueContentBounds(venue: Venue): VenueContentBounds { + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + venue.sections.forEach((section) => { + section.rows.forEach((row) => { + row.seats.forEach((seat) => { + minX = Math.min(minX, seat.x); + maxX = Math.max(maxX, seat.x); + minY = Math.min(minY, seat.y); + maxY = Math.max(maxY, seat.y); + }); + }); + }); + return { + minX: minX - VENUE_CONTENT_PADDING, + minY: minY - VENUE_CONTENT_PADDING, + width: maxX - minX + VENUE_CONTENT_PADDING * 2, + height: maxY - minY + VENUE_CONTENT_PADDING * 2, + }; +} From 0c79501c43df17fe7d4ab4690803f6bc3214d945 Mon Sep 17 00:00:00 2001 From: Rahul Date: Tue, 8 Sep 2026 18:19:33 +0530 Subject: [PATCH 09/26] chore: align project tooling with Webvoltz engineering standards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Upgraded ESLint to strictTypeChecked + stylisticTypeChecked with the full required rule set โ€” this surfaced and fixed real bugs: a missing-return path in Section.tsx, unsafe DOM element casts in Seat.tsx (now properly typed with SVGGElement generics), and blind JSON.parse/fetch().json() casts in seatStore.ts/useVenue.ts replaced with real runtime type guards instead of trusting the data - Added missing tsconfig strictness options (noImplicitReturns, noImplicitOverride, forceConsistentCasingInFileNames, noPropertyAccessFromIndexSignature, allowUnreachableCode, allowUnusedLabels) - Pre-commit hook now runs the full quality check and production build, not just lint-staged - Commitlint header/body/footer limits relaxed to 1000 chars, matching the org standard - Every dependency pinned to an exact version; added a security:audit script - Added .nvmrc/.npmrc, a packageManager field, and aligned CI's pnpm version (10 โ†’ 11) to match what's actually installed โ€” this was a real, previously-undocumented mismatch - Enabled test coverage reporting (V8) with thresholds set as a floor against regression โ€” still well below the org standard's targets, tracked honestly in engineering-notes.md - Fixed stale doc references pointing at BookingSummary.tsx that should've said SeatSelectionFooter.tsx --- .github/workflows/ci.yml | 2 +- .husky/pre-commit | 2 + .npmrc | 4 + .nvmrc | 1 + README.md | 95 +++++++++++----- commitlint.config.cjs | 4 +- docs/engineering-notes.md | 25 ++++- eslint.config.js | 38 ++++++- package.json | 72 ++++++------ pnpm-lock.yaml | 146 +++++++++++++++++++------ src/App.tsx | 24 +++- src/components/BookingHistoryPanel.tsx | 18 ++- src/components/BookingSummary.tsx | 8 +- src/components/ConfirmDialog.tsx | 4 +- src/components/Seat.test.tsx | 31 ++++-- src/components/Seat.tsx | 19 ++-- src/components/SeatSelectionFooter.tsx | 4 +- src/components/SeatSelectionPanel.tsx | 8 +- src/components/Section.tsx | 78 ++++++------- src/components/Toast.tsx | 4 +- src/hooks/useVenue.ts | 25 ++++- src/main.tsx | 7 +- src/store/seatStore.test.ts | 33 ++++-- src/store/seatStore.ts | 30 ++++- tsconfig.app.json | 13 ++- tsconfig.node.json | 9 +- vite.config.ts | 18 +++ 27 files changed, 526 insertions(+), 196 deletions(-) create mode 100644 .npmrc create mode 100644 .nvmrc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d8dfa72..d977e76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ concurrency: env: NODE_VERSION: '24' - PNPM_VERSION: '10' + PNPM_VERSION: '11' jobs: secret-scan: diff --git a/.husky/pre-commit b/.husky/pre-commit index 10304c2..f80fd4a 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -8,3 +8,5 @@ fi git diff --cached --no-ext-diff --unified=0 | gitleaks stdin --config .gitleaks.toml --redact --no-banner npx lint-staged +pnpm run quality +pnpm run build diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..c20257b --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +engine-strict=true +save-exact=true +audit=true +fund=false diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/README.md b/README.md index e38c8a9..b95e592 100644 --- a/README.md +++ b/README.md @@ -127,8 +127,10 @@ decisions and where they'd need to change at greater scale. ### Engineering standards & tooling - **Testing**: Vitest + Testing Library (jsdom) -- **Linting/Formatting**: ESLint (React, hooks, jsx-a11y, type-checked TypeScript rules) + Prettier -- **Git hooks**: Husky (`pre-commit` โ†’ Gitleaks + lint-staged, `commit-msg` โ†’ commitlint) +- **Linting/Formatting**: ESLint (React, hooks, jsx-a11y, strict + stylistic type-checked + TypeScript rules) + Prettier +- **Git hooks**: Husky (`pre-commit` โ†’ Gitleaks + lint-staged + full quality check + production + build, `commit-msg` โ†’ commitlint) - **Commit convention**: Conventional Commits, enforced by commitlint - **Secret scanning**: Gitleaks (local pre-commit + full-history scan in CI) - **CI**: GitHub Actions (`secret-scan`, `quality`, `commitlint`, `test`, `build`) @@ -141,26 +143,34 @@ See [Engineering standards](#-engineering-standards) below for details. ```text โ”œโ”€โ”€ docs/ -โ”‚ โ”œโ”€โ”€ engineering-notes.md # Tradeoffs and performance bottlenecks -โ”‚ โ””โ”€โ”€ screenshots/ # README screenshots +โ”‚ โ”œโ”€โ”€ engineering-notes.md # Tradeoffs, performance bottlenecks, known gaps +โ”‚ โ”œโ”€โ”€ ui-ux-and-business-logic-flow.md # UI state/interaction reference +โ”‚ โ””โ”€โ”€ screenshots/ # README screenshots โ”œโ”€โ”€ public/ -โ”‚ โ””โ”€โ”€ venue.json # Generated seating data served to the client +โ”‚ โ”œโ”€โ”€ venue.json # Generated seating data served to the client +โ”‚ โ”œโ”€โ”€ robots.txt +โ”‚ โ””โ”€โ”€ llms.txt โ”œโ”€โ”€ scripts/ โ”‚ โ””โ”€โ”€ generateVenue.ts # Generates public/venue.json โ”œโ”€โ”€ src/ -โ”‚ โ”œโ”€โ”€ components/ # VenueMap, Section, Seat, Stage, BookingSummary, Toast, ... +โ”‚ โ”œโ”€โ”€ components/ # VenueMap, Section, Seat, BookingSummary, SeatSelectionPanel, +โ”‚ โ”‚ # SeatSelectionFooter, BookingHistoryPanel, ConfirmDialog, Toast, +โ”‚ โ”‚ # Icon, IconButton โ”‚ โ”œโ”€โ”€ hooks/ -โ”‚ โ”‚ โ””โ”€โ”€ useVenue.ts # Fetches and exposes public/venue.json +โ”‚ โ”‚ โ””โ”€โ”€ useVenue.ts # Fetches and validates public/venue.json โ”‚ โ”œโ”€โ”€ store/ -โ”‚ โ”‚ โ””โ”€โ”€ seatStore.ts # Zustand store (zoom, active section, selected seats, feedback) +โ”‚ โ”‚ โ””โ”€โ”€ seatStore.ts # Zustand store (zoom, active section, selection, sold seats, +โ”‚ โ”‚ # booking history, feedback) โ”‚ โ”œโ”€โ”€ interfaces/ โ”‚ โ”‚ โ””โ”€โ”€ venue.interfaces.ts +โ”‚ โ”œโ”€โ”€ utils/ # rowLetter, seatIndex, venueBounds โ”‚ โ”œโ”€โ”€ test/ โ”‚ โ”‚ โ””โ”€โ”€ setup.ts # Vitest + Testing Library setup โ”‚ โ”œโ”€โ”€ App.tsx โ”‚ โ””โ”€โ”€ main.tsx โ”œโ”€โ”€ .github/workflows/ci.yml # CI pipeline โ”œโ”€โ”€ .husky/ # pre-commit / commit-msg hooks +โ”œโ”€โ”€ .nvmrc / .npmrc # Node/pnpm version + install policy โ””โ”€โ”€ README.md ``` @@ -170,8 +180,10 @@ See [Engineering standards](#-engineering-standards) below for details. ### Prerequisites -- **Node.js** `>=24 <25` (see `engines` in `package.json`) -- **pnpm** (this project uses pnpm, not npm/yarn - a `pnpm-lock.yaml` is committed) +- **Node.js** `>=24 <25` (see `.nvmrc` / `engines` in `package.json`) +- **pnpm 11.x** (this project uses pnpm, not npm/yarn - pinned exactly via the `packageManager` + field in `package.json`; `.npmrc` sets `engine-strict=true` so installs fail fast on a + mismatched Node/pnpm version instead of silently drifting) - **Gitleaks v8.30.1** on `PATH` - required by the pre-commit hook (see [Secret scanning](#secret-scanning-gitleaks)) ### Installation & Setup @@ -221,35 +233,56 @@ There are **no environment variables** - seating data is served from the static pnpm test ``` -Covers seat selection/deselection, the 8-seat selection cap, clearing the selection, the -persisted-seats `localStorage` round trip, and keyboard navigation (arrow keys, Enter/Space, -skipping unavailable seats) - see [`src/store/seatStore.test.ts`](src/store/seatStore.test.ts) and +Runs with V8 coverage enabled (`pnpm run security:audit` covers dependency vulnerabilities +separately). Coverage thresholds in [`vite.config.ts`](vite.config.ts) are set to today's actual +numbers as a regression floor, not the org standard's targets (branches 85% / functions 100% / +lines 90% / statements 90%) - most components don't have tests yet; see +[`docs/engineering-notes.md`](docs/engineering-notes.md#known-remaining-gaps) for the honest +current numbers and what closing that gap actually requires. + +Existing tests cover seat selection/deselection, the 8-seat selection cap, clearing the selection, +the persisted-seats/sold-seats/booking-history `localStorage` round trip, and keyboard navigation +(arrow keys, Enter/Space, skipping unavailable seats) - see +[`src/store/seatStore.test.ts`](src/store/seatStore.test.ts) and [`src/components/Seat.test.tsx`](src/components/Seat.test.tsx). --- ## ๐Ÿ“ Engineering standards -This project follows the React engineering standards. +This project follows the Webvoltz React engineering standards. ### Code quality - **ESLint** (`eslint.config.js`) lints `.js/.jsx/.ts/.tsx` with `eslint-plugin-react`, - `eslint-plugin-react-hooks`, `eslint-plugin-jsx-a11y`, and type-checked - `typescript-eslint` rules (`no-floating-promises`, `no-misused-promises`, `no-unsafe-*`, - `consistent-type-imports`). `pnpm run lint` fails on any warning (`--max-warnings=0`). + `eslint-plugin-react-hooks`, `eslint-plugin-jsx-a11y`, and `typescript-eslint`'s + `strictTypeChecked` + `stylisticTypeChecked` rule sets - `no-explicit-any`, every `no-unsafe-*` + rule, `only-throw-error`, `require-await`, `switch-exhaustiveness-check`, `ban-ts-comment` + (`@ts-expect-error` requires a real description), and `consistent-type-imports` are all errors, + not warnings. `restrict-template-expressions` allows `number` (seat coordinates/prices are + legitimately interpolated) but still disallows objects/`null`/`undefined`. `pnpm run lint` fails + on any warning (`--max-warnings=0`). - **Prettier** (`.prettierrc.json`) is the single source of formatting truth. Run `pnpm run format`, or let the pre-commit hook format staged files for you. -- **TypeScript** runs in strict mode plus `noUncheckedIndexedAccess` and - `exactOptionalPropertyTypes` - guard indexed access explicitly instead of asserting it away. -- `pnpm run quality` runs format-check, lint, and typecheck together - this is what CI runs too. +- **TypeScript** runs in strict mode plus `noUncheckedIndexedAccess`, `exactOptionalPropertyTypes`, + `noImplicitReturns`, `noImplicitOverride`, `noPropertyAccessFromIndexSignature`, + `forceConsistentCasingInFileNames`, `allowUnreachableCode: false`, and `allowUnusedLabels: false`, + guarding indexed access explicitly instead of asserting it away. `skipLibCheck` stays `true` + (rather than the standard's `false`) as a documented exception: flipping it surfaces type + conflicts inside vitest/vite/testing-library's own bundled declarations, not this project's own + code (see the comment in `tsconfig.app.json`). +- `pnpm run quality` runs format-check, lint, and typecheck together - this is what CI runs, and + what the pre-commit hook runs on the whole project (not just staged files) before every commit. +- `pnpm run security:audit` runs `pnpm audit --audit-level high` for dependency vulnerabilities. ### Git hooks (Husky) Installed via `pnpm run prepare`. Two hooks live in `.husky/`: -- **`pre-commit`** - scans the staged diff with Gitleaks, then runs `lint-staged` - (ESLint `--fix` + Prettier) on the files you're committing. +- **`pre-commit`** - in order: scans the staged diff with Gitleaks, runs `lint-staged` + (ESLint `--fix` + Prettier) on the files you're committing, then `pnpm run quality` and + `pnpm run build` against the **whole project** (not just staged files) - a broken build or a + type error anywhere blocks the commit, even in a file you didn't touch. - **`commit-msg`** - runs `commitlint` against your commit message. Don't bypass either hook with `--no-verify` to get past a genuine failure - fix the issue instead. @@ -258,7 +291,9 @@ Don't bypass either hook with `--no-verify` to get past a genuine failure - fix Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/), checked by `commitlint.config.cjs`: -- Header (first line) must be โ‰ค 100 characters. +- Header, body, and footer lines must each be โ‰ค 1000 characters - room to actually explain + yourself, not the old 72/100-character convention that just trains people to write useless + messages to fit. - `type` must be one of: `build`, `chore`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `style`, `test`. Example: `fix: prevent seat selection past the 8-seat limit` @@ -279,13 +314,13 @@ GitHub Actions independently re-scans full repository history with the same pinn `.github/workflows/ci.yml` runs on every push and pull request: -| Job | What it does | -| ------------- | --------------------------------------------------- | -| `secret-scan` | Gitleaks over full repository history. | -| `quality` | `pnpm run quality` (format check, lint, typecheck). | -| `commitlint` | Lints the commit range being pushed/merged. | -| `test` | `pnpm test`. | -| `build` | `pnpm run build`. | +| Job | What it does | +| ------------- | ------------------------------------------------------------------------------ | +| `secret-scan` | Gitleaks over full repository history. | +| `quality` | `pnpm run quality` (format check, lint, typecheck). | +| `commitlint` | Lints the commit range being pushed/merged. | +| `test` | `pnpm test` (V8 coverage, checked against the thresholds in `vite.config.ts`). | +| `build` | `pnpm run build`. | All jobs must pass before merging. diff --git a/commitlint.config.cjs b/commitlint.config.cjs index 4a731e8..85b67a3 100644 --- a/commitlint.config.cjs +++ b/commitlint.config.cjs @@ -1,7 +1,9 @@ module.exports = { extends: ['@commitlint/config-conventional'], rules: { - 'header-max-length': [2, 'always', 100], + 'header-max-length': [2, 'always', 1000], + 'body-max-line-length': [2, 'always', 1000], + 'footer-max-line-length': [2, 'always', 1000], 'type-enum': [ 2, 'always', diff --git a/docs/engineering-notes.md b/docs/engineering-notes.md index 2656850..b66bb6f 100644 --- a/docs/engineering-notes.md +++ b/docs/engineering-notes.md @@ -61,7 +61,28 @@ scope (survive a page refresh, single device, no login) but has real limits: ## Known remaining gaps - No virtualization within an active section's own seat list (see above). -- The "Proceed to Pay" flow (see [`BookingSummary.tsx`](../src/components/BookingSummary.tsx)) is an - intentional UI stub - it shows an inline confirmation, not a real payment integration. +- The "Proceed to Pay" flow (see + [`SeatSelectionFooter.tsx`](../src/components/SeatSelectionFooter.tsx)) is an intentional UI + stub - it shows an inline confirmation, not a real payment integration. - Seat availability (`sold`/`reserved`/`held`) is static sample data with no live update mechanism (no websocket/polling) - a second user selecting the same seat isn't reflected without a refresh. +- **Test coverage is well below the org engineering standard.** The standard + ([`Webvoltz-Engineering-Standards/react`](../../Webvoltz-Engineering-Standards/react)) requires + branches 85% / functions 100% / lines 90% / statements 90%. Actual project-wide coverage today + (`pnpm test`, V8 provider, whole `src/` tree): **statements 24.6%, branches 27.8%, functions + 19.9%, lines 25.3%** - only `Seat.tsx` and `seatStore.ts` have real test coverage; `App.tsx`, + `VenueMap.tsx`, `Section.tsx`, `BookingSummary.tsx`, `SeatSelectionPanel.tsx`, + `SeatSelectionFooter.tsx`, `BookingHistoryPanel.tsx`, `ConfirmDialog.tsx`, `Icon.tsx`, + `IconButton.tsx`, `Toast.tsx`, `useVenue.ts`, and the `utils/` helpers have none. The thresholds + in [`vite.config.ts`](../vite.config.ts) are set to today's actual numbers (a floor against + regression), not the standard's targets - reaching those targets means writing real test suites + for all of the above, which is a substantial task on its own, not a quick config change. +- ~~CI's pnpm version pin doesn't match the actual pnpm in use~~ **Resolved**: standardized on + pnpm 11.x, matching this project's actual dev environment (the one pnpm version proven to work + here all session). `.github/workflows/ci.yml`'s `PNPM_VERSION` is now `'11'`, and + `package.json` pins `"packageManager": "pnpm@11.6.0"` to match - `pnpm install` confirmed clean + locally with both in place (this is exactly the combination that previously failed when CI said + `'10'` and `packageManager` said `pnpm@11.6.0`: pnpm tried to force-switch versions and aborted + without an interactive terminal). Not independently verified against a real GitHub Actions run + from here, but there's no reason pnpm 11 - a current, published major version - shouldn't install + and run cleanly in that environment the same way it has here. diff --git a/eslint.config.js b/eslint.config.js index 8aaa2f9..9b6dbbe 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -44,7 +44,7 @@ export default defineConfig( }, { files: typedFiles, - extends: [tseslint.configs.recommendedTypeChecked], + extends: [tseslint.configs.strictTypeChecked, tseslint.configs.stylisticTypeChecked], languageOptions: { parserOptions: { projectService: true, @@ -52,9 +52,43 @@ export default defineConfig( }, }, rules: { - '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/no-floating-promises': 'error', '@typescript-eslint/no-misused-promises': 'error', + '@typescript-eslint/no-unsafe-argument': 'error', + '@typescript-eslint/no-unsafe-assignment': 'error', + '@typescript-eslint/no-unsafe-call': 'error', + '@typescript-eslint/no-unsafe-declaration-merging': 'error', + '@typescript-eslint/no-unsafe-enum-comparison': 'error', + '@typescript-eslint/no-unsafe-function-type': 'error', + '@typescript-eslint/no-unsafe-member-access': 'error', + '@typescript-eslint/no-unsafe-return': 'error', + '@typescript-eslint/no-unsafe-type-assertion': 'error', + '@typescript-eslint/no-unsafe-unary-minus': 'error', + '@typescript-eslint/only-throw-error': 'error', + '@typescript-eslint/require-await': 'error', + '@typescript-eslint/switch-exhaustiveness-check': 'error', + '@typescript-eslint/ban-ts-comment': [ + 'error', + { + minimumDescriptionLength: 10, + 'ts-check': false, + 'ts-expect-error': 'allow-with-description', + 'ts-ignore': true, + 'ts-nocheck': true, + }, + ], + '@typescript-eslint/consistent-type-imports': [ + 'error', + { fixStyle: 'inline-type-imports', prefer: 'type-imports' }, + ], + // `stylisticTypeChecked`'s default (string-only) is stricter than this + // codebase needs: seat coordinates, zoom levels, and prices are + // legitimately interpolated as numbers throughout. Objects, `null`, + // and `undefined` remain disallowed - those are the actual "prints + // '[object Object]'/'undefined' by accident" cases this rule guards + // against. + '@typescript-eslint/restrict-template-expressions': ['error', { allowNumber: true }], }, }, { diff --git a/package.json b/package.json index 713d394..a47ffd2 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "version": "0.0.0", "type": "module", "engines": { - "node": ">=24 <25" + "node": ">=24 <25", + "pnpm": ">=11 <12" }, "scripts": { "dev": "vite", @@ -29,43 +30,46 @@ "prepare": "husky", "preview": "vite preview", "quality": "pnpm format:check && pnpm lint && pnpm typecheck", - "test": "vitest run --passWithNoTests", + "security:audit": "pnpm audit --audit-level high", + "test": "vitest run --coverage --passWithNoTests", "typecheck": "tsc -b", "generate:venue": "ts-node scripts/generateVenue.ts" }, "dependencies": { - "@tailwindcss/vite": "^4.3.3", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "tailwindcss": "^4.3.3", - "zustand": "^5.0.15" + "@tailwindcss/vite": "4.3.3", + "react": "19.2.8", + "react-dom": "19.2.8", + "tailwindcss": "4.3.3", + "zustand": "5.0.15" }, "devDependencies": { - "@commitlint/cli": "^21.2.2", - "@commitlint/config-conventional": "^21.2.2", - "@eslint/js": "^9.39.5", - "@testing-library/jest-dom": "^7.0.1", - "@testing-library/react": "^16.3.3", - "@testing-library/user-event": "^14.6.7", - "@types/node": "^24.13.3", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.7", - "@vitejs/plugin-react": "^5.2.0", - "eslint": "^9.39.5", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-jsx-a11y": "^6.10.2", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.4.26", - "globals": "^16.5.0", - "husky": "^9.1.7", - "jsdom": "^30.0.1", - "lint-staged": "^17.5.0", - "prettier": "^3.9.6", - "ts-node": "^10.9.2", - "typescript": "~5.9.3", - "typescript-eslint": "^8.69.0", - "vite": "^7.3.6", - "vitest": "^5.0.0" - } + "@commitlint/cli": "21.2.2", + "@commitlint/config-conventional": "21.2.2", + "@eslint/js": "9.39.5", + "@testing-library/jest-dom": "7.0.1", + "@testing-library/react": "16.3.3", + "@testing-library/user-event": "14.6.7", + "@types/node": "24.13.3", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.7", + "@vitejs/plugin-react": "5.2.0", + "@vitest/coverage-v8": "5.0.0", + "eslint": "9.39.5", + "eslint-config-prettier": "10.1.8", + "eslint-plugin-jsx-a11y": "6.10.2", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.1.1", + "eslint-plugin-react-refresh": "0.4.26", + "globals": "16.5.0", + "husky": "9.1.7", + "jsdom": "30.0.1", + "lint-staged": "17.5.0", + "prettier": "3.9.6", + "ts-node": "10.9.2", + "typescript": "5.9.3", + "typescript-eslint": "8.69.0", + "vite": "7.3.6", + "vitest": "5.0.0" + }, + "packageManager": "pnpm@11.6.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82e14c0..1163427 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,99 +9,102 @@ importers: .: dependencies: '@tailwindcss/vite': - specifier: ^4.3.3 + specifier: 4.3.3 version: 4.3.3(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) react: - specifier: ^19.2.8 + specifier: 19.2.8 version: 19.2.8 react-dom: - specifier: ^19.2.8 + specifier: 19.2.8 version: 19.2.8(react@19.2.8) tailwindcss: - specifier: ^4.3.3 + specifier: 4.3.3 version: 4.3.3 zustand: - specifier: ^5.0.15 + specifier: 5.0.15 version: 5.0.15(@types/react@19.2.18)(react@19.2.8) devDependencies: '@commitlint/cli': - specifier: ^21.2.2 + specifier: 21.2.2 version: 21.2.2(@types/node@24.13.3)(conventional-commits-parser@7.1.2)(typescript@5.9.3) '@commitlint/config-conventional': - specifier: ^21.2.2 + specifier: 21.2.2 version: 21.2.2 '@eslint/js': - specifier: ^9.39.5 + specifier: 9.39.5 version: 9.39.5 '@testing-library/jest-dom': - specifier: ^7.0.1 - version: 7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))) + specifier: 7.0.1 + version: 7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.0) '@testing-library/react': - specifier: ^16.3.3 + specifier: 16.3.3 version: 16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@testing-library/user-event': - specifier: ^14.6.7 + specifier: 14.6.7 version: 14.6.7(@testing-library/dom@10.4.1) '@types/node': - specifier: ^24.13.3 + specifier: 24.13.3 version: 24.13.3 '@types/react': - specifier: ^19.2.18 + specifier: 19.2.18 version: 19.2.18 '@types/react-dom': - specifier: ^19.2.7 + specifier: 19.2.7 version: 19.2.7(@types/react@19.2.18) '@vitejs/plugin-react': - specifier: ^5.2.0 + specifier: 5.2.0 version: 5.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + '@vitest/coverage-v8': + specifier: 5.0.0 + version: 5.0.0(vitest@5.0.0) eslint: - specifier: ^9.39.5 + specifier: 9.39.5 version: 9.39.5(jiti@2.7.0) eslint-config-prettier: - specifier: ^10.1.8 + specifier: 10.1.8 version: 10.1.8(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-jsx-a11y: - specifier: ^6.10.2 + specifier: 6.10.2 version: 6.10.2(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react: - specifier: ^7.37.5 + specifier: 7.37.5 version: 7.37.5(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react-hooks: - specifier: ^7.1.1 + specifier: 7.1.1 version: 7.1.1(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react-refresh: - specifier: ^0.4.26 + specifier: 0.4.26 version: 0.4.26(eslint@9.39.5(jiti@2.7.0)) globals: - specifier: ^16.5.0 + specifier: 16.5.0 version: 16.5.0 husky: - specifier: ^9.1.7 + specifier: 9.1.7 version: 9.1.7 jsdom: - specifier: ^30.0.1 + specifier: 30.0.1 version: 30.0.1 lint-staged: - specifier: ^17.5.0 + specifier: 17.5.0 version: 17.5.0 prettier: - specifier: ^3.9.6 + specifier: 3.9.6 version: 3.9.6 ts-node: - specifier: ^10.9.2 + specifier: 10.9.2 version: 10.9.2(@types/node@24.13.3)(typescript@5.9.3) typescript: - specifier: ~5.9.3 + specifier: 5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.69.0 + specifier: 8.69.0 version: 8.69.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) vite: - specifier: ^7.3.6 + specifier: 7.3.6 version: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) vitest: - specifier: ^5.0.0 - version: 5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + specifier: 5.0.0 + version: 5.0.0(@types/node@24.13.3)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) packages: @@ -203,6 +206,10 @@ packages: resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true @@ -974,6 +981,23 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + '@vitest/coverage-v8@5.0.0': + resolution: {integrity: sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==} + peerDependencies: + '@vitest/browser': 5.0.0 + vitest: 5.0.0 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/istanbul-lib-coverage@1.0.1': + resolution: {integrity: sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==} + engines: {node: '>=22'} + + '@vitest/istanbul-lib-report@1.0.1': + resolution: {integrity: sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==} + engines: {node: '>=22'} + '@vitest/mocker@5.0.0': resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==} peerDependencies: @@ -1080,6 +1104,9 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-v8-to-istanbul@1.0.5: + resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -1752,6 +1779,9 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1921,6 +1951,9 @@ packages: magic-string@1.2.3: resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} + magicast@0.5.4: + resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -2281,6 +2314,10 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + engines: {node: '>=14.0.0'} + tldts-core@7.4.11: resolution: {integrity: sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==} @@ -2701,6 +2738,8 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@bcoe/v8-coverage@1.0.2': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 @@ -3183,7 +3222,7 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)))': + '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.0)': dependencies: '@adobe/css-tools': 4.5.0 '@testing-library/dom': 10.4.1 @@ -3193,7 +3232,7 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 optionalDependencies: - vitest: 5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + vitest: 5.0.0(@types/node@24.13.3)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) '@testing-library/react@16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -3366,6 +3405,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/coverage-v8@5.0.0(vitest@5.0.0)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/istanbul-lib-coverage': 1.0.1 + '@vitest/istanbul-lib-report': 1.0.1 + ast-v8-to-istanbul: 1.0.5 + magicast: 0.5.4 + obug: 2.1.4 + std-env: 4.2.0 + tinyrainbow: 3.1.1 + vitest: 5.0.0(@types/node@24.13.3)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + + '@vitest/istanbul-lib-coverage@1.0.1': {} + + '@vitest/istanbul-lib-report@1.0.1': + dependencies: + '@vitest/istanbul-lib-coverage': 1.0.1 + '@vitest/mocker@5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -3486,6 +3543,12 @@ snapshots: ast-types-flow@0.0.8: {} + ast-v8-to-istanbul@1.0.5: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + async-function@1.0.0: {} available-typed-arrays@1.0.7: @@ -4277,6 +4340,8 @@ snapshots: jiti@2.7.0: {} + js-tokens@10.0.0: {} + js-tokens@4.0.0: {} js-yaml@4.3.2: @@ -4430,6 +4495,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + magicast@0.5.4: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 + make-error@1.3.6: {} math-intrinsics@1.1.0: {} @@ -4854,6 +4925,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 + tinyrainbow@3.1.1: {} + tldts-core@7.4.11: {} tldts@7.4.11: @@ -4978,7 +5051,7 @@ snapshots: lightningcss: 1.32.0 yaml: 2.9.0 - vitest@5.0.0(@types/node@24.13.3)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + vitest@5.0.0(@types/node@24.13.3)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): dependencies: '@types/chai': 5.2.3 '@vitest/mocker': 5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) @@ -4996,6 +5069,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.13.3 + '@vitest/coverage-v8': 5.0.0(vitest@5.0.0) jsdom: 30.0.1 transitivePeerDependencies: - msw diff --git a/src/App.tsx b/src/App.tsx index 16d5693..7fdfd7a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -77,8 +77,12 @@ const App = () => { // Zooming doesn't try to keep any point centered - only the initial load // does (see the effect above). The user pans/scrolls freely afterward. - const handleZoomIn = () => setZoom(zoom + ZOOM_STEP); - const handleZoomOut = () => setZoom(Math.max(zoom - ZOOM_STEP, MIN_ZOOM)); + const handleZoomIn = () => { + setZoom(zoom + ZOOM_STEP); + }; + const handleZoomOut = () => { + setZoom(Math.max(zoom - ZOOM_STEP, MIN_ZOOM)); + }; const handleResetView = () => { if (!venue) return; useVenueStore.getState().setActiveSection(null); @@ -167,7 +171,9 @@ const App = () => { desktop/laptop. */} {!showSidebar && ( +

+ Replaces your current selection. +

+ + + {showReplaceConfirm && ( + { + setShowReplaceConfirm(false); + runSearch(); + }} + onCancel={() => { + setShowReplaceConfirm(false); + }} + /> + )} + + ); +} diff --git a/src/components/BookingSummary.tsx b/src/components/BookingSummary.tsx index 563907b..af669e8 100644 --- a/src/components/BookingSummary.tsx +++ b/src/components/BookingSummary.tsx @@ -5,6 +5,7 @@ import { buildSeatIndex, getTier } from '../utils/seatIndex'; import SeatSelectionPanel from './SeatSelectionPanel'; import SeatSelectionFooter from './SeatSelectionFooter'; import BookingHistoryPanel from './BookingHistoryPanel'; +import BestSeatsFinder from './BestSeatsFinder'; interface BookingSummaryProps { venue: Venue; @@ -62,6 +63,8 @@ export default function BookingSummary({ venue }: BookingSummaryProps) {
+ +

Price Tiers diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx index 7b960f7..5b64c03 100644 --- a/src/components/Icon.tsx +++ b/src/components/Icon.tsx @@ -9,6 +9,9 @@ const PATHS = { 'reset-view': 'M4 9.71C4 12.87 6.56 15.43 9.71 15.43C12.87 15.43 15.43 12.87 15.43 9.71C15.43 6.56 12.87 4 9.71 4C7.88 4 6.25 4.86 5.21 6.2M5.14 1.71L5.14 6.29L9.71 6.29M20 20L13.85 13.85', 'chevron-left': 'M15 6l-6 6 6 6', + // Magnifying glass: a circle plus a short diagonal handle, on the same + // 24x24 stroke viewBox as every other icon here. + search: 'M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14ZM21 21l-4.35-4.35', } as const; export type IconName = keyof typeof PATHS; diff --git a/src/store/seatStore.test.ts b/src/store/seatStore.test.ts index 999ef2f..0fb3339 100644 --- a/src/store/seatStore.test.ts +++ b/src/store/seatStore.test.ts @@ -111,6 +111,50 @@ describe('seatStore', () => { expect(useVenueStore.getState().viewingBookingId).toBeNull(); }); + it('selectSeatBlock replaces the current selection rather than merging into it', () => { + useVenueStore.getState().toggleSeat('SEAT-unrelated'); + useVenueStore.getState().selectSeatBlock(['SEAT-1', 'SEAT-2', 'SEAT-3'], 'S-1'); + + const { selectedSeats } = useVenueStore.getState(); + expect(Array.from(selectedSeats).sort()).toEqual(['SEAT-1', 'SEAT-2', 'SEAT-3']); + }); + + it('selectSeatBlock sets activeSectionId in the same update', () => { + useVenueStore.getState().selectSeatBlock(['SEAT-1'], 'S-4'); + expect(useVenueStore.getState().activeSectionId).toBe('S-4'); + }); + + it('selectSeatBlock clears any booking currently being viewed', () => { + useVenueStore.getState().viewBooking('BK-1'); + useVenueStore.getState().selectSeatBlock(['SEAT-1'], 'S-1'); + expect(useVenueStore.getState().viewingBookingId).toBeNull(); + }); + + it('selectSeatBlock refuses more than MAX_SELECTABLE_SEATS ids and leaves the selection untouched', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + const tooMany = Array.from({ length: MAX_SELECTABLE_SEATS + 1 }, (_, i) => `SEAT-block-${i}`); + + useVenueStore.getState().selectSeatBlock(tooMany, 'S-1'); + + expect(Array.from(useVenueStore.getState().selectedSeats)).toEqual(['SEAT-1']); + expect(useVenueStore.getState().feedback).toEqual({ + type: 'error', + message: `You can select a maximum of ${MAX_SELECTABLE_SEATS} seats.`, + }); + }); + + it('selectSeatBlock with an empty array leaves the selection untouched', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().selectSeatBlock([], 'S-1'); + expect(Array.from(useVenueStore.getState().selectedSeats)).toEqual(['SEAT-1']); + }); + + it('a seat chosen via selectSeatBlock can still be individually deselected via toggleSeat', () => { + useVenueStore.getState().selectSeatBlock(['SEAT-1', 'SEAT-2'], 'S-1'); + useVenueStore.getState().toggleSeat('SEAT-1'); + expect(Array.from(useVenueStore.getState().selectedSeats)).toEqual(['SEAT-2']); + }); + it('viewBooking and clearViewingBooking control which booking is highlighted', () => { useVenueStore.getState().viewBooking('BK-1'); expect(useVenueStore.getState().viewingBookingId).toBe('BK-1'); diff --git a/src/store/seatStore.ts b/src/store/seatStore.ts index 01ab4b1..07bce50 100644 --- a/src/store/seatStore.ts +++ b/src/store/seatStore.ts @@ -4,7 +4,7 @@ import type { PersistStorage, StorageValue } from 'zustand/middleware'; export const MAX_SELECTABLE_SEATS = 8; -interface Feedback { +export interface Feedback { type: 'info' | 'error'; message: string; } @@ -39,11 +39,13 @@ interface VenueState { setPan: (pan: { x: number; y: number }) => void; setView: (zoom: number, pan: { x: number; y: number }, transitionMs: number) => void; toggleSeat: (seatId: string) => void; + selectSeatBlock: (seatIds: string[], sectionId: string) => void; clearSelection: () => void; confirmPurchase: (total: number) => void; viewBooking: (id: string) => void; clearViewingBooking: () => void; clearFeedback: () => void; + setFeedback: (feedback: Feedback) => void; } type PersistedVenueState = Pick; @@ -138,6 +140,30 @@ export const useVenueStore = create()( return { selectedSeats: newSelected, viewingBookingId: null }; }), + // A whole contiguous block (from the best-seats finder) arrives as one + // unit, so it's one atomic transition - toggleSeat() can't express + // this without tripping the MAX_SELECTABLE_SEATS check partway + // through and firing one feedback per seat. Setting activeSectionId + // in the same update (rather than a separate setActiveSection call) + // means there's no intermediate commit where the seats are selected + // but their section isn't the mounted one yet. + selectSeatBlock: (seatIds, sectionId) => + set(() => { + if (seatIds.length === 0 || seatIds.length > MAX_SELECTABLE_SEATS) { + return { + feedback: { + type: 'error', + message: `You can select a maximum of ${MAX_SELECTABLE_SEATS} seats.`, + }, + }; + } + return { + selectedSeats: new Set(seatIds), + activeSectionId: sectionId, + viewingBookingId: null, + }; + }), + clearSelection: () => set({ selectedSeats: new Set() }), // The "checkout" transition: move whatever is currently selected into @@ -166,6 +192,7 @@ export const useVenueStore = create()( clearViewingBooking: () => set({ viewingBookingId: null }), clearFeedback: () => set({ feedback: null }), + setFeedback: (feedback) => set({ feedback }), }), { name: 'venue-storage', diff --git a/src/utils/findBestSeats.test.ts b/src/utils/findBestSeats.test.ts new file mode 100644 index 0000000..168c72f --- /dev/null +++ b/src/utils/findBestSeats.test.ts @@ -0,0 +1,277 @@ +import { describe, expect, it } from 'vitest'; +import type { ISeat, Row, Section, Venue } from '../interfaces/venue.interfaces'; +import { TIERS } from './seatIndex'; +import { compareBlocks, findBestSeats } from './findBestSeats'; +import type { BlockRanking } from './findBestSeats'; + +function makeSeat(col: number, priceTier = 1, status: ISeat['status'] = 'available'): ISeat { + return { id: `S${col}`, col, x: col, y: 0, priceTier, status }; +} + +function makeRow(index: number, seats: ISeat[]): Row { + return { index, seats }; +} + +function makeVenue(sections: { id: string; label: string; rows: Row[] }[]): Venue { + const mapped: Section[] = sections.map((s) => ({ + id: s.id, + label: s.label, + transform: { x: 0, y: 0, scale: 1 }, + rows: s.rows, + })); + return { venueId: 'v', name: 'Venue', map: { width: 100, height: 100 }, sections: mapped }; +} + +const isAvailable = (seat: ISeat) => seat.status === 'available'; + +describe('findBestSeats', () => { + it('finds the only run of exactly partySize seats, in ascending col order', () => { + const venue = makeVenue([ + { + id: 'S-1', + label: 'Section 1', + rows: [ + makeRow( + 1, + [1, 2, 3].map((c) => makeSeat(c)), + ), + ], + }, + ]); + const block = findBestSeats(venue, 3, 'view', isAvailable); + expect(block?.seatIds).toEqual(['S1', 'S2', 'S3']); + }); + + it('returns null when no run is long enough', () => { + const venue = makeVenue([ + { id: 'S-1', label: 'Section 1', rows: [makeRow(1, [makeSeat(1), makeSeat(2)])] }, + ]); + expect(findBestSeats(venue, 3, 'view', isAvailable)).toBeNull(); + }); + + it.each(['sold', 'reserved', 'held'] as const)( + 'treats %s seats as unselectable via the injected predicate', + (status) => { + const seats = [makeSeat(1), makeSeat(2, 1, status), makeSeat(3), makeSeat(4)]; + const venue = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [makeRow(1, seats)] }]); + const block = findBestSeats(venue, 2, 'view', isAvailable); + expect(block?.seatIds).toEqual(['S3', 'S4']); + }, + ); + + it('respects the injected predicate for seats venue.json itself marks available', () => { + const seats = [makeSeat(1), makeSeat(2), makeSeat(3), makeSeat(4)]; + const soldElsewhere = new Set(['S2']); + const venue = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [makeRow(1, seats)] }]); + const block = findBestSeats( + venue, + 2, + 'view', + (seat) => isAvailable(seat) && !soldElsewhere.has(seat.id), + ); + expect(block?.seatIds).toEqual(['S3', 'S4']); + }); + + it('a gap in col breaks contiguity - refuses to span it', () => { + const seats = [makeSeat(1), makeSeat(2), makeSeat(4), makeSeat(5)]; + const venue = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [makeRow(1, seats)] }]); + expect(findBestSeats(venue, 3, 'view', isAvailable)).toBeNull(); + }); + + it('the same gapped row still finds the smaller in-bounds block', () => { + const seats = [makeSeat(1), makeSeat(2), makeSeat(4), makeSeat(5)]; + const venue = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [makeRow(1, seats)] }]); + const block = findBestSeats(venue, 2, 'view', isAvailable); + expect(block?.seatIds).toEqual(['S1', 'S2']); + }); + + it("'view' prefers the lower row index even when a further row is cheaper and better centred", () => { + const venue = makeVenue([ + { + id: 'S-1', + label: 'Section 1', + rows: [ + makeRow( + 1, + [1, 2, 3, 4, 5].map((c) => makeSeat(c, 3)), + ), + makeRow( + 2, + [1, 2, 3, 4, 5].map((c) => makeSeat(c, 1)), + ), + ], + }, + ]); + const block = findBestSeats(venue, 2, 'view', isAvailable); + expect(block?.rowIndex).toBe(1); + }); + + it("'price' prefers the cheaper block even when it is further from the stage", () => { + const venue = makeVenue([ + { + id: 'S-1', + label: 'Section 1', + rows: [ + makeRow( + 1, + [1, 2, 3, 4, 5].map((c) => makeSeat(c, 1)), + ), + makeRow( + 2, + [1, 2, 3, 4, 5].map((c) => makeSeat(c, 3)), + ), + ], + }, + ]); + const block = findBestSeats(venue, 2, 'price', isAvailable); + expect(block?.rowIndex).toBe(2); + expect(block?.totalPrice).toBe(TIERS[3]?.price ? TIERS[3].price * 2 : 0); + }); + + it("'price' tiebreak: among equally-priced blocks, the lower row index wins", () => { + const venue = makeVenue([ + { + id: 'S-1', + label: 'Section 1', + rows: [ + makeRow( + 1, + [1, 2, 3, 4, 5].map((c) => makeSeat(c, 2)), + ), + makeRow( + 2, + [1, 2, 3, 4, 5].map((c) => makeSeat(c, 2)), + ), + ], + }, + ]); + const block = findBestSeats(venue, 2, 'price', isAvailable); + expect(block?.rowIndex).toBe(1); + }); + + it("'view' tiebreak within one row: the most centred window wins, not the leftmost", () => { + const seats = Array.from({ length: 18 }, (_, i) => makeSeat(i + 1)); + const venue = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [makeRow(1, seats)] }]); + const block = findBestSeats(venue, 4, 'view', isAvailable); + // Row centre is (1 + 18) / 2 = 9.5; the most centred 4-seat window is + // cols 8-11 (centre 9.5, offset 0) - not the leftmost window (1-4). + expect(block?.seatIds).toEqual(['S8', 'S9', 'S10', 'S11']); + }); + + it('centring is measured in col space: identical col layouts rank identically regardless of x/y spacing', () => { + const tightRow = makeRow( + 1, + [1, 2, 3, 4, 5].map((c) => ({ ...makeSeat(c), x: c * 3.77 })), + ); + const wideRow = makeRow( + 2, + [1, 2, 3, 4, 5].map((c) => ({ ...makeSeat(c), x: c * 8.14 })), + ); + const venueTight = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [tightRow] }]); + const venueWide = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [wideRow] }]); + const tightBlock = findBestSeats(venueTight, 3, 'view', isAvailable); + const wideBlock = findBestSeats(venueWide, 3, 'view', isAvailable); + expect(tightBlock?.centreOffset).toBe(wideBlock?.centreOffset); + }); + + it('determinism across congruent sections: the lower sectionOrder wins regardless of input order', () => { + const row = () => + makeRow( + 1, + [1, 2, 3].map((c) => makeSeat(c)), + ); + const forward = makeVenue([ + { id: 'S-A', label: 'A', rows: [row()] }, + { id: 'S-B', label: 'B', rows: [row()] }, + ]); + const reversed = makeVenue([ + { id: 'S-B', label: 'B', rows: [row()] }, + { id: 'S-A', label: 'A', rows: [row()] }, + ]); + expect(findBestSeats(forward, 3, 'view', isAvailable)?.sectionId).toBe('S-A'); + expect(findBestSeats(reversed, 3, 'view', isAvailable)?.sectionId).toBe('S-B'); + }); + + it('party size 1 returns a single seat with startCol === endCol', () => { + const venue = makeVenue([ + { id: 'S-1', label: 'Section 1', rows: [makeRow(1, [makeSeat(1), makeSeat(2)])] }, + ]); + const block = findBestSeats(venue, 1, 'view', isAvailable); + expect(block?.startCol).toBe(block?.endCol); + expect(block?.seatIds).toHaveLength(1); + }); + + it.each([0, -1, 2.5])('rejects an invalid party size (%s) rather than throwing', (partySize) => { + const venue = makeVenue([ + { id: 'S-1', label: 'Section 1', rows: [makeRow(1, [makeSeat(1), makeSeat(2)])] }, + ]); + expect(findBestSeats(venue, partySize, 'view', isAvailable)).toBeNull(); + }); + + it('an empty venue, a row-less section, and a seat-less row all return null without throwing', () => { + const empty = makeVenue([]); + expect(findBestSeats(empty, 2, 'view', isAvailable)).toBeNull(); + + const noRows = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [] }]); + expect(findBestSeats(noRows, 2, 'view', isAvailable)).toBeNull(); + + const noSeats = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [makeRow(1, [])] }]); + expect(findBestSeats(noSeats, 2, 'view', isAvailable)).toBeNull(); + }); + + it('sums real per-seat prices rather than assuming a uniform tier across the block', () => { + const seats = [makeSeat(1, 1), makeSeat(2, 1), makeSeat(3, 3)]; + const venue = makeVenue([{ id: 'S-1', label: 'Section 1', rows: [makeRow(1, seats)] }]); + const block = findBestSeats(venue, 3, 'view', isAvailable); + const tier1 = TIERS[1]?.price ?? 0; + const tier3 = TIERS[3]?.price ?? 0; + expect(block?.totalPrice).toBe(tier1 * 2 + tier3); + }); + + it('skips a row shorter than partySize and still finds a later valid row', () => { + const venue = makeVenue([ + { + id: 'S-1', + label: 'Section 1', + rows: [makeRow(1, [makeSeat(1)]), makeRow(2, [makeSeat(1), makeSeat(2), makeSeat(3)])], + }, + ]); + const block = findBestSeats(venue, 3, 'view', isAvailable); + expect(block?.rowIndex).toBe(2); + }); +}); + +describe('compareBlocks', () => { + const base: BlockRanking = { + rowIndex: 1, + totalPrice: 100, + centreOffset: 0, + sectionOrder: 0, + startCol: 1, + }; + + it('is antisymmetric and zero only for identical rankings, for both priorities', () => { + const variants: BlockRanking[] = [ + base, + { ...base, rowIndex: 2 }, + { ...base, totalPrice: 50 }, + { ...base, centreOffset: 3 }, + { ...base, sectionOrder: 1 }, + { ...base, startCol: 5 }, + ]; + + // Math.sign(0) is +0 while -Math.sign(0) is -0 - both "zero" but distinct + // under Object.is, which `.toBe` uses. Summing the two signs sidesteps + // that (1 + -1 = 0, 0 + 0 = 0) without losing the antisymmetry check. + (['view', 'price'] as const).forEach((priority) => { + for (const a of variants) { + for (const b of variants) { + const cmp = compareBlocks(a, b, priority); + const rev = compareBlocks(b, a, priority); + expect(Math.sign(cmp) + Math.sign(rev)).toBe(0); + if (a === b) expect(cmp).toBe(0); + } + } + }); + }); +}); diff --git a/src/utils/findBestSeats.ts b/src/utils/findBestSeats.ts new file mode 100644 index 0000000..a9b33da --- /dev/null +++ b/src/utils/findBestSeats.ts @@ -0,0 +1,169 @@ +import type { ISeat, Venue } from '../interfaces/venue.interfaces'; +import { getTier } from './seatIndex'; +import { rowLetter } from './rowLetter'; + +export type SeatPriority = 'view' | 'price'; + +// Injected rather than read from the store, so the solver stays a pure +// function testable without Zustand - the caller composes this from +// venue.json status plus session-local state (soldSeats, holds, ...). +export type IsSeatSelectable = (seat: ISeat) => boolean; + +// Every field is a number sorted ascending, which is what lets compareBlocks +// be driven by a key list instead of per-priority branching. +export interface BlockRanking { + rowIndex: number; // Row.index (1-based); lower = smaller radius = closer to the stage + totalPrice: number; + // |block col-centre - row col-centre|, in col units - not x/y. Every seat + // in a row sits on the same arc at the same radius and col maps linearly + // onto angle (see generateVenue.ts), so col-centring *is* angular + // centring. x/y centring would distort the comparison: arc length per + // seat grows with radius, so an x/y offset for the same col displacement + // is larger in an outer row than an identical inner-row one for no + // ticketing-relevant reason. + centreOffset: number; + sectionOrder: number; // index into venue.sections - a tiebreaker, not a rank + startCol: number; // a tiebreaker, not a rank +} + +export interface SeatBlock extends BlockRanking { + seatIds: string[]; // ascending col order + sectionId: string; + sectionLabel: string; + rowLabel: string; + endCol: number; +} + +// (sectionOrder, rowIndex, startCol) uniquely identifies a candidate block, +// and both orders end in (sectionOrder, startCol) after their priority- +// specific keys - so compareBlocks returns 0 only when comparing a block +// with itself. That strict total order is what makes "best available" mean +// the same seat on every call, rather than depending on venue.sections' +// array order. +const RANKING_KEYS: Record = { + view: ['rowIndex', 'centreOffset', 'totalPrice', 'sectionOrder', 'startCol'], + price: ['totalPrice', 'rowIndex', 'centreOffset', 'sectionOrder', 'startCol'], +}; + +export function compareBlocks(a: BlockRanking, b: BlockRanking, priority: SeatPriority): number { + for (const key of RANKING_KEYS[priority]) { + const diff = a[key] - b[key]; + if (diff !== 0) return diff; + } + return 0; +} + +interface BestSoFar { + ranking: BlockRanking; + sectionId: string; + sectionLabel: string; + rowIndex: number; + seats: ISeat[]; +} + +// One left-to-right pass per row, sliding a window of exactly `partySize` +// selectable seats. Every window is scored (not just one per run) because +// the most central window in a long run usually isn't the leftmost one. +function scoreRow( + row: { index: number; seats: ISeat[] }, + section: { id: string; label: string }, + sectionOrder: number, + partySize: number, + priority: SeatPriority, + isSelectable: IsSeatSelectable, + best: BestSoFar | null, +): BestSoFar | null { + const [first] = row.seats; + const last = row.seats.at(-1); + if (!first || !last) return best; + const rowCentre = (first.col + last.col) / 2; + + let prev: ISeat | undefined; + let window: ISeat[] = []; + let updated = best; + + for (const seat of row.seats) { + const selectable = isSelectable(seat); + // A gap in `col` breaks contiguity even if both sides are selectable - + // this is what makes an aisle (or any missing seat) a real boundary + // rather than "adjacent in the array". + const brokenRun = !selectable || (prev !== undefined && seat.col !== prev.col + 1); + if (brokenRun) window = []; + if (selectable) { + window.push(seat); + if (window.length > partySize) window.shift(); + + if (window.length === partySize) { + const [windowFirst] = window; + const windowLast = window.at(-1); + if (windowFirst && windowLast) { + let totalPrice = 0; + for (const s of window) totalPrice += getTier(s.priceTier).price; + const blockCentre = (windowFirst.col + windowLast.col) / 2; + + const ranking: BlockRanking = { + rowIndex: row.index, + totalPrice, + centreOffset: Math.abs(blockCentre - rowCentre), + sectionOrder, + startCol: windowFirst.col, + }; + + if (!updated || compareBlocks(ranking, updated.ranking, priority) < 0) { + updated = { + ranking, + sectionId: section.id, + sectionLabel: section.label, + rowIndex: row.index, + seats: [...window], + }; + } + } + } + } + prev = seat; + } + + return updated; +} + +// Finds the single best contiguous block of `partySize` selectable seats in +// the venue, per `priority`. O(total seats * partySize): partySize is +// capped at MAX_SELECTABLE_SEATS by the caller, so this is a few hundred +// thousand elementary operations at most - single-digit milliseconds for a +// user-initiated search, not something that needs memoising or debouncing. +export function findBestSeats( + venue: Venue, + partySize: number, + priority: SeatPriority, + isSelectable: IsSeatSelectable, +): SeatBlock | null { + if (!Number.isInteger(partySize) || partySize < 1) return null; + + let best: BestSoFar | null = null; + let sectionOrder = 0; + for (const section of venue.sections) { + for (const row of section.rows) { + best = scoreRow(row, section, sectionOrder, partySize, priority, isSelectable, best); + } + sectionOrder += 1; + } + + if (!best) return null; + const { ranking, sectionId, sectionLabel, rowIndex, seats } = best; + const [firstSeat] = seats; + const lastSeat = seats.at(-1); + // Unreachable in practice (a BestSoFar is only ever built from a + // `partySize`-length window, so `seats` is never empty) - guarded rather + // than asserted to satisfy noUncheckedIndexedAccess without a `!`. + if (!firstSeat || !lastSeat) return null; + + return { + ...ranking, + seatIds: seats.map((s) => s.id), + sectionId, + sectionLabel, + rowLabel: rowLetter(rowIndex - 1), + endCol: lastSeat.col, + }; +} From 7779fad2da1663aab2e877e99c96dd64d4869cc8 Mon Sep 17 00:00:00 2001 From: Viral Webvoltz Date: Thu, 10 Sep 2026 12:47:04 +0530 Subject: [PATCH 20/26] feat: live seat-hold contention across tabs, with a checkout timer Seats can now be genuinely held rather than just statically flagged: selecting a seat starts a 5-minute checkout deadline, venue.json's sample `held` seats get real staggered expiries instead of never releasing, and a BroadcastChannel-based protocol shares holds and sales across tabs of the same browser (with a deterministic tie-break for simultaneous picks, and a no-op fallback when the channel is unavailable). Status derivation moves out of Seat.tsx into a single pure resolver, which also fixes two bugs along the way: seats re-rendered on every zoom tick instead of only when the label threshold was crossed, and the price in every seat's aria-label read the raw tier number instead of its dollar amount. --- src/App.tsx | 2 + src/components/BookingSummary.tsx | 13 +- src/components/CheckoutTimer.test.tsx | 87 ++++++++++ src/components/CheckoutTimer.tsx | 59 +++++++ src/components/HoldRuntime.tsx | 17 ++ src/components/Icon.tsx | 2 + src/components/Seat.test.tsx | 59 ++++++- src/components/Seat.tsx | 80 +++++----- src/components/SeatSelectionPanel.tsx | 2 + src/hooks/useCountdown.test.ts | 59 +++++++ src/hooks/useCountdown.ts | 40 +++++ src/hooks/useHoldExpiry.ts | 53 ++++++ src/hooks/useHoldSync.test.ts | 178 +++++++++++++++++++++ src/hooks/useHoldSync.ts | 176 ++++++++++++++++++++ src/index.css | 26 +++ src/interfaces/venue.interfaces.ts | 39 +++++ src/store/seatStore.test.ts | 173 +++++++++++++++++++- src/store/seatStore.ts | 177 +++++++++++++++++++-- src/test/fakeBroadcastChannel.ts | 45 ++++++ src/utils/formatCountdown.test.ts | 58 +++++++ src/utils/formatCountdown.ts | 40 +++++ src/utils/holdChannel.test.ts | 69 ++++++++ src/utils/holdChannel.ts | 67 ++++++++ src/utils/holdProtocol.test.ts | 221 ++++++++++++++++++++++++++ src/utils/holdProtocol.ts | 202 +++++++++++++++++++++++ src/utils/holdSimulation.test.ts | 92 +++++++++++ src/utils/holdSimulation.ts | 56 +++++++ src/utils/seatStatus.test.ts | 135 ++++++++++++++++ src/utils/seatStatus.ts | 110 +++++++++++++ src/utils/sessionId.test.ts | 68 ++++++++ src/utils/sessionId.ts | 36 +++++ 31 files changed, 2386 insertions(+), 55 deletions(-) create mode 100644 src/components/CheckoutTimer.test.tsx create mode 100644 src/components/CheckoutTimer.tsx create mode 100644 src/components/HoldRuntime.tsx create mode 100644 src/hooks/useCountdown.test.ts create mode 100644 src/hooks/useCountdown.ts create mode 100644 src/hooks/useHoldExpiry.ts create mode 100644 src/hooks/useHoldSync.test.ts create mode 100644 src/hooks/useHoldSync.ts create mode 100644 src/test/fakeBroadcastChannel.ts create mode 100644 src/utils/formatCountdown.test.ts create mode 100644 src/utils/formatCountdown.ts create mode 100644 src/utils/holdChannel.test.ts create mode 100644 src/utils/holdChannel.ts create mode 100644 src/utils/holdProtocol.test.ts create mode 100644 src/utils/holdProtocol.ts create mode 100644 src/utils/holdSimulation.test.ts create mode 100644 src/utils/holdSimulation.ts create mode 100644 src/utils/seatStatus.test.ts create mode 100644 src/utils/seatStatus.ts create mode 100644 src/utils/sessionId.test.ts create mode 100644 src/utils/sessionId.ts diff --git a/src/App.tsx b/src/App.tsx index 898eea1..43e4108 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,7 @@ import VenueMap from './components/VenueMap'; import { useVenue } from './hooks/useVenue'; import BookingSummary from './components/BookingSummary'; import Toast from './components/Toast'; +import HoldRuntime from './components/HoldRuntime'; import Icon from './components/Icon'; import IconButton from './components/IconButton'; import { useCallback, useEffect, useState, useRef } from 'react'; @@ -393,6 +394,7 @@ const App = () => { +

); }; diff --git a/src/components/BookingSummary.tsx b/src/components/BookingSummary.tsx index af669e8..a823de6 100644 --- a/src/components/BookingSummary.tsx +++ b/src/components/BookingSummary.tsx @@ -32,11 +32,14 @@ export default function BookingSummary({ venue }: BookingSummaryProps) { }, [confirmedTotal]); const handleConfirmPurchase = (total: number) => { - // Booking is confirmed: mark these seats sold (persisted - see - // seatStore.ts) so they stay unavailable across a reload instead of - // quietly becoming selectable again, and record it in booking history. - setConfirmedTotal(total); - confirmPurchase(total); + // confirmPurchase re-validates the checkout deadline itself and + // returns null if it had already lapsed - only show the "confirmed" + // banner for a sale that actually happened. On success it marks these + // seats sold (persisted - see seatStore.ts) so they stay unavailable + // across a reload instead of quietly becoming selectable again, and + // records it in booking history. + const booking = confirmPurchase(total); + if (booking) setConfirmedTotal(total); }; // Live seat selection takes over the sidebar the moment it starts, and diff --git a/src/components/CheckoutTimer.test.tsx b/src/components/CheckoutTimer.test.tsx new file mode 100644 index 0000000..79c58a2 --- /dev/null +++ b/src/components/CheckoutTimer.test.tsx @@ -0,0 +1,87 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { act, render } from '@testing-library/react'; +import { useVenueStore } from '../store/seatStore'; +import CheckoutTimer from './CheckoutTimer'; + +const resetStore = () => { + useVenueStore.setState({ selectionExpiresAt: null }); +}; + +function getTimer(): HTMLElement { + const el = document.querySelector('[role="timer"]'); + if (!(el instanceof HTMLElement)) throw new Error('Expected a [role="timer"] element to render.'); + return el; +} + +describe('CheckoutTimer', () => { + beforeEach(() => { + resetStore(); + vi.useFakeTimers(); + vi.setSystemTime(0); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('renders nothing when there is no checkout deadline', () => { + render(); + expect(document.querySelector('[role="timer"]')).toBeNull(); + }); + + it('shows the initial time remaining and ticks down after a second', () => { + useVenueStore.setState({ selectionExpiresAt: 300_000 }); + render(); + + const digits = getTimer().querySelector('span[aria-hidden="true"]'); + expect(digits?.textContent).toBe('5:00'); + + act(() => { + vi.advanceTimersByTime(1000); + }); + expect(getTimer().querySelector('span[aria-hidden="true"]')?.textContent).toBe('4:59'); + }); + + it('the ticking digits are hidden from assistive tech; the container carries the accessible name', () => { + useVenueStore.setState({ selectionExpiresAt: 300_000 }); + render(); + + const timer = getTimer(); + expect(timer.getAttribute('aria-label')).toBe('Time left to complete your booking'); + const digits = timer.querySelector('span[aria-hidden="true"]'); + expect(digits).not.toBeNull(); + expect(digits?.textContent).toBe('5:00'); + }); + + it('the live-region announcement is stable across ticks within one band', () => { + useVenueStore.setState({ selectionExpiresAt: 119_000 }); + render(); + const before = getTimer().querySelector('[aria-live="polite"]')?.textContent; + + act(() => { + vi.advanceTimersByTime(30_000); + }); + const after = getTimer().querySelector('[aria-live="polite"]')?.textContent; + + expect(after).toBe(before); + }); + + it('the live-region announcement changes on crossing the 2-minute boundary', () => { + useVenueStore.setState({ selectionExpiresAt: 121_000 }); + render(); + const before = getTimer().querySelector('[aria-live="polite"]')?.textContent; + + act(() => { + vi.advanceTimersByTime(2000); + }); + const after = getTimer().querySelector('[aria-live="polite"]')?.textContent; + + expect(after).not.toBe(before); + }); + + it('applies warning styling once under a minute remains', () => { + useVenueStore.setState({ selectionExpiresAt: 45_000 }); + render(); + expect(getTimer().className).toContain('border-amber-300'); + }); +}); diff --git a/src/components/CheckoutTimer.tsx b/src/components/CheckoutTimer.tsx new file mode 100644 index 0000000..cf48089 --- /dev/null +++ b/src/components/CheckoutTimer.tsx @@ -0,0 +1,59 @@ +import { useVenueStore } from '../store/seatStore'; +import { useCountdown } from '../hooks/useCountdown'; +import { SELECTION_HOLD_MS } from '../utils/holdProtocol'; +import { + describeCountdownMilestone, + formatCountdown, + pickCountdownMilestone, +} from '../utils/formatCountdown'; +import Icon from './Icon'; + +const URGENT_THRESHOLD_MS = 60_000; +const PULSE_THRESHOLD_MS = 30_000; + +export default function CheckoutTimer() { + const selectionExpiresAt = useVenueStore((s) => s.selectionExpiresAt); + const remaining = useCountdown(selectionExpiresAt); + + if (remaining === null) return null; + + const isUrgent = remaining <= URGENT_THRESHOLD_MS; + const progressPercent = Math.min(100, Math.max(0, (remaining / SELECTION_HOLD_MS) * 100)); + + return ( +
+
+ + + Seats held for + + {/* The ticking digits are silent to assistive tech - see the + aria-live sibling below, which announces stable milestone bands + instead of every second. */} + +
+
+
+
+ + {describeCountdownMilestone(pickCountdownMilestone(remaining))} + +
+ ); +} diff --git a/src/components/HoldRuntime.tsx b/src/components/HoldRuntime.tsx new file mode 100644 index 0000000..07846fd --- /dev/null +++ b/src/components/HoldRuntime.tsx @@ -0,0 +1,17 @@ +import type { Venue } from '../interfaces/venue.interfaces'; +import { useHoldExpiry } from '../hooks/useHoldExpiry'; +import { useHoldSync } from '../hooks/useHoldSync'; + +interface HoldRuntimeProps { + venue: Venue; +} + +// Renders nothing. Exists purely to host the imperative hold-expiry and +// cross-tab-sync subscriptions outside the main render tree - both +// subscribe to the store directly (not via selector hooks), so neither +// this component nor anything it's near ever re-renders because of them. +export default function HoldRuntime({ venue }: HoldRuntimeProps) { + useHoldExpiry(); + useHoldSync(venue); + return null; +} diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx index 5b64c03..ca13234 100644 --- a/src/components/Icon.tsx +++ b/src/components/Icon.tsx @@ -12,6 +12,8 @@ const PATHS = { // Magnifying glass: a circle plus a short diagonal handle, on the same // 24x24 stroke viewBox as every other icon here. search: 'M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14ZM21 21l-4.35-4.35', + // Clock face: a circle plus two hands meeting at the centre. + clock: 'M12 8v4l3 3M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z', } as const; export type IconName = keyof typeof PATHS; diff --git a/src/components/Seat.test.tsx b/src/components/Seat.test.tsx index 94578eb..a2f6dc2 100644 --- a/src/components/Seat.test.tsx +++ b/src/components/Seat.test.tsx @@ -1,9 +1,13 @@ import { beforeEach, describe, expect, it } from 'vitest'; import { render, fireEvent } from '@testing-library/react'; -import type { Row } from '../interfaces/venue.interfaces'; +import type { HoldMap, Row } from '../interfaces/venue.interfaces'; import { useVenueStore } from '../store/seatStore'; import Seats from './Seat'; +function holdMap(...holds: { seatId: string; owner: string; expiresAt: number }[]): HoldMap { + return new Map(holds.map((h) => [h.seatId, h])); +} + // Two aligned rows of three seats so Arrow{Up,Down} land on a predictable // nearest-x match, and Arrow{Left,Right} walk within a row. const rows: Row[] = [ @@ -49,6 +53,8 @@ const resetStore = () => { soldSeats: new Set(), zoom: 0.4, feedback: null, + holds: new Map(), + simulationSeeded: false, }); }; @@ -120,4 +126,55 @@ describe('Seats keyboard navigation and selection', () => { expect(seatA2.getAttribute('tabindex')).toBe('-1'); expect(seatA2.getAttribute('aria-disabled')).toBe('true'); }); + + it('a live foreign hold renders as unavailable, and clicking it sets feedback instead of selecting', () => { + useVenueStore.setState({ + holds: holdMap({ seatId: 'A2', owner: 'peer', expiresAt: Date.now() + 60_000 }), + }); + renderSeats(); + const seatA2 = getSeat('seat-A2'); + + expect(seatA2.getAttribute('aria-disabled')).toBe('true'); + expect(seatA2.getAttribute('tabindex')).toBe('-1'); + expect(seatA2.getAttribute('aria-label')).toContain('temporarily held by another customer'); + + fireEvent.click(seatA2); + expect(useVenueStore.getState().selectedSeats.has('A2')).toBe(false); + expect(useVenueStore.getState().feedback?.type).toBe('error'); + }); + + it('becomes selectable again once its hold has lapsed, keeping focus on the same element', () => { + useVenueStore.setState({ + holds: holdMap({ seatId: 'A2', owner: 'peer', expiresAt: Date.now() - 1 }), + }); + renderSeats(); + const seatA2 = getSeat('seat-A2'); + seatA2.focus(); + + expect(seatA2.getAttribute('aria-disabled')).toBe('false'); + fireEvent.click(seatA2); + expect(useVenueStore.getState().selectedSeats.has('A2')).toBe(true); + // Same DOM node throughout (stable `key`), so focus was never lost. + expect(document.activeElement).toBe(document.getElementById('seat-A2')); + }); + + it('a JSON-held seat reads as held before the simulation has seeded', () => { + const heldRows: Row[] = [ + { index: 1, seats: [{ id: 'H1', col: 1, x: 0, y: 0, priceTier: 1, status: 'held' }] }, + ]; + render({}); + const seat = getSeat('seat-H1'); + expect(seat.getAttribute('aria-disabled')).toBe('true'); + expect(seat.getAttribute('aria-label')).toContain('temporarily held by another customer'); + }); + + it('the same JSON-held seat reads as available once seeded, with no live hold record', () => { + useVenueStore.setState({ simulationSeeded: true }); + const heldRows: Row[] = [ + { index: 1, seats: [{ id: 'H1', col: 1, x: 0, y: 0, priceTier: 1, status: 'held' }] }, + ]; + render({}); + const seat = getSeat('seat-H1'); + expect(seat.getAttribute('aria-disabled')).toBe('false'); + }); }); diff --git a/src/components/Seat.tsx b/src/components/Seat.tsx index 37a8874..80835ec 100644 --- a/src/components/Seat.tsx +++ b/src/components/Seat.tsx @@ -2,6 +2,13 @@ import { memo, useMemo } from 'react'; import type { ISeat, Row } from '../interfaces/venue.interfaces'; import { useVenueStore } from '../store/seatStore'; import { rowLetter } from '../utils/rowLetter'; +import { getTier } from '../utils/seatIndex'; +import { + SEAT_STATUS_STYLE, + describeSeatStatus, + isSeatSelectable, + resolveSeatStatus, +} from '../utils/seatStatus'; interface SeatsProps { rows: Row[]; @@ -27,11 +34,22 @@ const LABEL_ZOOM_THRESHOLD = 2; const Seats = memo(function Seats({ rows }: SeatsProps) { const selectedSeats = useVenueStore((s) => s.selectedSeats); const soldSeats = useVenueStore((s) => s.soldSeats); + const holds = useVenueStore((s) => s.holds); + const simulationSeeded = useVenueStore((s) => s.simulationSeeded); const bookings = useVenueStore((s) => s.bookings); const viewingBookingId = useVenueStore((s) => s.viewingBookingId); const toggleSeat = useVenueStore((s) => s.toggleSeat); - const zoom = useVenueStore((s) => s.zoom); - const showLabels = zoom >= LABEL_ZOOM_THRESHOLD; + const setFeedback = useVenueStore((s) => s.setFeedback); + // A boolean selector, not the raw zoom value - all ~1,500 seats in the + // active section would otherwise re-render on every wheel/zoom event + // (Zustand's default equality is Object.is, so a boolean that doesn't + // change produces no re-render; the raw zoom number changes constantly). + const showLabels = useVenueStore((s) => s.zoom >= LABEL_ZOOM_THRESHOLD); + + // Computed once per render of this component, not once per seat - a + // countdown-precision read isn't needed here, just "is this hold still + // live right now". + const now = Date.now(); // Seats belonging to whichever past booking is currently being viewed // from Booking History, if any - highlighted on top of their normal @@ -51,6 +69,11 @@ const Seats = memo(function Seats({ rows }: SeatsProps) { if (!isUnavailable) { toggleSeat(seat.id); e.currentTarget.focus(); + } else { + // A seat can go from available to held between paint and click now + // (another tab, or the simulation) - a silent no-op would look broken + // in exactly that case, so say why nothing happened. + setFeedback({ type: 'error', message: 'That seat is no longer available.' }); } }; @@ -111,38 +134,24 @@ const Seats = memo(function Seats({ rows }: SeatsProps) { <> {rows.map((row, rowIndex) => row.seats.map((seat, seatIndex) => { - const isSelected = selectedSeats.has(seat.id); - // Sold if the sample data says so, or if it was bought in this - // browser via confirmPurchase() - see seatStore.ts. - const isSold = seat.status === 'sold' || soldSeats.has(seat.id); - const isReserved = seat.status === 'reserved'; - const isHeld = seat.status === 'held'; - const isUnavailable = isSold || isReserved || isHeld; - - let fill = 'var(--color-seat-available)'; - let stroke = 'var(--color-seat-available-stroke)'; - let strokeWidth = 0.35; - let textColor = '#334155'; // slate-700 - reads on white/light fills - - if (isSold) { - fill = 'var(--color-seat-sold)'; - stroke = 'none'; - } else if (isReserved) { - fill = 'var(--color-seat-reserved)'; - stroke = 'none'; - } else if (isHeld) { - fill = 'var(--color-seat-held)'; - stroke = 'none'; - textColor = 'white'; - } else if (isSelected) { - // A visible ring (not just a fill swap) makes "selected" read as - // a checked state at a glance, matching a real ticket-booking UI. - fill = 'var(--color-seat-selected)'; - stroke = 'white'; - strokeWidth = 0.4; - textColor = 'white'; - } else { - stroke = TIER_STROKE[seat.priceTier] ?? 'var(--color-seat-available-stroke)'; + const status = resolveSeatStatus(seat, { + soldSeats, + holds, + selectedSeats, + now, + simulationSeeded, + }); + const isSelected = status === 'selected'; + const isUnavailable = !isSeatSelectable(status); + + const style = SEAT_STATUS_STYLE[status]; + const { fill, textColor } = style; + let { stroke, strokeWidth } = style; + // The only piece of styling the status table can't express - an + // available seat's stroke depends on its own price tier, not + // just its status. + if (status === 'available') { + stroke = TIER_STROKE[seat.priceTier] ?? stroke; } const isHighlighted = highlightedSeatIds?.has(seat.id) ?? false; @@ -155,8 +164,7 @@ const Seats = memo(function Seats({ rows }: SeatsProps) { strokeWidth = 0.5; } - const effectiveStatus = isSold ? 'sold' : seat.status; - const label = `Row ${rowLetter(rowIndex)} Seat ${seat.col}, Price $${seat.priceTier}, ${effectiveStatus}`; + const label = `Row ${rowLetter(rowIndex)} Seat ${seat.col}, Price $${getTier(seat.priceTier).price}, ${describeSeatStatus(status)}`; return ( +

Selected Seats ({selectedSeats.size}/8) {selectedSeats.size > 0 && ( diff --git a/src/hooks/useCountdown.test.ts b/src/hooks/useCountdown.test.ts new file mode 100644 index 0000000..8d3ee32 --- /dev/null +++ b/src/hooks/useCountdown.test.ts @@ -0,0 +1,59 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { act, renderHook } from '@testing-library/react'; +import { useCountdown } from './useCountdown'; + +describe('useCountdown', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('counts down as time advances', () => { + vi.setSystemTime(0); + const { result } = renderHook(() => useCountdown(5000)); + expect(result.current).toBe(5000); + + act(() => { + vi.advanceTimersByTime(1000); + }); + expect(result.current).toBe(4000); + }); + + it('clamps at 0 and stops scheduling once the deadline passes', () => { + vi.setSystemTime(0); + const { result } = renderHook(() => useCountdown(1000)); + act(() => { + vi.advanceTimersByTime(5000); + }); + expect(result.current).toBe(0); + expect(vi.getTimerCount()).toBe(0); + }); + + it('returns null and schedules nothing when there is no deadline', () => { + const { result } = renderHook(() => useCountdown(null)); + expect(result.current).toBeNull(); + expect(vi.getTimerCount()).toBe(0); + }); + + it('clears its timer on unmount', () => { + vi.setSystemTime(0); + const { unmount } = renderHook(() => useCountdown(5000)); + expect(vi.getTimerCount()).toBeGreaterThan(0); + unmount(); + expect(vi.getTimerCount()).toBe(0); + }); + + it('reschedules when the deadline changes', () => { + vi.setSystemTime(0); + const { result, rerender } = renderHook( + ({ deadline }: { deadline: number | null }) => useCountdown(deadline), + { initialProps: { deadline: 5000 } }, + ); + expect(result.current).toBe(5000); + rerender({ deadline: 10000 }); + expect(result.current).toBe(10000); + }); +}); diff --git a/src/hooks/useCountdown.ts b/src/hooks/useCountdown.ts new file mode 100644 index 0000000..b867ba4 --- /dev/null +++ b/src/hooks/useCountdown.ts @@ -0,0 +1,40 @@ +import { useEffect, useState } from 'react'; + +// A self-correcting setTimeout aligned to the next whole-second boundary, +// rather than setInterval(1000) - so the displayed digits don't drift or +// skip under event-loop jitter. Returns null (and schedules nothing) when +// there's no deadline. Crucially, this never writes to the store or any +// shared state: the only thing that re-renders on this tick is whichever +// component calls the hook, never the seat layer. +export function useCountdown(deadline: number | null): number | null { + const [remaining, setRemaining] = useState(null); + + useEffect(() => { + if (deadline === null) { + // Resetting local display state to match a prop that just became + // null, not deriving anything from an external read. + // eslint-disable-next-line react-hooks/set-state-in-effect + setRemaining(null); + return undefined; + } + + let timeoutId = 0; + + const tick = () => { + const next = Math.max(0, deadline - Date.now()); + setRemaining(next); + if (next > 0) { + const delay = next % 1000 || 1000; + timeoutId = window.setTimeout(tick, delay); + } + }; + + tick(); + + return () => { + window.clearTimeout(timeoutId); + }; + }, [deadline]); + + return remaining; +} diff --git a/src/hooks/useHoldExpiry.ts b/src/hooks/useHoldExpiry.ts new file mode 100644 index 0000000..eab443a --- /dev/null +++ b/src/hooks/useHoldExpiry.ts @@ -0,0 +1,53 @@ +import { useEffect } from 'react'; +import { useVenueStore } from '../store/seatStore'; +import { EXPIRY_SLACK_MS, nextDeadline } from '../utils/holdProtocol'; + +// Arms exactly one setTimeout, for whichever comes soonest of "a tracked +// hold lapses" or "my own checkout deadline passes" - never a polling +// interval. With nothing to schedule (no holds, no selection), there is no +// timer at all. On fire, it prunes via the store's own runExpiry (a single +// set() that's a no-op when nothing actually lapsed) and re-arms. +export function useHoldExpiry(): void { + useEffect(() => { + let timeoutId = 0; + + const scheduleNext = () => { + window.clearTimeout(timeoutId); + const { holds, selectionExpiresAt } = useVenueStore.getState(); + const deadline = nextDeadline(holds, selectionExpiresAt); + if (deadline === null) return; + + const delay = Math.max(0, deadline - Date.now()) + EXPIRY_SLACK_MS; + timeoutId = window.setTimeout(() => { + useVenueStore.getState().runExpiry(Date.now()); + scheduleNext(); + }, delay); + }; + + scheduleNext(); + + // Any store change could move the next deadline earlier or later (a + // new hold, a cleared selection, ...), so re-check the schedule then. + const unsubscribe = useVenueStore.subscribe(() => { + scheduleNext(); + }); + + // A backgrounded tab has its timers throttled or fully suspended, so it + // can come back with hundreds of holds already lapsed at once - + // runExpiry prunes all of them in a single pass, one store write, not + // one per seat. + const handleVisibility = () => { + if (document.visibilityState === 'visible') { + useVenueStore.getState().runExpiry(Date.now()); + scheduleNext(); + } + }; + document.addEventListener('visibilitychange', handleVisibility); + + return () => { + window.clearTimeout(timeoutId); + unsubscribe(); + document.removeEventListener('visibilitychange', handleVisibility); + }; + }, []); +} diff --git a/src/hooks/useHoldSync.test.ts b/src/hooks/useHoldSync.test.ts new file mode 100644 index 0000000..318ef30 --- /dev/null +++ b/src/hooks/useHoldSync.test.ts @@ -0,0 +1,178 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { renderHook } from '@testing-library/react'; +import type { HoldMessage, Venue } from '../interfaces/venue.interfaces'; +import { useVenueStore } from '../store/seatStore'; +import { SYNC_TIMEOUT_MS } from '../utils/holdProtocol'; +import { createFakeBus } from '../test/fakeBroadcastChannel'; +import { createHoldChannel } from '../utils/holdChannel'; +import { getSessionId } from '../utils/sessionId'; +import { useHoldSync } from './useHoldSync'; + +const venue: Venue = { + venueId: 'v', + name: 'Venue', + map: { width: 100, height: 100 }, + sections: [ + { + id: 'S-1', + label: 'Section 1', + transform: { x: 0, y: 0, scale: 1 }, + rows: [ + { + index: 1, + seats: [ + { id: 'H1', col: 1, x: 0, y: 0, priceTier: 1, status: 'held' }, + { id: 'A1', col: 2, x: 1, y: 0, priceTier: 1, status: 'available' }, + ], + }, + ], + }, + ], +}; + +const resetStore = () => { + useVenueStore.setState({ + selectedSeats: new Set(), + soldSeats: new Set(), + holds: new Map(), + selectionExpiresAt: null, + simulationSeeded: false, + feedback: null, + }); +}; + +describe('useHoldSync', () => { + let mySessionId: string; + + beforeEach(() => { + resetStore(); + mySessionId = getSessionId(); + vi.useFakeTimers(); + vi.setSystemTime(0); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('posts a hello message on mount', () => { + const { factory } = createFakeBus(); + const received: HoldMessage[] = []; + createHoldChannel('peer', (msg) => received.push(msg), factory); + + renderHook(() => { + useHoldSync(venue, factory); + }); + + expect(received.some((m) => m.type === 'hello')).toBe(true); + }); + + it('adopts an incumbentโ€™s state reply and does not seed its own simulation on top', () => { + const { factory } = createFakeBus(); + const peer = createHoldChannel( + 'peer', + (msg) => { + if (msg.type === 'hello') { + peer.post({ + type: 'state', + from: 'peer', + sentAt: Date.now(), + to: msg.from, + holds: [{ seatId: 'A1', owner: 'peer', expiresAt: 999_000 }], + }); + } + }, + factory, + ); + + renderHook(() => { + useHoldSync(venue, factory); + }); + + expect(useVenueStore.getState().holds.get('A1')?.owner).toBe('peer'); + expect(useVenueStore.getState().simulationSeeded).toBe(true); + // Adoption REPLACES, it doesn't merge - the venue's own seeded demo + // hold (H1) must not also appear alongside the incumbent's state. + expect(useVenueStore.getState().holds.has('H1')).toBe(false); + }); + + it('seeds its own simulation when no incumbent replies within the sync timeout', () => { + const { factory } = createFakeBus(); + renderHook(() => { + useHoldSync(venue, factory); + }); + + expect(useVenueStore.getState().simulationSeeded).toBe(false); + vi.advanceTimersByTime(SYNC_TIMEOUT_MS); + expect(useVenueStore.getState().simulationSeeded).toBe(true); + expect(useVenueStore.getState().holds.has('H1')).toBe(true); + }); + + it('seeds immediately, with no wait, when the channel is unavailable', () => { + renderHook(() => { + useHoldSync(venue, () => null); + }); + expect(useVenueStore.getState().simulationSeeded).toBe(true); + expect(useVenueStore.getState().holds.has('H1')).toBe(true); + }); + + it('broadcasts a hold message when the local selection changes', () => { + const { factory } = createFakeBus(); + const received: HoldMessage[] = []; + createHoldChannel('peer', (msg) => received.push(msg), factory); + renderHook(() => { + useHoldSync(venue, factory); + }); + + useVenueStore.getState().toggleSeat('A1'); + + const holdMessages = received.filter((m) => m.type === 'hold'); + expect(holdMessages.length).toBeGreaterThan(0); + expect(holdMessages.at(-1)?.seatIds).toEqual(['A1']); + }); + + it('confirmPurchase broadcasts sold, then an empty hold', () => { + const { factory } = createFakeBus(); + const received: HoldMessage[] = []; + createHoldChannel('peer', (msg) => received.push(msg), factory); + renderHook(() => { + useHoldSync(venue, factory); + }); + + useVenueStore.getState().toggleSeat('A1'); + useVenueStore.getState().confirmPurchase(100); + + expect(received.some((m) => m.type === 'sold')).toBe(true); + const holdMessages = received.filter((m) => m.type === 'hold'); + expect(holdMessages.at(-1)?.seatIds).toEqual([]); + }); + + it('posts goodbye on pagehide', () => { + const { factory } = createFakeBus(); + const received: HoldMessage[] = []; + createHoldChannel('peer', (msg) => received.push(msg), factory); + renderHook(() => { + useHoldSync(venue, factory); + }); + + window.dispatchEvent(new Event('pagehide')); + + expect(received.some((m) => m.type === 'goodbye')).toBe(true); + }); + + it('ingesting a remote sold message does not re-broadcast it (no ping-pong)', () => { + const { factory } = createFakeBus(); + const peer = createHoldChannel('peer', () => undefined, factory); + const received: HoldMessage[] = []; + createHoldChannel('observer', (msg) => received.push(msg), factory); + + renderHook(() => { + useHoldSync(venue, factory); + }); + + peer.post({ type: 'sold', from: 'peer', sentAt: Date.now(), seatIds: ['A1'] }); + + expect(received.some((m) => m.type === 'sold' && m.from === mySessionId)).toBe(false); + expect(useVenueStore.getState().soldSeats.has('A1')).toBe(true); + }); +}); diff --git a/src/hooks/useHoldSync.ts b/src/hooks/useHoldSync.ts new file mode 100644 index 0000000..560fdde --- /dev/null +++ b/src/hooks/useHoldSync.ts @@ -0,0 +1,176 @@ +import { useEffect } from 'react'; +import type { HoldMessage, Venue } from '../interfaces/venue.interfaces'; +import { useVenueStore } from '../store/seatStore'; +import { + SYNC_TIMEOUT_MS, + adoptRemoteState, + ingestPeerHold, + toWireHolds, +} from '../utils/holdProtocol'; +import type { BroadcastChannelLike } from '../utils/holdChannel'; +import { createHoldChannel } from '../utils/holdChannel'; +import { seedSimulatedHolds } from '../utils/holdSimulation'; +import { getSessionId } from '../utils/sessionId'; + +// Cross-tab wiring: joins the hold channel, answers/asks the join-time +// handshake, seeds the demo simulation if no incumbent replies in time, and +// keeps outbound broadcasts diff-driven rather than wired into the store's +// own actions - toggleSeat/clearSelection/confirmPurchase/runExpiry all +// broadcast correctly without knowing this hook exists. +export function useHoldSync( + venue: Venue, + channelFactory?: (name: string) => BroadcastChannelLike | null, +): void { + useEffect(() => { + const sessionId = getSessionId(); + let seeded = false; + + const seedFreshSimulation = () => { + if (seeded) return; + seeded = true; + const holds = seedSimulatedHolds(venue, Date.now(), useVenueStore.getState().selectedSeats); + useVenueStore.getState().seedSimulation(holds); + }; + + // Mutable, closure-local mirrors of what was last broadcast - not store + // state, since they exist purely to diff against for outbound sync and + // have no meaning to the rest of the app. + let lastSelected = new Set(); + let lastExpiresAt: number | null = null; + let lastSold = new Set(); + + const postHold = () => { + const state = useVenueStore.getState(); + channel.post({ + type: 'hold', + from: sessionId, + sentAt: Date.now(), + seatIds: Array.from(state.selectedSeats), + expiresAt: state.selectionExpiresAt ?? 0, + }); + }; + + const handleMessage = (message: HoldMessage) => { + const state = useVenueStore.getState(); + + switch (message.type) { + case 'hello': { + // Reply with everything I currently know - my own peer holds + // plus my own live selection, expressed the same way a `hold` + // would be, so the newcomer's adoption logic doesn't need a + // special case for "the incumbent's own cart". + const mine = Array.from(state.selectedSeats, (seatId) => ({ + seatId, + owner: sessionId, + expiresAt: state.selectionExpiresAt ?? 0, + })); + channel.post({ + type: 'state', + from: sessionId, + sentAt: Date.now(), + to: message.from, + holds: [...toWireHolds(state.holds), ...mine], + }); + return; + } + + case 'state': { + if (message.to !== sessionId || seeded) return; + seeded = true; + const { holds, lostSeatIds } = adoptRemoteState( + state.selectedSeats, + sessionId, + message.holds, + ); + useVenueStore.getState().seedSimulation(holds); + if (lostSeatIds.length > 0) useVenueStore.getState().releaseLostSeats(lostSeatIds); + return; + } + + case 'hold': { + const result = ingestPeerHold(state.holds, state.selectedSeats, sessionId, message); + useVenueStore.getState().setHolds(result.holds); + if (result.lostSeatIds.length > 0) { + useVenueStore.getState().releaseLostSeats(result.lostSeatIds); + } + if (result.mustRepost) postHold(); + return; + } + + case 'sold': { + // Update the outbound diff baseline BEFORE applying the change: + // applyRemoteSold's set() notifies subscribers (including this + // hook's own broadcaster) synchronously, so without this the + // seats just learned about here would look "newly sold by me" + // and bounce straight back onto the channel. + message.seatIds.forEach((id) => lastSold.add(id)); + useVenueStore.getState().applyRemoteSold(message.seatIds); + return; + } + + case 'goodbye': { + const result = ingestPeerHold(state.holds, state.selectedSeats, sessionId, { + from: message.from, + seatIds: [], + expiresAt: 0, + }); + useVenueStore.getState().setHolds(result.holds); + return; + } + } + }; + + const channel = createHoldChannel(sessionId, handleMessage, channelFactory); + + const broadcastIfChanged = () => { + const state = useVenueStore.getState(); + + const selectionChanged = + state.selectionExpiresAt !== lastExpiresAt || + state.selectedSeats.size !== lastSelected.size || + Array.from(state.selectedSeats).some((id) => !lastSelected.has(id)); + + if (selectionChanged) { + lastSelected = new Set(state.selectedSeats); + lastExpiresAt = state.selectionExpiresAt; + postHold(); + } + + const newlySold = Array.from(state.soldSeats).filter((id) => !lastSold.has(id)); + if (newlySold.length > 0) { + lastSold = new Set(state.soldSeats); + channel.post({ type: 'sold', from: sessionId, sentAt: Date.now(), seatIds: newlySold }); + } + }; + + const unsubscribe = useVenueStore.subscribe(broadcastIfChanged); + + channel.post({ + type: 'hello', + from: sessionId, + sentAt: Date.now(), + ownedSeatIds: Array.from(useVenueStore.getState().selectedSeats), + }); + + // No transport at all means no incumbent could ever reply - seed + // immediately rather than waiting out a timeout that can't resolve. + let syncTimeoutId = 0; + if (channel.available) { + syncTimeoutId = window.setTimeout(seedFreshSimulation, SYNC_TIMEOUT_MS); + } else { + seedFreshSimulation(); + } + + const handlePageHide = () => { + channel.post({ type: 'goodbye', from: sessionId, sentAt: Date.now() }); + }; + window.addEventListener('pagehide', handlePageHide); + + return () => { + window.clearTimeout(syncTimeoutId); + unsubscribe(); + window.removeEventListener('pagehide', handlePageHide); + channel.close(); + }; + }, [venue, channelFactory]); +} diff --git a/src/index.css b/src/index.css index c17ebe3..7e04ca5 100644 --- a/src/index.css +++ b/src/index.css @@ -20,6 +20,9 @@ /* Ring shown on a sold seat while its booking is open in Booking History */ --color-booking-highlight: #7c3aed; + + /* Checkout countdown once under a minute remains */ + --color-hold-warning: #d97706; } /* Plays once when a seat's rect gains this class (i.e. the instant it @@ -101,3 +104,26 @@ animation: none; } } + +/* Continuous, and only applied for the checkout timer's final 30 seconds - + a last, harder-to-miss cue on top of the amber color swap that already + happens earlier, once the deadline is genuinely close. */ +@keyframes hold-timer-pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.hold-timer-pulse { + animation: hold-timer-pulse 1s ease-in-out infinite; +} + +@media (prefers-reduced-motion: reduce) { + .hold-timer-pulse { + animation: none; + } +} diff --git a/src/interfaces/venue.interfaces.ts b/src/interfaces/venue.interfaces.ts index 50b3e94..2921164 100644 --- a/src/interfaces/venue.interfaces.ts +++ b/src/interfaces/venue.interfaces.ts @@ -33,3 +33,42 @@ export interface Venue { }; sections: Section[]; } + +// --- Live seat-hold contention ------------------------------------------- +// +// A seat someone else (another tab, or the seeded demo simulation) is +// currently holding. Only ever holds *other* claims - a tab's own live cart +// is `selectedSeats` + `selectionExpiresAt`, not an entry here - so the +// resolver never has to ask "is this hold mine?". + +// Reserved owner id for the seeded demo holds (never a real session id, so +// resolveSeatStatus's "is this my own hold" check can never accidentally +// match it). +export const SIMULATED_OWNER = '__simulation__'; + +export interface SeatHold { + seatId: string; + owner: string; + expiresAt: number; // epoch ms, in this tab's local clock +} + +export type HoldMap = ReadonlyMap; + +export type EffectiveSeatStatus = SeatStatus | 'selected'; + +export interface WireHold { + seatId: string; + owner: string; + expiresAt: number; +} + +// `hold` carries an owner's *entire* current hold set, not a delta - a +// deselect/expiry/purchase is just a shorter (or empty) `hold`, so there is +// no separate `release` message and a dropped packet self-heals on the next +// change instead of leaving a stale hold forever. +export type HoldMessage = + | { type: 'hello'; from: string; sentAt: number; ownedSeatIds: string[] } + | { type: 'state'; from: string; sentAt: number; to: string; holds: WireHold[] } + | { type: 'hold'; from: string; sentAt: number; seatIds: string[]; expiresAt: number } + | { type: 'sold'; from: string; sentAt: number; seatIds: string[] } + | { type: 'goodbye'; from: string; sentAt: number }; diff --git a/src/store/seatStore.test.ts b/src/store/seatStore.test.ts index 0fb3339..56db7cb 100644 --- a/src/store/seatStore.test.ts +++ b/src/store/seatStore.test.ts @@ -1,4 +1,6 @@ -import { beforeEach, describe, expect, it } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import type { HoldMap } from '../interfaces/venue.interfaces'; +import { SELECTION_HOLD_MS } from '../utils/holdProtocol'; import { MAX_SELECTABLE_SEATS, useVenueStore } from './seatStore'; // Throwing (rather than `expect(raw).not.toBeNull()` + a `!` at the call @@ -19,10 +21,17 @@ const resetStore = () => { viewingBookingId: null, zoom: 0.4, feedback: null, + holds: new Map(), + selectionExpiresAt: null, + simulationSeeded: false, }); localStorage.clear(); }; +function holdMap(seatId: string, expiresAt: number, owner = 'peer'): HoldMap { + return new Map([[seatId, { seatId, owner, expiresAt }]]); +} + describe('seatStore', () => { beforeEach(resetStore); @@ -60,6 +69,49 @@ describe('seatStore', () => { expect(useVenueStore.getState().selectedSeats.size).toBe(0); }); + it('clearSelection nulls the checkout deadline', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().clearSelection(); + expect(useVenueStore.getState().selectionExpiresAt).toBeNull(); + }); + + describe('checkout hold timing', () => { + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(0); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('the first seat added starts the checkout deadline', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + expect(useVenueStore.getState().selectionExpiresAt).toBe(SELECTION_HOLD_MS); + }); + + it('adding a second seat does not extend the deadline', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + vi.advanceTimersByTime(10_000); + useVenueStore.getState().toggleSeat('SEAT-2'); + expect(useVenueStore.getState().selectionExpiresAt).toBe(SELECTION_HOLD_MS); + }); + + it('refuses to select a seat with a live foreign hold, with feedback', () => { + useVenueStore.setState({ holds: holdMap('SEAT-1', 5_000) }); + useVenueStore.getState().toggleSeat('SEAT-1'); + expect(useVenueStore.getState().selectedSeats.has('SEAT-1')).toBe(false); + expect(useVenueStore.getState().feedback?.type).toBe('error'); + }); + + it('allows selecting a seat whose hold has already lapsed', () => { + useVenueStore.setState({ holds: holdMap('SEAT-1', 500) }); + vi.setSystemTime(1_000); + useVenueStore.getState().toggleSeat('SEAT-1'); + expect(useVenueStore.getState().selectedSeats.has('SEAT-1')).toBe(true); + }); + }); + it('confirmPurchase moves selected seats into soldSeats and empties the cart', () => { useVenueStore.getState().toggleSeat('SEAT-1'); useVenueStore.getState().toggleSeat('SEAT-2'); @@ -105,6 +157,99 @@ describe('seatStore', () => { expect(bookings[1]?.seatIds).toEqual(['SEAT-1']); }); + it('confirmPurchase returns the booking and nulls the checkout deadline', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + const booking = useVenueStore.getState().confirmPurchase(7000); + expect(booking?.seatIds).toEqual(['SEAT-1']); + expect(useVenueStore.getState().selectionExpiresAt).toBeNull(); + }); + + it('confirmPurchase refuses an already-expired hold: no booking, cart cleared, error feedback', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.setState({ selectionExpiresAt: Date.now() - 1 }); + + const booking = useVenueStore.getState().confirmPurchase(7000); + + expect(booking).toBeNull(); + expect(useVenueStore.getState().selectedSeats.size).toBe(0); + expect(useVenueStore.getState().soldSeats.has('SEAT-1')).toBe(false); + expect(useVenueStore.getState().bookings).toHaveLength(0); + expect(useVenueStore.getState().feedback?.type).toBe('error'); + }); + + it('confirmPurchase still succeeds when selectionExpiresAt is null (e.g. state seeded directly)', () => { + useVenueStore.setState({ selectedSeats: new Set(['SEAT-1']), selectionExpiresAt: null }); + const booking = useVenueStore.getState().confirmPurchase(7000); + expect(booking).not.toBeNull(); + expect(useVenueStore.getState().soldSeats.has('SEAT-1')).toBe(true); + }); + + it('releaseLostSeats drops just the named seats and nulls the deadline if the cart empties', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.getState().releaseLostSeats(['SEAT-1']); + expect(useVenueStore.getState().selectedSeats.size).toBe(0); + expect(useVenueStore.getState().selectionExpiresAt).toBeNull(); + expect(useVenueStore.getState().feedback?.type).toBe('error'); + }); + + it('applyRemoteSold marks seats sold, drops their holds, and removes them from my selection', () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + useVenueStore.setState({ holds: holdMap('SEAT-2', 9_000) }); + + useVenueStore.getState().applyRemoteSold(['SEAT-1', 'SEAT-2']); + + const state = useVenueStore.getState(); + expect(state.soldSeats.has('SEAT-1')).toBe(true); + expect(state.soldSeats.has('SEAT-2')).toBe(true); + expect(state.holds.has('SEAT-2')).toBe(false); + expect(state.selectedSeats.has('SEAT-1')).toBe(false); + expect(state.selectionExpiresAt).toBeNull(); + }); + + it('seedSimulation is a no-op once simulationSeeded is already true', () => { + useVenueStore.setState({ simulationSeeded: true, holds: holdMap('SEAT-1', 9_000) }); + useVenueStore.getState().seedSimulation(holdMap('SEAT-2', 9_000)); + expect(useVenueStore.getState().holds.has('SEAT-1')).toBe(true); + expect(useVenueStore.getState().holds.has('SEAT-2')).toBe(false); + }); + + describe('runExpiry', () => { + it('leaves the holds map reference identical when nothing has lapsed', () => { + const holds = holdMap('SEAT-1', 9_000); + useVenueStore.setState({ holds }); + useVenueStore.getState().runExpiry(1_000); + // Reference identity (`toBe`), not just equal contents - this is what + // lets a routine tick skip re-rendering ~1,500 mounted seats. + expect(useVenueStore.getState().holds).toBe(holds); + }); + + it('prunes a lapsed hold', () => { + useVenueStore.setState({ holds: holdMap('SEAT-1', 500) }); + useVenueStore.getState().runExpiry(1_000); + expect(useVenueStore.getState().holds.size).toBe(0); + }); + + it('releases an expired selection with feedback', () => { + useVenueStore.setState({ + selectedSeats: new Set(['SEAT-1']), + selectionExpiresAt: 500, + }); + useVenueStore.getState().runExpiry(1_000); + expect(useVenueStore.getState().selectedSeats.size).toBe(0); + expect(useVenueStore.getState().selectionExpiresAt).toBeNull(); + expect(useVenueStore.getState().feedback?.type).toBe('info'); + }); + + it('does nothing when the selection deadline is still in the future', () => { + useVenueStore.setState({ + selectedSeats: new Set(['SEAT-1']), + selectionExpiresAt: 9_000, + }); + useVenueStore.getState().runExpiry(1_000); + expect(useVenueStore.getState().selectedSeats.has('SEAT-1')).toBe(true); + }); + }); + it('toggleSeat clears any booking currently being viewed', () => { useVenueStore.getState().viewBooking('BK-1'); useVenueStore.getState().toggleSeat('SEAT-1'); @@ -231,4 +376,30 @@ describe('seatStore', () => { expect(useVenueStore.getState().bookings).toHaveLength(1); }); + + it('persists the checkout deadline across a save/reload cycle', async () => { + useVenueStore.getState().toggleSeat('SEAT-1'); + const deadline = useVenueStore.getState().selectionExpiresAt; + + await Promise.resolve(); + + const raw = getPersistedRaw(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion + const parsed = JSON.parse(raw) as unknown as { state: { selectionExpiresAt: number | null } }; + expect(parsed.state.selectionExpiresAt).toBe(deadline); + + useVenueStore.setState({ selectionExpiresAt: null }); + useVenueStore.setState({ selectionExpiresAt: parsed.state.selectionExpiresAt }); + expect(useVenueStore.getState().selectionExpiresAt).toBe(deadline); + }); + + it('never writes holds to localStorage - they are session-local, not persisted state', async () => { + useVenueStore.setState({ holds: holdMap('SEAT-1', 9_000) }); + useVenueStore.getState().toggleSeat('SEAT-2'); + + await Promise.resolve(); + + const raw = getPersistedRaw(); + expect(raw).not.toContain('"holds"'); + }); }); diff --git a/src/store/seatStore.ts b/src/store/seatStore.ts index 07bce50..665e9b5 100644 --- a/src/store/seatStore.ts +++ b/src/store/seatStore.ts @@ -1,6 +1,8 @@ import { create } from 'zustand'; import { persist } from 'zustand/middleware'; import type { PersistStorage, StorageValue } from 'zustand/middleware'; +import type { HoldMap } from '../interfaces/venue.interfaces'; +import { SELECTION_HOLD_MS, pruneHolds } from '../utils/holdProtocol'; export const MAX_SELECTABLE_SEATS = 8; @@ -35,29 +37,58 @@ interface VenueState { pan: { x: number; y: number }; viewTransitionMs: number; feedback: Feedback | null; + + // Live seat-hold contention (see docs/engineering-notes.md). `holds` only + // ever contains OTHER claims - a foreign tab's live cart, or a seeded demo + // hold - never this tab's own, which is `selectedSeats` + + // `selectionExpiresAt` instead. Deliberately not persisted: it's + // time-based (a stale hold from last session is meaningless) and shared + // cross-tab state, so localStorage-as-source-of-truth would fight the + // BroadcastChannel sync that actually owns it. + holds: HoldMap; + // This tab's own checkout deadline. Persisted alongside selectedSeats so + // a reload doesn't grant an unbounded hold - see useHoldExpiry, which + // clears an already-lapsed one on boot. + selectionExpiresAt: number | null; + // Whether the runtime demo simulation has seeded (or adopted, from an + // incumbent tab) its holds yet - guards against re-seeding after a late + // cross-tab `state` reply. Not persisted: every fresh load re-seeds. + simulationSeeded: boolean; + setActiveSection: (id: string | null) => void; setPan: (pan: { x: number; y: number }) => void; setView: (zoom: number, pan: { x: number; y: number }, transitionMs: number) => void; toggleSeat: (seatId: string) => void; selectSeatBlock: (seatIds: string[], sectionId: string) => void; clearSelection: () => void; - confirmPurchase: (total: number) => void; + confirmPurchase: (total: number) => Booking | null; viewBooking: (id: string) => void; clearViewingBooking: () => void; clearFeedback: () => void; setFeedback: (feedback: Feedback) => void; + + setHolds: (holds: HoldMap) => void; + seedSimulation: (holds: HoldMap) => void; + applyRemoteSold: (seatIds: string[]) => void; + releaseLostSeats: (seatIds: string[]) => void; + runExpiry: (now: number) => void; } -type PersistedVenueState = Pick; +type PersistedVenueState = Pick< + VenueState, + 'selectedSeats' | 'soldSeats' | 'bookings' | 'selectionExpiresAt' +>; // Optional, not just for the type checker's sake: this is deserializing // localStorage, which could hold data from an older app version (written -// before `bookings` existed) or something a user edited by hand in -// DevTools - genuinely nothing guarantees these fields are present. +// before `bookings`/`selectionExpiresAt` existed) or something a user +// edited by hand in DevTools - genuinely nothing guarantees these fields +// are present. interface SerializedVenueState { selectedSeats?: string[]; soldSeats?: string[]; bookings?: Booking[]; + selectionExpiresAt?: number | null; } function isPersistedStorageValue(data: unknown): data is StorageValue { @@ -82,6 +113,8 @@ const venueStorage: PersistStorage = { selectedSeats: new Set(state.selectedSeats ?? []), soldSeats: new Set(state.soldSeats ?? []), bookings: state.bookings ?? [], + selectionExpiresAt: + typeof state.selectionExpiresAt === 'number' ? state.selectionExpiresAt : null, }, ...(version !== undefined && { version }), }; @@ -92,6 +125,7 @@ const venueStorage: PersistStorage = { selectedSeats: Array.from(value.state.selectedSeats), soldSeats: Array.from(value.state.soldSeats), bookings: value.state.bookings, + selectionExpiresAt: value.state.selectionExpiresAt, }, ...(value.version !== undefined && { version: value.version }), }; @@ -114,12 +148,22 @@ export const useVenueStore = create()( pan: { x: 0, y: 0 }, viewTransitionMs: 200, feedback: null, + holds: new Map(), + selectionExpiresAt: null, + simulationSeeded: false, + setActiveSection: (id) => set({ activeSectionId: id }), setPan: (pan) => set({ pan }), setView: (zoom, pan, transitionMs) => set({ zoom, pan, viewTransitionMs: transitionMs }), toggleSeat: (seatId) => set((state) => { + const now = Date.now(); + const liveHold = state.holds.get(seatId); + if (liveHold && liveHold.expiresAt > now) { + return { feedback: { type: 'error', message: 'That seat was just taken.' } }; + } + const newSelected = new Set(state.selectedSeats); if (newSelected.has(seatId)) { newSelected.delete(seatId); @@ -134,10 +178,20 @@ export const useVenueStore = create()( } newSelected.add(seatId); } - // Starting/editing a live selection supersedes browsing past - // booking history - drop any "viewing" highlight so the two - // sidebar modes never fight over what the map should show. - return { selectedSeats: newSelected, viewingBookingId: null }; + + return { + // Starting/editing a live selection supersedes browsing past + // booking history - drop any "viewing" highlight so the two + // sidebar modes never fight over what the map should show. + selectedSeats: newSelected, + viewingBookingId: null, + // The first seat starts a fresh 5-minute clock; adding more + // seats does NOT extend it (real ticketing sites don't) - the + // deadline is anchored to when the cart was opened, not to its + // last edit. Going back to zero clears it. + selectionExpiresAt: + newSelected.size === 0 ? null : (state.selectionExpiresAt ?? now + SELECTION_HOLD_MS), + }; }), // A whole contiguous block (from the best-seats finder) arrives as one @@ -161,18 +215,37 @@ export const useVenueStore = create()( selectedSeats: new Set(seatIds), activeSectionId: sectionId, viewingBookingId: null, + selectionExpiresAt: Date.now() + SELECTION_HOLD_MS, }; }), - clearSelection: () => set({ selectedSeats: new Set() }), + clearSelection: () => set({ selectedSeats: new Set(), selectionExpiresAt: null }), // The "checkout" transition: move whatever is currently selected into // soldSeats (permanently unavailable in this browser), record it as // one Booking (so history can show/highlight it as a unit), and empty // the cart - as opposed to clearSelection(), which just abandons the - // cart without a sale. - confirmPurchase: (total) => + // cart without a sale. Re-validates the checkout deadline inside this + // same synchronous set() (JS is single-threaded, so this can't + // interleave with the expiry timer) rather than trusting the caller's + // belief that the hold was still live. + confirmPurchase: (total) => { + let result: Booking | null = null; set((state) => { + const now = Date.now(); + if (state.selectionExpiresAt !== null && state.selectionExpiresAt <= now) { + result = null; + return { + selectedSeats: new Set(), + selectionExpiresAt: null, + feedback: { + type: 'error', + message: + 'Your hold expired before payment completed. Please select your seats again.', + }, + }; + } + const seatIds = Array.from(state.selectedSeats); const newBooking: Booking = { id: `BK-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, @@ -180,19 +253,98 @@ export const useVenueStore = create()( total, createdAt: Date.now(), }; + result = newBooking; return { soldSeats: new Set([...state.soldSeats, ...state.selectedSeats]), selectedSeats: new Set(), + selectionExpiresAt: null, bookings: [newBooking, ...state.bookings], viewingBookingId: newBooking.id, }; - }), + }); + return result; + }, viewBooking: (id) => set({ viewingBookingId: id }), clearViewingBooking: () => set({ viewingBookingId: null }), clearFeedback: () => set({ feedback: null }), setFeedback: (feedback) => set({ feedback }), + + setHolds: (holds) => set({ holds }), + + // Guarded so a late cross-tab `state` reply (after this tab already + // seeded its own simulation while waiting one out) can't clobber + // whichever seeding happened first. + seedSimulation: (holds) => + set((state) => (state.simulationSeeded ? {} : { holds, simulationSeeded: true })), + + applyRemoteSold: (seatIds) => + set((state) => { + if (seatIds.length === 0) return {}; + const soldSet = new Set(state.soldSeats); + const nextHolds = new Map(state.holds); + const nextSelected = new Set(state.selectedSeats); + let selectionChanged = false; + for (const id of seatIds) { + soldSet.add(id); + nextHolds.delete(id); + if (nextSelected.delete(id)) selectionChanged = true; + } + return { + soldSeats: soldSet, + holds: nextHolds, + selectedSeats: nextSelected, + selectionExpiresAt: + selectionChanged && nextSelected.size === 0 ? null : state.selectionExpiresAt, + }; + }), + + // A peer's claim won a tie-break on one or more of my own selected + // seats - drop just those, not the whole cart. + releaseLostSeats: (seatIds) => + set((state) => { + if (seatIds.length === 0) return {}; + const next = new Set(state.selectedSeats); + seatIds.forEach((id) => next.delete(id)); + return { + selectedSeats: next, + selectionExpiresAt: next.size === 0 ? null : state.selectionExpiresAt, + feedback: { + type: 'error', + message: + seatIds.length === 1 + ? 'A seat you selected was taken in another tab.' + : 'Some seats you selected were taken in another tab.', + }, + }; + }), + + // Prunes lapsed holds and, separately, releases this tab's own + // selection if ITS deadline has passed - one set() call either way. + // Returns without touching `holds`'s reference (and skips the whole + // set() when nothing changed at all) so a tick that finds nothing + // expired costs no re-render of the ~1,500 mounted seats. + runExpiry: (now) => + set((state) => { + const prunedHolds = pruneHolds(state.holds, now); + const selectionExpired = + state.selectionExpiresAt !== null && state.selectionExpiresAt <= now; + + if (prunedHolds === state.holds && !selectionExpired) return {}; + + return { + ...(prunedHolds !== state.holds && { holds: prunedHolds }), + ...(selectionExpired && { + selectedSeats: new Set(), + selectionExpiresAt: null, + feedback: { + type: 'info' as const, + message: 'Your seat hold expired. Please select your seats again.', + }, + }), + }; + }), }), { name: 'venue-storage', @@ -201,6 +353,7 @@ export const useVenueStore = create()( selectedSeats: state.selectedSeats, soldSeats: state.soldSeats, bookings: state.bookings, + selectionExpiresAt: state.selectionExpiresAt, }), }, ), diff --git a/src/test/fakeBroadcastChannel.ts b/src/test/fakeBroadcastChannel.ts new file mode 100644 index 0000000..62f9596 --- /dev/null +++ b/src/test/fakeBroadcastChannel.ts @@ -0,0 +1,45 @@ +import type { BroadcastChannelLike } from '../utils/holdChannel'; + +// A minimal, synchronous stand-in for BroadcastChannel: every channel on the +// same bus receives every other channel's postMessage, but never its own - +// exactly the semantics holdChannel.ts and useHoldSync.ts rely on. jsdom +// doesn't implement BroadcastChannel at all, so real two-tab scenarios are +// driven deterministically through this instead. +export function createFakeBus() { + const channels = new Set<{ + listeners: Set<(event: { data: unknown }) => void>; + post: (message: unknown) => void; + }>(); + + const factory = (): BroadcastChannelLike => { + const listeners = new Set<(event: { data: unknown }) => void>(); + const self = { + listeners, + post: (message: unknown) => { + listeners.forEach((listener) => { + listener({ data: message }); + }); + }, + }; + channels.add(self); + + return { + postMessage: (message) => { + channels.forEach((channel) => { + if (channel !== self) channel.post(message); + }); + }, + close: () => { + channels.delete(self); + }, + addEventListener: (_type, listener) => { + listeners.add(listener); + }, + removeEventListener: (_type, listener) => { + listeners.delete(listener); + }, + }; + }; + + return { factory, channels }; +} diff --git a/src/utils/formatCountdown.test.ts b/src/utils/formatCountdown.test.ts new file mode 100644 index 0000000..2151daa --- /dev/null +++ b/src/utils/formatCountdown.test.ts @@ -0,0 +1,58 @@ +import { describe, expect, it } from 'vitest'; +import { + describeCountdownMilestone, + formatCountdown, + pickCountdownMilestone, +} from './formatCountdown'; + +describe('formatCountdown', () => { + it.each([ + [300_000, '5:00'], + [65_000, '1:05'], + [5_000, '0:05'], + [999, '0:01'], // ceil, not floor - shows "0:01" until truly zero + [0, '0:00'], + [-5_000, '0:00'], + [3_600_000, '60:00'], + ])('formatCountdown(%i) -> %s', (ms, expected) => { + expect(formatCountdown(ms)).toBe(expected); + }); +}); + +describe('pickCountdownMilestone', () => { + it.each([ + [301_000, 'start'], + [300_000, 'start'], + [121_000, 'start'], + [120_000, '2min'], + [61_000, '2min'], + [60_000, '1min'], + [31_000, '1min'], + [30_000, '30s'], + [11_000, '30s'], + [10_000, '10s'], + [1_000, '10s'], + [0, 'expired'], + ])('pickCountdownMilestone(%i) -> %s', (ms, expected) => { + expect(pickCountdownMilestone(ms)).toBe(expected); + }); + + it('is stable across an entire band - the property that keeps aria-live quiet', () => { + expect(pickCountdownMilestone(119_000)).toBe(pickCountdownMilestone(61_000)); + }); + + it('changes when crossing the 2-minute boundary', () => { + expect(pickCountdownMilestone(121_000)).not.toBe(pickCountdownMilestone(119_000)); + }); +}); + +describe('describeCountdownMilestone', () => { + it('has distinct, non-empty copy for every milestone', () => { + const milestones = ['start', '2min', '1min', '30s', '10s', 'expired'] as const; + const descriptions = milestones.map(describeCountdownMilestone); + expect(new Set(descriptions).size).toBe(milestones.length); + descriptions.forEach((d) => { + expect(d.length).toBeGreaterThan(0); + }); + }); +}); diff --git a/src/utils/formatCountdown.ts b/src/utils/formatCountdown.ts new file mode 100644 index 0000000..3593b24 --- /dev/null +++ b/src/utils/formatCountdown.ts @@ -0,0 +1,40 @@ +export function formatCountdown(remainingMs: number): string { + const totalSeconds = Math.max(0, Math.ceil(remainingMs / 1000)); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes}:${seconds.toString().padStart(2, '0')}`; +} + +export type CountdownMilestone = 'start' | '2min' | '1min' | '30s' | '10s' | 'expired'; + +// Bands, not exact seconds - this is what keeps an aria-live announcement of +// the milestone from firing every tick. The band a given remaining time +// falls into is stable across an entire minute-or-more range, so the +// announced text is byte-identical for most of a session and only changes +// six times over a five-minute hold. +export function pickCountdownMilestone(remainingMs: number): CountdownMilestone { + const totalSeconds = Math.ceil(remainingMs / 1000); + if (totalSeconds <= 0) return 'expired'; + if (totalSeconds <= 10) return '10s'; + if (totalSeconds <= 30) return '30s'; + if (totalSeconds <= 60) return '1min'; + if (totalSeconds <= 120) return '2min'; + return 'start'; +} + +export function describeCountdownMilestone(milestone: CountdownMilestone): string { + switch (milestone) { + case 'start': + return 'Your seats are held for 5 minutes to complete checkout.'; + case '2min': + return '2 minutes left to complete your booking.'; + case '1min': + return '1 minute left to complete your booking.'; + case '30s': + return '30 seconds left to complete your booking.'; + case '10s': + return '10 seconds left to complete your booking.'; + case 'expired': + return 'Your seat hold expired.'; + } +} diff --git a/src/utils/holdChannel.test.ts b/src/utils/holdChannel.test.ts new file mode 100644 index 0000000..c375fbe --- /dev/null +++ b/src/utils/holdChannel.test.ts @@ -0,0 +1,69 @@ +import { describe, expect, it, vi } from 'vitest'; +import type { HoldMessage } from '../interfaces/venue.interfaces'; +import { createFakeBus } from '../test/fakeBroadcastChannel'; +import { createHoldChannel } from './holdChannel'; + +function helloMessage(from: string) { + return { type: 'hello' as const, from, sentAt: 0, ownedSeatIds: [] }; +} + +describe('createHoldChannel', () => { + it('delivers a message from A to B but not back to A', () => { + const { factory } = createFakeBus(); + const onA = vi.fn(); + const onB = vi.fn(); + const a = createHoldChannel('a', onA, factory); + createHoldChannel('b', onB, factory); + + a.post(helloMessage('a')); + + expect(onB).toHaveBeenCalledTimes(1); + expect(onA).not.toHaveBeenCalled(); + }); + + it('drops a message whose `from` matches this channelโ€™s own session id', () => { + const { factory } = createFakeBus(); + const onB = vi.fn(); + createHoldChannel('a', vi.fn(), factory); + const b = createHoldChannel('b', onB, factory); + // Simulate a fake bus that (unlike real BroadcastChannel) echoes back to + // the poster - the self-check must still hold. + b.post(helloMessage('b')); + expect(onB).not.toHaveBeenCalled(); + }); + + it('returns a no-op, unavailable channel when the factory returns null', () => { + const onMessage = vi.fn(); + const channel = createHoldChannel('a', onMessage, () => null); + + expect(channel.available).toBe(false); + expect(() => { + channel.post(helloMessage('a')); + }).not.toThrow(); + expect(() => { + channel.close(); + }).not.toThrow(); + expect(onMessage).not.toHaveBeenCalled(); + }); + + it('returns a no-op channel when the factory throws (e.g. a restrictive privacy mode)', () => { + const channel = createHoldChannel('a', vi.fn(), () => { + throw new Error('BroadcastChannel is not allowed here'); + }); + expect(channel.available).toBe(false); + }); + + it('drops malformed payloads without invoking onMessage', () => { + const { factory } = createFakeBus(); + const onB = vi.fn(); + const a = createHoldChannel('a', vi.fn(), factory); + createHoldChannel('b', onB, factory); + + // Deliberately malformed - asserting it as a HoldMessage is exactly the + // shape isHoldMessage exists to reject at runtime. + // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion + a.post({ type: 'bogus' } as unknown as HoldMessage); + + expect(onB).not.toHaveBeenCalled(); + }); +}); diff --git a/src/utils/holdChannel.ts b/src/utils/holdChannel.ts new file mode 100644 index 0000000..a92d355 --- /dev/null +++ b/src/utils/holdChannel.ts @@ -0,0 +1,67 @@ +import type { HoldMessage } from '../interfaces/venue.interfaces'; +import { HOLD_CHANNEL_NAME, isHoldMessage } from './holdProtocol'; + +// The minimal surface this module actually uses from BroadcastChannel - +// letting a fake bus stand in for it in tests without needing jsdom (which, +// verified, doesn't implement BroadcastChannel at all) to support it. +export interface BroadcastChannelLike { + postMessage: (message: unknown) => void; + close: () => void; + addEventListener: (type: 'message', listener: (event: { data: unknown }) => void) => void; + removeEventListener: (type: 'message', listener: (event: { data: unknown }) => void) => void; +} + +export interface HoldChannel { + post: (message: HoldMessage) => void; + close: () => void; + readonly available: boolean; +} + +function defaultFactory(name: string): BroadcastChannelLike | null { + if (typeof BroadcastChannel === 'undefined') return null; + return new BroadcastChannel(name); +} + +// Wraps BroadcastChannel behind a feature-detected, injectable factory. +// When unavailable (no global, or construction throws - some privacy modes +// do) this returns a no-op channel rather than throwing, so every other +// feature (checkout timer, simulated holds, the resolver) keeps working +// with cross-tab contention simply absent - the correct degradation for an +// enhancement, not a requirement. +export function createHoldChannel( + sessionId: string, + onMessage: (message: HoldMessage) => void, + factory: (name: string) => BroadcastChannelLike | null = defaultFactory, +): HoldChannel { + let channel: BroadcastChannelLike | null; + try { + channel = factory(HOLD_CHANNEL_NAME); + } catch { + channel = null; + } + + if (!channel) { + return { post: () => undefined, close: () => undefined, available: false }; + } + + const activeChannel = channel; + const listener = (event: { data: unknown }) => { + if (!isHoldMessage(event.data)) return; + // BroadcastChannel never echoes to its own poster, but a fake test bus + // might - dropping self-originated messages here keeps both honest. + if (event.data.from === sessionId) return; + onMessage(event.data); + }; + activeChannel.addEventListener('message', listener); + + return { + post: (message) => { + activeChannel.postMessage(message); + }, + close: () => { + activeChannel.removeEventListener('message', listener); + activeChannel.close(); + }, + available: true, + }; +} diff --git a/src/utils/holdProtocol.test.ts b/src/utils/holdProtocol.test.ts new file mode 100644 index 0000000..971339b --- /dev/null +++ b/src/utils/holdProtocol.test.ts @@ -0,0 +1,221 @@ +import { describe, expect, it } from 'vitest'; +import type { HoldMap, SeatHold, WireHold } from '../interfaces/venue.interfaces'; +import { + CLOCK_SKEW_TOLERANCE_MS, + adoptRemoteState, + ingestPeerHold, + isHoldMessage, + nextDeadline, + pruneHolds, + toWireHolds, + translateExpiry, +} from './holdProtocol'; + +function holdMap(...holds: SeatHold[]): HoldMap { + return new Map(holds.map((h) => [h.seatId, h])); +} + +describe('isHoldMessage', () => { + it.each([ + { type: 'hello', from: 'a', sentAt: 1, ownedSeatIds: ['S1'] }, + { type: 'state', from: 'a', sentAt: 1, to: 'b', holds: [] }, + { type: 'hold', from: 'a', sentAt: 1, seatIds: ['S1'], expiresAt: 2 }, + { type: 'sold', from: 'a', sentAt: 1, seatIds: ['S1'] }, + { type: 'goodbye', from: 'a', sentAt: 1 }, + ])('accepts a valid %o message', (message) => { + expect(isHoldMessage(message)).toBe(true); + }); + + it.each([ + null, + 'a string', + 42, + {}, + { type: 'hello' }, // missing from/sentAt + { type: 'bogus', from: 'a', sentAt: 1 }, + { type: 'hold', from: 'a', sentAt: 1, seatIds: 'not-an-array', expiresAt: 1 }, + { type: 'hold', from: 'a', sentAt: 1, seatIds: [1, 2], expiresAt: 1 }, + { type: 'hold', from: 'a', sentAt: 1, seatIds: [], expiresAt: 'not-a-number' }, + { type: 'sold', from: 'a', sentAt: 1 }, // missing seatIds + ])('rejects %o', (payload) => { + expect(isHoldMessage(payload)).toBe(false); + }); +}); + +describe('translateExpiry', () => { + it('leaves the deadline untouched when skew is within tolerance', () => { + const sentAt = 1_000; + const receivedAt = sentAt + CLOCK_SKEW_TOLERANCE_MS; + expect(translateExpiry(5_000, sentAt, receivedAt)).toBe(5_000); + }); + + it('shifts the deadline forward when the receiver clock is ahead beyond tolerance', () => { + const sentAt = 1_000; + const receivedAt = sentAt + CLOCK_SKEW_TOLERANCE_MS + 1; + expect(translateExpiry(5_000, sentAt, receivedAt)).toBe(5_000 + (CLOCK_SKEW_TOLERANCE_MS + 1)); + }); + + it('shifts the deadline backward when the receiver clock is behind beyond tolerance', () => { + const sentAt = 10_000; + const receivedAt = sentAt - CLOCK_SKEW_TOLERANCE_MS - 1; + expect(translateExpiry(5_000, sentAt, receivedAt)).toBe(5_000 - (CLOCK_SKEW_TOLERANCE_MS + 1)); + }); +}); + +describe('pruneHolds', () => { + it('returns the identical map reference when nothing has lapsed', () => { + // Asserted with `toBe` (reference identity), not `toEqual` - this is + // what lets the store skip a `set()` call, and skipping the write is + // what keeps ~1,500 mounted seats from re-rendering on every tick. + const holds = holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 10_000 }); + expect(pruneHolds(holds, 5_000)).toBe(holds); + }); + + it('drops only the holds that have lapsed', () => { + const holds = holdMap( + { seatId: 'S1', owner: 'peer', expiresAt: 1_000 }, + { seatId: 'S2', owner: 'peer', expiresAt: 9_000 }, + ); + const pruned = pruneHolds(holds, 5_000); + expect(Array.from(pruned.keys())).toEqual(['S2']); + }); + + it('treats expiresAt === now as lapsed (strict > for "still held")', () => { + const holds = holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 5_000 }); + expect(pruneHolds(holds, 5_000).size).toBe(0); + }); + + it('prunes hundreds of lapsed holds in a single pass (the wake-from-background case)', () => { + const many = Array.from({ length: 500 }, (_, i) => ({ + seatId: `S${i}`, + owner: 'peer', + expiresAt: 1_000, + })); + const holds = holdMap(...many); + expect(pruneHolds(holds, 5_000).size).toBe(0); + }); +}); + +describe('nextDeadline', () => { + it('is null when there is nothing to schedule', () => { + expect(nextDeadline(holdMap(), null)).toBeNull(); + }); + + it('is the minimum across all holds', () => { + const holds = holdMap( + { seatId: 'S1', owner: 'peer', expiresAt: 9_000 }, + { seatId: 'S2', owner: 'peer', expiresAt: 3_000 }, + ); + expect(nextDeadline(holds, null)).toBe(3_000); + }); + + it('is the minimum of holds and the local selection deadline', () => { + const holds = holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 9_000 }); + expect(nextDeadline(holds, 2_000)).toBe(2_000); + }); +}); + +describe('ingestPeerHold', () => { + it('inserts a non-conflicting peer hold', () => { + const result = ingestPeerHold(holdMap(), new Set(), 'me', { + from: 'peer', + seatIds: ['S1'], + expiresAt: 9_000, + }); + expect(result.holds.get('S1')).toEqual({ seatId: 'S1', owner: 'peer', expiresAt: 9_000 }); + expect(result.lostSeatIds).toEqual([]); + expect(result.mustRepost).toBe(false); + }); + + it('replaces the full set of a peerโ€™s previous holds rather than merging them', () => { + const existing = holdMap( + { seatId: 'S1', owner: 'peer', expiresAt: 1_000 }, + { seatId: 'S2', owner: 'peer', expiresAt: 1_000 }, + ); + const result = ingestPeerHold(existing, new Set(), 'me', { + from: 'peer', + seatIds: ['S2', 'S3'], + expiresAt: 9_000, + }); + expect(Array.from(result.holds.keys()).sort()).toEqual(['S2', 'S3']); + }); + + it('never touches another ownerโ€™s holds', () => { + const existing = holdMap({ seatId: 'S1', owner: 'other-peer', expiresAt: 1_000 }); + const result = ingestPeerHold(existing, new Set(), 'me', { + from: 'peer', + seatIds: [], + expiresAt: 9_000, + }); + expect(result.holds.get('S1')?.owner).toBe('other-peer'); + }); + + it('a goodbye (empty seatIds) clears exactly that ownerโ€™s holds', () => { + const existing = holdMap( + { seatId: 'S1', owner: 'peer', expiresAt: 1_000 }, + { seatId: 'S2', owner: 'other-peer', expiresAt: 1_000 }, + ); + const result = ingestPeerHold(existing, new Set(), 'me', { + from: 'peer', + seatIds: [], + expiresAt: 0, + }); + expect(Array.from(result.holds.keys())).toEqual(['S2']); + }); + + it('refuses a message that claims to be from myself', () => { + const result = ingestPeerHold(holdMap(), new Set(), 'me', { + from: 'me', + seatIds: ['S1'], + expiresAt: 9_000, + }); + expect(result.holds.size).toBe(0); + }); + + it('conflict: a lexicographically lower peer id wins - I lose the seat', () => { + const result = ingestPeerHold(holdMap(), new Set(['S1']), 'zzz', { + from: 'aaa', + seatIds: ['S1'], + expiresAt: 9_000, + }); + expect(result.lostSeatIds).toEqual(['S1']); + expect(result.holds.get('S1')?.owner).toBe('aaa'); + expect(result.mustRepost).toBe(false); + }); + + it('conflict: a lexicographically higher peer id loses - I keep the seat and must repost', () => { + const result = ingestPeerHold(holdMap(), new Set(['S1']), 'aaa', { + from: 'zzz', + seatIds: ['S1'], + expiresAt: 9_000, + }); + expect(result.lostSeatIds).toEqual([]); + expect(result.holds.has('S1')).toBe(false); + expect(result.mustRepost).toBe(true); + }); +}); + +describe('adoptRemoteState', () => { + it('adopts every hold in the snapshot as authoritative, without a tie-break', () => { + const snapshot: WireHold[] = [{ seatId: 'S1', owner: 'incumbent', expiresAt: 9_000 }]; + // My session id sorts lower than the incumbent's - a tie-break would + // normally favour me, but join-time state is authoritative regardless. + const result = adoptRemoteState(new Set(['S1']), 'aaa', snapshot); + expect(result.holds.get('S1')?.owner).toBe('incumbent'); + expect(result.lostSeatIds).toEqual(['S1']); + }); + + it('ignores any snapshot entry attributed to me', () => { + const snapshot: WireHold[] = [{ seatId: 'S1', owner: 'me', expiresAt: 9_000 }]; + const result = adoptRemoteState(new Set(), 'me', snapshot); + expect(result.holds.size).toBe(0); + }); +}); + +describe('toWireHolds', () => { + it('round-trips through adoptRemoteState', () => { + const original = holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 9_000 }); + const { holds } = adoptRemoteState(new Set(), 'me', toWireHolds(original)); + expect(holds.get('S1')).toEqual(original.get('S1')); + }); +}); diff --git a/src/utils/holdProtocol.ts b/src/utils/holdProtocol.ts new file mode 100644 index 0000000..8ab0d8b --- /dev/null +++ b/src/utils/holdProtocol.ts @@ -0,0 +1,202 @@ +import type { HoldMap, HoldMessage, SeatHold, WireHold } from '../interfaces/venue.interfaces'; + +// How long a live cart holds its seats before checkout must complete. +export const SELECTION_HOLD_MS = 5 * 60_000; +// The window the seeded demo holds (venue.json's static `held` seats) are +// spread across, so they visibly release over the life of a session instead +// of all at once or never. +export const SIM_WINDOW_MS = 6 * 60_000; +// Expiries are quantized to this grid so hundreds of holds collapse into a +// handful of release batches - one store write per batch, not one per seat. +export const RELEASE_TICK_MS = 4_000; +// The expiry timer fires just after (never just before) the deadline. +export const EXPIRY_SLACK_MS = 50; +// How long a newly-mounted tab waits for an incumbent's `state` reply before +// seeding its own simulation. +export const SYNC_TIMEOUT_MS = 250; +// A cross-tab deadline is shifted by the sender/receiver clock difference +// only once it exceeds this - small jitter shouldn't perturb every message. +export const CLOCK_SKEW_TOLERANCE_MS = 2_000; +// Versioned so a future protocol change can't cross-talk with an old tab +// that hasn't reloaded yet. +export const HOLD_CHANNEL_NAME = 'venue-holds-v1'; + +function isStringArray(value: unknown): value is string[] { + return Array.isArray(value) && value.every((v) => typeof v === 'string'); +} + +// `in` narrows a plain `object` without ever casting it - the same idiom +// seatStore.ts's isPersistedStorageValue already uses for the same reason: +// this is deserializing a shared-origin channel another app could also be +// posting to, so nothing about its shape can be assumed. +function isWireHold(value: unknown): value is WireHold { + return ( + typeof value === 'object' && + value !== null && + 'seatId' in value && + 'owner' in value && + 'expiresAt' in value && + typeof value.seatId === 'string' && + typeof value.owner === 'string' && + typeof value.expiresAt === 'number' + ); +} + +function isWireHoldArray(value: unknown): value is WireHold[] { + return Array.isArray(value) && value.every(isWireHold); +} + +// Validates payloads coming off a shared-origin BroadcastChannel, which +// another app on the same origin could also be posting to - and is what +// lets `event.data` (typed `unknown`) be treated as a HoldMessage safely. +export function isHoldMessage(data: unknown): data is HoldMessage { + if (typeof data !== 'object' || data === null) return false; + if (!('type' in data) || !('from' in data) || !('sentAt' in data)) return false; + if (typeof data.type !== 'string' || typeof data.from !== 'string') return false; + if (typeof data.sentAt !== 'number') return false; + + switch (data.type) { + case 'hello': + return 'ownedSeatIds' in data && isStringArray(data.ownedSeatIds); + case 'state': + return ( + 'to' in data && + 'holds' in data && + typeof data.to === 'string' && + isWireHoldArray(data.holds) + ); + case 'hold': + return ( + 'seatIds' in data && + 'expiresAt' in data && + isStringArray(data.seatIds) && + typeof data.expiresAt === 'number' + ); + case 'sold': + return 'seatIds' in data && isStringArray(data.seatIds); + case 'goodbye': + return true; + default: + return false; + } +} + +// Deadlines are exchanged as absolute epoch ms, so a mid-session system +// clock change (NTP correction, a user editing the clock) is the only real +// skew risk between tabs on one machine - small jitter is left alone so it +// doesn't perturb every message for no reason. +export function translateExpiry(expiresAt: number, sentAt: number, receivedAt: number): number { + const skew = receivedAt - sentAt; + if (Math.abs(skew) <= CLOCK_SKEW_TOLERANCE_MS) return expiresAt; + return expiresAt + skew; +} + +export function toWireHolds(holds: HoldMap): WireHold[] { + return Array.from(holds.values(), (hold) => ({ + seatId: hold.seatId, + owner: hold.owner, + expiresAt: hold.expiresAt, + })); +} + +// Drops every hold whose deadline has passed. Returns the SAME map +// reference when nothing lapsed - load-bearing, not a micro-optimisation: +// callers use this to decide whether a store write (and therefore a +// ~1,500-seat re-render) is needed at all. +export function pruneHolds(holds: HoldMap, now: number): HoldMap { + let changed = false; + const next = new Map(); + for (const [seatId, hold] of holds) { + if (hold.expiresAt > now) { + next.set(seatId, hold); + } else { + changed = true; + } + } + return changed ? next : holds; +} + +// The next moment anything in this tab needs to change: whichever is +// sooner, a tracked hold lapsing or the local checkout timer running out. +// null means "nothing to schedule" - no timer should be armed. +export function nextDeadline(holds: HoldMap, selectionExpiresAt: number | null): number | null { + let min = selectionExpiresAt; + for (const hold of holds.values()) { + if (min === null || hold.expiresAt < min) min = hold.expiresAt; + } + return min; +} + +export interface PeerHoldResult { + holds: HoldMap; + // Seats this tab was holding in its own selection that it must now give + // up, because a peer's claim on them won a tie-break. + lostSeatIds: string[]; + // This tab won a conflict on at least one seat - it should re-broadcast + // its own hold so the losing peer learns and yields. + mustRepost: boolean; +} + +// Applies a peer's `hold` (or `goodbye`, which is just seatIds: []) to the +// local hold map. `hold` always carries the sender's ENTIRE current claim, +// so this first clears every hold previously attributed to that sender +// (full-set replacement - a dropped message self-heals on the next change +// instead of leaving a stale hold forever), then inserts the new set. +// +// A seat the sender claims that I also have selected is a genuine +// simultaneous-selection race with no server to arbitrate it - resolved by +// a deterministic total order (lower session id wins) that both tabs +// compute identically with no coordinator. +export function ingestPeerHold( + holds: HoldMap, + selectedSeats: ReadonlySet, + mySessionId: string, + message: { from: string; seatIds: readonly string[]; expiresAt: number }, +): PeerHoldResult { + if (message.from === mySessionId) { + return { holds, lostSeatIds: [], mustRepost: false }; + } + + const next = new Map(holds); + for (const [seatId, hold] of next) { + if (hold.owner === message.from) next.delete(seatId); + } + + const lostSeatIds: string[] = []; + let mustRepost = false; + + for (const seatId of message.seatIds) { + if (selectedSeats.has(seatId)) { + if (message.from < mySessionId) { + next.set(seatId, { seatId, owner: message.from, expiresAt: message.expiresAt }); + lostSeatIds.push(seatId); + } else { + mustRepost = true; + } + } else { + next.set(seatId, { seatId, owner: message.from, expiresAt: message.expiresAt }); + } + } + + return { holds: next, lostSeatIds, mustRepost }; +} + +// A join-time `state` reply is authoritative, unlike an ordinary `hold`: +// the incumbent genuinely had the seat first, so no tie-break is applied - +// I simply lose any overlapping seat from my own selection. +export function adoptRemoteState( + selectedSeats: ReadonlySet, + mySessionId: string, + snapshot: readonly WireHold[], +): { holds: HoldMap; lostSeatIds: string[] } { + const next = new Map(); + const lostSeatIds: string[] = []; + + for (const wire of snapshot) { + if (wire.owner === mySessionId) continue; + next.set(wire.seatId, { seatId: wire.seatId, owner: wire.owner, expiresAt: wire.expiresAt }); + if (selectedSeats.has(wire.seatId)) lostSeatIds.push(wire.seatId); + } + + return { holds: next, lostSeatIds }; +} diff --git a/src/utils/holdSimulation.test.ts b/src/utils/holdSimulation.test.ts new file mode 100644 index 0000000..173a371 --- /dev/null +++ b/src/utils/holdSimulation.test.ts @@ -0,0 +1,92 @@ +import { describe, expect, it } from 'vitest'; +import type { ISeat, Row, Section, Venue } from '../interfaces/venue.interfaces'; +import { SIMULATED_OWNER } from '../interfaces/venue.interfaces'; +import { RELEASE_TICK_MS, SIM_WINDOW_MS } from './holdProtocol'; +import { hash32, seedSimulatedHolds, simulatedExpiry } from './holdSimulation'; + +function makeSeat(id: string, status: ISeat['status'] = 'available'): ISeat { + return { id, col: 1, x: 0, y: 0, priceTier: 1, status }; +} + +function makeVenue(seats: ISeat[]): Venue { + const row: Row = { index: 1, seats }; + const section: Section = { + id: 'S-1', + label: 'Section 1', + transform: { x: 0, y: 0, scale: 1 }, + rows: [row], + }; + return { venueId: 'v', name: 'Venue', map: { width: 100, height: 100 }, sections: [section] }; +} + +const ANCHOR = 1_000_000; + +describe('hash32', () => { + it('is deterministic for the same input', () => { + expect(hash32('SEAT-42')).toBe(hash32('SEAT-42')); + }); + + it('produces different values for different inputs (smoke test)', () => { + const values = new Set(Array.from({ length: 50 }, (_, i) => hash32(`SEAT-${i}`))); + expect(values.size).toBeGreaterThan(40); + }); +}); + +describe('simulatedExpiry', () => { + it('is always within (anchor, anchor + SIM_WINDOW_MS]', () => { + for (let i = 0; i < 50; i++) { + const expiry = simulatedExpiry(`SEAT-${i}`, ANCHOR); + expect(expiry).toBeGreaterThan(ANCHOR); + expect(expiry).toBeLessThanOrEqual(ANCHOR + SIM_WINDOW_MS); + } + }); + + it('is quantized to the release tick grid', () => { + for (let i = 0; i < 50; i++) { + const expiry = simulatedExpiry(`SEAT-${i}`, ANCHOR); + expect((expiry - ANCHOR) % RELEASE_TICK_MS).toBe(0); + } + }); +}); + +describe('seedSimulatedHolds', () => { + it('seeds only seats whose status is held, leaving other statuses untouched', () => { + const seats = [ + makeSeat('A', 'available'), + makeSeat('B', 'held'), + makeSeat('C', 'sold'), + makeSeat('D', 'reserved'), + makeSeat('E', 'held'), + ]; + const holds = seedSimulatedHolds(makeVenue(seats), ANCHOR, new Set()); + expect(Array.from(holds.keys()).sort()).toEqual(['B', 'E']); + }); + + it('skips a held seat that is already in the selection', () => { + const seats = [makeSeat('A', 'held'), makeSeat('B', 'held')]; + const holds = seedSimulatedHolds(makeVenue(seats), ANCHOR, new Set(['A'])); + expect(Array.from(holds.keys())).toEqual(['B']); + }); + + it('owner is the simulated sentinel, never a real session id', () => { + const holds = seedSimulatedHolds(makeVenue([makeSeat('A', 'held')]), ANCHOR, new Set()); + expect(holds.get('A')?.owner).toBe(SIMULATED_OWNER); + }); + + it('is deterministic and order-independent: a shuffled fixture yields the identical map', () => { + const seats = Array.from({ length: 20 }, (_, i) => makeSeat(`H${i}`, 'held')); + const shuffled = [...seats].reverse(); + + const a = seedSimulatedHolds(makeVenue(seats), ANCHOR, new Set()); + const b = seedSimulatedHolds(makeVenue(shuffled), ANCHOR, new Set()); + + expect(Object.fromEntries(a)).toEqual(Object.fromEntries(b)); + }); + + it('staggers releases across multiple buckets rather than firing all at once', () => { + const seats = Array.from({ length: 100 }, (_, i) => makeSeat(`H${i}`, 'held')); + const holds = seedSimulatedHolds(makeVenue(seats), ANCHOR, new Set()); + const buckets = new Set(Array.from(holds.values(), (h) => h.expiresAt)); + expect(buckets.size).toBeGreaterThan(1); + }); +}); diff --git a/src/utils/holdSimulation.ts b/src/utils/holdSimulation.ts new file mode 100644 index 0000000..35747e2 --- /dev/null +++ b/src/utils/holdSimulation.ts @@ -0,0 +1,56 @@ +import type { HoldMap, SeatHold, Venue } from '../interfaces/venue.interfaces'; +import { SIMULATED_OWNER } from '../interfaces/venue.interfaces'; +import { RELEASE_TICK_MS, SIM_WINDOW_MS } from './holdProtocol'; + +// A small, fast, non-cryptographic string hash (djb2 variant). Deterministic +// and order-independent - the same seat id always maps to the same offset +// regardless of iteration order, which is what makes seeding reproducible +// without needing a stateful PRNG draw per seat. +export function hash32(input: string): number { + let hash = 5381; + for (let i = 0; i < input.length; i++) { + hash = (hash * 33) ^ input.charCodeAt(i); + } + return hash >>> 0; +} + +// Quantized to RELEASE_TICK_MS so hundreds of independently-hashed seats +// still collapse onto a shared grid of release moments, rather than each +// landing on its own distinct millisecond. +export function simulatedExpiry(seatId: string, anchor: number): number { + const offset = hash32(seatId) % SIM_WINDOW_MS; + const quantized = Math.max( + RELEASE_TICK_MS, + Math.ceil(offset / RELEASE_TICK_MS) * RELEASE_TICK_MS, + ); + return anchor + quantized; +} + +// Seeds a live, expiring hold for every seat venue.json marks `held`, so the +// sample data's static status becomes a real fact instead of a permanent +// one - see seatStatus.ts for why the resolver stops trusting +// `seat.status === 'held'` once this has run. +export function seedSimulatedHolds( + venue: Venue, + anchor: number, + selectedSeats: ReadonlySet, +): HoldMap { + const holds = new Map(); + for (const section of venue.sections) { + for (const row of section.rows) { + for (const seat of row.seats) { + if (seat.status !== 'held') continue; + // Can't actually happen (seeding only touches JSON-held seats, + // which were never selectable), but one line of insurance against + // ever handing a "held" status to a seat the user has selected. + if (selectedSeats.has(seat.id)) continue; + holds.set(seat.id, { + seatId: seat.id, + owner: SIMULATED_OWNER, + expiresAt: simulatedExpiry(seat.id, anchor), + }); + } + } + } + return holds; +} diff --git a/src/utils/seatStatus.test.ts b/src/utils/seatStatus.test.ts new file mode 100644 index 0000000..8c208dd --- /dev/null +++ b/src/utils/seatStatus.test.ts @@ -0,0 +1,135 @@ +import { describe, expect, it } from 'vitest'; +import type { HoldMap, SeatHold } from '../interfaces/venue.interfaces'; +import { + SEAT_STATUS_STYLE, + describeSeatStatus, + isSeatSelectable, + resolveSeatStatus, +} from './seatStatus'; + +function holdMap(...holds: SeatHold[]): HoldMap { + return new Map(holds.map((h) => [h.seatId, h])); +} + +const base = { + soldSeats: new Set(), + holds: holdMap(), + selectedSeats: new Set(), + now: 1_000, + simulationSeeded: false, +}; + +describe('resolveSeatStatus', () => { + it('a seat marked sold in venue.json resolves to sold', () => { + expect(resolveSeatStatus({ id: 'S1', status: 'sold' }, base)).toBe('sold'); + }); + + it('a seat bought locally (soldSeats) resolves to sold even if data says available', () => { + const overlays = { ...base, soldSeats: new Set(['S1']) }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('sold'); + }); + + it('sold beats an active foreign hold', () => { + const overlays = { + ...base, + soldSeats: new Set(['S1']), + holds: holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 5_000 }), + }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('sold'); + }); + + it('sold beats being in this tabโ€™s own selection', () => { + const overlays = { ...base, soldSeats: new Set(['S1']), selectedSeats: new Set(['S1']) }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('sold'); + }); + + it('an active hold (expiresAt in the future) resolves to held', () => { + const overlays = { ...base, holds: holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 5_000 }) }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('held'); + }); + + it('expiresAt === now is treated as lapsed, not held', () => { + const overlays = { ...base, holds: holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 1_000 }) }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('available'); + }); + + it('expiresAt < now is treated as lapsed', () => { + const overlays = { ...base, holds: holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 500 }) }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('available'); + }); + + it('a lapsed hold record falls through to selected when the seat is also mine', () => { + const overlays = { + ...base, + holds: holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 500 }), + selectedSeats: new Set(['S1']), + }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('selected'); + }); + + it('a foreign hold outranks this tabโ€™s own selection (fail-safe ordering)', () => { + const overlays = { + ...base, + holds: holdMap({ seatId: 'S1', owner: 'peer', expiresAt: 5_000 }), + selectedSeats: new Set(['S1']), + }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('held'); + }); + + it('a seat in selectedSeats resolves to selected', () => { + const overlays = { ...base, selectedSeats: new Set(['S1']) }; + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, overlays)).toBe('selected'); + }); + + it('reserved survives a stale/absent hold record', () => { + expect(resolveSeatStatus({ id: 'S1', status: 'reserved' }, base)).toBe('reserved'); + }); + + it('a JSON-held seat resolves to held before the simulation has seeded', () => { + expect( + resolveSeatStatus({ id: 'S1', status: 'held' }, { ...base, simulationSeeded: false }), + ).toBe('held'); + }); + + it('the same JSON-held seat resolves to available once seeded, with no live hold record', () => { + expect( + resolveSeatStatus({ id: 'S1', status: 'held' }, { ...base, simulationSeeded: true }), + ).toBe('available'); + }); + + it('a plain available seat with no overlays resolves to available', () => { + expect(resolveSeatStatus({ id: 'S1', status: 'available' }, base)).toBe('available'); + }); +}); + +describe('isSeatSelectable', () => { + it.each([ + ['available', true], + ['selected', true], + ['sold', false], + ['reserved', false], + ['held', false], + ] as const)('%s -> %s', (status, expected) => { + expect(isSeatSelectable(status)).toBe(expected); + }); +}); + +describe('describeSeatStatus', () => { + it.each([ + ['available', 'available'], + ['selected', 'selected'], + ['sold', 'sold'], + ['reserved', 'reserved'], + ['held', 'temporarily held by another customer'], + ] as const)('%s -> %s', (status, expected) => { + expect(describeSeatStatus(status)).toBe(expected); + }); +}); + +describe('SEAT_STATUS_STYLE', () => { + it('has an entry for every effective status', () => { + (['available', 'selected', 'sold', 'reserved', 'held'] as const).forEach((status) => { + expect(SEAT_STATUS_STYLE[status]).toBeDefined(); + }); + }); +}); diff --git a/src/utils/seatStatus.ts b/src/utils/seatStatus.ts new file mode 100644 index 0000000..82121e8 --- /dev/null +++ b/src/utils/seatStatus.ts @@ -0,0 +1,110 @@ +import type { EffectiveSeatStatus, HoldMap, ISeat } from '../interfaces/venue.interfaces'; + +export interface SeatStatusOverlays { + soldSeats: ReadonlySet; + holds: HoldMap; + selectedSeats: ReadonlySet; + now: number; + // Whether the runtime simulation has taken over from venue.json's static + // `held` field yet - see the comment on the `held` branch below. + simulationSeeded: boolean; +} + +// Centralises what used to be scattered boolean derivation in Seat.tsx into +// one precedence order, so every consumer (rendering, aria-label, keyboard +// nav) agrees on what a seat "is" at a given instant. +export function resolveSeatStatus( + seat: Pick, + overlays: SeatStatusOverlays, +): EffectiveSeatStatus { + const { soldSeats, holds, selectedSeats, now, simulationSeeded } = overlays; + + // A sale is terminal - it outranks everything, including a seat this tab + // still thinks it has selected (e.g. a remote purchase notification). + if (seat.status === 'sold' || soldSeats.has(seat.id)) return 'sold'; + + // Checked before `selected` as a fail-safe, not because it's expected to + // fire in the common case: the store keeps selectedSeats and live foreign + // holds disjoint, but for the one frame after a reload with a persisted + // selection another tab has since claimed, this is what stops the seat + // from rendering as falsely "mine" before reconciliation runs. + const hold = holds.get(seat.id); + if (hold && hold.expiresAt > now) return 'held'; + + if (selectedSeats.has(seat.id)) return 'selected'; + + if (seat.status === 'reserved') return 'reserved'; + + // venue.json's `held` is a seeding INSTRUCTION, not a live fact - before + // seeding runs it should still read as held (no flash of hundreds of + // seats going available), but once seeded, `holds` is the only + // authority. Falling back to this field even after seeding would mean a + // lapsed-and-pruned simulated hold silently reverts to held forever. + if (seat.status === 'held' && !simulationSeeded) return 'held'; + + return 'available'; +} + +export function isSeatSelectable(status: EffectiveSeatStatus): boolean { + return status === 'available' || status === 'selected'; +} + +export function describeSeatStatus(status: EffectiveSeatStatus): string { + switch (status) { + case 'sold': + return 'sold'; + case 'reserved': + return 'reserved'; + case 'held': + return 'temporarily held by another customer'; + case 'selected': + return 'selected'; + case 'available': + return 'available'; + } +} + +interface SeatStyle { + fill: string; + stroke: string; + strokeWidth: number; + textColor: string; +} + +// A module-level lookup rather than an if/else ladder recomputed per seat +// per render - the fill/stroke/text-color triple no longer needs deriving, +// just looking up. `available`'s stroke is a fallback only: Seat.tsx still +// overrides it per price tier, the one piece of styling this table can't +// express since it depends on the seat, not just its status. +export const SEAT_STATUS_STYLE: Record = { + available: { + fill: 'var(--color-seat-available)', + stroke: 'var(--color-seat-available-stroke)', + strokeWidth: 0.35, + textColor: '#334155', + }, + selected: { + fill: 'var(--color-seat-selected)', + stroke: 'white', + strokeWidth: 0.4, + textColor: 'white', + }, + sold: { + fill: 'var(--color-seat-sold)', + stroke: 'none', + strokeWidth: 0, + textColor: '#334155', + }, + reserved: { + fill: 'var(--color-seat-reserved)', + stroke: 'none', + strokeWidth: 0, + textColor: '#334155', + }, + held: { + fill: 'var(--color-seat-held)', + stroke: 'none', + strokeWidth: 0, + textColor: 'white', + }, +}; diff --git a/src/utils/sessionId.test.ts b/src/utils/sessionId.test.ts new file mode 100644 index 0000000..0e79d0a --- /dev/null +++ b/src/utils/sessionId.test.ts @@ -0,0 +1,68 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +const STORAGE_KEY = 'venue-session-id'; + +// getSessionId() caches in a module-level variable, so each test needs a +// fresh module instance (via resetModules + a dynamic import) to observe +// its cold-start behavior rather than a previous test's cached id. +describe('getSessionId', () => { + beforeEach(() => { + sessionStorage.clear(); + vi.resetModules(); + }); + + it('returns the same id on a second call in the same session', async () => { + const { getSessionId } = await import('./sessionId'); + expect(getSessionId()).toBe(getSessionId()); + }); + + it('reuses an id already present in sessionStorage', async () => { + sessionStorage.setItem(STORAGE_KEY, 'existing-id'); + const { getSessionId } = await import('./sessionId'); + expect(getSessionId()).toBe('existing-id'); + }); + + it('persists a freshly generated id to sessionStorage', async () => { + const { getSessionId } = await import('./sessionId'); + const id = getSessionId(); + expect(sessionStorage.getItem(STORAGE_KEY)).toBe(id); + }); + + it('falls back to a manually generated id when crypto.randomUUID is unavailable', async () => { + const originalRandomUUID = crypto.randomUUID.bind(crypto); + // @ts-expect-error deliberately simulating an older browser without crypto.randomUUID + delete crypto.randomUUID; + try { + const { getSessionId } = await import('./sessionId'); + const id = getSessionId(); + expect(typeof id).toBe('string'); + expect(id.length).toBeGreaterThan(0); + } finally { + crypto.randomUUID = originalRandomUUID; + } + }); + + it('falls back to an in-memory id when sessionStorage throws', async () => { + const original = Object.getOwnPropertyDescriptor(window, 'sessionStorage'); + Object.defineProperty(window, 'sessionStorage', { + configurable: true, + value: { + getItem() { + throw new Error('blocked'); + }, + setItem() { + throw new Error('blocked'); + }, + }, + }); + try { + const { getSessionId } = await import('./sessionId'); + const id = getSessionId(); + expect(typeof id).toBe('string'); + // Still cached in-memory even though persistence failed. + expect(getSessionId()).toBe(id); + } finally { + if (original) Object.defineProperty(window, 'sessionStorage', original); + } + }); +}); diff --git a/src/utils/sessionId.ts b/src/utils/sessionId.ts new file mode 100644 index 0000000..48d549c --- /dev/null +++ b/src/utils/sessionId.ts @@ -0,0 +1,36 @@ +const STORAGE_KEY = 'venue-session-id'; + +function generateId(): string { + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { + return crypto.randomUUID(); + } + return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`; +} + +let cached: string | null = null; + +// Per-tab identity for the hold protocol. Deliberately sessionStorage (not +// localStorage, not zustand's persist middleware): it survives a reload +// but is never shared across tabs, so a reloading tab reclaims its OWN +// prior holds instead of colliding with itself as a "new" peer. +export function getSessionId(): string { + if (cached) return cached; + + try { + const stored = sessionStorage.getItem(STORAGE_KEY); + if (stored) { + cached = stored; + return cached; + } + const fresh = generateId(); + sessionStorage.setItem(STORAGE_KEY, fresh); + cached = fresh; + return fresh; + } catch { + // Safari private mode (and similar) can throw on sessionStorage access. + // Falling back to an in-memory id keeps the tab working as a + // single-session peer instead of crashing. + cached ??= generateId(); + return cached; + } +} From ccd8092fbce657d04cae8dd0ffe50c33a59b4685 Mon Sep 17 00:00:00 2001 From: Viral Webvoltz Date: Thu, 10 Sep 2026 12:54:22 +0530 Subject: [PATCH 21/26] docs: document the best-seats solver and live seat-hold contention Raises the coverage regression floor in vite.config.ts to match the actual numbers after the two features' near-100%-covered utility modules landed, and updates the README, engineering notes, and the UI/UX flow reference so they describe current behavior instead of the now-stale "held/reserved never expire, no live-update mechanism" gap the flow doc used to call out. --- README.md | 94 +++++-- docs/engineering-notes.md | 92 +++++-- docs/ui-ux-and-business-logic-flow.md | 382 ++++++++++++++++++-------- vite.config.ts | 15 +- 4 files changed, 432 insertions(+), 151 deletions(-) diff --git a/README.md b/README.md index 7beea13..eae427b 100644 --- a/README.md +++ b/README.md @@ -48,11 +48,14 @@ flowchart TD D -->|inactive| E["Collapsed <path> cover shape
(1 SVG node per section)"] D -->|active| F["Seats
(memoized)"] F --> G["~1,500 <rect> seat nodes
(one section's worth)"] - A --> H["seatStore (Zustand)
selection ยท zoom ยท active section"] - H -.->|persist selectedSeats| I[(localStorage)] + A --> H["seatStore (Zustand)
selection ยท holds ยท zoom ยท active section"] + H -.->|persist selectedSeats + deadline| I[(localStorage)] F -.reads/writes.-> H A --> J[Toast
aria-live feedback] H -.->|feedback| J + A --> K["HoldRuntime
(renders nothing)"] + K -.expiry timer.-> H + K <-.BroadcastChannel.-> L["Other tabs"] ``` ### 15,000+ seat rendering: section-level collapsing @@ -89,6 +92,50 @@ so `localStorage` only ever stores an array, while the in-memory store keeps `O( See [`docs/engineering-notes.md`](docs/engineering-notes.md) for the tradeoffs behind these decisions and where they'd need to change at greater scale. +### Best-seats solver + +[`findBestSeats.ts`](src/utils/findBestSeats.ts) finds the single best contiguous block of N seats +for a party in a single pass over the venue (O(seats ร— party size)), ranked by a strict, +deterministic total order - "Best view" sorts by row distance from the stage, then how centered the +block is _within its row's own `col` range_ (not x/y - see the comment in that file for why arc +position, not geometry, is the right unit), then price; "Best price" sorts the same way but leads +with price. The last two keys (section, starting seat) exist purely to break ties, so the same +query always returns the same seats rather than depending on `venue.json`'s array order. +[`BestSeatsFinder.tsx`](src/components/BestSeatsFinder.tsx) runs it against live availability +(`venue.json` status, seats sold this session, and any live hold - see below) and focuses/selects +the winning block in one atomic store update. + +### Live seat-hold contention + +Real ticketing sites don't just mark seats "held" once and forget - holds expire, and two people +(or two tabs) can race for the same seat. This project simulates that without a backend: + +- **A checkout timer.** Selecting a seat starts a 5-minute deadline ([`seatStore.ts`](src/store/seatStore.ts)'s + `selectionExpiresAt`, persisted so a refresh doesn't grant an unlimited hold). It's surfaced as + [`CheckoutTimer.tsx`](src/components/CheckoutTimer.tsx), driven by [`useCountdown.ts`](src/hooks/useCountdown.ts) - + the countdown owns its own render loop and never touches the store on a tick, so it can't cause + the seat layer to re-render. +- **The sample `held` seats actually expire.** [`holdSimulation.ts`](src/utils/holdSimulation.ts) + seeds every JSON-`held` seat with a real, staggered expiry at runtime (never baked into the + committed file, which would just be stale on the next load) using a deterministic hash of the + seat id - reproducible, but spread across a window so seats visibly release a few at a time + instead of all at once. +- **Cross-tab sync.** [`holdChannel.ts`](src/utils/holdChannel.ts) wraps `BroadcastChannel` behind + an injectable, feature-detected transport (it degrades to a no-op, single-tab mode when the API + is unavailable - which is also exactly the situation under Vitest/jsdom, so the same code path is + what the tests exercise). [`holdProtocol.ts`](src/utils/holdProtocol.ts) has the actual protocol + as pure, unit-tested reducers: a join-time handshake, full-set-replacement hold messages (so a + dropped packet self-heals on the next change instead of leaving a stale hold), and a + deterministic tie-break (lower session id wins) for the case where two tabs select the same seat + in the same instant. +- **One resolver, one source of truth.** [`seatStatus.ts`](src/utils/seatStatus.ts) centralizes + `sold` โ†’ `held` โ†’ `selected` โ†’ `reserved` โ†’ `available` precedence into a single pure function, + replacing what used to be scattered boolean checks in `Seat.tsx`. +- **Never re-renders the seat layer on a timer.** Pruning a lapsed hold (`pruneHolds` in + `holdProtocol.ts`) returns the _same_ Map reference when nothing has actually expired, so a + routine tick with nothing to do costs zero re-renders across the ~1,500 mounted seats - verified + by a reference-equality (`toBe`) test, not just a behavioral one. + --- ## โ™ฟ Accessibility @@ -108,6 +155,11 @@ decisions and where they'd need to change at greater scale. ## ๐Ÿš€ Features - **Large-scale rendering**: Thousands of seats render smoothly using SVG optimization. +- **Best-seats solver**: Pick a party size and priority ("Best view" or "Best price") and find the + single best contiguous block of adjacent seats, ranked by a deterministic algorithm. +- **Live seat-hold contention**: Selecting seats starts a real 5-minute checkout timer; the sample + `held` seats expire and release on their own; two browser tabs share holds and sales live via + `BroadcastChannel`, with a deterministic tie-break if they pick the same seat at once. - **Map navigation**: Click-and-drag panning with smart zoom in/out controls. - **Accessibility**: Full arrow-key navigation between seats, keyboard-selectable seats (`role="checkbox"`). - **Persisted selection**: Selected seats survive a page refresh (Zustand + `localStorage`). @@ -154,18 +206,24 @@ See [Engineering standards](#-engineering-standards) below for details. โ”‚ โ””โ”€โ”€ generateVenue.ts # Generates public/venue.json โ”œโ”€โ”€ src/ โ”‚ โ”œโ”€โ”€ components/ # VenueMap, Section, Seat, BookingSummary, SeatSelectionPanel, -โ”‚ โ”‚ # SeatSelectionFooter, BookingHistoryPanel, ConfirmDialog, Toast, -โ”‚ โ”‚ # Icon, IconButton +โ”‚ โ”‚ # SeatSelectionFooter, BookingHistoryPanel, BestSeatsFinder, +โ”‚ โ”‚ # CheckoutTimer, HoldRuntime, ConfirmDialog, Toast, Icon, IconButton โ”‚ โ”œโ”€โ”€ hooks/ -โ”‚ โ”‚ โ””โ”€โ”€ useVenue.ts # Fetches and validates public/venue.json +โ”‚ โ”‚ โ”œโ”€โ”€ useVenue.ts # Fetches and validates public/venue.json +โ”‚ โ”‚ โ”œโ”€โ”€ useCountdown.ts # Self-correcting per-second countdown, isolated from the store +โ”‚ โ”‚ โ”œโ”€โ”€ useHoldExpiry.ts # Arms one timer for the next hold/selection deadline +โ”‚ โ”‚ โ””โ”€โ”€ useHoldSync.ts # Cross-tab BroadcastChannel wiring โ”‚ โ”œโ”€โ”€ store/ -โ”‚ โ”‚ โ””โ”€โ”€ seatStore.ts # Zustand store (zoom, active section, selection, sold seats, -โ”‚ โ”‚ # booking history, feedback) +โ”‚ โ”‚ โ””โ”€โ”€ seatStore.ts # Zustand store (zoom, active section, selection + checkout +โ”‚ โ”‚ # deadline, holds, sold seats, booking history, feedback) โ”‚ โ”œโ”€โ”€ interfaces/ -โ”‚ โ”‚ โ””โ”€โ”€ venue.interfaces.ts -โ”‚ โ”œโ”€โ”€ utils/ # rowLetter, seatIndex, venueBounds, viewTransform (pan/zoom math) +โ”‚ โ”‚ โ””โ”€โ”€ venue.interfaces.ts # Venue/seat types + the hold protocol's message types +โ”‚ โ”œโ”€โ”€ utils/ # rowLetter, seatIndex, venueBounds, viewTransform (pan/zoom math), +โ”‚ โ”‚ # findBestSeats (best-seats solver), seatStatus (status resolver), +โ”‚ โ”‚ # holdProtocol/holdChannel/holdSimulation/sessionId/formatCountdown โ”‚ โ”œโ”€โ”€ test/ -โ”‚ โ”‚ โ””โ”€โ”€ setup.ts # Vitest + Testing Library setup +โ”‚ โ”‚ โ”œโ”€โ”€ setup.ts # Vitest + Testing Library setup +โ”‚ โ”‚ โ””โ”€โ”€ fakeBroadcastChannel.ts # In-memory multi-tab bus for testing the hold protocol โ”‚ โ”œโ”€โ”€ App.tsx โ”‚ โ””โ”€โ”€ main.tsx โ”œโ”€โ”€ .github/workflows/ci.yml # CI pipeline @@ -245,19 +303,23 @@ pnpm test ``` Runs with V8 coverage enabled (`pnpm run security:audit` covers dependency vulnerabilities -separately). Coverage thresholds in [`vite.config.ts`](vite.config.ts) are set to today's actual -numbers as a regression floor, not the org standard's targets (branches 85% / functions 100% / -lines 90% / statements 90%) - most components don't have tests yet; see +separately). Coverage thresholds in [`vite.config.ts`](vite.config.ts) are set just under today's +actual numbers as a regression floor, not the org standard's targets (branches 85% / functions +100% / lines 90% / statements 90%) - most components still don't have tests; see [`docs/engineering-notes.md`](docs/engineering-notes.md#known-remaining-gaps) for the honest current numbers and what closing that gap actually requires. Existing tests cover seat selection/deselection, the 8-seat selection cap, clearing the selection, -the persisted-seats/sold-seats/booking-history `localStorage` round trip, and keyboard navigation -(arrow keys, Enter/Space, skipping unavailable seats) - see +the persisted-seats/sold-seats/booking-history/checkout-deadline `localStorage` round trip, and +keyboard navigation (arrow keys, Enter/Space, skipping unavailable seats) - see [`src/store/seatStore.test.ts`](src/store/seatStore.test.ts) and [`src/components/Seat.test.tsx`](src/components/Seat.test.tsx). Pan/zoom math (fit-to-screen, zoom-at-pointer, pan clamping) is covered separately in -[`src/utils/viewTransform.test.ts`](src/utils/viewTransform.test.ts). +[`src/utils/viewTransform.test.ts`](src/utils/viewTransform.test.ts). The best-seats solver's +ranking/tiebreak logic, the hold protocol's reducers (including a reference-equality test proving a +no-op prune never triggers a re-render), the runtime hold simulation's determinism, and the +checkout countdown's stable-announcement-band behavior each have their own dedicated, near-100%-covered +test files under `src/utils/` and `src/hooks/`. --- diff --git a/docs/engineering-notes.md b/docs/engineering-notes.md index b66bb6f..e1fa31d 100644 --- a/docs/engineering-notes.md +++ b/docs/engineering-notes.md @@ -39,44 +39,90 @@ approach, accepting the accessibility rebuild that comes with it. `Section` and `Seats` (in [`Seat.tsx`](../src/components/Seat.tsx)) are both `React.memo`-wrapped so that panning/zooming or selecting a seat in one section doesn't re-render every other section's -already-collapsed cover path. Within `Seats`, per-seat fill/stroke colors and the tier-color map are -recomputed on every render of that component - acceptable at ~1,500 seats, but the first thing to -hoist out (e.g., derive style from a lookup keyed by `status`/`priceTier` computed once) if a -section's seat count grows materially. +already-collapsed cover path. Per-seat fill/stroke/text-color used to be recomputed via an if/else +ladder on every render; [`seatStatus.ts`](../src/utils/seatStatus.ts)'s `SEAT_STATUS_STYLE` replaced +that with a lookup keyed by effective status, computed once at module scope. The one thing that +lookup can't express is that an _available_ seat's stroke also depends on its own price tier - +`Seat.tsx` still applies that as a small override after the lookup. + +A second render-cost fix landed alongside the live-hold work: `Seats` used to subscribe to the raw +`zoom` number just to derive a `showLabels` boolean, which meant all ~1,500 mounted seats re-rendered +on _every_ wheel/zoom event regardless of whether the threshold was actually crossed. It now +subscribes to `zoom >= LABEL_ZOOM_THRESHOLD` directly - a boolean that only changes value when the +threshold is crossed, so Zustand's default `Object.is` equality skips the re-render otherwise. This +was a prerequisite for adding the `holds`/`simulationSeeded` subscriptions the resolver needs, +not just a nicety on its own. ## `localStorage` persistence limits -[`seatStore.ts`](../src/store/seatStore.ts) persists `selectedSeats` to `localStorage` via a custom -`PersistStorage` that serializes the `Set` to a plain array. This is enough for the current -scope (survive a page refresh, single device, no login) but has real limits: +[`seatStore.ts`](../src/store/seatStore.ts) persists `selectedSeats`, `soldSeats`, `bookings`, and +`selectionExpiresAt` to `localStorage` via a custom `PersistStorage` that serializes `Set` +to a plain array. This is enough for the current scope (survive a page refresh, single device, no +login) but has real limits: - `localStorage` has a per-origin size ceiling (typically ~5โ€“10MB depending on browser) - irrelevant at 8 selected seats, but the pattern shouldn't be reused to persist large datasets. -- No cross-device or cross-session sync - selections don't follow a user between browsers or - devices, and there's no server-side hold/reservation, so two tabs (or two people) could both - believe they've selected the same seat. -- A real backend would replace this with a server-held reservation (with a TTL/hold expiry) and use - `localStorage` only as an optimistic local echo, not the source of truth. +- No cross-device sync - a selection doesn't follow a user to a different browser or device, and + there's no server-side inventory, so two different people (or the same person on two devices) + could still both believe they've bought the same seat. +- **Cross-_tab_ contention on one browser is now handled** (not cross-device) - see + [`holdProtocol.ts`](../src/utils/holdProtocol.ts) and the "Live seat-hold contention" section + below. `holds` and `selectionExpiresAt`'s live countdown are deliberately kept _out_ of + `partialize`/only partially persisted: holds are time-based shared state that would fight + `BroadcastChannel` sync if `localStorage` were also treated as a source of truth for them. +- A real backend would still replace all of this with a server-held reservation (a TTL/hold expiry + enforced by a server nothing stops a client from lying about) and use `localStorage` only as an + optimistic local echo, not the source of truth. + +## Live seat-hold contention: the performance guarantee, and its real limits + +[`useHoldExpiry.ts`](../src/hooks/useHoldExpiry.ts) arms exactly one `setTimeout` for whichever +comes soonest - a tracked hold lapsing or this tab's own checkout deadline - rather than polling. +On fire, it calls `runExpiry()` in [`seatStore.ts`](../src/store/seatStore.ts), which prunes via +[`holdProtocol.ts`](../src/utils/holdProtocol.ts)'s `pruneHolds()`. That function returns the +**same** `Map` reference when nothing has actually lapsed, and the store skips its `set()` call +entirely in that case - so a routine tick with nothing to do costs zero re-renders across the +~1,500 mounted seats, not "one small one." This is asserted with a reference-equality (`toBe`) test +in `seatStore.test.ts`, specifically so a future refactor that starts always returning a new `Map` +fails a test instead of silently reintroducing a per-tick re-render. + +**What this simulation is honest about not being:** [`holdChannel.ts`](../src/utils/holdChannel.ts)'s +`BroadcastChannel` transport only reaches other tabs of the _same browser on the same machine_ - +there is no server, so two different visitors on two different computers still can't contend for +the same seat here. The tie-break for a genuine same-instant conflict (lower session id wins, +in [`holdProtocol.ts`](../src/utils/holdProtocol.ts)'s `ingestPeerHold`) is a deterministic +convenience, not consensus - a real implementation would need a server to arbitrate. And the +"simulated" holds seeded onto venue.json's static `held` seats are exactly that: a demonstration +of the mechanism, not a claim about real inventory. ## Known remaining gaps - No virtualization within an active section's own seat list (see above). - The "Proceed to Pay" flow (see [`SeatSelectionFooter.tsx`](../src/components/SeatSelectionFooter.tsx)) is an intentional UI - stub - it shows an inline confirmation, not a real payment integration. -- Seat availability (`sold`/`reserved`/`held`) is static sample data with no live update mechanism - (no websocket/polling) - a second user selecting the same seat isn't reflected without a refresh. + stub - it shows an inline confirmation, not a real payment integration. `confirmPurchase()` does + re-validate the checkout deadline before completing, so at least the "the hold ran out mid-pay" + failure mode is handled - see the "Live seat-hold contention" section above. +- ~~Seat availability (`sold`/`reserved`/`held`) is static sample data with no live update + mechanism (no websocket/polling) - a second user selecting the same seat isn't reflected without + a refresh.~~ **Partly resolved**: `held` seats now expire and release on a real timer, and a + second seat-selecting _tab of the same browser_ is reflected live via `BroadcastChannel` (see + above). The remaining, honest limitation: this is same-browser only. Two different visitors on + two different machines still can't see each other's live selections - that needs a server + pushing real inventory changes, which this project deliberately doesn't have. - **Test coverage is well below the org engineering standard.** The standard ([`Webvoltz-Engineering-Standards/react`](../../Webvoltz-Engineering-Standards/react)) requires branches 85% / functions 100% / lines 90% / statements 90%. Actual project-wide coverage today - (`pnpm test`, V8 provider, whole `src/` tree): **statements 24.6%, branches 27.8%, functions - 19.9%, lines 25.3%** - only `Seat.tsx` and `seatStore.ts` have real test coverage; `App.tsx`, - `VenueMap.tsx`, `Section.tsx`, `BookingSummary.tsx`, `SeatSelectionPanel.tsx`, - `SeatSelectionFooter.tsx`, `BookingHistoryPanel.tsx`, `ConfirmDialog.tsx`, `Icon.tsx`, - `IconButton.tsx`, `Toast.tsx`, `useVenue.ts`, and the `utils/` helpers have none. The thresholds - in [`vite.config.ts`](../vite.config.ts) are set to today's actual numbers (a floor against - regression), not the standard's targets - reaching those targets means writing real test suites - for all of the above, which is a substantial task on its own, not a quick config change. + (`pnpm test`, V8 provider, whole `src/` tree): **statements 54.1%, branches 56.2%, functions + 49.4%, lines 55.1%** - up substantially since the best-seats solver and live-hold work added + ~15 new, near-100%-covered pure-logic modules under `src/utils/` and `src/hooks/`, but most + _components_ still have no tests: `App.tsx`, `VenueMap.tsx`, `Section.tsx`, `BookingSummary.tsx`, + `SeatSelectionFooter.tsx`, `BookingHistoryPanel.tsx`, `HoldRuntime.tsx`, `IconButton.tsx`, + `Toast.tsx`, and `useVenue.ts` have none. The thresholds in [`vite.config.ts`](../vite.config.ts) + are ratcheted up alongside real coverage gains (set just under today's actual numbers as a floor + against regression), not set to the standard's targets - reaching those targets means writing + real test suites for all of the above, which is a substantial task on its own, not a quick config + change. - ~~CI's pnpm version pin doesn't match the actual pnpm in use~~ **Resolved**: standardized on pnpm 11.x, matching this project's actual dev environment (the one pnpm version proven to work here all session). `.github/workflows/ci.yml`'s `PNPM_VERSION` is now `'11'`, and diff --git a/docs/ui-ux-and-business-logic-flow.md b/docs/ui-ux-and-business-logic-flow.md index f8a8400..37277f3 100644 --- a/docs/ui-ux-and-business-logic-flow.md +++ b/docs/ui-ux-and-business-logic-flow.md @@ -57,60 +57,76 @@ trigonometry happens at render time, only at generation time. ## 3. State: `seatStore` ([`seatStore.ts`](../src/store/seatStore.ts)) -| Field | Type | Persisted? | Set by | -| ------------------ | ------------------------- | ---------------------- | ------------------------------------------------------------------------------- | -| `zoom` | `number` | โŒ | fit-on-load effect, zoom buttons, section open/close, resume-selection effect | -| `activeSectionId` | `string \| null` | โŒ | clicking/keying a section, clicking the empty map background, viewing a booking | -| `selectedSeats` | `Set` | โœ… (custom serializer) | `toggleSeat`, `clearSelection`, `confirmPurchase` (empties it) | -| `soldSeats` | `Set` | โœ… (custom serializer) | `confirmPurchase` (adds the seats just paid for) | -| `bookings` | `Booking[]` | โœ… (plain JSON) | `confirmPurchase` (prepends the new booking; newest first) | -| `viewingBookingId` | `string \| null` | โŒ | `viewBooking`/`clearViewingBooking`, cleared by any `toggleSeat` call | -| `feedback` | `{type, message} \| null` | โŒ | `toggleSeat` (max-seat cap), cleared by `Toast` after 4s or dismiss | +| Field | Type | Persisted? | Set by | +| -------------------- | ------------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| `zoom` | `number` | โŒ | fit-on-load effect, zoom buttons, section open/close, resume-selection effect | +| `activeSectionId` | `string \| null` | โŒ | clicking/keying a section, clicking the empty map background, viewing a booking, `selectSeatBlock` | +| `selectedSeats` | `Set` | โœ… (custom serializer) | `toggleSeat`, `selectSeatBlock`, `clearSelection`, `confirmPurchase` (empties it), a lost hold tie-break | +| `selectionExpiresAt` | `number \| null` | โœ… (plain number) | `toggleSeat` (first seat starts it), `selectSeatBlock`, cleared by `clearSelection`/`confirmPurchase`/expiry | +| `soldSeats` | `Set` | โœ… (custom serializer) | `confirmPurchase` (adds the seats just paid for), a remote `sold` broadcast | +| `bookings` | `Booking[]` | โœ… (plain JSON) | `confirmPurchase` (prepends the new booking; newest first) | +| `viewingBookingId` | `string \| null` | โŒ | `viewBooking`/`clearViewingBooking`, cleared by `toggleSeat`/`selectSeatBlock` | +| `feedback` | `{type, message} \| null` | โŒ | `toggleSeat`/`selectSeatBlock` (max-seat cap), the best-seats finder, hold contention, cleared by `Toast` after 4s or dismiss | +| `holds` | `Map` | โŒ | `seedSimulation`, `setHolds`, `applyRemoteSold`, `runExpiry` (prunes lapsed entries) | +| `simulationSeeded` | `boolean` | โŒ | `seedSimulation` (guards against seeding twice - e.g. a late cross-tab reply) | **Persistence**: `partialize` scopes `localStorage` (`key: venue-storage`) to `selectedSeats`, -`soldSeats`, **and** `bookings`. Since `Set` isn't JSON-native, a custom `PersistStorage` converts -each `Set โ†” string[]` on `getItem`/`setItem` (`bookings` is a plain array of plain objects, -so it round-trips through `JSON.stringify`/`parse` with no custom conversion needed) - `zoom`, -`activeSectionId`, `viewingBookingId`, and `feedback` are intentionally transient and reset on -reload. +`soldSeats`, `bookings`, **and** `selectionExpiresAt`. Since `Set` isn't JSON-native, a custom +`PersistStorage` converts each `Set โ†” string[]` on `getItem`/`setItem` (`bookings` is a +plain array of plain objects, so it round-trips through `JSON.stringify`/`parse` with no custom +conversion needed) - `zoom`, `activeSectionId`, `viewingBookingId`, `feedback`, `holds`, and +`simulationSeeded` are intentionally transient and reset on reload. `holds` in particular is +deliberately excluded even though it's meaningful state: it's time-based (a stale hold from last +session means nothing) and shared cross-tab via `BroadcastChannel`, so treating `localStorage` as a +second source of truth for it would fight that sync instead of complementing it. See +[`docs/engineering-notes.md`](engineering-notes.md#localstorage-persistence-limits). **`toggleSeat(seatId)`** - the core selection rule: ``` -if already selected โ†’ remove it +if the seat has a live foreign hold โ†’ set feedback (error toast), no-op +else if already selected โ†’ remove it else if selectedSeats.size >= MAX_SELECTABLE_SEATS (8) โ†’ set feedback (error toast), no-op -else โ†’ add it +else โ†’ add it, and if this is the first seat, start selectionExpiresAt (now + 5 minutes) ``` Also always clears `viewingBookingId` - starting or editing a live selection supersedes browsing past booking history, so the two sidebar modes (ยง8) never end up fighting over what the map should -show. No server round-trip, no optimistic-lock/race handling - purely local `Set` mutation. +show. Adding a second (or third, ...) seat does **not** push the deadline back - it's anchored to +when the cart was opened, matching how a real ticketing site's hold works. No server round-trip for +the sale itself, but see ยง15 for how holds now coordinate across tabs of the same browser. -**`confirmPurchase(total)`** - the checkout transition (see ยง14 for the full picture): +**`selectSeatBlock(seatIds, sectionId)`** - the best-seats finder's entry point (ยง16): replaces +`selectedSeats` wholesale rather than merging, sets `activeSectionId` to the winning section in the +same update (so there's no intermediate render where the seats are selected but not yet mounted), +clears `viewingBookingId`, and starts a fresh `selectionExpiresAt`. Refuses (with the same cap +feedback `toggleSeat` uses) if given zero seats or more than `MAX_SELECTABLE_SEATS`. + +**`confirmPurchase(total): Booking | null`** - the checkout transition (see ยง14 for the full +picture). Re-checks `selectionExpiresAt` against `Date.now()` **inside its own synchronous `set()` +call** before doing anything else: -```ts -const newBooking: Booking = { - id: `BK-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, - seatIds: Array.from(state.selectedSeats), - total, - createdAt: Date.now(), -}; -return { - soldSeats: new Set([...state.soldSeats, ...state.selectedSeats]), - selectedSeats: new Set(), - bookings: [newBooking, ...state.bookings], - viewingBookingId: newBooking.id, -}; +``` +if selectionExpiresAt is set and has already passed: + โ†’ clear the cart, set an error feedback, return null (no booking recorded) +else: + โ†’ move selectedSeats into soldSeats, record one Booking, clear the cart and the + deadline, "view" the new booking, return the Booking ``` -Moves whatever's currently selected into `soldSeats` (persisted, so it survives a reload), records -it as one `Booking` grouping those seats together (so history can show/highlight them as a unit -rather than as loose entries in the flat `soldSeats` set), immediately "views" that new booking, -and empties the cart - as opposed to `clearSelection()`, which just abandons the cart with no sale. -`total` is passed in by the caller +Because Zustand's `set()` runs synchronously and JS is single-threaded, this check can't race with +the expiry timer (ยง15) - either the purchase's own `set()` call sees the deadline first, or the +expiry's `runExpiry()` does; there's no interleaving where both think they went first. Moves +whatever's currently selected into `soldSeats` (persisted, so it survives a reload) on success, +records it as one `Booking` grouping those seats together (so history can show/highlight them as a +unit rather than as loose entries in the flat `soldSeats` set), immediately "views" that new +booking, and empties the cart - as opposed to `clearSelection()`, which just abandons the cart with +no sale. `total` is passed in by the caller ([`BookingSummary.tsx`](../src/components/BookingSummary.tsx), via [`SeatSelectionFooter.tsx`](../src/components/SeatSelectionFooter.tsx)'s Proceed to Pay button) rather than computed here, since per-seat pricing lives in `venue` data the store doesn't hold. +`BookingSummary.tsx`'s `handleConfirmPurchase` only shows the "Booking confirmed" banner when the +return value is non-null, so a hold that expired mid-payment can't produce a false confirmation. **`viewBooking(id)` / `clearViewingBooking()`** - set/clear which past booking (if any) should currently render its seats with the highlight ring described in ยง7; driven entirely by @@ -242,13 +258,27 @@ Only rendered for the one active section (~1,500 `` nodes at - Fill/stroke colors come from CSS custom properties defined once in [`index.css`](../src/index.css)'s `@theme` block (`--color-seat-*`, `--color-tier-*`) - a single source of truth shared with the legend swatches in `BookingSummary`, so they can't drift apart. + Looked up via [`seatStatus.ts`](../src/utils/seatStatus.ts)'s `SEAT_STATUS_STYLE` table, keyed by + effective status, rather than an if/else ladder recomputed per seat. - **Seat number** (`seat.col`) and a **row letter** (`A, B, โ€ฆ Z, AA, AB, โ€ฆ`, spreadsheet-style, so it never runs out) render as `` - but _only_ once `zoom >= 2`. Below that threshold the ~1,500 extra label nodes simply aren't mounted at all, rather than rendering illegibly small text. + `Seats` subscribes to `zoom >= 2` as a **boolean**, not the raw `zoom` number - otherwise every + wheel/zoom event would re-render all ~1,500 mounted seats regardless of whether the threshold was + actually crossed. - `role="checkbox"`, `aria-checked`, `aria-disabled` (sold/reserved/held), `aria-label` describing row/seat/price/status, `tabIndex={0}` (or `-1` if unavailable) - real roving-focus keyboard navigation, not a custom widget bolted onto a `
`. +**Effective status** is resolved by [`resolveSeatStatus()`](../src/utils/seatStatus.ts) from the +seat's own `status`, `soldSeats`, the live `holds` map, `selectedSeats`, and whether the runtime +hold simulation has seeded yet - one function, one precedence order, replacing what used to be +several independent boolean checks. Precedence, highest first: **sold** (terminal) โ†’ **held** (a +live, unexpired hold record - checked before "selected" as a fail-safe for the one frame after a +reload where a persisted selection might have since been claimed elsewhere) โ†’ **selected** โ†’ +**reserved** โ†’ **available** (or **held**, if `seat.status` says so and the simulation hasn't +seeded yet - see ยง15). + **Color states** (fill unless noted): | State | Fill | Stroke | @@ -259,8 +289,11 @@ Only rendered for the one active section (~1,500 `` nodes at | Reserved | amber | none | | Held | red | none | -**Click / Enter / Space** โ†’ `toggleSeat(seat.id)` (store) then `.focus()` the element - so keyboard -users land exactly where they just acted. +**Click / Enter / Space** on an available seat โ†’ `toggleSeat(seat.id)` (store) then `.focus()` the +element - so keyboard users land exactly where they just acted. On an **unavailable** seat, clicking +now sets an error feedback ("That seat is no longer available.") instead of silently doing nothing - +necessary because with live holds, a seat can genuinely go from available to held between paint and +click, and a silent no-op in that case reads as a bug. **Arrow-key navigation** (`handleKeyDown`): @@ -269,9 +302,11 @@ users land exactly where they just acted. **closest `x` coordinate** (rows curve, so "same column" isn't a fixed index) - a linear scan over that row's seats. -A seat counts as unavailable (`sold`/`reserved`/`held`) if either `seat.status` says so, **or** its -ID is in the persisted `soldSeats` set (see ยง14) - either way it's `tabIndex={-1}` and ignored by -both click and keyboard handlers (`isUnavailable` guard at the top of `handleInteraction`). +A seat counts as unavailable (`sold`/`reserved`/`held`) if its resolved effective status isn't +`available` or `selected` - either way it's `tabIndex={-1}` and ignored by both click and keyboard +handlers (`isUnavailable` guard at the top of `handleInteraction`). A seat whose hold **lapses** +while it has keyboard focus stays focused and simply becomes interactive again - React patches the +same `` node's attributes in place rather than remounting it. **Booking-history highlight**: independent of the table above, a seat whose ID is in the currently `viewingBookingId` booking's `seatIds` (see ยง8) additionally gets a violet ring @@ -291,7 +326,7 @@ middle region, and (only in selection mode) a **pinned, non-scrolling footer**: ```
- + ``` @@ -327,8 +362,23 @@ code. an unrecognized tier number) - the same module both panels below use, so seat pricing/labels can't drift between them. +### `BestSeatsFinder.tsx` (ยง16) + +Rendered first in the scrollable region, **unconditionally** - it's visible in both sidebar modes +(unlike everything below it), since it's the sidebar's primary entry action rather than something +that depends on there already being a selection. A party-size ` - // below), the success copy wouldn't overwrite a real error. selectSeatBlock(block.seatIds, block.sectionId); setFeedback({ type: 'info', message: describeBlock(block) }); }; diff --git a/src/components/CheckoutTimer.tsx b/src/components/CheckoutTimer.tsx index cf48089..ebd4b46 100644 --- a/src/components/CheckoutTimer.tsx +++ b/src/components/CheckoutTimer.tsx @@ -33,9 +33,6 @@ export default function CheckoutTimer() { Seats held for - {/* The ticking digits are silent to assistive tech - see the - aria-live sibling below, which announces stable milestone bands - instead of every second. */}