├── .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 |
19 |
20 |
Vue Dialog Stacking
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/components/FirstModal.vue:
--------------------------------------------------------------------------------
1 |
19 |
20 |
40 |
41 |
42 |
48 |
49 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/src/components/SecondModal.vue:
--------------------------------------------------------------------------------
1 |
17 |
18 |
25 |
26 |
27 |
32 |
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 |
49 |
50 |
58 |
59 |
60 |
61 | {{ fallback }}
62 |
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/src/ui/components/AvatarGroup.vue:
--------------------------------------------------------------------------------
1 |
26 |
27 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/src/ui/components/Button.vue:
--------------------------------------------------------------------------------
1 |
42 |
43 |
65 |
66 |
67 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | {{ label }}
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
--------------------------------------------------------------------------------
/src/ui/components/ButtonGroup.vue:
--------------------------------------------------------------------------------
1 |
24 |
25 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/src/ui/components/Icon.vue:
--------------------------------------------------------------------------------
1 |
18 |
19 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/ui/components/Link.vue:
--------------------------------------------------------------------------------
1 |
22 |
23 |
56 |
57 |
58 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/src/ui/components/Modal.vue:
--------------------------------------------------------------------------------
1 |
45 |
46 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 | {{ title }}
98 |
99 |
100 |
101 |
102 |
103 | {{ description }}
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | {{ title }}
115 |
116 |
117 |
118 |
119 |
120 | {{ description }}
121 |
122 |
123 |
124 |
125 |
126 |
127 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
--------------------------------------------------------------------------------
/src/ui/components/OverlayProvider.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
23 |
24 |
25 | onClose(overlay.id, value)"
36 | @after:leave="onAfterLeave(overlay.id)"
37 | />
38 |
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 |
--------------------------------------------------------------------------------