From 53d9561de19d9608eb33f2372186cb2f7607bbc7 Mon Sep 17 00:00:00 2001 From: sebseb7 Date: Sun, 7 Jun 2026 23:05:46 +0200 Subject: [PATCH] Genesis --- .gitignore | 2 + README.md | 20 + eslint.config.js | 29 + index.html | 28 + package-lock.json | 2530 +++++++++++++++++++++++++++++++++++++++++ package.json | 30 + public/kifferei.jpg | Bin 0 -> 75705 bytes src/App.css | 42 + src/App.jsx | 350 ++++++ src/RoomPolygon.jsx | 56 + src/Tile.jsx | 83 ++ src/index.css | 265 +++++ src/main.jsx | 10 + src/utils/geometry.js | 95 ++ vite.config.js | 30 + 15 files changed, 3570 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/kifferei.jpg create mode 100644 src/App.css create mode 100644 src/App.jsx create mode 100644 src/RoomPolygon.jsx create mode 100644 src/Tile.jsx create mode 100644 src/index.css create mode 100644 src/main.jsx create mode 100644 src/utils/geometry.js create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..763301f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..21dc4d2 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Raumplaner + +Ein interaktiver 2D-Raumplaner, um Anbauflächen, Tische und Lichter optimal anzuordnen. + +## Funktionen + +- **Interaktives Layout**: Tische und Lampen per Klick hinzufügen und auf dem Raster (Canvas) frei per Drag & Drop verschieben. +- **Rotation**: Elemente können einfach gedreht werden, um den Platz optimal auszunutzen. +- **Bestandslimitierung**: Optional kann der Bestand der verfügbaren Tische und Lampen auf das tatsächliche Inventar limitiert werden. +- **Raumanpassung**: Wechsel zwischen der vollen Raumgröße (4,93m x 10,40m) und einer reduzierten Variante (4,93m x 4,50m). +- **Flächenberechnung**: Automatische Berechnung der gesamten Anbaufläche (in m²) basierend auf den platzierten Tischen. +- **Import & Export**: Layouts können als `.json`-Datei lokal gespeichert (exportiert) und später wieder geladen (importiert) werden. + +## Technologien + +- [React](https://react.dev/) - UI-Bibliothek +- [Vite](https://vitejs.dev/) - Build-Tool & Dev-Server +- [React Konva](https://konvajs.org/docs/react/index.html) - 2D Canvas Bibliothek für interaktive Grafiken +- [Lucide React](https://lucide.dev/) - Moderne Icons +- **Vanilla CSS** - Für ein schlankes, vollständig responsives UI diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..4fa125d --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,29 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + }, + }, +]) diff --git a/index.html b/index.html new file mode 100644 index 0000000..b37a054 --- /dev/null +++ b/index.html @@ -0,0 +1,28 @@ + + + + + + + + Kifferei Raumplaner + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..23e2e75 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2530 @@ +{ + "name": "roomplanner", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "roomplanner", + "version": "0.0.0", + "dependencies": { + "konva": "^10.3.0", + "lucide-react": "^1.17.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-konva": "^19.2.4" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.2", + "eslint": "^10.4.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "vite": "^8.0.16" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@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-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.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.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.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "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/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "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/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.33.0.tgz", + "integrity": "sha512-HZOXsKT0tGI9LlUw2LuedXsVeB88wFa536vVL0M6vE8zN63nI+sSr1ByxmPToP5K5bukaVscyeCJcF9guVNJ1g==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.34", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz", + "integrity": "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001797", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", + "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", + "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/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/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.368", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz", + "integrity": "sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==", + "dev": true, + "license": "ISC" + }, + "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/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz", + "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "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/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "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/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/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/its-fine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", + "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "^0.28.9" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.9", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", + "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "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/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "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/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/konva": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/konva/-/konva-10.3.0.tgz", + "integrity": "sha512-gt19K2gzY4lHbnkvsku7eSmB+A9PTS2jG4F9coBMsdjM1UKfJNxJbDbXVpeCW1wjEGRwBD3nBamcHnqJhAeKlg==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/lavrton" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/konva" + }, + { + "type": "github", + "url": "https://github.com/sponsors/lavrton" + } + ], + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.17.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.17.0.tgz", + "integrity": "sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/react-konva": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-konva/-/react-konva-19.2.4.tgz", + "integrity": "sha512-AjRT4CwGprm/DV7fTXAjLCjYgNKZlwL+ghhw1pb1RSL7E0BKOlXeiiUSfF/ajd7OdSJOhkf9iuVUNlFk1PvlzQ==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/lavrton" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/konva" + }, + { + "type": "github", + "url": "https://github.com/sponsors/lavrton" + } + ], + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "^0.33.0", + "its-fine": "^2.0.0", + "react-reconciler": "0.33.0", + "scheduler": "0.27.0" + }, + "peerDependencies": { + "konva": "^8.0.1 || ^7.2.5 || ^9.0.0 || ^10.0.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/react-reconciler": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", + "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "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/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8805bbb --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "roomplanner", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "konva": "^10.3.0", + "lucide-react": "^1.17.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-konva": "^19.2.4" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.2", + "eslint": "^10.4.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "vite": "^8.0.16" + } +} diff --git a/public/kifferei.jpg b/public/kifferei.jpg new file mode 100644 index 0000000000000000000000000000000000000000..78d941d4ee4d9810fea6c5cfd23cc290a64d87e7 GIT binary patch literal 75705 zcmb5U1yEc;w?BAs3z|WK1rHJ+1lQoMgL`myw}e2D;O_1=_zX@61kXTVaCe8`1c>b9 zd$0EWw`$*3ZO@h8J=T3rU+L~Me;59407T02O7Z{-3JUNR`2+s`0iMcu+E{qoSkw7A zc-zw{D5+`w-9l|tl94gj1Z&7EsmdXx0RXkg*~-NWT@nCXT)jQP3et22hDLN)M*t>( z1%QC30EUH?m%Ey_ybkccmfJZ1X$b%jod0b7uVVl2418-FFDn2*p+mAIt=v7mk@zhV z3;21v|HD~G46?GfutwrKB!20MY#VRdCzJZXK&hG!f zmj4H~viEdB%J3m&n5Wsi?a{1ZT~6%JbYr~s;iAWGa+|sKmkw! z)BsI@4zL7#00+Ps@CG=MXICV}3jibe(*KJ-<$v@wky@5WEeF5~sUZuv0WN^WfAoQW zeSnlfmj8*Zmo4w>|Bz6gNCN=I+TXud%m9Fu3IM;8{{DR|{`>cL2>_t206?GX|LD6F z0f5jAlAiQGG^RoTAp8gbu&@6^v&;m5wkQCgSai4WwD?awXvia~tt|jtRssONApku6 z4gk2u{}neR?;js1od*CNWUN%-0Fa#n04#P$+a~{u-`Gfn|2uB~pECa)zrV|X41k7; z`fo!PbmWGCje&uVj)9AXg^B$H_sJ7HTs%B{0umy80%8I@JR&k8;-?@|Qqm`c

