From eb3787dd16286dabf0647fd7e697f6e781a359cf Mon Sep 17 00:00:00 2001 From: airent106 Date: Tue, 13 Oct 2026 00:26:15 -0600 Subject: [PATCH] Initial commit of Glimpse: Procedural paper desk and moodboard workspace --- .gitignore | 4 + Dockerfile | 23 + README.md | 49 + docker-compose.yml | 21 + index.html | 17 + nginx.conf | 23 + og_image.jpg | Bin 0 -> 57106 bytes package-lock.json | 2856 +++++++++++++++++++++++++++++ package.json | 29 + postcss.config.js | 6 + src/App.tsx | 643 +++++++ src/components/AddCardModal.tsx | 275 +++ src/components/BottomBar.tsx | 26 + src/components/DeskProps.tsx | 144 ++ src/components/DeskTextures.tsx | 205 +++ src/components/Fastener.tsx | 121 ++ src/components/PaperCard.tsx | 406 ++++ src/components/PenLayer.tsx | 149 ++ src/components/PortfolioModal.tsx | 189 ++ src/components/TopBar.tsx | 284 +++ src/index.css | 61 + src/main.tsx | 10 + src/types/index.ts | 91 + src/utils/lighting.ts | 90 + src/utils/proceduralCards.ts | 366 ++++ src/utils/sound.ts | 184 ++ tailwind.config.js | 26 + tsconfig.json | 24 + vite.config.ts | 11 + 29 files changed, 6333 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 index.html create mode 100644 nginx.conf create mode 100644 og_image.jpg create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/App.tsx create mode 100644 src/components/AddCardModal.tsx create mode 100644 src/components/BottomBar.tsx create mode 100644 src/components/DeskProps.tsx create mode 100644 src/components/DeskTextures.tsx create mode 100644 src/components/Fastener.tsx create mode 100644 src/components/PaperCard.tsx create mode 100644 src/components/PenLayer.tsx create mode 100644 src/components/PortfolioModal.tsx create mode 100644 src/components/TopBar.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/types/index.ts create mode 100644 src/utils/lighting.ts create mode 100644 src/utils/proceduralCards.ts create mode 100644 src/utils/sound.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d70bb9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules +dist +.DS_Store +*.local diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..98360bf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# Build stage +FROM node:22-alpine AS builder + +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . ./ +RUN npm run build + +# Production stage +FROM nginx:alpine + +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \ + CMD wget --quiet --tries=1 --spider http://localhost:80/ || exit 1 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..db58498 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Glimpse + +> **Glimpse** — A procedural, skeuomorphic paper desk, sticky notes, photo, and visual moodboard workspace. + +Inspired by creative coding desktop experiments, Glimpse renders tactile sheets of paper, Polaroid prints, luggage tags, crumpled receipts, and stationery on realistic desk surfaces with procedural paper grain shaders, dynamic 360° directional lighting, and realistic momentum drag-and-throw physics. + +--- + +## Features + +- **Procedural Paper Texture & Grain**: Dynamic SVG fractal noise filters simulating authentic physical paper fibers. +- **Dynamic 360° Directional Lighting**: Interactive `Light` angle control casting synchronized vector shadows across all sheets and props. +- **Tactile Sound Synthesis**: Built-in Web Audio API synthesizer for paper rustle, soft drop thuds, throw whooshes, tape peel, and pin taps without external audio assets. +- **Physics Engine ("Flick to Throw")**: Momentum drag-and-throw mechanics with velocity tracking, rotational inertia, air damping, and boundary collisions. +- **Layout Toggling**: Instant transition between organic desktop disarray (`Scatter`) and clean moodboards (`Grid`). +- **Freehand Pen Doodling**: Draw, underline, cross out tasks, or sketch arrows directly onto cards or the desk with smooth ink strokes. +- **Multiple Desk Textures**: Oak wood, walnut, self-healing cutting mat, corkboard, blueprint drafting, dark slate, and Italian Carrara marble. +- **Card Variety**: + - Sticky notes with interactive to-do checkboxes + - Polaroid instant photos with mounting corners + - Kraft luggage tags with brass eyelets & twine + - Ripped memo sheets with typewriter lettering + - Minimalist business cards + - Itemized store receipts with barcodes + - Hand-drawn SVG graph and flowchart sketches + - Washi tape strips, paperclips, and pushpins + +--- + +## Keyboard Shortcuts + +- `S` or `Space` — **Shuffle** cards across the desk +- `G` — Toggle **Grid** vs. **Scatter** layout +- `P` — Toggle freehand **Pen** mode +- `N` — **Add New** custom card +- `M` — **Replay** entry motion +- `Double-click` — **Edit** or delete card + +--- + +## Self-Hosting with Docker & Traefik + +Glimpse runs in a lightweight, multi-stage Alpine Nginx container: + +```bash +docker compose up -d --build +``` + +Configured for Traefik reverse proxy via dynamic rules on `t3_proxy` network at `https://glimpse.vloser.us`. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..84368f1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +services: + glimpse: + build: + context: . + dockerfile: Dockerfile + container_name: glimpse + restart: unless-stopped + networks: + - t3_proxy + ports: + - "127.0.0.1:8476:80" + healthcheck: + test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://localhost:80/ || exit 1"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + +networks: + t3_proxy: + external: true diff --git a/index.html b/index.html new file mode 100644 index 0000000..c62949b --- /dev/null +++ b/index.html @@ -0,0 +1,17 @@ + + + + + + + Glimpse — Procedural Paper Desk & Workspace + + + + + + +
+ + + diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..9f63fe0 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,23 @@ +server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + # Cache static assets + location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff2?|eot|ttf|otf)$ { + root /usr/share/nginx/html; + expires 1y; + add_header Cache-Control "public, max-age=31536000, immutable"; + access_log off; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/og_image.jpg b/og_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5949fa9d0aba1690dda201eb03680a3d312a8919 GIT binary patch literal 57106 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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1486251 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2856 @@ +{ + "name": "paper-desk", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "paper-desk", + "version": "1.0.0", + "dependencies": { + "clsx": "^2.1.1", + "lucide-react": "^1.16.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwind-merge": "^3.0.2" + }, + "devDependencies": { + "@types/node": "^22.13.9", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "typescript": "^5.8.2", + "vite": "^6.2.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.3.0.tgz", + "integrity": "sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.5.tgz", + "integrity": "sha512-MrfgRQSpD5hkkRg6XI16B6EDLb+6+xp8xje6bpdSwkYw+qxrBKbUVrRAQu9h82UT+QumSIVQ8HXsXjPd2dlhqw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.5.tgz", + "integrity": "sha512-+uu2p/R9Tzn8GpoQyX1pAo5dmKT1DhXevfaCzqzmPFhnLjHLWw7uWkaVGlxmhwYoRiYYhsGfRcD5cTBpL7rgSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.5.tgz", + "integrity": "sha512-17dys+YEmzwzzFVHQAVDONg5FALXY9kd99HFEpfk4gJVHYxoh5bGea3D4t1fXXnwkTcOe25wPyd6nWS0I8IdLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.5.tgz", + "integrity": "sha512-wg0zQEKkEvFZf1UaaX1UELOoPs//OSKUG7D+yITuqOsAvza7LvHTv5Wu4nmMfzNG7EYI2jp2PJC7Id6OETmsYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.5.tgz", + "integrity": "sha512-CoJmWcpEMuwin+TZ/ev/H9uDyF/uxUKQSWXdmIPn/UBx/uGV9+4ebMp0FwnlhWR9PE1AdzYsKf3bZevhif38+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.5.tgz", + "integrity": "sha512-PxZnLAaTUAL5xG0W2BXLeYPKrK2b3LIASV2/e/Kf7PZvSLI1iAQIm9B9aJD+YyFIT7hc6qaMV3+OOO35R28LfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.5.tgz", + "integrity": "sha512-uPo3IvnONjhbFXwWgroBeFwOicuhT7ZwQrnzkzmOtBJzeQbkUJUE1SJDfDI31ijQ5+ZUIA6sPrdUMxTSnxUWAg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.5.tgz", + "integrity": "sha512-ywI8Jyuc4LyHYTjC0mw4yA1ulvZBkHusdpWnoiEBsmBuHvSnt90btTBGCZ+s/2y+YNNfVAEKy33nPo5UI9zTmg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.5.tgz", + "integrity": "sha512-tmuXJoQ/3ovSr637aykZMdQteU/CB2APAz2CrvsbibuoHZi1BS1Db13cVViBdEARGwXCLn1DSJ8wsjoThLJPGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.5.tgz", + "integrity": "sha512-5FMjSYNcUOHx7oW8Qu9KB6jGPpvF/8sG7+BDHwU/Ihh1/6FMJ9ySmsFG4tJ1qbNRuP8OLzCBDso4sF0mQaLuFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.5.tgz", + "integrity": "sha512-K8ZJ+neLDbUkIrL8dqF/5LtuVCrKwo27kREgOlxjBEjlOXwHvDnHLU8Z/UKv/B49qi7e8hsSDOyoJwhwqhvX4w==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.5.tgz", + "integrity": "sha512-NlVxsq7PFPv0DBKGuNWRDKixQYQCjM53zl04mxEcKMBmJbCBIUm1JdPfIWDRHyOOFzzYPmLQzfeEwh4716ayQg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.5.tgz", + "integrity": "sha512-ARhRHJYs5eCFet5azfrHD97vOkD8OzNW2RSMlvo5CcBqXaTOLfp0OHDtUQh7/K5AL5fUYoFp2fgC9KDg4vVYMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.5.tgz", + "integrity": "sha512-atSgreM5C7jpxd9aEXN+6vJ5wTd05iYw+S3FiQpw7VsoEl8B90llbq35ARON+GOHj5QlVQEq2vOKWCHTob/BSQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.5.tgz", + "integrity": "sha512-vmlmwBFGnjVWxSRoVabNkyYuscSmg52Pd0fM8jEbNT3Jmka4A6HcB84x4uAmuumznWfBVaxKOqU6jbEgomWKCA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.5.tgz", + "integrity": "sha512-hhJrP6S9WkbsbcHgUkvCBS5Cn8IdsG8XjlLZyxjnv9+NdoYfbbZE4TWJYr8apdaj1M5t5Y1id2StnEslxpNFyA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.5.tgz", + "integrity": "sha512-NNVCyN9pGrwFmQa4bf+Cnf5aVH3g6ZpnlOg1Cs/H9swIHT9bRixijfzUqyEIWm1WtiAuR1LJ+rJH6zpBm8kgQA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.5.tgz", + "integrity": "sha512-dR9nd6OKnvSS60Ifz/L7Mj5zzYyoqyRn2NwTuaOONKaa3xsVGXyp8YusMbvFyEOR94DxnwgcbgsFqkHd29ZSzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.5.tgz", + "integrity": "sha512-1tzsMjaqhsh3bAO6SJiJqh8hIr9sSPRd+i2vPPxJHod8/XYnf9TEnK0z/u3r1z1AkI347X0KbRSg9dWcxeGahw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.5.tgz", + "integrity": "sha512-01mWMQblKoXXsmk28KXtpbA96w7g/aOWUoV3AC16fdHdqkykGalqyyM+5u8M7uP5/MEMiiPv69Hv7iv/hEH/dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.5.tgz", + "integrity": "sha512-trdnMPb/DNm4V/CgsaoGgr90HfQQ071wfK0KoIs4YpLvjBgVQGXhGabg2Z6nK4EcYNilrb9ZZPcsP6+zpJIdxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.5.tgz", + "integrity": "sha512-x2LxZlfdfsw99T6/qb9EqE/Qi84JWzibjyOJyhJsgFJy6CafaTiqIXCCnslCGrV5XWNh7fwrS3FbRENcuKnooA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.5.tgz", + "integrity": "sha512-/Qd/9aDQIo0+jmItgBmPIs8195YVbDxRRApn47GyufgbutCDOh7eP5vSKKlI4QNFeaI+wKQAkSMsPnF3EuMpaA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.5.tgz", + "integrity": "sha512-ngUJ/XvOWrqbd2IMsfXfh2xXFLTP3sY7sCKvxbGvYdBZ1KmXFd3ewDZ9n3/GNzAUgzRuhLT/UvJRivbNoAQRBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.5.tgz", + "integrity": "sha512-IhV6ew/DuzUWwHaYmlh7MrPCV3lKFUq/amTEwysi4r/mwNPAEfAMh5dYWeTSPTeMy2pFHGMEWYtPkHzfX3tG5A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.6.1.tgz", + "integrity": "sha512-cL1Qz6ADZhcEbny/8HPfe99J6HhNoYtpX2LFLIbhgGE7Q1hlQVkYFdetDN7Id3KiQxhDrHwzlHr/YQCnZ8+xSA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.9", + "caniuse-lite": "^1.0.30001810", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.28", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.28.tgz", + "integrity": "sha512-br0LOmjJqr6Rt4AEkadbcNf67Zpo7EPwKsWbjnRrJIa1QYFHQBqM4C7F2WTbV8ahTEcg1Eo+Y0aWjjORInYFyA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz", + "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.26", + "caniuse-lite": "^1.0.30001813", + "electron-to-chromium": "^1.5.439", + "node-releases": "^2.0.57", + "update-browserslist-db": "^1.3.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001815", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001815.tgz", + "integrity": "sha512-uDybUEyfgbyJJ93J1vikTylBX31AkdVYeVPeffMQpf8XN7hSfr0oZOn4VFOIMNvtU5+rHvC5Udg2TgtJKHm23Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.452", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.452.tgz", + "integrity": "sha512-cVvk1YBSj6571VmV6hdJTqj94Y79xSu8cj6Y9t6ae4Y4431z8/7EJFvu3rVp90xhfuv9BpPKUmaLfTo4+FOGBg==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz", + "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.55.0.tgz", + "integrity": "sha512-bSozQHiI3/8q7JvgoqVRGOYUi7fYT3siAZwmZsljjsOH2Husp/2ODdFf/leD+ZC/2yKfn7r8oh6yeoR3ITR5vA==", + "license": "ISC", + "peerDependencies": { + "@types/react": "*", + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.58.tgz", + "integrity": "sha512-BdiKAgbfRlvfMq/XzO/AF9NPmaA8a+YpLAyAFTVFBj3gARrAIfWvNq7Q7NE4se3KgFu0KkrvQMxTS0XVnsGzHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz", + "integrity": "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.20", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.2.tgz", + "integrity": "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.13", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.13.tgz", + "integrity": "sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.17.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.64.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.5.tgz", + "integrity": "sha512-EAP5ZHcz2ijbgCWwPkpI7zh6bfsri2Ez5FtCy2dCp1k62duXzfG7DLGGh7RU2QQXWwavT+u4qpvDF/TWOiiGTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.64.5", + "@rollup/rollup-android-arm64": "4.64.5", + "@rollup/rollup-darwin-arm64": "4.64.5", + "@rollup/rollup-darwin-x64": "4.64.5", + "@rollup/rollup-freebsd-arm64": "4.64.5", + "@rollup/rollup-freebsd-x64": "4.64.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.64.5", + "@rollup/rollup-linux-arm-musleabihf": "4.64.5", + "@rollup/rollup-linux-arm64-gnu": "4.64.5", + "@rollup/rollup-linux-arm64-musl": "4.64.5", + "@rollup/rollup-linux-loong64-gnu": "4.64.5", + "@rollup/rollup-linux-loong64-musl": "4.64.5", + "@rollup/rollup-linux-ppc64-gnu": "4.64.5", + "@rollup/rollup-linux-ppc64-musl": "4.64.5", + "@rollup/rollup-linux-riscv64-gnu": "4.64.5", + "@rollup/rollup-linux-riscv64-musl": "4.64.5", + "@rollup/rollup-linux-s390x-gnu": "4.64.5", + "@rollup/rollup-linux-x64-gnu": "4.64.5", + "@rollup/rollup-linux-x64-musl": "4.64.5", + "@rollup/rollup-openbsd-x64": "4.64.5", + "@rollup/rollup-openharmony-arm64": "4.64.5", + "@rollup/rollup-win32-arm64-msvc": "4.64.5", + "@rollup/rollup-win32-ia32-msvc": "4.64.5", + "@rollup/rollup-win32-x64-gnu": "4.64.5", + "@rollup/rollup-win32-x64-msvc": "4.64.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.7.0.tgz", + "integrity": "sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.4.tgz", + "integrity": "sha512-xGjU/SyjeNyb0E4KxXBvYz/1C+3JXuujvf2hXNOtnlcE+58o5ajd9N2/n2VhkiJvpCP2qQasnUpx5PXNeI+p1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6b9ca88 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "glimpse", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "clsx": "^2.1.1", + "lucide-react": "^1.16.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwind-merge": "^3.0.2" + }, + "devDependencies": { + "@types/node": "^22.13.9", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "typescript": "^5.8.2", + "vite": "^6.2.0" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..56a56e7 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,643 @@ +import React, { useState, useEffect, useRef, useCallback } from 'react'; +import { CardItem, DeskProp, DeskSettings, InkStroke } from './types'; +import { generateProceduralCards, SAMPLE_PRESETS } from './utils/proceduralCards'; +import { soundEngine } from './utils/sound'; +import { TopBar } from './components/TopBar'; +import { BottomBar } from './components/BottomBar'; +import { DeskBackground } from './components/DeskTextures'; +import { PaperCard } from './components/PaperCard'; +import { DeskPropsLayer } from './components/DeskProps'; +import { PenLayer } from './components/PenLayer'; +import { AddCardModal, EditCardModal } from './components/AddCardModal'; +import { PortfolioModal } from './components/PortfolioModal'; + +const INITIAL_PROPS: DeskProp[] = [ + { id: 'prop-pencil-1', type: 'pencil', x: 120, y: 160, rotation: 38, zIndex: 12 }, + { id: 'prop-pen-1', type: 'pen', x: 890, y: 170, rotation: -28, zIndex: 15 }, + { id: 'prop-pencil-2', type: 'pencil', x: 230, y: 720, rotation: -42, zIndex: 10 }, + { id: 'prop-pen-2', type: 'pen', x: 440, y: 880, rotation: 92, zIndex: 14 }, + { id: 'prop-tape-1', type: 'tape-roll', x: 410, y: 120, rotation: 12, zIndex: 9 }, + { id: 'prop-clip-1', type: 'paperclip', x: 640, y: 760, rotation: 55, zIndex: 8 }, + { id: 'prop-clip-2', type: 'paperclip', x: 1190, y: 920, rotation: -35, zIndex: 8 }, + { id: 'prop-pin-1', type: 'pin', x: 1210, y: 130, rotation: 0, zIndex: 16 } +]; + +export const App: React.FC = () => { + // Desk Settings matching the original Paper Desk UI + const [settings, setSettings] = useState({ + lightAngle: 225, // Exactly 225° from Maksim's post + grain: 0.70, // Exactly 0.70 Grain + attachChance: 0.55, // Exactly 55% Attach + cardCount: 22, // High-density aesthetic desk + deskTexture: 'oak', // Oak desk + layoutMode: 'scatter', + fontMode: 'mixed', + showProps: true, + enableMotion: true, + penMode: false, + soundEnabled: false, + activeFilter: 'all' + }); + + const [cards, setCards] = useState([]); + const [propsList, setPropsList] = useState(INITIAL_PROPS); + const [strokes, setStrokes] = useState([]); + const [maxZIndex, setMaxZIndex] = useState(50); + + // Modals state + const [isAddOpen, setIsAddOpen] = useState(false); + const [editingCard, setEditingCard] = useState(null); + const [isPortfolioOpen, setIsPortfolioOpen] = useState(false); + + // Dragging & Physics references + const draggingIdRef = useRef(null); + const dragTypeRef = useRef<'card' | 'prop'>('card'); + const dragOffsetRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 }); + const pointerHistoryRef = useRef<{ x: number; y: number; time: number }[]>([]); + const [draggingCardId, setDraggingCardId] = useState(null); + + // Initialize cards on mount + useEffect(() => { + const w = typeof window !== 'undefined' ? window.innerWidth : 1400; + const h = typeof window !== 'undefined' ? window.innerHeight : 900; + const initialCards = generateProceduralCards( + settings.cardCount, + w, + h, + settings.attachChance, + settings.fontMode + ); + setCards(initialCards); + setMaxZIndex(initialCards.length + 20); + }, []); + + // Update card count when slider changes + const updateSettings = (newSettings: Partial) => { + setSettings((prev) => { + const updated = { ...prev, ...newSettings }; + + if (newSettings.cardCount !== undefined && newSettings.cardCount !== prev.cardCount) { + const w = window.innerWidth; + const h = window.innerHeight; + const diff = newSettings.cardCount - cards.length; + if (diff > 0) { + const added = generateProceduralCards(diff, w, h, updated.attachChance, updated.fontMode); + setCards((c) => [...c, ...added]); + } else if (diff < 0) { + setCards((c) => c.slice(0, newSettings.cardCount)); + } + } + + if (newSettings.attachChance !== undefined && newSettings.attachChance !== prev.attachChance) { + setCards((c) => + c.map((card) => { + if (Math.random() < (newSettings.attachChance ?? 0.55)) { + const types: CardItem['attachType'][] = ['washi', 'pin', 'paperclip']; + return { ...card, attachType: types[Math.floor(Math.random() * types.length)] }; + } + return { ...card, attachType: 'none' }; + }) + ); + } + + return updated; + }); + }; + + // Re-shuffle cards + const handleShuffle = useCallback(() => { + soundEngine.shuffle(settings.soundEnabled); + const w = window.innerWidth; + const h = window.innerHeight; + + setCards((prev) => { + return prev.map((card, i) => { + const padding = 100; + const targetX = padding + Math.random() * (w - card.width - padding * 2); + const targetY = padding + Math.random() * (h - card.height - padding * 2); + const randRot = (Math.random() - 0.5) * 24; + + return { + ...card, + x: targetX, + y: targetY, + rotation: randRot, + vx: (Math.random() - 0.5) * 4, + vy: (Math.random() - 0.5) * 4, + zIndex: i + 1 + }; + }); + }); + }, [settings.soundEnabled]); + + // Arrange in Grid mode + const arrangeGrid = useCallback(() => { + soundEngine.rustle(settings.soundEnabled); + const w = window.innerWidth; + const h = window.innerHeight; + const paddingX = 120; + const paddingY = 110; + const availableW = w - paddingX * 2; + const availableH = h - paddingY * 2; + + const cols = Math.ceil(Math.sqrt(cards.length * 1.4)); + const rows = Math.ceil(cards.length / cols); + + const cellW = availableW / cols; + const cellH = availableH / rows; + + setCards((prev) => + prev.map((card, idx) => { + const col = idx % cols; + const row = Math.floor(idx / cols); + + return { + ...card, + x: paddingX + col * cellW + (cellW - card.width) / 2, + y: paddingY + row * cellH + (cellH - card.height) / 2, + rotation: (Math.random() - 0.5) * 4, // Subtle organic alignment + vx: 0, + vy: 0 + }; + }) + ); + }, [cards.length, settings.soundEnabled]); + + // Trigger grid when layoutMode changes + useEffect(() => { + if (settings.layoutMode === 'grid') { + arrangeGrid(); + } else { + handleShuffle(); + } + }, [settings.layoutMode]); + + // Physics animation loop on requestAnimationFrame + useEffect(() => { + if (!settings.enableMotion) return; + + let animId: number; + + const physicsLoop = () => { + setCards((prevCards) => { + let hasMotion = false; + const updated = prevCards.map((card) => { + // If being dragged, physics doesn't apply to it directly + if (card.id === draggingIdRef.current) return card; + + const speed = Math.hypot(card.vx, card.vy); + if (speed < 0.05) return card; + + hasMotion = true; + let newX = card.x + card.vx; + let newY = card.y + card.vy; + let newVx = card.vx * 0.92; // Friction damping + let newVy = card.vy * 0.92; + + // Screen edge bounce + const maxX = window.innerWidth - card.width - 20; + const maxY = window.innerHeight - card.height - 20; + + if (newX < 20) { + newX = 20; + newVx *= -0.5; + } else if (newX > maxX) { + newX = maxX; + newVx *= -0.5; + } + + if (newY < 60) { + newY = 60; + newVy *= -0.5; + } else if (newY > maxY) { + newY = maxY; + newVy *= -0.5; + } + + return { + ...card, + x: newX, + y: newY, + vx: newVx, + vy: newVy + }; + }); + + return hasMotion ? updated : prevCards; + }); + + animId = requestAnimationFrame(physicsLoop); + }; + + animId = requestAnimationFrame(physicsLoop); + return () => cancelAnimationFrame(animId); + }, [settings.enableMotion]); + + // Pointer Down on a Card + const handleCardPointerDown = (e: React.PointerEvent, card: CardItem) => { + if (settings.penMode) return; + e.stopPropagation(); + + const newZ = maxZIndex + 1; + setMaxZIndex(newZ); + + draggingIdRef.current = card.id; + dragTypeRef.current = 'card'; + setDraggingCardId(card.id); + + dragOffsetRef.current = { + x: e.clientX - card.x, + y: e.clientY - card.y + }; + + pointerHistoryRef.current = [{ x: e.clientX, y: e.clientY, time: Date.now() }]; + + soundEngine.rustle(settings.soundEnabled, 1.0); + + setCards((prev) => + prev.map((c) => (c.id === card.id ? { ...c, zIndex: newZ, vx: 0, vy: 0 } : c)) + ); + }; + + // Pointer Down on a Prop + const handlePropPointerDown = (e: React.PointerEvent, prop: DeskProp) => { + if (settings.penMode) return; + e.stopPropagation(); + + const newZ = maxZIndex + 1; + setMaxZIndex(newZ); + + draggingIdRef.current = prop.id; + dragTypeRef.current = 'prop'; + + dragOffsetRef.current = { + x: e.clientX - prop.x, + y: e.clientY - prop.y + }; + + pointerHistoryRef.current = [{ x: e.clientX, y: e.clientY, time: Date.now() }]; + + soundEngine.rustle(settings.soundEnabled, 0.5); + + setPropsList((prev) => + prev.map((p) => (p.id === prop.id ? { ...p, zIndex: newZ } : p)) + ); + }; + + // Global Pointer Move + const handleGlobalPointerMove = (e: React.PointerEvent) => { + if (!draggingIdRef.current) return; + + const currentX = e.clientX; + const currentY = e.clientY; + const targetX = currentX - dragOffsetRef.current.x; + const targetY = currentY - dragOffsetRef.current.y; + + // Track pointer history for momentum / flick + pointerHistoryRef.current.push({ x: currentX, y: currentY, time: Date.now() }); + if (pointerHistoryRef.current.length > 5) { + pointerHistoryRef.current.shift(); + } + + if (dragTypeRef.current === 'card') { + setCards((prev) => + prev.map((c) => (c.id === draggingIdRef.current ? { ...c, x: targetX, y: targetY } : c)) + ); + } else { + setPropsList((prev) => + prev.map((p) => (p.id === draggingIdRef.current ? { ...p, x: targetX, y: targetY } : p)) + ); + } + }; + + // Global Pointer Up (Release with Momentum / Throw) + const handleGlobalPointerUp = () => { + if (!draggingIdRef.current) return; + + const id = draggingIdRef.current; + draggingIdRef.current = null; + setDraggingCardId(null); + + // Calculate throw velocity from recent pointer samples + const history = pointerHistoryRef.current; + let vx = 0; + let vy = 0; + + if (history.length >= 2) { + const recent = history[history.length - 1]; + const older = history[0]; + const dt = (recent.time - older.time) || 16; + if (dt < 250) { + vx = ((recent.x - older.x) / dt) * 14; + vy = ((recent.y - older.y) / dt) * 14; + } + } + + const speed = Math.hypot(vx, vy); + + if (dragTypeRef.current === 'card') { + if (speed > 4) { + soundEngine.flick(settings.soundEnabled); + } else { + soundEngine.drop(settings.soundEnabled); + } + + setCards((prev) => + prev.map((c) => + c.id === id + ? { + ...c, + vx: Math.max(-25, Math.min(25, vx)), + vy: Math.max(-25, Math.min(25, vy)) + } + : c + ) + ); + } else { + soundEngine.drop(settings.soundEnabled); + } + }; + + // Keyboard Shortcuts (S, G, M, P, N, Space) + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + // Ignore if user is inside an input/textarea + if (['INPUT', 'TEXTAREA'].includes((e.target as HTMLElement).tagName)) return; + + if (e.key === 's' || e.key === 'S' || e.code === 'Space') { + e.preventDefault(); + handleShuffle(); + } else if (e.key === 'g' || e.key === 'G') { + e.preventDefault(); + setSettings((prev) => ({ + ...prev, + layoutMode: prev.layoutMode === 'scatter' ? 'grid' : 'scatter' + })); + } else if (e.key === 'p' || e.key === 'P') { + e.preventDefault(); + setSettings((prev) => ({ ...prev, penMode: !prev.penMode })); + } else if (e.key === 'n' || e.key === 'N') { + e.preventDefault(); + setIsAddOpen(true); + } else if (e.key === 'm' || e.key === 'M') { + e.preventDefault(); + handleShuffle(); + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [handleShuffle]); + + // Load Presets + const handleLoadPreset = (presetName: string) => { + const w = window.innerWidth; + const h = window.innerHeight; + + if (presetName === 'original') { + const generated = generateProceduralCards(20, w, h, 0.6, 'mixed'); + setCards(generated); + setSettings((s) => ({ ...s, deskTexture: 'oak', lightAngle: 225, grain: 0.7 })); + } else if (presetName === 'designer') { + const designerCards: CardItem[] = SAMPLE_PRESETS.slice(0, 14).map((p, i) => ({ + id: `design-${i}`, + type: p.type || 'sticky', + title: p.title, + content: p.content || '', + color: p.color || '#FFF9A6', + x: 140 + (i % 4) * 260, + y: 120 + Math.floor(i / 4) * 230, + vx: 0, + vy: 0, + rotation: (Math.random() - 0.5) * 6, + width: p.width || 180, + height: p.height || 180, + zIndex: i + 1, + isPinned: false, + attachType: i % 2 === 0 ? 'washi' : 'paperclip', + fontFamily: p.fontFamily || 'font-caveat', + todoItems: p.todoItems + })); + setCards(designerCards); + setSettings((s) => ({ ...s, deskTexture: 'cutting-mat', lightAngle: 180 })); + } else if (presetName === 'creative-coder') { + const coderCards: CardItem[] = [ + { + id: 'code-1', + type: 'graph', + title: 'Sine wave vectors', + content: 'y = sin(x) * 45 + noise(x)', + graphType: 'curve', + x: 200, + y: 200, + vx: 0, + vy: 0, + rotation: -2, + width: 220, + height: 190, + zIndex: 1, + isPinned: false, + attachType: 'washi', + fontFamily: 'font-mono' + }, + { + id: 'code-2', + type: 'torn', + title: 'Shader experiment', + subtitle: 'Fragment shader', + content: 'precision mediump float;\nuniform vec2 u_res;\nvoid main() {\n gl_FragColor = vec4(1.0);\n}', + x: 480, + y: 180, + vx: 0, + vy: 0, + rotation: 3, + width: 240, + height: 250, + zIndex: 2, + isPinned: false, + attachType: 'pin', + fontFamily: 'font-mono' + }, + { + id: 'code-3', + type: 'sticky', + title: 'Pen Plotter Test', + content: 'AxiDraw v3\nSpeed: 30%\nPen: Sakura Pigma Micron 05', + color: '#FFF9A6', + x: 780, + y: 240, + vx: 0, + vy: 0, + rotation: -4, + width: 170, + height: 170, + zIndex: 3, + isPinned: false, + attachType: 'washi', + fontFamily: 'font-courier' + } + ]; + setCards(coderCards); + setSettings((s) => ({ ...s, deskTexture: 'blueprint', lightAngle: 270 })); + } else if (presetName === 'photojournal') { + const photoCards = SAMPLE_PRESETS.filter((p) => p.type === 'polaroid').map((p, i) => ({ + id: `photo-${i}`, + type: 'polaroid' as const, + title: p.title, + photoCaption: p.photoCaption, + content: p.content || '', + imageUrl: p.imageUrl, + x: 180 + (i % 3) * 280, + y: 140 + Math.floor(i / 3) * 260, + vx: 0, + vy: 0, + rotation: (Math.random() - 0.5) * 8, + width: 200, + height: 240, + zIndex: i + 1, + isPinned: false, + attachType: 'washi' as const, + fontFamily: 'font-caveat' + })); + setCards(photoCards); + setSettings((s) => ({ ...s, deskTexture: 'walnut', lightAngle: 225 })); + } + soundEngine.shuffle(settings.soundEnabled); + }; + + // Filtered Cards + const visibleCards = cards.filter((card) => { + if (settings.activeFilter === 'all') return true; + return card.type === settings.activeFilter; + }); + + return ( +

