├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── index.html ├── package.json ├── pnpm-lock.yaml ├── src ├── App.vue ├── components │ ├── FirstModal.vue │ └── SecondModal.vue ├── keyframes.css ├── main.css ├── main.ts ├── ui │ ├── components │ │ ├── Avatar.vue │ │ ├── AvatarGroup.vue │ │ ├── Button.vue │ │ ├── ButtonGroup.vue │ │ ├── Icon.vue │ │ ├── Link.vue │ │ ├── Modal.vue │ │ └── OverlayProvider.vue │ ├── composables │ │ ├── useAvatarGroup.ts │ │ ├── useButtonGroup.ts │ │ ├── useComponentIcons.ts │ │ └── useOverlay.ts │ ├── icons │ │ └── index.ts │ ├── keys │ │ ├── avatar-group.ts │ │ └── button-group.ts │ ├── theme │ │ ├── avatar-group.ts │ │ ├── avatar.ts │ │ ├── button-group.ts │ │ ├── button.ts │ │ ├── icon.ts │ │ ├── link.ts │ │ └── modal.ts │ ├── types │ │ └── utils.ts │ └── utils │ │ ├── omit.ts │ │ └── pick-link-props.ts └── vite-env.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | auto-imports.d.ts 26 | components.d.ts 27 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue Dialog Stacking 2 | 3 | An experiment to stack multiple dialogs on top of each other in Vue 3. 4 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Vue + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-dialog-stacking", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@tailwindcss/vite": "^4.0.17", 13 | "@vueuse/core": "^13.0.0", 14 | "@vueuse/shared": "^13.0.0", 15 | "reka-ui": "^2.1.1", 16 | "tailwind-variants": "^1.0.0", 17 | "tailwindcss": "^4.0.17", 18 | "vue": "^3.5.13", 19 | "vue-component-type-helpers": "^2.2.8" 20 | }, 21 | "devDependencies": { 22 | "@egoist/tailwindcss-icons": "^1.9.0", 23 | "@iconify-json/lucide": "^1.2.33", 24 | "@types/node": "^22.13.14", 25 | "@vitejs/plugin-vue": "^5.2.1", 26 | "@vue/tsconfig": "^0.7.0", 27 | "typescript": "~5.7.2", 28 | "unplugin-auto-import": "^19.1.2", 29 | "unplugin-vue-components": "^28.4.1", 30 | "vite": "^6.2.0", 31 | "vue-tsc": "^2.2.4" 32 | }, 33 | "packageManager": "pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6" 34 | } 35 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@tailwindcss/vite': 12 | specifier: ^4.0.17 13 | version: 4.0.17(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)) 14 | '@vueuse/core': 15 | specifier: ^13.0.0 16 | version: 13.0.0(vue@3.5.13(typescript@5.7.3)) 17 | '@vueuse/shared': 18 | specifier: ^13.0.0 19 | version: 13.0.0(vue@3.5.13(typescript@5.7.3)) 20 | reka-ui: 21 | specifier: ^2.1.1 22 | version: 2.1.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) 23 | tailwind-variants: 24 | specifier: ^1.0.0 25 | version: 1.0.0(tailwindcss@4.0.17) 26 | tailwindcss: 27 | specifier: ^4.0.17 28 | version: 4.0.17 29 | vue: 30 | specifier: ^3.5.13 31 | version: 3.5.13(typescript@5.7.3) 32 | vue-component-type-helpers: 33 | specifier: ^2.2.8 34 | version: 2.2.8 35 | devDependencies: 36 | '@egoist/tailwindcss-icons': 37 | specifier: ^1.9.0 38 | version: 1.9.0(tailwindcss@4.0.17) 39 | '@iconify-json/lucide': 40 | specifier: ^1.2.33 41 | version: 1.2.33 42 | '@types/node': 43 | specifier: ^22.13.14 44 | version: 22.13.14 45 | '@vitejs/plugin-vue': 46 | specifier: ^5.2.1 47 | version: 5.2.3(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2))(vue@3.5.13(typescript@5.7.3)) 48 | '@vue/tsconfig': 49 | specifier: ^0.7.0 50 | version: 0.7.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) 51 | typescript: 52 | specifier: ~5.7.2 53 | version: 5.7.3 54 | unplugin-auto-import: 55 | specifier: ^19.1.2 56 | version: 19.1.2(@vueuse/core@13.0.0(vue@3.5.13(typescript@5.7.3))) 57 | unplugin-vue-components: 58 | specifier: ^28.4.1 59 | version: 28.4.1(@babel/parser@7.27.0)(vue@3.5.13(typescript@5.7.3)) 60 | vite: 61 | specifier: ^6.2.0 62 | version: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2) 63 | vue-tsc: 64 | specifier: ^2.2.4 65 | version: 2.2.8(typescript@5.7.3) 66 | 67 | packages: 68 | 69 | '@antfu/install-pkg@1.0.0': 70 | resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} 71 | 72 | '@antfu/utils@8.1.1': 73 | resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} 74 | 75 | '@babel/helper-string-parser@7.25.9': 76 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 77 | engines: {node: '>=6.9.0'} 78 | 79 | '@babel/helper-validator-identifier@7.25.9': 80 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 81 | engines: {node: '>=6.9.0'} 82 | 83 | '@babel/parser@7.27.0': 84 | resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} 85 | engines: {node: '>=6.0.0'} 86 | hasBin: true 87 | 88 | '@babel/types@7.27.0': 89 | resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} 90 | engines: {node: '>=6.9.0'} 91 | 92 | '@egoist/tailwindcss-icons@1.9.0': 93 | resolution: {integrity: sha512-xWA9cUy6hzlK7Y6TaoRIcwmilSXiTJ8rbXcEdf9uht7yzDgw/yIgF4rThIQMrpD2Y2v4od51+r2y6Z7GStanDQ==} 94 | peerDependencies: 95 | tailwindcss: '*' 96 | 97 | '@esbuild/aix-ppc64@0.25.1': 98 | resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 99 | engines: {node: '>=18'} 100 | cpu: [ppc64] 101 | os: [aix] 102 | 103 | '@esbuild/android-arm64@0.25.1': 104 | resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 105 | engines: {node: '>=18'} 106 | cpu: [arm64] 107 | os: [android] 108 | 109 | '@esbuild/android-arm@0.25.1': 110 | resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 111 | engines: {node: '>=18'} 112 | cpu: [arm] 113 | os: [android] 114 | 115 | '@esbuild/android-x64@0.25.1': 116 | resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 117 | engines: {node: '>=18'} 118 | cpu: [x64] 119 | os: [android] 120 | 121 | '@esbuild/darwin-arm64@0.25.1': 122 | resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 123 | engines: {node: '>=18'} 124 | cpu: [arm64] 125 | os: [darwin] 126 | 127 | '@esbuild/darwin-x64@0.25.1': 128 | resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 129 | engines: {node: '>=18'} 130 | cpu: [x64] 131 | os: [darwin] 132 | 133 | '@esbuild/freebsd-arm64@0.25.1': 134 | resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 135 | engines: {node: '>=18'} 136 | cpu: [arm64] 137 | os: [freebsd] 138 | 139 | '@esbuild/freebsd-x64@0.25.1': 140 | resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 141 | engines: {node: '>=18'} 142 | cpu: [x64] 143 | os: [freebsd] 144 | 145 | '@esbuild/linux-arm64@0.25.1': 146 | resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 147 | engines: {node: '>=18'} 148 | cpu: [arm64] 149 | os: [linux] 150 | 151 | '@esbuild/linux-arm@0.25.1': 152 | resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 153 | engines: {node: '>=18'} 154 | cpu: [arm] 155 | os: [linux] 156 | 157 | '@esbuild/linux-ia32@0.25.1': 158 | resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 159 | engines: {node: '>=18'} 160 | cpu: [ia32] 161 | os: [linux] 162 | 163 | '@esbuild/linux-loong64@0.25.1': 164 | resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 165 | engines: {node: '>=18'} 166 | cpu: [loong64] 167 | os: [linux] 168 | 169 | '@esbuild/linux-mips64el@0.25.1': 170 | resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 171 | engines: {node: '>=18'} 172 | cpu: [mips64el] 173 | os: [linux] 174 | 175 | '@esbuild/linux-ppc64@0.25.1': 176 | resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 177 | engines: {node: '>=18'} 178 | cpu: [ppc64] 179 | os: [linux] 180 | 181 | '@esbuild/linux-riscv64@0.25.1': 182 | resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 183 | engines: {node: '>=18'} 184 | cpu: [riscv64] 185 | os: [linux] 186 | 187 | '@esbuild/linux-s390x@0.25.1': 188 | resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 189 | engines: {node: '>=18'} 190 | cpu: [s390x] 191 | os: [linux] 192 | 193 | '@esbuild/linux-x64@0.25.1': 194 | resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 195 | engines: {node: '>=18'} 196 | cpu: [x64] 197 | os: [linux] 198 | 199 | '@esbuild/netbsd-arm64@0.25.1': 200 | resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 201 | engines: {node: '>=18'} 202 | cpu: [arm64] 203 | os: [netbsd] 204 | 205 | '@esbuild/netbsd-x64@0.25.1': 206 | resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 207 | engines: {node: '>=18'} 208 | cpu: [x64] 209 | os: [netbsd] 210 | 211 | '@esbuild/openbsd-arm64@0.25.1': 212 | resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 213 | engines: {node: '>=18'} 214 | cpu: [arm64] 215 | os: [openbsd] 216 | 217 | '@esbuild/openbsd-x64@0.25.1': 218 | resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 219 | engines: {node: '>=18'} 220 | cpu: [x64] 221 | os: [openbsd] 222 | 223 | '@esbuild/sunos-x64@0.25.1': 224 | resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 225 | engines: {node: '>=18'} 226 | cpu: [x64] 227 | os: [sunos] 228 | 229 | '@esbuild/win32-arm64@0.25.1': 230 | resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 231 | engines: {node: '>=18'} 232 | cpu: [arm64] 233 | os: [win32] 234 | 235 | '@esbuild/win32-ia32@0.25.1': 236 | resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 237 | engines: {node: '>=18'} 238 | cpu: [ia32] 239 | os: [win32] 240 | 241 | '@esbuild/win32-x64@0.25.1': 242 | resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} 243 | engines: {node: '>=18'} 244 | cpu: [x64] 245 | os: [win32] 246 | 247 | '@floating-ui/core@1.6.9': 248 | resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} 249 | 250 | '@floating-ui/dom@1.6.13': 251 | resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} 252 | 253 | '@floating-ui/utils@0.2.9': 254 | resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} 255 | 256 | '@floating-ui/vue@1.1.6': 257 | resolution: {integrity: sha512-XFlUzGHGv12zbgHNk5FN2mUB7ROul3oG2ENdTpWdE+qMFxyNxWSRmsoyhiEnpmabNm6WnUvR1OvJfUfN4ojC1A==} 258 | 259 | '@iconify-json/lucide@1.2.33': 260 | resolution: {integrity: sha512-2Ty+rI0tRHJEbM6J48G40ONvCPrcFC3o4PpAqOXZ3X+Uz2vMzrGj6tl2XHToZ64nc6lg+fC3WhkJebyyQxLVcw==} 261 | 262 | '@iconify/types@2.0.0': 263 | resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 264 | 265 | '@iconify/utils@2.3.0': 266 | resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} 267 | 268 | '@internationalized/date@3.7.0': 269 | resolution: {integrity: sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==} 270 | 271 | '@internationalized/number@3.6.0': 272 | resolution: {integrity: sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==} 273 | 274 | '@jridgewell/sourcemap-codec@1.5.0': 275 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 276 | 277 | '@rollup/rollup-android-arm-eabi@4.37.0': 278 | resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} 279 | cpu: [arm] 280 | os: [android] 281 | 282 | '@rollup/rollup-android-arm64@4.37.0': 283 | resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} 284 | cpu: [arm64] 285 | os: [android] 286 | 287 | '@rollup/rollup-darwin-arm64@4.37.0': 288 | resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} 289 | cpu: [arm64] 290 | os: [darwin] 291 | 292 | '@rollup/rollup-darwin-x64@4.37.0': 293 | resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} 294 | cpu: [x64] 295 | os: [darwin] 296 | 297 | '@rollup/rollup-freebsd-arm64@4.37.0': 298 | resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} 299 | cpu: [arm64] 300 | os: [freebsd] 301 | 302 | '@rollup/rollup-freebsd-x64@4.37.0': 303 | resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} 304 | cpu: [x64] 305 | os: [freebsd] 306 | 307 | '@rollup/rollup-linux-arm-gnueabihf@4.37.0': 308 | resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} 309 | cpu: [arm] 310 | os: [linux] 311 | 312 | '@rollup/rollup-linux-arm-musleabihf@4.37.0': 313 | resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} 314 | cpu: [arm] 315 | os: [linux] 316 | 317 | '@rollup/rollup-linux-arm64-gnu@4.37.0': 318 | resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} 319 | cpu: [arm64] 320 | os: [linux] 321 | 322 | '@rollup/rollup-linux-arm64-musl@4.37.0': 323 | resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} 324 | cpu: [arm64] 325 | os: [linux] 326 | 327 | '@rollup/rollup-linux-loongarch64-gnu@4.37.0': 328 | resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} 329 | cpu: [loong64] 330 | os: [linux] 331 | 332 | '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': 333 | resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} 334 | cpu: [ppc64] 335 | os: [linux] 336 | 337 | '@rollup/rollup-linux-riscv64-gnu@4.37.0': 338 | resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} 339 | cpu: [riscv64] 340 | os: [linux] 341 | 342 | '@rollup/rollup-linux-riscv64-musl@4.37.0': 343 | resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} 344 | cpu: [riscv64] 345 | os: [linux] 346 | 347 | '@rollup/rollup-linux-s390x-gnu@4.37.0': 348 | resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} 349 | cpu: [s390x] 350 | os: [linux] 351 | 352 | '@rollup/rollup-linux-x64-gnu@4.37.0': 353 | resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} 354 | cpu: [x64] 355 | os: [linux] 356 | 357 | '@rollup/rollup-linux-x64-musl@4.37.0': 358 | resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} 359 | cpu: [x64] 360 | os: [linux] 361 | 362 | '@rollup/rollup-win32-arm64-msvc@4.37.0': 363 | resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} 364 | cpu: [arm64] 365 | os: [win32] 366 | 367 | '@rollup/rollup-win32-ia32-msvc@4.37.0': 368 | resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} 369 | cpu: [ia32] 370 | os: [win32] 371 | 372 | '@rollup/rollup-win32-x64-msvc@4.37.0': 373 | resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} 374 | cpu: [x64] 375 | os: [win32] 376 | 377 | '@swc/helpers@0.5.15': 378 | resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} 379 | 380 | '@tailwindcss/node@4.0.17': 381 | resolution: {integrity: sha512-LIdNwcqyY7578VpofXyqjH6f+3fP4nrz7FBLki5HpzqjYfXdF2m/eW18ZfoKePtDGg90Bvvfpov9d2gy5XVCbg==} 382 | 383 | '@tailwindcss/oxide-android-arm64@4.0.17': 384 | resolution: {integrity: sha512-3RfO0ZK64WAhop+EbHeyxGThyDr/fYhxPzDbEQjD2+v7ZhKTb2svTWy+KK+J1PHATus2/CQGAGp7pHY/8M8ugg==} 385 | engines: {node: '>= 10'} 386 | cpu: [arm64] 387 | os: [android] 388 | 389 | '@tailwindcss/oxide-darwin-arm64@4.0.17': 390 | resolution: {integrity: sha512-e1uayxFQCCDuzTk9s8q7MC5jFN42IY7nzcr5n0Mw/AcUHwD6JaBkXnATkD924ZsHyPDvddnusIEvkgLd2CiREg==} 391 | engines: {node: '>= 10'} 392 | cpu: [arm64] 393 | os: [darwin] 394 | 395 | '@tailwindcss/oxide-darwin-x64@4.0.17': 396 | resolution: {integrity: sha512-d6z7HSdOKfXQ0HPlVx1jduUf/YtBuCCtEDIEFeBCzgRRtDsUuRtofPqxIVaSCUTOk5+OfRLonje6n9dF6AH8wQ==} 397 | engines: {node: '>= 10'} 398 | cpu: [x64] 399 | os: [darwin] 400 | 401 | '@tailwindcss/oxide-freebsd-x64@4.0.17': 402 | resolution: {integrity: sha512-EjrVa6lx3wzXz3l5MsdOGtYIsRjgs5Mru6lDv4RuiXpguWeOb3UzGJ7vw7PEzcFadKNvNslEQqoAABeMezprxQ==} 403 | engines: {node: '>= 10'} 404 | cpu: [x64] 405 | os: [freebsd] 406 | 407 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.17': 408 | resolution: {integrity: sha512-65zXfCOdi8wuaY0Ye6qMR5LAXokHYtrGvo9t/NmxvSZtCCitXV/gzJ/WP5ksXPhff1SV5rov0S+ZIZU+/4eyCQ==} 409 | engines: {node: '>= 10'} 410 | cpu: [arm] 411 | os: [linux] 412 | 413 | '@tailwindcss/oxide-linux-arm64-gnu@4.0.17': 414 | resolution: {integrity: sha512-+aaq6hJ8ioTdbJV5IA1WjWgLmun4T7eYLTvJIToiXLHy5JzUERRbIZjAcjgK9qXMwnvuu7rqpxzej+hGoEcG5g==} 415 | engines: {node: '>= 10'} 416 | cpu: [arm64] 417 | os: [linux] 418 | 419 | '@tailwindcss/oxide-linux-arm64-musl@4.0.17': 420 | resolution: {integrity: sha512-/FhWgZCdUGAeYHYnZKekiOC0aXFiBIoNCA0bwzkICiMYS5Rtx2KxFfMUXQVnl4uZRblG5ypt5vpPhVaXgGk80w==} 421 | engines: {node: '>= 10'} 422 | cpu: [arm64] 423 | os: [linux] 424 | 425 | '@tailwindcss/oxide-linux-x64-gnu@4.0.17': 426 | resolution: {integrity: sha512-gELJzOHK6GDoIpm/539Golvk+QWZjxQcbkKq9eB2kzNkOvrP0xc5UPgO9bIMNt1M48mO8ZeNenCMGt6tfkvVBg==} 427 | engines: {node: '>= 10'} 428 | cpu: [x64] 429 | os: [linux] 430 | 431 | '@tailwindcss/oxide-linux-x64-musl@4.0.17': 432 | resolution: {integrity: sha512-68NwxcJrZn94IOW4TysMIbYv5AlM6So1luTlbYUDIGnKma1yTFGBRNEJ+SacJ3PZE2rgcTBNRHX1TB4EQ/XEHw==} 433 | engines: {node: '>= 10'} 434 | cpu: [x64] 435 | os: [linux] 436 | 437 | '@tailwindcss/oxide-win32-arm64-msvc@4.0.17': 438 | resolution: {integrity: sha512-AkBO8efP2/7wkEXkNlXzRD4f/7WerqKHlc6PWb5v0jGbbm22DFBLbIM19IJQ3b+tNewQZa+WnPOaGm0SmwMNjw==} 439 | engines: {node: '>= 10'} 440 | cpu: [arm64] 441 | os: [win32] 442 | 443 | '@tailwindcss/oxide-win32-x64-msvc@4.0.17': 444 | resolution: {integrity: sha512-7/DTEvXcoWlqX0dAlcN0zlmcEu9xSermuo7VNGX9tJ3nYMdo735SHvbrHDln1+LYfF6NhJ3hjbpbjkMOAGmkDg==} 445 | engines: {node: '>= 10'} 446 | cpu: [x64] 447 | os: [win32] 448 | 449 | '@tailwindcss/oxide@4.0.17': 450 | resolution: {integrity: sha512-B4OaUIRD2uVrULpAD1Yksx2+wNarQr2rQh65nXqaqbLY1jCd8fO+3KLh/+TH4Hzh2NTHQvgxVbPdUDOtLk7vAw==} 451 | engines: {node: '>= 10'} 452 | 453 | '@tailwindcss/vite@4.0.17': 454 | resolution: {integrity: sha512-HJbBYDlDVg5cvYZzECb6xwc1IDCEM3uJi3hEZp3BjZGCNGJcTsnCpan+z+VMW0zo6gR0U6O6ElqU1OoZ74Dhww==} 455 | peerDependencies: 456 | vite: ^5.2.0 || ^6 457 | 458 | '@tanstack/virtual-core@3.13.5': 459 | resolution: {integrity: sha512-gMLNylxhJdUlfRR1G3U9rtuwUh2IjdrrniJIDcekVJN3/3i+bluvdMi3+eodnxzJq5nKnxnigo9h0lIpaqV6HQ==} 460 | 461 | '@tanstack/vue-virtual@3.13.5': 462 | resolution: {integrity: sha512-1hhUA6CUjmKc5JDyKLcYOV6mI631FaKKxXh77Ja4UtIy6EOofYaLPk8vVgvK6vLMUSfHR2vI3ZpPY9ibyX60SA==} 463 | peerDependencies: 464 | vue: ^2.7.0 || ^3.0.0 465 | 466 | '@types/estree@1.0.6': 467 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 468 | 469 | '@types/node@22.13.14': 470 | resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} 471 | 472 | '@types/web-bluetooth@0.0.21': 473 | resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} 474 | 475 | '@vitejs/plugin-vue@5.2.3': 476 | resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} 477 | engines: {node: ^18.0.0 || >=20.0.0} 478 | peerDependencies: 479 | vite: ^5.0.0 || ^6.0.0 480 | vue: ^3.2.25 481 | 482 | '@volar/language-core@2.4.12': 483 | resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} 484 | 485 | '@volar/source-map@2.4.12': 486 | resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} 487 | 488 | '@volar/typescript@2.4.12': 489 | resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} 490 | 491 | '@vue/compiler-core@3.5.13': 492 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 493 | 494 | '@vue/compiler-dom@3.5.13': 495 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 496 | 497 | '@vue/compiler-sfc@3.5.13': 498 | resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} 499 | 500 | '@vue/compiler-ssr@3.5.13': 501 | resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} 502 | 503 | '@vue/compiler-vue2@2.7.16': 504 | resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} 505 | 506 | '@vue/language-core@2.2.8': 507 | resolution: {integrity: sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==} 508 | peerDependencies: 509 | typescript: '*' 510 | peerDependenciesMeta: 511 | typescript: 512 | optional: true 513 | 514 | '@vue/reactivity@3.5.13': 515 | resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} 516 | 517 | '@vue/runtime-core@3.5.13': 518 | resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} 519 | 520 | '@vue/runtime-dom@3.5.13': 521 | resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} 522 | 523 | '@vue/server-renderer@3.5.13': 524 | resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} 525 | peerDependencies: 526 | vue: 3.5.13 527 | 528 | '@vue/shared@3.5.13': 529 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 530 | 531 | '@vue/tsconfig@0.7.0': 532 | resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} 533 | peerDependencies: 534 | typescript: 5.x 535 | vue: ^3.4.0 536 | peerDependenciesMeta: 537 | typescript: 538 | optional: true 539 | vue: 540 | optional: true 541 | 542 | '@vueuse/core@12.8.2': 543 | resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} 544 | 545 | '@vueuse/core@13.0.0': 546 | resolution: {integrity: sha512-rkgb4a8/0b234lMGCT29WkCjPfsX0oxrIRR7FDndRoW3FsaC9NBzefXg/9TLhAgwM11f49XnutshM4LzJBrQ5g==} 547 | peerDependencies: 548 | vue: ^3.5.0 549 | 550 | '@vueuse/metadata@12.8.2': 551 | resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} 552 | 553 | '@vueuse/metadata@13.0.0': 554 | resolution: {integrity: sha512-TRNksqmvtvqsuHf7bbgH9OSXEV2b6+M3BSN4LR5oxWKykOFT9gV78+C2/0++Pq9KCp9KQ1OQDPvGlWNQpOb2Mw==} 555 | 556 | '@vueuse/shared@12.8.2': 557 | resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} 558 | 559 | '@vueuse/shared@13.0.0': 560 | resolution: {integrity: sha512-9MiHhAPw+sqCF/RLo8V6HsjRqEdNEWVpDLm2WBRW2G/kSQjb8X901sozXpSCaeLG0f7TEfMrT4XNaA5m1ez7Dg==} 561 | peerDependencies: 562 | vue: ^3.5.0 563 | 564 | acorn@8.14.1: 565 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 566 | engines: {node: '>=0.4.0'} 567 | hasBin: true 568 | 569 | alien-signals@1.0.10: 570 | resolution: {integrity: sha512-pBrgovDvA/c55/aA+ar5pxNCvjQB5IlODtpOQXmUyrpclWIsHmUMsfIuCWsSU/l1iLU2O3ZhICdPaYTsuvGu8Q==} 571 | 572 | anymatch@3.1.3: 573 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 574 | engines: {node: '>= 8'} 575 | 576 | aria-hidden@1.2.4: 577 | resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} 578 | engines: {node: '>=10'} 579 | 580 | balanced-match@1.0.2: 581 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 582 | 583 | binary-extensions@2.3.0: 584 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 585 | engines: {node: '>=8'} 586 | 587 | brace-expansion@2.0.1: 588 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 589 | 590 | braces@3.0.3: 591 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 592 | engines: {node: '>=8'} 593 | 594 | chokidar@3.6.0: 595 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 596 | engines: {node: '>= 8.10.0'} 597 | 598 | confbox@0.1.8: 599 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 600 | 601 | confbox@0.2.1: 602 | resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} 603 | 604 | csstype@3.1.3: 605 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 606 | 607 | de-indent@1.0.2: 608 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 609 | 610 | debug@4.4.0: 611 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 612 | engines: {node: '>=6.0'} 613 | peerDependencies: 614 | supports-color: '*' 615 | peerDependenciesMeta: 616 | supports-color: 617 | optional: true 618 | 619 | defu@6.1.4: 620 | resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 621 | 622 | detect-libc@2.0.3: 623 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 624 | engines: {node: '>=8'} 625 | 626 | enhanced-resolve@5.18.1: 627 | resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 628 | engines: {node: '>=10.13.0'} 629 | 630 | entities@4.5.0: 631 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 632 | engines: {node: '>=0.12'} 633 | 634 | esbuild@0.25.1: 635 | resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 636 | engines: {node: '>=18'} 637 | hasBin: true 638 | 639 | escape-string-regexp@5.0.0: 640 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 641 | engines: {node: '>=12'} 642 | 643 | estree-walker@2.0.2: 644 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 645 | 646 | estree-walker@3.0.3: 647 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 648 | 649 | exsolve@1.0.4: 650 | resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} 651 | 652 | fdir@6.4.3: 653 | resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 654 | peerDependencies: 655 | picomatch: ^3 || ^4 656 | peerDependenciesMeta: 657 | picomatch: 658 | optional: true 659 | 660 | fill-range@7.1.1: 661 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 662 | engines: {node: '>=8'} 663 | 664 | fsevents@2.3.3: 665 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 666 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 667 | os: [darwin] 668 | 669 | glob-parent@5.1.2: 670 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 671 | engines: {node: '>= 6'} 672 | 673 | globals@15.15.0: 674 | resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} 675 | engines: {node: '>=18'} 676 | 677 | graceful-fs@4.2.11: 678 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 679 | 680 | he@1.2.0: 681 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 682 | hasBin: true 683 | 684 | is-binary-path@2.1.0: 685 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 686 | engines: {node: '>=8'} 687 | 688 | is-extglob@2.1.1: 689 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 690 | engines: {node: '>=0.10.0'} 691 | 692 | is-glob@4.0.3: 693 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 694 | engines: {node: '>=0.10.0'} 695 | 696 | is-number@7.0.0: 697 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 698 | engines: {node: '>=0.12.0'} 699 | 700 | jiti@2.4.2: 701 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 702 | hasBin: true 703 | 704 | js-tokens@9.0.1: 705 | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 706 | 707 | kolorist@1.8.0: 708 | resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 709 | 710 | lightningcss-darwin-arm64@1.29.2: 711 | resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} 712 | engines: {node: '>= 12.0.0'} 713 | cpu: [arm64] 714 | os: [darwin] 715 | 716 | lightningcss-darwin-x64@1.29.2: 717 | resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} 718 | engines: {node: '>= 12.0.0'} 719 | cpu: [x64] 720 | os: [darwin] 721 | 722 | lightningcss-freebsd-x64@1.29.2: 723 | resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} 724 | engines: {node: '>= 12.0.0'} 725 | cpu: [x64] 726 | os: [freebsd] 727 | 728 | lightningcss-linux-arm-gnueabihf@1.29.2: 729 | resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} 730 | engines: {node: '>= 12.0.0'} 731 | cpu: [arm] 732 | os: [linux] 733 | 734 | lightningcss-linux-arm64-gnu@1.29.2: 735 | resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} 736 | engines: {node: '>= 12.0.0'} 737 | cpu: [arm64] 738 | os: [linux] 739 | 740 | lightningcss-linux-arm64-musl@1.29.2: 741 | resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} 742 | engines: {node: '>= 12.0.0'} 743 | cpu: [arm64] 744 | os: [linux] 745 | 746 | lightningcss-linux-x64-gnu@1.29.2: 747 | resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} 748 | engines: {node: '>= 12.0.0'} 749 | cpu: [x64] 750 | os: [linux] 751 | 752 | lightningcss-linux-x64-musl@1.29.2: 753 | resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} 754 | engines: {node: '>= 12.0.0'} 755 | cpu: [x64] 756 | os: [linux] 757 | 758 | lightningcss-win32-arm64-msvc@1.29.2: 759 | resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} 760 | engines: {node: '>= 12.0.0'} 761 | cpu: [arm64] 762 | os: [win32] 763 | 764 | lightningcss-win32-x64-msvc@1.29.2: 765 | resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} 766 | engines: {node: '>= 12.0.0'} 767 | cpu: [x64] 768 | os: [win32] 769 | 770 | lightningcss@1.29.2: 771 | resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} 772 | engines: {node: '>= 12.0.0'} 773 | 774 | local-pkg@1.1.1: 775 | resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} 776 | engines: {node: '>=14'} 777 | 778 | magic-string@0.30.17: 779 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 780 | 781 | minimatch@9.0.5: 782 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 783 | engines: {node: '>=16 || 14 >=14.17'} 784 | 785 | mlly@1.7.4: 786 | resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} 787 | 788 | ms@2.1.3: 789 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 790 | 791 | muggle-string@0.4.1: 792 | resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 793 | 794 | nanoid@3.3.11: 795 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 796 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 797 | hasBin: true 798 | 799 | normalize-path@3.0.0: 800 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 801 | engines: {node: '>=0.10.0'} 802 | 803 | ohash@2.0.11: 804 | resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} 805 | 806 | package-manager-detector@0.2.11: 807 | resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} 808 | 809 | path-browserify@1.0.1: 810 | resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 811 | 812 | pathe@2.0.3: 813 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 814 | 815 | picocolors@1.1.1: 816 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 817 | 818 | picomatch@2.3.1: 819 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 820 | engines: {node: '>=8.6'} 821 | 822 | picomatch@4.0.2: 823 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 824 | engines: {node: '>=12'} 825 | 826 | pkg-types@1.3.1: 827 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 828 | 829 | pkg-types@2.1.0: 830 | resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} 831 | 832 | postcss@8.5.3: 833 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 834 | engines: {node: ^10 || ^12 || >=14} 835 | 836 | quansync@0.2.10: 837 | resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} 838 | 839 | readdirp@3.6.0: 840 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 841 | engines: {node: '>=8.10.0'} 842 | 843 | reka-ui@2.1.1: 844 | resolution: {integrity: sha512-awvpQ041LPXAvf2uRVFwedsyz9SwsuoWlRql1fg4XimUCxEI2GOfHo6FIdL44dSPb/eG/gWbdGhoGHLlbX5gPA==} 845 | peerDependencies: 846 | vue: '>= 3.2.0' 847 | 848 | rollup@4.37.0: 849 | resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} 850 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 851 | hasBin: true 852 | 853 | scule@1.3.0: 854 | resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} 855 | 856 | source-map-js@1.2.1: 857 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 858 | engines: {node: '>=0.10.0'} 859 | 860 | strip-literal@3.0.0: 861 | resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 862 | 863 | tailwind-merge@3.0.2: 864 | resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} 865 | 866 | tailwind-variants@1.0.0: 867 | resolution: {integrity: sha512-2WSbv4ulEEyuBKomOunut65D8UZwxrHoRfYnxGcQNnHqlSCp2+B7Yz2W+yrNDrxRodOXtGD/1oCcKGNBnUqMqA==} 868 | engines: {node: '>=16.x', pnpm: '>=7.x'} 869 | peerDependencies: 870 | tailwindcss: '*' 871 | 872 | tailwindcss@4.0.17: 873 | resolution: {integrity: sha512-OErSiGzRa6rLiOvaipsDZvLMSpsBZ4ysB4f0VKGXUrjw2jfkJRd6kjRKV2+ZmTCNvwtvgdDam5D7w6WXsdLJZw==} 874 | 875 | tapable@2.2.1: 876 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 877 | engines: {node: '>=6'} 878 | 879 | tinyexec@0.3.2: 880 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 881 | 882 | tinyglobby@0.2.12: 883 | resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} 884 | engines: {node: '>=12.0.0'} 885 | 886 | to-regex-range@5.0.1: 887 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 888 | engines: {node: '>=8.0'} 889 | 890 | tslib@2.8.1: 891 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 892 | 893 | typescript@5.7.3: 894 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 895 | engines: {node: '>=14.17'} 896 | hasBin: true 897 | 898 | ufo@1.5.4: 899 | resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} 900 | 901 | undici-types@6.20.0: 902 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 903 | 904 | unimport@4.1.3: 905 | resolution: {integrity: sha512-H+IVJ7rAkE3b+oC8rSJ2FsPaVsweeMC8eKZc+C6Mz7+hxDF45AnrY/tVCNRBvzMwWNcJEV67WdAVcal27iMjOw==} 906 | engines: {node: '>=18.12.0'} 907 | 908 | unplugin-auto-import@19.1.2: 909 | resolution: {integrity: sha512-EkxNIJm4ZPYtV7rRaPBKnsscgTaifIZNrJF5DkMffTxkUOJOlJuKVypA6YBSBOjzPJDTFPjfVmCQPoBuOO+YYQ==} 910 | engines: {node: '>=14'} 911 | peerDependencies: 912 | '@nuxt/kit': ^3.2.2 913 | '@vueuse/core': '*' 914 | peerDependenciesMeta: 915 | '@nuxt/kit': 916 | optional: true 917 | '@vueuse/core': 918 | optional: true 919 | 920 | unplugin-utils@0.2.4: 921 | resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} 922 | engines: {node: '>=18.12.0'} 923 | 924 | unplugin-vue-components@28.4.1: 925 | resolution: {integrity: sha512-niGSc0vJD9ueAnsqcfAldmtpkppZ09B6p2G1dL7X5S8KPdgbk1P+txPwaaDCe7N+eZh2VG1aAypLXkuJs3OSUg==} 926 | engines: {node: '>=14'} 927 | peerDependencies: 928 | '@babel/parser': ^7.15.8 929 | '@nuxt/kit': ^3.2.2 930 | vue: 2 || 3 931 | peerDependenciesMeta: 932 | '@babel/parser': 933 | optional: true 934 | '@nuxt/kit': 935 | optional: true 936 | 937 | unplugin@2.2.2: 938 | resolution: {integrity: sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==} 939 | engines: {node: '>=18.12.0'} 940 | 941 | vite@6.2.3: 942 | resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} 943 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 944 | hasBin: true 945 | peerDependencies: 946 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 947 | jiti: '>=1.21.0' 948 | less: '*' 949 | lightningcss: ^1.21.0 950 | sass: '*' 951 | sass-embedded: '*' 952 | stylus: '*' 953 | sugarss: '*' 954 | terser: ^5.16.0 955 | tsx: ^4.8.1 956 | yaml: ^2.4.2 957 | peerDependenciesMeta: 958 | '@types/node': 959 | optional: true 960 | jiti: 961 | optional: true 962 | less: 963 | optional: true 964 | lightningcss: 965 | optional: true 966 | sass: 967 | optional: true 968 | sass-embedded: 969 | optional: true 970 | stylus: 971 | optional: true 972 | sugarss: 973 | optional: true 974 | terser: 975 | optional: true 976 | tsx: 977 | optional: true 978 | yaml: 979 | optional: true 980 | 981 | vscode-uri@3.1.0: 982 | resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} 983 | 984 | vue-component-type-helpers@2.2.8: 985 | resolution: {integrity: sha512-4bjIsC284coDO9om4HPA62M7wfsTvcmZyzdfR0aUlFXqq4tXxM1APyXpNVxPC8QazKw9OhmZNHBVDA6ODaZsrA==} 986 | 987 | vue-demi@0.14.10: 988 | resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} 989 | engines: {node: '>=12'} 990 | hasBin: true 991 | peerDependencies: 992 | '@vue/composition-api': ^1.0.0-rc.1 993 | vue: ^3.0.0-0 || ^2.6.0 994 | peerDependenciesMeta: 995 | '@vue/composition-api': 996 | optional: true 997 | 998 | vue-tsc@2.2.8: 999 | resolution: {integrity: sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==} 1000 | hasBin: true 1001 | peerDependencies: 1002 | typescript: '>=5.0.0' 1003 | 1004 | vue@3.5.13: 1005 | resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} 1006 | peerDependencies: 1007 | typescript: '*' 1008 | peerDependenciesMeta: 1009 | typescript: 1010 | optional: true 1011 | 1012 | webpack-virtual-modules@0.6.2: 1013 | resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} 1014 | 1015 | snapshots: 1016 | 1017 | '@antfu/install-pkg@1.0.0': 1018 | dependencies: 1019 | package-manager-detector: 0.2.11 1020 | tinyexec: 0.3.2 1021 | 1022 | '@antfu/utils@8.1.1': {} 1023 | 1024 | '@babel/helper-string-parser@7.25.9': {} 1025 | 1026 | '@babel/helper-validator-identifier@7.25.9': {} 1027 | 1028 | '@babel/parser@7.27.0': 1029 | dependencies: 1030 | '@babel/types': 7.27.0 1031 | 1032 | '@babel/types@7.27.0': 1033 | dependencies: 1034 | '@babel/helper-string-parser': 7.25.9 1035 | '@babel/helper-validator-identifier': 7.25.9 1036 | 1037 | '@egoist/tailwindcss-icons@1.9.0(tailwindcss@4.0.17)': 1038 | dependencies: 1039 | '@iconify/utils': 2.3.0 1040 | tailwindcss: 4.0.17 1041 | transitivePeerDependencies: 1042 | - supports-color 1043 | 1044 | '@esbuild/aix-ppc64@0.25.1': 1045 | optional: true 1046 | 1047 | '@esbuild/android-arm64@0.25.1': 1048 | optional: true 1049 | 1050 | '@esbuild/android-arm@0.25.1': 1051 | optional: true 1052 | 1053 | '@esbuild/android-x64@0.25.1': 1054 | optional: true 1055 | 1056 | '@esbuild/darwin-arm64@0.25.1': 1057 | optional: true 1058 | 1059 | '@esbuild/darwin-x64@0.25.1': 1060 | optional: true 1061 | 1062 | '@esbuild/freebsd-arm64@0.25.1': 1063 | optional: true 1064 | 1065 | '@esbuild/freebsd-x64@0.25.1': 1066 | optional: true 1067 | 1068 | '@esbuild/linux-arm64@0.25.1': 1069 | optional: true 1070 | 1071 | '@esbuild/linux-arm@0.25.1': 1072 | optional: true 1073 | 1074 | '@esbuild/linux-ia32@0.25.1': 1075 | optional: true 1076 | 1077 | '@esbuild/linux-loong64@0.25.1': 1078 | optional: true 1079 | 1080 | '@esbuild/linux-mips64el@0.25.1': 1081 | optional: true 1082 | 1083 | '@esbuild/linux-ppc64@0.25.1': 1084 | optional: true 1085 | 1086 | '@esbuild/linux-riscv64@0.25.1': 1087 | optional: true 1088 | 1089 | '@esbuild/linux-s390x@0.25.1': 1090 | optional: true 1091 | 1092 | '@esbuild/linux-x64@0.25.1': 1093 | optional: true 1094 | 1095 | '@esbuild/netbsd-arm64@0.25.1': 1096 | optional: true 1097 | 1098 | '@esbuild/netbsd-x64@0.25.1': 1099 | optional: true 1100 | 1101 | '@esbuild/openbsd-arm64@0.25.1': 1102 | optional: true 1103 | 1104 | '@esbuild/openbsd-x64@0.25.1': 1105 | optional: true 1106 | 1107 | '@esbuild/sunos-x64@0.25.1': 1108 | optional: true 1109 | 1110 | '@esbuild/win32-arm64@0.25.1': 1111 | optional: true 1112 | 1113 | '@esbuild/win32-ia32@0.25.1': 1114 | optional: true 1115 | 1116 | '@esbuild/win32-x64@0.25.1': 1117 | optional: true 1118 | 1119 | '@floating-ui/core@1.6.9': 1120 | dependencies: 1121 | '@floating-ui/utils': 0.2.9 1122 | 1123 | '@floating-ui/dom@1.6.13': 1124 | dependencies: 1125 | '@floating-ui/core': 1.6.9 1126 | '@floating-ui/utils': 0.2.9 1127 | 1128 | '@floating-ui/utils@0.2.9': {} 1129 | 1130 | '@floating-ui/vue@1.1.6(vue@3.5.13(typescript@5.7.3))': 1131 | dependencies: 1132 | '@floating-ui/dom': 1.6.13 1133 | '@floating-ui/utils': 0.2.9 1134 | vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) 1135 | transitivePeerDependencies: 1136 | - '@vue/composition-api' 1137 | - vue 1138 | 1139 | '@iconify-json/lucide@1.2.33': 1140 | dependencies: 1141 | '@iconify/types': 2.0.0 1142 | 1143 | '@iconify/types@2.0.0': {} 1144 | 1145 | '@iconify/utils@2.3.0': 1146 | dependencies: 1147 | '@antfu/install-pkg': 1.0.0 1148 | '@antfu/utils': 8.1.1 1149 | '@iconify/types': 2.0.0 1150 | debug: 4.4.0 1151 | globals: 15.15.0 1152 | kolorist: 1.8.0 1153 | local-pkg: 1.1.1 1154 | mlly: 1.7.4 1155 | transitivePeerDependencies: 1156 | - supports-color 1157 | 1158 | '@internationalized/date@3.7.0': 1159 | dependencies: 1160 | '@swc/helpers': 0.5.15 1161 | 1162 | '@internationalized/number@3.6.0': 1163 | dependencies: 1164 | '@swc/helpers': 0.5.15 1165 | 1166 | '@jridgewell/sourcemap-codec@1.5.0': {} 1167 | 1168 | '@rollup/rollup-android-arm-eabi@4.37.0': 1169 | optional: true 1170 | 1171 | '@rollup/rollup-android-arm64@4.37.0': 1172 | optional: true 1173 | 1174 | '@rollup/rollup-darwin-arm64@4.37.0': 1175 | optional: true 1176 | 1177 | '@rollup/rollup-darwin-x64@4.37.0': 1178 | optional: true 1179 | 1180 | '@rollup/rollup-freebsd-arm64@4.37.0': 1181 | optional: true 1182 | 1183 | '@rollup/rollup-freebsd-x64@4.37.0': 1184 | optional: true 1185 | 1186 | '@rollup/rollup-linux-arm-gnueabihf@4.37.0': 1187 | optional: true 1188 | 1189 | '@rollup/rollup-linux-arm-musleabihf@4.37.0': 1190 | optional: true 1191 | 1192 | '@rollup/rollup-linux-arm64-gnu@4.37.0': 1193 | optional: true 1194 | 1195 | '@rollup/rollup-linux-arm64-musl@4.37.0': 1196 | optional: true 1197 | 1198 | '@rollup/rollup-linux-loongarch64-gnu@4.37.0': 1199 | optional: true 1200 | 1201 | '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': 1202 | optional: true 1203 | 1204 | '@rollup/rollup-linux-riscv64-gnu@4.37.0': 1205 | optional: true 1206 | 1207 | '@rollup/rollup-linux-riscv64-musl@4.37.0': 1208 | optional: true 1209 | 1210 | '@rollup/rollup-linux-s390x-gnu@4.37.0': 1211 | optional: true 1212 | 1213 | '@rollup/rollup-linux-x64-gnu@4.37.0': 1214 | optional: true 1215 | 1216 | '@rollup/rollup-linux-x64-musl@4.37.0': 1217 | optional: true 1218 | 1219 | '@rollup/rollup-win32-arm64-msvc@4.37.0': 1220 | optional: true 1221 | 1222 | '@rollup/rollup-win32-ia32-msvc@4.37.0': 1223 | optional: true 1224 | 1225 | '@rollup/rollup-win32-x64-msvc@4.37.0': 1226 | optional: true 1227 | 1228 | '@swc/helpers@0.5.15': 1229 | dependencies: 1230 | tslib: 2.8.1 1231 | 1232 | '@tailwindcss/node@4.0.17': 1233 | dependencies: 1234 | enhanced-resolve: 5.18.1 1235 | jiti: 2.4.2 1236 | tailwindcss: 4.0.17 1237 | 1238 | '@tailwindcss/oxide-android-arm64@4.0.17': 1239 | optional: true 1240 | 1241 | '@tailwindcss/oxide-darwin-arm64@4.0.17': 1242 | optional: true 1243 | 1244 | '@tailwindcss/oxide-darwin-x64@4.0.17': 1245 | optional: true 1246 | 1247 | '@tailwindcss/oxide-freebsd-x64@4.0.17': 1248 | optional: true 1249 | 1250 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.17': 1251 | optional: true 1252 | 1253 | '@tailwindcss/oxide-linux-arm64-gnu@4.0.17': 1254 | optional: true 1255 | 1256 | '@tailwindcss/oxide-linux-arm64-musl@4.0.17': 1257 | optional: true 1258 | 1259 | '@tailwindcss/oxide-linux-x64-gnu@4.0.17': 1260 | optional: true 1261 | 1262 | '@tailwindcss/oxide-linux-x64-musl@4.0.17': 1263 | optional: true 1264 | 1265 | '@tailwindcss/oxide-win32-arm64-msvc@4.0.17': 1266 | optional: true 1267 | 1268 | '@tailwindcss/oxide-win32-x64-msvc@4.0.17': 1269 | optional: true 1270 | 1271 | '@tailwindcss/oxide@4.0.17': 1272 | optionalDependencies: 1273 | '@tailwindcss/oxide-android-arm64': 4.0.17 1274 | '@tailwindcss/oxide-darwin-arm64': 4.0.17 1275 | '@tailwindcss/oxide-darwin-x64': 4.0.17 1276 | '@tailwindcss/oxide-freebsd-x64': 4.0.17 1277 | '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.17 1278 | '@tailwindcss/oxide-linux-arm64-gnu': 4.0.17 1279 | '@tailwindcss/oxide-linux-arm64-musl': 4.0.17 1280 | '@tailwindcss/oxide-linux-x64-gnu': 4.0.17 1281 | '@tailwindcss/oxide-linux-x64-musl': 4.0.17 1282 | '@tailwindcss/oxide-win32-arm64-msvc': 4.0.17 1283 | '@tailwindcss/oxide-win32-x64-msvc': 4.0.17 1284 | 1285 | '@tailwindcss/vite@4.0.17(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2))': 1286 | dependencies: 1287 | '@tailwindcss/node': 4.0.17 1288 | '@tailwindcss/oxide': 4.0.17 1289 | lightningcss: 1.29.2 1290 | tailwindcss: 4.0.17 1291 | vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2) 1292 | 1293 | '@tanstack/virtual-core@3.13.5': {} 1294 | 1295 | '@tanstack/vue-virtual@3.13.5(vue@3.5.13(typescript@5.7.3))': 1296 | dependencies: 1297 | '@tanstack/virtual-core': 3.13.5 1298 | vue: 3.5.13(typescript@5.7.3) 1299 | 1300 | '@types/estree@1.0.6': {} 1301 | 1302 | '@types/node@22.13.14': 1303 | dependencies: 1304 | undici-types: 6.20.0 1305 | 1306 | '@types/web-bluetooth@0.0.21': {} 1307 | 1308 | '@vitejs/plugin-vue@5.2.3(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2))(vue@3.5.13(typescript@5.7.3))': 1309 | dependencies: 1310 | vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2) 1311 | vue: 3.5.13(typescript@5.7.3) 1312 | 1313 | '@volar/language-core@2.4.12': 1314 | dependencies: 1315 | '@volar/source-map': 2.4.12 1316 | 1317 | '@volar/source-map@2.4.12': {} 1318 | 1319 | '@volar/typescript@2.4.12': 1320 | dependencies: 1321 | '@volar/language-core': 2.4.12 1322 | path-browserify: 1.0.1 1323 | vscode-uri: 3.1.0 1324 | 1325 | '@vue/compiler-core@3.5.13': 1326 | dependencies: 1327 | '@babel/parser': 7.27.0 1328 | '@vue/shared': 3.5.13 1329 | entities: 4.5.0 1330 | estree-walker: 2.0.2 1331 | source-map-js: 1.2.1 1332 | 1333 | '@vue/compiler-dom@3.5.13': 1334 | dependencies: 1335 | '@vue/compiler-core': 3.5.13 1336 | '@vue/shared': 3.5.13 1337 | 1338 | '@vue/compiler-sfc@3.5.13': 1339 | dependencies: 1340 | '@babel/parser': 7.27.0 1341 | '@vue/compiler-core': 3.5.13 1342 | '@vue/compiler-dom': 3.5.13 1343 | '@vue/compiler-ssr': 3.5.13 1344 | '@vue/shared': 3.5.13 1345 | estree-walker: 2.0.2 1346 | magic-string: 0.30.17 1347 | postcss: 8.5.3 1348 | source-map-js: 1.2.1 1349 | 1350 | '@vue/compiler-ssr@3.5.13': 1351 | dependencies: 1352 | '@vue/compiler-dom': 3.5.13 1353 | '@vue/shared': 3.5.13 1354 | 1355 | '@vue/compiler-vue2@2.7.16': 1356 | dependencies: 1357 | de-indent: 1.0.2 1358 | he: 1.2.0 1359 | 1360 | '@vue/language-core@2.2.8(typescript@5.7.3)': 1361 | dependencies: 1362 | '@volar/language-core': 2.4.12 1363 | '@vue/compiler-dom': 3.5.13 1364 | '@vue/compiler-vue2': 2.7.16 1365 | '@vue/shared': 3.5.13 1366 | alien-signals: 1.0.10 1367 | minimatch: 9.0.5 1368 | muggle-string: 0.4.1 1369 | path-browserify: 1.0.1 1370 | optionalDependencies: 1371 | typescript: 5.7.3 1372 | 1373 | '@vue/reactivity@3.5.13': 1374 | dependencies: 1375 | '@vue/shared': 3.5.13 1376 | 1377 | '@vue/runtime-core@3.5.13': 1378 | dependencies: 1379 | '@vue/reactivity': 3.5.13 1380 | '@vue/shared': 3.5.13 1381 | 1382 | '@vue/runtime-dom@3.5.13': 1383 | dependencies: 1384 | '@vue/reactivity': 3.5.13 1385 | '@vue/runtime-core': 3.5.13 1386 | '@vue/shared': 3.5.13 1387 | csstype: 3.1.3 1388 | 1389 | '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': 1390 | dependencies: 1391 | '@vue/compiler-ssr': 3.5.13 1392 | '@vue/shared': 3.5.13 1393 | vue: 3.5.13(typescript@5.7.3) 1394 | 1395 | '@vue/shared@3.5.13': {} 1396 | 1397 | '@vue/tsconfig@0.7.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))': 1398 | optionalDependencies: 1399 | typescript: 5.7.3 1400 | vue: 3.5.13(typescript@5.7.3) 1401 | 1402 | '@vueuse/core@12.8.2(typescript@5.7.3)': 1403 | dependencies: 1404 | '@types/web-bluetooth': 0.0.21 1405 | '@vueuse/metadata': 12.8.2 1406 | '@vueuse/shared': 12.8.2(typescript@5.7.3) 1407 | vue: 3.5.13(typescript@5.7.3) 1408 | transitivePeerDependencies: 1409 | - typescript 1410 | 1411 | '@vueuse/core@13.0.0(vue@3.5.13(typescript@5.7.3))': 1412 | dependencies: 1413 | '@types/web-bluetooth': 0.0.21 1414 | '@vueuse/metadata': 13.0.0 1415 | '@vueuse/shared': 13.0.0(vue@3.5.13(typescript@5.7.3)) 1416 | vue: 3.5.13(typescript@5.7.3) 1417 | 1418 | '@vueuse/metadata@12.8.2': {} 1419 | 1420 | '@vueuse/metadata@13.0.0': {} 1421 | 1422 | '@vueuse/shared@12.8.2(typescript@5.7.3)': 1423 | dependencies: 1424 | vue: 3.5.13(typescript@5.7.3) 1425 | transitivePeerDependencies: 1426 | - typescript 1427 | 1428 | '@vueuse/shared@13.0.0(vue@3.5.13(typescript@5.7.3))': 1429 | dependencies: 1430 | vue: 3.5.13(typescript@5.7.3) 1431 | 1432 | acorn@8.14.1: {} 1433 | 1434 | alien-signals@1.0.10: {} 1435 | 1436 | anymatch@3.1.3: 1437 | dependencies: 1438 | normalize-path: 3.0.0 1439 | picomatch: 2.3.1 1440 | 1441 | aria-hidden@1.2.4: 1442 | dependencies: 1443 | tslib: 2.8.1 1444 | 1445 | balanced-match@1.0.2: {} 1446 | 1447 | binary-extensions@2.3.0: {} 1448 | 1449 | brace-expansion@2.0.1: 1450 | dependencies: 1451 | balanced-match: 1.0.2 1452 | 1453 | braces@3.0.3: 1454 | dependencies: 1455 | fill-range: 7.1.1 1456 | 1457 | chokidar@3.6.0: 1458 | dependencies: 1459 | anymatch: 3.1.3 1460 | braces: 3.0.3 1461 | glob-parent: 5.1.2 1462 | is-binary-path: 2.1.0 1463 | is-glob: 4.0.3 1464 | normalize-path: 3.0.0 1465 | readdirp: 3.6.0 1466 | optionalDependencies: 1467 | fsevents: 2.3.3 1468 | 1469 | confbox@0.1.8: {} 1470 | 1471 | confbox@0.2.1: {} 1472 | 1473 | csstype@3.1.3: {} 1474 | 1475 | de-indent@1.0.2: {} 1476 | 1477 | debug@4.4.0: 1478 | dependencies: 1479 | ms: 2.1.3 1480 | 1481 | defu@6.1.4: {} 1482 | 1483 | detect-libc@2.0.3: {} 1484 | 1485 | enhanced-resolve@5.18.1: 1486 | dependencies: 1487 | graceful-fs: 4.2.11 1488 | tapable: 2.2.1 1489 | 1490 | entities@4.5.0: {} 1491 | 1492 | esbuild@0.25.1: 1493 | optionalDependencies: 1494 | '@esbuild/aix-ppc64': 0.25.1 1495 | '@esbuild/android-arm': 0.25.1 1496 | '@esbuild/android-arm64': 0.25.1 1497 | '@esbuild/android-x64': 0.25.1 1498 | '@esbuild/darwin-arm64': 0.25.1 1499 | '@esbuild/darwin-x64': 0.25.1 1500 | '@esbuild/freebsd-arm64': 0.25.1 1501 | '@esbuild/freebsd-x64': 0.25.1 1502 | '@esbuild/linux-arm': 0.25.1 1503 | '@esbuild/linux-arm64': 0.25.1 1504 | '@esbuild/linux-ia32': 0.25.1 1505 | '@esbuild/linux-loong64': 0.25.1 1506 | '@esbuild/linux-mips64el': 0.25.1 1507 | '@esbuild/linux-ppc64': 0.25.1 1508 | '@esbuild/linux-riscv64': 0.25.1 1509 | '@esbuild/linux-s390x': 0.25.1 1510 | '@esbuild/linux-x64': 0.25.1 1511 | '@esbuild/netbsd-arm64': 0.25.1 1512 | '@esbuild/netbsd-x64': 0.25.1 1513 | '@esbuild/openbsd-arm64': 0.25.1 1514 | '@esbuild/openbsd-x64': 0.25.1 1515 | '@esbuild/sunos-x64': 0.25.1 1516 | '@esbuild/win32-arm64': 0.25.1 1517 | '@esbuild/win32-ia32': 0.25.1 1518 | '@esbuild/win32-x64': 0.25.1 1519 | 1520 | escape-string-regexp@5.0.0: {} 1521 | 1522 | estree-walker@2.0.2: {} 1523 | 1524 | estree-walker@3.0.3: 1525 | dependencies: 1526 | '@types/estree': 1.0.6 1527 | 1528 | exsolve@1.0.4: {} 1529 | 1530 | fdir@6.4.3(picomatch@4.0.2): 1531 | optionalDependencies: 1532 | picomatch: 4.0.2 1533 | 1534 | fill-range@7.1.1: 1535 | dependencies: 1536 | to-regex-range: 5.0.1 1537 | 1538 | fsevents@2.3.3: 1539 | optional: true 1540 | 1541 | glob-parent@5.1.2: 1542 | dependencies: 1543 | is-glob: 4.0.3 1544 | 1545 | globals@15.15.0: {} 1546 | 1547 | graceful-fs@4.2.11: {} 1548 | 1549 | he@1.2.0: {} 1550 | 1551 | is-binary-path@2.1.0: 1552 | dependencies: 1553 | binary-extensions: 2.3.0 1554 | 1555 | is-extglob@2.1.1: {} 1556 | 1557 | is-glob@4.0.3: 1558 | dependencies: 1559 | is-extglob: 2.1.1 1560 | 1561 | is-number@7.0.0: {} 1562 | 1563 | jiti@2.4.2: {} 1564 | 1565 | js-tokens@9.0.1: {} 1566 | 1567 | kolorist@1.8.0: {} 1568 | 1569 | lightningcss-darwin-arm64@1.29.2: 1570 | optional: true 1571 | 1572 | lightningcss-darwin-x64@1.29.2: 1573 | optional: true 1574 | 1575 | lightningcss-freebsd-x64@1.29.2: 1576 | optional: true 1577 | 1578 | lightningcss-linux-arm-gnueabihf@1.29.2: 1579 | optional: true 1580 | 1581 | lightningcss-linux-arm64-gnu@1.29.2: 1582 | optional: true 1583 | 1584 | lightningcss-linux-arm64-musl@1.29.2: 1585 | optional: true 1586 | 1587 | lightningcss-linux-x64-gnu@1.29.2: 1588 | optional: true 1589 | 1590 | lightningcss-linux-x64-musl@1.29.2: 1591 | optional: true 1592 | 1593 | lightningcss-win32-arm64-msvc@1.29.2: 1594 | optional: true 1595 | 1596 | lightningcss-win32-x64-msvc@1.29.2: 1597 | optional: true 1598 | 1599 | lightningcss@1.29.2: 1600 | dependencies: 1601 | detect-libc: 2.0.3 1602 | optionalDependencies: 1603 | lightningcss-darwin-arm64: 1.29.2 1604 | lightningcss-darwin-x64: 1.29.2 1605 | lightningcss-freebsd-x64: 1.29.2 1606 | lightningcss-linux-arm-gnueabihf: 1.29.2 1607 | lightningcss-linux-arm64-gnu: 1.29.2 1608 | lightningcss-linux-arm64-musl: 1.29.2 1609 | lightningcss-linux-x64-gnu: 1.29.2 1610 | lightningcss-linux-x64-musl: 1.29.2 1611 | lightningcss-win32-arm64-msvc: 1.29.2 1612 | lightningcss-win32-x64-msvc: 1.29.2 1613 | 1614 | local-pkg@1.1.1: 1615 | dependencies: 1616 | mlly: 1.7.4 1617 | pkg-types: 2.1.0 1618 | quansync: 0.2.10 1619 | 1620 | magic-string@0.30.17: 1621 | dependencies: 1622 | '@jridgewell/sourcemap-codec': 1.5.0 1623 | 1624 | minimatch@9.0.5: 1625 | dependencies: 1626 | brace-expansion: 2.0.1 1627 | 1628 | mlly@1.7.4: 1629 | dependencies: 1630 | acorn: 8.14.1 1631 | pathe: 2.0.3 1632 | pkg-types: 1.3.1 1633 | ufo: 1.5.4 1634 | 1635 | ms@2.1.3: {} 1636 | 1637 | muggle-string@0.4.1: {} 1638 | 1639 | nanoid@3.3.11: {} 1640 | 1641 | normalize-path@3.0.0: {} 1642 | 1643 | ohash@2.0.11: {} 1644 | 1645 | package-manager-detector@0.2.11: 1646 | dependencies: 1647 | quansync: 0.2.10 1648 | 1649 | path-browserify@1.0.1: {} 1650 | 1651 | pathe@2.0.3: {} 1652 | 1653 | picocolors@1.1.1: {} 1654 | 1655 | picomatch@2.3.1: {} 1656 | 1657 | picomatch@4.0.2: {} 1658 | 1659 | pkg-types@1.3.1: 1660 | dependencies: 1661 | confbox: 0.1.8 1662 | mlly: 1.7.4 1663 | pathe: 2.0.3 1664 | 1665 | pkg-types@2.1.0: 1666 | dependencies: 1667 | confbox: 0.2.1 1668 | exsolve: 1.0.4 1669 | pathe: 2.0.3 1670 | 1671 | postcss@8.5.3: 1672 | dependencies: 1673 | nanoid: 3.3.11 1674 | picocolors: 1.1.1 1675 | source-map-js: 1.2.1 1676 | 1677 | quansync@0.2.10: {} 1678 | 1679 | readdirp@3.6.0: 1680 | dependencies: 1681 | picomatch: 2.3.1 1682 | 1683 | reka-ui@2.1.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)): 1684 | dependencies: 1685 | '@floating-ui/dom': 1.6.13 1686 | '@floating-ui/vue': 1.1.6(vue@3.5.13(typescript@5.7.3)) 1687 | '@internationalized/date': 3.7.0 1688 | '@internationalized/number': 3.6.0 1689 | '@tanstack/vue-virtual': 3.13.5(vue@3.5.13(typescript@5.7.3)) 1690 | '@vueuse/core': 12.8.2(typescript@5.7.3) 1691 | '@vueuse/shared': 12.8.2(typescript@5.7.3) 1692 | aria-hidden: 1.2.4 1693 | defu: 6.1.4 1694 | ohash: 2.0.11 1695 | vue: 3.5.13(typescript@5.7.3) 1696 | transitivePeerDependencies: 1697 | - '@vue/composition-api' 1698 | - typescript 1699 | 1700 | rollup@4.37.0: 1701 | dependencies: 1702 | '@types/estree': 1.0.6 1703 | optionalDependencies: 1704 | '@rollup/rollup-android-arm-eabi': 4.37.0 1705 | '@rollup/rollup-android-arm64': 4.37.0 1706 | '@rollup/rollup-darwin-arm64': 4.37.0 1707 | '@rollup/rollup-darwin-x64': 4.37.0 1708 | '@rollup/rollup-freebsd-arm64': 4.37.0 1709 | '@rollup/rollup-freebsd-x64': 4.37.0 1710 | '@rollup/rollup-linux-arm-gnueabihf': 4.37.0 1711 | '@rollup/rollup-linux-arm-musleabihf': 4.37.0 1712 | '@rollup/rollup-linux-arm64-gnu': 4.37.0 1713 | '@rollup/rollup-linux-arm64-musl': 4.37.0 1714 | '@rollup/rollup-linux-loongarch64-gnu': 4.37.0 1715 | '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0 1716 | '@rollup/rollup-linux-riscv64-gnu': 4.37.0 1717 | '@rollup/rollup-linux-riscv64-musl': 4.37.0 1718 | '@rollup/rollup-linux-s390x-gnu': 4.37.0 1719 | '@rollup/rollup-linux-x64-gnu': 4.37.0 1720 | '@rollup/rollup-linux-x64-musl': 4.37.0 1721 | '@rollup/rollup-win32-arm64-msvc': 4.37.0 1722 | '@rollup/rollup-win32-ia32-msvc': 4.37.0 1723 | '@rollup/rollup-win32-x64-msvc': 4.37.0 1724 | fsevents: 2.3.3 1725 | 1726 | scule@1.3.0: {} 1727 | 1728 | source-map-js@1.2.1: {} 1729 | 1730 | strip-literal@3.0.0: 1731 | dependencies: 1732 | js-tokens: 9.0.1 1733 | 1734 | tailwind-merge@3.0.2: {} 1735 | 1736 | tailwind-variants@1.0.0(tailwindcss@4.0.17): 1737 | dependencies: 1738 | tailwind-merge: 3.0.2 1739 | tailwindcss: 4.0.17 1740 | 1741 | tailwindcss@4.0.17: {} 1742 | 1743 | tapable@2.2.1: {} 1744 | 1745 | tinyexec@0.3.2: {} 1746 | 1747 | tinyglobby@0.2.12: 1748 | dependencies: 1749 | fdir: 6.4.3(picomatch@4.0.2) 1750 | picomatch: 4.0.2 1751 | 1752 | to-regex-range@5.0.1: 1753 | dependencies: 1754 | is-number: 7.0.0 1755 | 1756 | tslib@2.8.1: {} 1757 | 1758 | typescript@5.7.3: {} 1759 | 1760 | ufo@1.5.4: {} 1761 | 1762 | undici-types@6.20.0: {} 1763 | 1764 | unimport@4.1.3: 1765 | dependencies: 1766 | acorn: 8.14.1 1767 | escape-string-regexp: 5.0.0 1768 | estree-walker: 3.0.3 1769 | local-pkg: 1.1.1 1770 | magic-string: 0.30.17 1771 | mlly: 1.7.4 1772 | pathe: 2.0.3 1773 | picomatch: 4.0.2 1774 | pkg-types: 2.1.0 1775 | scule: 1.3.0 1776 | strip-literal: 3.0.0 1777 | tinyglobby: 0.2.12 1778 | unplugin: 2.2.2 1779 | unplugin-utils: 0.2.4 1780 | 1781 | unplugin-auto-import@19.1.2(@vueuse/core@13.0.0(vue@3.5.13(typescript@5.7.3))): 1782 | dependencies: 1783 | local-pkg: 1.1.1 1784 | magic-string: 0.30.17 1785 | picomatch: 4.0.2 1786 | unimport: 4.1.3 1787 | unplugin: 2.2.2 1788 | unplugin-utils: 0.2.4 1789 | optionalDependencies: 1790 | '@vueuse/core': 13.0.0(vue@3.5.13(typescript@5.7.3)) 1791 | 1792 | unplugin-utils@0.2.4: 1793 | dependencies: 1794 | pathe: 2.0.3 1795 | picomatch: 4.0.2 1796 | 1797 | unplugin-vue-components@28.4.1(@babel/parser@7.27.0)(vue@3.5.13(typescript@5.7.3)): 1798 | dependencies: 1799 | chokidar: 3.6.0 1800 | debug: 4.4.0 1801 | local-pkg: 1.1.1 1802 | magic-string: 0.30.17 1803 | mlly: 1.7.4 1804 | tinyglobby: 0.2.12 1805 | unplugin: 2.2.2 1806 | unplugin-utils: 0.2.4 1807 | vue: 3.5.13(typescript@5.7.3) 1808 | optionalDependencies: 1809 | '@babel/parser': 7.27.0 1810 | transitivePeerDependencies: 1811 | - supports-color 1812 | 1813 | unplugin@2.2.2: 1814 | dependencies: 1815 | acorn: 8.14.1 1816 | webpack-virtual-modules: 0.6.2 1817 | 1818 | vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2): 1819 | dependencies: 1820 | esbuild: 0.25.1 1821 | postcss: 8.5.3 1822 | rollup: 4.37.0 1823 | optionalDependencies: 1824 | '@types/node': 22.13.14 1825 | fsevents: 2.3.3 1826 | jiti: 2.4.2 1827 | lightningcss: 1.29.2 1828 | 1829 | vscode-uri@3.1.0: {} 1830 | 1831 | vue-component-type-helpers@2.2.8: {} 1832 | 1833 | vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)): 1834 | dependencies: 1835 | vue: 3.5.13(typescript@5.7.3) 1836 | 1837 | vue-tsc@2.2.8(typescript@5.7.3): 1838 | dependencies: 1839 | '@volar/typescript': 2.4.12 1840 | '@vue/language-core': 2.2.8(typescript@5.7.3) 1841 | typescript: 5.7.3 1842 | 1843 | vue@3.5.13(typescript@5.7.3): 1844 | dependencies: 1845 | '@vue/compiler-dom': 3.5.13 1846 | '@vue/compiler-sfc': 3.5.13 1847 | '@vue/runtime-dom': 3.5.13 1848 | '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) 1849 | '@vue/shared': 3.5.13 1850 | optionalDependencies: 1851 | typescript: 5.7.3 1852 | 1853 | webpack-virtual-modules@0.6.2: {} 1854 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 27 | -------------------------------------------------------------------------------- /src/components/FirstModal.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 40 | 41 | 56 | -------------------------------------------------------------------------------- /src/components/SecondModal.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 25 | 26 | 33 | -------------------------------------------------------------------------------- /src/keyframes.css: -------------------------------------------------------------------------------- 1 | @keyframes slide-in-from-bottom { 2 | from { 3 | transform: translateY(10%); 4 | opacity: 0; 5 | } 6 | 7 | to { 8 | transform: translateY(0); 9 | opacity: 1; 10 | } 11 | } 12 | 13 | @keyframes slide-out-to-bottom { 14 | from { 15 | transform: translateY(0); 16 | opacity: 1; 17 | } 18 | 19 | to { 20 | transform: translateY(10%); 21 | opacity: 0; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | @plugin '@egoist/tailwindcss-icons'; 3 | 4 | @import './keyframes.css'; 5 | 6 | :root { 7 | --ui-color-primary-50: var(--color-purple-50); 8 | --ui-color-primary-100: var(--color-purple-100); 9 | --ui-color-primary-200: var(--color-purple-200); 10 | --ui-color-primary-300: var(--color-purple-300); 11 | --ui-color-primary-400: var(--color-purple-400); 12 | --ui-color-primary-500: var(--color-purple-500); 13 | --ui-color-primary-600: var(--color-purple-600); 14 | --ui-color-primary-700: var(--color-purple-700); 15 | --ui-color-primary-800: var(--color-purple-800); 16 | --ui-color-primary-900: var(--color-purple-900); 17 | --ui-color-primary-950: var(--color-purple-950); 18 | 19 | --ui-color-secondary-50: var(--color-pink-50); 20 | --ui-color-secondary-100: var(--color-pink-100); 21 | --ui-color-secondary-200: var(--color-pink-200); 22 | --ui-color-secondary-300: var(--color-pink-300); 23 | --ui-color-secondary-400: var(--color-pink-400); 24 | --ui-color-secondary-500: var(--color-pink-500); 25 | --ui-color-secondary-600: var(--color-pink-600); 26 | --ui-color-secondary-700: var(--color-pink-700); 27 | --ui-color-secondary-800: var(--color-pink-800); 28 | --ui-color-secondary-900: var(--color-pink-900); 29 | --ui-color-secondary-950: var(--color-pink-950); 30 | 31 | --ui-primary: var(--ui-color-primary-500); 32 | --ui-secondary: var(--ui-color-secondary-500); 33 | --ui-success: var(--color-green-500); 34 | --ui-info: var(--color-blue-500); 35 | --ui-warning: var(--color-yellow-500); 36 | --ui-error: var(--color-red-500); 37 | 38 | --ui-text-dimmed: var(--color-slate-400); 39 | --ui-text-muted: var(--color-slate-500); 40 | --ui-text-toned: var(--color-slate-600); 41 | --ui-text: var(--color-slate-700); 42 | --ui-text-highlighted: var(--color-slate-900); 43 | 44 | --ui-bg: var(--color-white); 45 | --ui-bg-muted: var(--color-slate-50); 46 | --ui-bg-elevated: var(--color-slate-100); 47 | --ui-bg-accented: var(--color-slate-200); 48 | --ui-bg-inverted: var(--color-slate-900); 49 | 50 | --ui-border: var(--color-slate-200); 51 | --ui-border-muted: var(--color-slate-200); 52 | --ui-border-accented: var(--color-slate-300); 53 | --ui-border-inverted: var(--color-slate-900); 54 | 55 | --ui-radius: var(--radius-none); 56 | --ui-container: var(--container-7xl); 57 | } 58 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import './main.css' 3 | import App from './App.vue' 4 | 5 | createApp(App).mount('#app') 6 | -------------------------------------------------------------------------------- /src/ui/components/Avatar.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 47 | 48 | 66 | -------------------------------------------------------------------------------- /src/ui/components/AvatarGroup.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 81 | 82 | 88 | -------------------------------------------------------------------------------- /src/ui/components/Button.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 65 | 66 | 94 | -------------------------------------------------------------------------------- /src/ui/components/ButtonGroup.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 36 | 37 | 42 | -------------------------------------------------------------------------------- /src/ui/components/Icon.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 30 | 31 | 34 | -------------------------------------------------------------------------------- /src/ui/components/Link.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 56 | 57 | 80 | -------------------------------------------------------------------------------- /src/ui/components/Modal.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 82 | 83 | 84 | 154 | -------------------------------------------------------------------------------- /src/ui/components/OverlayProvider.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 23 | 24 | 39 | -------------------------------------------------------------------------------- /src/ui/composables/useAvatarGroup.ts: -------------------------------------------------------------------------------- 1 | import type { AvatarGroupProps } from '@/ui/components/AvatarGroup.vue' 2 | import { avatarGroupInjectionKey } from '@/ui/keys/avatar-group' 3 | import { computed, inject } from 'vue' 4 | 5 | export function useAvatarGroup(props: { size: AvatarGroupProps['size'] }) { 6 | const avatarGroup = inject(avatarGroupInjectionKey, undefined) 7 | const size = computed(() => props.size ?? avatarGroup?.value.size) 8 | 9 | return { 10 | size, 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/ui/composables/useButtonGroup.ts: -------------------------------------------------------------------------------- 1 | import type { GetObjectField } from '@/ui/types/utils' 2 | import { buttonGroupInjectionKey } from '@/ui/keys/button-group' 3 | import { computed, inject } from 'vue' 4 | 5 | interface Props { 6 | size?: GetObjectField 7 | } 8 | 9 | export function useButtonGroup(props: Props) { 10 | const buttonGroup = inject(buttonGroupInjectionKey, undefined) 11 | return { 12 | orientation: computed(() => buttonGroup?.value.orientation), 13 | size: computed(() => props?.size ?? buttonGroup?.value.size), 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/ui/composables/useComponentIcons.ts: -------------------------------------------------------------------------------- 1 | import type { AvatarProps } from '@/ui/components/Avatar.vue' 2 | import type { MaybeRefOrGetter } from 'vue' 3 | import { computed, toValue } from 'vue' 4 | 5 | export interface UseComponentIconsProps { 6 | icon?: string 7 | avatar?: AvatarProps 8 | leading?: boolean 9 | leadingIcon?: string 10 | trailing?: boolean 11 | trailingIcon?: string 12 | loading?: boolean 13 | } 14 | 15 | export function useComponentIcons(componentProps: MaybeRefOrGetter) { 16 | const props = computed(() => toValue(componentProps)) 17 | 18 | const isLeading = computed(() => (props.value.icon && props.value.leading) || (props.value.icon && !props.value.trailing) || (props.value.loading && !props.value.trailing) || !!props.value.leadingIcon) 19 | const isTrailing = computed(() => (props.value.icon && props.value.trailing) || (props.value.loading && props.value.trailing) || !!props.value.trailingIcon) 20 | 21 | const leadingIconName = computed(() => { 22 | if (props.value.loading) { 23 | return '' 24 | } 25 | 26 | return props.value.leadingIcon || props.value.icon 27 | }) 28 | const trailingIconName = computed(() => { 29 | if (props.value.loading && !isLeading.value) { 30 | return '' 31 | } 32 | 33 | return props.value.trailingIcon || props.value.icon 34 | }) 35 | 36 | return { 37 | isLeading, 38 | isTrailing, 39 | leadingIconName, 40 | trailingIconName, 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/ui/composables/useOverlay.ts: -------------------------------------------------------------------------------- 1 | import type { Component } from 'vue' 2 | import type { ComponentProps } from 'vue-component-type-helpers' 3 | import { createSharedComposable } from '@vueuse/core' 4 | import { markRaw, reactive, shallowReactive } from 'vue' 5 | 6 | export interface OverlayOptions> { 7 | defaultOpen?: boolean 8 | props?: OverlayAttrs 9 | destroyOnClose?: boolean 10 | } 11 | 12 | interface ManagedOverlayOptionsPrivate { 13 | component?: T 14 | id: symbol 15 | isMounted: boolean 16 | modelValue: boolean 17 | resolvePromise?: (value: unknown) => void 18 | } 19 | export type Overlay = OverlayOptions & ManagedOverlayOptionsPrivate 20 | 21 | interface OverlayInstance { 22 | open: (props?: ComponentProps) => Promise 23 | close: (value?: any) => void 24 | patch: (props: Partial>) => void 25 | } 26 | 27 | function _useOverlay() { 28 | const overlays = shallowReactive([]) 29 | 30 | const getOverlay = (id: symbol): Overlay => { 31 | const overlay = overlays.find(overlay => overlay.id === id) 32 | 33 | if (!overlay) { 34 | throw new Error('Overlay not found') 35 | } 36 | 37 | return overlay 38 | } 39 | 40 | const patch = (id: symbol, props: Partial>): void => { 41 | const overlay = getOverlay(id) 42 | 43 | Object.entries(props!).forEach(([key, value]) => { 44 | (overlay.props as any)[key] = value 45 | }) 46 | } 47 | 48 | const open = (id: symbol, props?: ComponentProps): Promise => { 49 | const overlay = getOverlay(id) 50 | 51 | // If props are provided, update the overlay's props 52 | if (props) { 53 | patch(overlay.id, props) 54 | } 55 | 56 | overlay.modelValue = true 57 | overlay.isMounted = true 58 | 59 | // Return a new promise that will be resolved when close is called 60 | return new Promise((resolve) => { 61 | overlay.resolvePromise = resolve 62 | }) 63 | } 64 | 65 | const close = (id: symbol, value?: any): void => { 66 | const overlay = getOverlay(id) 67 | 68 | overlay.modelValue = false 69 | 70 | // Resolve the promise if it exists 71 | if (overlay.resolvePromise) { 72 | overlay.resolvePromise(value) 73 | overlay.resolvePromise = undefined 74 | } 75 | } 76 | 77 | const unMount = (id: symbol): void => { 78 | const overlay = getOverlay(id) 79 | 80 | overlay.isMounted = false 81 | 82 | if (overlay.destroyOnClose) { 83 | const index = overlays.findIndex(overlay => overlay.id === id) 84 | overlays.splice(index, 1) 85 | } 86 | } 87 | 88 | const create = (component: T, _options?: OverlayOptions>): OverlayInstance => { 89 | const { props, defaultOpen, destroyOnClose } = _options || {} 90 | 91 | const options = reactive({ 92 | id: Symbol(''), 93 | modelValue: !!defaultOpen, 94 | component: markRaw(component!), 95 | isMounted: !!defaultOpen, 96 | destroyOnClose: !!destroyOnClose, 97 | props: props || {}, 98 | }) 99 | 100 | overlays.push(options) 101 | 102 | return { 103 | open: (props?: ComponentProps) => open(options.id, props), 104 | close: value => close(options.id, value), 105 | patch: (props: Partial>) => patch(options.id, props), 106 | } 107 | } 108 | 109 | return { 110 | overlays, 111 | open, 112 | close, 113 | patch, 114 | unMount, 115 | 116 | create, 117 | } 118 | } 119 | 120 | export const useOverlay = createSharedComposable(_useOverlay) 121 | -------------------------------------------------------------------------------- /src/ui/icons/index.ts: -------------------------------------------------------------------------------- 1 | export const arrowLeft = 'i-lucide-arrow-left' 2 | 3 | export const arrowRight = 'i-lucide-arrow-right' 4 | 5 | export const check = 'i-lucide-check' 6 | 7 | export const chevronDoubleLeft = 'i-lucide-chevrons-left' 8 | 9 | export const chevronDoubleRight = 'i-lucide-chevrons-right' 10 | 11 | export const chevronDown = 'i-lucide-chevron-down' 12 | 13 | export const chevronLeft = 'i-lucide-chevron-left' 14 | 15 | export const chevronRight = 'i-lucide-chevron-right' 16 | 17 | export const chevronUp = 'i-lucide-chevron-up' 18 | 19 | export const close = 'i-lucide-x' 20 | 21 | export const ellipsis = 'i-lucide-ellipsis' 22 | 23 | export const external = 'i-lucide-arrow-up-right' 24 | 25 | export const loading = 'i-lucide-loader' 26 | 27 | export const minus = 'i-lucide-minus' 28 | 29 | export const plus = 'i-lucide-plus' 30 | 31 | export const search = 'i-lucide-search' 32 | 33 | export const remove = close 34 | 35 | export const separator = chevronRight 36 | -------------------------------------------------------------------------------- /src/ui/keys/avatar-group.ts: -------------------------------------------------------------------------------- 1 | import type { AvatarGroupProps } from '@/ui/components/AvatarGroup.vue' 2 | import type { ComputedRef, InjectionKey } from 'vue' 3 | 4 | export const avatarGroupInjectionKey: InjectionKey> = Symbol('vue-ui.avatar-group') 5 | -------------------------------------------------------------------------------- /src/ui/keys/button-group.ts: -------------------------------------------------------------------------------- 1 | import type { ButtonGroupProps } from '@/ui/components/ButtonGroup.vue' 2 | import type { ComputedRef, InjectionKey } from 'vue' 3 | 4 | export const buttonGroupInjectionKey: InjectionKey> = Symbol('vue-ui.button-group') 8 | -------------------------------------------------------------------------------- /src/ui/theme/avatar-group.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | slots: { 3 | root: 'inline-flex flex-row-reverse justify-end', 4 | base: 'relative rounded-full ring-(--ui-bg) first:me-0', 5 | }, 6 | variants: { 7 | size: { 8 | '3xs': { 9 | base: 'ring -me-0.5', 10 | }, 11 | '2xs': { 12 | base: 'ring -me-0.5', 13 | }, 14 | 'xs': { 15 | base: 'ring -me-0.5', 16 | }, 17 | 'sm': { 18 | base: 'ring-2 -me-1.5', 19 | }, 20 | 'md': { 21 | base: 'ring-2 -me-1.5', 22 | }, 23 | 'lg': { 24 | base: 'ring-2 -me-1.5', 25 | }, 26 | 'xl': { 27 | base: 'ring-3 -me-2', 28 | }, 29 | '2xl': { 30 | base: 'ring-3 -me-2', 31 | }, 32 | '3xl': { 33 | base: 'ring-3 -me-2', 34 | }, 35 | }, 36 | }, 37 | defaultVariants: { 38 | size: 'md', 39 | } as const, 40 | } 41 | -------------------------------------------------------------------------------- /src/ui/theme/avatar.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | slots: { 3 | root: 'inline-flex items-center justify-center shrink-0 select-none overflow-hidden rounded-full align-middle bg-(--ui-bg-elevated)', 4 | image: 'h-full w-full rounded-[inherit] object-cover', 5 | fallback: 'font-medium leading-none text-(--ui-text-muted) truncate', 6 | icon: 'text-(--ui-text-muted) shrink-0', 7 | }, 8 | variants: { 9 | size: { 10 | '3xs': { 11 | root: 'size-4 text-[8px]', 12 | }, 13 | '2xs': { 14 | root: 'size-5 text-[10px]', 15 | }, 16 | 'xs': { 17 | root: 'size-6 text-xs', 18 | }, 19 | 'sm': { 20 | root: 'size-7 text-sm', 21 | }, 22 | 'md': { 23 | root: 'size-8 text-base', 24 | }, 25 | 'lg': { 26 | root: 'size-9 text-lg', 27 | }, 28 | 'xl': { 29 | root: 'size-10 text-xl', 30 | }, 31 | '2xl': { 32 | root: 'size-11 text-[22px]', 33 | }, 34 | '3xl': { 35 | root: 'size-12 text-2xl', 36 | }, 37 | }, 38 | }, 39 | defaultVariants: { 40 | size: 'md', 41 | } as const, 42 | } 43 | -------------------------------------------------------------------------------- /src/ui/theme/button-group.ts: -------------------------------------------------------------------------------- 1 | export const buttonGroupVariant = { 2 | buttonGroup: { 3 | horizontal: 'not-only:first:rounded-e-none not-only:last:rounded-s-none not-last:not-first:rounded-none', 4 | vertical: 'not-only:first:rounded-b-none not-only:last:rounded-t-none not-last:not-first:rounded-none', 5 | }, 6 | } 7 | 8 | export const buttonGroupVariantWithRoot = { 9 | buttonGroup: { 10 | horizontal: { 11 | root: 'group', 12 | base: 'group-not-only:group-first:rounded-e-none group-not-only:group-last:rounded-s-none group-not-last:group-not-first:rounded-none', 13 | }, 14 | vertical: { 15 | root: 'group', 16 | base: 'group-not-only:group-first:rounded-b-none group-not-only:group-last:rounded-t-none group-not-last:group-not-first:rounded-none', 17 | }, 18 | }, 19 | } 20 | 21 | export default { 22 | base: 'relative', 23 | variants: { 24 | size: { 25 | xs: '', 26 | sm: '', 27 | md: '', 28 | lg: '', 29 | xl: '', 30 | }, 31 | orientation: { 32 | horizontal: 'inline-flex -space-x-px', 33 | vertical: 'flex flex-col -space-y-px', 34 | }, 35 | }, 36 | } 37 | -------------------------------------------------------------------------------- /src/ui/theme/button.ts: -------------------------------------------------------------------------------- 1 | import { buttonGroupVariant } from '@/ui/theme/button-group' 2 | 3 | export default { 4 | slots: { 5 | base: 'relative rounded-[calc(var(--ui-radius)*1.5)] font-medium inline-flex items-center focus:outline-hidden disabled:cursor-not-allowed aria-disabled:cursor-not-allowed disabled:opacity-75 aria-disabled:opacity-75 transition-colors', 6 | label: 'truncate', 7 | leadingIcon: 'shrink-0', 8 | leadingAvatar: 'shrink-0', 9 | leadingAvatarSize: '', 10 | trailingIcon: 'shrink-0', 11 | loadingIcon: 'absolute inset-0 left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2', 12 | }, 13 | variants: { 14 | ...buttonGroupVariant, 15 | color: { 16 | primary: '', 17 | secondary: '', 18 | success: '', 19 | info: '', 20 | warning: '', 21 | error: '', 22 | neutral: '', 23 | }, 24 | variant: { 25 | solid: '', 26 | outline: '', 27 | soft: '', 28 | subtle: '', 29 | ghost: '', 30 | link: '', 31 | }, 32 | size: { 33 | xs: { 34 | base: 'px-2 py-1 text-xs gap-1', 35 | leadingIcon: 'size-4', 36 | leadingAvatarSize: '3xs', 37 | trailingIcon: 'size-4', 38 | loadingIcon: 'size-4', 39 | }, 40 | sm: { 41 | base: 'px-2.5 py-1.5 text-xs gap-1.5', 42 | leadingIcon: 'size-4', 43 | leadingAvatarSize: '3xs', 44 | trailingIcon: 'size-4', 45 | ladingIcon: 'size-4', 46 | }, 47 | md: { 48 | base: 'px-2.5 py-1.5 text-sm gap-1.5', 49 | leadingIcon: 'size-5', 50 | leadingAvatarSize: '2xs', 51 | trailingIcon: 'size-5', 52 | loadingIcon: 'size-5', 53 | }, 54 | lg: { 55 | base: 'px-3 py-2 text-sm gap-2', 56 | leadingIcon: 'size-5', 57 | leadingAvatarSize: '2xs', 58 | trailingIcon: 'size-5', 59 | loadingIcon: 'size-5', 60 | }, 61 | xl: { 62 | base: 'px-3 py-2 text-base gap-2', 63 | leadingIcon: 'size-6', 64 | leadingAvatarSize: 'xs', 65 | trailingIcon: 'size-6', 66 | loadingIcon: 'size-6', 67 | }, 68 | }, 69 | block: { 70 | true: { 71 | base: 'w-full justify-center', 72 | leadingAvatarSize: 'xs', 73 | trailingIcon: 'ms-auto', 74 | }, 75 | }, 76 | square: { 77 | true: '', 78 | }, 79 | leading: { 80 | true: '', 81 | }, 82 | trailing: { 83 | true: '', 84 | }, 85 | loading: { 86 | true: { 87 | leadingIcon: 'opacity-0', 88 | label: 'opacity-0', 89 | trailingIcon: 'opacity-0', 90 | loadingIcon: 'animate-spin', 91 | }, 92 | }, 93 | }, 94 | compoundVariants: [ 95 | { 96 | color: 'primary', 97 | variant: 'solid', 98 | class: `text-(--ui-bg) bg-(--ui-primary) hover:bg-(--ui-primary)/75 disabled:bg-(--ui-primary) aria-disabled:bg-(--ui-primary) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ui-primary)`, 99 | } as const, 100 | { 101 | color: 'primary', 102 | variant: 'outline', 103 | class: `ring ring-inset ring-(--ui-primary)/50 text-(--ui-primary) hover:bg-(--ui-primary)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-(--ui-primary)`, 104 | } as const, 105 | { 106 | color: 'primary', 107 | variant: 'soft', 108 | class: `text-(--ui-primary) bg-(--ui-primary)/10 hover:bg-(--ui-primary)/15 focus-visible:bg-(--ui-primary)/15 disabled:bg-(--ui-primary)/10 aria-disabled:bg-(--ui-primary)/10`, 109 | } as const, 110 | { 111 | color: 'primary', 112 | variant: 'subtle', 113 | class: `text-(--ui-primary) ring ring-inset ring-(--ui-primary)/25 bg-(--ui-primary)/10 hover:bg-(--ui-primary)/15 disabled:bg-(--ui-primary)/10 aria-disabled:bg-(--ui-primary)/10 focus-visible:ring-2 focus-visible:ring-(--ui-primary)`, 114 | } as const, 115 | { 116 | color: 'primary', 117 | variant: 'ghost', 118 | class: `text-(--ui-primary) hover:bg-(--ui-primary)/10 focus-visible:bg-(--ui-primary)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent`, 119 | } as const, 120 | { 121 | color: 'primary', 122 | variant: 'link', 123 | class: `text-(--ui-primary) hover:text-(--ui-primary)/75 disabled:text-(--ui-primary) aria-disabled:text-(--ui-primary) focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-(--ui-primary)`, 124 | } as const, 125 | { 126 | color: 'secondary', 127 | variant: 'solid', 128 | class: `text-(--ui-bg) bg-(--ui-secondary) hover:bg-(--ui-secondary)/75 disabled:bg-(--ui-secondary) aria-disabled:bg-(--ui-secondary) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ui-secondary)`, 129 | } as const, 130 | { 131 | color: 'secondary', 132 | variant: 'outline', 133 | class: `ring ring-inset ring-(--ui-secondary)/50 text-(--ui-secondary) hover:bg-(--ui-secondary)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-(--ui-secondary)`, 134 | } as const, 135 | { 136 | color: 'secondary', 137 | variant: 'soft', 138 | class: `text-(--ui-secondary) bg-(--ui-secondary)/10 hover:bg-(--ui-secondary)/15 focus-visible:bg-(--ui-secondary)/15 disabled:bg-(--ui-secondary)/10 aria-disabled:bg-(--ui-secondary)/10`, 139 | } as const, 140 | { 141 | color: 'secondary', 142 | variant: 'subtle', 143 | class: `text-(--ui-secondary) ring ring-inset ring-(--ui-secondary)/25 bg-(--ui-secondary)/10 hover:bg-(--ui-secondary)/15 disabled:bg-(--ui-secondary)/10 aria-disabled:bg-(--ui-secondary)/10 focus-visible:ring-2 focus-visible:ring-(--ui-secondary)`, 144 | } as const, 145 | { 146 | color: 'secondary', 147 | variant: 'ghost', 148 | class: `text-(--ui-secondary) hover:bg-(--ui-secondary)/10 focus-visible:bg-(--ui-secondary)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent`, 149 | } as const, 150 | { 151 | color: 'secondary', 152 | variant: 'link', 153 | class: `text-(--ui-secondary) hover:text-(--ui-secondary)/75 disabled:text-(--ui-secondary) aria-disabled:text-(--ui-secondary) focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-(--ui-secondary)`, 154 | } as const, 155 | { 156 | color: 'success', 157 | variant: 'solid', 158 | class: `text-(--ui-bg) bg-(--ui-success) hover:bg-(--ui-success)/75 disabled:bg-(--ui-success) aria-disabled:bg-(--ui-success) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ui-success)`, 159 | } as const, 160 | { 161 | color: 'success', 162 | variant: 'outline', 163 | class: `ring ring-inset ring-(--ui-success)/50 text-(--ui-success) hover:bg-(--ui-success)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-(--ui-success)`, 164 | } as const, 165 | { 166 | color: 'success', 167 | variant: 'soft', 168 | class: `text-(--ui-success) bg-(--ui-success)/10 hover:bg-(--ui-success)/15 focus-visible:bg-(--ui-success)/15 disabled:bg-(--ui-success)/10 aria-disabled:bg-(--ui-success)/10`, 169 | } as const, 170 | { 171 | color: 'success', 172 | variant: 'subtle', 173 | class: `text-(--ui-success) ring ring-inset ring-(--ui-success)/25 bg-(--ui-success)/10 hover:bg-(--ui-success)/15 disabled:bg-(--ui-success)/10 aria-disabled:bg-(--ui-success)/10 focus-visible:ring-2 focus-visible:ring-(--ui-success)`, 174 | } as const, 175 | { 176 | color: 'success', 177 | variant: 'ghost', 178 | class: `text-(--ui-success) hover:bg-(--ui-success)/10 focus-visible:bg-(--ui-success)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent`, 179 | } as const, 180 | { 181 | color: 'success', 182 | variant: 'link', 183 | class: `text-(--ui-success) hover:text-(--ui-success)/75 disabled:text-(--ui-success) aria-disabled:text-(--ui-success) focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-(--ui-success)`, 184 | } as const, 185 | { 186 | color: 'info', 187 | variant: 'solid', 188 | class: `text-(--ui-bg) bg-(--ui-info) hover:bg-(--ui-info)/75 disabled:bg-(--ui-info) aria-disabled:bg-(--ui-info) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ui-info)`, 189 | } as const, 190 | { 191 | color: 'info', 192 | variant: 'outline', 193 | class: `ring ring-inset ring-(--ui-info)/50 text-(--ui-info) hover:bg-(--ui-info)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-(--ui-info)`, 194 | } as const, 195 | { 196 | color: 'info', 197 | variant: 'soft', 198 | class: `text-(--ui-info) bg-(--ui-info)/10 hover:bg-(--ui-info)/15 focus-visible:bg-(--ui-info)/15 disabled:bg-(--ui-info)/10 aria-disabled:bg-(--ui-info)/10`, 199 | } as const, 200 | { 201 | color: 'info', 202 | variant: 'subtle', 203 | class: `text-(--ui-info) ring ring-inset ring-(--ui-info)/25 bg-(--ui-info)/10 hover:bg-(--ui-info)/15 disabled:bg-(--ui-info)/10 aria-disabled:bg-(--ui-info)/10 focus-visible:ring-2 focus-visible:ring-(--ui-info)`, 204 | } as const, 205 | { 206 | color: 'info', 207 | variant: 'ghost', 208 | class: `text-(--ui-info) hover:bg-(--ui-info)/10 focus-visible:bg-(--ui-info)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent`, 209 | } as const, 210 | { 211 | color: 'info', 212 | variant: 'link', 213 | class: `text-(--ui-info) hover:text-(--ui-info)/75 disabled:text-(--ui-info) aria-disabled:text-(--ui-info) focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-(--ui-info)`, 214 | } as const, 215 | { 216 | color: 'warning', 217 | variant: 'solid', 218 | class: `text-(--ui-bg) bg-(--ui-warning) hover:bg-(--ui-warning)/75 disabled:bg-(--ui-warning) aria-disabled:bg-(--ui-warning) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ui-warning)`, 219 | } as const, 220 | { 221 | color: 'warning', 222 | variant: 'outline', 223 | class: `ring ring-inset ring-(--ui-warning)/50 text-(--ui-warning) hover:bg-(--ui-warning)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-(--ui-warning)`, 224 | } as const, 225 | { 226 | color: 'warning', 227 | variant: 'soft', 228 | class: `text-(--ui-warning) bg-(--ui-warning)/10 hover:bg-(--ui-warning)/15 focus-visible:bg-(--ui-warning)/15 disabled:bg-(--ui-warning)/10 aria-disabled:bg-(--ui-warning)/10`, 229 | } as const, 230 | { 231 | color: 'warning', 232 | variant: 'subtle', 233 | class: `text-(--ui-warning) ring ring-inset ring-(--ui-warning)/25 bg-(--ui-warning)/10 hover:bg-(--ui-warning)/15 disabled:bg-(--ui-warning)/10 aria-disabled:bg-(--ui-warning)/10 focus-visible:ring-2 focus-visible:ring-(--ui-warning)`, 234 | } as const, 235 | { 236 | color: 'warning', 237 | variant: 'ghost', 238 | class: `text-(--ui-warning) hover:bg-(--ui-warning)/10 focus-visible:bg-(--ui-warning)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent`, 239 | } as const, 240 | { 241 | color: 'warning', 242 | variant: 'link', 243 | class: `text-(--ui-warning) hover:text-(--ui-warning)/75 disabled:text-(--ui-warning) aria-disabled:text-(--ui-warning) focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-(--ui-warning)`, 244 | } as const, 245 | { 246 | color: 'error', 247 | variant: 'solid', 248 | class: `text-(--ui-bg) bg-(--ui-error) hover:bg-(--ui-error)/75 disabled:bg-(--ui-error) aria-disabled:bg-(--ui-error) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ui-error)`, 249 | } as const, 250 | { 251 | color: 'error', 252 | variant: 'outline', 253 | class: `ring ring-inset ring-(--ui-error)/50 text-(--ui-error) hover:bg-(--ui-error)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-(--ui-error)`, 254 | } as const, 255 | { 256 | color: 'error', 257 | variant: 'soft', 258 | class: `text-(--ui-error) bg-(--ui-error)/10 hover:bg-(--ui-error)/15 focus-visible:bg-(--ui-error)/15 disabled:bg-(--ui-error)/10 aria-disabled:bg-(--ui-error)/10`, 259 | } as const, 260 | { 261 | color: 'error', 262 | variant: 'subtle', 263 | class: `text-(--ui-error) ring ring-inset ring-(--ui-error)/25 bg-(--ui-error)/10 hover:bg-(--ui-error)/15 disabled:bg-(--ui-error)/10 aria-disabled:bg-(--ui-error)/10 focus-visible:ring-2 focus-visible:ring-(--ui-error)`, 264 | } as const, 265 | { 266 | color: 'error', 267 | variant: 'ghost', 268 | class: `text-(--ui-error) hover:bg-(--ui-error)/10 focus-visible:bg-(--ui-error)/10 disabled:bg-transparent aria-disabled:bg-transparent dark:disabled:bg-transparent dark:aria-disabled:bg-transparent`, 269 | } as const, 270 | { 271 | color: 'error', 272 | variant: 'link', 273 | class: `text-(--ui-error) hover:text-(--ui-error)/75 disabled:text-(--ui-error) aria-disabled:text-(--ui-error) focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-(--ui-error)`, 274 | } as const, 275 | { 276 | color: 'neutral', 277 | variant: 'solid', 278 | class: 'text-(--ui-bg) bg-(--ui-bg-inverted) hover:bg-(--ui-bg-inverted)/90 disabled:bg-(--ui-bg-inverted) aria-disabled:bg-(--ui-bg-inverted) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ui-border-inverted)', 279 | } as const, 280 | { 281 | color: 'neutral', 282 | variant: 'outline', 283 | class: 'ring ring-inset ring-(--ui-border-accented) text-(--ui-text) bg-(--ui-bg) hover:bg-(--ui-bg-elevated) disabled:bg-(--ui-bg) aria-disabled:bg-(--ui-bg) focus-visible:ring-2 focus-visible:ring-(--ui-border-inverted)', 284 | } as const, 285 | { 286 | color: 'neutral', 287 | variant: 'soft', 288 | class: 'text-(--ui-text) bg-(--ui-bg-elevated) hover:bg-(--ui-bg-accented)/75 focus-visible:bg-(--ui-bg-accented)/75 disabled:bg-(--ui-bg-elevated) aria-disabled:bg-(--ui-bg-elevated)', 289 | } as const, 290 | { 291 | color: 'neutral', 292 | variant: 'subtle', 293 | class: 'ring ring-inset ring-(--ui-border-accented) text-(--ui-text) bg-(--ui-bg-elevated) hover:bg-(--ui-bg-accented)/75 disabled:bg-(--ui-bg-elevated) aria-disabled:bg-(--ui-bg-elevated) focus-visible:ring-2 focus-visible:ring-(--ui-border-inverted)', 294 | } as const, 295 | { 296 | color: 'neutral', 297 | variant: 'ghost', 298 | class: 'text-(--ui-text) hover:bg-(--ui-bg-elevated) focus-visible:bg-(--ui-bg-elevated) hover:disabled:bg-transparent dark:hover:disabled:bg-transparent hover:aria-disabled:bg-transparent dark:hover:aria-disabled:bg-transparent', 299 | } as const, 300 | { 301 | color: 'neutral', 302 | variant: 'link', 303 | class: 'text-(--ui-text-muted) hover:text-(--ui-text) disabled:text-(--ui-text-muted) aria-disabled:text-(--ui-text-muted) focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-(--ui-border-inverted)', 304 | } as const, 305 | { 306 | size: 'xs', 307 | square: true, 308 | class: 'p-1', 309 | } as const, 310 | { 311 | size: 'sm', 312 | square: true, 313 | class: 'p-1.5', 314 | } as const, 315 | { 316 | size: 'md', 317 | square: true, 318 | class: 'p-1.5', 319 | } as const, 320 | { 321 | size: 'lg', 322 | square: true, 323 | class: 'p-2', 324 | } as const, 325 | { 326 | size: 'xl', 327 | square: true, 328 | class: 'p-2', 329 | } as const, 330 | ], 331 | defaultVariants: { 332 | color: 'primary', 333 | variant: 'solid', 334 | size: 'md', 335 | } as const, 336 | } 337 | -------------------------------------------------------------------------------- /src/ui/theme/icon.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | base: 'inline-block', 3 | } 4 | -------------------------------------------------------------------------------- /src/ui/theme/link.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | base: 'focus-visible:outline-(--ui-primary)', 3 | variants: { 4 | active: { 5 | true: 'text-(--ui-primary)', 6 | false: 'text-(--ui-text-muted) hover:text-(--ui-text) transition-colors', 7 | }, 8 | disabled: { 9 | true: 'cursor-not-allowed opacity-75', 10 | }, 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /src/ui/theme/modal.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | slots: { 3 | overlay: 'fixed inset-0 bg-(--ui-bg-elevated)/25', 4 | content: 'fixed h-[400px] bg-(--ui-bg) divide-y divide-(--ui-border) flex flex-col focus:outline-none', 5 | header: 'flex items-center gap-1.5 p-4 sm:px-6 min-h-16', 6 | wrapper: '', 7 | body: 'flex-1 overflow-y-auto p-4 sm:p-6', 8 | footer: 'flex items-center gap-1.5 p-4 sm:px-6', 9 | title: 'text-(--ui-text-highlighted) font-semibold', 10 | description: 'mt-1 text-(--ui-text-muted) text-sm', 11 | close: 'absolute top-4 end-4', 12 | }, 13 | variants: { 14 | transition: { 15 | true: { 16 | overlay: 'data-[state=open]:animate-[fade-in_200ms_ease-out] data-[state=closed]:animate-[fade-out_200ms_ease-in]', 17 | content: 'data-[state=open]:animate-[slide-in-from-bottom_200ms_ease-out] data-[state=closed]:animate-[slide-out-to-bottom_200ms_ease-in]', 18 | }, 19 | }, 20 | fullscreen: { 21 | true: { 22 | content: 'inset-0', 23 | }, 24 | false: { 25 | content: 'top-1/2 sm:top-24 left-1/2 -translate-x-1/2 -translate-y-1/2 sm:translate-y-0 w-[calc(100vw-2rem)] max-w-lg max-h-[calc(100dvh-2rem)] sm:max-h-[calc(100dvh-4rem)] rounded-[calc(var(--ui-radius)*2)] shadow-lg ring ring-(--ui-border)', 26 | }, 27 | }, 28 | }, 29 | } 30 | -------------------------------------------------------------------------------- /src/ui/types/utils.ts: -------------------------------------------------------------------------------- 1 | import type { AcceptableValue as _AcceptableValue } from 'reka-ui' 2 | import type { VNode } from 'vue' 3 | 4 | export interface TightMap { 5 | [key: string]: TightMap | O 6 | } 7 | 8 | export type DeepPartial = { 9 | [P in keyof T]?: T[P] extends Array 10 | ? string 11 | : T[P] extends object 12 | ? DeepPartial 13 | : T[P]; 14 | } & { 15 | [key: string]: O | TightMap 16 | } 17 | 18 | export type DynamicSlots< 19 | T extends { slot?: string }, 20 | S extends string | undefined = undefined, 21 | D extends object = object, 22 | > = { 23 | [ 24 | K in T['slot'] as K extends string 25 | ? S extends string 26 | ? (K | `${K}-${S}`) 27 | : K 28 | : never 29 | ]?: (props: { item: Extract } & D) => any 30 | } 31 | 32 | export type GetObjectField = MaybeObject extends Record 33 | ? MaybeObject[Key] 34 | : never 35 | 36 | export type AcceptableValue = Exclude<_AcceptableValue, Record> 37 | export type ArrayOrNested = T[] | T[][] 38 | export type NestedItem = T extends Array ? NestedItem : T 39 | type AllKeys = T extends any ? keyof T : never 40 | type NonCommonKeys = Exclude, keyof T> 41 | type PickTypeOf = K extends AllKeys 42 | ? T extends { [k in K]?: any } 43 | ? T[K] 44 | : undefined 45 | : never 46 | export type MergeTypes = { 47 | [k in keyof T]: PickTypeOf; 48 | } & { 49 | [k in NonCommonKeys]?: PickTypeOf; 50 | } 51 | 52 | export type GetItemKeys = keyof Extract, object> 53 | 54 | export type GetItemValue | undefined, T extends NestedItem = NestedItem> = 55 | T extends object 56 | ? VK extends undefined 57 | ? T 58 | : VK extends keyof T 59 | ? T[VK] 60 | : never 61 | : T 62 | 63 | export type GetModelValue< 64 | T, 65 | VK extends GetItemKeys | undefined, 66 | M extends boolean, 67 | > = M extends true 68 | ? GetItemValue[] 69 | : GetItemValue 70 | 71 | export interface GetModelValueEmits< 72 | T, 73 | VK extends GetItemKeys | undefined, 74 | M extends boolean, 75 | > { 76 | /** Event handler called when the value changes. */ 77 | 'update:modelValue': [payload: GetModelValue] 78 | } 79 | 80 | export type StringOrVNode = 81 | | string 82 | | VNode 83 | | (() => VNode) 84 | 85 | export type EmitsToProps = { 86 | [K in keyof T as `on${Capitalize}`]: T[K] extends [...args: infer Args] 87 | ? (...args: Args) => void 88 | : never 89 | } 90 | -------------------------------------------------------------------------------- /src/ui/utils/omit.ts: -------------------------------------------------------------------------------- 1 | export function omit(data: Data, keys: Keys[]): Omit { 2 | const result = { ...data } 3 | 4 | for (const key of keys) { 5 | delete result[key] 6 | } 7 | 8 | return result as Omit 9 | } 10 | -------------------------------------------------------------------------------- /src/ui/utils/pick-link-props.ts: -------------------------------------------------------------------------------- 1 | import type { LinkProps } from '@/ui/components/Link.vue' 2 | import { reactivePick } from '@vueuse/shared' 3 | 4 | export function pickLinkProps(link: LinkProps & { ariaLabel?: string, title?: string }) { 5 | return reactivePick(link, 'active', 'ariaLabel', 'as', 'disabled', 'href', 'rel', 'target', 'type', 'title', 'onClick') 6 | } 7 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "compilerOptions": { 4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 5 | "baseUrl": ".", 6 | "paths": { 7 | "@/ui/*": [ 8 | "src/ui/*" 9 | ] 10 | }, 11 | "types": [], 12 | "strict": true, 13 | "noUnusedLocals": true, 14 | "noUnusedParameters": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "noUncheckedSideEffectImports": true 17 | }, 18 | "include": [ 19 | "src/**/*.ts", 20 | "src/**/*.vue", 21 | "auto-imports.d.ts", 22 | "components.d.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.app.json" 6 | }, 7 | { 8 | "path": "./tsconfig.node.json" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": [ 6 | "ES2023" 7 | ], 8 | "module": "ESNext", 9 | "skipLibCheck": true, 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "strict": true, 16 | "noUnusedLocals": true, 17 | "noUnusedParameters": true, 18 | "noFallthroughCasesInSwitch": true, 19 | "noUncheckedSideEffectImports": true 20 | }, 21 | "include": [ 22 | "vite.config.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { resolve } from 'node:path' 3 | import Vue from '@vitejs/plugin-vue' 4 | import Components from 'unplugin-vue-components/vite' 5 | import AutoImport from 'unplugin-auto-import/vite' 6 | import Tailwind from '@tailwindcss/vite' 7 | 8 | export default defineConfig({ 9 | plugins: [ 10 | Vue(), 11 | Tailwind(), 12 | 13 | Components({ 14 | dts: true, 15 | dirs: [ 16 | 'src/components', 17 | 'src/ui/components', 18 | ] 19 | }), 20 | AutoImport({ 21 | imports: [ 22 | 'vue', 23 | { 24 | from: 'tailwind-variants', 25 | imports: ['tv'], 26 | } 27 | ], 28 | dirs: [ 29 | 'src/composables', 30 | 'src/ui/composables', 31 | ], 32 | dts: true, 33 | }) 34 | ], 35 | 36 | resolve: { 37 | alias: { 38 | '@/ui': resolve(__dirname, 'src/ui'), 39 | }, 40 | }, 41 | }) 42 | --------------------------------------------------------------------------------