diff --git a/.idea/modules.xml b/.idea/modules.xml index bc829455de..30a8bc20a8 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -6,6 +6,9 @@ + + + \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index d6643ec803..2ddc940ca3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,3 +26,5 @@ include("plugins:test-plugin-core") include("test-bot") include("token-parser") + +include("web:backend") diff --git a/web/backend/build.gradle.kts b/web/backend/build.gradle.kts new file mode 100644 index 0000000000..97fa93eb07 --- /dev/null +++ b/web/backend/build.gradle.kts @@ -0,0 +1,36 @@ +plugins { + `kordex-module` + `published-module` + `disable-explicit-api-mode` + + kotlin("plugin.serialization") +} + +metadata { + name = "KordEx Extra: Web" + description = "KordEx extra module that provides a web interface and APIs for working with it" +} + +repositories { + maven { + name = "Sonatype Snapshots" + url = uri("https://oss.sonatype.org/content/repositories/snapshots") + } +} + +dependencies { + detektPlugins(libs.detekt) + detektPlugins(libs.detekt.libraries) + + implementation(libs.bundles.logging) + implementation(libs.kotlin.stdlib) + implementation(libs.ktor.logging) + + implementation(project(":kord-extensions")) +} + +group = "com.kotlindiscord.kord.extensions" + +dokkaModule { + moduleName = "Kord Extensions: Web Interface" +} diff --git a/web/frontend/.gitignore b/web/frontend/.gitignore new file mode 100644 index 0000000000..f527ab076f --- /dev/null +++ b/web/frontend/.gitignore @@ -0,0 +1,243 @@ +# 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? +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Vuejs template +# Recommended template: Node.gitignore + +node_modules/ +dist/ +npm-debug.log +yarn-error.log + diff --git a/web/frontend/.vscode/extensions.json b/web/frontend/.vscode/extensions.json new file mode 100644 index 0000000000..c2f0746ba8 --- /dev/null +++ b/web/frontend/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "Vue.volar" + ] +} diff --git a/web/frontend/README.md b/web/frontend/README.md new file mode 100644 index 0000000000..ced8d1d52b --- /dev/null +++ b/web/frontend/README.md @@ -0,0 +1,13 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue +3 ` + + diff --git a/web/frontend/package.json b/web/frontend/package.json new file mode 100644 index 0000000000..da806c2da8 --- /dev/null +++ b/web/frontend/package.json @@ -0,0 +1,40 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@internationalized/date": "^3.5.4", + "@unovis/ts": "^1.4.1", + "@unovis/vue": "^1.4.1", + "@vee-validate/zod": "^4.12.8", + "@vueuse/core": "^10.10.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "embla-carousel": "^8.1.3", + "embla-carousel-vue": "^8.1.3", + "lucide-vue-next": "^0.379.0", + "radix-vue": "^1.8.2", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "vaul-vue": "^0.1.2", + "vee-validate": "^4.12.8", + "vue": "^3.4.21", + "vue-sonner": "^1.1.2", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.12.12", + "@vitejs/plugin-vue": "^5.0.4", + "autoprefixer": "^10.4.19", + "tailwindcss": "^3.4.3", + "typescript": "^5.2.2", + "vite": "^5.2.0", + "vue-tsc": "^2.0.6" + } +} diff --git a/web/frontend/pnpm-lock.yaml b/web/frontend/pnpm-lock.yaml new file mode 100644 index 0000000000..76fda70acf --- /dev/null +++ b/web/frontend/pnpm-lock.yaml @@ -0,0 +1,3336 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@internationalized/date': + specifier: ^3.5.4 + version: 3.5.4 + '@unovis/ts': + specifier: ^1.4.1 + version: 1.4.1 + '@unovis/vue': + specifier: ^1.4.1 + version: 1.4.1(@unovis/ts@1.4.1)(vue@3.4.27(typescript@5.4.5)) + '@vee-validate/zod': + specifier: ^4.12.8 + version: 4.12.8(vue@3.4.27(typescript@5.4.5)) + '@vueuse/core': + specifier: ^10.10.0 + version: 10.10.0(vue@3.4.27(typescript@5.4.5)) + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + embla-carousel: + specifier: ^8.1.3 + version: 8.1.3 + embla-carousel-vue: + specifier: ^8.1.3 + version: 8.1.3(vue@3.4.27(typescript@5.4.5)) + lucide-vue-next: + specifier: ^0.379.0 + version: 0.379.0(vue@3.4.27(typescript@5.4.5)) + radix-vue: + specifier: ^1.8.2 + version: 1.8.2(vue@3.4.27(typescript@5.4.5)) + tailwind-merge: + specifier: ^2.3.0 + version: 2.3.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.3) + vaul-vue: + specifier: ^0.1.2 + version: 0.1.2(typescript@5.4.5) + vee-validate: + specifier: ^4.12.8 + version: 4.12.8(vue@3.4.27(typescript@5.4.5)) + vue: + specifier: ^3.4.21 + version: 3.4.27(typescript@5.4.5) + vue-sonner: + specifier: ^1.1.2 + version: 1.1.2 + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@types/node': + specifier: ^20.12.12 + version: 20.12.12 + '@vitejs/plugin-vue': + specifier: ^5.0.4 + version: 5.0.4(vite@5.2.11(@types/node@20.12.12))(vue@3.4.27(typescript@5.4.5)) + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.38) + tailwindcss: + specifier: ^3.4.3 + version: 3.4.3 + typescript: + specifier: ^5.2.2 + version: 5.4.5 + vite: + specifier: ^5.2.0 + version: 5.2.11(@types/node@20.12.12) + vue-tsc: + specifier: ^2.0.6 + version: 2.0.19(typescript@5.4.5) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/code-frame@7.24.6': + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.6': + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.6': + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + engines: {node: '>=6.9.0'} + + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/css@11.11.2': + resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/serialize@1.1.4': + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + + '@floating-ui/vue@1.0.6': + resolution: {integrity: sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==} + + '@internationalized/date@3.5.4': + resolution: {integrity: sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==} + + '@internationalized/number@3.5.3': + resolution: {integrity: sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@mapbox/geojson-rewind@0.5.2': + resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} + hasBin: true + + '@mapbox/jsonlint-lines-primitives@2.0.2': + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + + '@mapbox/mapbox-gl-supported@2.0.1': + resolution: {integrity: sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==} + + '@mapbox/point-geometry@0.1.0': + resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + + '@mapbox/tiny-sdf@2.0.6': + resolution: {integrity: sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==} + + '@mapbox/unitbezier@0.0.1': + resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} + + '@mapbox/vector-tile@1.3.1': + resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + + '@mapbox/whoots-js@3.1.0': + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + + '@swc/helpers@0.5.11': + resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + + '@tanstack/virtual-core@3.5.0': + resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} + + '@tanstack/vue-virtual@3.5.0': + resolution: {integrity: sha512-wvRQ8sFxn/NDr3WvI5XabhFovZ5MBmpEck2GHpTxYunmV63Ovpl30lRu6W5BPQo35a1GqDZ+Pvzlz6WDWRNqqw==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-collection@1.0.13': + resolution: {integrity: sha512-v0Rgw3IZebRyamcwVmtTDCZ8OmQcj4siaYjNc7wGMZT7PmdSHawGsCOQMxyLvZ7lWjfohYLK0oXtilMOMgfY8A==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.6': + resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.9': + resolution: {integrity: sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@1.0.11': + resolution: {integrity: sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==} + + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-sankey@0.11.2': + resolution: {integrity: sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ==} + + '@types/d3-scale-chromatic@3.0.3': + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-selection@3.0.10': + resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} + + '@types/d3-shape@1.3.12': + resolution: {integrity: sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.8': + resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/dagre@0.7.52': + resolution: {integrity: sha512-XKJdy+OClLk3hketHi9Qg6gTfe1F3y+UFnHxKA2rn9Dw+oXa4Gb378Ztz9HlMgZKSxpPmn4BNVh9wgkpvrK1uw==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/geojson@7946.0.14': + resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + + '@types/leaflet@1.7.6': + resolution: {integrity: sha512-Emkz3V08QnlelSbpT46OEAx+TBZYTOX2r1yM7W+hWg5+djHtQ1GbEXBDRLaqQDOYcDI51Ss0ayoqoKD4CtLUDA==} + + '@types/mapbox__point-geometry@0.1.4': + resolution: {integrity: sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==} + + '@types/mapbox__vector-tile@1.3.4': + resolution: {integrity: sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==} + + '@types/node@20.12.12': + resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/pbf@3.0.5': + resolution: {integrity: sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==} + + '@types/supercluster@5.0.3': + resolution: {integrity: sha512-XMSqQEr7YDuNtFwSgaHHOjsbi0ZGL62V9Js4CW45RBuRYlNWSW/KDqN+RFFE7HdHcGhJPtN0klKvw06r9Kg7rg==} + + '@types/three@0.135.0': + resolution: {integrity: sha512-l7WLhIHjhHMtlpyTSltPPAKLpiMwgMD1hXHj59AVUpYRoZP7Fd9NNOSRSvZBCPLpTHPYojgQvSJCoza9zoL7bg==} + + '@types/throttle-debounce@5.0.2': + resolution: {integrity: sha512-pDzSNulqooSKvSNcksnV72nk8p7gRqN8As71Sp28nov1IgmPKWbOEIwAWvBME5pPTtaXJAvG3O4oc76HlQ4kqQ==} + + '@types/topojson-client@3.1.4': + resolution: {integrity: sha512-Ntf3ZSetMYy7z3PrVCvcqmdRoVhgKA9UKN0ZuuZf8Ts2kcyL4qK34IXBs6qO5fem62EK4k03PtkJPVoroVu4/w==} + + '@types/topojson-server@3.0.4': + resolution: {integrity: sha512-5+ieK8ePfP+K2VH6Vgs1VCt+fO1U8XZHj0UsF+NktaF0DavAo1q3IvCBXgokk/xmtvoPltSUs6vxuR/zMdOE1g==} + + '@types/topojson-simplify@3.0.3': + resolution: {integrity: sha512-sBO5UZ0O2dB0bNwo0vut2yLHhj3neUGi9uL7/ROdm8Gs6dtt4jcB9OGDKr+M2isZwQM2RuzVmifnMZpxj4IGNw==} + + '@types/topojson-specification@1.0.5': + resolution: {integrity: sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ==} + + '@types/topojson@3.2.6': + resolution: {integrity: sha512-ppfdlxjxofWJ66XdLgIlER/85RvpGyfOf8jrWf+3kVIjEatFxEZYD/Ea83jO672Xu1HRzd/ghwlbcZIUNHTskw==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@unovis/dagre-layout@0.8.8-2': + resolution: {integrity: sha512-ZfDvfcYtzzhZhgKZty8XDi+zQIotfRqfNVF5M3dFQ9d9C5MTaRdbeBnPUkNrmlLJGgQ42HMOE2ajZLfm2VlRhg==} + + '@unovis/graphlibrary@2.2.0-2': + resolution: {integrity: sha512-HeEzpd/vDyWiIJt0rnh+2ICXUIuF2N0+Z9OJJiKg0DB+eFUcD+bk+9QPhYHwkFwfxdjDA9fHi1DZ/O/bbV58Nw==} + + '@unovis/ts@1.4.1': + resolution: {integrity: sha512-U0CoVWmLFTU/olNWNQT7Q9Ws0nTQRwd7jimITs7xxrKKj0M4ZHMHl4YaMTe6dY7UIhhxSSOh8K4LPEy6lCo1bg==} + + '@unovis/vue@1.4.1': + resolution: {integrity: sha512-LtsG7MsoUuPxsVDxx9zUDmswgVlUlLCJaxkf3qOr1Aowol0No9fwO0srv0BNd3kJpSx5iI+FnWye2QUXZE2QGA==} + peerDependencies: + '@unovis/ts': 1.4.1 + vue: ^3 + + '@vee-validate/zod@4.12.8': + resolution: {integrity: sha512-P+G8grCc5iN7FMfvLzVWoGKxamBd0EYgN/hXBmzgbJV7B7FGnQADlUIsqt4jM+oGacbFW12B56zSORaVy3Owqg==} + + '@vitejs/plugin-vue@5.0.4': + resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.2.5': + resolution: {integrity: sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==} + + '@volar/source-map@2.2.5': + resolution: {integrity: sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==} + + '@volar/typescript@2.2.5': + resolution: {integrity: sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw==} + + '@vue/compiler-core@3.4.27': + resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} + + '@vue/compiler-dom@3.4.27': + resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} + + '@vue/compiler-sfc@3.4.27': + resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} + + '@vue/compiler-ssr@3.4.27': + resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} + + '@vue/devtools-api@6.6.1': + resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} + + '@vue/language-core@2.0.19': + resolution: {integrity: sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.4.27': + resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} + + '@vue/runtime-core@3.4.27': + resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} + + '@vue/runtime-dom@3.4.27': + resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} + + '@vue/server-renderer@3.4.27': + resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} + peerDependencies: + vue: 3.4.27 + + '@vue/shared@3.4.27': + resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + + '@vueuse/core@10.10.0': + resolution: {integrity: sha512-vexJ/YXYs2S42B783rI95lMt3GzEwkxzC8Hb0Ndpd8rD+p+Lk/Za4bd797Ym7yq4jXqdSyj3JLChunF/vyYjUw==} + + '@vueuse/metadata@10.10.0': + resolution: {integrity: sha512-UNAo2sTCAW5ge6OErPEHb5z7NEAg3XcO9Cj7OK45aZXfLLH1QkexDcZD77HBi5zvEiLOm1An+p/4b5K3Worpug==} + + '@vueuse/shared@10.10.0': + resolution: {integrity: sha512-2aW33Ac0Uk0U+9yo3Ypg9s5KcR42cuehRWl7vnUHadQyFvCktseyxxEPBi1Eiq4D2yBGACOnqLZpx1eMc7g5Og==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001624: + resolution: {integrity: sha512-0dWnQG87UevOCPYaOR49CBcLBwoZLpws+k6W37nLjWUhumP1Isusj0p2u+3KhjNloRWK9OKMgjBBzPujQHw4nA==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + csscolorparser@1.0.3: + resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-collection@1.0.7: + resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo-projection@4.0.0: + resolution: {integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==} + engines: {node: '>=12'} + hasBin: true + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate-path@2.3.0: + resolution: {integrity: sha512-tZYtGXxBmbgHsIc9Wms6LS5u4w6KbP8C09a4/ZYc4KLMYYqub57rRBUgpUr2CIarIrJEpdAWWxWQvofgaMpbKQ==} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.4.783: + resolution: {integrity: sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==} + + elkjs@0.8.2: + resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + + embla-carousel-reactive-utils@8.1.3: + resolution: {integrity: sha512-D8tAK6NRQVEubMWb+b/BJ3VvGPsbEeEFOBM6cCCwfiyfLzNlacOAt0q2dtUEA9DbGxeWkB8ExgXzFRxhGV2Hig==} + peerDependencies: + embla-carousel: 8.1.3 + + embla-carousel-vue@8.1.3: + resolution: {integrity: sha512-29JuRyLGIOu3RQ5jTF35Za3EDBT3XRdjPHlmJKnhsqpqWoiZghQSepw1CAgC1WwaBc/z4XgWNzV3u02HmqMeiA==} + peerDependencies: + vue: ^3.2.37 + + embla-carousel@8.1.3: + resolution: {integrity: sha512-GiRpKtzidV3v50oVMly8S+D7iE1r96ttt7fSlvtyKHoSkzrAnVcu8fX3c4j8Ol2hZSQlVfDqDIqdrFPs0u5TWQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + geojson-vt@3.2.1: + resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==} + + geojson@0.5.0: + resolution: {integrity: sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==} + engines: {node: '>= 0.10'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.1: + resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.1.2: + resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} + engines: {node: '>=14'} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + kdbush@3.0.0: + resolution: {integrity: sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + leaflet@1.7.1: + resolution: {integrity: sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lucide-vue-next@0.379.0: + resolution: {integrity: sha512-N+dgaDucX55x6485Fmv3Oj3CZn4NS8/DMNAfLEVdkAt3UiuVUhCLmk79kqfuylHg3+Y7msps4f3FNiWawJVHOg==} + peerDependencies: + vue: '>=3.0.1' + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + maplibre-gl@2.4.0: + resolution: {integrity: sha512-csNFylzntPmHWidczfgCZpvbTSmhaWvLRj9e1ezUDBEPizGgshgm3ea1T5TCNEEBq0roauu7BPuRZjA3wO4KqA==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.0.7: + resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + engines: {node: ^18 || >=20} + hasBin: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-unit@1.0.1: + resolution: {integrity: sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pbf@3.2.1: + resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + hasBin: true + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.0: + resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + potpack@1.0.2: + resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + + protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + + radix-vue@1.8.2: + resolution: {integrity: sha512-ey6jG1rPAD/521PsXGrNkjztvh7PRw6Wwbk7LsHjsKqRoy/S4k58ryzmQ0tmoNOiUALfX92+MOnd5F3ONmuZ/w==} + peerDependencies: + vue: '>= 3.2.0' + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + striptags@3.2.0: + resolution: {integrity: sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supercluster@7.1.5: + resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@2.3.0: + resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + three@0.135.0: + resolution: {integrity: sha512-kuEpuuxRzLv0MDsXai9huCxOSQPZ4vje6y0gn80SRmQvgz6/+rI0NAvCRAw56zYaWKMGMfqKWsxF9Qa2Z9xymQ==} + + throttle-debounce@5.0.0: + resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} + engines: {node: '>=12.22'} + + tinyqueue@2.0.3: + resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-px@1.1.0: + resolution: {integrity: sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + topojson-client@3.1.0: + resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-fest@4.18.3: + resolution: {integrity: sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ==} + engines: {node: '>=16'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vaul-vue@0.1.2: + resolution: {integrity: sha512-E9e0qmHXScnYXDXYuBM0xFjW5DaRcUhj9fkFlv12omd7K/RzXpM+prU+EfHS3sjtDJuy1lBdOlPPYXJeQuT/Qw==} + + vee-validate@4.12.8: + resolution: {integrity: sha512-A07rm3+y7SRk0CMD/O4nBT0nxtwjyfzGZwjEUDk18SxK0ZMzd4AFCzzdHlIiCE1QgHetxd0I3kVkZdN0GG0Oww==} + peerDependencies: + vue: ^3.4.26 + + vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vt-pbf@3.1.3: + resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} + + vue-demi@0.14.7: + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-sonner@1.1.2: + resolution: {integrity: sha512-yg4f5s0a3oiiI7cNvO0Dajux1Y7s04lxww3vnQtnwQawJ3KqaKA9RIRMdI9wGTosRGIOwgYFniFRGl4+IuKPZw==} + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@2.0.19: + resolution: {integrity: sha512-JWay5Zt2/871iodGF72cELIbcAoPyhJxq56mPPh+M2K7IwI688FMrFKc/+DvB05wDWEuCPexQJ6L10zSwzzapg==} + hasBin: true + peerDependencies: + typescript: '*' + + vue@3.4.27: + resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.24.6': + dependencies: + '@babel/highlight': 7.24.6 + picocolors: 1.0.1 + + '@babel/helper-module-imports@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-string-parser@7.24.6': {} + + '@babel/helper-validator-identifier@7.24.6': {} + + '@babel/highlight@7.24.6': + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/runtime@7.24.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/types@7.24.6': + dependencies: + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + + '@emotion/babel-plugin@11.11.0': + dependencies: + '@babel/helper-module-imports': 7.24.6 + '@babel/runtime': 7.24.6 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.4 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/css@11.11.2': + dependencies: + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.4 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + + '@emotion/hash@0.9.1': {} + + '@emotion/memoize@0.8.1': {} + + '@emotion/serialize@1.1.4': + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + + '@emotion/sheet@1.2.2': {} + + '@emotion/unitless@0.8.1': {} + + '@emotion/utils@1.2.1': {} + + '@emotion/weak-memoize@0.3.1': {} + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@floating-ui/core@1.6.2': + dependencies: + '@floating-ui/utils': 0.2.2 + + '@floating-ui/dom@1.6.5': + dependencies: + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 + + '@floating-ui/utils@0.2.2': {} + + '@floating-ui/vue@1.0.6(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@floating-ui/dom': 1.6.5 + '@floating-ui/utils': 0.2.2 + vue-demi: 0.14.7(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@internationalized/date@3.5.4': + dependencies: + '@swc/helpers': 0.5.11 + + '@internationalized/number@3.5.3': + dependencies: + '@swc/helpers': 0.5.11 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@juggle/resize-observer@3.4.0': {} + + '@mapbox/geojson-rewind@0.5.2': + dependencies: + get-stream: 6.0.1 + minimist: 1.2.8 + + '@mapbox/jsonlint-lines-primitives@2.0.2': {} + + '@mapbox/mapbox-gl-supported@2.0.1': {} + + '@mapbox/point-geometry@0.1.0': {} + + '@mapbox/tiny-sdf@2.0.6': {} + + '@mapbox/unitbezier@0.0.1': {} + + '@mapbox/vector-tile@1.3.1': + dependencies: + '@mapbox/point-geometry': 0.1.0 + + '@mapbox/whoots-js@3.1.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true + + '@rollup/rollup-android-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-x64@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.18.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.18.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.18.0': + optional: true + + '@swc/helpers@0.5.11': + dependencies: + tslib: 2.6.2 + + '@tanstack/virtual-core@3.5.0': {} + + '@tanstack/vue-virtual@3.5.0(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@tanstack/virtual-core': 3.5.0 + vue: 3.4.27(typescript@5.4.5) + + '@types/d3-array@3.2.1': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.10 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.10 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-collection@1.0.13': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.1 + '@types/geojson': 7946.0.14 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.6': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.10 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.9': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.14 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@1.0.11': {} + + '@types/d3-path@3.1.0': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-sankey@0.11.2': + dependencies: + '@types/d3-shape': 1.3.12 + + '@types/d3-scale-chromatic@3.0.3': {} + + '@types/d3-scale@4.0.8': + dependencies: + '@types/d3-time': 3.0.3 + + '@types/d3-selection@3.0.10': {} + + '@types/d3-shape@1.3.12': + dependencies: + '@types/d3-path': 1.0.11 + + '@types/d3-shape@3.1.6': + dependencies: + '@types/d3-path': 3.1.0 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.3': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.8': + dependencies: + '@types/d3-selection': 3.0.10 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.10 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.6 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.9 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.0 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.8 + '@types/d3-scale-chromatic': 3.0.3 + '@types/d3-selection': 3.0.10 + '@types/d3-shape': 3.1.6 + '@types/d3-time': 3.0.3 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.8 + '@types/d3-zoom': 3.0.8 + + '@types/dagre@0.7.52': {} + + '@types/estree@1.0.5': {} + + '@types/geojson@7946.0.14': {} + + '@types/leaflet@1.7.6': + dependencies: + '@types/geojson': 7946.0.14 + + '@types/mapbox__point-geometry@0.1.4': {} + + '@types/mapbox__vector-tile@1.3.4': + dependencies: + '@types/geojson': 7946.0.14 + '@types/mapbox__point-geometry': 0.1.4 + '@types/pbf': 3.0.5 + + '@types/node@20.12.12': + dependencies: + undici-types: 5.26.5 + + '@types/parse-json@4.0.2': {} + + '@types/pbf@3.0.5': {} + + '@types/supercluster@5.0.3': + dependencies: + '@types/geojson': 7946.0.14 + + '@types/three@0.135.0': {} + + '@types/throttle-debounce@5.0.2': {} + + '@types/topojson-client@3.1.4': + dependencies: + '@types/geojson': 7946.0.14 + '@types/topojson-specification': 1.0.5 + + '@types/topojson-server@3.0.4': + dependencies: + '@types/geojson': 7946.0.14 + '@types/topojson-specification': 1.0.5 + + '@types/topojson-simplify@3.0.3': + dependencies: + '@types/geojson': 7946.0.14 + '@types/topojson-specification': 1.0.5 + + '@types/topojson-specification@1.0.5': + dependencies: + '@types/geojson': 7946.0.14 + + '@types/topojson@3.2.6': + dependencies: + '@types/geojson': 7946.0.14 + '@types/topojson-client': 3.1.4 + '@types/topojson-server': 3.0.4 + '@types/topojson-simplify': 3.0.3 + '@types/topojson-specification': 1.0.5 + + '@types/web-bluetooth@0.0.20': {} + + '@unovis/dagre-layout@0.8.8-2': + dependencies: + '@unovis/graphlibrary': 2.2.0-2 + lodash-es: 4.17.21 + + '@unovis/graphlibrary@2.2.0-2': + dependencies: + lodash-es: 4.17.21 + + '@unovis/ts@1.4.1': + dependencies: + '@emotion/css': 11.11.2 + '@juggle/resize-observer': 3.4.0 + '@types/d3': 7.4.3 + '@types/d3-collection': 1.0.13 + '@types/d3-sankey': 0.11.2 + '@types/dagre': 0.7.52 + '@types/geojson': 7946.0.14 + '@types/leaflet': 1.7.6 + '@types/supercluster': 5.0.3 + '@types/three': 0.135.0 + '@types/throttle-debounce': 5.0.2 + '@types/topojson': 3.2.6 + '@types/topojson-client': 3.1.4 + '@types/topojson-specification': 1.0.5 + '@unovis/dagre-layout': 0.8.8-2 + '@unovis/graphlibrary': 2.2.0-2 + d3: 7.9.0 + d3-collection: 1.0.7 + d3-geo-projection: 4.0.0 + d3-interpolate-path: 2.3.0 + d3-sankey: 0.12.3 + elkjs: 0.8.2 + geojson: 0.5.0 + leaflet: 1.7.1 + maplibre-gl: 2.4.0 + striptags: 3.2.0 + supercluster: 7.1.5 + three: 0.135.0 + throttle-debounce: 5.0.0 + to-px: 1.1.0 + topojson-client: 3.1.0 + tslib: 2.6.2 + + '@unovis/vue@1.4.1(@unovis/ts@1.4.1)(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@unovis/ts': 1.4.1 + vue: 3.4.27(typescript@5.4.5) + + '@vee-validate/zod@4.12.8(vue@3.4.27(typescript@5.4.5))': + dependencies: + type-fest: 4.18.3 + vee-validate: 4.12.8(vue@3.4.27(typescript@5.4.5)) + zod: 3.23.8 + transitivePeerDependencies: + - vue + + '@vitejs/plugin-vue@5.0.4(vite@5.2.11(@types/node@20.12.12))(vue@3.4.27(typescript@5.4.5))': + dependencies: + vite: 5.2.11(@types/node@20.12.12) + vue: 3.4.27(typescript@5.4.5) + + '@volar/language-core@2.2.5': + dependencies: + '@volar/source-map': 2.2.5 + + '@volar/source-map@2.2.5': + dependencies: + muggle-string: 0.4.1 + + '@volar/typescript@2.2.5': + dependencies: + '@volar/language-core': 2.2.5 + path-browserify: 1.0.1 + + '@vue/compiler-core@3.4.27': + dependencies: + '@babel/parser': 7.24.6 + '@vue/shared': 3.4.27 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.27': + dependencies: + '@vue/compiler-core': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/compiler-sfc@3.4.27': + dependencies: + '@babel/parser': 7.24.6 + '@vue/compiler-core': 3.4.27 + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.27': + dependencies: + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/devtools-api@6.6.1': {} + + '@vue/language-core@2.0.19(typescript@5.4.5)': + dependencies: + '@volar/language-core': 2.2.5 + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 + computeds: 0.0.1 + minimatch: 9.0.4 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.4.5 + + '@vue/reactivity@3.4.27': + dependencies: + '@vue/shared': 3.4.27 + + '@vue/runtime-core@3.4.27': + dependencies: + '@vue/reactivity': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/runtime-dom@3.4.27': + dependencies: + '@vue/runtime-core': 3.4.27 + '@vue/shared': 3.4.27 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + vue: 3.4.27(typescript@5.4.5) + + '@vue/shared@3.4.27': {} + + '@vueuse/core@10.10.0(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.10.0 + '@vueuse/shared': 10.10.0(vue@3.4.27(typescript@5.4.5)) + vue-demi: 0.14.7(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.10.0': {} + + '@vueuse/shared@10.10.0(vue@3.4.27(typescript@5.4.5))': + dependencies: + vue-demi: 0.14.7(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.6.2 + + autoprefixer@10.4.19(postcss@8.4.38): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001624 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.24.6 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001624 + electron-to-chromium: 1.4.783 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.0) + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001624: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + class-variance-authority@0.7.0: + dependencies: + clsx: 2.0.0 + + clsx@2.0.0: {} + + clsx@2.1.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@7.2.0: {} + + computeds@0.0.1: {} + + convert-source-map@1.9.0: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csscolorparser@1.0.3: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-collection@1.0.7: {} + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo-projection@4.0.0: + dependencies: + commander: 7.2.0 + d3-array: 3.2.4 + d3-geo: 3.1.1 + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate-path@2.3.0: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + de-indent@1.0.2: {} + + defu@6.1.4: {} + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + earcut@2.2.4: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.4.783: {} + + elkjs@0.8.2: {} + + embla-carousel-reactive-utils@8.1.3(embla-carousel@8.1.3): + dependencies: + embla-carousel: 8.1.3 + + embla-carousel-vue@8.1.3(vue@3.4.27(typescript@5.4.5)): + dependencies: + embla-carousel: 8.1.3 + embla-carousel-reactive-utils: 8.1.3(embla-carousel@8.1.3) + vue: 3.4.27(typescript@5.4.5) + + embla-carousel@8.1.3: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + estree-walker@2.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-root@1.1.0: {} + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + geojson-vt@3.2.1: {} + + geojson@0.5.0: {} + + get-stream@6.0.1: {} + + gl-matrix@3.4.3: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.1: + dependencies: + foreground-child: 3.1.1 + jackspeak: 3.1.2 + minimatch: 9.0.4 + minipass: 7.1.2 + path-scurry: 1.11.1 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + has-flag@3.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + ini@1.3.8: {} + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.1.2: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.0: {} + + js-tokens@4.0.0: {} + + json-parse-even-better-errors@2.3.1: {} + + kdbush@3.0.0: {} + + kind-of@6.0.3: {} + + leaflet@1.7.1: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.1: {} + + lines-and-columns@1.2.4: {} + + lodash-es@4.17.21: {} + + lru-cache@10.2.2: {} + + lucide-vue-next@0.379.0(vue@3.4.27(typescript@5.4.5)): + dependencies: + vue: 3.4.27(typescript@5.4.5) + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + maplibre-gl@2.4.0: + dependencies: + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/mapbox-gl-supported': 2.0.1 + '@mapbox/point-geometry': 0.1.0 + '@mapbox/tiny-sdf': 2.0.6 + '@mapbox/unitbezier': 0.0.1 + '@mapbox/vector-tile': 1.3.1 + '@mapbox/whoots-js': 3.1.0 + '@types/geojson': 7946.0.14 + '@types/mapbox__point-geometry': 0.1.4 + '@types/mapbox__vector-tile': 1.3.4 + '@types/pbf': 3.0.5 + csscolorparser: 1.0.3 + earcut: 2.2.4 + geojson-vt: 3.2.1 + gl-matrix: 3.4.3 + global-prefix: 3.0.0 + murmurhash-js: 1.0.0 + pbf: 3.2.1 + potpack: 1.0.2 + quickselect: 2.0.0 + supercluster: 7.1.5 + tinyqueue: 2.0.3 + vt-pbf: 3.1.3 + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + muggle-string@0.4.1: {} + + murmurhash-js@1.0.0: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + nanoid@5.0.7: {} + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-unit@1.0.1: {} + + path-browserify@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pbf@3.2.1: + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + postcss-import@15.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.38): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + + postcss-load-config@4.0.2(postcss@8.4.38): + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.2 + optionalDependencies: + postcss: 8.4.38 + + postcss-nested@6.0.1(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.1.0 + + postcss-selector-parser@6.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + potpack@1.0.2: {} + + protocol-buffers-schema@3.6.0: {} + + queue-microtask@1.2.3: {} + + quickselect@2.0.0: {} + + radix-vue@1.8.2(vue@3.4.27(typescript@5.4.5)): + dependencies: + '@floating-ui/dom': 1.6.5 + '@floating-ui/vue': 1.0.6(vue@3.4.27(typescript@5.4.5)) + '@internationalized/date': 3.5.4 + '@internationalized/number': 3.5.3 + '@tanstack/vue-virtual': 3.5.0(vue@3.4.27(typescript@5.4.5)) + '@vueuse/core': 10.10.0(vue@3.4.27(typescript@5.4.5)) + '@vueuse/shared': 10.10.0(vue@3.4.27(typescript@5.4.5)) + aria-hidden: 1.2.4 + defu: 6.1.4 + fast-deep-equal: 3.1.3 + nanoid: 5.0.7 + vue: 3.4.27(typescript@5.4.5) + transitivePeerDependencies: + - '@vue/composition-api' + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + regenerator-runtime@0.14.1: {} + + resolve-from@4.0.0: {} + + resolve-protobuf-schema@2.1.0: + dependencies: + protocol-buffers-schema: 3.6.0 + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + robust-predicates@3.0.2: {} + + rollup@4.18.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + safer-buffer@2.1.2: {} + + semver@7.6.2: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.0: {} + + source-map@0.5.7: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + striptags@3.2.0: {} + + stylis@4.2.0: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supercluster@7.1.5: + dependencies: + kdbush: 3.0.0 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@2.3.0: + dependencies: + '@babel/runtime': 7.24.6 + + tailwindcss-animate@1.0.7(tailwindcss@3.4.3): + dependencies: + tailwindcss: 3.4.3 + + tailwindcss@3.4.3: + 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.0 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.1.0 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + three@0.135.0: {} + + throttle-debounce@5.0.0: {} + + tinyqueue@2.0.3: {} + + to-fast-properties@2.0.0: {} + + to-px@1.1.0: + dependencies: + parse-unit: 1.0.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + topojson-client@3.1.0: + dependencies: + commander: 2.20.3 + + ts-interface-checker@0.1.13: {} + + tslib@2.6.2: {} + + type-fest@4.18.3: {} + + typescript@5.4.5: {} + + undici-types@5.26.5: {} + + update-browserslist-db@1.0.16(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.1 + + util-deprecate@1.0.2: {} + + vaul-vue@0.1.2(typescript@5.4.5): + dependencies: + '@vueuse/core': 10.10.0(vue@3.4.27(typescript@5.4.5)) + radix-vue: 1.8.2(vue@3.4.27(typescript@5.4.5)) + vue: 3.4.27(typescript@5.4.5) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + + vee-validate@4.12.8(vue@3.4.27(typescript@5.4.5)): + dependencies: + '@vue/devtools-api': 6.6.1 + type-fest: 4.18.3 + vue: 3.4.27(typescript@5.4.5) + + vite@5.2.11(@types/node@20.12.12): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + '@types/node': 20.12.12 + fsevents: 2.3.3 + + vt-pbf@3.1.3: + dependencies: + '@mapbox/point-geometry': 0.1.0 + '@mapbox/vector-tile': 1.3.1 + pbf: 3.2.1 + + vue-demi@0.14.7(vue@3.4.27(typescript@5.4.5)): + dependencies: + vue: 3.4.27(typescript@5.4.5) + + vue-sonner@1.1.2: {} + + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + vue-tsc@2.0.19(typescript@5.4.5): + dependencies: + '@volar/typescript': 2.2.5 + '@vue/language-core': 2.0.19(typescript@5.4.5) + semver: 7.6.2 + typescript: 5.4.5 + + vue@3.4.27(typescript@5.4.5): + dependencies: + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-sfc': 3.4.27 + '@vue/runtime-dom': 3.4.27 + '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.4.5)) + '@vue/shared': 3.4.27 + optionalDependencies: + typescript: 5.4.5 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + yaml@1.10.2: {} + + yaml@2.4.2: {} + + zod@3.23.8: {} diff --git a/web/frontend/public/vite.svg b/web/frontend/public/vite.svg new file mode 100644 index 0000000000..44cc2de842 --- /dev/null +++ b/web/frontend/public/vite.svg @@ -0,0 +1,18 @@ + diff --git a/web/frontend/src/App.vue b/web/frontend/src/App.vue new file mode 100644 index 0000000000..bb65c76d34 --- /dev/null +++ b/web/frontend/src/App.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/web/frontend/src/assets/index.css b/web/frontend/src/assets/index.css new file mode 100644 index 0000000000..58ed9b3130 --- /dev/null +++ b/web/frontend/src/assets/index.css @@ -0,0 +1,92 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + + /* ... */ + --vis-tooltip-background-color: none !important; + --vis-tooltip-border-color: none !important; + --vis-tooltip-text-color: none !important; + --vis-tooltip-shadow-color: none !important; + --vis-tooltip-backdrop-filter: none !important; + --vis-tooltip-padding: none !important; + + --vis-primary-color: var(--primary); + /* change to any hsl value you want */ + --vis-secondary-color: 160 81% 40%; + --vis-text-color: var(--muted-foreground); + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + + body { + @apply bg-background text-foreground; + } +} diff --git a/web/frontend/src/assets/vue.svg b/web/frontend/src/assets/vue.svg new file mode 100644 index 0000000000..242908f75d --- /dev/null +++ b/web/frontend/src/assets/vue.svg @@ -0,0 +1,6 @@ + diff --git a/web/frontend/src/components/HelloWorld.vue b/web/frontend/src/components/HelloWorld.vue new file mode 100644 index 0000000000..a0b709a6c5 --- /dev/null +++ b/web/frontend/src/components/HelloWorld.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/web/frontend/src/components/ui/accordion/Accordion.vue b/web/frontend/src/components/ui/accordion/Accordion.vue new file mode 100644 index 0000000000..8ce8571b8b --- /dev/null +++ b/web/frontend/src/components/ui/accordion/Accordion.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/accordion/AccordionContent.vue b/web/frontend/src/components/ui/accordion/AccordionContent.vue new file mode 100644 index 0000000000..d8ec988958 --- /dev/null +++ b/web/frontend/src/components/ui/accordion/AccordionContent.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/accordion/AccordionItem.vue b/web/frontend/src/components/ui/accordion/AccordionItem.vue new file mode 100644 index 0000000000..9975c238f4 --- /dev/null +++ b/web/frontend/src/components/ui/accordion/AccordionItem.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/accordion/AccordionTrigger.vue b/web/frontend/src/components/ui/accordion/AccordionTrigger.vue new file mode 100644 index 0000000000..17c15ca2b9 --- /dev/null +++ b/web/frontend/src/components/ui/accordion/AccordionTrigger.vue @@ -0,0 +1,39 @@ + + + diff --git a/web/frontend/src/components/ui/accordion/index.ts b/web/frontend/src/components/ui/accordion/index.ts new file mode 100644 index 0000000000..9340ac0658 --- /dev/null +++ b/web/frontend/src/components/ui/accordion/index.ts @@ -0,0 +1,4 @@ +export { default as Accordion } from './Accordion.vue' +export { default as AccordionContent } from './AccordionContent.vue' +export { default as AccordionItem } from './AccordionItem.vue' +export { default as AccordionTrigger } from './AccordionTrigger.vue' diff --git a/web/frontend/src/components/ui/alert/Alert.vue b/web/frontend/src/components/ui/alert/Alert.vue new file mode 100644 index 0000000000..b3502d521c --- /dev/null +++ b/web/frontend/src/components/ui/alert/Alert.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/alert/AlertDescription.vue b/web/frontend/src/components/ui/alert/AlertDescription.vue new file mode 100644 index 0000000000..2971a877b0 --- /dev/null +++ b/web/frontend/src/components/ui/alert/AlertDescription.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/alert/AlertTitle.vue b/web/frontend/src/components/ui/alert/AlertTitle.vue new file mode 100644 index 0000000000..e28dd37eae --- /dev/null +++ b/web/frontend/src/components/ui/alert/AlertTitle.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/alert/index.ts b/web/frontend/src/components/ui/alert/index.ts new file mode 100644 index 0000000000..765f704d04 --- /dev/null +++ b/web/frontend/src/components/ui/alert/index.ts @@ -0,0 +1,23 @@ +import { type VariantProps, cva } from 'class-variance-authority' + +export { default as Alert } from './Alert.vue' +export { default as AlertTitle } from './AlertTitle.vue' +export { default as AlertDescription } from './AlertDescription.vue' + +export const alertVariants = cva( + 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', + { + variants: { + variant: { + default: 'bg-background text-foreground', + destructive: + 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +export type AlertVariants = VariantProps diff --git a/web/frontend/src/components/ui/auto-form/AutoForm.vue b/web/frontend/src/components/ui/auto-form/AutoForm.vue new file mode 100644 index 0000000000..3500e45038 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoForm.vue @@ -0,0 +1,105 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormField.vue b/web/frontend/src/components/ui/auto-form/AutoFormField.vue new file mode 100644 index 0000000000..5c31d8b477 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormField.vue @@ -0,0 +1,45 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormFieldArray.vue b/web/frontend/src/components/ui/auto-form/AutoFormFieldArray.vue new file mode 100644 index 0000000000..666dccf3c7 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormFieldArray.vue @@ -0,0 +1,110 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormFieldBoolean.vue b/web/frontend/src/components/ui/auto-form/AutoFormFieldBoolean.vue new file mode 100644 index 0000000000..03aee45a5b --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormFieldBoolean.vue @@ -0,0 +1,41 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormFieldDate.vue b/web/frontend/src/components/ui/auto-form/AutoFormFieldDate.vue new file mode 100644 index 0000000000..478d631022 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormFieldDate.vue @@ -0,0 +1,57 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormFieldEnum.vue b/web/frontend/src/components/ui/auto-form/AutoFormFieldEnum.vue new file mode 100644 index 0000000000..aa5f2b3257 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormFieldEnum.vue @@ -0,0 +1,49 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormFieldFile.vue b/web/frontend/src/components/ui/auto-form/AutoFormFieldFile.vue new file mode 100644 index 0000000000..13cc09031c --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormFieldFile.vue @@ -0,0 +1,74 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormFieldInput.vue b/web/frontend/src/components/ui/auto-form/AutoFormFieldInput.vue new file mode 100644 index 0000000000..8bcff6ca71 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormFieldInput.vue @@ -0,0 +1,36 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormFieldNumber.vue b/web/frontend/src/components/ui/auto-form/AutoFormFieldNumber.vue new file mode 100644 index 0000000000..d494a5b53a --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormFieldNumber.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormFieldObject.vue b/web/frontend/src/components/ui/auto-form/AutoFormFieldObject.vue new file mode 100644 index 0000000000..c489233615 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormFieldObject.vue @@ -0,0 +1,78 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/AutoFormLabel.vue b/web/frontend/src/components/ui/auto-form/AutoFormLabel.vue new file mode 100644 index 0000000000..121b5c0af8 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/AutoFormLabel.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/auto-form/constant.ts b/web/frontend/src/components/ui/auto-form/constant.ts new file mode 100644 index 0000000000..33fee68762 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/constant.ts @@ -0,0 +1,39 @@ +import AutoFormFieldArray from './AutoFormFieldArray.vue' +import AutoFormFieldBoolean from './AutoFormFieldBoolean.vue' +import AutoFormFieldDate from './AutoFormFieldDate.vue' +import AutoFormFieldEnum from './AutoFormFieldEnum.vue' +import AutoFormFieldFile from './AutoFormFieldFile.vue' +import AutoFormFieldInput from './AutoFormFieldInput.vue' +import AutoFormFieldNumber from './AutoFormFieldNumber.vue' +import AutoFormFieldObject from './AutoFormFieldObject.vue' + +export const INPUT_COMPONENTS = { + date: AutoFormFieldDate, + select: AutoFormFieldEnum, + radio: AutoFormFieldEnum, + checkbox: AutoFormFieldBoolean, + switch: AutoFormFieldBoolean, + textarea: AutoFormFieldInput, + number: AutoFormFieldNumber, + string: AutoFormFieldInput, + file: AutoFormFieldFile, + array: AutoFormFieldArray, + object: AutoFormFieldObject, +} + +/** + * Define handlers for specific Zod types. + * You can expand this object to support more types. + */ +export const DEFAULT_ZOD_HANDLERS: { + [key: string]: keyof typeof INPUT_COMPONENTS +} = { + ZodString: 'string', + ZodBoolean: 'checkbox', + ZodDate: 'date', + ZodEnum: 'select', + ZodNativeEnum: 'select', + ZodNumber: 'number', + ZodArray: 'array', + ZodObject: 'object', +} diff --git a/web/frontend/src/components/ui/auto-form/dependencies.ts b/web/frontend/src/components/ui/auto-form/dependencies.ts new file mode 100644 index 0000000000..ea761633e3 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/dependencies.ts @@ -0,0 +1,92 @@ +import type * as z from 'zod' +import type { Ref } from 'vue' +import { computed, ref, watch } from 'vue' +import { useFieldValue, useFormValues } from 'vee-validate' +import { createContext } from 'radix-vue' +import { type Dependency, DependencyType, type EnumValues } from './interface' +import { getFromPath, getIndexIfArray } from './utils' + +export const [injectDependencies, provideDependencies] = createContext>>[] | undefined>>('AutoFormDependencies') + +export default function useDependencies( + fieldName: string, +) { + const form = useFormValues() + // parsed test[0].age => test.age + const currentFieldName = fieldName.replace(/\[\d+\]/g, '') + const currentFieldValue = useFieldValue(fieldName) + + if (!form) + throw new Error('useDependencies should be used within ') + + const dependencies = injectDependencies() + const isDisabled = ref(false) + const isHidden = ref(false) + const isRequired = ref(false) + const overrideOptions = ref() + + const currentFieldDependencies = computed(() => dependencies.value?.filter( + dependency => dependency.targetField === currentFieldName, + )) + + function getSourceValue(dep: Dependency) { + const source = dep.sourceField as string + const index = getIndexIfArray(fieldName) ?? -1 + const [sourceLast, ...sourceInitial] = source.split('.').toReversed() + const [_targetLast, ...targetInitial] = (dep.targetField as string).split('.').toReversed() + + if (index >= 0 && sourceInitial.join(',') === targetInitial.join(',')) { + const [_currentLast, ...currentInitial] = fieldName.split('.').toReversed() + return getFromPath(form.value, currentInitial.join('.') + sourceLast) + } + + return getFromPath(form.value, source) + } + + const sourceFieldValues = computed(() => currentFieldDependencies.value?.map(dep => getSourceValue(dep))) + + const resetConditionState = () => { + isDisabled.value = false + isHidden.value = false + isRequired.value = false + overrideOptions.value = undefined + } + + watch([sourceFieldValues, dependencies], () => { + resetConditionState() + currentFieldDependencies.value?.forEach((dep) => { + const sourceValue = getSourceValue(dep) + const conditionMet = dep.when(sourceValue, currentFieldValue.value) + + switch (dep.type) { + case DependencyType.DISABLES: + if (conditionMet) + isDisabled.value = true + + break + case DependencyType.REQUIRES: + if (conditionMet) + isRequired.value = true + + break + case DependencyType.HIDES: + if (conditionMet) + isHidden.value = true + + break + case DependencyType.SETS_OPTIONS: + if (conditionMet) + overrideOptions.value = dep.options + + break + } + }) + }, { immediate: true, deep: true }) + + return { + isDisabled, + isHidden, + isRequired, + overrideOptions, + } +} diff --git a/web/frontend/src/components/ui/auto-form/index.ts b/web/frontend/src/components/ui/auto-form/index.ts new file mode 100644 index 0000000000..0fb8438403 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/index.ts @@ -0,0 +1,15 @@ +export { getObjectFormSchema, getBaseSchema, getBaseType } from './utils' +export type { Config, ConfigItem, FieldProps } from './interface' + +export { default as AutoForm } from './AutoForm.vue' +export { default as AutoFormField } from './AutoFormField.vue' +export { default as AutoFormLabel } from './AutoFormLabel.vue' + +export { default as AutoFormFieldArray } from './AutoFormFieldArray.vue' +export { default as AutoFormFieldBoolean } from './AutoFormFieldBoolean.vue' +export { default as AutoFormFieldDate } from './AutoFormFieldDate.vue' +export { default as AutoFormFieldEnum } from './AutoFormFieldEnum.vue' +export { default as AutoFormFieldFile } from './AutoFormFieldFile.vue' +export { default as AutoFormFieldInput } from './AutoFormFieldInput.vue' +export { default as AutoFormFieldNumber } from './AutoFormFieldNumber.vue' +export { default as AutoFormFieldObject } from './AutoFormFieldObject.vue' diff --git a/web/frontend/src/components/ui/auto-form/interface.ts b/web/frontend/src/components/ui/auto-form/interface.ts new file mode 100644 index 0000000000..4dd8b1214f --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/interface.ts @@ -0,0 +1,81 @@ +import type { Component, InputHTMLAttributes } from 'vue' +import type { ZodAny, z } from 'zod' +import type { INPUT_COMPONENTS } from './constant' + +export interface FieldProps { + fieldName: string + label?: string + required?: boolean + config?: ConfigItem + disabled?: boolean +} + +export interface Shape { + type: string + default?: any + required?: boolean + options?: string[] + schema?: ZodAny +} + +export interface ConfigItem { + /** Value for the `FormLabel` */ + label?: string + /** Value for the `FormDescription` */ + description?: string + /** Pick which component to be rendered. */ + component?: keyof typeof INPUT_COMPONENTS | Component + /** Hide `FormLabel`. */ + hideLabel?: boolean + inputProps?: InputHTMLAttributes +} + +// Define a type to unwrap an array +type UnwrapArray = T extends (infer U)[] ? U : never + +export type Config = { + // If SchemaType.key is an object, create a nested Config, otherwise ConfigItem + [Key in keyof SchemaType]?: + SchemaType[Key] extends any[] + ? UnwrapArray> + : SchemaType[Key] extends object + ? Config + : ConfigItem; +} + +export enum DependencyType { + DISABLES, + REQUIRES, + HIDES, + SETS_OPTIONS, +} + +interface BaseDependency>> { + sourceField: keyof SchemaType + type: DependencyType + targetField: keyof SchemaType + when: (sourceFieldValue: any, targetFieldValue: any) => boolean +} + +export type ValueDependency>> = + BaseDependency & { + type: + | DependencyType.DISABLES + | DependencyType.REQUIRES + | DependencyType.HIDES + } + +export type EnumValues = readonly [string, ...string[]] + +export type OptionsDependency< + SchemaType extends z.infer>, +> = BaseDependency & { + type: DependencyType.SETS_OPTIONS + + // Partial array of values from sourceField that will trigger the dependency + options: EnumValues +} + +export type Dependency>> = + | ValueDependency + | OptionsDependency diff --git a/web/frontend/src/components/ui/auto-form/utils.ts b/web/frontend/src/components/ui/auto-form/utils.ts new file mode 100644 index 0000000000..da3d33f223 --- /dev/null +++ b/web/frontend/src/components/ui/auto-form/utils.ts @@ -0,0 +1,171 @@ +import type { z } from 'zod' + +// TODO: This should support recursive ZodEffects but TypeScript doesn't allow circular type definitions. +export type ZodObjectOrWrapped = + | z.ZodObject + | z.ZodEffects> + +/** + * Beautify a camelCase string. + * e.g. "myString" -> "My String" + */ +export function beautifyObjectName(string: string) { + // Remove bracketed indices + // if numbers only return the string + let output = string.replace(/\[\d+\]/g, '').replace(/([A-Z])/g, ' $1') + output = output.charAt(0).toUpperCase() + output.slice(1) + return output +} + +/** + * Parse string and extract the index + * @param string + * @returns index or undefined + */ +export function getIndexIfArray(string: string) { + const indexRegex = /\[(\d+)\]/ + // Match the index + const match = string.match(indexRegex) + // Extract the index (number) + const index = match ? Number.parseInt(match[1]) : undefined + return index +} + +/** + * Get the lowest level Zod type. + * This will unpack optionals, refinements, etc. + */ +export function getBaseSchema< + ChildType extends z.ZodAny | z.AnyZodObject = z.ZodAny, +>(schema: ChildType | z.ZodEffects): ChildType | null { + if (!schema) + return null + if ('innerType' in schema._def) + return getBaseSchema(schema._def.innerType as ChildType) + + if ('schema' in schema._def) + return getBaseSchema(schema._def.schema as ChildType) + + return schema as ChildType +} + +/** + * Get the type name of the lowest level Zod type. + * This will unpack optionals, refinements, etc. + */ +export function getBaseType(schema: z.ZodAny) { + const baseSchema = getBaseSchema(schema) + return baseSchema ? baseSchema._def.typeName : '' +} + +/** + * Search for a "ZodDefault" in the Zod stack and return its value. + */ +export function getDefaultValueInZodStack(schema: z.ZodAny): any { + const typedSchema = schema as unknown as z.ZodDefault< + z.ZodNumber | z.ZodString + > + + if (typedSchema._def.typeName === 'ZodDefault') + return typedSchema._def.defaultValue() + + if ('innerType' in typedSchema._def) { + return getDefaultValueInZodStack( + typedSchema._def.innerType as unknown as z.ZodAny, + ) + } + if ('schema' in typedSchema._def) { + return getDefaultValueInZodStack( + (typedSchema._def as any).schema as z.ZodAny, + ) + } + + return undefined +} + +export function getObjectFormSchema( + schema: ZodObjectOrWrapped, +): z.ZodObject { + if (schema?._def.typeName === 'ZodEffects') { + const typedSchema = schema as z.ZodEffects> + return getObjectFormSchema(typedSchema._def.schema) + } + return schema as z.ZodObject +} + +function isIndex(value: unknown): value is number { + return Number(value) >= 0 +} +/** + * Constructs a path with dot paths for arrays to use brackets to be compatible with vee-validate path syntax + */ +export function normalizeFormPath(path: string): string { + const pathArr = path.split('.') + if (!pathArr.length) + return '' + + let fullPath = String(pathArr[0]) + for (let i = 1; i < pathArr.length; i++) { + if (isIndex(pathArr[i])) { + fullPath += `[${pathArr[i]}]` + continue + } + + fullPath += `.${pathArr[i]}` + } + + return fullPath +} + +type NestedRecord = Record | { [k: string]: NestedRecord } +/** + * Checks if the path opted out of nested fields using `[fieldName]` syntax + */ +export function isNotNestedPath(path: string) { + return /^\[.+\]$/i.test(path) +} +function isObject(obj: unknown): obj is Record { + return obj !== null && !!obj && typeof obj === 'object' && !Array.isArray(obj) +} +function isContainerValue(value: unknown): value is Record { + return isObject(value) || Array.isArray(value) +} +function cleanupNonNestedPath(path: string) { + if (isNotNestedPath(path)) + return path.replace(/\[|\]/gi, '') + + return path +} + +/** + * Gets a nested property value from an object + */ +export function getFromPath(object: NestedRecord | undefined, path: string): TValue | undefined +export function getFromPath( + object: NestedRecord | undefined, + path: string, + fallback?: TFallback, +): TValue | TFallback +export function getFromPath( + object: NestedRecord | undefined, + path: string, + fallback?: TFallback, +): TValue | TFallback | undefined { + if (!object) + return fallback + + if (isNotNestedPath(path)) + return object[cleanupNonNestedPath(path)] as TValue | undefined + + const resolvedValue = (path || '') + .split(/\.|\[(\d+)\]/) + .filter(Boolean) + .reduce((acc, propKey) => { + if (isContainerValue(acc) && propKey in acc) + return acc[propKey] + + return fallback + }, object as unknown) + + return resolvedValue as TValue | undefined +} diff --git a/web/frontend/src/components/ui/avatar/Avatar.vue b/web/frontend/src/components/ui/avatar/Avatar.vue new file mode 100644 index 0000000000..5b7b9fbf6c --- /dev/null +++ b/web/frontend/src/components/ui/avatar/Avatar.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/avatar/AvatarFallback.vue b/web/frontend/src/components/ui/avatar/AvatarFallback.vue new file mode 100644 index 0000000000..a671a21994 --- /dev/null +++ b/web/frontend/src/components/ui/avatar/AvatarFallback.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/avatar/AvatarImage.vue b/web/frontend/src/components/ui/avatar/AvatarImage.vue new file mode 100644 index 0000000000..43499fa2dd --- /dev/null +++ b/web/frontend/src/components/ui/avatar/AvatarImage.vue @@ -0,0 +1,9 @@ + + + diff --git a/web/frontend/src/components/ui/avatar/index.ts b/web/frontend/src/components/ui/avatar/index.ts new file mode 100644 index 0000000000..c4af1a66cc --- /dev/null +++ b/web/frontend/src/components/ui/avatar/index.ts @@ -0,0 +1,24 @@ +import { type VariantProps, cva } from 'class-variance-authority' + +export { default as Avatar } from './Avatar.vue' +export { default as AvatarImage } from './AvatarImage.vue' +export { default as AvatarFallback } from './AvatarFallback.vue' + +export const avatarVariant = cva( + 'inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden', + { + variants: { + size: { + sm: 'h-10 w-10 text-xs', + base: 'h-16 w-16 text-2xl', + lg: 'h-32 w-32 text-5xl', + }, + shape: { + circle: 'rounded-full', + square: 'rounded-md', + }, + }, + }, +) + +export type AvatarVariants = VariantProps diff --git a/web/frontend/src/components/ui/badge/Badge.vue b/web/frontend/src/components/ui/badge/Badge.vue new file mode 100644 index 0000000000..2e8bdffa56 --- /dev/null +++ b/web/frontend/src/components/ui/badge/Badge.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/badge/index.ts b/web/frontend/src/components/ui/badge/index.ts new file mode 100644 index 0000000000..d90c2ef42f --- /dev/null +++ b/web/frontend/src/components/ui/badge/index.ts @@ -0,0 +1,25 @@ +import { type VariantProps, cva } from 'class-variance-authority' + +export { default as Badge } from './Badge.vue' + +export const badgeVariants = cva( + 'inline-flex items-center rounded-full 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 hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80', + outline: 'text-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +export type BadgeVariants = VariantProps diff --git a/web/frontend/src/components/ui/breadcrumb/Breadcrumb.vue b/web/frontend/src/components/ui/breadcrumb/Breadcrumb.vue new file mode 100644 index 0000000000..72ca143718 --- /dev/null +++ b/web/frontend/src/components/ui/breadcrumb/Breadcrumb.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/frontend/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue b/web/frontend/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue new file mode 100644 index 0000000000..4925600d15 --- /dev/null +++ b/web/frontend/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/breadcrumb/BreadcrumbItem.vue b/web/frontend/src/components/ui/breadcrumb/BreadcrumbItem.vue new file mode 100644 index 0000000000..42e721cdae --- /dev/null +++ b/web/frontend/src/components/ui/breadcrumb/BreadcrumbItem.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/breadcrumb/BreadcrumbLink.vue b/web/frontend/src/components/ui/breadcrumb/BreadcrumbLink.vue new file mode 100644 index 0000000000..67de3947e3 --- /dev/null +++ b/web/frontend/src/components/ui/breadcrumb/BreadcrumbLink.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/breadcrumb/BreadcrumbList.vue b/web/frontend/src/components/ui/breadcrumb/BreadcrumbList.vue new file mode 100644 index 0000000000..60856cc45d --- /dev/null +++ b/web/frontend/src/components/ui/breadcrumb/BreadcrumbList.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/breadcrumb/BreadcrumbPage.vue b/web/frontend/src/components/ui/breadcrumb/BreadcrumbPage.vue new file mode 100644 index 0000000000..fe43bda690 --- /dev/null +++ b/web/frontend/src/components/ui/breadcrumb/BreadcrumbPage.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/breadcrumb/BreadcrumbSeparator.vue b/web/frontend/src/components/ui/breadcrumb/BreadcrumbSeparator.vue new file mode 100644 index 0000000000..436015df1c --- /dev/null +++ b/web/frontend/src/components/ui/breadcrumb/BreadcrumbSeparator.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/breadcrumb/index.ts b/web/frontend/src/components/ui/breadcrumb/index.ts new file mode 100644 index 0000000000..05909832b9 --- /dev/null +++ b/web/frontend/src/components/ui/breadcrumb/index.ts @@ -0,0 +1,7 @@ +export { default as Breadcrumb } from './Breadcrumb.vue' +export { default as BreadcrumbEllipsis } from './BreadcrumbEllipsis.vue' +export { default as BreadcrumbItem } from './BreadcrumbItem.vue' +export { default as BreadcrumbLink } from './BreadcrumbLink.vue' +export { default as BreadcrumbList } from './BreadcrumbList.vue' +export { default as BreadcrumbPage } from './BreadcrumbPage.vue' +export { default as BreadcrumbSeparator } from './BreadcrumbSeparator.vue' diff --git a/web/frontend/src/components/ui/button/Button.vue b/web/frontend/src/components/ui/button/Button.vue new file mode 100644 index 0000000000..5cfd668a43 --- /dev/null +++ b/web/frontend/src/components/ui/button/Button.vue @@ -0,0 +1,26 @@ + + + diff --git a/web/frontend/src/components/ui/button/index.ts b/web/frontend/src/components/ui/button/index.ts new file mode 100644 index 0000000000..1b00c3268b --- /dev/null +++ b/web/frontend/src/components/ui/button/index.ts @@ -0,0 +1,35 @@ +import { type VariantProps, cva } from 'class-variance-authority' + +export { default as Button } from './Button.vue' + +export const buttonVariants = cva( + 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground hover:bg-primary/90', + destructive: + 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + outline: + 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + xs: 'h-7 rounded px-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export type ButtonVariants = VariantProps diff --git a/web/frontend/src/components/ui/calendar/Calendar.vue b/web/frontend/src/components/ui/calendar/Calendar.vue new file mode 100644 index 0000000000..0486e49668 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/Calendar.vue @@ -0,0 +1,60 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarCell.vue b/web/frontend/src/components/ui/calendar/CalendarCell.vue new file mode 100644 index 0000000000..14843ce299 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarCell.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarCellTrigger.vue b/web/frontend/src/components/ui/calendar/CalendarCellTrigger.vue new file mode 100644 index 0000000000..c00cd21011 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarCellTrigger.vue @@ -0,0 +1,38 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarGrid.vue b/web/frontend/src/components/ui/calendar/CalendarGrid.vue new file mode 100644 index 0000000000..2fe5439af5 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarGrid.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarGridBody.vue b/web/frontend/src/components/ui/calendar/CalendarGridBody.vue new file mode 100644 index 0000000000..23d71ced64 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarGridBody.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarGridHead.vue b/web/frontend/src/components/ui/calendar/CalendarGridHead.vue new file mode 100644 index 0000000000..f8101a3df2 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarGridHead.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarGridRow.vue b/web/frontend/src/components/ui/calendar/CalendarGridRow.vue new file mode 100644 index 0000000000..47fdb46022 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarGridRow.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarHeadCell.vue b/web/frontend/src/components/ui/calendar/CalendarHeadCell.vue new file mode 100644 index 0000000000..f1ebfbab2f --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarHeadCell.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarHeader.vue b/web/frontend/src/components/ui/calendar/CalendarHeader.vue new file mode 100644 index 0000000000..8bfa196903 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarHeader.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarHeading.vue b/web/frontend/src/components/ui/calendar/CalendarHeading.vue new file mode 100644 index 0000000000..7062d3db96 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarHeading.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarNextButton.vue b/web/frontend/src/components/ui/calendar/CalendarNextButton.vue new file mode 100644 index 0000000000..a5335086a3 --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarNextButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/CalendarPrevButton.vue b/web/frontend/src/components/ui/calendar/CalendarPrevButton.vue new file mode 100644 index 0000000000..a7e5a5159b --- /dev/null +++ b/web/frontend/src/components/ui/calendar/CalendarPrevButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/frontend/src/components/ui/calendar/index.ts b/web/frontend/src/components/ui/calendar/index.ts new file mode 100644 index 0000000000..5239a1bd7c --- /dev/null +++ b/web/frontend/src/components/ui/calendar/index.ts @@ -0,0 +1,12 @@ +export { default as Calendar } from './Calendar.vue' +export { default as CalendarCell } from './CalendarCell.vue' +export { default as CalendarCellTrigger } from './CalendarCellTrigger.vue' +export { default as CalendarGrid } from './CalendarGrid.vue' +export { default as CalendarGridBody } from './CalendarGridBody.vue' +export { default as CalendarGridHead } from './CalendarGridHead.vue' +export { default as CalendarGridRow } from './CalendarGridRow.vue' +export { default as CalendarHeadCell } from './CalendarHeadCell.vue' +export { default as CalendarHeader } from './CalendarHeader.vue' +export { default as CalendarHeading } from './CalendarHeading.vue' +export { default as CalendarNextButton } from './CalendarNextButton.vue' +export { default as CalendarPrevButton } from './CalendarPrevButton.vue' diff --git a/web/frontend/src/components/ui/card/Card.vue b/web/frontend/src/components/ui/card/Card.vue new file mode 100644 index 0000000000..12dd5ec7d5 --- /dev/null +++ b/web/frontend/src/components/ui/card/Card.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/card/CardContent.vue b/web/frontend/src/components/ui/card/CardContent.vue new file mode 100644 index 0000000000..785913a192 --- /dev/null +++ b/web/frontend/src/components/ui/card/CardContent.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/card/CardDescription.vue b/web/frontend/src/components/ui/card/CardDescription.vue new file mode 100644 index 0000000000..d5faedd5c5 --- /dev/null +++ b/web/frontend/src/components/ui/card/CardDescription.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/card/CardFooter.vue b/web/frontend/src/components/ui/card/CardFooter.vue new file mode 100644 index 0000000000..1ed2efe57e --- /dev/null +++ b/web/frontend/src/components/ui/card/CardFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/card/CardHeader.vue b/web/frontend/src/components/ui/card/CardHeader.vue new file mode 100644 index 0000000000..951d227e91 --- /dev/null +++ b/web/frontend/src/components/ui/card/CardHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/card/CardTitle.vue b/web/frontend/src/components/ui/card/CardTitle.vue new file mode 100644 index 0000000000..842e168990 --- /dev/null +++ b/web/frontend/src/components/ui/card/CardTitle.vue @@ -0,0 +1,18 @@ + + + diff --git a/web/frontend/src/components/ui/card/index.ts b/web/frontend/src/components/ui/card/index.ts new file mode 100644 index 0000000000..8170483c3b --- /dev/null +++ b/web/frontend/src/components/ui/card/index.ts @@ -0,0 +1,6 @@ +export { default as Card } from './Card.vue' +export { default as CardHeader } from './CardHeader.vue' +export { default as CardTitle } from './CardTitle.vue' +export { default as CardDescription } from './CardDescription.vue' +export { default as CardContent } from './CardContent.vue' +export { default as CardFooter } from './CardFooter.vue' diff --git a/web/frontend/src/components/ui/carousel/Carousel.vue b/web/frontend/src/components/ui/carousel/Carousel.vue new file mode 100644 index 0000000000..b6147c27aa --- /dev/null +++ b/web/frontend/src/components/ui/carousel/Carousel.vue @@ -0,0 +1,44 @@ + + + diff --git a/web/frontend/src/components/ui/carousel/CarouselContent.vue b/web/frontend/src/components/ui/carousel/CarouselContent.vue new file mode 100644 index 0000000000..87f0e30871 --- /dev/null +++ b/web/frontend/src/components/ui/carousel/CarouselContent.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/carousel/CarouselItem.vue b/web/frontend/src/components/ui/carousel/CarouselItem.vue new file mode 100644 index 0000000000..801e5c162c --- /dev/null +++ b/web/frontend/src/components/ui/carousel/CarouselItem.vue @@ -0,0 +1,23 @@ + + + diff --git a/web/frontend/src/components/ui/carousel/CarouselNext.vue b/web/frontend/src/components/ui/carousel/CarouselNext.vue new file mode 100644 index 0000000000..ee512e4c9b --- /dev/null +++ b/web/frontend/src/components/ui/carousel/CarouselNext.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/frontend/src/components/ui/carousel/CarouselPrevious.vue b/web/frontend/src/components/ui/carousel/CarouselPrevious.vue new file mode 100644 index 0000000000..74cc9ad48a --- /dev/null +++ b/web/frontend/src/components/ui/carousel/CarouselPrevious.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/frontend/src/components/ui/carousel/index.ts b/web/frontend/src/components/ui/carousel/index.ts new file mode 100644 index 0000000000..addfe03611 --- /dev/null +++ b/web/frontend/src/components/ui/carousel/index.ts @@ -0,0 +1,10 @@ +export { default as Carousel } from './Carousel.vue' +export { default as CarouselContent } from './CarouselContent.vue' +export { default as CarouselItem } from './CarouselItem.vue' +export { default as CarouselPrevious } from './CarouselPrevious.vue' +export { default as CarouselNext } from './CarouselNext.vue' +export { useCarousel } from './useCarousel' + +export type { + EmblaCarouselType as CarouselApi, +} from 'embla-carousel' diff --git a/web/frontend/src/components/ui/carousel/interface.ts b/web/frontend/src/components/ui/carousel/interface.ts new file mode 100644 index 0000000000..99c4f1a81d --- /dev/null +++ b/web/frontend/src/components/ui/carousel/interface.ts @@ -0,0 +1,20 @@ +import type { + EmblaCarouselType as CarouselApi, + EmblaOptionsType as CarouselOptions, + EmblaPluginType as CarouselPlugin, +} from 'embla-carousel' +import type { HTMLAttributes, Ref } from 'vue' + +export interface CarouselProps { + opts?: CarouselOptions | Ref + plugins?: CarouselPlugin[] | Ref + orientation?: 'horizontal' | 'vertical' +} + +export interface CarouselEmits { + (e: 'init-api', payload: CarouselApi): void +} + +export interface WithClassAsProps { + class?: HTMLAttributes['class'] +} diff --git a/web/frontend/src/components/ui/carousel/useCarousel.ts b/web/frontend/src/components/ui/carousel/useCarousel.ts new file mode 100644 index 0000000000..16be25c80d --- /dev/null +++ b/web/frontend/src/components/ui/carousel/useCarousel.ts @@ -0,0 +1,59 @@ +import { createInjectionState } from '@vueuse/core' +import emblaCarouselVue from 'embla-carousel-vue' +import { onMounted, ref } from 'vue' +import type { + EmblaCarouselType as CarouselApi, +} from 'embla-carousel' +import type { CarouselEmits, CarouselProps } from './interface' + +const [useProvideCarousel, useInjectCarousel] = createInjectionState( + ({ + opts, + orientation, + plugins, + }: CarouselProps, emits: CarouselEmits) => { + const [emblaNode, emblaApi] = emblaCarouselVue({ + ...opts, + axis: orientation === 'horizontal' ? 'x' : 'y', + }, plugins) + + function scrollPrev() { + emblaApi.value?.scrollPrev() + } + function scrollNext() { + emblaApi.value?.scrollNext() + } + + const canScrollNext = ref(true) + const canScrollPrev = ref(true) + + function onSelect(api: CarouselApi) { + canScrollNext.value = api.canScrollNext() + canScrollPrev.value = api.canScrollPrev() + } + + onMounted(() => { + if (!emblaApi.value) + return + + emblaApi.value?.on('init', onSelect) + emblaApi.value?.on('reInit', onSelect) + emblaApi.value?.on('select', onSelect) + + emits('init-api', emblaApi.value) + }) + + return { carouselRef: emblaNode, carouselApi: emblaApi, canScrollPrev, canScrollNext, scrollPrev, scrollNext, orientation } + }, +) + +function useCarousel() { + const carouselState = useInjectCarousel() + + if (!carouselState) + throw new Error('useCarousel must be used within a ') + + return carouselState +} + +export { useCarousel, useProvideCarousel } diff --git a/web/frontend/src/components/ui/chart-area/AreaChart.vue b/web/frontend/src/components/ui/chart-area/AreaChart.vue new file mode 100644 index 0000000000..76c99a32c5 --- /dev/null +++ b/web/frontend/src/components/ui/chart-area/AreaChart.vue @@ -0,0 +1,136 @@ + + + diff --git a/web/frontend/src/components/ui/chart-area/index.ts b/web/frontend/src/components/ui/chart-area/index.ts new file mode 100644 index 0000000000..39ee5fde9b --- /dev/null +++ b/web/frontend/src/components/ui/chart-area/index.ts @@ -0,0 +1,66 @@ +export { default as AreaChart } from './AreaChart.vue' + +import type { Spacing } from '@unovis/ts' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/web/frontend/src/components/ui/chart-bar/BarChart.vue b/web/frontend/src/components/ui/chart-bar/BarChart.vue new file mode 100644 index 0000000000..bfaa601fdb --- /dev/null +++ b/web/frontend/src/components/ui/chart-bar/BarChart.vue @@ -0,0 +1,115 @@ + + + diff --git a/web/frontend/src/components/ui/chart-bar/index.ts b/web/frontend/src/components/ui/chart-bar/index.ts new file mode 100644 index 0000000000..e3107a4d02 --- /dev/null +++ b/web/frontend/src/components/ui/chart-bar/index.ts @@ -0,0 +1,66 @@ +export { default as BarChart } from './BarChart.vue' + +import type { Spacing } from '@unovis/ts' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/web/frontend/src/components/ui/chart-donut/DonutChart.vue b/web/frontend/src/components/ui/chart-donut/DonutChart.vue new file mode 100644 index 0000000000..be224229e5 --- /dev/null +++ b/web/frontend/src/components/ui/chart-donut/DonutChart.vue @@ -0,0 +1,100 @@ + + + diff --git a/web/frontend/src/components/ui/chart-donut/index.ts b/web/frontend/src/components/ui/chart-donut/index.ts new file mode 100644 index 0000000000..9111a1f23e --- /dev/null +++ b/web/frontend/src/components/ui/chart-donut/index.ts @@ -0,0 +1,39 @@ +export { default as DonutChart } from './DonutChart.vue' + +import type { Spacing } from '@unovis/ts' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean +} diff --git a/web/frontend/src/components/ui/chart-line/LineChart.vue b/web/frontend/src/components/ui/chart-line/LineChart.vue new file mode 100644 index 0000000000..3797a5e1f9 --- /dev/null +++ b/web/frontend/src/components/ui/chart-line/LineChart.vue @@ -0,0 +1,105 @@ + + + diff --git a/web/frontend/src/components/ui/chart-line/index.ts b/web/frontend/src/components/ui/chart-line/index.ts new file mode 100644 index 0000000000..bb0a26f2bf --- /dev/null +++ b/web/frontend/src/components/ui/chart-line/index.ts @@ -0,0 +1,66 @@ +export { default as LineChart } from './LineChart.vue' + +import type { Spacing } from '@unovis/ts' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/web/frontend/src/components/ui/chart/ChartCrosshair.vue b/web/frontend/src/components/ui/chart/ChartCrosshair.vue new file mode 100644 index 0000000000..4c47149e44 --- /dev/null +++ b/web/frontend/src/components/ui/chart/ChartCrosshair.vue @@ -0,0 +1,44 @@ + + + diff --git a/web/frontend/src/components/ui/chart/ChartLegend.vue b/web/frontend/src/components/ui/chart/ChartLegend.vue new file mode 100644 index 0000000000..e77b6441f0 --- /dev/null +++ b/web/frontend/src/components/ui/chart/ChartLegend.vue @@ -0,0 +1,50 @@ + + + diff --git a/web/frontend/src/components/ui/chart/ChartSingleTooltip.vue b/web/frontend/src/components/ui/chart/ChartSingleTooltip.vue new file mode 100644 index 0000000000..49ca011cc9 --- /dev/null +++ b/web/frontend/src/components/ui/chart/ChartSingleTooltip.vue @@ -0,0 +1,63 @@ + + + diff --git a/web/frontend/src/components/ui/chart/ChartTooltip.vue b/web/frontend/src/components/ui/chart/ChartTooltip.vue new file mode 100644 index 0000000000..a20c80c015 --- /dev/null +++ b/web/frontend/src/components/ui/chart/ChartTooltip.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/frontend/src/components/ui/chart/index.ts b/web/frontend/src/components/ui/chart/index.ts new file mode 100644 index 0000000000..e2d64c17f6 --- /dev/null +++ b/web/frontend/src/components/ui/chart/index.ts @@ -0,0 +1,18 @@ +export { default as ChartTooltip } from './ChartTooltip.vue' +export { default as ChartSingleTooltip } from './ChartSingleTooltip.vue' +export { default as ChartLegend } from './ChartLegend.vue' +export { default as ChartCrosshair } from './ChartCrosshair.vue' + +export function defaultColors(count: number = 3) { + const quotient = Math.floor(count / 2) + const remainder = count % 2 + + const primaryCount = quotient + remainder + const secondaryCount = quotient + return [ + ...Array.from(Array(primaryCount).keys()).map(i => `hsl(var(--vis-primary-color) / ${1 - (1 / primaryCount) * i})`), + ...Array.from(Array(secondaryCount).keys()).map(i => `hsl(var(--vis-secondary-color) / ${1 - (1 / secondaryCount) * i})`), + ] +} + +export * from './interface' diff --git a/web/frontend/src/components/ui/chart/interface.ts b/web/frontend/src/components/ui/chart/interface.ts new file mode 100644 index 0000000000..c3838afcfa --- /dev/null +++ b/web/frontend/src/components/ui/chart/interface.ts @@ -0,0 +1,64 @@ +import type { Spacing } from '@unovis/ts' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/web/frontend/src/components/ui/checkbox/Checkbox.vue b/web/frontend/src/components/ui/checkbox/Checkbox.vue new file mode 100644 index 0000000000..4621bf7521 --- /dev/null +++ b/web/frontend/src/components/ui/checkbox/Checkbox.vue @@ -0,0 +1,33 @@ + + + diff --git a/web/frontend/src/components/ui/checkbox/index.ts b/web/frontend/src/components/ui/checkbox/index.ts new file mode 100644 index 0000000000..8c28c2864b --- /dev/null +++ b/web/frontend/src/components/ui/checkbox/index.ts @@ -0,0 +1 @@ +export { default as Checkbox } from './Checkbox.vue' diff --git a/web/frontend/src/components/ui/collapsible/Collapsible.vue b/web/frontend/src/components/ui/collapsible/Collapsible.vue new file mode 100644 index 0000000000..52bff5f2d1 --- /dev/null +++ b/web/frontend/src/components/ui/collapsible/Collapsible.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/frontend/src/components/ui/collapsible/CollapsibleContent.vue b/web/frontend/src/components/ui/collapsible/CollapsibleContent.vue new file mode 100644 index 0000000000..9f30898b0b --- /dev/null +++ b/web/frontend/src/components/ui/collapsible/CollapsibleContent.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/collapsible/CollapsibleTrigger.vue b/web/frontend/src/components/ui/collapsible/CollapsibleTrigger.vue new file mode 100644 index 0000000000..4a43463949 --- /dev/null +++ b/web/frontend/src/components/ui/collapsible/CollapsibleTrigger.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/collapsible/index.ts b/web/frontend/src/components/ui/collapsible/index.ts new file mode 100644 index 0000000000..4930f4c6f7 --- /dev/null +++ b/web/frontend/src/components/ui/collapsible/index.ts @@ -0,0 +1,3 @@ +export { default as Collapsible } from './Collapsible.vue' +export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue' +export { default as CollapsibleContent } from './CollapsibleContent.vue' diff --git a/web/frontend/src/components/ui/command/Command.vue b/web/frontend/src/components/ui/command/Command.vue new file mode 100644 index 0000000000..fe7445c094 --- /dev/null +++ b/web/frontend/src/components/ui/command/Command.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/frontend/src/components/ui/command/CommandDialog.vue b/web/frontend/src/components/ui/command/CommandDialog.vue new file mode 100644 index 0000000000..53f520bc29 --- /dev/null +++ b/web/frontend/src/components/ui/command/CommandDialog.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/command/CommandEmpty.vue b/web/frontend/src/components/ui/command/CommandEmpty.vue new file mode 100644 index 0000000000..1295d2a001 --- /dev/null +++ b/web/frontend/src/components/ui/command/CommandEmpty.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/frontend/src/components/ui/command/CommandGroup.vue b/web/frontend/src/components/ui/command/CommandGroup.vue new file mode 100644 index 0000000000..ba6433e55a --- /dev/null +++ b/web/frontend/src/components/ui/command/CommandGroup.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/command/CommandInput.vue b/web/frontend/src/components/ui/command/CommandInput.vue new file mode 100644 index 0000000000..669237338a --- /dev/null +++ b/web/frontend/src/components/ui/command/CommandInput.vue @@ -0,0 +1,33 @@ + + + diff --git a/web/frontend/src/components/ui/command/CommandItem.vue b/web/frontend/src/components/ui/command/CommandItem.vue new file mode 100644 index 0000000000..c373d12e96 --- /dev/null +++ b/web/frontend/src/components/ui/command/CommandItem.vue @@ -0,0 +1,26 @@ + + + diff --git a/web/frontend/src/components/ui/command/CommandList.vue b/web/frontend/src/components/ui/command/CommandList.vue new file mode 100644 index 0000000000..00d1b3a747 --- /dev/null +++ b/web/frontend/src/components/ui/command/CommandList.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/frontend/src/components/ui/command/CommandSeparator.vue b/web/frontend/src/components/ui/command/CommandSeparator.vue new file mode 100644 index 0000000000..477799cceb --- /dev/null +++ b/web/frontend/src/components/ui/command/CommandSeparator.vue @@ -0,0 +1,23 @@ + + + diff --git a/web/frontend/src/components/ui/command/CommandShortcut.vue b/web/frontend/src/components/ui/command/CommandShortcut.vue new file mode 100644 index 0000000000..0d4da9218d --- /dev/null +++ b/web/frontend/src/components/ui/command/CommandShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/command/index.ts b/web/frontend/src/components/ui/command/index.ts new file mode 100644 index 0000000000..0e35f4b9fd --- /dev/null +++ b/web/frontend/src/components/ui/command/index.ts @@ -0,0 +1,9 @@ +export { default as Command } from './Command.vue' +export { default as CommandDialog } from './CommandDialog.vue' +export { default as CommandEmpty } from './CommandEmpty.vue' +export { default as CommandGroup } from './CommandGroup.vue' +export { default as CommandInput } from './CommandInput.vue' +export { default as CommandItem } from './CommandItem.vue' +export { default as CommandList } from './CommandList.vue' +export { default as CommandSeparator } from './CommandSeparator.vue' +export { default as CommandShortcut } from './CommandShortcut.vue' diff --git a/web/frontend/src/components/ui/context-menu/ContextMenu.vue b/web/frontend/src/components/ui/context-menu/ContextMenu.vue new file mode 100644 index 0000000000..a888b59c9e --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenu.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuCheckboxItem.vue b/web/frontend/src/components/ui/context-menu/ContextMenuCheckboxItem.vue new file mode 100644 index 0000000000..3025e5aa9e --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuCheckboxItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuContent.vue b/web/frontend/src/components/ui/context-menu/ContextMenuContent.vue new file mode 100644 index 0000000000..4651fb3dde --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuContent.vue @@ -0,0 +1,36 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuGroup.vue b/web/frontend/src/components/ui/context-menu/ContextMenuGroup.vue new file mode 100644 index 0000000000..b7458d771b --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuGroup.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuItem.vue b/web/frontend/src/components/ui/context-menu/ContextMenuItem.vue new file mode 100644 index 0000000000..dc2903a6b6 --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuItem.vue @@ -0,0 +1,34 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuLabel.vue b/web/frontend/src/components/ui/context-menu/ContextMenuLabel.vue new file mode 100644 index 0000000000..e9a943947c --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuLabel.vue @@ -0,0 +1,25 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuPortal.vue b/web/frontend/src/components/ui/context-menu/ContextMenuPortal.vue new file mode 100644 index 0000000000..73dc714b21 --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuPortal.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuRadioGroup.vue b/web/frontend/src/components/ui/context-menu/ContextMenuRadioGroup.vue new file mode 100644 index 0000000000..33273a743b --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuRadioGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuRadioItem.vue b/web/frontend/src/components/ui/context-menu/ContextMenuRadioItem.vue new file mode 100644 index 0000000000..37a39a4ebb --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuRadioItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuSeparator.vue b/web/frontend/src/components/ui/context-menu/ContextMenuSeparator.vue new file mode 100644 index 0000000000..ae55f3a4e0 --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuSeparator.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuShortcut.vue b/web/frontend/src/components/ui/context-menu/ContextMenuShortcut.vue new file mode 100644 index 0000000000..0d4da9218d --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuSub.vue b/web/frontend/src/components/ui/context-menu/ContextMenuSub.vue new file mode 100644 index 0000000000..7abc36038d --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuSubContent.vue b/web/frontend/src/components/ui/context-menu/ContextMenuSubContent.vue new file mode 100644 index 0000000000..744388b0ca --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuSubContent.vue @@ -0,0 +1,35 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuSubTrigger.vue b/web/frontend/src/components/ui/context-menu/ContextMenuSubTrigger.vue new file mode 100644 index 0000000000..94400a67ab --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuSubTrigger.vue @@ -0,0 +1,34 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/ContextMenuTrigger.vue b/web/frontend/src/components/ui/context-menu/ContextMenuTrigger.vue new file mode 100644 index 0000000000..22e417b52a --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/ContextMenuTrigger.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/frontend/src/components/ui/context-menu/index.ts b/web/frontend/src/components/ui/context-menu/index.ts new file mode 100644 index 0000000000..157f7b1d09 --- /dev/null +++ b/web/frontend/src/components/ui/context-menu/index.ts @@ -0,0 +1,14 @@ +export { default as ContextMenu } from './ContextMenu.vue' +export { default as ContextMenuTrigger } from './ContextMenuTrigger.vue' +export { default as ContextMenuContent } from './ContextMenuContent.vue' +export { default as ContextMenuGroup } from './ContextMenuGroup.vue' +export { default as ContextMenuRadioGroup } from './ContextMenuRadioGroup.vue' +export { default as ContextMenuItem } from './ContextMenuItem.vue' +export { default as ContextMenuCheckboxItem } from './ContextMenuCheckboxItem.vue' +export { default as ContextMenuRadioItem } from './ContextMenuRadioItem.vue' +export { default as ContextMenuShortcut } from './ContextMenuShortcut.vue' +export { default as ContextMenuSeparator } from './ContextMenuSeparator.vue' +export { default as ContextMenuLabel } from './ContextMenuLabel.vue' +export { default as ContextMenuSub } from './ContextMenuSub.vue' +export { default as ContextMenuSubTrigger } from './ContextMenuSubTrigger.vue' +export { default as ContextMenuSubContent } from './ContextMenuSubContent.vue' diff --git a/web/frontend/src/components/ui/dialog/Dialog.vue b/web/frontend/src/components/ui/dialog/Dialog.vue new file mode 100644 index 0000000000..a04c026261 --- /dev/null +++ b/web/frontend/src/components/ui/dialog/Dialog.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/DialogClose.vue b/web/frontend/src/components/ui/dialog/DialogClose.vue new file mode 100644 index 0000000000..a64703e56f --- /dev/null +++ b/web/frontend/src/components/ui/dialog/DialogClose.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/DialogContent.vue b/web/frontend/src/components/ui/dialog/DialogContent.vue new file mode 100644 index 0000000000..7b3aeaba9d --- /dev/null +++ b/web/frontend/src/components/ui/dialog/DialogContent.vue @@ -0,0 +1,50 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/DialogDescription.vue b/web/frontend/src/components/ui/dialog/DialogDescription.vue new file mode 100644 index 0000000000..3637b7ec94 --- /dev/null +++ b/web/frontend/src/components/ui/dialog/DialogDescription.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/DialogFooter.vue b/web/frontend/src/components/ui/dialog/DialogFooter.vue new file mode 100644 index 0000000000..ac2d0c18b6 --- /dev/null +++ b/web/frontend/src/components/ui/dialog/DialogFooter.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/DialogHeader.vue b/web/frontend/src/components/ui/dialog/DialogHeader.vue new file mode 100644 index 0000000000..b2c9085d82 --- /dev/null +++ b/web/frontend/src/components/ui/dialog/DialogHeader.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/DialogScrollContent.vue b/web/frontend/src/components/ui/dialog/DialogScrollContent.vue new file mode 100644 index 0000000000..cd9ba0d247 --- /dev/null +++ b/web/frontend/src/components/ui/dialog/DialogScrollContent.vue @@ -0,0 +1,59 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/DialogTitle.vue b/web/frontend/src/components/ui/dialog/DialogTitle.vue new file mode 100644 index 0000000000..1bb40461a9 --- /dev/null +++ b/web/frontend/src/components/ui/dialog/DialogTitle.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/DialogTrigger.vue b/web/frontend/src/components/ui/dialog/DialogTrigger.vue new file mode 100644 index 0000000000..ee0c12ff32 --- /dev/null +++ b/web/frontend/src/components/ui/dialog/DialogTrigger.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/dialog/index.ts b/web/frontend/src/components/ui/dialog/index.ts new file mode 100644 index 0000000000..847e999f20 --- /dev/null +++ b/web/frontend/src/components/ui/dialog/index.ts @@ -0,0 +1,9 @@ +export { default as Dialog } from './Dialog.vue' +export { default as DialogClose } from './DialogClose.vue' +export { default as DialogTrigger } from './DialogTrigger.vue' +export { default as DialogHeader } from './DialogHeader.vue' +export { default as DialogTitle } from './DialogTitle.vue' +export { default as DialogDescription } from './DialogDescription.vue' +export { default as DialogContent } from './DialogContent.vue' +export { default as DialogScrollContent } from './DialogScrollContent.vue' +export { default as DialogFooter } from './DialogFooter.vue' diff --git a/web/frontend/src/components/ui/drawer/Drawer.vue b/web/frontend/src/components/ui/drawer/Drawer.vue new file mode 100644 index 0000000000..05624d0249 --- /dev/null +++ b/web/frontend/src/components/ui/drawer/Drawer.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/drawer/DrawerContent.vue b/web/frontend/src/components/ui/drawer/DrawerContent.vue new file mode 100644 index 0000000000..6be17d0b00 --- /dev/null +++ b/web/frontend/src/components/ui/drawer/DrawerContent.vue @@ -0,0 +1,28 @@ + + + diff --git a/web/frontend/src/components/ui/drawer/DrawerDescription.vue b/web/frontend/src/components/ui/drawer/DrawerDescription.vue new file mode 100644 index 0000000000..2a446c1e70 --- /dev/null +++ b/web/frontend/src/components/ui/drawer/DrawerDescription.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/frontend/src/components/ui/drawer/DrawerFooter.vue b/web/frontend/src/components/ui/drawer/DrawerFooter.vue new file mode 100644 index 0000000000..1eb352781a --- /dev/null +++ b/web/frontend/src/components/ui/drawer/DrawerFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/drawer/DrawerHeader.vue b/web/frontend/src/components/ui/drawer/DrawerHeader.vue new file mode 100644 index 0000000000..ecef7a67ba --- /dev/null +++ b/web/frontend/src/components/ui/drawer/DrawerHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/drawer/DrawerOverlay.vue b/web/frontend/src/components/ui/drawer/DrawerOverlay.vue new file mode 100644 index 0000000000..c182463cf3 --- /dev/null +++ b/web/frontend/src/components/ui/drawer/DrawerOverlay.vue @@ -0,0 +1,18 @@ + + + diff --git a/web/frontend/src/components/ui/drawer/DrawerTitle.vue b/web/frontend/src/components/ui/drawer/DrawerTitle.vue new file mode 100644 index 0000000000..f8d77044eb --- /dev/null +++ b/web/frontend/src/components/ui/drawer/DrawerTitle.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/frontend/src/components/ui/drawer/index.ts b/web/frontend/src/components/ui/drawer/index.ts new file mode 100644 index 0000000000..b02bd3a6cb --- /dev/null +++ b/web/frontend/src/components/ui/drawer/index.ts @@ -0,0 +1,8 @@ +export { DrawerPortal, DrawerTrigger, DrawerClose } from 'vaul-vue' +export { default as Drawer } from './Drawer.vue' +export { default as DrawerOverlay } from './DrawerOverlay.vue' +export { default as DrawerContent } from './DrawerContent.vue' +export { default as DrawerHeader } from './DrawerHeader.vue' +export { default as DrawerFooter } from './DrawerFooter.vue' +export { default as DrawerTitle } from './DrawerTitle.vue' +export { default as DrawerDescription } from './DrawerDescription.vue' diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenu.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000000..b83d90b865 --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000000..cd21fdeb9a --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuContent.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000000..b33d58eb6c --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,38 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuGroup.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000000..3f20135265 --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuItem.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000000..04d3d60e9f --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,28 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuLabel.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000000..5fa684e1cb --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000000..4a727904ca --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000000..c8b9029cee --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,41 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000000..fc51205b6c --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000000..abaeda6497 --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSub.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000000..e0f4bd778b --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000000..446f9fb594 --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000000..3474553db3 --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,33 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000000..8efd5a926e --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/frontend/src/components/ui/dropdown-menu/index.ts b/web/frontend/src/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000000..6f9446c3c4 --- /dev/null +++ b/web/frontend/src/components/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { DropdownMenuPortal } from 'radix-vue' + +export { default as DropdownMenu } from './DropdownMenu.vue' +export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' +export { default as DropdownMenuContent } from './DropdownMenuContent.vue' +export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' +export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' +export { default as DropdownMenuItem } from './DropdownMenuItem.vue' +export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' +export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' +export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' +export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' +export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' +export { default as DropdownMenuSub } from './DropdownMenuSub.vue' +export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' +export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' diff --git a/web/frontend/src/components/ui/form/FormControl.vue b/web/frontend/src/components/ui/form/FormControl.vue new file mode 100644 index 0000000000..8459cab87d --- /dev/null +++ b/web/frontend/src/components/ui/form/FormControl.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/form/FormDescription.vue b/web/frontend/src/components/ui/form/FormDescription.vue new file mode 100644 index 0000000000..6085f76c52 --- /dev/null +++ b/web/frontend/src/components/ui/form/FormDescription.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/frontend/src/components/ui/form/FormItem.vue b/web/frontend/src/components/ui/form/FormItem.vue new file mode 100644 index 0000000000..ad120be9e4 --- /dev/null +++ b/web/frontend/src/components/ui/form/FormItem.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/web/frontend/src/components/ui/form/FormLabel.vue b/web/frontend/src/components/ui/form/FormLabel.vue new file mode 100644 index 0000000000..73cf45b459 --- /dev/null +++ b/web/frontend/src/components/ui/form/FormLabel.vue @@ -0,0 +1,23 @@ + + + diff --git a/web/frontend/src/components/ui/form/FormMessage.vue b/web/frontend/src/components/ui/form/FormMessage.vue new file mode 100644 index 0000000000..308755e4b5 --- /dev/null +++ b/web/frontend/src/components/ui/form/FormMessage.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/form/index.ts b/web/frontend/src/components/ui/form/index.ts new file mode 100644 index 0000000000..30a30a6c25 --- /dev/null +++ b/web/frontend/src/components/ui/form/index.ts @@ -0,0 +1,6 @@ +export { Form, Field as FormField } from 'vee-validate' +export { default as FormItem } from './FormItem.vue' +export { default as FormLabel } from './FormLabel.vue' +export { default as FormControl } from './FormControl.vue' +export { default as FormMessage } from './FormMessage.vue' +export { default as FormDescription } from './FormDescription.vue' diff --git a/web/frontend/src/components/ui/form/useFormField.ts b/web/frontend/src/components/ui/form/useFormField.ts new file mode 100644 index 0000000000..73eeee3e7a --- /dev/null +++ b/web/frontend/src/components/ui/form/useFormField.ts @@ -0,0 +1,30 @@ +import { FieldContextKey, useFieldError, useIsFieldDirty, useIsFieldTouched, useIsFieldValid } from 'vee-validate' +import { inject } from 'vue' +import { FORM_ITEM_INJECTION_KEY } from './FormItem.vue' + +export function useFormField() { + const fieldContext = inject(FieldContextKey) + const fieldItemContext = inject(FORM_ITEM_INJECTION_KEY) + + const fieldState = { + valid: useIsFieldValid(), + isDirty: useIsFieldDirty(), + isTouched: useIsFieldTouched(), + error: useFieldError(), + } + + if (!fieldContext) + throw new Error('useFormField should be used within ') + + const { name } = fieldContext + const id = fieldItemContext + + return { + id, + name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + } +} diff --git a/web/frontend/src/components/ui/hover-card/HoverCard.vue b/web/frontend/src/components/ui/hover-card/HoverCard.vue new file mode 100644 index 0000000000..f17c9d1ffa --- /dev/null +++ b/web/frontend/src/components/ui/hover-card/HoverCard.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/hover-card/HoverCardContent.vue b/web/frontend/src/components/ui/hover-card/HoverCardContent.vue new file mode 100644 index 0000000000..8affac420e --- /dev/null +++ b/web/frontend/src/components/ui/hover-card/HoverCardContent.vue @@ -0,0 +1,41 @@ + + + diff --git a/web/frontend/src/components/ui/hover-card/HoverCardTrigger.vue b/web/frontend/src/components/ui/hover-card/HoverCardTrigger.vue new file mode 100644 index 0000000000..3e300b95b8 --- /dev/null +++ b/web/frontend/src/components/ui/hover-card/HoverCardTrigger.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/hover-card/index.ts b/web/frontend/src/components/ui/hover-card/index.ts new file mode 100644 index 0000000000..c7bfd32d3c --- /dev/null +++ b/web/frontend/src/components/ui/hover-card/index.ts @@ -0,0 +1,3 @@ +export { default as HoverCard } from './HoverCard.vue' +export { default as HoverCardTrigger } from './HoverCardTrigger.vue' +export { default as HoverCardContent } from './HoverCardContent.vue' diff --git a/web/frontend/src/components/ui/input/Input.vue b/web/frontend/src/components/ui/input/Input.vue new file mode 100644 index 0000000000..39c9cee66e --- /dev/null +++ b/web/frontend/src/components/ui/input/Input.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/input/index.ts b/web/frontend/src/components/ui/input/index.ts new file mode 100644 index 0000000000..a691dd6c1d --- /dev/null +++ b/web/frontend/src/components/ui/input/index.ts @@ -0,0 +1 @@ +export { default as Input } from './Input.vue' diff --git a/web/frontend/src/components/ui/label/Label.vue b/web/frontend/src/components/ui/label/Label.vue new file mode 100644 index 0000000000..8fba8db48f --- /dev/null +++ b/web/frontend/src/components/ui/label/Label.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/frontend/src/components/ui/label/index.ts b/web/frontend/src/components/ui/label/index.ts new file mode 100644 index 0000000000..572c2f0172 --- /dev/null +++ b/web/frontend/src/components/ui/label/index.ts @@ -0,0 +1 @@ +export { default as Label } from './Label.vue' diff --git a/web/frontend/src/components/ui/menubar/Menubar.vue b/web/frontend/src/components/ui/menubar/Menubar.vue new file mode 100644 index 0000000000..a016e106ce --- /dev/null +++ b/web/frontend/src/components/ui/menubar/Menubar.vue @@ -0,0 +1,35 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarCheckboxItem.vue b/web/frontend/src/components/ui/menubar/MenubarCheckboxItem.vue new file mode 100644 index 0000000000..1e7c3a9fb1 --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarCheckboxItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarContent.vue b/web/frontend/src/components/ui/menubar/MenubarContent.vue new file mode 100644 index 0000000000..a529f149ea --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarContent.vue @@ -0,0 +1,43 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarGroup.vue b/web/frontend/src/components/ui/menubar/MenubarGroup.vue new file mode 100644 index 0000000000..853976b5e8 --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarGroup.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarItem.vue b/web/frontend/src/components/ui/menubar/MenubarItem.vue new file mode 100644 index 0000000000..027ff793ca --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarItem.vue @@ -0,0 +1,35 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarLabel.vue b/web/frontend/src/components/ui/menubar/MenubarLabel.vue new file mode 100644 index 0000000000..7b3b8fffdf --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarLabel.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarMenu.vue b/web/frontend/src/components/ui/menubar/MenubarMenu.vue new file mode 100644 index 0000000000..fec5ee5573 --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarMenu.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarRadioGroup.vue b/web/frontend/src/components/ui/menubar/MenubarRadioGroup.vue new file mode 100644 index 0000000000..60a8cd1d9e --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarRadioGroup.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarRadioItem.vue b/web/frontend/src/components/ui/menubar/MenubarRadioItem.vue new file mode 100644 index 0000000000..c97b00db9c --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarRadioItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarSeparator.vue b/web/frontend/src/components/ui/menubar/MenubarSeparator.vue new file mode 100644 index 0000000000..ed437697e5 --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarSeparator.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarShortcut.vue b/web/frontend/src/components/ui/menubar/MenubarShortcut.vue new file mode 100644 index 0000000000..0d4da9218d --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarSub.vue b/web/frontend/src/components/ui/menubar/MenubarSub.vue new file mode 100644 index 0000000000..6b76cd3e24 --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarSubContent.vue b/web/frontend/src/components/ui/menubar/MenubarSubContent.vue new file mode 100644 index 0000000000..0a0ad68e26 --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarSubContent.vue @@ -0,0 +1,39 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarSubTrigger.vue b/web/frontend/src/components/ui/menubar/MenubarSubTrigger.vue new file mode 100644 index 0000000000..341e91fc6c --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarSubTrigger.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/MenubarTrigger.vue b/web/frontend/src/components/ui/menubar/MenubarTrigger.vue new file mode 100644 index 0000000000..895f1ba6fb --- /dev/null +++ b/web/frontend/src/components/ui/menubar/MenubarTrigger.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/menubar/index.ts b/web/frontend/src/components/ui/menubar/index.ts new file mode 100644 index 0000000000..808ec4d375 --- /dev/null +++ b/web/frontend/src/components/ui/menubar/index.ts @@ -0,0 +1,15 @@ +export { default as Menubar } from './Menubar.vue' +export { default as MenubarItem } from './MenubarItem.vue' +export { default as MenubarContent } from './MenubarContent.vue' +export { default as MenubarGroup } from './MenubarGroup.vue' +export { default as MenubarMenu } from './MenubarMenu.vue' +export { default as MenubarRadioGroup } from './MenubarRadioGroup.vue' +export { default as MenubarRadioItem } from './MenubarRadioItem.vue' +export { default as MenubarCheckboxItem } from './MenubarCheckboxItem.vue' +export { default as MenubarSeparator } from './MenubarSeparator.vue' +export { default as MenubarSub } from './MenubarSub.vue' +export { default as MenubarSubContent } from './MenubarSubContent.vue' +export { default as MenubarSubTrigger } from './MenubarSubTrigger.vue' +export { default as MenubarTrigger } from './MenubarTrigger.vue' +export { default as MenubarShortcut } from './MenubarShortcut.vue' +export { default as MenubarLabel } from './MenubarLabel.vue' diff --git a/web/frontend/src/components/ui/navigation-menu/NavigationMenu.vue b/web/frontend/src/components/ui/navigation-menu/NavigationMenu.vue new file mode 100644 index 0000000000..080d3bb1ba --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/NavigationMenu.vue @@ -0,0 +1,33 @@ + + + diff --git a/web/frontend/src/components/ui/navigation-menu/NavigationMenuContent.vue b/web/frontend/src/components/ui/navigation-menu/NavigationMenuContent.vue new file mode 100644 index 0000000000..03d8fbbc81 --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/NavigationMenuContent.vue @@ -0,0 +1,34 @@ + + + diff --git a/web/frontend/src/components/ui/navigation-menu/NavigationMenuIndicator.vue b/web/frontend/src/components/ui/navigation-menu/NavigationMenuIndicator.vue new file mode 100644 index 0000000000..1d53291e1a --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/NavigationMenuIndicator.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/navigation-menu/NavigationMenuItem.vue b/web/frontend/src/components/ui/navigation-menu/NavigationMenuItem.vue new file mode 100644 index 0000000000..50e1565fa3 --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/NavigationMenuItem.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/navigation-menu/NavigationMenuLink.vue b/web/frontend/src/components/ui/navigation-menu/NavigationMenuLink.vue new file mode 100644 index 0000000000..30c91c61df --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/NavigationMenuLink.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/navigation-menu/NavigationMenuList.vue b/web/frontend/src/components/ui/navigation-menu/NavigationMenuList.vue new file mode 100644 index 0000000000..354365c56c --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/NavigationMenuList.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/navigation-menu/NavigationMenuTrigger.vue b/web/frontend/src/components/ui/navigation-menu/NavigationMenuTrigger.vue new file mode 100644 index 0000000000..f93d9c2218 --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/NavigationMenuTrigger.vue @@ -0,0 +1,34 @@ + + + diff --git a/web/frontend/src/components/ui/navigation-menu/NavigationMenuViewport.vue b/web/frontend/src/components/ui/navigation-menu/NavigationMenuViewport.vue new file mode 100644 index 0000000000..8abf60d1db --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/NavigationMenuViewport.vue @@ -0,0 +1,33 @@ + + + diff --git a/web/frontend/src/components/ui/navigation-menu/index.ts b/web/frontend/src/components/ui/navigation-menu/index.ts new file mode 100644 index 0000000000..1aca4227d9 --- /dev/null +++ b/web/frontend/src/components/ui/navigation-menu/index.ts @@ -0,0 +1,12 @@ +import { cva } from 'class-variance-authority' + +export { default as NavigationMenu } from './NavigationMenu.vue' +export { default as NavigationMenuList } from './NavigationMenuList.vue' +export { default as NavigationMenuItem } from './NavigationMenuItem.vue' +export { default as NavigationMenuTrigger } from './NavigationMenuTrigger.vue' +export { default as NavigationMenuContent } from './NavigationMenuContent.vue' +export { default as NavigationMenuLink } from './NavigationMenuLink.vue' + +export const navigationMenuTriggerStyle = cva( + 'group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50', +) diff --git a/web/frontend/src/components/ui/pagination/PaginationEllipsis.vue b/web/frontend/src/components/ui/pagination/PaginationEllipsis.vue new file mode 100644 index 0000000000..09ffa359f3 --- /dev/null +++ b/web/frontend/src/components/ui/pagination/PaginationEllipsis.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/pagination/PaginationFirst.vue b/web/frontend/src/components/ui/pagination/PaginationFirst.vue new file mode 100644 index 0000000000..510b6a805f --- /dev/null +++ b/web/frontend/src/components/ui/pagination/PaginationFirst.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/pagination/PaginationLast.vue b/web/frontend/src/components/ui/pagination/PaginationLast.vue new file mode 100644 index 0000000000..dbb1691336 --- /dev/null +++ b/web/frontend/src/components/ui/pagination/PaginationLast.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/pagination/PaginationNext.vue b/web/frontend/src/components/ui/pagination/PaginationNext.vue new file mode 100644 index 0000000000..d3e8203038 --- /dev/null +++ b/web/frontend/src/components/ui/pagination/PaginationNext.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/pagination/PaginationPrev.vue b/web/frontend/src/components/ui/pagination/PaginationPrev.vue new file mode 100644 index 0000000000..5d4d4e09b1 --- /dev/null +++ b/web/frontend/src/components/ui/pagination/PaginationPrev.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/pagination/index.ts b/web/frontend/src/components/ui/pagination/index.ts new file mode 100644 index 0000000000..183ecbe93b --- /dev/null +++ b/web/frontend/src/components/ui/pagination/index.ts @@ -0,0 +1,10 @@ +export { + PaginationRoot as Pagination, + PaginationList, + PaginationListItem, +} from 'radix-vue' +export { default as PaginationEllipsis } from './PaginationEllipsis.vue' +export { default as PaginationFirst } from './PaginationFirst.vue' +export { default as PaginationLast } from './PaginationLast.vue' +export { default as PaginationNext } from './PaginationNext.vue' +export { default as PaginationPrev } from './PaginationPrev.vue' diff --git a/web/frontend/src/components/ui/pin-input/PinInput.vue b/web/frontend/src/components/ui/pin-input/PinInput.vue new file mode 100644 index 0000000000..a79c3af5b2 --- /dev/null +++ b/web/frontend/src/components/ui/pin-input/PinInput.vue @@ -0,0 +1,23 @@ + + + diff --git a/web/frontend/src/components/ui/pin-input/PinInputGroup.vue b/web/frontend/src/components/ui/pin-input/PinInputGroup.vue new file mode 100644 index 0000000000..97afadaee3 --- /dev/null +++ b/web/frontend/src/components/ui/pin-input/PinInputGroup.vue @@ -0,0 +1,18 @@ + + + diff --git a/web/frontend/src/components/ui/pin-input/PinInputInput.vue b/web/frontend/src/components/ui/pin-input/PinInputInput.vue new file mode 100644 index 0000000000..ac3b9525cd --- /dev/null +++ b/web/frontend/src/components/ui/pin-input/PinInputInput.vue @@ -0,0 +1,18 @@ + + + diff --git a/web/frontend/src/components/ui/pin-input/PinInputSeparator.vue b/web/frontend/src/components/ui/pin-input/PinInputSeparator.vue new file mode 100644 index 0000000000..b00f56653e --- /dev/null +++ b/web/frontend/src/components/ui/pin-input/PinInputSeparator.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/frontend/src/components/ui/pin-input/index.ts b/web/frontend/src/components/ui/pin-input/index.ts new file mode 100644 index 0000000000..abec8fcecf --- /dev/null +++ b/web/frontend/src/components/ui/pin-input/index.ts @@ -0,0 +1,4 @@ +export { default as PinInput } from './PinInput.vue' +export { default as PinInputGroup } from './PinInputGroup.vue' +export { default as PinInputSeparator } from './PinInputSeparator.vue' +export { default as PinInputInput } from './PinInputInput.vue' diff --git a/web/frontend/src/components/ui/popover/Popover.vue b/web/frontend/src/components/ui/popover/Popover.vue new file mode 100644 index 0000000000..1a5873a313 --- /dev/null +++ b/web/frontend/src/components/ui/popover/Popover.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/frontend/src/components/ui/popover/PopoverContent.vue b/web/frontend/src/components/ui/popover/PopoverContent.vue new file mode 100644 index 0000000000..e691fe8266 --- /dev/null +++ b/web/frontend/src/components/ui/popover/PopoverContent.vue @@ -0,0 +1,48 @@ + + + diff --git a/web/frontend/src/components/ui/popover/PopoverTrigger.vue b/web/frontend/src/components/ui/popover/PopoverTrigger.vue new file mode 100644 index 0000000000..22f4772af6 --- /dev/null +++ b/web/frontend/src/components/ui/popover/PopoverTrigger.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/popover/index.ts b/web/frontend/src/components/ui/popover/index.ts new file mode 100644 index 0000000000..495d55a803 --- /dev/null +++ b/web/frontend/src/components/ui/popover/index.ts @@ -0,0 +1,3 @@ +export { default as Popover } from './Popover.vue' +export { default as PopoverTrigger } from './PopoverTrigger.vue' +export { default as PopoverContent } from './PopoverContent.vue' diff --git a/web/frontend/src/components/ui/progress/Progress.vue b/web/frontend/src/components/ui/progress/Progress.vue new file mode 100644 index 0000000000..6e006ffa78 --- /dev/null +++ b/web/frontend/src/components/ui/progress/Progress.vue @@ -0,0 +1,39 @@ + + + diff --git a/web/frontend/src/components/ui/progress/index.ts b/web/frontend/src/components/ui/progress/index.ts new file mode 100644 index 0000000000..eace989358 --- /dev/null +++ b/web/frontend/src/components/ui/progress/index.ts @@ -0,0 +1 @@ +export { default as Progress } from './Progress.vue' diff --git a/web/frontend/src/components/ui/radio-group/RadioGroup.vue b/web/frontend/src/components/ui/radio-group/RadioGroup.vue new file mode 100644 index 0000000000..9262656e8e --- /dev/null +++ b/web/frontend/src/components/ui/radio-group/RadioGroup.vue @@ -0,0 +1,25 @@ + + + diff --git a/web/frontend/src/components/ui/radio-group/RadioGroupItem.vue b/web/frontend/src/components/ui/radio-group/RadioGroupItem.vue new file mode 100644 index 0000000000..b147fd8656 --- /dev/null +++ b/web/frontend/src/components/ui/radio-group/RadioGroupItem.vue @@ -0,0 +1,39 @@ + + + diff --git a/web/frontend/src/components/ui/radio-group/index.ts b/web/frontend/src/components/ui/radio-group/index.ts new file mode 100644 index 0000000000..fa1da9c249 --- /dev/null +++ b/web/frontend/src/components/ui/radio-group/index.ts @@ -0,0 +1,2 @@ +export { default as RadioGroup } from './RadioGroup.vue' +export { default as RadioGroupItem } from './RadioGroupItem.vue' diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendar.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendar.vue new file mode 100644 index 0000000000..3033f05b38 --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendar.vue @@ -0,0 +1,60 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarCell.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarCell.vue new file mode 100644 index 0000000000..bc8e4152d9 --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarCell.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue new file mode 100644 index 0000000000..c2f817a748 --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue @@ -0,0 +1,40 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarGrid.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarGrid.vue new file mode 100644 index 0000000000..e346b07d3f --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarGrid.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarGridBody.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarGridBody.vue new file mode 100644 index 0000000000..cae15cc702 --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarGridBody.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarGridHead.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarGridHead.vue new file mode 100644 index 0000000000..c11ad365cf --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarGridHead.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarGridRow.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarGridRow.vue new file mode 100644 index 0000000000..425ed58fab --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarGridRow.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarHeadCell.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarHeadCell.vue new file mode 100644 index 0000000000..26ea928399 --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarHeadCell.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarHeader.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarHeader.vue new file mode 100644 index 0000000000..7d98cafa3d --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarHeader.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarHeading.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarHeading.vue new file mode 100644 index 0000000000..51ee1f8b1b --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarHeading.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarNextButton.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarNextButton.vue new file mode 100644 index 0000000000..a69fa9b486 --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarNextButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/RangeCalendarPrevButton.vue b/web/frontend/src/components/ui/range-calendar/RangeCalendarPrevButton.vue new file mode 100644 index 0000000000..6e46c6adae --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/RangeCalendarPrevButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/frontend/src/components/ui/range-calendar/index.ts b/web/frontend/src/components/ui/range-calendar/index.ts new file mode 100644 index 0000000000..7ba1637e75 --- /dev/null +++ b/web/frontend/src/components/ui/range-calendar/index.ts @@ -0,0 +1,12 @@ +export { default as RangeCalendar } from './RangeCalendar.vue' +export { default as RangeCalendarCell } from './RangeCalendarCell.vue' +export { default as RangeCalendarCellTrigger } from './RangeCalendarCellTrigger.vue' +export { default as RangeCalendarGrid } from './RangeCalendarGrid.vue' +export { default as RangeCalendarGridBody } from './RangeCalendarGridBody.vue' +export { default as RangeCalendarGridHead } from './RangeCalendarGridHead.vue' +export { default as RangeCalendarGridRow } from './RangeCalendarGridRow.vue' +export { default as RangeCalendarHeadCell } from './RangeCalendarHeadCell.vue' +export { default as RangeCalendarHeader } from './RangeCalendarHeader.vue' +export { default as RangeCalendarHeading } from './RangeCalendarHeading.vue' +export { default as RangeCalendarNextButton } from './RangeCalendarNextButton.vue' +export { default as RangeCalendarPrevButton } from './RangeCalendarPrevButton.vue' diff --git a/web/frontend/src/components/ui/resizable/ResizableHandle.vue b/web/frontend/src/components/ui/resizable/ResizableHandle.vue new file mode 100644 index 0000000000..fc0cc35dc3 --- /dev/null +++ b/web/frontend/src/components/ui/resizable/ResizableHandle.vue @@ -0,0 +1,26 @@ + + + diff --git a/web/frontend/src/components/ui/resizable/ResizablePanelGroup.vue b/web/frontend/src/components/ui/resizable/ResizablePanelGroup.vue new file mode 100644 index 0000000000..6c317fa7c3 --- /dev/null +++ b/web/frontend/src/components/ui/resizable/ResizablePanelGroup.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/resizable/index.ts b/web/frontend/src/components/ui/resizable/index.ts new file mode 100644 index 0000000000..22a0a8a89f --- /dev/null +++ b/web/frontend/src/components/ui/resizable/index.ts @@ -0,0 +1,3 @@ +export { default as ResizablePanelGroup } from './ResizablePanelGroup.vue' +export { default as ResizableHandle } from './ResizableHandle.vue' +export { SplitterPanel as ResizablePanel } from 'radix-vue' diff --git a/web/frontend/src/components/ui/scroll-area/ScrollArea.vue b/web/frontend/src/components/ui/scroll-area/ScrollArea.vue new file mode 100644 index 0000000000..8f501ccef6 --- /dev/null +++ b/web/frontend/src/components/ui/scroll-area/ScrollArea.vue @@ -0,0 +1,29 @@ + + + diff --git a/web/frontend/src/components/ui/scroll-area/ScrollBar.vue b/web/frontend/src/components/ui/scroll-area/ScrollBar.vue new file mode 100644 index 0000000000..efaaee2da2 --- /dev/null +++ b/web/frontend/src/components/ui/scroll-area/ScrollBar.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/frontend/src/components/ui/scroll-area/index.ts b/web/frontend/src/components/ui/scroll-area/index.ts new file mode 100644 index 0000000000..2bd4fae5d9 --- /dev/null +++ b/web/frontend/src/components/ui/scroll-area/index.ts @@ -0,0 +1,2 @@ +export { default as ScrollArea } from './ScrollArea.vue' +export { default as ScrollBar } from './ScrollBar.vue' diff --git a/web/frontend/src/components/ui/select/Select.vue b/web/frontend/src/components/ui/select/Select.vue new file mode 100644 index 0000000000..adc42fdfbb --- /dev/null +++ b/web/frontend/src/components/ui/select/Select.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectContent.vue b/web/frontend/src/components/ui/select/SelectContent.vue new file mode 100644 index 0000000000..4fe234b2e0 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectContent.vue @@ -0,0 +1,53 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectGroup.vue b/web/frontend/src/components/ui/select/SelectGroup.vue new file mode 100644 index 0000000000..407d8ad3b4 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectItem.vue b/web/frontend/src/components/ui/select/SelectItem.vue new file mode 100644 index 0000000000..b102a81283 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectItem.vue @@ -0,0 +1,44 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectItemText.vue b/web/frontend/src/components/ui/select/SelectItemText.vue new file mode 100644 index 0000000000..a0bb5c2404 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectItemText.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectLabel.vue b/web/frontend/src/components/ui/select/SelectLabel.vue new file mode 100644 index 0000000000..3d45cdb6a3 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectLabel.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectScrollDownButton.vue b/web/frontend/src/components/ui/select/SelectScrollDownButton.vue new file mode 100644 index 0000000000..54b6c6ac01 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectScrollDownButton.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectScrollUpButton.vue b/web/frontend/src/components/ui/select/SelectScrollUpButton.vue new file mode 100644 index 0000000000..5535f1c779 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectScrollUpButton.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectSeparator.vue b/web/frontend/src/components/ui/select/SelectSeparator.vue new file mode 100644 index 0000000000..5ae593d22e --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectSeparator.vue @@ -0,0 +1,17 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectTrigger.vue b/web/frontend/src/components/ui/select/SelectTrigger.vue new file mode 100644 index 0000000000..cfac8eb9b2 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectTrigger.vue @@ -0,0 +1,31 @@ + + + diff --git a/web/frontend/src/components/ui/select/SelectValue.vue b/web/frontend/src/components/ui/select/SelectValue.vue new file mode 100644 index 0000000000..4bc37dd8b7 --- /dev/null +++ b/web/frontend/src/components/ui/select/SelectValue.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/select/index.ts b/web/frontend/src/components/ui/select/index.ts new file mode 100644 index 0000000000..b1d89eedfe --- /dev/null +++ b/web/frontend/src/components/ui/select/index.ts @@ -0,0 +1,11 @@ +export { default as Select } from './Select.vue' +export { default as SelectValue } from './SelectValue.vue' +export { default as SelectTrigger } from './SelectTrigger.vue' +export { default as SelectContent } from './SelectContent.vue' +export { default as SelectGroup } from './SelectGroup.vue' +export { default as SelectItem } from './SelectItem.vue' +export { default as SelectItemText } from './SelectItemText.vue' +export { default as SelectLabel } from './SelectLabel.vue' +export { default as SelectSeparator } from './SelectSeparator.vue' +export { default as SelectScrollUpButton } from './SelectScrollUpButton.vue' +export { default as SelectScrollDownButton } from './SelectScrollDownButton.vue' diff --git a/web/frontend/src/components/ui/separator/Separator.vue b/web/frontend/src/components/ui/separator/Separator.vue new file mode 100644 index 0000000000..791626c215 --- /dev/null +++ b/web/frontend/src/components/ui/separator/Separator.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/frontend/src/components/ui/separator/index.ts b/web/frontend/src/components/ui/separator/index.ts new file mode 100644 index 0000000000..2287bcb94b --- /dev/null +++ b/web/frontend/src/components/ui/separator/index.ts @@ -0,0 +1 @@ +export { default as Separator } from './Separator.vue' diff --git a/web/frontend/src/components/ui/sheet/Sheet.vue b/web/frontend/src/components/ui/sheet/Sheet.vue new file mode 100644 index 0000000000..a04c026261 --- /dev/null +++ b/web/frontend/src/components/ui/sheet/Sheet.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/sheet/SheetClose.vue b/web/frontend/src/components/ui/sheet/SheetClose.vue new file mode 100644 index 0000000000..a64703e56f --- /dev/null +++ b/web/frontend/src/components/ui/sheet/SheetClose.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/sheet/SheetContent.vue b/web/frontend/src/components/ui/sheet/SheetContent.vue new file mode 100644 index 0000000000..7962518239 --- /dev/null +++ b/web/frontend/src/components/ui/sheet/SheetContent.vue @@ -0,0 +1,56 @@ + + + diff --git a/web/frontend/src/components/ui/sheet/SheetDescription.vue b/web/frontend/src/components/ui/sheet/SheetDescription.vue new file mode 100644 index 0000000000..842cd08afb --- /dev/null +++ b/web/frontend/src/components/ui/sheet/SheetDescription.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/sheet/SheetFooter.vue b/web/frontend/src/components/ui/sheet/SheetFooter.vue new file mode 100644 index 0000000000..ac2d0c18b6 --- /dev/null +++ b/web/frontend/src/components/ui/sheet/SheetFooter.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/sheet/SheetHeader.vue b/web/frontend/src/components/ui/sheet/SheetHeader.vue new file mode 100644 index 0000000000..541f48f57a --- /dev/null +++ b/web/frontend/src/components/ui/sheet/SheetHeader.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/sheet/SheetTitle.vue b/web/frontend/src/components/ui/sheet/SheetTitle.vue new file mode 100644 index 0000000000..2ca0c54336 --- /dev/null +++ b/web/frontend/src/components/ui/sheet/SheetTitle.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/sheet/SheetTrigger.vue b/web/frontend/src/components/ui/sheet/SheetTrigger.vue new file mode 100644 index 0000000000..ee0c12ff32 --- /dev/null +++ b/web/frontend/src/components/ui/sheet/SheetTrigger.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/sheet/index.ts b/web/frontend/src/components/ui/sheet/index.ts new file mode 100644 index 0000000000..fae3f08c47 --- /dev/null +++ b/web/frontend/src/components/ui/sheet/index.ts @@ -0,0 +1,31 @@ +import { type VariantProps, cva } from 'class-variance-authority' + +export { default as Sheet } from './Sheet.vue' +export { default as SheetTrigger } from './SheetTrigger.vue' +export { default as SheetClose } from './SheetClose.vue' +export { default as SheetContent } from './SheetContent.vue' +export { default as SheetHeader } from './SheetHeader.vue' +export { default as SheetTitle } from './SheetTitle.vue' +export { default as SheetDescription } from './SheetDescription.vue' +export { default as SheetFooter } from './SheetFooter.vue' + +export const sheetVariants = cva( + 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500', + { + 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', + }, + }, +) + +export type SheetVariants = VariantProps diff --git a/web/frontend/src/components/ui/skeleton/Skeleton.vue b/web/frontend/src/components/ui/skeleton/Skeleton.vue new file mode 100644 index 0000000000..b49e3d9b41 --- /dev/null +++ b/web/frontend/src/components/ui/skeleton/Skeleton.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/skeleton/index.ts b/web/frontend/src/components/ui/skeleton/index.ts new file mode 100644 index 0000000000..be21fad38a --- /dev/null +++ b/web/frontend/src/components/ui/skeleton/index.ts @@ -0,0 +1 @@ +export { default as Skeleton } from './Skeleton.vue' diff --git a/web/frontend/src/components/ui/slider/Slider.vue b/web/frontend/src/components/ui/slider/Slider.vue new file mode 100644 index 0000000000..a87165be26 --- /dev/null +++ b/web/frontend/src/components/ui/slider/Slider.vue @@ -0,0 +1,36 @@ + + + diff --git a/web/frontend/src/components/ui/slider/index.ts b/web/frontend/src/components/ui/slider/index.ts new file mode 100644 index 0000000000..1c945deb6e --- /dev/null +++ b/web/frontend/src/components/ui/slider/index.ts @@ -0,0 +1 @@ +export { default as Slider } from './Slider.vue' diff --git a/web/frontend/src/components/ui/sonner/Sonner.vue b/web/frontend/src/components/ui/sonner/Sonner.vue new file mode 100644 index 0000000000..b82b29e27d --- /dev/null +++ b/web/frontend/src/components/ui/sonner/Sonner.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/sonner/index.ts b/web/frontend/src/components/ui/sonner/index.ts new file mode 100644 index 0000000000..0d4a6423d0 --- /dev/null +++ b/web/frontend/src/components/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Toaster } from './Sonner.vue' diff --git a/web/frontend/src/components/ui/switch/Switch.vue b/web/frontend/src/components/ui/switch/Switch.vue new file mode 100644 index 0000000000..f2ee993c31 --- /dev/null +++ b/web/frontend/src/components/ui/switch/Switch.vue @@ -0,0 +1,37 @@ + + + diff --git a/web/frontend/src/components/ui/switch/index.ts b/web/frontend/src/components/ui/switch/index.ts new file mode 100644 index 0000000000..87b4b17da8 --- /dev/null +++ b/web/frontend/src/components/ui/switch/index.ts @@ -0,0 +1 @@ +export { default as Switch } from './Switch.vue' diff --git a/web/frontend/src/components/ui/table/Table.vue b/web/frontend/src/components/ui/table/Table.vue new file mode 100644 index 0000000000..a42389182b --- /dev/null +++ b/web/frontend/src/components/ui/table/Table.vue @@ -0,0 +1,16 @@ + + + diff --git a/web/frontend/src/components/ui/table/TableBody.vue b/web/frontend/src/components/ui/table/TableBody.vue new file mode 100644 index 0000000000..ab7a937dcb --- /dev/null +++ b/web/frontend/src/components/ui/table/TableBody.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/table/TableCaption.vue b/web/frontend/src/components/ui/table/TableCaption.vue new file mode 100644 index 0000000000..3904c56365 --- /dev/null +++ b/web/frontend/src/components/ui/table/TableCaption.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/table/TableCell.vue b/web/frontend/src/components/ui/table/TableCell.vue new file mode 100644 index 0000000000..4a4da40043 --- /dev/null +++ b/web/frontend/src/components/ui/table/TableCell.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/table/TableEmpty.vue b/web/frontend/src/components/ui/table/TableEmpty.vue new file mode 100644 index 0000000000..43fe7e0c93 --- /dev/null +++ b/web/frontend/src/components/ui/table/TableEmpty.vue @@ -0,0 +1,37 @@ + + + diff --git a/web/frontend/src/components/ui/table/TableFooter.vue b/web/frontend/src/components/ui/table/TableFooter.vue new file mode 100644 index 0000000000..693a4386e1 --- /dev/null +++ b/web/frontend/src/components/ui/table/TableFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/table/TableHead.vue b/web/frontend/src/components/ui/table/TableHead.vue new file mode 100644 index 0000000000..e882b6084d --- /dev/null +++ b/web/frontend/src/components/ui/table/TableHead.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/table/TableHeader.vue b/web/frontend/src/components/ui/table/TableHeader.vue new file mode 100644 index 0000000000..220352f6d7 --- /dev/null +++ b/web/frontend/src/components/ui/table/TableHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/table/TableRow.vue b/web/frontend/src/components/ui/table/TableRow.vue new file mode 100644 index 0000000000..5b9e874986 --- /dev/null +++ b/web/frontend/src/components/ui/table/TableRow.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/frontend/src/components/ui/table/index.ts b/web/frontend/src/components/ui/table/index.ts new file mode 100644 index 0000000000..44582d359e --- /dev/null +++ b/web/frontend/src/components/ui/table/index.ts @@ -0,0 +1,8 @@ +export { default as Table } from './Table.vue' +export { default as TableBody } from './TableBody.vue' +export { default as TableCell } from './TableCell.vue' +export { default as TableHead } from './TableHead.vue' +export { default as TableHeader } from './TableHeader.vue' +export { default as TableRow } from './TableRow.vue' +export { default as TableCaption } from './TableCaption.vue' +export { default as TableEmpty } from './TableEmpty.vue' diff --git a/web/frontend/src/components/ui/tabs/Tabs.vue b/web/frontend/src/components/ui/tabs/Tabs.vue new file mode 100644 index 0000000000..2fa0971fef --- /dev/null +++ b/web/frontend/src/components/ui/tabs/Tabs.vue @@ -0,0 +1,15 @@ + + + diff --git a/web/frontend/src/components/ui/tabs/TabsContent.vue b/web/frontend/src/components/ui/tabs/TabsContent.vue new file mode 100644 index 0000000000..c0aa0f357c --- /dev/null +++ b/web/frontend/src/components/ui/tabs/TabsContent.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/tabs/TabsList.vue b/web/frontend/src/components/ui/tabs/TabsList.vue new file mode 100644 index 0000000000..9644cdc375 --- /dev/null +++ b/web/frontend/src/components/ui/tabs/TabsList.vue @@ -0,0 +1,25 @@ + + + diff --git a/web/frontend/src/components/ui/tabs/TabsTrigger.vue b/web/frontend/src/components/ui/tabs/TabsTrigger.vue new file mode 100644 index 0000000000..5fa6748dd8 --- /dev/null +++ b/web/frontend/src/components/ui/tabs/TabsTrigger.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/frontend/src/components/ui/tabs/index.ts b/web/frontend/src/components/ui/tabs/index.ts new file mode 100644 index 0000000000..fbea0c68bd --- /dev/null +++ b/web/frontend/src/components/ui/tabs/index.ts @@ -0,0 +1,4 @@ +export { default as Tabs } from './Tabs.vue' +export { default as TabsTrigger } from './TabsTrigger.vue' +export { default as TabsList } from './TabsList.vue' +export { default as TabsContent } from './TabsContent.vue' diff --git a/web/frontend/src/components/ui/tags-input/TagsInput.vue b/web/frontend/src/components/ui/tags-input/TagsInput.vue new file mode 100644 index 0000000000..acf6bd3c54 --- /dev/null +++ b/web/frontend/src/components/ui/tags-input/TagsInput.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/tags-input/TagsInputInput.vue b/web/frontend/src/components/ui/tags-input/TagsInputInput.vue new file mode 100644 index 0000000000..ccb08a15d2 --- /dev/null +++ b/web/frontend/src/components/ui/tags-input/TagsInputInput.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/tags-input/TagsInputItem.vue b/web/frontend/src/components/ui/tags-input/TagsInputItem.vue new file mode 100644 index 0000000000..23fae2057d --- /dev/null +++ b/web/frontend/src/components/ui/tags-input/TagsInputItem.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/tags-input/TagsInputItemDelete.vue b/web/frontend/src/components/ui/tags-input/TagsInputItemDelete.vue new file mode 100644 index 0000000000..544eebc4b1 --- /dev/null +++ b/web/frontend/src/components/ui/tags-input/TagsInputItemDelete.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/tags-input/TagsInputItemText.vue b/web/frontend/src/components/ui/tags-input/TagsInputItemText.vue new file mode 100644 index 0000000000..91ade8b639 --- /dev/null +++ b/web/frontend/src/components/ui/tags-input/TagsInputItemText.vue @@ -0,0 +1,19 @@ + + + diff --git a/web/frontend/src/components/ui/tags-input/index.ts b/web/frontend/src/components/ui/tags-input/index.ts new file mode 100644 index 0000000000..31305f3483 --- /dev/null +++ b/web/frontend/src/components/ui/tags-input/index.ts @@ -0,0 +1,5 @@ +export { default as TagsInput } from './TagsInput.vue' +export { default as TagsInputInput } from './TagsInputInput.vue' +export { default as TagsInputItem } from './TagsInputItem.vue' +export { default as TagsInputItemDelete } from './TagsInputItemDelete.vue' +export { default as TagsInputItemText } from './TagsInputItemText.vue' diff --git a/web/frontend/src/components/ui/textarea/Textarea.vue b/web/frontend/src/components/ui/textarea/Textarea.vue new file mode 100644 index 0000000000..b72cb7e784 --- /dev/null +++ b/web/frontend/src/components/ui/textarea/Textarea.vue @@ -0,0 +1,24 @@ + + +