Be 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

OP-Ro+Go2CcIiIZ%W37BpoizMGbSWI7Ch-h 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 wQ(w9#5+B05v$t0=?+V#Wo!)ovoZh&B t.width === 1.1 && t.height === 1).length; + const count220x100 = tiles.filter(t => t.width === 2.2 && t.height === 1).length; + const count204x120 = tiles.filter(t => t.width === 2.04 && t.height === 1.2).length; + const count240x120 = tiles.filter(t => t.width === 2.4 && t.height === 1.2).length; + const countLights = tiles.filter(t => t.type === 'light').length; + const containerRef = useRef(null); + + // Responsive canvas size + useEffect(() => { + const handleResize = () => { + if (containerRef.current) { + setDimensions({ + width: containerRef.current.offsetWidth, + height: containerRef.current.offsetHeight, + }); + } + }; + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, []); + + // Original geometry; rotate the whole group so the top edge is horizontal + const rawVertices = computeRoomVertices(SIDE_A, SIDE_B, SIDE_C, SIDE_D, alphaDeg); + const vertices = rawVertices; + const topEdgeAngle = + rawVertices && + Math.atan2( + rawVertices[2].y - rawVertices[3].y, + rawVertices[2].x - rawVertices[3].x + ); + const rotationDeg = + topEdgeAngle != null ? (-topEdgeAngle * 180) / Math.PI : 0; + const centroid = + rawVertices && rawVertices.length === 4 + ? { + x: + (rawVertices[0].x + rawVertices[1].x + rawVertices[2].x + rawVertices[3].x) / + 4, + y: + (rawVertices[0].y + rawVertices[1].y + rawVertices[2].y + rawVertices[3].y) / + 4, + } + : null; + + const checkDeselect = (e) => { + // deselect when clicked on empty area (Stage) or the room itself + const clickedOnEmpty = e.target === e.target.getStage(); + const clickedOnRoom = e.target.name() === 'room-polygon'; + if (clickedOnEmpty || clickedOnRoom) { + setSelectedId(null); + } + }; + + const addTile = (width, height, label) => { + const isSquare = width === height; + + // Assign colors based on dimensions + let color = "rgba(16, 185, 129, 0.6)"; // Default Green + let stroke = "#10b981"; + + if (width === 1.1 && height === 1) { + color = "rgba(139, 92, 246, 0.6)"; // Purple + stroke = "#8b5cf6"; + } else if (width === 2.2 && height === 1) { + color = "rgba(14, 165, 233, 0.6)"; // Sky Blue + stroke = "#0ea5e9"; + } else if (width === 2.04 && height === 1.2) { + color = "rgba(245, 158, 11, 0.6)"; // Amber + stroke = "#f59e0b"; + } else if (width === 2.4 && height === 1.2) { + color = "rgba(20, 184, 166, 0.6)"; // Teal + stroke = "#14b8a6"; + } + + const newTile = { + id: `tile-${Date.now()}`, + label: label, + x: 1 * SCALE, + y: -1 * SCALE, + width: width, + height: height, + color: color, + stroke: stroke, + type: 'table' + }; + setTiles([...tiles, newTile]); + setSelectedId(newTile.id); + }; + + const addLight = () => { + const newLight = { + id: `light-${Date.now()}`, + label: 'Licht 0.95x0.95', + x: 1 * SCALE, + y: -1 * SCALE, + width: 0.95, + height: 0.95, + color: "rgba(253, 224, 71, 0.6)", // Yellow + stroke: "#eab308", + type: 'light' + }; + setTiles([...tiles, newLight]); + setSelectedId(newLight.id); + }; + + const exportTiles = () => { + const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(tiles, null, 2)); + const downloadAnchorNode = document.createElement('a'); + downloadAnchorNode.setAttribute("href", dataStr); + downloadAnchorNode.setAttribute("download", "room-planner-tiles.json"); + document.body.appendChild(downloadAnchorNode); + downloadAnchorNode.click(); + downloadAnchorNode.remove(); + }; + + const importTiles = (event) => { + const file = event.target.files[0]; + if (!file) return; + const reader = new FileReader(); + reader.onload = (e) => { + try { + const importedTiles = JSON.parse(e.target.result); + if (Array.isArray(importedTiles)) { + setTiles(importedTiles); + setSelectedId(null); + } + } catch (err) { + console.error("Failed to parse tiles JSON", err); + alert("Fehler beim Laden der Datei."); + } + }; + reader.readAsText(file); + event.target.value = null; + }; + + const deleteSelected = () => { + if (selectedId) { + setTiles(tiles.filter(t => t.id !== selectedId)); + setSelectedId(null); + } + }; + + const handleTileChange = (id, newAttrs) => { + setTiles(prevTiles => prevTiles.map(t => t.id === id ? { ...t, ...newAttrs } : t)); + }; + + return ( +

+ {/* Sidebar Controls */} + + + {/* Main Canvas Area */} +
+ + + {/* Center the room drawing in the stage. + V0 is bottom-left, so we move it down and right. */} + + {vertices && } + + {/* Render tables first so they are below lights */} + {tiles.filter(t => t.type !== 'light').map((tile) => ( + setSelectedId(tile.id)} + onChange={(newAttrs) => handleTileChange(tile.id, newAttrs)} + /> + ))} + + {/* Render lights on top */} + {tiles.filter(t => t.type === 'light').map((tile) => ( + setSelectedId(tile.id)} + onChange={(newAttrs) => handleTileChange(tile.id, newAttrs)} + /> + ))} + + + +
+
+ ); +} + +export default App; diff --git a/src/RoomPolygon.jsx b/src/RoomPolygon.jsx new file mode 100644 index 0000000..48d41f3 --- /dev/null +++ b/src/RoomPolygon.jsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { Line, Group, Text } from 'react-konva'; + +export function RoomPolygon({ vertices, scale }) { + if (!vertices || vertices.length !== 4) return null; + + // Flatten the array of vertices for Konva Line + // Multiply by scale to convert meters to pixels + const points = vertices.flatMap(v => [v.x * scale, v.y * scale]); + + // Calculate center of each edge to place text + const edgeTexts = vertices.map((v, i) => { + const nextV = vertices[(i + 1) % vertices.length]; + const midX = ((v.x + nextV.x) / 2) * scale; + const midY = ((v.y + nextV.y) / 2) * scale; + + // Distance in meters (should map back to original a,b,c,d) + const dist = Math.sqrt(Math.pow(nextV.x - v.x, 2) + Math.pow(nextV.y - v.y, 2)); + + // Offset slightly outward from center + // We can just place it roughly at the midpoint + return { x: midX, y: midY, text: `${dist.toFixed(2)}m`, key: i }; + }); + + return ( + + + {edgeTexts.map(et => ( + + ))} + + ); +} diff --git a/src/Tile.jsx b/src/Tile.jsx new file mode 100644 index 0000000..ac8296e --- /dev/null +++ b/src/Tile.jsx @@ -0,0 +1,83 @@ +import React, { useRef, useState } from 'react'; +import { Rect, Group, Transformer } from 'react-konva'; + +export function Tile({ id, initialX, initialY, scale, meterWidth = 1.6, meterHeight = 1.6, color = "rgba(16, 185, 129, 0.6)", stroke = "#10b981", isSelected, onSelect, type, rotation = 0, onChange }) { + const shapeRef = useRef(); + const trRef = useRef(); + const pixelWidth = meterWidth * scale; + const pixelHeight = meterHeight * scale; + + // Sync up transformer when selected + React.useEffect(() => { + if (isSelected && trRef.current && shapeRef.current) { + trRef.current.nodes([shapeRef.current]); + trRef.current.getLayer().batchDraw(); + } + }, [isSelected]); + + const isLight = type === 'light'; + + return ( + + { + onSelect(); + // visually pop out + e.target.moveToTop(); + }} + onDragEnd={(e) => { + onChange && onChange({ + x: e.target.x(), + y: e.target.y() + }); + }} + onTransformEnd={(e) => { + const node = shapeRef.current; + node.scaleX(1); + node.scaleY(1); + onChange && onChange({ + x: node.x(), + y: node.y(), + rotation: node.rotation() + }); + }} + /> + {isSelected && ( + + )} + + ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..3062dc5 --- /dev/null +++ b/src/index.css @@ -0,0 +1,265 @@ +:root { + --bg-color: #0f172a; + /* slate-900 */ + --panel-bg: #1e293b; + /* slate-800 */ + --text-main: #f8fafc; + /* slate-50 */ + --text-muted: #94a3b8; + /* slate-400 */ + --accent: #4f46e5; + /* indigo-600 */ + --accent-hover: #4338ca; + /* indigo-700 */ + --danger: #ef4444; + /* red-500 */ + --danger-hover: #dc2626; + /* red-600 */ + --border: #334155; + /* slate-700 */ +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html, +body, +#root { + height: 100%; + width: 100%; + overflow: hidden; +} + +body { + font-family: 'Inter', system-ui, -apple-system, sans-serif; + background-color: var(--bg-color); + color: var(--text-main); +} + +.layout { + display: flex; + height: 100%; + width: 100%; +} + +/* Sidebar styling */ +.sidebar { + width: 192px; + height: 100%; + flex-shrink: 0; + background-color: var(--panel-bg); + border-right: 1px solid var(--border); + padding: 14px; + display: flex; + flex-direction: column; + gap: 8px; + box-shadow: 4px 0 15px rgba(0, 0, 0, 0.3); + z-index: 10; + overflow-y: auto; +} + +.header { + display: flex; + align-items: center; + gap: 12px; +} + +.header h1 { + font-size: 1.25rem; + font-weight: 600; + letter-spacing: -0.02em; +} + +.icon-accent { + color: var(--accent); +} + +.control-group { + display: flex; + flex-direction: column; + gap: 12px; +} + +.label { + font-size: 0.95rem; + font-weight: 500; + display: flex; + justify-content: space-between; +} + +.error { + color: var(--danger); + font-size: 0.8rem; +} + +.help-text { + font-size: 0.8rem; + color: var(--text-muted); + line-height: 1.4; +} + +/* Custom interactive slider */ +.slider { + -webkit-appearance: none; + width: 100%; + height: 6px; + background: var(--border); + border-radius: 4px; + outline: none; + transition: all 0.2s; +} + +.slider::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 18px; + height: 18px; + border-radius: 50%; + background: var(--accent); + cursor: pointer; + box-shadow: 0 0 10px rgba(79, 70, 229, 0.5); + transition: transform 0.1s; +} + +.slider::-webkit-slider-thumb:hover { + transform: scale(1.2); +} + +/* Buttons */ +.actions { + display: flex; + flex-direction: column; + gap: 12px; +} + +.btn { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + gap: 6px; + padding: 6px 10px; + border: none; + border-radius: 6px; + font-size: 0.75rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + color: white; + text-align: center; +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.btn-primary { + background-color: var(--accent); + box-shadow: 0 4px 6px -1px rgba(79, 70, 229, 0.4); +} + +.btn-primary:hover:not(:disabled) { + background-color: var(--accent-hover); + transform: translateY(-1px); +} + +.btn-primary:active:not(:disabled) { + transform: translateY(1px); +} + +.btn-danger { + background-color: var(--danger); + box-shadow: 0 4px 6px -1px rgba(239, 68, 68, 0.3); +} + +.btn-danger:hover:not(:disabled) { + background-color: var(--danger-hover); +} + +/* Info Box */ +.info-box { + background-color: rgba(15, 23, 42, 0.4); + border: 1px solid var(--border); + border-radius: 8px; + padding: 16px; + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 16px; +} + +.info-box h3 { + font-size: 0.9rem; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.info-box p { + font-size: 1.5rem; + font-weight: 700; + color: var(--accent); +} + +/* Canvas area */ +.canvas-container { + flex: 1; + position: relative; + background-image: + radial-gradient(circle at center, rgba(51, 65, 85, 0.3) 1px, transparent 1px); + background-size: 24px 24px; +} + +@media (max-width: 768px) { + .layout { + flex-direction: column-reverse; + } + + .sidebar { + width: 100%; + height: 45vh; + flex: none; + border-right: none; + border-top: 1px solid var(--border); + padding: 8px; + gap: 8px; + } + + .canvas-container { + height: 55vh; + flex: none; + } + + .actions { + gap: 6px; + } + + .btn { + font-size: 0.7rem; + padding: 6px; + gap: 4px; + } + + .header h1 { + font-size: 1rem; + } + + .info-box { + margin-top: 8px; + padding: 8px; + gap: 4px; + } + + .info-box p { + font-size: 1rem; + } + + hr { + margin: 0.5rem 0 !important; + } +} \ No newline at end of file diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..b9a1a6d --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/src/utils/geometry.js b/src/utils/geometry.js new file mode 100644 index 0000000..b0ee5c9 --- /dev/null +++ b/src/utils/geometry.js @@ -0,0 +1,95 @@ +/** + * Rotate vertices so the top edge (V3–V2) is horizontal. Returns rotated vertices. + * Rotation is around the centroid. Angle in radians. + */ +export function rotateVerticesSoTopHorizontal(vertices) { + if (!vertices || vertices.length !== 4) return vertices; + const [v0, v1, v2, v3] = vertices; + const dx = v2.x - v3.x; + const dy = v2.y - v3.y; + const angle = Math.atan2(dy, dx); + const cos = Math.cos(-angle); + const sin = Math.sin(-angle); + const cx = (v0.x + v1.x + v2.x + v3.x) / 4; + const cy = (v0.y + v1.y + v2.y + v3.y) / 4; + const rotate = (v) => { + const px = v.x - cx; + const py = v.y - cy; + return { + x: px * cos - py * sin + cx, + y: px * sin + py * cos + cy, + }; + }; + return [rotate(v0), rotate(v1), rotate(v2), rotate(v3)]; +} + +export function computeRoomVertices(a, b, c, d, alphaDeg) { + // a: bottom, b: right, c: top, d: left + // alphaDeg: interior angle at bottom-left corner + const alpha = (alphaDeg * Math.PI) / 180; + + // V0 is at the origin (bottom-left) + const v0 = { x: 0, y: 0 }; + + // V1 is at (a, 0) + const v1 = { x: a, y: 0 }; + + // V3 is at distance d from V0, at angle alpha + // Since canvas Y goes down, visually "up" is negative Y + const v3 = { + x: d * Math.cos(alpha), + y: -d * Math.sin(alpha) + }; + + // Calculate distance between V1 and V3 + const D = Math.sqrt(Math.pow(v3.x - v1.x, 2) + Math.pow(v3.y - v1.y, 2)); + + // Test if a triangle can be formed with b, c, D + if (D > b + c || b > D + c || c > D + b) { + return null; // Invalid polygon + } + + // Calculate intersection of two circles + // Circle 1: center V1, radius b + // Circle 2: center V3, radius c + // Using circle intersection formula: + const a_dist = (b * b - c * c + D * D) / (2 * D); + const h_sq = b * b - a_dist * a_dist; + const h = Math.sqrt(Math.max(0, h_sq)); + + const x_mid = v1.x + (a_dist / D) * (v3.x - v1.x); + const y_mid = v1.y + (a_dist / D) * (v3.y - v1.y); + + const rx = -(v3.y - v1.y) / D; + const ry = (v3.x - v1.x) / D; + + const p1 = { x: x_mid + h * rx, y: y_mid + h * ry }; + const p2 = { x: x_mid - h * rx, y: y_mid - h * ry }; + + const crossProduct = (O, A, B) => + (A.x - O.x) * (B.y - O.y) - (A.y - O.y) * (B.x - O.x); + + const isConvex = (v2Test) => { + const cp1 = crossProduct(v0, v1, v2Test); + const cp2 = crossProduct(v1, v2Test, v3); + const cp3 = crossProduct(v2Test, v3, v0); + const cp0 = crossProduct(v3, v0, v1); + + // In canvas Y down, convex polygon usually has same sign for all cross products of edges + const sign1 = Math.sign(cp1); + const sign2 = Math.sign(cp2); + const sign3 = Math.sign(cp3); + const sign0 = Math.sign(cp0); + + return (sign1 === sign2 || sign1 === 0) && (sign2 === sign3 || sign2 === 0) && (sign3 === sign0 || sign3 === 0); + }; + + let v2 = p1; + // If p1 is not convex, or if we just want the "outer" one in Y (with negative y) + // we can use a simpler heuristic. Both might be valid but one is concave. + if (!isConvex(p1)) { + v2 = p2; + } + + return [v0, v1, v2, v3]; +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..97312a5 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,30 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + allowedHosts: true, + }, + build: { + rollupOptions: { + output: { + manualChunks(id) { + if (id.includes('node_modules')) { + if (id.includes('konva')) { + return 'vendor-konva'; + } + if (id.includes('react-dom')) { + return 'vendor-react-dom'; + } + if (id.includes('react') || id.includes('scheduler')) { + return 'vendor-react'; + } + return 'vendor'; + } + } + } + } + } +})