From 2a2b0523dbb6b8e4abf31e5a5f99a3ffad4d307a Mon Sep 17 00:00:00 2001 From: Saimon8420 Date: Wed, 25 Dec 2024 18:13:00 +0600 Subject: [PATCH] all file added --- .env | 1 + .gitignore | 24 + components.json | 21 + eslint.config.js | 38 + index.html | 13 + jsconfig.json | 22 + package-lock.json | 8603 +++++++++++++++++ package.json | 60 + postcss.config.js | 6 + public/vite.svg | 1 + src/App.css | 4 + src/App.jsx | 85 + src/assets/PlanPost AI_Logo.png | Bin 0 -> 108060 bytes src/assets/react.svg | 1 + src/assets/svgs/Group 25367.svg | 8 + src/assets/svgs/Group 25368.svg | 5 + src/assets/svgs/Group 25369.svg | 35 + src/assets/svgs/Group 25370.svg | 3 + src/assets/svgs/Group 25371.svg | 3 + src/assets/svgs/Group 25372.svg | 3 + src/assets/svgs/Group 25373.svg | 3 + src/assets/svgs/Group 25374.svg | 22 + src/assets/svgs/Group 25375.svg | 3 + src/assets/svgs/Group 25376.svg | 185 + src/assets/svgs/Group 25377.svg | 3 + src/assets/svgs/Group 25378.svg | 3 + src/assets/svgs/Group 25379.svg | 8 + src/assets/svgs/Group 25380.svg | 3 + src/assets/svgs/Group 25381.svg | 119 + src/assets/svgs/Group 25382.svg | 28 + src/assets/svgs/Group 25383.svg | 3 + src/assets/svgs/Group 25384.svg | 7 + src/assets/svgs/Group 25385.svg | 248 + src/assets/svgs/Group 25386.svg | 8 + src/assets/svgs/Group 25387.svg | 16 + src/assets/svgs/Group 25388.svg | 12 + src/assets/svgs/Group 25389.svg | 5 + src/assets/svgs/Group 25390.svg | 8 + src/assets/svgs/Group 25391.svg | 11 + src/assets/svgs/Group 25392.svg | 3 + src/assets/svgs/Group 25393.svg | 5 + src/assets/svgs/Group 25394.svg | 10 + src/assets/svgs/Group 25395.svg | 5 + src/assets/svgs/Group 25396.svg | 3 + src/assets/svgs/Group 25397.svg | 3 + src/assets/svgs/Group 25398.svg | 12 + src/assets/svgs/Group 25399.svg | 985 ++ src/assets/svgs/Group 25400.svg | 15 + src/assets/svgs/Group 25401.svg | 18 + src/assets/svgs/Group 25402.svg | 1045 ++ src/components/AspectCanvas.jsx | 207 + src/components/Canvas.jsx | 91 + src/components/CanvasCapture.jsx | 139 + src/components/CanvasSetting.jsx | 235 + src/components/ColorComponent.jsx | 203 + .../Context/activeObject/ObjectContext.js | 5 + .../Context/activeObject/ObjectProvider.jsx | 11 + .../Context/canvasContext/CanvasContext.js | 5 + .../canvasContext/CanvasContextProvider.jsx | 16 + .../Context/colorContext/ColorContext.js | 5 + .../colorContext/ColorContextProvider.jsx | 22 + .../Context/openContext/OpenContext.js | 5 + .../openContext/OpenContextProvider.jsx | 19 + src/components/EachComponent/ApplyColor.jsx | 289 + .../EachComponent/CustomShape/CustomShape.jsx | 68 + .../EachComponent/CustomShape/shapes.js | 39 + .../Customization/AddImageIntoShape.jsx | 332 + .../Customization/AddImageToText.jsx | 71 + .../Customization/CollapsibleComponent.jsx | 25 + .../Customization/FlipCustomization.jsx | 74 + .../Customization/ImageCustomization.jsx | 226 + .../Customization/OpacityCustomization.jsx | 46 + .../Customization/PositionCustomization.jsx | 162 + .../Customization/RotateCustomization.jsx | 44 + .../Customization/ScaleObjects.jsx | 94 + .../Customization/ShadowCustomization.jsx | 143 + .../Customization/SkewCustomization.jsx | 85 + .../Customization/StrokeCustomization.jsx | 367 + .../Customization/TextCustomization.jsx | 280 + .../EachComponent/CustomizeShape.jsx | 86 + .../EachComponent/Icons/AllIcons.jsx | 128 + .../RoundedShapes/RoundedShape.jsx | 87 + .../EachComponent/Shapes/PlainShapes.jsx | 174 + src/components/EachComponent/UploadImage.jsx | 267 + src/components/EditPanel.jsx | 378 + src/components/FabricCanvas.jsx | 69 + src/components/Layouts/AddShapes.jsx | 28 + src/components/Layouts/Header.jsx | 19 + src/components/Layouts/SheetLeftPanel.jsx | 77 + src/components/Layouts/SheetRightPanel.jsx | 71 + src/components/ObjectPanel.jsx | 124 + src/components/captureCanvas.js | 37 + src/components/loadCanvas.js | 107 + src/components/ui/alert.jsx | 47 + src/components/ui/aspect-ratio.jsx | 5 + src/components/ui/badge.jsx | 34 + src/components/ui/button.jsx | 48 + src/components/ui/card.jsx | 50 + src/components/ui/checkbox.jsx | 22 + src/components/ui/collapsible.jsx | 9 + src/components/ui/input.jsx | 19 + src/components/ui/label.jsx | 21 + src/components/ui/popover.jsx | 27 + src/components/ui/scroll-area.jsx | 38 + src/components/ui/select.jsx | 119 + src/components/ui/separator.jsx | 23 + src/components/ui/sheet.jsx | 108 + src/components/ui/slider.jsx | 21 + src/components/ui/switch.jsx | 22 + src/components/ui/tabs.jsx | 41 + src/components/ui/textarea.jsx | 18 + src/components/ui/tooltip.jsx | 26 + src/index.css | 155 + src/lib/utils.js | 6 + src/main.jsx | 22 + tailwind.config.js | 71 + vite.config.js | 13 + 117 files changed, 17660 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 components.json create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 jsconfig.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/vite.svg create mode 100644 src/App.css create mode 100644 src/App.jsx create mode 100644 src/assets/PlanPost AI_Logo.png create mode 100644 src/assets/react.svg create mode 100644 src/assets/svgs/Group 25367.svg create mode 100644 src/assets/svgs/Group 25368.svg create mode 100644 src/assets/svgs/Group 25369.svg create mode 100644 src/assets/svgs/Group 25370.svg create mode 100644 src/assets/svgs/Group 25371.svg create mode 100644 src/assets/svgs/Group 25372.svg create mode 100644 src/assets/svgs/Group 25373.svg create mode 100644 src/assets/svgs/Group 25374.svg create mode 100644 src/assets/svgs/Group 25375.svg create mode 100644 src/assets/svgs/Group 25376.svg create mode 100644 src/assets/svgs/Group 25377.svg create mode 100644 src/assets/svgs/Group 25378.svg create mode 100644 src/assets/svgs/Group 25379.svg create mode 100644 src/assets/svgs/Group 25380.svg create mode 100644 src/assets/svgs/Group 25381.svg create mode 100644 src/assets/svgs/Group 25382.svg create mode 100644 src/assets/svgs/Group 25383.svg create mode 100644 src/assets/svgs/Group 25384.svg create mode 100644 src/assets/svgs/Group 25385.svg create mode 100644 src/assets/svgs/Group 25386.svg create mode 100644 src/assets/svgs/Group 25387.svg create mode 100644 src/assets/svgs/Group 25388.svg create mode 100644 src/assets/svgs/Group 25389.svg create mode 100644 src/assets/svgs/Group 25390.svg create mode 100644 src/assets/svgs/Group 25391.svg create mode 100644 src/assets/svgs/Group 25392.svg create mode 100644 src/assets/svgs/Group 25393.svg create mode 100644 src/assets/svgs/Group 25394.svg create mode 100644 src/assets/svgs/Group 25395.svg create mode 100644 src/assets/svgs/Group 25396.svg create mode 100644 src/assets/svgs/Group 25397.svg create mode 100644 src/assets/svgs/Group 25398.svg create mode 100644 src/assets/svgs/Group 25399.svg create mode 100644 src/assets/svgs/Group 25400.svg create mode 100644 src/assets/svgs/Group 25401.svg create mode 100644 src/assets/svgs/Group 25402.svg create mode 100644 src/components/AspectCanvas.jsx create mode 100644 src/components/Canvas.jsx create mode 100644 src/components/CanvasCapture.jsx create mode 100644 src/components/CanvasSetting.jsx create mode 100644 src/components/ColorComponent.jsx create mode 100644 src/components/Context/activeObject/ObjectContext.js create mode 100644 src/components/Context/activeObject/ObjectProvider.jsx create mode 100644 src/components/Context/canvasContext/CanvasContext.js create mode 100644 src/components/Context/canvasContext/CanvasContextProvider.jsx create mode 100644 src/components/Context/colorContext/ColorContext.js create mode 100644 src/components/Context/colorContext/ColorContextProvider.jsx create mode 100644 src/components/Context/openContext/OpenContext.js create mode 100644 src/components/Context/openContext/OpenContextProvider.jsx create mode 100644 src/components/EachComponent/ApplyColor.jsx create mode 100644 src/components/EachComponent/CustomShape/CustomShape.jsx create mode 100644 src/components/EachComponent/CustomShape/shapes.js create mode 100644 src/components/EachComponent/Customization/AddImageIntoShape.jsx create mode 100644 src/components/EachComponent/Customization/AddImageToText.jsx create mode 100644 src/components/EachComponent/Customization/CollapsibleComponent.jsx create mode 100644 src/components/EachComponent/Customization/FlipCustomization.jsx create mode 100644 src/components/EachComponent/Customization/ImageCustomization.jsx create mode 100644 src/components/EachComponent/Customization/OpacityCustomization.jsx create mode 100644 src/components/EachComponent/Customization/PositionCustomization.jsx create mode 100644 src/components/EachComponent/Customization/RotateCustomization.jsx create mode 100644 src/components/EachComponent/Customization/ScaleObjects.jsx create mode 100644 src/components/EachComponent/Customization/ShadowCustomization.jsx create mode 100644 src/components/EachComponent/Customization/SkewCustomization.jsx create mode 100644 src/components/EachComponent/Customization/StrokeCustomization.jsx create mode 100644 src/components/EachComponent/Customization/TextCustomization.jsx create mode 100644 src/components/EachComponent/CustomizeShape.jsx create mode 100644 src/components/EachComponent/Icons/AllIcons.jsx create mode 100644 src/components/EachComponent/RoundedShapes/RoundedShape.jsx create mode 100644 src/components/EachComponent/Shapes/PlainShapes.jsx create mode 100644 src/components/EachComponent/UploadImage.jsx create mode 100644 src/components/EditPanel.jsx create mode 100644 src/components/FabricCanvas.jsx create mode 100644 src/components/Layouts/AddShapes.jsx create mode 100644 src/components/Layouts/Header.jsx create mode 100644 src/components/Layouts/SheetLeftPanel.jsx create mode 100644 src/components/Layouts/SheetRightPanel.jsx create mode 100644 src/components/ObjectPanel.jsx create mode 100644 src/components/captureCanvas.js create mode 100644 src/components/loadCanvas.js create mode 100644 src/components/ui/alert.jsx create mode 100644 src/components/ui/aspect-ratio.jsx create mode 100644 src/components/ui/badge.jsx create mode 100644 src/components/ui/button.jsx create mode 100644 src/components/ui/card.jsx create mode 100644 src/components/ui/checkbox.jsx create mode 100644 src/components/ui/collapsible.jsx create mode 100644 src/components/ui/input.jsx create mode 100644 src/components/ui/label.jsx create mode 100644 src/components/ui/popover.jsx create mode 100644 src/components/ui/scroll-area.jsx create mode 100644 src/components/ui/select.jsx create mode 100644 src/components/ui/separator.jsx create mode 100644 src/components/ui/sheet.jsx create mode 100644 src/components/ui/slider.jsx create mode 100644 src/components/ui/switch.jsx create mode 100644 src/components/ui/tabs.jsx create mode 100644 src/components/ui/textarea.jsx create mode 100644 src/components/ui/tooltip.jsx create mode 100644 src/index.css create mode 100644 src/lib/utils.js create mode 100644 src/main.jsx create mode 100644 tailwind.config.js create mode 100644 vite.config.js diff --git a/.env b/.env new file mode 100644 index 0000000..a576e9b --- /dev/null +++ b/.env @@ -0,0 +1 @@ +VITE_GOOGLE_FONT_API_KEY=AIzaSyBPOYGT26jwMjlDuf6sM5JwaZDkiYigeQg \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/components.json b/components.json new file mode 100644 index 0000000..4e01167 --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": false, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..238d2e4 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,38 @@ +import js from '@eslint/js' +import globals from 'globals' +import react from 'eslint-plugin-react' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' + +export default [ + { ignores: ['dist'] }, + { + files: ['**/*.{js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + settings: { react: { version: '18.3' } }, + plugins: { + react, + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...js.configs.recommended.rules, + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + ...reactHooks.configs.recommended.rules, + 'react/jsx-no-target-blank': 'off', + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +] diff --git a/index.html b/index.html new file mode 100644 index 0000000..2618562 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + PlanPostAi Canvas + + +
+ + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..93740c2 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "skipLibCheck": true, + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "src" + ], +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f9934b2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8603 @@ +{ + "name": "canvas", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "canvas", + "version": "0.0.0", + "dependencies": { + "@radix-ui/react-aspect-ratio": "^1.1.1", + "@radix-ui/react-checkbox": "^1.1.2", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-scroll-area": "^1.2.1", + "@radix-ui/react-select": "^2.1.2", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slider": "^1.2.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.4", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "fabric": "^5.3.0", + "lodash": "^4.17.21", + "lucide-react": "^0.456.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-dropzone": "^14.3.5", + "react-image-file-resizer": "^0.4.8", + "react-rnd": "^10.4.13", + "react-window": "^1.8.10", + "tailwind-merge": "^2.5.4", + "tailwind-scrollbar": "^3.1.0", + "tailwind-scrollbar-hide": "^1.3.1", + "tailwindcss-animate": "^1.0.7", + "webfontloader": "^1.6.28" + }, + "devDependencies": { + "@eslint/js": "^9.13.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.3", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.13.0", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.14", + "globals": "^15.11.0", + "postcss": "^8.4.48", + "tailwindcss": "^3.4.14", + "vite": "^5.4.10" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "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.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.3.tgz", + "integrity": "sha512-yTmc8J+Sj8yLzwr4PD5Xb/WF3bOYu2C2OoSZPzbuqRm4n98XirsbzaX+GloeO376UnSYIYJ4NCanwV5/ugZkwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "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.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.1.tgz", + "integrity": "sha512-kNU4FIpcFMBLkOUcgeIteH06/8JLBcYY6Le1iKenDGCYNYFX3TQqCZjzkOsz37h7r94/99GTb7YhEr98ZBJibw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.2.tgz", + "integrity": "sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.2.tgz", + "integrity": "sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz", + "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz", + "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.2.tgz", + "integrity": "sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz", + "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", + "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz", + "integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-collection": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz", + "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.1.tgz", + "integrity": "sha512-FnM1fHfCtEZ1JkyfH/1oMiTcFBQvHKl4vD9WnpwkLgtF+UmnXMCad6ECPTaAjcDjam+ndOEJWgHyKDGNteWSHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.2.tgz", + "integrity": "sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", + "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.1.tgz", + "integrity": "sha512-bEzQoDW0XP+h/oGbutF5VMWJPAl/UU8IJjr7h02SOHDIIIxq+cep8nItVNoBV+OMmahCdqdF38FTpmXoqQUGvw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.2.tgz", + "integrity": "sha512-zGukiWHjEdBCRyXvKR6iXAQG6qXm2esuAD6kDOi9Cn+1X6ev3ASo4+CsYaD6Fov9r/AQFekqnD/7+V0Cs6/98g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz", + "integrity": "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-roving-focus": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.4.tgz", + "integrity": "sha512-QpObUH/ZlpaO4YgHSaYzrLO2VuO+ZBFFgGzjMUPwtiYnAzzNNDPJeEGRrT7qNOrWm/Jr08M1vlp+vTHtnSQ0Uw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz", + "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz", + "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz", + "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz", + "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz", + "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz", + "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz", + "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz", + "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz", + "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz", + "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz", + "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz", + "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz", + "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz", + "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz", + "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz", + "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz", + "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz", + "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.0.tgz", + "integrity": "sha512-+CuuTCmQFfzaNGg1JmcZvdUVITQXJk9sMnl1C2TiDLzOSVOJRwVD4dNo5dljX/qxpMAN+2BIYlwjlSkoGi6grg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.17" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.10.0", + "@swc/core-darwin-x64": "1.10.0", + "@swc/core-linux-arm-gnueabihf": "1.10.0", + "@swc/core-linux-arm64-gnu": "1.10.0", + "@swc/core-linux-arm64-musl": "1.10.0", + "@swc/core-linux-x64-gnu": "1.10.0", + "@swc/core-linux-x64-musl": "1.10.0", + "@swc/core-win32-arm64-msvc": "1.10.0", + "@swc/core-win32-ia32-msvc": "1.10.0", + "@swc/core-win32-x64-msvc": "1.10.0" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.0.tgz", + "integrity": "sha512-wCeUpanqZyzvgqWRtXIyhcFK3CqukAlYyP+fJpY2gWc/+ekdrenNIfZMwY7tyTFDkXDYEKzvn3BN/zDYNJFowQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.0.tgz", + "integrity": "sha512-0CZPzqTynUBO+SHEl/qKsFSahp2Jv/P2ZRjFG0gwZY5qIcr1+B/v+o74/GyNMBGz9rft+F2WpU31gz2sJwyF4A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.0.tgz", + "integrity": "sha512-oq+DdMu5uJOFPtRkeiITc4kxmd+QSmK+v+OBzlhdGkSgoH3yRWZP+H2ao0cBXo93ZgCr2LfjiER0CqSKhjGuNA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.0.tgz", + "integrity": "sha512-Y6+PC8knchEViRxiCUj3j8wsGXaIhuvU+WqrFqV834eiItEMEI9+Vh3FovqJMBE3L7d4E4ZQtgImHCXjrHfxbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.0.tgz", + "integrity": "sha512-EbrX9A5U4cECCQQfky7945AW9GYnTXtCUXElWTkTYmmyQK87yCyFfY8hmZ9qMFIwxPOH6I3I2JwMhzdi8Qoz7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.0.tgz", + "integrity": "sha512-TaxpO6snTjjfLXFYh5EjZ78se69j2gDcqEM8yB9gguPYwkCHi2Ylfmh7iVaNADnDJFtjoAQp0L41bTV/Pfq9Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.0.tgz", + "integrity": "sha512-IEGvDd6aEEKEyZFZ8oCKuik05G5BS7qwG5hO5PEMzdGeh8JyFZXxsfFXbfeAqjue4UaUUrhnoX+Ze3M2jBVMHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.0.tgz", + "integrity": "sha512-UkQ952GSpY+Z6XONj9GSW8xGSkF53jrCsuLj0nrcuw7Dvr1a816U/9WYZmmcYS8tnG2vHylhpm6csQkyS8lpCw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.0.tgz", + "integrity": "sha512-a2QpIZmTiT885u/mUInpeN2W9ClCnqrV2LnMqJR1/Fgx1Afw/hAtiDZPtQ0SqS8yDJ2VR5gfNZo3gpxWMrqdVA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.0.tgz", + "integrity": "sha512-tZcCmMwf483nwsEBfUk5w9e046kMa1iSik4bP9Kwi2FGtOfHuDfIcwW4jek3hdcgF5SaBW1ktnK/lgQLDi5AtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", + "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "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/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.13.tgz", + "integrity": "sha512-ii/gswMmOievxAJed4PAHT949bpYjPKXvXo1v6cRB/kqc2ZR4n+SgyCyvyc5Fec5ez8VnUumI1Vk7j6fRyRogg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.2.tgz", + "integrity": "sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/core": "^1.7.26" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC", + "optional": true + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "devOptional": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "optional": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "optional": true, + "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/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT", + "optional": true + }, + "node_modules/attr-accept": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "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": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001686", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz", + "integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==", + "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/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC", + "optional": true + }, + "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==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "license": "MIT", + "optional": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "optional": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT", + "optional": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "license": "MIT", + "optional": true + }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", + "optional": true + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "optional": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.69", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.69.tgz", + "integrity": "sha512-zz4e7EbJqqtdQtwt61ZYKrfEYlV0HpGbIGRVFGOO9YBZIhg0BDXtBcWxpqyAm6oyPl2Zp8tc5FrPpCZQH/Yazg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/es-abstract": { + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "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/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.16.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.5", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.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", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", + "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.16.tgz", + "integrity": "sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "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==", + "devOptional": 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==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fabric": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/fabric/-/fabric-5.4.2.tgz", + "integrity": "sha512-gTsmUdgHgACGrVd/ixUTa7YHqsMRh+zbBpZAjgZNfQHwGt45jXW2k6ntSQbiY9/f/7ZHx9trnTbj4lpXgYUuvg==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "canvas": "^2.8.0", + "jsdom": "^19.0.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-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/file-selector": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "license": "MIT", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC", + "optional": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "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/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", + "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", + "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC", + "optional": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "optional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC", + "optional": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", + "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", + "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-regex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", + "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "gopd": "^1.1.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", + "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", + "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "has-symbols": "^1.0.3", + "safe-regex-test": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "license": "MIT", + "optional": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "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/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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/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/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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": "0.456.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.456.0.tgz", + "integrity": "sha512-DIIGJqTT5X05sbAsQ+OhA8OtJYyD4NsEMCA/HQW/Y6ToPQ7gwbtujIoeAaup4HpHzV35SQOarKAWH8LYglB6eA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "optional": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "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-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "license": "MIT", + "optional": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "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/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT", + "optional": true + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "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/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "optional": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT", + "optional": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/re-resizable": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.10.0.tgz", + "integrity": "sha512-hysSK0xmA5nz24HBVztlk4yCqCLCvS32E6ZpWxVKop9x3tqCa4yAj1++facrmkOf62JsJHjmjABdKxXofYioCw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-draggable": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", + "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", + "license": "MIT", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-draggable/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dropzone": { + "version": "14.3.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", + "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-image-file-resizer": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/react-image-file-resizer/-/react-image-file-resizer-0.4.8.tgz", + "integrity": "sha512-Ue7CfKnSlsfJ//SKzxNMz8avDgDSpWQDOnTKOp/GNRFJv4dO9L5YGHNEnj40peWkXXAK2OK0eRIoXhOYpUzUTQ==", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", + "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-rnd": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.13.tgz", + "integrity": "sha512-Vgbf0iihspcQ6nkaFhpOGWfmnuVbhkhoB0hBbYl8aRDA4horsQHESc4E1z7O/P27kFFjK2aqM0u5CGzfr9gEZA==", + "license": "MIT", + "dependencies": { + "re-resizable": "6.10.0", + "react-draggable": "4.4.6", + "tslib": "2.6.2" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-rnd/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-window": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", + "integrity": "sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT", + "optional": true + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz", + "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.28.0", + "@rollup/rollup-android-arm64": "4.28.0", + "@rollup/rollup-darwin-arm64": "4.28.0", + "@rollup/rollup-darwin-x64": "4.28.0", + "@rollup/rollup-freebsd-arm64": "4.28.0", + "@rollup/rollup-freebsd-x64": "4.28.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.0", + "@rollup/rollup-linux-arm-musleabihf": "4.28.0", + "@rollup/rollup-linux-arm64-gnu": "4.28.0", + "@rollup/rollup-linux-arm64-musl": "4.28.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.0", + "@rollup/rollup-linux-riscv64-gnu": "4.28.0", + "@rollup/rollup-linux-s390x-gnu": "4.28.0", + "@rollup/rollup-linux-x64-gnu": "4.28.0", + "@rollup/rollup-linux-x64-musl": "4.28.0", + "@rollup/rollup-win32-arm64-msvc": "4.28.0", + "@rollup/rollup-win32-ia32-msvc": "4.28.0", + "@rollup/rollup-win32-x64-msvc": "4.28.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", + "optional": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "optional": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC", + "optional": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "optional": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "license": "MIT", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT", + "optional": true + }, + "node_modules/tailwind-merge": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.5.tgz", + "integrity": "sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-scrollbar": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz", + "integrity": "sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==", + "license": "MIT", + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "3.x" + } + }, + "node_modules/tailwind-scrollbar-hide": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar-hide/-/tailwind-scrollbar-hide-1.3.1.tgz", + "integrity": "sha512-eUAvPTltKnAGHbCBRpOk5S7+UZTkFZgDKmZLZ6jZXXs4V7mRXvwshBjeMwrv3vmiWqm3IGEDFVKzUSm1JuoXKw==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 4.0.0 || >= 4.0.0-beta.8 || >= 4.0.0-alpha.20" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz", + "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "license": "MIT", + "optional": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "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/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "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.0" + }, + "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/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "optional": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "license": "MIT", + "optional": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/webfontloader": { + "version": "1.6.28", + "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", + "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", + "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.0", + "is-number-object": "^1.1.0", + "is-string": "^1.1.0", + "is-symbol": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "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/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC", + "optional": true + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT", + "optional": true + }, + "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/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e5c067d --- /dev/null +++ b/package.json @@ -0,0 +1,60 @@ +{ + "name": "canvas", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@radix-ui/react-aspect-ratio": "^1.1.1", + "@radix-ui/react-checkbox": "^1.1.2", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-scroll-area": "^1.2.1", + "@radix-ui/react-select": "^2.1.2", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slider": "^1.2.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.4", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "fabric": "^5.3.0", + "lodash": "^4.17.21", + "lucide-react": "^0.456.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-dropzone": "^14.3.5", + "react-image-file-resizer": "^0.4.8", + "react-rnd": "^10.4.13", + "react-window": "^1.8.10", + "tailwind-merge": "^2.5.4", + "tailwind-scrollbar": "^3.1.0", + "tailwind-scrollbar-hide": "^1.3.1", + "tailwindcss-animate": "^1.0.7", + "webfontloader": "^1.6.28" + }, + "devDependencies": { + "@eslint/js": "^9.13.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.3", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.13.0", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.14", + "globals": "^15.11.0", + "postcss": "^8.4.48", + "tailwindcss": "^3.4.14", + "vite": "^5.4.10" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..43c1019 --- /dev/null +++ b/src/App.css @@ -0,0 +1,4 @@ +.fabric-canvas-container { + box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.2); + border-radius: 0px; +} \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..3802921 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,85 @@ +import { useEffect, useState } from 'react'; +import './App.css' +import Canvas from './components/Canvas' +import WebFont from 'webfontloader'; +import Header from './components/Layouts/Header'; +import SheetRightPanel from './components/Layouts/SheetRightPanel'; +import SheetLeftPanel from './components/Layouts/SheetLeftPanel'; +import CanvasCapture from "./components/CanvasCapture"; + +function App() { + useEffect(() => { + WebFont.load({ + google: { + families: [ + 'Roboto:300,400,500,700', + 'Open Sans:300,400,600,700', + 'Lato:300,400,700', + 'Montserrat:300,400,500,700', + 'Raleway:300,400,500,700', + 'Poppins:300,400,500,700', + 'Merriweather:300,400,700', + 'Playfair Display:400,500,700', + 'Nunito:300,400,600,700', + 'Oswald:300,400,500,600', + 'Source Sans Pro:300,400,600,700', + 'Ubuntu:300,400,500,700', + 'Noto Sans:300,400,500,700', + 'Work Sans:300,400,500,700', + 'Bebas Neue', + 'Arimo:300,400,500,700', + 'PT Sans:300,400,700', + 'PT Serif:300,400,700', + 'Titillium Web:300,400,600,700', + 'Fira Sans:300,400,500,700', + 'Karla:300,400,600,700', + 'Josefin Sans:300,400,500,700', + 'Cairo:300,400,600,700', + 'Rubik:300,400,500,700', + 'Mulish:300,400,500,700', + 'IBM Plex Sans:300,400,500,700', + 'Quicksand:300,400,500,700', + 'Cabin:300,400,500,700', + 'Heebo:300,400,500,700', + 'Exo 2:300,400,500,700', + 'Manrope:300,400,500,700', + 'Jost:300,400,500,700', + 'Anton', + 'Asap:300,400,600,700', + 'Baloo 2:300,400,500,700', + 'Barlow:300,400,500,700', + 'Cantarell:300,400,700', + 'Chivo:300,400,500,700', + 'Inter:300,400,500,700', + 'Dosis:300,400,500,700', + 'Crimson Text:300,400,600,700', + 'Amatic SC:300,400,700', + 'ABeeZee', + 'Raleway Dots', + 'Pacifico', + 'Orbitron:300,400,500,700', + 'Varela Round', + 'Acme', + 'Teko:300,400,500,700', + ], + }, + }); + }, []); + + return ( +
+ +
+ + +
+
+ + +
+
+
+ ) +} + +export default App diff --git a/src/assets/PlanPost AI_Logo.png b/src/assets/PlanPost AI_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d41ce6bf36e64c81d26fbbb9feababf7675126c6 GIT binary patch literal 108060 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 z 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 P00000NkvXXu0mjf{0$H; literal 0 HcmV?d00001 diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/Group 25367.svg b/src/assets/svgs/Group 25367.svg new file mode 100644 index 0000000..119d32e --- /dev/null +++ b/src/assets/svgs/Group 25367.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/assets/svgs/Group 25368.svg b/src/assets/svgs/Group 25368.svg new file mode 100644 index 0000000..c1abe1e --- /dev/null +++ b/src/assets/svgs/Group 25368.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/src/assets/svgs/Group 25369.svg b/src/assets/svgs/Group 25369.svg new file mode 100644 index 0000000..4b85a23 --- /dev/null +++ b/src/assets/svgs/Group 25369.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25370.svg b/src/assets/svgs/Group 25370.svg new file mode 100644 index 0000000..6a28ec1 --- /dev/null +++ b/src/assets/svgs/Group 25370.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25371.svg b/src/assets/svgs/Group 25371.svg new file mode 100644 index 0000000..d2b9d2f --- /dev/null +++ b/src/assets/svgs/Group 25371.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25372.svg b/src/assets/svgs/Group 25372.svg new file mode 100644 index 0000000..44a79ad --- /dev/null +++ b/src/assets/svgs/Group 25372.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25373.svg b/src/assets/svgs/Group 25373.svg new file mode 100644 index 0000000..9c7e0e4 --- /dev/null +++ b/src/assets/svgs/Group 25373.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25374.svg b/src/assets/svgs/Group 25374.svg new file mode 100644 index 0000000..b7f6cb8 --- /dev/null +++ b/src/assets/svgs/Group 25374.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25375.svg b/src/assets/svgs/Group 25375.svg new file mode 100644 index 0000000..3969686 --- /dev/null +++ b/src/assets/svgs/Group 25375.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25376.svg b/src/assets/svgs/Group 25376.svg new file mode 100644 index 0000000..881144a --- /dev/null +++ b/src/assets/svgs/Group 25376.svg @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25377.svg b/src/assets/svgs/Group 25377.svg new file mode 100644 index 0000000..16e4882 --- /dev/null +++ b/src/assets/svgs/Group 25377.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25378.svg b/src/assets/svgs/Group 25378.svg new file mode 100644 index 0000000..01ca741 --- /dev/null +++ b/src/assets/svgs/Group 25378.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25379.svg b/src/assets/svgs/Group 25379.svg new file mode 100644 index 0000000..5ee901d --- /dev/null +++ b/src/assets/svgs/Group 25379.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/svgs/Group 25380.svg b/src/assets/svgs/Group 25380.svg new file mode 100644 index 0000000..50c5e37 --- /dev/null +++ b/src/assets/svgs/Group 25380.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25381.svg b/src/assets/svgs/Group 25381.svg new file mode 100644 index 0000000..45936a0 --- /dev/null +++ b/src/assets/svgs/Group 25381.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25382.svg b/src/assets/svgs/Group 25382.svg new file mode 100644 index 0000000..86842e4 --- /dev/null +++ b/src/assets/svgs/Group 25382.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25383.svg b/src/assets/svgs/Group 25383.svg new file mode 100644 index 0000000..e1e6f8b --- /dev/null +++ b/src/assets/svgs/Group 25383.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25384.svg b/src/assets/svgs/Group 25384.svg new file mode 100644 index 0000000..99538d1 --- /dev/null +++ b/src/assets/svgs/Group 25384.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/Group 25385.svg b/src/assets/svgs/Group 25385.svg new file mode 100644 index 0000000..7ad0fef --- /dev/null +++ b/src/assets/svgs/Group 25385.svg @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25386.svg b/src/assets/svgs/Group 25386.svg new file mode 100644 index 0000000..4b5dd6b --- /dev/null +++ b/src/assets/svgs/Group 25386.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/svgs/Group 25387.svg b/src/assets/svgs/Group 25387.svg new file mode 100644 index 0000000..a88a838 --- /dev/null +++ b/src/assets/svgs/Group 25387.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25388.svg b/src/assets/svgs/Group 25388.svg new file mode 100644 index 0000000..3eb4460 --- /dev/null +++ b/src/assets/svgs/Group 25388.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25389.svg b/src/assets/svgs/Group 25389.svg new file mode 100644 index 0000000..5f3a76a --- /dev/null +++ b/src/assets/svgs/Group 25389.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/Group 25390.svg b/src/assets/svgs/Group 25390.svg new file mode 100644 index 0000000..d8ef4fa --- /dev/null +++ b/src/assets/svgs/Group 25390.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/svgs/Group 25391.svg b/src/assets/svgs/Group 25391.svg new file mode 100644 index 0000000..4ac3af1 --- /dev/null +++ b/src/assets/svgs/Group 25391.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25392.svg b/src/assets/svgs/Group 25392.svg new file mode 100644 index 0000000..87c706a --- /dev/null +++ b/src/assets/svgs/Group 25392.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25393.svg b/src/assets/svgs/Group 25393.svg new file mode 100644 index 0000000..fea4c30 --- /dev/null +++ b/src/assets/svgs/Group 25393.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/Group 25394.svg b/src/assets/svgs/Group 25394.svg new file mode 100644 index 0000000..306100c --- /dev/null +++ b/src/assets/svgs/Group 25394.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/svgs/Group 25395.svg b/src/assets/svgs/Group 25395.svg new file mode 100644 index 0000000..c58874c --- /dev/null +++ b/src/assets/svgs/Group 25395.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/Group 25396.svg b/src/assets/svgs/Group 25396.svg new file mode 100644 index 0000000..c0d2a44 --- /dev/null +++ b/src/assets/svgs/Group 25396.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25397.svg b/src/assets/svgs/Group 25397.svg new file mode 100644 index 0000000..934bf5e --- /dev/null +++ b/src/assets/svgs/Group 25397.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/Group 25398.svg b/src/assets/svgs/Group 25398.svg new file mode 100644 index 0000000..31a1a77 --- /dev/null +++ b/src/assets/svgs/Group 25398.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25399.svg b/src/assets/svgs/Group 25399.svg new file mode 100644 index 0000000..9b3ca50 --- /dev/null +++ b/src/assets/svgs/Group 25399.svg @@ -0,0 +1,985 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25400.svg b/src/assets/svgs/Group 25400.svg new file mode 100644 index 0000000..13ff779 --- /dev/null +++ b/src/assets/svgs/Group 25400.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25401.svg b/src/assets/svgs/Group 25401.svg new file mode 100644 index 0000000..52988e2 --- /dev/null +++ b/src/assets/svgs/Group 25401.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/Group 25402.svg b/src/assets/svgs/Group 25402.svg new file mode 100644 index 0000000..f32341c --- /dev/null +++ b/src/assets/svgs/Group 25402.svg @@ -0,0 +1,1045 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/AspectCanvas.jsx b/src/components/AspectCanvas.jsx new file mode 100644 index 0000000..f3f2553 --- /dev/null +++ b/src/components/AspectCanvas.jsx @@ -0,0 +1,207 @@ +import { useState, useEffect, useContext } from 'react' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" +import { AspectRatio } from "@/components/ui/aspect-ratio" +import CanvasContext from './Context/canvasContext/CanvasContext' +import OpenContext from './Context/openContext/OpenContext'; +import { Settings, Download, Share2, Settings2 } from "lucide-react"; +import { Card, CardContent } from './ui/card'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './ui/tooltip'; +import { Button } from './ui/button'; +import { Separator } from './ui/separator'; + +const aspectRatios = [ + { value: "1:1", label: "Square (1:1)" }, + { value: "4:3", label: "Standard (4:3)" }, + { value: "3:2", label: "Classic (3:2)" }, + { value: "16:9", label: "Widescreen (16:9)" }, + { value: "9:16", label: "Portrait (9:16)" }, + { value: "21:9", label: "Ultrawide (21:9)" }, + { value: "32:9", label: "Super Ultrawide (32:9)" }, + { value: "1.85:1", label: "Cinema Standard (1.85:1)" }, + { value: "2.39:1", label: "Anamorphic Widescreen (2.39:1)" }, + { value: "2.76:1", label: "Ultra Panavision 70 (2.76:1)" }, + { value: "5:4", label: "Large Format (5:4)" }, + { value: "7:5", label: "Artistic Format (7:5)" }, + { value: "11:8.5", label: "Letter Size (11:8.5)" }, + { value: "9:21", label: "Tall Video (9:21)" }, + { value: "3:4", label: "Portrait (3:4)" }, + { value: "1.91:1", label: "Facebook Ads (1.91:1)" } +]; + +export function AspectCanvas() { + const { setLeftPanelOpen, setRightPanelOpen, setOpenPanel, setCaptureOpen, setOpenSetting, openObjectPanel, setOpenObjectPanel, rightPanelOpen } = useContext(OpenContext); + const [selectedRatio, setSelectedRatio] = useState("4:3"); + + const { canvasRef, canvas, setCanvas, fabricCanvasRef } = useContext(CanvasContext); + + useEffect(() => { + import('fabric').then((fabricModule) => { + window.fabric = fabricModule.fabric; + }); + }, []); + + const getRatioValue = (ratio) => { + const [width, height] = ratio.split(':').map(Number) + return width / height + } + + useEffect(() => { + const updateCanvasSize = () => { + if (canvasRef.current && canvas) { + canvas.setWidth(canvasRef?.current?.offsetWidth); + canvas.setHeight(canvasRef?.current?.offsetHeight); + canvas.backgroundImage = null; + canvas.overlayImage = null; + canvas.renderAll(); + } + if (document.getElementById("root").offsetWidth <= 640) { + setLeftPanelOpen(false); + setRightPanelOpen(false); + if (rightPanelOpen === true) { + setOpenObjectPanel(true); + } + } + if (document.getElementById("root").offsetWidth > 640) { + // setLeftPanelOpen(true); + if (openObjectPanel === true) { + setRightPanelOpen(true); + } + } + if (document.getElementById("root").offsetWidth > 640) { + setOpenObjectPanel(false); + } + } + + updateCanvasSize() + window.addEventListener('resize', updateCanvasSize) + + return () => window.removeEventListener('resize', updateCanvasSize) + }, [selectedRatio, canvasRef, canvas, openObjectPanel, setLeftPanelOpen, setOpenObjectPanel, setRightPanelOpen, rightPanelOpen]) + + useEffect(() => { + if (window.fabric) { + if (fabricCanvasRef?.current) { + fabricCanvasRef?.current.dispose() + } + // Set styles directly on the canvas element + const canvasElement = document.getElementById('fabric-canvas') + if (canvasElement) { + canvasElement.classList.add('fabric-canvas-container') // Add the CSS class + } + + fabricCanvasRef.current = new window.fabric.Canvas('fabric-canvas', { + width: canvasRef?.current?.offsetWidth, + height: canvasRef?.current?.offsetWidth, + backgroundColor: "#ffffff", + }) + + setCanvas(fabricCanvasRef?.current); + } + }, []) + + const handleRatioChange = (newRatio) => { + setSelectedRatio(newRatio) + } + + return ( + + +
+ +
+ + + + + + +

Open Panel

+
+
+
+ +
+ + + + + + +

Open Settings

+
+
+
+ + + + + + +

Download

+
+
+
+ + + + + + +

Share (Coming soon)

+
+
+
+
+
+ +
+ + + +
+ +
+
+ +

After changing the resolution, the canvas background image will reset.

+
+
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ ) +} + + + diff --git a/src/components/Canvas.jsx b/src/components/Canvas.jsx new file mode 100644 index 0000000..1f6c8d0 --- /dev/null +++ b/src/components/Canvas.jsx @@ -0,0 +1,91 @@ +import { useEffect, useCallback, useContext } from 'react'; +import CanvasContext from './Context/canvasContext/CanvasContext'; +import ActiveObjectContext from './Context/activeObject/ObjectContext'; +import { Rnd } from 'react-rnd'; +import OpenContext from './Context/openContext/OpenContext'; +import CanvasSetting from './CanvasSetting'; +import { EditPanel } from './EditPanel'; +import ObjectPanel from './ObjectPanel'; +import { AspectCanvas } from './AspectCanvas'; + +const Canvas = () => { + const { canvas } = useContext(CanvasContext); + + const { openSetting, openObjectPanel, openPanel } = useContext(OpenContext); + + const { setActiveObject } = useContext(ActiveObjectContext); + + useEffect(() => { + if (canvas) { + canvas.on('mouse:down', () => { + const activeObject = canvas?.getActiveObject(); + setActiveObject(activeObject); + }); + } + }, [canvas]); + + const removeSelected = useCallback(() => { + const activeObject = canvas?.getActiveObject(); + const allObjects = canvas?.getObjects(); + + const textObjects = allObjects.filter((obj) => obj.type === 'textbox' || obj.type === 'text' || obj.type === 'i-text'); + + if (activeObject) { + canvas.remove(activeObject); + setActiveObject(null); + } + if (activeObject && textObjects?.length === 1) { + canvas.remove(activeObject); + setActiveObject(null); + } + if (activeObject.length > 1) { + canvas.remove(...activeObject); + setActiveObject(null); + } + }, [canvas, setActiveObject]); + + useEffect(() => { + const handleDeleteKey = (event) => { + if (event.key === 'Delete') { + removeSelected(); + } + }; + window.addEventListener('keydown', handleDeleteKey); + return () => { + window.removeEventListener('keydown', handleDeleteKey); + }; + }, [removeSelected]); + + return ( +
+ + {openSetting && ( + + + + )} + + { + openPanel && + + } + + {openObjectPanel && } + + {/* Main canvas */} + +
+ ); +}; + +export default Canvas; diff --git a/src/components/CanvasCapture.jsx b/src/components/CanvasCapture.jsx new file mode 100644 index 0000000..b98f7c2 --- /dev/null +++ b/src/components/CanvasCapture.jsx @@ -0,0 +1,139 @@ +import { useContext, useState } from 'react'; +import CanvasContext from './Context/canvasContext/CanvasContext'; +import OpenContext from './Context/openContext/OpenContext'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Label } from '@/components/ui/label'; +import { Button } from '@/components/ui/button'; +import { Card, CardHeader, CardTitle } from './ui/card'; +import { Rnd } from 'react-rnd'; +import { X } from 'lucide-react'; +import { Separator } from './ui/separator'; + +const resolutions = [ + { value: '720p', label: 'HD (1280x720)', width: 1280, height: 720 }, + { value: '1080p', label: 'Full HD (1920x1080)', width: 1920, height: 1080 }, + { value: '1440p', label: 'QHD (2560x1440)', width: 2560, height: 1440 }, + { value: '4k', label: '4K (3840x2160)', width: 3840, height: 2160 }, + { value: 'story', label: 'Story (1080x1920)', width: 1080, height: 1920 }, // Added for Stories + { value: '5k', label: '5K (5120x2880)', width: 5120, height: 2880 }, + { value: 'ultrawide', label: 'Ultrawide (3440x1440)', width: 3440, height: 1440 }, + { value: 'cinematic', label: 'Cinematic (2560x1080)', width: 2560, height: 1080 }, +]; + +const imageTypes = [ + { value: 'png', label: 'PNG' }, + { value: 'jpeg', label: 'JPEG' }, + { value: 'webp', label: 'WebP' }, +]; + +const CanvasCapture = () => { + const [resolution, setResolution] = useState(resolutions[0].value); + const [imageType, setImageType] = useState(imageTypes[0].value); + + const { canvas } = useContext(CanvasContext); + const { captureOpen, setCaptureOpen } = useContext(OpenContext); + + const captureImage = async () => { + if (!canvas) return; + + const selectedResolution = resolutions.find(res => res.value === resolution); + const { width, height } = selectedResolution; + + // Create a temporary canvas for resizing + const tempCanvas = document.createElement('canvas'); + const tempCtx = tempCanvas.getContext('2d'); + + // Set desired resolution + tempCanvas.width = width; + tempCanvas.height = height; + + // Render the fabric.js canvas onto the temporary canvas + const dataUrl = canvas.toDataURL({ + format: imageType, + quality: 1, + multiplier: width / canvas.width, // Adjust the scale based on width + }); + + const img = new Image(); + img.src = dataUrl; + + img.onload = () => { + tempCtx.drawImage(img, 0, 0, width, height); + + // Generate resized image data URL + const resizedDataUrl = tempCanvas.toDataURL(`image/${imageType}`, 1); + + // Download the resized image + const link = document.createElement('a'); + link.href = resizedDataUrl; + link.download = `PlanPostAi-capture-${resolution}.${imageType}`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }; + + return ( + <> + {captureOpen && ( + + + +
+ + Capture Panel +
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ )} + + ); +}; + +export default CanvasCapture; diff --git a/src/components/CanvasSetting.jsx b/src/components/CanvasSetting.jsx new file mode 100644 index 0000000..4d4211a --- /dev/null +++ b/src/components/CanvasSetting.jsx @@ -0,0 +1,235 @@ +import { useContext, useRef, useState } from 'react' +import CanvasContext from './Context/canvasContext/CanvasContext'; +import { Card, CardTitle } from './ui/card'; +import { Button } from './ui/button'; +import { Trash2, UploadIcon, X } from 'lucide-react'; +import { Separator } from './ui/separator'; +import ColorComponent from './ColorComponent'; +import { Label } from './ui/label'; +import { Input } from './ui/input'; +import { Slider } from './ui/slider'; +import { fabric } from 'fabric'; +import OpenContext from './Context/openContext/OpenContext'; + +const CanvasSetting = () => { + const { canvas } = useContext(CanvasContext); + const { setOpenSetting } = useContext(OpenContext); + const bgImgRef = useRef(null); + + const [canvasSettings, setCanvasSettings] = useState({ + width: canvas?.width, + height: canvas?.height, + perPixelTargetFind: true, // Enable per-pixel detection globally + targetFindTolerance: 4, // Adjust for leniency in pixel-perfect detection + }); + + const handleChange = (key, value) => { + setCanvasSettings((prevSettings) => ({ + ...prevSettings, + [key]: value, + })); + + // Use the value directly for canvas updates + if (key === 'width') { + canvas.setWidth(value); + } else if (key === 'height') { + canvas.setHeight(value); + } + canvas.renderAll(); + }; + + const setBackgroundImage = (e) => { + const file = e.target.files[0]; + if (file) { + const blobUrl = URL.createObjectURL(file); + + // Create an image element + const imgElement = new Image(); + imgElement.src = blobUrl; + + imgElement.onload = () => { + // Create a fabric.Image instance + const img = new fabric.Image(imgElement, { + scaleX: canvas.width / imgElement.width, + scaleY: canvas.height / imgElement.height, + }); + + // Set the background image on the canvas + canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas)); + + // Revoke the object URL to free memory + URL.revokeObjectURL(blobUrl); + }; + + imgElement.onerror = () => { + console.error("Failed to load the image."); + URL.revokeObjectURL(blobUrl); + }; + } + }; + + const setBackgroundOverlayImage = (e) => { + const file = e.target.files[0]; + if (file) { + const blobUrl = URL.createObjectURL(file); + + // Create an image element + const imgElement = new Image(); + imgElement.src = blobUrl; + + imgElement.onload = () => { + const img = new fabric.Image(imgElement, { + scaleX: canvas.width / imgElement.width, + scaleY: canvas.height / imgElement.height, + }); + + // Use setOverlayImage method to add the image as an overlay + canvas.setOverlayImage(img, () => { + canvas.renderAll(); + }); + + // Revoke the object URL after image is loaded and set + URL.revokeObjectURL(blobUrl); + }; + } + }; + + const adjustBackgroundOpacity = (value) => { + if (canvas) { + if (canvas.backgroundImage) { + // Update the opacity of the background image if it exists + canvas.backgroundImage.set("opacity", value); + } else if (canvas.overlayImage) { + // Update the opacity of the overlay image if it exists + canvas.overlayImage.set("opacity", value); + } else { + console.error("No background or overlay image found on the canvas."); + return; + } + + // Re-render the canvas to apply changes + canvas.renderAll(); + } else { + console.error("Canvas is not initialized."); + } + }; + + const removeBackgroundImage = () => { + if (canvas) { + canvas.backgroundImage = null; + canvas.renderAll(); + } + if (bgImgRef.current) { + bgImgRef.current.value = ""; + } + }; + + const removeBackgroundOverlayImage = () => { + if (canvas) { + canvas.overlayImage = null; + canvas.renderAll(); + } + }; + + return ( + + Canvas Setting + +
+ + + +
+
+ +
+ + + +
+
+ +
+ +
+ + + +
+
+ + + +
+ + { + const newOpacity = value[0]; // Extract slider value + adjustBackgroundOpacity(newOpacity); // Adjust Fabric.js background opacity + }} + /> +
+
+ + + +
+
+ + { + if (canvasSettings?.width > parseInt(e.target.value)) { + handleChange('width', parseInt(e.target.value, 10)); + } + }} + /> +
+ +
+ + { + if (canvasSettings?.height > parseInt(e.target.value)) { + handleChange('height', parseInt(e.target.value, 10)); + } + }} + /> +
+
+
+
+ ) +} + +export default CanvasSetting \ No newline at end of file diff --git a/src/components/ColorComponent.jsx b/src/components/ColorComponent.jsx new file mode 100644 index 0000000..2ccba6d --- /dev/null +++ b/src/components/ColorComponent.jsx @@ -0,0 +1,203 @@ +import { useContext, useEffect } from 'react' +import { Label } from './ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'; +import { Input } from './ui/input'; +import ColorContext from './Context/colorContext/ColorContext'; +import CanvasContext from './Context/canvasContext/CanvasContext'; +import { fabric } from 'fabric'; + +const ColorComponent = () => { + const { canvas } = useContext(CanvasContext); + const { + backgroundType, + setBackgroundType, + solidColor, + gradientColors, + setSolidColor, + setGradientColors, + gradientDirection, + setGradientDirection, + setDirectionCoords, + directionCoords, + } = useContext(ColorContext); + + const applySolidColor = (color) => { + setSolidColor(color); + }; + + const applyGradient = () => { + const width = canvas?.width || 0; + const height = canvas?.height || 0; + + // Define coordinates for linear gradient + const linearCoords = { + "top-to-bottom": { x1: 0, y1: 0, x2: 0, y2: height }, + "bottom-to-top": { x1: 0, y1: height, x2: 0, y2: 0 }, + "left-to-right": { x1: 0, y1: 0, x2: width, y2: 0 }, + "right-to-left": { x1: width, y1: 0, x2: 0, y2: 0 }, + }; + + const directionCoords = linearCoords[gradientDirection]; + if (directionCoords) { + setDirectionCoords(directionCoords); + } else { + console.error(`Invalid gradient direction: ${gradientDirection}`); + } + }; + + useEffect(() => { + if (gradientDirection && backgroundType === "gradient") { + applyGradient(); + } + }, [gradientDirection, backgroundType]); + + useEffect(() => { + const object = canvas?.getActiveObject(); + if (!object) { + if (canvas && solidColor && backgroundType === "color") { + canvas.backgroundColor = solidColor; + canvas.renderAll(); + } + if (canvas && directionCoords && gradientColors && backgroundType === "gradient") { + const gradient = new fabric.Gradient({ + type: "linear", + gradientUnits: "pixels", + coords: directionCoords, + colorStops: [ + { offset: 0, color: gradientColors.color1 }, + { offset: 1, color: gradientColors.color2 }, + ], + }); + canvas.backgroundColor = gradient; + canvas.renderAll(); + } + if (canvas && gradientColors && backgroundType === "radial") { + const gradient = new fabric.Gradient({ + type: "radial", + gradientUnits: "pixels", + coords: { + x1: canvas.width / 2, + y1: canvas.height / 2, + r1: 0, + x2: canvas.width / 2, + y2: canvas.height / 2, + r2: Math.min(canvas.width, canvas.height) / 2, + }, + colorStops: [ + { offset: 0, color: gradientColors.color1 }, + { offset: 1, color: gradientColors.color2 }, + ], + }); + canvas.backgroundColor = gradient; + canvas.renderAll(); + } + } + }, [gradientColors, directionCoords, solidColor, canvas, backgroundType]); + + return ( +
+
+ + +
+ + {backgroundType === "color" ? ( +
+ + applySolidColor(e.target.value)} + /> +
+ ) : backgroundType === "gradient" ? ( +
+
+ + +
+ +
+ + + setGradientColors((prev) => ({ + ...prev, + color1: e.target.value, + }))} + /> +
+ +
+ + + setGradientColors((prev) => ({ + ...prev, + color2: e.target.value, + }))} + /> +
+
+ ) : ( +
+
+ + + setGradientColors((prev) => ({ + ...prev, + color1: e.target.value, + }))} + /> +
+ +
+ + + setGradientColors((prev) => ({ + ...prev, + color2: e.target.value, + }))} + /> +
+
+ )} +
+ ); +}; + +export default ColorComponent; diff --git a/src/components/Context/activeObject/ObjectContext.js b/src/components/Context/activeObject/ObjectContext.js new file mode 100644 index 0000000..6655870 --- /dev/null +++ b/src/components/Context/activeObject/ObjectContext.js @@ -0,0 +1,5 @@ +import React from "react"; + +const ActiveObjectContext = React.createContext(); + +export default ActiveObjectContext; \ No newline at end of file diff --git a/src/components/Context/activeObject/ObjectProvider.jsx b/src/components/Context/activeObject/ObjectProvider.jsx new file mode 100644 index 0000000..e9bb47a --- /dev/null +++ b/src/components/Context/activeObject/ObjectProvider.jsx @@ -0,0 +1,11 @@ +import { useState } from 'react' +import ActiveObjectContext from './ObjectContext' + +export const ObjectProvider = ({ children }) => { + const [activeObject, setActiveObject] = useState(null); + return ( + + {children} + + ) +} diff --git a/src/components/Context/canvasContext/CanvasContext.js b/src/components/Context/canvasContext/CanvasContext.js new file mode 100644 index 0000000..ba7d74e --- /dev/null +++ b/src/components/Context/canvasContext/CanvasContext.js @@ -0,0 +1,5 @@ +import React from "react"; + +const CanvasContext = React.createContext(); + +export default CanvasContext; \ No newline at end of file diff --git a/src/components/Context/canvasContext/CanvasContextProvider.jsx b/src/components/Context/canvasContext/CanvasContextProvider.jsx new file mode 100644 index 0000000..e72289c --- /dev/null +++ b/src/components/Context/canvasContext/CanvasContextProvider.jsx @@ -0,0 +1,16 @@ +import { useRef, useState } from 'react' +import CanvasContext from './CanvasContext'; + +const CanvasContextProvider = ({ children }) => { + const canvasRef = useRef(null); + const [canvas, setCanvas] = useState(null); + const fabricCanvasRef = useRef(null); + + return ( + + {children} + + ) +} + +export default CanvasContextProvider \ No newline at end of file diff --git a/src/components/Context/colorContext/ColorContext.js b/src/components/Context/colorContext/ColorContext.js new file mode 100644 index 0000000..7b7b41c --- /dev/null +++ b/src/components/Context/colorContext/ColorContext.js @@ -0,0 +1,5 @@ +import React from "react"; + +const ColorContext = React.createContext(); + +export default ColorContext; \ No newline at end of file diff --git a/src/components/Context/colorContext/ColorContextProvider.jsx b/src/components/Context/colorContext/ColorContextProvider.jsx new file mode 100644 index 0000000..9fc8567 --- /dev/null +++ b/src/components/Context/colorContext/ColorContextProvider.jsx @@ -0,0 +1,22 @@ +import { useState } from 'react' +import ColorContext from './ColorContext' + +const ColorContextProvider = ({ children }) => { + const [backgroundType, setBackgroundType] = useState("color"); // 'color' or 'gradient' + const [solidColor, setSolidColor] = useState("#ffffff"); + const [gradientColors, setGradientColors] = useState({ + color1: "#ffffff", + color2: "#e26286", + }); + const [gradientDirection, setGradientDirection] = useState("top-to-bottom"); + + const [directionCoords, setDirectionCoords] = useState(null); + + return ( + + {children} + + ) +} + +export default ColorContextProvider \ No newline at end of file diff --git a/src/components/Context/openContext/OpenContext.js b/src/components/Context/openContext/OpenContext.js new file mode 100644 index 0000000..da14fa4 --- /dev/null +++ b/src/components/Context/openContext/OpenContext.js @@ -0,0 +1,5 @@ +import React from "react"; + +const OpenContext = React.createContext(); + +export default OpenContext; \ No newline at end of file diff --git a/src/components/Context/openContext/OpenContextProvider.jsx b/src/components/Context/openContext/OpenContextProvider.jsx new file mode 100644 index 0000000..73279d4 --- /dev/null +++ b/src/components/Context/openContext/OpenContextProvider.jsx @@ -0,0 +1,19 @@ +import { useState } from 'react' +import OpenContext from './OpenContext'; + +const IconContextProvider = ({ children }) => { + const [openSetting, setOpenSetting] = useState(false); + const [openObjectPanel, setOpenObjectPanel] = useState(false); + const [tabValue, setTabValue] = useState("icons"); + const [captureOpen, setCaptureOpen] = useState(false); + const [rightPanelOpen, setRightPanelOpen] = useState(true); + const [leftPanelOpen, setLeftPanelOpen] = useState(true); + const [openPanel, setOpenPanel] = useState(false); + return ( + + {children} + + ) +} + +export default IconContextProvider \ No newline at end of file diff --git a/src/components/EachComponent/ApplyColor.jsx b/src/components/EachComponent/ApplyColor.jsx new file mode 100644 index 0000000..c16e48f --- /dev/null +++ b/src/components/EachComponent/ApplyColor.jsx @@ -0,0 +1,289 @@ +import { useContext, useEffect, useState } from 'react' +import ActiveObjectContext from '../Context/activeObject/ObjectContext'; +import CanvasContext from '../Context/canvasContext/CanvasContext'; +import { fabric } from 'fabric'; +import { debounce } from "lodash"; +import { Separator } from '../ui/separator'; +import { Label } from '../ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; +import { Input } from '../ui/input'; +import { Card } from '../ui/card'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'; +import { Button } from '../ui/button'; +import CollapsibleComponent from './Customization/CollapsibleComponent'; + +const ApplyColor = () => { + const [colorField, setColorField] = useState("fill"); + const [fillColor, setFillColor] = useState(""); + const [backgroundColor, setBackgroundColor] = useState(""); + const [gradientFillColors, setGradientFillColors] = useState({ + color1: "#f97316", + color2: "#e26286", + }); + const [colorType, setColorType] = useState("color"); // 'color' or 'gradient' + const [gradientDirection, setGradientDirection] = useState("top-to-bottom"); + // get values from context + const { activeObject } = useContext(ActiveObjectContext); + const { canvas } = useContext(CanvasContext); + + // to get previous values from active object + useEffect(() => { + const handleObjectStyle = (object) => { + if (object.fill) { + if (typeof object.fill === "string") { + setColorType("color"); + } else if (object.fill instanceof fabric.Gradient) { + setColorType("gradient"); + } + } + + // Handle solid colors + if (object.fill && !object.fill.colorStops) { + setFillColor(object.fill); // Solid fill + } + if (object.backgroundColor) { + setBackgroundColor(object.backgroundColor); // Solid background color + } + + // Handle gradients + if (object.fill?.colorStops) { + setGradientFillColors({ + color1: object.fill.colorStops[0]?.color || "", + color2: object.fill.colorStops[1]?.color || "", + }); + } + }; + + const processGroupObjects = (group) => { + group._objects.forEach((obj) => { + if (obj.type === "group") { + processGroupObjects(obj); // Recursively handle nested groups + } else { + handleObjectStyle(obj); // Apply styles to child objects + } + }); + }; + + if (activeObject) { + if (activeObject.type === "group") { + processGroupObjects(activeObject); // Process all objects in the group + } else { + handleObjectStyle(activeObject); // Handle single object + } + } + }, [activeObject, colorField]); + + const handleSolidColorChange = debounce((newColor) => { + if (colorField === "fill") { + setFillColor(newColor) + } + else { + setBackgroundColor(newColor) + } + }, 100); + + // Common debounce handler for updating colors + const debouncedSetGradientColors = debounce((key, value) => { + if (colorField === "fill") { + setGradientFillColors((prev) => ({ + ...prev, + [key]: value, + })) + } + }, 300); // Adjust debounce delay as needed + + const handleColorChange = (key) => (e) => { + const newColor = e.target.value; + debouncedSetGradientColors(key, newColor); + }; + + // Apply color/gradient style to the selected object on the canvas + const applyColor = () => { + const applyStyleToObject = (object, style) => { + if (colorType === "color") { + if (colorField === "fill" && object.fill !== style.fill) { + object.set("fill", style.fill); + } + + if (colorField === "background" && object.backgroundColor !== style.backgroundColor) { + object.set("backgroundColor", style.backgroundColor); + } + } + + if (colorType === "gradient" && colorField === "fill") { + const width = object?.width || 0; + const height = object?.height || 0; + + const coords = { + "top-to-bottom": { x1: 0, y1: 0, x2: 0, y2: height }, + "bottom-to-top": { x1: 0, y1: height, x2: 0, y2: 0 }, + "left-to-right": { x1: 0, y1: 0, x2: width, y2: 0 }, + "right-to-left": { x1: width, y1: 0, x2: 0, y2: 0 }, + }; + + const directionCoords = coords[gradientDirection]; + const gradient = new fabric.Gradient({ + type: "linear", + gradientUnits: "pixels", + coords: directionCoords, + colorStops: [ + { offset: 0, color: gradientFillColors.color1 }, + { offset: 1, color: gradientFillColors.color2 }, + ], + }); + + object.set("fill", gradient); + } + }; + + const applyStyleRecursively = (object, style) => { + if (object.type === "group" && object._objects) { + // If the object is a group, iterate through its children + object._objects.forEach((child) => applyStyleRecursively(child, style)); + } else { + // If the object is not a group, apply the style directly + applyStyleToObject(object, style); + } + }; + + const style = { + fill: fillColor, + backgroundColor: backgroundColor, + }; + + applyStyleRecursively(activeObject, style); + + // Trigger re-render for the canvas + canvas.renderAll(); + } + + const content = () => { + return ( +
+
+
+
+ + +
+ + setColorType(value)}> + + Solid Color + Gradient + + + +
+ +
+ handleSolidColorChange(e.target.value)} + className="w-12 h-12 p-1 rounded-md" + /> + handleSolidColorChange(e.target.value)} + className="flex-grow" + /> +
+
+ +
+
+ + +
+ + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ + +
+
+ ) + } + + return ( +
+ + + {content()} + + + +
+ ) +} + +export default ApplyColor \ No newline at end of file diff --git a/src/components/EachComponent/CustomShape/CustomShape.jsx b/src/components/EachComponent/CustomShape/CustomShape.jsx new file mode 100644 index 0000000..2615965 --- /dev/null +++ b/src/components/EachComponent/CustomShape/CustomShape.jsx @@ -0,0 +1,68 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { useContext } from 'react' +import { shapes } from './shapes'; +import { fabric } from 'fabric'; + +const CustomShape = () => { + const { canvas } = useContext(CanvasContext); + const { setActiveObject } = useContext(ActiveObjectContext); + + const addShape = (each) => { + // Load the SVG from the imported file + fabric.loadSVGFromURL(each, (objects, options) => { + const svgGroup = fabric.util.groupSVGElements(objects, options); + + // Calculate canvas center + const centerX = canvas.getWidth() / 2; + const centerY = canvas.getHeight() / 2; + + // Set properties for centering the SVG + svgGroup.set({ + left: centerX, // Center horizontally + top: centerY, // Center vertically + originX: 'center', // Set the origin to the center + originY: 'center', + fill: "#f09b0a", + scaleX: 1, + scaleY: 1, + }); + + // Add SVG to the canvas + canvas.add(svgGroup); + canvas.setActiveObject(svgGroup); + + // Update the active object state + setActiveObject(svgGroup); + + // Render the canvas + canvas.renderAll(); + }); + }; + + return ( +
addShape()} + > + {shapes.map((each) => ( +
{ + e.stopPropagation() + addShape(each.source) + }} + > + {`Shape +
+ ))} +
+ ) +} + +export default CustomShape \ No newline at end of file diff --git a/src/components/EachComponent/CustomShape/shapes.js b/src/components/EachComponent/CustomShape/shapes.js new file mode 100644 index 0000000..e2a40ac --- /dev/null +++ b/src/components/EachComponent/CustomShape/shapes.js @@ -0,0 +1,39 @@ +export const shapes = [ + { shape: 25367, source: "/src/assets/svgs/Group 25367.svg" }, + { shape: 25368, source: "/src/assets/svgs/Group 25368.svg" }, + { shape: 25369, source: "/src/assets/svgs/Group 25369.svg" }, + { shape: 25370, source: "/src/assets/svgs/Group 25370.svg" }, + { shape: 25371, source: "/src/assets/svgs/Group 25371.svg" }, + { shape: 25372, source: "/src/assets/svgs/Group 25372.svg" }, + { shape: 25373, source: "/src/assets/svgs/Group 25373.svg" }, + { shape: 25374, source: "/src/assets/svgs/Group 25374.svg" }, + { shape: 25375, source: "/src/assets/svgs/Group 25375.svg" }, + { shape: 25376, source: "/src/assets/svgs/Group 25376.svg" }, + { shape: 25377, source: "/src/assets/svgs/Group 25377.svg" }, + { shape: 25378, source: "/src/assets/svgs/Group 25378.svg" }, + { shape: 25379, source: "/src/assets/svgs/Group 25379.svg" }, + { shape: 25380, source: "/src/assets/svgs/Group 25380.svg" }, + { shape: 25381, source: "/src/assets/svgs/Group 25381.svg" }, + { shape: 25382, source: "/src/assets/svgs/Group 25382.svg" }, + { shape: 25383, source: "/src/assets/svgs/Group 25383.svg" }, + { shape: 25384, source: "/src/assets/svgs/Group 25384.svg" }, + { shape: 25385, source: "/src/assets/svgs/Group 25385.svg" }, + { shape: 25386, source: "/src/assets/svgs/Group 25386.svg" }, + { shape: 25387, source: "/src/assets/svgs/Group 25387.svg" }, + { shape: 25388, source: "/src/assets/svgs/Group 25388.svg" }, + { shape: 25389, source: "/src/assets/svgs/Group 25389.svg" }, + { shape: 25390, source: "/src/assets/svgs/Group 25390.svg" }, + { shape: 25391, source: "/src/assets/svgs/Group 25391.svg" }, + { shape: 25392, source: "/src/assets/svgs/Group 25392.svg" }, + { shape: 25393, source: "/src/assets/svgs/Group 25393.svg" }, + { shape: 25394, source: "/src/assets/svgs/Group 25394.svg" }, + { shape: 25395, source: "/src/assets/svgs/Group 25395.svg" }, + { shape: 25396, source: "/src/assets/svgs/Group 25396.svg" }, + { shape: 25397, source: "/src/assets/svgs/Group 25397.svg" }, + { shape: 25398, source: "/src/assets/svgs/Group 25398.svg" }, + { shape: 25399, source: "/src/assets/svgs/Group 25399.svg" }, + { shape: 25400, source: "/src/assets/svgs/Group 25400.svg" }, + { shape: 25401, source: "/src/assets/svgs/Group 25401.svg" }, + { shape: 25402, source: "/src/assets/svgs/Group 25402.svg" }, +]; + diff --git a/src/components/EachComponent/Customization/AddImageIntoShape.jsx b/src/components/EachComponent/Customization/AddImageIntoShape.jsx new file mode 100644 index 0000000..42f3949 --- /dev/null +++ b/src/components/EachComponent/Customization/AddImageIntoShape.jsx @@ -0,0 +1,332 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { useContext, useRef, useState } from 'react'; +import { Button } from '@/components/ui/button'; +import { fabric } from 'fabric'; +import Resizer from "react-image-file-resizer"; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Slider } from '@/components/ui/slider'; +import { HardDriveUpload, ImagePlus, Upload, Crop, RotateCw, FileType, ChevronUp, ChevronDown } from 'lucide-react'; +import { Card, CardContent } from '@/components/ui/card'; +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; +import CollapsibleComponent from './CollapsibleComponent'; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; + +const features = [ + { icon: Upload, title: 'Auto-Resize', description: 'Images larger than 1080px are automatically resized' }, + { icon: Crop, title: 'Custom Dimensions', description: 'Set your preferred resize dimensions' }, + { icon: RotateCw, title: 'Quality & Rotation', description: 'Adjust image quality and rotation as needed' }, + { icon: FileType, title: 'Format Conversion', description: 'Convert between various image formats' }, +] + +const AddImageIntoShape = () => { + const { canvas } = useContext(CanvasContext); + const { activeObject, setActiveObject } = useContext(ActiveObjectContext); + const [errorMessage, setErrorMessage] = useState(""); + const [width, setWidth] = useState(1080); + const [height, setHeight] = useState(1080); + const [quality, setQuality] = useState(100); + const [rotation, setRotation] = useState("0"); + const [format, setFormat] = useState('JPEG'); + const fileInputRef = useRef(null); + const [isOpen, setIsOpen] = useState(true); + + const handleResize = (file, callback) => { + Resizer.imageFileResizer( + file, + width, + height, + format, + quality, + parseInt(rotation), + (resizedFile) => { + callback(resizedFile); // Pass the resized file to the callback + }, + 'file' // Output type + ); + }; + + const fileHandler = (e) => { + const file = e.target.files[0]; + if (!file) { + setErrorMessage("No file selected."); + return; + } + + // Check if the file is an SVG + if (file.type === "image/svg+xml") { + // Add SVG directly to canvas without compression + const blobUrl = URL.createObjectURL(file); + const imgElement = new Image(); + imgElement.src = blobUrl; + + imgElement.onload = () => { + handleImageInsert(imgElement); // Insert the image without resizing + URL.revokeObjectURL(blobUrl); + clearFileInput(); + }; + + imgElement.onerror = () => { + console.error("Failed to load SVG."); + setErrorMessage("Failed to load SVG."); + URL.revokeObjectURL(blobUrl); + clearFileInput(); + }; + return; + } + + // Handle raster images (JPEG, PNG, etc.) + const imgElement = new Image(); + const blobUrl = URL.createObjectURL(file); + imgElement.src = blobUrl; + + imgElement.onload = () => { + // If the width is greater than 1080px, compress the image + if (imgElement.width > 1080) { + handleResize(file, (compressedFile) => { + const compressedBlobUrl = URL.createObjectURL(compressedFile); + const compressedImg = new Image(); + compressedImg.src = compressedBlobUrl; + + compressedImg.onload = () => { + handleImageInsert(compressedImg); // Insert the resized image + URL.revokeObjectURL(compressedBlobUrl); // Clean up + clearFileInput(); + }; + + compressedImg.onerror = () => { + console.error("Failed to load compressed image."); + setErrorMessage("Failed to load compressed image."); + URL.revokeObjectURL(compressedBlobUrl); + clearFileInput(); + }; + }); + } else { + handleImageInsert(imgElement); // Insert the original image if no resizing needed + clearFileInput(); + } + URL.revokeObjectURL(blobUrl); // Clean up + clearFileInput(); + }; + + imgElement.onerror = () => { + console.error("Failed to load image."); + setErrorMessage("Failed to load image."); + URL.revokeObjectURL(blobUrl); + clearFileInput(); + }; + }; + + const clearFileInput = () => { + if (fileInputRef.current) { + fileInputRef.current.value = ""; + } + }; + + const handleImageInsert = (img) => { + if (!activeObject) { + setErrorMessage("No active object selected!"); + return; + } + // Ensure absolute positioning for the clipPath + activeObject.set({ + isClipPath: true, // Custom property + absolutePositioned: true, + }); + + // Create a fabric image object with scaling and clipPath + const fabricImage = new fabric.Image(img, { + scaleX: 0.2, + scaleY: 0.2, + left: activeObject.left, + top: activeObject.top, + clipPath: activeObject, // Apply clipPath to the image + }); + canvas.add(fabricImage); + canvas.setActiveObject(fabricImage); + setActiveObject(fabricImage); + canvas.renderAll(); + }; + + // canvas.remove(activeObject); + + const content = () => { + return ( +
+ + {/* + + + Image Insertion + +

+ Insert and customize images within shapes. Adjust image position and clipping after insertion. +

+

Key Features:

+
+ {features.map((feature, index) => ( +
+ +
+

{feature.title}

+

{feature.description}

+
+
+ ))} +
+
+
+
+
*/} + + + + + + Image Insertion + + +

+ Insert and customize images within shapes. Adjust image position and clipping after insertion. +

+ + + + + +
+ {features.map((feature, index) => ( +
+ +
+

{feature.title}

+

{feature.description}

+
+
+ ))} +
+
+
+
+
+
+
+ + {errorMessage && ( +

{errorMessage}

+ )} +
+
+ {/* Width Slider */} +
+ + setWidth(value[0])} + /> +
+ + {/* Height Slider */} +
+ + setHeight(value[0])} + /> +
+ + {/* Quality Slider */} + { + format === "JPEG" && +
+ + setQuality(value[0])} + /> +
+ } + +
+ {/* Rotation */} +
+ + + +
+ + {/* Format Dropdown */} +
+ + +
+
+
+ + +
+
+ ) + } + + return ( + + + {content()} + + + ); +}; + +export default AddImageIntoShape; + + + diff --git a/src/components/EachComponent/Customization/AddImageToText.jsx b/src/components/EachComponent/Customization/AddImageToText.jsx new file mode 100644 index 0000000..6cf3c72 --- /dev/null +++ b/src/components/EachComponent/Customization/AddImageToText.jsx @@ -0,0 +1,71 @@ +import { useContext } from 'react'; +import * as fabric from 'fabric'; // v6 +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { Input } from '@/components/ui/input'; + +const AddImageText = () => { + const { activeObject } = useContext(ActiveObjectContext); + const { canvas } = useContext(CanvasContext); + + // Handle user image upload + const handleImageUpload = (event) => { + const file = event.target.files[0]; + if (file) { + const reader = new FileReader(); + + reader.onload = (e) => { + const imgElement = new Image(); + imgElement.src = e.target.result; + + imgElement.onload = () => { + // Check if the active object is an instance of 'i-text' + if (activeObject && activeObject.type === 'i-text') { + // Create a Fabric BaseImage object from the uploaded image + const image = new fabric.BaseImage(imgElement, { + left: 0, // Set the left position as needed + top: 0, // Set the top position as needed + width: activeObject.width, // Scale the image width to match text + height: activeObject.height, // Scale the image height to match text + }); + + // Set the text object as the clipping path for the image + image.clipPath = activeObject; + + // Set the fill of the text to be transparent to only show the clipped path + activeObject.set({ fill: 'rgba(255, 255, 255, 0)' }); + + // Add the image to the canvas + canvas.add(image); + + // Render the canvas + canvas.requestAll(); + } else { + console.warn('No active text object found or active object is not of type i-text.'); + } + }; + + imgElement.onerror = () => { + console.error('Failed to load the image.'); + }; + }; + + reader.readAsDataURL(file); // Convert image file to base64 + } + }; + + return ( +
+
+ +
+
+ ); +}; + +export default AddImageText; diff --git a/src/components/EachComponent/Customization/CollapsibleComponent.jsx b/src/components/EachComponent/Customization/CollapsibleComponent.jsx new file mode 100644 index 0000000..43a48eb --- /dev/null +++ b/src/components/EachComponent/Customization/CollapsibleComponent.jsx @@ -0,0 +1,25 @@ +import { Button } from "@/components/ui/button"; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; +import { ChevronUp, ChevronDown } from "lucide-react"; +import { useState } from "react"; + +const CollapsibleComponent = ({ children, text }) => { + const [isOpen, setIsOpen] = useState(true); + return ( + + +
+

{text}

+ +
+
+ + {children} + +
+ ) +} + +export default CollapsibleComponent \ No newline at end of file diff --git a/src/components/EachComponent/Customization/FlipCustomization.jsx b/src/components/EachComponent/Customization/FlipCustomization.jsx new file mode 100644 index 0000000..461af51 --- /dev/null +++ b/src/components/EachComponent/Customization/FlipCustomization.jsx @@ -0,0 +1,74 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { Label } from '@/components/ui/label'; +import { Separator } from '@/components/ui/separator'; +import { Switch } from '@/components/ui/switch'; +import { FlipHorizontal, FlipVertical } from 'lucide-react'; +import { useContext, useEffect, useState } from 'react' + +const FlipCustomization = () => { + const { canvas } = useContext(CanvasContext); + const { activeObject } = useContext(ActiveObjectContext); + + const [isFlippedHorizontal, setIsFlippedHorizontal] = useState(false); + const [isFlippedVertical, setIsFlippedVertical] = useState(false); + + useEffect(() => { + if (activeObject) { + setIsFlippedHorizontal(activeObject.flipX || false); + setIsFlippedVertical(activeObject.flipY || false); + } + }, [activeObject]) + + useEffect(() => { + if (activeObject) { + activeObject.set({ + flipX: isFlippedHorizontal, + flipY: isFlippedVertical, + }); + canvas.renderAll(); + } + }, [isFlippedHorizontal, isFlippedVertical, activeObject, canvas]); + + const handleFlip = (direction) => { + if (direction === 'horizontal') { + setIsFlippedHorizontal(!isFlippedHorizontal); + } else { + setIsFlippedVertical(!isFlippedVertical); + } + } + + return ( +
+ +
+

Flip:

+
+
+ + +
+ handleFlip('horizontal')} + /> +
+
+
+ + +
+ handleFlip('vertical')} + /> +
+
+ +
+ ) +} + +export default FlipCustomization \ No newline at end of file diff --git a/src/components/EachComponent/Customization/ImageCustomization.jsx b/src/components/EachComponent/Customization/ImageCustomization.jsx new file mode 100644 index 0000000..f32c465 --- /dev/null +++ b/src/components/EachComponent/Customization/ImageCustomization.jsx @@ -0,0 +1,226 @@ +import { useContext, useState } from 'react' +import { ImageIcon, Wand2 } from 'lucide-react' +import { fabric } from 'fabric' +import CanvasContext from '@/components/Context/canvasContext/CanvasContext' +import { Label } from '@/components/ui/label' +import { Input } from '@/components/ui/input' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' +import { Button } from '@/components/ui/button' +import { Slider } from '@/components/ui/slider' +import { Separator } from '@/components/ui/separator' + +const ImageCustomization = () => { + const { canvas } = useContext(CanvasContext) + const [shadowColor, setShadowColor] = useState("#000000") + const [highlightColor, setHighlightColor] = useState("#ffffff") + const [blendMode, setBlendMode] = useState("multiply") + const [filterType, setFilterType] = useState("sepia") + const [filterIntensity, setFilterIntensity] = useState(0.5) + + const applyDuotoneFilter = () => { + if (!canvas) return + const activeObject = canvas.getActiveObject() + if (!activeObject || activeObject.type !== "image") { + console.warn("No active image object selected.") + return + } + activeObject.filters = [ + new fabric.Image.filters.BlendColor({ + color: shadowColor, + mode: blendMode, + }), + new fabric.Image.filters.BlendColor({ + color: highlightColor, + mode: "screen", + }), + ] + activeObject.applyFilters() + canvas.renderAll() + } + + const createFilter = (value) => { + let effect + switch (value) { + case 'sepia': + effect = new fabric.Image.filters.Sepia() + break + case 'contrast': + effect = new fabric.Image.filters.Contrast({ contrast: filterIntensity }) + break + case 'brightness': + effect = new fabric.Image.filters.Brightness({ brightness: filterIntensity }) + break + case 'grayscale': + effect = new fabric.Image.filters.Grayscale() + break + case 'invert': + effect = new fabric.Image.filters.Invert() + break + case 'blur': + effect = new fabric.Image.filters.Blur({ + blur: filterIntensity, + }) + break + case 'pixelate': + effect = new fabric.Image.filters.Pixelate({ + blocksize: filterIntensity * 10, + }) + break + case 'huerotation': + effect = new fabric.Image.filters.HueRotation({ + rotation: filterIntensity * 360, + }) + break + case 'noise': + effect = new fabric.Image.filters.Noise({ + noise: filterIntensity * 100, + }) + break + default: + effect = null + } + return effect + } + + const applyFilter = () => { + if (!canvas) return + const activeObject = canvas.getActiveObject() + if (!activeObject || activeObject.type !== "image") { + console.warn("No active image object selected.") + return + } + const filter = createFilter(filterType) + if (filter) { + activeObject.filters = [filter] + activeObject.applyFilters() + canvas.renderAll() + } + } + + const revertFilters = () => { + if (!canvas) return + const image = canvas.getActiveObject() + if (image) { + image.filters = [] + image.applyFilters() + canvas.renderAll() + } + } + + return ( +
+

Blend filter

+
+
+ +
+ setShadowColor(e.target.value)} + className="w-12 h-12 p-1 rounded-md" + /> + setShadowColor(e.target.value)} + className="flex-grow" + /> +
+
+
+ +
+ setHighlightColor(e.target.value)} + className="w-12 h-12 p-1 rounded-md" + /> + setHighlightColor(e.target.value)} + className="flex-grow" + /> +
+
+
+
+ + +
+ +
+ + +
+ +
+ +

Apply filter

+
+
+ + +
+
+ + setFilterIntensity(value)} + /> +
+
+ + +
+
+
+
+ ) +} + +export default ImageCustomization + diff --git a/src/components/EachComponent/Customization/OpacityCustomization.jsx b/src/components/EachComponent/Customization/OpacityCustomization.jsx new file mode 100644 index 0000000..e8d3c04 --- /dev/null +++ b/src/components/EachComponent/Customization/OpacityCustomization.jsx @@ -0,0 +1,46 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { Label } from '@/components/ui/label'; +import { Slider } from '@/components/ui/slider'; +import { useContext, useEffect, useState } from 'react' + +const OpacityCustomization = () => { + const { activeObject } = useContext(ActiveObjectContext); + const { canvas } = useContext(CanvasContext); + + const [opacity, setOpacity] = useState(0); + + useEffect(() => { + if (activeObject) { + setOpacity(activeObject?.opacity); + } + }, [activeObject]) + + const adjustBackgroundOpacity = (value) => { + setOpacity(value); + if (activeObject) { + activeObject.set("opacity", opacity); // Update the opacity + canvas.renderAll(); // Re-render the canvas + } + }; + + return ( +
+ + { + const newOpacity = value[0]; // Extract slider value + adjustBackgroundOpacity(newOpacity); // Adjust Fabric.js background opacity + }} + /> +
+ ) +} + +export default OpacityCustomization \ No newline at end of file diff --git a/src/components/EachComponent/Customization/PositionCustomization.jsx b/src/components/EachComponent/Customization/PositionCustomization.jsx new file mode 100644 index 0000000..ce66f7a --- /dev/null +++ b/src/components/EachComponent/Customization/PositionCustomization.jsx @@ -0,0 +1,162 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { Card, CardContent } from '@/components/ui/card'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Slider } from '@/components/ui/slider'; +import { useContext, useEffect, useState } from 'react'; +import { ArrowUp, ArrowDown, ArrowLeft, ArrowRight, ChevronUp, ChevronDown } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; +import CollapsibleComponent from './CollapsibleComponent'; + +const PositionCustomization = () => { + const { canvas } = useContext(CanvasContext) + const { activeObject } = useContext(ActiveObjectContext) + + const [objectPosition, setObjectPosition] = useState({ left: 50, top: 50 }) + + const [isOpen, setIsOpen] = useState(true); + + useEffect(() => { + if (activeObject) { + setObjectPosition({ + left: Math.round(activeObject.left || 0), + top: Math.round(activeObject.top || 0), + }) + } + }, [activeObject]) + + const updateObjectPosition = (key, value) => { + const updatedPosition = { ...objectPosition, [key]: value } + setObjectPosition(updatedPosition) + + if (canvas && activeObject) { + activeObject.set(updatedPosition) + canvas.renderAll() + } + } + + const handleInputChange = (key, value) => { + const numValue = parseInt(value, 10) + if (!isNaN(numValue)) { + updateObjectPosition(key, numValue) + } + } + + const handleSliderChange = (key, value) => { + updateObjectPosition(key, value[0]) + } + + const adjustPosition = (key, delta) => { + const newValue = objectPosition[key] + delta + updateObjectPosition(key, newValue) + } + + const content = () => { + return ( + +
+
+ +
+ handleInputChange('left', e.target.value)} + className="w-20" + /> + handleSliderChange('left', value)} + className="flex-grow" + /> +
+
+
+ +
+ handleInputChange('top', e.target.value)} + className="w-20" + /> + handleSliderChange('top', value)} + className="flex-grow" + /> +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ ) + } + + return ( + + + {content()} + + + ) +} + +export default PositionCustomization \ No newline at end of file diff --git a/src/components/EachComponent/Customization/RotateCustomization.jsx b/src/components/EachComponent/Customization/RotateCustomization.jsx new file mode 100644 index 0000000..5b61999 --- /dev/null +++ b/src/components/EachComponent/Customization/RotateCustomization.jsx @@ -0,0 +1,44 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { Label } from '@/components/ui/label'; +import { Slider } from '@/components/ui/slider'; +import { useContext, useState, useEffect } from 'react' + +const RotateCustomization = () => { + const { canvas } = useContext(CanvasContext); + const { activeObject } = useContext(ActiveObjectContext); + + const [rotationAngle, setRotationAngle] = useState(0); + + useEffect(() => { + if (activeObject) { + setRotationAngle(activeObject?.angle) + } + }, [activeObject]) + + const handleRotation = (e) => { + activeObject.set({ angle: e }); + setRotationAngle(e); + canvas.remove(activeObject); + canvas.add(activeObject); + canvas.setActiveObject(activeObject); + canvas.renderAll(); + } + + return ( +
+ + + handleRotation(value[0]) + } + /> +
+ ); +}; + +export default RotateCustomization \ No newline at end of file diff --git a/src/components/EachComponent/Customization/ScaleObjects.jsx b/src/components/EachComponent/Customization/ScaleObjects.jsx new file mode 100644 index 0000000..f7117be --- /dev/null +++ b/src/components/EachComponent/Customization/ScaleObjects.jsx @@ -0,0 +1,94 @@ +import ActiveObjectContext from "@/components/Context/activeObject/ObjectContext"; +import CanvasContext from "@/components/Context/canvasContext/CanvasContext"; +import { Card } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { useContext, useEffect, useState } from "react"; +import CollapsibleComponent from "./CollapsibleComponent"; + +const ScaleObjects = () => { + const { canvas } = useContext(CanvasContext); // Access Fabric.js canvas from context + const { activeObject } = useContext(ActiveObjectContext); + const [scaleX, setScaleX] = useState(1); + const [scaleY, setScaleY] = useState(1); + + useEffect(() => { + if (activeObject) { + setScaleX(activeObject?.scaleX); + setScaleY(activeObject?.scaleY); + } + }, [activeObject]) + + // Handle scaleX changes + const handleScaleXChange = (value) => { + const newScaleX = Math.max(0.001, Math.min(value)); // Clamp scaleX between 0.001 and 3 + setScaleX(newScaleX); + if (canvas && activeObject) { + activeObject.scaleX = newScaleX; + canvas.discardActiveObject(); + canvas.setActiveObject(activeObject); + canvas.renderAll(); // Re-render the canvas + } + }; + + // Handle scaleY changes + const handleScaleYChange = (value) => { + const newScaleY = Math.max(0.001, Math.min(value)); // Clamp scaleY between 0.001 and 3 + setScaleY(newScaleY); + if (canvas && activeObject) { + activeObject.scaleY = newScaleY; + canvas.discardActiveObject(); + canvas.setActiveObject(activeObject); + canvas.renderAll(); // Re-render the canvas + } + }; + + const content = () => { + return ( +
+ {/* Scale X Input */} +
+ + { + const inputValue = parseFloat(e.target.value); + if (!isNaN(inputValue)) { + handleScaleXChange(inputValue); + } + }} + /> +
+ + {/* Scale Y Input */} +
+ + { + const inputValue = parseFloat(e.target.value); + if (!isNaN(inputValue)) { + handleScaleYChange(inputValue); + } + }} + /> +
+
+ ) + } + + return ( + + + {content()} + + + ); +}; + +export default ScaleObjects; diff --git a/src/components/EachComponent/Customization/ShadowCustomization.jsx b/src/components/EachComponent/Customization/ShadowCustomization.jsx new file mode 100644 index 0000000..0c3dafb --- /dev/null +++ b/src/components/EachComponent/Customization/ShadowCustomization.jsx @@ -0,0 +1,143 @@ +import ActiveObjectContext from "@/components/Context/activeObject/ObjectContext"; +import CanvasContext from "@/components/Context/canvasContext/CanvasContext"; +import { Button } from "@/components/ui/button"; +import { Card } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Slider } from "@/components/ui/slider"; +import { useContext, useEffect, useState } from "react"; +import CollapsibleComponent from "./CollapsibleComponent"; + +const ShadowCustomization = () => { + // get values from context + const { activeObject } = useContext(ActiveObjectContext); + const { canvas } = useContext(CanvasContext); + + // state to handle shadow inputs + const [shadowColor, setShadowColor] = useState(""); + const [offsetX, setOffsetX] = useState(5); + const [offsetY, setOffsetY] = useState(5); + const [blur, setBlur] = useState(0.5); + const [opacity, setOpacity] = useState(0.5); + + useEffect(() => { + if (activeObject) { + setShadowColor(activeObject?.shadow?.color || "#ffffff"); + setOffsetX(activeObject?.shadow?.offsetX || 5); + setOffsetY(activeObject?.shadow?.offsetY || 5); + setBlur(activeObject?.shadow?.blur || 0.5); + setOpacity(activeObject?.shadow?.opacity || 0.5); + } + }, [activeObject]) + + const handleApplyShadow = () => { + if (activeObject && canvas) { + const shadow = { + color: shadowColor, + blur: blur, + offsetX: offsetX, + offsetY: offsetY, + opacity: opacity, + }; + activeObject.set("shadow", shadow); + // Ensure object updates and renders + activeObject.dirty = true; // Mark the object as dirty for re-render + canvas.renderAll(); // Trigger canvas re-render + } + } + + const handleDisableShadow = () => { + if (activeObject && canvas) { + activeObject.set("shadow", null) + canvas.renderAll() + } + } + + const content = () => { + return ( +
+
+
+ +
+ setShadowColor(e.target.value)} + className="w-16 h-10" + /> + {shadowColor} +
+
+ +
+ + setOffsetX(value[0])} + max={50} + min={-50} + step={1} + /> +
+ +
+ + setOffsetY(value[0])} + max={50} + min={-50} + step={1} + /> +
+ +
+ + setBlur(value[0])} + max={50} + min={0} + step={1} + /> +
+ +
+ + setOpacity(value[0])} + max={1} + min={0} + step={0.1} + /> +
+
+ +
+ A +
+ +
+ + +
+
+ ) + } + + return ( + + + {content()} + + + ); +}; + +export default ShadowCustomization; + diff --git a/src/components/EachComponent/Customization/SkewCustomization.jsx b/src/components/EachComponent/Customization/SkewCustomization.jsx new file mode 100644 index 0000000..092fe12 --- /dev/null +++ b/src/components/EachComponent/Customization/SkewCustomization.jsx @@ -0,0 +1,85 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { Card } from '@/components/ui/card'; +import { Label } from '@/components/ui/label'; +import { Slider } from '@/components/ui/slider'; +import { useContext, useEffect, useState } from 'react' +import CollapsibleComponent from './CollapsibleComponent'; + +const SkewCustomization = () => { + const { canvas } = useContext(CanvasContext); + const { activeObject } = useContext(ActiveObjectContext); + const [skewX, setSkewX] = useState(0); + const [skewY, setSkewY] = useState(0); + + useEffect(() => { + if (activeObject) { + setSkewX(activeObject?.skewX); + setSkewY(activeObject?.skewY); + } + }, [activeObject]) + + // Update skewX directly + const handleSkewXChange = (value) => { + setSkewX(value[0]); + if (activeObject && canvas) { + activeObject.set({ skewX: value[0] }); + canvas.discardActiveObject(); + canvas.setActiveObject(activeObject); + canvas.renderAll(); + } + }; + + // Update skewY directly + const handleSkewYChange = (value) => { + setSkewY(value[0]); + if (activeObject && canvas) { + activeObject.set({ skewY: value[0] }); + canvas.discardActiveObject(); + canvas.setActiveObject(activeObject); + canvas.renderAll(); + } + }; + + const content = () => { + return ( +
+
+ + { + handleSkewXChange(value) + }} + /> +
+ +
+ + { + handleSkewYChange(value) + }} + /> +
+
+ ) + } + + return ( + + + {content()} + + + ) +} + +export default SkewCustomization \ No newline at end of file diff --git a/src/components/EachComponent/Customization/StrokeCustomization.jsx b/src/components/EachComponent/Customization/StrokeCustomization.jsx new file mode 100644 index 0000000..6bfecba --- /dev/null +++ b/src/components/EachComponent/Customization/StrokeCustomization.jsx @@ -0,0 +1,367 @@ +import { useContext, useState, useRef, useEffect } from 'react' +import { fabric } from 'fabric' +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext' +import CanvasContext from '@/components/Context/canvasContext/CanvasContext' +import { Card, CardContent } from '@/components/ui/card' +import { Label } from '@/components/ui/label' +import { Input } from '@/components/ui/input' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' +import { Slider } from '@/components/ui/slider' +import { Button } from '@/components/ui/button' +import { Paintbrush, ContrastIcon as Gradient } from 'lucide-react' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import CollapsibleComponent from './CollapsibleComponent' + +const StrokeCustomization = () => { + const { activeObject } = useContext(ActiveObjectContext); + const { canvas } = useContext(CanvasContext); + const previewRef = useRef(null); + + const [strokeWidth, setStrokeWidth] = useState(0); + const [strokeColor, setStrokeColor] = useState("#000000"); + const [gradientStrokeColors, setGradientStrokeColors] = useState({ + color1: "#f97316", + color2: "#e26286", + }); + const [colorType, setColorType] = useState("color"); + const [gradientDirection, setGradientDirection] = useState("to bottom"); + + + // Utility function to handle styles of objects + const handleObjectStyle = (object) => { + // Determine fill type (solid or gradient) + if (object.stroke) { + if (typeof object.stroke === "string") { + setColorType("color"); + setStrokeColor(object.stroke); // Solid color fill + } else if (object.stroke.colorStops) { + setColorType("gradient"); + setGradientStrokeColors({ + color1: object.stroke.colorStops[0]?.color || "#f97316", + color2: object.stroke.colorStops[1]?.color || "#e26286", + }); + } + } + // Handle stroke width + if (object.strokeWidth) { + setStrokeWidth(object.strokeWidth || 0); + } + }; + + // Recursively process group objects + const processGroupObjects = (group) => { + group._objects.forEach((obj) => { + if (obj.type === "group") { + processGroupObjects(obj); // Handle nested groups + } else { + handleObjectStyle(obj); // Apply styles to each object + } + }); + }; + + // Effect to get previous values from active object + useEffect(() => { + if (activeObject) { + if (activeObject.type === "group") { + processGroupObjects(activeObject); // Process grouped objects + } else { + handleObjectStyle(activeObject); // Process single object + } + } + }, [activeObject]); + + const updatePreview = () => { + if (!previewRef.current) return; + + const previewStyle = { + width: '80px', + height: '80px', + border: `${strokeWidth}px solid`, + borderRadius: '4px', + }; + + if (colorType === "color") { + previewStyle.borderColor = strokeColor; + } else { + previewStyle.borderImage = `linear-gradient(${gradientDirection}, ${gradientStrokeColors.color1}, ${gradientStrokeColors.color2}) 1`; + } + + Object.assign(previewRef.current.style, previewStyle); + }; + + useEffect(() => { + updatePreview(); + }, [strokeWidth, strokeColor, gradientStrokeColors, colorType, gradientDirection]); + + const handleStrokeWidthChange = (value) => { + setStrokeWidth(value); + }; + + const handleColorTypeChange = (type) => { + setColorType(type); + }; + + const handleStrokeColorChange = (e) => { + setStrokeColor(e.target.value); + }; + + const handleGradientColorChange = (key, e) => { + setGradientStrokeColors(prev => ({ ...prev, [key]: e.target.value })); + }; + + const applyStrokeStyle = () => { + if (!activeObject || activeObject.type === "line") return; + + const width = activeObject?.width || 0; + const height = activeObject?.height || 0; + + const coords = { + "to bottom": { x1: 0, y1: 0, x2: 0, y2: height }, + "to top": { x1: 0, y1: height, x2: 0, y2: 0 }, + "to right": { x1: 0, y1: 0, x2: width, y2: 0 }, + "to left": { x1: width, y1: 0, x2: 0, y2: 0 }, + }; + const directionCoords = coords[gradientDirection]; + + const applyStrokeStyle = (object) => { + object.set("strokeWidth", strokeWidth); + + if (colorType === "color") { + object.set("stroke", strokeColor); + } else if (colorType === "gradient") { + const gradient = new fabric.Gradient({ + type: "linear", + gradientUnits: "pixels", + coords: directionCoords, + colorStops: [ + { offset: 0, color: gradientStrokeColors.color1 }, + { offset: 1, color: gradientStrokeColors.color2 }, + ], + }); + object.set("stroke", gradient); + } + }; + + const processGroupObjects = (group) => { + group._objects.forEach((obj) => { + if (obj.type === "group") { + processGroupObjects(obj); + } else { + applyStrokeStyle(obj); + } + }); + }; + + if (activeObject.type === "group") { + processGroupObjects(activeObject); + } else { + applyStrokeStyle(activeObject); + } + + canvas.renderAll(); + }; + + const revertStroke = () => { + if (!activeObject) return; + + const revertObject = (object) => { + object.set("strokeWidth", 0); + object.set("stroke", null); + }; + + const processGroupObjects = (group) => { + group._objects.forEach((obj) => { + if (obj.type === "group") { + processGroupObjects(obj); + } else { + revertObject(obj); + } + }); + }; + + if (activeObject.type === "group") { + processGroupObjects(activeObject); + } else { + revertObject(activeObject); + } + + canvas.renderAll(); + }; + + const content = () => { + return ( + +
+
+ +
+ handleStrokeWidthChange(value)} + className="flex-grow" + /> + handleStrokeWidthChange(Number(e.target.value))} + className="w-16" + /> +
+
+ +
+ handleColorTypeChange(value)}> + + + + Solid + + + + Gradient + + + +
+ +
+
+ +
+
+ +
+
+
+ +
+ + +
+ +
+ +
+
+ handleGradientColorChange('color1', e)} + className="w-10 h-10 p-1 rounded-md cursor-pointer" + /> +
+
+ handleGradientColorChange('color1', e)} + className="flex-grow" + /> +
+
+ +
+ +
+
+ handleGradientColorChange('color2', e)} + className="w-10 h-10 p-1 rounded-md cursor-pointer" + /> +
+
+ handleGradientColorChange('color2', e)} + className="flex-grow" + /> +
+
+
+
+
+ +
+ +
+
+
+
+ +
+ + +
+
+
+ ) + } + + return ( + + + {content()} + + + ); +}; + +export default StrokeCustomization; + + + + + + + + + + + + + diff --git a/src/components/EachComponent/Customization/TextCustomization.jsx b/src/components/EachComponent/Customization/TextCustomization.jsx new file mode 100644 index 0000000..529ab99 --- /dev/null +++ b/src/components/EachComponent/Customization/TextCustomization.jsx @@ -0,0 +1,280 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import { Button } from '@/components/ui/button'; +import { Card, CardContent } from '@/components/ui/card'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Slider } from '@/components/ui/slider'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { useContext, useEffect, useState } from 'react' +import { AlignLeft, AlignCenter, AlignRight, Bold, Italic, Underline, Strikethrough } from "lucide-react"; +import CollapsibleComponent from './CollapsibleComponent'; + +const fonts = [ + 'Roboto', 'Open Sans', 'Lato', 'Montserrat', 'Raleway', 'Poppins', 'Merriweather', + 'Playfair Display', 'Nunito', 'Oswald', 'Source Sans Pro', 'Ubuntu', 'Noto Sans', + 'Work Sans', 'Bebas Neue', 'Arimo', 'PT Sans', 'PT Serif', 'Titillium Web', + 'Fira Sans', 'Karla', 'Josefin Sans', 'Cairo', 'Rubik', 'Mulish', 'IBM Plex Sans', + 'Quicksand', 'Cabin', 'Heebo', 'Exo 2', 'Manrope', 'Jost', 'Anton', 'Asap', + 'Baloo 2', 'Barlow', 'Cantarell', 'Chivo', 'Inter', 'Dosis', 'Crimson Text', + 'Amatic SC', 'ABeeZee', 'Raleway Dots', 'Pacifico', 'Orbitron', 'Varela Round', + 'Acme', 'Teko', +]; + +const TextCustomization = () => { + // get values from context + const { activeObject } = useContext(ActiveObjectContext); + const { canvas } = useContext(CanvasContext); + + const [text, setText] = useState(''); + const [fontFamily, setFontFamily] = useState('Arial'); + const [fontSize, setFontSize] = useState(20); + const [fontStyle, setFontStyle] = useState('normal'); + const [fontWeight, setFontWeight] = useState('normal'); + const [lineHeight, setLineHeight] = useState(1.16); + const [charSpacing, setCharSpacing] = useState(0); + const [underline, setUnderline] = useState(false); + const [linethrough, setLinethrough] = useState(false); + const [textAlign, setTextAlign] = useState('left'); + + useEffect(() => { + if (activeObject?.type === "i-text") { + setText(activeObject?.text || ''); + setFontFamily(activeObject?.fontFamily || 'Arial'); + setFontSize(activeObject?.fontSize || 20); + setFontStyle(activeObject?.fontStyle || 'normal'); + setFontWeight(activeObject?.fontWeight || 'normal'); + setLineHeight(activeObject?.lineHeight || 1.16); + setCharSpacing(activeObject?.charSpacing || 0); + setUnderline(activeObject?.underline || false); + setLinethrough(activeObject?.linethrough || false); + setTextAlign(activeObject?.textAlign || 'left'); + } + }, [activeObject]) + + const updateActiveObject = (properties) => { + if (activeObject?.type === "i-text") { + activeObject.set(properties) + canvas?.renderAll() + } + } + + const handleTextChange = (newText) => { + setText(newText) + updateActiveObject({ text: newText }) + } + + const handleFontFamilyChange = (newFontFamily) => { + setFontFamily(newFontFamily) + updateActiveObject({ fontFamily: newFontFamily }) + } + + const handleFontSizeChange = (newFontSize) => { + setFontSize(newFontSize) + updateActiveObject({ fontSize: newFontSize }) + } + + const handleTextAlignChange = (newTextAlign) => { + setTextAlign(newTextAlign) + updateActiveObject({ textAlign: newTextAlign }) + } + + const handleFontStyleChange = () => { + const newFontStyle = fontStyle === 'normal' ? 'italic' : 'normal' + setFontStyle(newFontStyle) + updateActiveObject({ fontStyle: newFontStyle }) + } + + const handleFontWeightChange = () => { + const newFontWeight = fontWeight === 'normal' ? 'bold' : 'normal' + setFontWeight(newFontWeight) + updateActiveObject({ fontWeight: newFontWeight }) + } + + const handleLineHeightChange = (newLineHeight) => { + setLineHeight(newLineHeight) + updateActiveObject({ lineHeight: newLineHeight }) + } + + const handleCharSpacingChange = (newCharSpacing) => { + setCharSpacing(newCharSpacing) + updateActiveObject({ charSpacing: newCharSpacing }) + } + + const handleUnderlineChange = () => { + const newUnderline = !underline + setUnderline(newUnderline) + updateActiveObject({ underline: newUnderline }) + } + + const handleLinethroughChange = () => { + const newLinethrough = !linethrough + setLinethrough(newLinethrough) + updateActiveObject({ linethrough: newLinethrough }) + } + + const content = () => { + if (!(activeObject?.type === "i-text")) { + return ( +
+ + +

Select a text object to customize

+
+
+
+ ) + } + + else { + return ( + + + + Text + Style + + +
+ + handleTextChange(e.target.value)} + /> +
+
+ + +
+
+ +
+ handleFontSizeChange(value)} + min={8} + max={72} + step={1} + className="flex-grow" + /> + handleFontSizeChange(parseInt(e.target.value, 10) || 16)} + className="w-16" + /> +
+
+
+ +
+ +
+ + + +
+
+
+ +
+ + + + +
+
+
+ + handleLineHeightChange(value)} + min={0.5} + max={3} + step={0.1} + /> +
+
+ + handleCharSpacingChange(value)} + min={-20} + max={100} + step={1} + /> +
+
+
+
+ ) + } + } + + return ( + + + {content()} + + + ) +} + +export default TextCustomization \ No newline at end of file diff --git a/src/components/EachComponent/CustomizeShape.jsx b/src/components/EachComponent/CustomizeShape.jsx new file mode 100644 index 0000000..0e79862 --- /dev/null +++ b/src/components/EachComponent/CustomizeShape.jsx @@ -0,0 +1,86 @@ +import { Separator } from '../ui/separator'; +import FlipCustomization from './Customization/FlipCustomization'; +import RotateCustomization from './Customization/RotateCustomization'; +import SkewCustomization from './Customization/SkewCustomization'; +import ShadowCustomization from './Customization/ShadowCustomization'; +import TextCustomization from './Customization/TextCustomization'; +import AddImageIntoShape from './Customization/AddImageIntoShape'; +import ScaleObjects from './Customization/ScaleObjects'; +import ApplyColor from './ApplyColor'; +import OpacityCustomization from './Customization/OpacityCustomization'; +import StrokeCustomization from './Customization/StrokeCustomization'; +import { useContext } from 'react'; +import CanvasContext from '../Context/canvasContext/CanvasContext'; +import { Card } from '../ui/card'; +import PositionCustomization from './Customization/PositionCustomization'; +import CollapsibleComponent from './Customization/CollapsibleComponent'; +import ImageCustomization from './Customization/ImageCustomization'; + +const CustomizeShape = () => { + const { canvas } = useContext(CanvasContext); + const activeObject = canvas?.getActiveObject(); + const activeObjectType = activeObject?.type; + const hasClipPath = !!activeObject?.clipPath; + const customClipPath = activeObject?.isClipPath; + + // Return message if no active object is selected + if (!activeObject) { + return

No active object found

; + } + + return ( +
+ {/* Apply fill and background color */} + {(!hasClipPath && activeObjectType !== 'group' && !customClipPath) && } + + {/* Apply stroke and stroke color */} + {(activeObjectType !== 'group' && !customClipPath) && <>} + + + + + {/* Controls for opacity, flip, and rotation */} + + +
+ + + +
+
+
+ + + {/* Skew Customization */} + + + + {/* Scale Objects */} + + + + {/* Shadow Customization */} + {activeObjectType !== 'group' && } + + + {/* Text Customization */} + {activeObjectType === 'text' && } + + + {/* Add image into shape */} + + + + {/* Image Customization */} + {(activeObjectType === 'image' || hasClipPath) && ( + + + + + + )} +
+ ) +} + +export default CustomizeShape \ No newline at end of file diff --git a/src/components/EachComponent/Icons/AllIcons.jsx b/src/components/EachComponent/Icons/AllIcons.jsx new file mode 100644 index 0000000..b7a8a87 --- /dev/null +++ b/src/components/EachComponent/Icons/AllIcons.jsx @@ -0,0 +1,128 @@ +import { useContext, useState } from "react"; +import { FixedSizeGrid as Grid } from "react-window"; +import { Card, CardTitle } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import * as lucideIcons from "lucide-react"; +import CanvasContext from "@/components/Context/canvasContext/CanvasContext"; +import { fabric } from 'fabric'; +import ActiveObjectContext from "@/components/Context/activeObject/ObjectContext"; + +const AllIconsPage = () => { + const [search, setSearch] = useState(""); + const { canvas } = useContext(CanvasContext); + const { setActiveObject } = useContext(ActiveObjectContext); + + // Assume icons is already defined as shown previously, and filtered is created based on the search query + const icons = Object.entries(lucideIcons)?.filter(([name, Icon]) => + !name.includes("Icon") && Icon?.$$typeof + ); + + const filtered = icons.filter(([name, Icon]) => + name.toLowerCase().includes(search.toLowerCase()) + ); + + const handleSearch = (e) => { + setSearch(e.target.value); + }; + + const handleIcon = (e) => { + // Check if the target is an SVG or path + if (e.target.tagName.toLowerCase() === 'svg') { + // Serialize the SVG element to a string and pass it + const svgString = new XMLSerializer().serializeToString(e.target); + handleAddIcon(svgString); + } else { + window.alert('The target is a path element! Select the full icon.'); + } + }; + + const handleAddIcon = (svgString) => { + if (!canvas) { + console.error("Canvas is not initialized."); + return; + } + + if (!svgString) { + console.error("Failed to retrieve SVG string from the icon."); + return; + } + + fabric.loadSVGFromString(svgString, (objects, options) => { + if (!objects || !options) { + console.error("Failed to parse SVG."); + return; + } + + // Recursively set fill color for all objects + const setFillColor = (obj, color) => { + if (obj.type === 'group' && obj._objects) { + obj._objects.forEach((child) => setFillColor(child, color)); + } else { + obj.set('stroke', color); + } + }; + + objects.forEach((obj) => setFillColor(obj, '#FFA500')); // Set fill color to orange + + const iconGroup = fabric.util.groupSVGElements(objects, options); + iconGroup.set({ + left: 100, + top: 100, + originX: 'center', + originY: 'center', + scaleX: 6, + scaleY: 6, + }); + + canvas.add(iconGroup); + canvas.setActiveObject(iconGroup); + setActiveObject(iconGroup); + canvas.renderAll(); + }); + }; + + // Cell component for rendering each icon + const Cell = ({ columnIndex, rowIndex, style }) => { + const index = rowIndex * 3 + columnIndex; // Adjust columns as needed (3 columns in this case) + if (index >= filtered.length) return null; // Handle out-of-bounds index + const [name, Icon] = filtered[index]; + // Define cell-specific styles + return ( +
+
+ +

{name}

+
+
+ ); + }; + + return ( + + All Icons + + + + {Cell} + + + + ) +}; + +export default AllIconsPage; + + diff --git a/src/components/EachComponent/RoundedShapes/RoundedShape.jsx b/src/components/EachComponent/RoundedShapes/RoundedShape.jsx new file mode 100644 index 0000000..bcb23ba --- /dev/null +++ b/src/components/EachComponent/RoundedShapes/RoundedShape.jsx @@ -0,0 +1,87 @@ +import React, { useContext } from 'react' +import { ArrowBigRight, Diamond, Hexagon, Octagon, Pentagon, Sparkle, Square, Star, Triangle } from 'lucide-react' +import ReactDOMServer from "react-dom/server"; +import { fabric } from 'fabric'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import { Card } from '@/components/ui/card'; +import { Separator } from '@/components/ui/separator'; + +const RoundedShape = () => { + const { canvas } = useContext(CanvasContext); + const { setActiveObject } = useContext(ActiveObjectContext); + + const shapes = [ + { icon: , name: 'Arrow' }, + { icon: , name: 'Diamond' }, + { icon: , name: 'Hexagon' }, + { icon: , name: 'Octagon' }, + { icon: , name: 'Pentagon' }, + { icon: , name: 'Sparkle' }, + { icon: , name: 'Square' }, + { icon: , name: 'Star' }, + { icon: , name: 'Triangle' }, + ]; + + const addObject = (icon) => { + if (!canvas) { + console.error("Canvas is not initialized."); + return; + } + const svgString = ReactDOMServer.renderToStaticMarkup(icon); + + if (!svgString) { + console.error("Failed to retrieve SVG string from icon."); + return; + } + // Load SVG onto the Fabric.js canvas + fabric.loadSVGFromString(svgString, (objects, options) => { + if (!objects || !options) { + console.error("Failed to parse SVG."); + return; + } + + const iconGroup = fabric.util.groupSVGElements(objects, options); + iconGroup.set({ + left: canvas.width / 2, + top: canvas.height / 2, + originX: 'center', + originY: 'center', + fill: "#f09b0a", + scaleX: 6, + scaleY: 6, + strokeWidth: 0, + // rx: 0, + // x: 0, + // y: 0, + }); + canvas.add(iconGroup); + canvas.setActiveObject(iconGroup); + setActiveObject(iconGroup) + canvas.renderAll(); + }); + }; + + return ( + +

Rounded Shapes

+ +
+ {shapes.map((shape, index) => ( + + ))} +
+
+ ) +} + +export default RoundedShape \ No newline at end of file diff --git a/src/components/EachComponent/Shapes/PlainShapes.jsx b/src/components/EachComponent/Shapes/PlainShapes.jsx new file mode 100644 index 0000000..87a17c2 --- /dev/null +++ b/src/components/EachComponent/Shapes/PlainShapes.jsx @@ -0,0 +1,174 @@ +import ActiveObjectContext from '@/components/Context/activeObject/ObjectContext'; +import CanvasContext from '@/components/Context/canvasContext/CanvasContext'; +import React, { useContext } from 'react' +import ReactDOMServer from "react-dom/server"; +import { fabric } from 'fabric'; +import { Card } from '@/components/ui/card'; +import { Separator } from '@/components/ui/separator'; +import { Badge, Circle, Heart, Shield } from 'lucide-react'; + +const PlainShapes = () => { + const { canvas } = useContext(CanvasContext); + const { setActiveObject } = useContext(ActiveObjectContext); + + const shapes = [ + { + icon: + + , name: 'Arrow' + }, + + { icon: , name: 'Badge' }, + { icon: , name: 'Circle' }, + + { icon: , name: 'Club' }, + + { + icon: + + , name: 'Cross' + }, + + { + icon: + + , name: 'Diamond' + }, + + { icon: , name: 'Heart' }, + + { + icon: + + , name: 'Hexagon' + }, + + { + icon: + + , name: 'Line' + }, + + { + icon: + + , name: 'Octagon' + }, + + { + icon: + + , name: 'Pentagon' + }, + + { + icon: + + , name: 'Rectangle' + }, + + { + icon: + + , name: 'Right Triangle' + }, + + + { + icon: , name: 'Shield' + }, + + { + icon: + + , name: 'Rectangle Square' + }, + + + { + icon: + + , name: 'Star' + }, + + { + icon: + + , name: 'Triangle' + }, + + { + icon: + + , name: 'Rectangle Vertical' + }, + + ]; + + const addObject = (icon, name) => { + if (!canvas) { + console.error("Canvas is not initialized."); + return; + } + + const svgString = ReactDOMServer.renderToStaticMarkup(icon); + + if (!svgString) { + console.error("Failed to retrieve SVG string from icon."); + return; + } + // Load SVG onto the Fabric.js canvas + fabric.loadSVGFromString(svgString, (objects, options) => { + if (!objects || !options) { + console.error("Failed to parse SVG."); + return; + } + const iconGroup = fabric.util.groupSVGElements(objects, options); + iconGroup.set({ + left: canvas.width / 2, + top: canvas.height / 2, + originX: 'center', + originY: 'center', + fill: "#f09b0a", + scaleX: 6, + scaleY: 6, + strokeWidth: 0, + // rx: 0, + // x: 0, + // y: 0, + }); + if (name === "Line") { + iconGroup.set({ + strokeWidth: 2, + }) + } + canvas.add(iconGroup); + canvas.setActiveObject(iconGroup); + setActiveObject(iconGroup) + canvas.renderAll(); + }); + }; + + return ( + +

Plain Shapes

+ +
+ {shapes.map((shape, index) => ( + + ))} +
+
+ ) +} + +export default PlainShapes \ No newline at end of file diff --git a/src/components/EachComponent/UploadImage.jsx b/src/components/EachComponent/UploadImage.jsx new file mode 100644 index 0000000..8956a48 --- /dev/null +++ b/src/components/EachComponent/UploadImage.jsx @@ -0,0 +1,267 @@ +import { useContext, useRef, useState } from 'react' +import CanvasContext from '../Context/canvasContext/CanvasContext' +import { Button } from '@/components/ui/button' +import { fabric } from 'fabric' +import { ImageIcon, Trash2 } from 'lucide-react' +import { Label } from '@/components/ui/label' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' +import Resizer from "react-image-file-resizer" +import { Slider } from '@/components/ui/slider' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' +import { useDropzone } from 'react-dropzone' +import ImageCustomization from './Customization/ImageCustomization' +import { Separator } from '../ui/separator' +import ActiveObjectContext from '../Context/activeObject/ObjectContext' + +const UploadImage = () => { + const { canvas } = useContext(CanvasContext); + const [width, setWidth] = useState(1080); + const [height, setHeight] = useState(1080); + const [quality, setQuality] = useState(100); + const [rotation, setRotation] = useState("0"); + const [format, setFormat] = useState('JPEG'); + const fileInputRef = useRef(null); + + const { setActiveObject } = useContext(ActiveObjectContext); + + const [file, setFile] = useState(null); + const [preview, setPreview] = useState(null); + + const { getRootProps, getInputProps, isDragActive } = useDropzone({ + accept: { + 'image/*': ['.jpeg', '.png', '.gif', '.jpg', '.webp', '.svg'] + }, + // maxSize: 5 * 1024 * 1024, // 5MB max file size + multiple: false, + onDrop: (acceptedFiles) => { + if (!acceptedFiles.length) { + console.error("No files were dropped."); + return; + } + const selectedFile = acceptedFiles[0]; + // Create a preview URL + const blobUrl = URL.createObjectURL(selectedFile); + setFile(selectedFile); + setPreview(blobUrl); + + if (selectedFile.type === "image/svg+xml") { + addImageToCanvas(selectedFile); + URL.revokeObjectURL(blobUrl); + } else { + const imgElement = new Image(); + imgElement.src = blobUrl; + + imgElement.onload = () => { + if (imgElement.width > 1080) { + handleResize(selectedFile, (compressedFile) => { + addImageToCanvas(compressedFile); + }); + } else { + addImageToCanvas(selectedFile); + } + URL.revokeObjectURL(blobUrl); // Clean up + }; + + imgElement.onerror = () => { + console.error("Failed to load image."); + URL.revokeObjectURL(blobUrl); // Clean up + }; + } + } + }); + + const removeFile = () => { + // Revoke the object URL to free up memory + if (preview) { + URL.revokeObjectURL(preview) + } + setFile(null) + setPreview(null) + if (fileInputRef.current) { + fileInputRef.current.value = "" + } + } + + const handleResize = (file, callback) => { + Resizer.imageFileResizer( + file, + width, + height, + format, + quality, + parseInt(rotation), + (resizedFile) => { + callback(resizedFile) + }, + 'file', + ) + } + + const addImageToCanvas = (file) => { + const blobUrl = URL.createObjectURL(file) + fabric.Image.fromURL(blobUrl, (img) => { + img.set({ + left: canvas.width / 4, + top: canvas.height / 4, + scaleX: 0.5, + scaleY: 0.5, + }) + canvas.add(img) + canvas.setActiveObject(img); + // Update the active object state + setActiveObject(img); + canvas.renderAll(); + URL.revokeObjectURL(blobUrl); + }) + } + + return ( + + + Image Upload & Editing + Upload, resize, and apply effects to your images + + + + + Upload + Effects + + + {/* Uploads */} + +
+
+
+ + setWidth(value[0])} + /> +
+
+ + setHeight(value[0])} + /> +
+
+ {format === "JPEG" && ( +
+ + setQuality(value[0])} + /> +
+ )} + +
+
+ + +
+
+ + +
+
+ + {/* upload image */} +
+ + +
+ +
+ +

+ {isDragActive + ? 'Drop file here' + : 'Drag \'n\' drop an image, or click to select a file' + } +

+

+ (Max 5MB, image files only) +

+
+
+ + {preview && ( +
+
+ Uploaded image + +
+ {file?.name} + +
+
+
+ )} +
+
+
+ +
+
+ + {/* Effects */} + + + +
+
+
+ ) +} +export default UploadImage + + diff --git a/src/components/EditPanel.jsx b/src/components/EditPanel.jsx new file mode 100644 index 0000000..2cdca5f --- /dev/null +++ b/src/components/EditPanel.jsx @@ -0,0 +1,378 @@ +import { Rnd } from 'react-rnd'; +import { useCallback, useContext, useState } from "react" +import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; +import { Button } from './ui/button'; +import { BringToFront, CopyPlus, GroupIcon, PencilRuler, Save, Settings, Shapes, SquareX, Store, Trash2, UngroupIcon, Upload, ChevronDown, ChevronUp, MoveIcon, Type, ImageDown, X } from 'lucide-react'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './ui/tooltip'; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs'; +import OpenContext from './Context/openContext/OpenContext'; +import CanvasContext from './Context/canvasContext/CanvasContext'; +import ActiveObjectContext from './Context/activeObject/ObjectContext'; +import { fabric } from 'fabric'; + +export function EditPanel() { + const [isCollapsed, setIsCollapsed] = useState(false); + const { setTabValue, setOpenSetting, setOpenObjectPanel, setCaptureOpen, setOpenPanel } = useContext(OpenContext); + + const { canvas } = useContext(CanvasContext); + + const { setActiveObject, activeObject } = useContext(ActiveObjectContext); + + const groupSelectedObjects = () => { + const activeObjects = canvas.getActiveObjects(); // Get selected objects + if (activeObjects.length > 1) { + + const group = new fabric.Group(activeObjects, { + left: canvas?.width / 2, + top: canvas?.height / 2, + originX: "center", + originY: "center", + }) + canvas.remove(...activeObjects); + canvas.add(group); + canvas.renderAll(); + } else { + console.log("Select at least two objects") + } + }; + + const ungroupSelectedObjects = () => { + const activeObject = canvas.getActiveObject(); + if (activeObject && activeObject.type === "group") { + // Get the active group + const group = activeObject; + + // Remove the group from the canvas + canvas.remove(group); + + // Iterate through each object in the group and re-add to the canvas + group._objects.forEach((object) => { + // Ensure the object has a fresh state + object.set({ + hasControls: true, // Allow resizing + selectable: true, // Make selectable + group: null, // Remove group reference + left: canvas?.width / 2, + top: canvas?.height / 2, + originX: "center", + originY: "center", + }); + + // Set the object's coordinates and transformation matrix + object.setCoords(); + + // Add the object back to the canvas + canvas.add(object); + }); + + // Render the canvas to reflect changes + canvas.renderAll(); + } + }; + + // Bring Selected Object to Front + const bringToFront = () => { + if (activeObject) { + activeObject.bringToFront(); + canvas.renderAll(); + } + }; + + // Remove Selected Element + const removeSelected = useCallback(() => { + const activeObject = canvas?.getActiveObject(); + + const allObjects = canvas?.getObjects(); + + const textObjects = allObjects.filter((obj) => obj.type === 'textbox' || obj.type === 'text' || + obj.type === 'i-text'); + + if (activeObject) { + canvas.remove(activeObject); + setActiveObject(null); + } + if (activeObject && textObjects?.length === 1) { + canvas.remove(activeObject); + setActiveObject(null); + } + if (activeObject.length > 1) { + canvas.remove(...activeObject); + setActiveObject(null); + } + }, [canvas, setActiveObject]); + + const saveCanvasState = () => { + // Get the JSON representation of all objects + const json = canvas.toJSON(['id', 'selectable']); // Include any custom properties you need + + console.log(json); + + // Get background image data if it exists + let backgroundImageData = null; + if (canvas.backgroundImage) { + backgroundImageData = { + src: canvas.backgroundImage._element.src, + width: canvas.backgroundImage.width, + height: canvas.backgroundImage.height, + scaleX: canvas.backgroundImage.scaleX, + scaleY: canvas.backgroundImage.scaleY, + originX: canvas.backgroundImage.originX, + originY: canvas.backgroundImage.originY, + opacity: canvas.backgroundImage.opacity + }; + } + + // Create the complete canvas state + const canvasState = { + version: '1.0', + objects: json.objects, + background: backgroundImageData, + width: canvas.width, + height: canvas.height, + backgroundColor: canvas.backgroundColor + }; + + console.log('Canvas state saved:', canvasState); + // loadCanvasState(canvasState); + }; + + // duplicating current objects + const duplicating = () => { + // Clone the active object to create a true deep copy + activeObject.clone((clonedObject) => { + // Add the cloned object to the canvas + clonedObject.set("left", clonedObject?.left + 30) + canvas.add(clonedObject); + canvas.renderAll(); + }); + } + + // for clear canvas + const clearCanvas = () => { + canvas.clear(); + canvas.renderAll(); + } + + const addText = () => { + if (canvas) { + const text = new fabric.IText('Editable Text', { + left: 100, + top: 100, + fontFamily: 'Poppins', + fontSize: 16, + }); + // Add the text to the canvas and re-render + canvas.add(text); + // canvas.clipPath = text; + canvas.setActiveObject(text); + setActiveObject(text); + canvas.renderAll(); + } + }; + + return ( + + + +
+ + Edit Panel +
+
+ + setIsCollapsed(!open)}> + + + + + + + + Edit + Add + Canvas + + + + +
+ } + label="Group" + onClick={groupSelectedObjects} + tooltipContent={ +
+

Group selected objects

+

To select multiple objects:

+
    +
  1. Hold down the Shift key
  2. +
  3. Click and drag with the left mouse button to select objects
  4. +
  5. Release the Shift key and mouse button
  6. +
+

Then click this button to group the selected objects.

+
+ } + /> + } + label="Ungroup" + onClick={ungroupSelectedObjects} + tooltipContent="Ungroup selected objects" + /> + } + label="Duplicate" + onClick={duplicating} + tooltipContent="Duplicate selected objects" + /> + } + label="To Front" + onClick={bringToFront} + tooltipContent="Bring selected objects to front" + /> + } + label="Move" + onClick={() => { }} + tooltipContent="Move selected objects" + /> + } + label="Remove" + onClick={removeSelected} + tooltipContent="Remove selected objects" + /> +
+
+
+ + + +
+ } + label="Icons" + onClick={() => { + setOpenObjectPanel(true); + setTabValue("icons"); + }} + tooltipContent="Add icons to canvas" + /> + + } + label="Shapes" + onClick={() => { + setTabValue("shapes"); + setOpenObjectPanel(true); + }} + tooltipContent="Add shapes to canvas" + /> + + } + label="Text" + onClick={() => { + addText(); + setTabValue("customize"); setOpenObjectPanel(true); + }} + tooltipContent="Add text to canvas" + /> + + } + label="Image" + onClick={() => { + setTabValue("images"); setOpenObjectPanel(true); + }} + tooltipContent="Upload and add image to canvas" + /> + + } + label="Customize" + onClick={() => { + setTabValue("customize"); setOpenObjectPanel(true); + }} + tooltipContent="Customize objects on canvas" + /> +
+
+
+ + + +
+ } + label="Save" + onClick={saveCanvasState} + tooltipContent="Save current canvas state" + /> + } + label="Settings" + onClick={() => setOpenSetting(true)} + tooltipContent="Open canvas settings" + /> + } + label="Clear" + onClick={clearCanvas} + tooltipContent="Clear entire canvas" + /> + + } + label="Capture" + onClick={() => setCaptureOpen(true)} + tooltipContent="Capture canvas" + /> +
+
+
+ +
+ +
+ +
+
+
+
+ ) +} + +function ActionButton({ icon, label, onClick, tooltipContent }) { + return ( + + + + + +

{tooltipContent}

+
+
+ ) +} diff --git a/src/components/FabricCanvas.jsx b/src/components/FabricCanvas.jsx new file mode 100644 index 0000000..385cfbe --- /dev/null +++ b/src/components/FabricCanvas.jsx @@ -0,0 +1,69 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { fabric } from 'fabric'; + +const FabricCanvas = () => { + const canvasRef = useRef(null); + const [canvas, setCanvas] = useState(null); + + // Canvas settings + const canvasSettings = { + width: 800, + height: 600, + }; + + useEffect(() => { + // Initialize the canvas + const newCanvas = new fabric.Canvas(canvasRef.current, { + backgroundColor: 'black', + selection: true, + height: canvasSettings.height, + width: canvasSettings.width, + controlsAboveOverlay: true, + preserveObjectStacking: true, + }); + + // Create the clipping path (rectangle) + const clipPath = new fabric.Rect({ + width: 300, + height: 300, + left: (canvasSettings.width - 300) / 2, // Center horizontally + top: (canvasSettings.height - 300) / 2, // Center vertically + fill: 'transparent', // Transparent fill + stroke: 'red', // White outline + strokeWidth: 2, + absolutePositioned: true, // Important for clipping path + }); + + // Apply the clipPath to the canvas + newCanvas.clipPath = clipPath; + + // Add the clipping path to visualize it + newCanvas.add(clipPath); + + // Add a sample object to the canvas + const rect = new fabric.Rect({ + width: 100, + height: 100, + fill: 'orange', + left: 200, + top: 150, + }); + newCanvas.add(rect); + + // Save the canvas instance + setCanvas(newCanvas); + + // Clean up on unmount + return () => { + newCanvas.dispose(); + }; + }, []); + + return ( +
+ +
+ ); +}; + +export default FabricCanvas; diff --git a/src/components/Layouts/AddShapes.jsx b/src/components/Layouts/AddShapes.jsx new file mode 100644 index 0000000..a463de7 --- /dev/null +++ b/src/components/Layouts/AddShapes.jsx @@ -0,0 +1,28 @@ +import RoundedShape from '../EachComponent/RoundedShapes/RoundedShape' +import PlainShapes from '../EachComponent/Shapes/PlainShapes' +import { Card } from '../ui/card' +import { Separator } from '../ui/separator' +import CustomShape from '../EachComponent/CustomShape/CustomShape' + +const AddShapes = () => { + return ( +
+ +

Custom Shapes

+ +
+ +
+
+
+ +
+ +
+ +
+
+ ) +} + +export default AddShapes \ No newline at end of file diff --git a/src/components/Layouts/Header.jsx b/src/components/Layouts/Header.jsx new file mode 100644 index 0000000..4864363 --- /dev/null +++ b/src/components/Layouts/Header.jsx @@ -0,0 +1,19 @@ +import { AlignLeft, AlignRight } from 'lucide-react'; +import { useContext } from 'react'; +import OpenContext from '../Context/openContext/OpenContext'; + +const Header = () => { + const { setRightPanelOpen, setLeftPanelOpen } = useContext(OpenContext) + + return ( +
+

setLeftPanelOpen(true)}>Add Element

+ +

PlanPostAi Canvas

+ +

setRightPanelOpen(true)}> Edit Panel

+
+ ) +} + +export default Header \ No newline at end of file diff --git a/src/components/Layouts/SheetLeftPanel.jsx b/src/components/Layouts/SheetLeftPanel.jsx new file mode 100644 index 0000000..9c9b257 --- /dev/null +++ b/src/components/Layouts/SheetLeftPanel.jsx @@ -0,0 +1,77 @@ +import { Sheet, SheetContent, SheetDescription } from '../ui/sheet'; +import AddShapes from './AddShapes'; +import { Separator } from '../ui/separator'; +import { Button } from '../ui/button'; +import { X, Store, Shapes, Upload, Type } from "lucide-react"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'; +import AllIconsPage from '../EachComponent/Icons/AllIcons'; +import UploadImage from '../EachComponent/UploadImage'; +import { useContext } from 'react'; +import OpenContext from '../Context/openContext/OpenContext'; + +const left = "left"; + +const SheetLeftPanel = () => { + const { leftPanelOpen, setLeftPanelOpen } = useContext(OpenContext); + + // Prevent closing on outside clicks + const handleOpenChange = (isOpen) => { + if (!isOpen) { + // Do nothing when clicking outside + return; // Sheet won't close + } + setLeftPanelOpen(isOpen); // Update only on valid trigger + }; + + // Function to handle closing the sheet + const handleClose = () => { + setLeftPanelOpen(false); // Close when button is clicked + }; + + return ( + + + +

Your customizable open canvas playground.

+ +
+ + + + + + Shapes + + + + Icons + + + + Image + + + + + + + + + + + + + + + + + + +
+
+ ) +} + +export default SheetLeftPanel \ No newline at end of file diff --git a/src/components/Layouts/SheetRightPanel.jsx b/src/components/Layouts/SheetRightPanel.jsx new file mode 100644 index 0000000..3e2d8b8 --- /dev/null +++ b/src/components/Layouts/SheetRightPanel.jsx @@ -0,0 +1,71 @@ +import { + Sheet, + SheetContent, + SheetDescription, + SheetHeader, + SheetTitle, +} from "@/components/ui/sheet" +import CustomizeShape from "../EachComponent/CustomizeShape"; +import { Separator } from "../ui/separator"; +import { Button } from "../ui/button"; +import { X } from "lucide-react"; +import { useContext, useEffect, useState } from "react"; +import ActiveObjectContext from "../Context/activeObject/ObjectContext"; +import OpenContext from "../Context/openContext/OpenContext"; + +const SheetRightPanel = () => { + const { rightPanelOpen, setRightPanelOpen } = useContext(OpenContext) + + const { activeObject } = useContext(ActiveObjectContext); + + const [open, setOpen] = useState(false); + + useEffect(() => { + if (activeObject) { + setOpen(true); + } + }, [activeObject]) + + // Prevent closing on outside clicks + const handleOpenChange = (isOpen) => { + if (!isOpen) { + + // Do nothing when clicking outside + return; // Sheet won't close + } + setRightPanelOpen(isOpen); // Update only + }; + + // Function to handle closing the sheet + const handleClose = () => { + setRightPanelOpen(false); // Close when button is clicked + }; + + return ( + + + + + Edit Customization + + + + + Customize each shapes, and text as per your choice. + + + +
+ + { + open ? :

No active object found

+ } +
+
+
+ ) +} + +export default SheetRightPanel; diff --git a/src/components/ObjectPanel.jsx b/src/components/ObjectPanel.jsx new file mode 100644 index 0000000..a9cbefe --- /dev/null +++ b/src/components/ObjectPanel.jsx @@ -0,0 +1,124 @@ +import { Button } from './ui/button' +import { Card, CardContent, CardHeader, CardTitle } from './ui/card' +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible' +import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs' +import { useContext, useState } from 'react' +import { PencilRuler, Shapes, Store, Upload, ChevronDown, ChevronUp, X } from 'lucide-react'; +import { Rnd } from 'react-rnd'; +import OpenContext from './Context/openContext/OpenContext'; +import AllIconsPage from './EachComponent/Icons/AllIcons' +import { Separator } from './ui/separator' +import { ScrollArea } from './ui/scroll-area' +import AddShapes from './Layouts/AddShapes' +import UploadImage from './EachComponent/UploadImage' +import CustomizeShape from './EachComponent/CustomizeShape' + +const ObjectPanel = () => { + const [isCollapsed, setIsCollapsed] = useState(false); + const { tabValue, setTabValue, setOpenObjectPanel } = useContext(OpenContext); + return ( + + + +
+ + Object Panel +
+
+ + setIsCollapsed(!open)}> + + + + + + + + setTabValue(value)} // Sync tab state with context + > + + + setTabValue("icons")}> + Icons + + + setTabValue("shapes")}>Shapes + setTabValue("images")}>Images + + setTabValue("customize")}>Customize + + + {/* All icons */} + +
+ +
+
+ + {/* All shapes */} + + + Shapes + + + + + + + + {/* Upload images */} + + + Upload + + + + + + + + + + {/* Customization */} + + + Object customization + + + + + + + +
+ +
+ +
+ +
+ +
+ +
+ ) +} + +export default ObjectPanel \ No newline at end of file diff --git a/src/components/captureCanvas.js b/src/components/captureCanvas.js new file mode 100644 index 0000000..8ababce --- /dev/null +++ b/src/components/captureCanvas.js @@ -0,0 +1,37 @@ +const exportScaledCanvasImage = (scale = 2, clipRect = null) => { + if (canvas) { + // If a clipPath is provided, apply it to the canvas + if (clipRect) { + canvas.set("clipPath", clipRect); + } + + // Export the image with the scale + const imageBase64 = canvas.toDataURL({ + format: 'png', // or 'jpeg' + quality: 1, // (0 to 1) for JPEG compression, ignored for PNG + multiplier: scale, // Scale the canvas size + }); + + // Download the scaled image + const link = document.createElement('a'); + link.href = imageBase64; + link.download = `canvas-image-${scale}x.png`; + link.click(); + + // After downloading, clear the clipping (optional) + if (clipRect) { + canvas.setClipPath(null); + } + } +}; + +// Example: Crop area and then export +const clipRect = new fabric.Rect({ + left: canvas?.getWidth() / 2, + top: canvas?.getHeight() / 2, + originX: 'center', // Use center origin + originY: 'center', + width: 200, // Size of the clip area + height: 200, // Size of the clip area + absolutePositioned: true, // Ensure clipping path stays in place +}); \ No newline at end of file diff --git a/src/components/loadCanvas.js b/src/components/loadCanvas.js new file mode 100644 index 0000000..2f8e762 --- /dev/null +++ b/src/components/loadCanvas.js @@ -0,0 +1,107 @@ +const loadCanvasState = (state) => { + if (!canvas2) { + console.error('Canvas2 is not initialized!'); + return; + } + try { + const canvasData = typeof state === 'string' ? JSON.parse(state) : state; + + // Clear the existing canvas + canvas2.clear(); + + // Set the background color if it exists + if (canvasData.backgroundColor) { + canvas2.set({ backgroundColor: canvasData.backgroundColor }); + } + + // Function to load background image + const loadBackgroundImage = () => { + return new Promise((resolve) => { + if (!canvasData.background) { + resolve(); + return; + } + + const imgElement = new Image(); + imgElement.crossOrigin = 'anonymous'; // Handle CORS if needed + + imgElement.onload = () => { + const imgInstance = new fabric.Image(imgElement, { + originX: canvasData.background.originX || 'left', + originY: canvasData.background.originY || 'top', + scaleX: canvasData.background.scaleX || canvas2.width / imgElement.width, + scaleY: canvasData.background.scaleY || canvas2.height / imgElement.height, + opacity: canvasData.background.opacity || 1, + }); + + // Set background image using the set method + canvas2.set({ backgroundImage: imgInstance }); + resolve(); + }; + + imgElement.onerror = () => { + console.error("Failed to load the background image"); + resolve(); // Resolve anyway to continue loading objects + }; + + imgElement.src = canvasData.background.src; + }); + }; + + // Function to load objects + const loadObjects = () => { + return new Promise((resolve) => { + canvas2.loadFromJSON({ objects: canvasData.objects }, () => { + resolve(); + }, (obj, element) => { + return obj; + }); + }); + }; + + // Load background image and objects if they exist + const loadTasks = []; + if (canvasData.background || canvasData.objects?.length) { + if (canvasData.background) { + loadTasks.push(loadBackgroundImage()); + } + if (canvasData.objects?.length) { + loadTasks.push(loadObjects()); + } + + Promise.all(loadTasks) + .then(() => { + canvas2.requestRenderAll(); // Ensure re-rendering + }) + .catch((error) => { + console.error('Error during canvas loading:', error); + }); + } else { + // If only background color exists + if (canvasData.backgroundColor) { + canvas2.requestRenderAll(); // Apply background color and render + } + } + + } catch (error) { + console.error('Error loading canvas state:', error); + } +}; + + +// for download image/canvas +const exportScaledCanvasImage = (scale = 2) => { + if (canvas) { + const imageBase64 = canvas.toDataURL({ + format: 'png', // or 'jpeg' + quality: 1, // (0 to 1) for JPEG compression, ignored for PNG + multiplier: scale, // Scale the canvas size + }); + + // Download the scaled image + const link = document.createElement('a'); + link.href = imageBase64; + link.download = `canvas-image-${scale}x.png`; + link.click(); + } +}; \ No newline at end of file diff --git a/src/components/ui/alert.jsx b/src/components/ui/alert.jsx new file mode 100644 index 0000000..28597e8 --- /dev/null +++ b/src/components/ui/alert.jsx @@ -0,0 +1,47 @@ +import * as React from "react" +import { cva } from "class-variance-authority"; + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7", + { + variants: { + variant: { + default: "bg-background text-foreground", + destructive: + "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Alert = React.forwardRef(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = "Alert" + +const AlertTitle = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +AlertTitle.displayName = "AlertTitle" + +const AlertDescription = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +AlertDescription.displayName = "AlertDescription" + +export { Alert, AlertTitle, AlertDescription } diff --git a/src/components/ui/aspect-ratio.jsx b/src/components/ui/aspect-ratio.jsx new file mode 100644 index 0000000..c4abbf3 --- /dev/null +++ b/src/components/ui/aspect-ratio.jsx @@ -0,0 +1,5 @@ +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" + +const AspectRatio = AspectRatioPrimitive.Root + +export { AspectRatio } diff --git a/src/components/ui/badge.jsx b/src/components/ui/badge.jsx new file mode 100644 index 0000000..a687eba --- /dev/null +++ b/src/components/ui/badge.jsx @@ -0,0 +1,34 @@ +import * as React from "react" +import { cva } from "class-variance-authority"; + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + ...props +}) { + return (
); +} + +export { Badge, badgeVariants } diff --git a/src/components/ui/button.jsx b/src/components/ui/button.jsx new file mode 100644 index 0000000..bf3d2ef --- /dev/null +++ b/src/components/ui/button.jsx @@ -0,0 +1,48 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva } from "class-variance-authority"; + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + () + ); +}) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/src/components/ui/card.jsx b/src/components/ui/card.jsx new file mode 100644 index 0000000..2985cca --- /dev/null +++ b/src/components/ui/card.jsx @@ -0,0 +1,50 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/src/components/ui/checkbox.jsx b/src/components/ui/checkbox.jsx new file mode 100644 index 0000000..5e0c96b --- /dev/null +++ b/src/components/ui/checkbox.jsx @@ -0,0 +1,22 @@ +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Checkbox = React.forwardRef(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/src/components/ui/collapsible.jsx b/src/components/ui/collapsible.jsx new file mode 100644 index 0000000..a23e7a2 --- /dev/null +++ b/src/components/ui/collapsible.jsx @@ -0,0 +1,9 @@ +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/src/components/ui/input.jsx b/src/components/ui/input.jsx new file mode 100644 index 0000000..41ec05e --- /dev/null +++ b/src/components/ui/input.jsx @@ -0,0 +1,19 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Input = React.forwardRef(({ className, type, ...props }, ref) => { + return ( + () + ); +}) +Input.displayName = "Input" + +export { Input } diff --git a/src/components/ui/label.jsx b/src/components/ui/label.jsx new file mode 100644 index 0000000..9d509c8 --- /dev/null +++ b/src/components/ui/label.jsx @@ -0,0 +1,21 @@ +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva } from "class-variance-authority"; +import PropTypes from 'prop-types'; + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +) + +const Label = React.forwardRef(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +Label.propTypes = { + className: PropTypes.string, +}; + +export { Label } diff --git a/src/components/ui/popover.jsx b/src/components/ui/popover.jsx new file mode 100644 index 0000000..b9f9d4c --- /dev/null +++ b/src/components/ui/popover.jsx @@ -0,0 +1,27 @@ +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverAnchor = PopoverPrimitive.Anchor + +const PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor } diff --git a/src/components/ui/scroll-area.jsx b/src/components/ui/scroll-area.jsx new file mode 100644 index 0000000..dc3d384 --- /dev/null +++ b/src/components/ui/scroll-area.jsx @@ -0,0 +1,38 @@ +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +const ScrollArea = React.forwardRef(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/src/components/ui/select.jsx b/src/components/ui/select.jsx new file mode 100644 index 0000000..2b948f8 --- /dev/null +++ b/src/components/ui/select.jsx @@ -0,0 +1,119 @@ +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className + )} + {...props}> + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} diff --git a/src/components/ui/separator.jsx b/src/components/ui/separator.jsx new file mode 100644 index 0000000..c40b888 --- /dev/null +++ b/src/components/ui/separator.jsx @@ -0,0 +1,23 @@ +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +const Separator = React.forwardRef(( + { className, orientation = "horizontal", decorative = true, ...props }, + ref +) => ( + +)) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/src/components/ui/sheet.jsx b/src/components/ui/sheet.jsx new file mode 100644 index 0000000..339efdf --- /dev/null +++ b/src/components/ui/sheet.jsx @@ -0,0 +1,108 @@ +import * as React from "react" +import * as SheetPrimitive from "@radix-ui/react-dialog" +import { cva } from "class-variance-authority"; +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Sheet = SheetPrimitive.Root + +const SheetTrigger = SheetPrimitive.Trigger + +const SheetClose = SheetPrimitive.Close + +const SheetPortal = SheetPrimitive.Portal + +const SheetOverlay = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName + +const sheetVariants = cva( + "fixed z-[999] gap-4 bg-background p-2 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out", + { + variants: { + side: { + top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", + bottom: + "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", + left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", + right: + "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", + }, + }, + defaultVariants: { + side: "right", + }, + } +) + +const SheetContent = React.forwardRef(({ side = "right", className, children, ...props }, ref) => ( + + + + {/* + + Close + */} + {children} + + +)) +SheetContent.displayName = SheetPrimitive.Content.displayName + +const SheetHeader = ({ + className, + ...props +}) => ( +
+) +SheetHeader.displayName = "SheetHeader" + +const SheetFooter = ({ + className, + ...props +}) => ( +
+) +SheetFooter.displayName = "SheetFooter" + +const SheetTitle = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SheetTitle.displayName = SheetPrimitive.Title.displayName + +const SheetDescription = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SheetDescription.displayName = SheetPrimitive.Description.displayName + +export { + Sheet, + SheetPortal, + SheetOverlay, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +} diff --git a/src/components/ui/slider.jsx b/src/components/ui/slider.jsx new file mode 100644 index 0000000..6062ce5 --- /dev/null +++ b/src/components/ui/slider.jsx @@ -0,0 +1,21 @@ +import * as React from "react" +import * as SliderPrimitive from "@radix-ui/react-slider" + +import { cn } from "@/lib/utils" + +const Slider = React.forwardRef(({ className, ...props }, ref) => ( + + + + + + +)) +Slider.displayName = SliderPrimitive.Root.displayName + +export { Slider } diff --git a/src/components/ui/switch.jsx b/src/components/ui/switch.jsx new file mode 100644 index 0000000..5ef3287 --- /dev/null +++ b/src/components/ui/switch.jsx @@ -0,0 +1,22 @@ +import * as React from "react" +import * as SwitchPrimitives from "@radix-ui/react-switch" + +import { cn } from "@/lib/utils" + +const Switch = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +Switch.displayName = SwitchPrimitives.Root.displayName + +export { Switch } diff --git a/src/components/ui/tabs.jsx b/src/components/ui/tabs.jsx new file mode 100644 index 0000000..b674eb9 --- /dev/null +++ b/src/components/ui/tabs.jsx @@ -0,0 +1,41 @@ +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/src/components/ui/textarea.jsx b/src/components/ui/textarea.jsx new file mode 100644 index 0000000..4dbc5ab --- /dev/null +++ b/src/components/ui/textarea.jsx @@ -0,0 +1,18 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Textarea = React.forwardRef(({ className, ...props }, ref) => { + return ( + (