+ {/* 1. Procedural Desk Background Surface */} + + + {/* 2. Top Bar Controls */} + setIsAddOpen(true)} + onOpenPortfolio={() => setIsPortfolioOpen(true)} + totalCards={visibleCards.length} + /> + + {/* 3. Cards Layer */} +
+ {visibleCards.map((card) => ( + setEditingCard(c)} + onToggleTodo={(cardId, idx) => { + setCards((prev) => + prev.map((c) => { + if (c.id !== cardId || !c.todoItems) return c; + const updatedTodos = [...c.todoItems]; + updatedTodos[idx] = { + ...updatedTodos[idx], + done: !updatedTodos[idx].done + }; + return { ...c, todoItems: updatedTodos }; + }) + ); + }} + /> + ))} +
+ + {/* 4. Stationery Props Layer (Pencils, Pens, Washi rolls, Paperclips) */} + {settings.showProps && ( + + )} + + {/* 5. Pen / Freehand Ink Layer */} + setStrokes((prev) => [...prev, s])} + onClear={() => setStrokes([])} + /> + + {/* 6. Bottom Shortcut Bar */} + + + {/* 7. Modals */} + setIsAddOpen(false)} + onAdd={(newCard) => { + const w = window.innerWidth; + const h = window.innerHeight; + const created: CardItem = { + id: `card-custom-${Date.now()}`, + type: newCard.type || 'sticky', + title: newCard.title, + content: newCard.content || '', + imageUrl: newCard.imageUrl, + photoCaption: newCard.photoCaption, + color: newCard.color || '#FFF9A6', + x: w / 2 - 90 + (Math.random() - 0.5) * 60, + y: h / 2 - 90 + (Math.random() - 0.5) * 60, + vx: 0, + vy: 0, + rotation: (Math.random() - 0.5) * 8, + width: newCard.width || 180, + height: newCard.height || 180, + zIndex: maxZIndex + 1, + isPinned: false, + attachType: newCard.attachType || 'washi', + fontFamily: newCard.fontFamily || 'font-caveat' + }; + setMaxZIndex(maxZIndex + 1); + setCards((prev) => [...prev, created]); + soundEngine.drop(settings.soundEnabled); + }} + /> + + setEditingCard(null)} + onSave={(updated) => { + setCards((prev) => prev.map((c) => (c.id === updated.id ? updated : c))); + soundEngine.rustle(settings.soundEnabled); + }} + onDelete={(id) => { + setCards((prev) => prev.filter((c) => c.id !== id)); + soundEngine.rustle(settings.soundEnabled); + }} + /> + + setIsPortfolioOpen(false)} + cards={cards} + settings={settings} + onLoadPreset={handleLoadPreset} + onImportJson={(importedCards) => { + setCards(importedCards); + soundEngine.shuffle(settings.soundEnabled); + }} + /> +
+ ); +}; + +export default App; diff --git a/src/components/AddCardModal.tsx b/src/components/AddCardModal.tsx new file mode 100644 index 0000000..979b3f7 --- /dev/null +++ b/src/components/AddCardModal.tsx @@ -0,0 +1,275 @@ +import React, { useState } from 'react'; +import { CardItem, CardType, AttachType } from '../types'; +import { X } from 'lucide-react'; + +interface AddCardModalProps { + isOpen: boolean; + onClose: () => void; + onAdd: (card: Partial) => void; +} + +export const AddCardModal: React.FC = ({ isOpen, onClose, onAdd }) => { + const [type, setType] = useState('sticky'); + const [title, setTitle] = useState(''); + const [content, setContent] = useState(''); + const [imageUrl, setImageUrl] = useState(''); + const [color, setColor] = useState('#FFF9A6'); + const [attachType, setAttachType] = useState('washi'); + const [fontFamily, setFontFamily] = useState('font-caveat'); + + if (!isOpen) return null; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + onAdd({ + type, + title: title.trim() || undefined, + content: content.trim(), + imageUrl: type === 'polaroid' ? (imageUrl.trim() || 'https://images.unsplash.com/photo-1507525428034-b723cf961d3e?auto=format&fit=crop&w=600&q=80') : undefined, + photoCaption: type === 'polaroid' ? (title.trim() || content.trim()) : undefined, + color, + attachType, + fontFamily, + width: type === 'polaroid' ? 175 : type === 'tag' ? 140 : 180, + height: type === 'polaroid' ? 220 : type === 'tag' ? 220 : 180 + }); + onClose(); + setTitle(''); + setContent(''); + setImageUrl(''); + }; + + return ( +
+
+
+

+ Add New Paper Card +

+ +
+ +
+ {/* Card Type */} +
+ +
+ {(['sticky', 'polaroid', 'tag', 'torn', 'business', 'moodboard'] as CardType[]).map((t) => ( + + ))} +
+
+ + {/* Title */} +
+ + setTitle(e.target.value)} + placeholder="e.g. Brainstorm note, Project Retro" + className="w-full bg-neutral-800 border border-neutral-700 rounded px-2.5 py-1.5 text-neutral-100 focus:outline-none focus:border-amber-500" + /> +
+ + {/* Content */} +
+ +