diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..66e7e94 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "trailingComma": "es5", + "tabWidth": 2, + "semi": false, + "singleQuote": true +} \ No newline at end of file diff --git a/.prettierrc.toml b/.prettierrc.toml deleted file mode 100644 index 2e6b813..0000000 --- a/.prettierrc.toml +++ /dev/null @@ -1,10 +0,0 @@ -# .prettierrc.toml - -useTabs = false -tabWidth = 2 -printWidth = 100 -endOfLine = "lf" - -# Not supported yet -# trailingComma = "es5" -# embeddedLanguageFormatting = "auto" diff --git a/app.config.ts b/app.config.ts new file mode 100644 index 0000000..448c915 --- /dev/null +++ b/app.config.ts @@ -0,0 +1,7 @@ +// ~/app.config.ts +export default defineAppConfig({ + icon: { + mode: "css", + cssLayer: "base", + }, +}); diff --git a/nuxt.config.ts b/nuxt.config.ts index 83f6d83..b69a948 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,3 +1,5 @@ +import tailwindcss from "@tailwindcss/vite"; + // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ compatibilityDate: "2024-11-01", @@ -5,22 +7,21 @@ export default defineNuxtConfig({ modules: [ "nuxt-zod-i18n", "@nuxtjs/i18n", - "@nuxtjs/tailwindcss", "@pinia/nuxt", "@vueuse/nuxt", "@nuxt/icon", "nuxt-snackbar", - "@nuxt/image", + "nuxt-svgo-loader", ], imports: { - dirs: ["composables/**", "stores/**", "components/**", "pages/**"], + dirs: ["composables/**", "stores/**", "components/**", "pages/**", "types/**"], }, i18n: { strategy: "prefix_and_default", defaultLocale: "de", - vueI18n: "../src/i18n/i18n.config.ts", + vueI18n: "~/i18n/i18n.config.ts", locales: [ { code: "de", language: "de-DE", isCatchallLocale: true }, @@ -54,13 +55,18 @@ export default defineNuxtConfig({ }, }, + css: ["~/assets/css/main.css"], + devtools: { enabled: true }, + srcDir: "./src", // Enable SSG ssr: false, // Enables the development server to be discoverable by other devices when running on iOS physical devices devServer: { host: process.env.TAURI_DEV_HOST || "localhost", port: 3003 }, + vite: { + plugins: [tailwindcss()], // Better support for Tauri CLI output clearScreen: false, // Enable environment variables @@ -71,11 +77,5 @@ export default defineNuxtConfig({ // Tauri requires a consistent port strictPort: true, }, - - /* plugins: [wasm(), topLevelAwait()], - worker: { - format: 'es', - plugins: () => [wasm(), topLevelAwait()], - }, */ }, -}); \ No newline at end of file +}); diff --git a/package.json b/package.json index e29e46c..c99ea99 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@nuxt/image": "1.10.0", "@nuxtjs/i18n": "^9.5.3", "@pinia/nuxt": "^0.10.1", + "@tailwindcss/vite": "^4.1.5", "@tauri-apps/api": "^2.5.0", "@tauri-apps/plugin-dialog": "^2.2.1", "@tauri-apps/plugin-fs": "^2.2.1", @@ -30,21 +31,23 @@ "@vueuse/core": "^13.1.0", "@vueuse/nuxt": "^13.1.0", "drizzle-orm": "^0.41.0", + "flyonui": "^2.1.0", "nuxt": "^3.17.0", "nuxt-snackbar": "1.3.0", + "nuxt-svgo-loader": "0.5.0", "nuxt-zod-i18n": "^1.11.5", + "tailwindcss": "^4.1.5", "vue": "^3.5.13", "zod": "^3.24.3" }, "devDependencies": { "@egoist/tailwindcss-icons": "^1.9.0", "@iconify/json": "^2.2.332", - "@iconify/tailwind": "^1.2.0", + "@iconify/tailwind4": "^1.0.6", "@nuxtjs/tailwindcss": "^6.14.0", "@tauri-apps/cli": "^2.5.0", "@vitejs/plugin-vue": "^5.2.3", "drizzle-kit": "^0.30.6", - "flyonui": "^1.3.1", "typescript": "~5.6.3", "vite": "^6.3.3", "vue-tsc": "^2.2.10" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e489cfb..fe2faf7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 0.15.4 '@nuxt/icon': specifier: 1.11.0 - version: 1.11.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) + version: 1.11.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) '@nuxt/image': specifier: 1.10.0 version: 1.10.0(@netlify/blobs@8.2.0)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(ioredis@5.6.1)(magicast@0.3.5) @@ -23,6 +23,9 @@ importers: '@pinia/nuxt': specifier: ^0.10.1 version: 0.10.1(magicast@0.3.5)(pinia@3.0.1(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3))) + '@tailwindcss/vite': + specifier: ^4.1.5 + version: 4.1.5(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) '@tauri-apps/api': specifier: ^2.5.0 version: 2.5.0 @@ -52,19 +55,28 @@ importers: version: 13.1.0(vue@3.5.13(typescript@5.6.3)) '@vueuse/nuxt': specifier: ^13.1.0 - version: 13.1.0(magicast@0.3.5)(nuxt@3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) + version: 13.1.0(magicast@0.3.5)(nuxt@3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) drizzle-orm: specifier: ^0.41.0 version: 0.41.0(@libsql/client@0.15.4)(gel@2.0.2) + flyonui: + specifier: ^2.1.0 + version: 2.1.0 nuxt: specifier: ^3.17.0 - version: 3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1) + version: 3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1) nuxt-snackbar: specifier: 1.3.0 version: 1.3.0(magicast@0.3.5)(vue@3.5.13(typescript@5.6.3)) + nuxt-svgo-loader: + specifier: 0.5.0 + version: 0.5.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) nuxt-zod-i18n: specifier: ^1.11.5 version: 1.11.5(magicast@0.3.5)(typescript@5.6.3) + tailwindcss: + specifier: ^4.1.5 + version: 4.1.5 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.6.3) @@ -74,13 +86,13 @@ importers: devDependencies: '@egoist/tailwindcss-icons': specifier: ^1.9.0 - version: 1.9.0(tailwindcss@3.4.17) + version: 1.9.0(tailwindcss@4.1.5) '@iconify/json': specifier: ^2.2.332 version: 2.2.332 - '@iconify/tailwind': - specifier: ^1.2.0 - version: 1.2.0 + '@iconify/tailwind4': + specifier: ^1.0.6 + version: 1.0.6(tailwindcss@4.1.5) '@nuxtjs/tailwindcss': specifier: ^6.14.0 version: 6.14.0(magicast@0.3.5) @@ -89,19 +101,16 @@ importers: version: 2.5.0 '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) drizzle-kit: specifier: ^0.30.6 version: 0.30.6 - flyonui: - specifier: ^1.3.1 - version: 1.3.1(postcss@8.5.3) typescript: specifier: ~5.6.3 version: 5.6.3 vite: specifier: ^6.3.3 - version: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) + version: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) vue-tsc: specifier: ^2.2.10 version: 2.2.10(typescript@5.6.3) @@ -898,6 +907,15 @@ packages: '@fastify/busboy@3.1.1': resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} + '@floating-ui/core@1.7.0': + resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} + + '@floating-ui/dom@1.7.0': + resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -924,8 +942,10 @@ packages: '@iconify/json@2.2.332': resolution: {integrity: sha512-bIaEG2ecvYiq/lwBF0KIOCEW5zMyBx1WOmBubetZwvKNs+gXbV3ocLCjT3xWBFSD4v29BRpqdtoVOpUlIfDK+g==} - '@iconify/tailwind@1.2.0': - resolution: {integrity: sha512-KgpIHWOTcRYw1XcoUqyNSrmYyfLLqZYu3AmP8zdfLk0F5TqRO8YerhlvlQmGfn7rJXgPeZN569xPAJnJ53zZxA==} + '@iconify/tailwind4@1.0.6': + resolution: {integrity: sha512-43ZXe+bC7CuE2LCgROdqbQeFYJi/J7L/k1UpSy8KDQlWVsWxPzLSWbWhlJx4uRYLOh1NRyw02YlDOgzBOFNd+A==} + peerDependencies: + tailwindcss: '>= 4' '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -1271,48 +1291,56 @@ packages: engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-gnu@0.67.0': resolution: {integrity: sha512-Bk+Fqe2J9OvIPs+FK/avTA1YL0tAQD3FgiHe0gq7HLaiuwjw8FAzi2KldyataNmIekfiSH6e+xrt2FugwDXFlw==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.61.2': resolution: {integrity: sha512-wLtzWy6EyMf7F83pcJhanolaQ7xnwnVAj2wjdJ52qgX4oQjqZZUo6Rk/LE2iY8Aq/R2Bx2yREFeIC4R1kjtB0A==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-arm64-musl@0.67.0': resolution: {integrity: sha512-zBMJOkxgcR7Fgmx6hFJQycgWCl9fhS/oW5n1Qix+cbKFe2HfgtOhI+pESEqHc642WX/93BJ1m4OMmZJl35VYgg==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-x64-gnu@0.61.2': resolution: {integrity: sha512-aJ+g/pDcOeqfB2bVZkUjHlCBL8H7lsgkuYVGKKLYxN/oLjrt2Jf/BVu6fL3NxmSSaFmtHKowDgoRAjiKwxQWEQ==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.67.0': resolution: {integrity: sha512-/zHUMrL24fGMTEr1iHE63f8NYa2IvxfIeNo24H1ofxhtr0A2KmcgOCcEUIypFjMxD5EY5kpQ2t0Nf42o+d4LOA==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.61.2': resolution: {integrity: sha512-PosnNyxTqCiMTgva5w695p3ooCcFU8tU+c+JnGgkBgD8pKTbV6fwn8dc4GlcgyyLaM1rD+zi/s+4ooTVML8iIA==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-x64-musl@0.67.0': resolution: {integrity: sha512-+JsqPXn2Op35lPEMbTyHonPHzTyvCpfaD522M5nziDt41DAOe3BMMcGgRfJXl6Dv/r8f4iZuHL3YSU8wF+elcQ==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@oxc-parser/binding-wasm32-wasi@0.61.2': resolution: {integrity: sha512-zOxdLDItMXeB1GdVCtOOW+aC+Ra6C4E1ivT4rbhaaVe70RsCRa2fGmNC0divvgfQsL2eGBkCuB4d4N9DjfhK4Q==} @@ -1389,36 +1417,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.5.1': resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} @@ -1463,9 +1497,6 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@poppinss/colors@4.1.4': resolution: {integrity: sha512-FA+nTU8p6OcSH4tLDY5JilGYr1bVWHpNmcLr7xmMEdbWmKHa+3QZ+DqefrXKmdjO/brHTnQZo20lLSjaO7ydog==} engines: {node: '>=18.16.0'} @@ -1592,56 +1623,67 @@ packages: resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.40.1': resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.40.1': resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.40.1': resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.40.1': resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.40.1': resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.40.1': resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.40.1': resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.40.1': resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.40.1': resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.40.1': resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} @@ -1669,6 +1711,100 @@ packages: '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + '@tailwindcss/node@4.1.5': + resolution: {integrity: sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==} + + '@tailwindcss/oxide-android-arm64@4.1.5': + resolution: {integrity: sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.5': + resolution: {integrity: sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.5': + resolution: {integrity: sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.5': + resolution: {integrity: sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.5': + resolution: {integrity: sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.5': + resolution: {integrity: sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.5': + resolution: {integrity: sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.5': + resolution: {integrity: sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.1.5': + resolution: {integrity: sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.1.5': + resolution: {integrity: sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.5': + resolution: {integrity: sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.5': + resolution: {integrity: sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.5': + resolution: {integrity: sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.5': + resolution: {integrity: sha512-FE1stRoqdHSb7RxesMfCXE8icwI1W6zGE/512ae3ZDrpkQYTTYeSyUJPRCjZd8CwVAhpDUbi1YR8pcZioFJQ/w==} + peerDependencies: + vite: ^5.2.0 || ^6 + '@tauri-apps/api@2.5.0': resolution: {integrity: sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==} @@ -1695,30 +1831,35 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-arm64-musl@2.5.0': resolution: {integrity: sha512-rQO1HhRUQqyEaal5dUVOQruTRda/TD36s9kv1hTxZiFuSq3558lsTjAcUEnMAtBcBkps20sbyTJNMT0AwYIk8Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tauri-apps/cli-linux-riscv64-gnu@2.5.0': resolution: {integrity: sha512-7oS18FN46yDxyw1zX/AxhLAd7T3GrLj3Ai6s8hZKd9qFVzrAn36ESL7d3G05s8wEtsJf26qjXnVF4qleS3dYsA==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-x64-gnu@2.5.0': resolution: {integrity: sha512-SG5sFNL7VMmDBdIg3nO3EzNRT306HsiEQ0N90ILe3ZABYAVoPDO/ttpCO37ApLInTzrq/DLN+gOlC/mgZvLw1w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-x64-musl@2.5.0': resolution: {integrity: sha512-QXDM8zp/6v05PNWju5ELsVwF0VH1n6b5pk2E6W/jFbbiwz80Vs1lACl9pv5kEHkrxBj+aWU/03JzGuIj2g3SkQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tauri-apps/cli-win32-arm64-msvc@2.5.0': resolution: {integrity: sha512-pFSHFK6b+o9y4Un8w0gGLwVyFTZaC3P0kQ7umRt/BLDkzD5RnQ4vBM7CF8BCU5nkwmEBUCZd7Wt3TWZxe41o6Q==} @@ -2448,9 +2589,6 @@ packages: css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - css-selector-tokenizer@0.8.0: - resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} - css-tree@2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -2496,10 +2634,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - culori@4.0.1: - resolution: {integrity: sha512-LSnjA6HuIUOlkfKVbzi2OlToZE8OjFi667JWN9qNymXVXzGDmvuP60SSgC+e92sd7B7158f7Fy3Mb6rXS5EDPw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -3015,9 +3149,6 @@ packages: fast-npm-meta@0.4.2: resolution: {integrity: sha512-BDN/yv8MN3fjh504wa7/niZojPtf/brWBsLKlw7Fv+Xh8Df+6ZEAFpp3zaal4etgDxxav1CuzKX5H0YVM9urEQ==} - fastparse@1.1.2: - resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} - fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -3077,9 +3208,8 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - flyonui@1.3.1: - resolution: {integrity: sha512-OxOOSRycLXpA89Us/OKsytbqkC7hOaOfAoBmZDz7WPHctfmMazVLNnyOzkDJ8sWy16LM43rdN1S+FDiCElmhnw==} - engines: {node: '>=16.9.0'} + flyonui@2.1.0: + resolution: {integrity: sha512-y1ERxtbyE8RqPK4jgg1zWmClrkhmUdzetWn5JSAgE37I1HrizIgI0eUHyXJ4wL1SyGO1qWCY8lr5UlIVjkQB7g==} fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} @@ -3625,6 +3755,74 @@ packages: resolution: {integrity: sha512-+OopMI1wM/NvAJTHf3O3+beHd1YfKLnSVsOGBl3/7UBDZ4ydVadkbBk5Hjjs9d3ALC5rBaftMY59AvwyC8MzPw==} os: [darwin, linux, win32] + lightningcss-darwin-arm64@1.29.2: + resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.2: + resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.2: + resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.2: + resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.29.2: + resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.29.2: + resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.29.2: + resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.29.2: + resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.2: + resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.2: + resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -3977,6 +4175,9 @@ packages: nuxt-snackbar@1.3.0: resolution: {integrity: sha512-wfUR0BdvRUj6C4qdDmBPHtkCxH3wwfPI5dOkCZM4g6lXB7mssHji56We99Pj1ue8wXWBMYgcrF7pg/jJ6GGVIQ==} + nuxt-svgo-loader@0.5.0: + resolution: {integrity: sha512-25mwcAzyzU2osmtU8piVxKqvhRiYoYq8ZVD72qCcYMynkty7fbJ+e8tUUdlQ6JOd53q7cKQi7sPaR0baG11R+g==} + nuxt-zod-i18n@1.11.5: resolution: {integrity: sha512-0XR7DLLR7JGSKxhxdOOFduLvjfPIeNfXpaWxQHBnwPg/zQjL2VuhlBuq1ltZioRw4f1Wfpy5+MwPyjK3PrmY0g==} @@ -4881,6 +5082,9 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tailwindcss@4.1.5: + resolution: {integrity: sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -5246,6 +5450,11 @@ packages: vite: ^6.0.0 vue: ^3.5.0 + vite-svg-loader@5.1.0: + resolution: {integrity: sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==} + peerDependencies: + vue: '>=3.2.13' + vite@6.3.3: resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -5679,10 +5888,10 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} - '@egoist/tailwindcss-icons@1.9.0(tailwindcss@3.4.17)': + '@egoist/tailwindcss-icons@1.9.0(tailwindcss@4.1.5)': dependencies: '@iconify/utils': 2.3.0 - tailwindcss: 3.4.17 + tailwindcss: 4.1.5 transitivePeerDependencies: - supports-color @@ -6044,6 +6253,17 @@ snapshots: '@fastify/busboy@3.1.1': {} + '@floating-ui/core@1.7.0': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.7.0': + dependencies: + '@floating-ui/core': 1.7.0 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -6066,9 +6286,13 @@ snapshots: '@iconify/types': 2.0.0 pathe: 1.1.2 - '@iconify/tailwind@1.2.0': + '@iconify/tailwind4@1.0.6(tailwindcss@4.1.5)': dependencies: '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + tailwindcss: 4.1.5 + transitivePeerDependencies: + - supports-color '@iconify/types@2.0.0': {} @@ -6456,12 +6680,12 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@2.4.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))': + '@nuxt/devtools-kit@2.4.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))': dependencies: '@nuxt/kit': 3.17.0(magicast@0.3.5) '@nuxt/schema': 3.17.0 execa: 8.0.1 - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) transitivePeerDependencies: - magicast @@ -6476,12 +6700,12 @@ snapshots: prompts: 2.4.2 semver: 7.7.1 - '@nuxt/devtools@2.4.0(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': + '@nuxt/devtools@2.4.0(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': dependencies: - '@nuxt/devtools-kit': 2.4.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)) + '@nuxt/devtools-kit': 2.4.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) '@nuxt/devtools-wizard': 2.4.0 '@nuxt/kit': 3.17.0(magicast@0.3.5) - '@vue/devtools-core': 7.7.5(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-core': 7.7.5(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) '@vue/devtools-kit': 7.7.5 birpc: 2.3.0 consola: 3.4.2 @@ -6506,9 +6730,9 @@ snapshots: sirv: 3.0.1 structured-clone-es: 1.0.0 tinyglobby: 0.2.13 - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) - vite-plugin-inspect: 11.0.1(@nuxt/kit@3.17.0(magicast@0.3.5))(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)) - vite-plugin-vue-tracer: 0.1.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) + vite-plugin-inspect: 11.0.1(@nuxt/kit@3.17.0(magicast@0.3.5))(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) + vite-plugin-vue-tracer: 0.1.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) which: 5.0.0 ws: 8.18.1 transitivePeerDependencies: @@ -6517,13 +6741,13 @@ snapshots: - utf-8-validate - vue - '@nuxt/icon@1.11.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': + '@nuxt/icon@1.11.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': dependencies: '@iconify/collections': 1.0.542 '@iconify/types': 2.0.0 '@iconify/utils': 2.3.0 '@iconify/vue': 4.3.0(vue@3.5.13(typescript@5.6.3)) - '@nuxt/devtools-kit': 2.4.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)) + '@nuxt/devtools-kit': 2.4.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) '@nuxt/kit': 3.17.0(magicast@0.3.5) consola: 3.4.2 local-pkg: 1.1.1 @@ -6626,12 +6850,12 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/vite-builder@3.17.0(@types/node@22.15.3)(eslint@9.23.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vue-tsc@2.2.10(typescript@5.6.3))(vue@3.5.13(typescript@5.6.3))(yaml@2.7.1)': + '@nuxt/vite-builder@3.17.0(@types/node@22.15.3)(eslint@9.23.0(jiti@2.4.2))(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vue-tsc@2.2.10(typescript@5.6.3))(vue@3.5.13(typescript@5.6.3))(yaml@2.7.1)': dependencies: '@nuxt/kit': 3.17.0(magicast@0.3.5) '@rollup/plugin-replace': 6.0.2(rollup@4.40.1) - '@vitejs/plugin-vue': 5.2.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) - '@vitejs/plugin-vue-jsx': 4.1.2(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) + '@vitejs/plugin-vue': 5.2.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) + '@vitejs/plugin-vue-jsx': 4.1.2(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) autoprefixer: 10.4.21(postcss@8.5.3) consola: 3.4.2 cssnano: 7.0.6(postcss@8.5.3) @@ -6657,9 +6881,9 @@ snapshots: ufo: 1.6.1 unenv: 2.0.0-rc.15 unplugin: 2.3.2 - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) - vite-node: 3.1.2(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) - vite-plugin-checker: 0.9.1(eslint@9.23.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3)) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) + vite-node: 3.1.2(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) + vite-plugin-checker: 0.9.1(eslint@9.23.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3)) vue: 3.5.13(typescript@5.6.3) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: @@ -6899,8 +7123,6 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@popperjs/core@2.11.8': {} - '@poppinss/colors@4.1.4': dependencies: kleur: 4.1.5 @@ -7050,6 +7272,71 @@ snapshots: '@speed-highlight/core@1.2.7': {} + '@tailwindcss/node@4.1.5': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.29.2 + tailwindcss: 4.1.5 + + '@tailwindcss/oxide-android-arm64@4.1.5': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.5': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.5': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.5': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.5': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.5': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.5': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.5': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.5': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.5': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.5': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.5': + optional: true + + '@tailwindcss/oxide@4.1.5': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.5 + '@tailwindcss/oxide-darwin-arm64': 4.1.5 + '@tailwindcss/oxide-darwin-x64': 4.1.5 + '@tailwindcss/oxide-freebsd-x64': 4.1.5 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.5 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.5 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.5 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.5 + '@tailwindcss/oxide-linux-x64-musl': 4.1.5 + '@tailwindcss/oxide-wasm32-wasi': 4.1.5 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.5 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.5 + + '@tailwindcss/vite@4.1.5(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))': + dependencies: + '@tailwindcss/node': 4.1.5 + '@tailwindcss/oxide': 4.1.5 + tailwindcss: 4.1.5 + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) + '@tauri-apps/api@2.5.0': {} '@tauri-apps/cli-darwin-arm64@2.5.0': @@ -7252,19 +7539,19 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-vue-jsx@4.1.2(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue-jsx@4.1.2(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.26.10) - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.13': @@ -7360,14 +7647,14 @@ snapshots: dependencies: '@vue/devtools-kit': 7.7.5 - '@vue/devtools-core@7.7.5(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.7.5(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': dependencies: '@vue/devtools-kit': 7.7.5 '@vue/devtools-shared': 7.7.5 mitt: 3.0.1 nanoid: 5.1.5 pathe: 2.0.3 - vite-hot-client: 2.0.4(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)) + vite-hot-client: 2.0.4(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite @@ -7432,13 +7719,13 @@ snapshots: '@vueuse/metadata@13.1.0': {} - '@vueuse/nuxt@13.1.0(magicast@0.3.5)(nuxt@3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': + '@vueuse/nuxt@13.1.0(magicast@0.3.5)(nuxt@3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3))': dependencies: '@nuxt/kit': 3.17.0(magicast@0.3.5) '@vueuse/core': 13.1.0(vue@3.5.13(typescript@5.6.3)) '@vueuse/metadata': 13.1.0 local-pkg: 1.1.1 - nuxt: 3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1) + nuxt: 3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - magicast @@ -7920,11 +8207,6 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 - css-selector-tokenizer@0.8.0: - dependencies: - cssesc: 3.0.0 - fastparse: 1.1.2 - css-tree@2.2.1: dependencies: mdn-data: 2.0.28 @@ -7992,8 +8274,6 @@ snapshots: csstype@3.1.3: {} - culori@4.0.1: {} - data-uri-to-buffer@4.0.1: {} db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)): @@ -8488,8 +8768,6 @@ snapshots: fast-npm-meta@0.4.2: {} - fastparse@1.1.2: {} - fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -8546,15 +8824,9 @@ snapshots: flatted@3.3.3: {} - flyonui@1.3.1(postcss@8.5.3): + flyonui@2.1.0: dependencies: - '@popperjs/core': 2.11.8 - css-selector-tokenizer: 0.8.0 - culori: 4.0.1 - picocolors: 1.1.1 - postcss-js: 4.0.1(postcss@8.5.3) - transitivePeerDependencies: - - postcss + '@floating-ui/dom': 1.7.0 fn.name@1.1.0: {} @@ -9179,6 +9451,51 @@ snapshots: '@libsql/linux-x64-musl': 0.5.8 '@libsql/win32-x64-msvc': 0.5.8 + lightningcss-darwin-arm64@1.29.2: + optional: true + + lightningcss-darwin-x64@1.29.2: + optional: true + + lightningcss-freebsd-x64@1.29.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -9592,6 +9909,23 @@ snapshots: - magicast - vue + nuxt-svgo-loader@0.5.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)): + dependencies: + '@nuxt/devtools-kit': 2.4.0(magicast@0.3.5)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) + '@nuxt/kit': 3.17.0(magicast@0.3.5) + birpc: 2.3.0 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + scule: 1.3.0 + sirv: 3.0.1 + svgo: 3.3.2 + tinyglobby: 0.2.13 + vite-svg-loader: 5.1.0(vue@3.5.13(typescript@5.6.3)) + transitivePeerDependencies: + - magicast + - vite + - vue + nuxt-zod-i18n@1.11.5(magicast@0.3.5)(typescript@5.6.3): dependencies: '@intlify/shared': 11.1.3 @@ -9604,15 +9938,15 @@ snapshots: - magicast - typescript - nuxt@3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1): + nuxt@3.17.0(@libsql/client@0.15.4)(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.15.3)(db0@0.3.2(@libsql/client@0.15.4)(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2)))(drizzle-orm@0.41.0(@libsql/client@0.15.4)(gel@2.0.2))(eslint@9.23.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3))(yaml@2.7.1): dependencies: '@nuxt/cli': 3.25.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.4.0(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) + '@nuxt/devtools': 2.4.0(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) '@nuxt/kit': 3.17.0(magicast@0.3.5) '@nuxt/schema': 3.17.0 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 3.17.0(@types/node@22.15.3)(eslint@9.23.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vue-tsc@2.2.10(typescript@5.6.3))(vue@3.5.13(typescript@5.6.3))(yaml@2.7.1) + '@nuxt/vite-builder': 3.17.0(@types/node@22.15.3)(eslint@9.23.0(jiti@2.4.2))(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(terser@5.39.0)(typescript@5.6.3)(vue-tsc@2.2.10(typescript@5.6.3))(vue@3.5.13(typescript@5.6.3))(yaml@2.7.1) '@unhead/vue': 2.0.8(vue@3.5.13(typescript@5.6.3)) '@vue/shared': 3.5.13 c12: 3.0.3(magicast@0.3.5) @@ -10699,6 +11033,8 @@ snapshots: transitivePeerDependencies: - ts-node + tailwindcss@4.1.5: {} + tapable@2.2.1: {} tar-fs@2.1.2: @@ -11001,23 +11337,23 @@ snapshots: vary@1.1.2: {} - vite-dev-rpc@1.0.7(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)): + vite-dev-rpc@1.0.7(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)): dependencies: birpc: 2.3.0 - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) - vite-hot-client: 2.0.4(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) + vite-hot-client: 2.0.4(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) - vite-hot-client@2.0.4(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)): + vite-hot-client@2.0.4(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)): dependencies: - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) - vite-node@3.1.2(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1): + vite-node@3.1.2(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - jiti @@ -11032,7 +11368,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.9.1(eslint@9.23.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3)): + vite-plugin-checker@0.9.1(eslint@9.23.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.6.3)(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue-tsc@2.2.10(typescript@5.6.3)): dependencies: '@babel/code-frame': 7.26.2 chokidar: 4.0.3 @@ -11042,7 +11378,7 @@ snapshots: strip-ansi: 7.1.0 tiny-invariant: 1.3.3 tinyglobby: 0.2.13 - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) vscode-uri: 3.1.0 optionalDependencies: eslint: 9.23.0(jiti@2.4.2) @@ -11050,7 +11386,7 @@ snapshots: typescript: 5.6.3 vue-tsc: 2.2.10(typescript@5.6.3) - vite-plugin-inspect@11.0.1(@nuxt/kit@3.17.0(magicast@0.3.5))(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)): + vite-plugin-inspect@11.0.1(@nuxt/kit@3.17.0(magicast@0.3.5))(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)): dependencies: ansis: 3.17.0 debug: 4.4.0 @@ -11060,24 +11396,29 @@ snapshots: perfect-debounce: 1.0.0 sirv: 3.0.1 unplugin-utils: 0.2.4 - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) - vite-dev-rpc: 1.0.7(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1)) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) + vite-dev-rpc: 1.0.7(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) optionalDependencies: '@nuxt/kit': 3.17.0(magicast@0.3.5) transitivePeerDependencies: - supports-color - vite-plugin-vue-tracer@0.1.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-tracer@0.1.3(vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.5 magic-string: 0.30.17 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1) + vite: 6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) vue: 3.5.13(typescript@5.6.3) - vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.1): + vite-svg-loader@5.1.0(vue@3.5.13(typescript@5.6.3)): + dependencies: + svgo: 3.3.2 + vue: 3.5.13(typescript@5.6.3) + + vite@6.3.3(@types/node@22.15.3)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1): dependencies: esbuild: 0.25.3 fdir: 6.4.4(picomatch@4.0.2) @@ -11089,6 +11430,7 @@ snapshots: '@types/node': 22.15.3 fsevents: 2.3.3 jiti: 2.4.2 + lightningcss: 1.29.2 terser: 5.39.0 yaml: 2.7.1 diff --git a/src-tauri/.sqlx/query-a73e92ff12dca9b046a6440b9a68b002662b594f7f569ee71de11e00c23ca625.json b/src-tauri/.sqlx/query-a73e92ff12dca9b046a6440b9a68b002662b594f7f569ee71de11e00c23ca625.json deleted file mode 100644 index 2327fc7..0000000 --- a/src-tauri/.sqlx/query-a73e92ff12dca9b046a6440b9a68b002662b594f7f569ee71de11e00c23ca625.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT id, extension_id, resource, operation, path \n FROM haex_extensions_permissions \n WHERE extension_id = ? AND resource = ? AND operation = ?\n ", - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "extension_id", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "resource", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "operation", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "path", - "ordinal": 4, - "type_info": "Text" - } - ], - "parameters": { - "Right": 3 - }, - "nullable": [ - false, - true, - true, - true, - true - ] - }, - "hash": "a73e92ff12dca9b046a6440b9a68b002662b594f7f569ee71de11e00c23ca625" -} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index a657c1b..e5134a3 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1536,6 +1536,7 @@ version = "0.1.0" dependencies = [ "base64 0.22.1", "fs_extra", + "hex", "mime", "mime_guess", "rusqlite", @@ -4516,9 +4517,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.1" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 909b9b3..b69f4ee 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -24,15 +24,16 @@ rusqlite = { version = "0.35.0", features = [ ] } #libsqlite3-sys = { version = "0.28", features = ["bundled-sqlcipher"] } #sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "sqlite"] } -tokio = { version = "1.44", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.45", features = ["macros", "rt-multi-thread"] } serde = { version = "1", features = ["derive"] } +hex = "0.4" serde_json = "1" base64 = "0.22" mime_guess = "2.0" mime = "0.3" fs_extra = "1.3.0" sqlparser = { version = "0.56.0", features = [] } -tauri = { version = "2.5", features = ["protocol-asset", "custom-protocol"] } +tauri = { version = "2.5", features = ["protocol-asset"] } tauri-plugin-dialog = "2.2" tauri-plugin-fs = "2.2.0" tauri-plugin-opener = "2.2" diff --git a/src-tauri/src/database/mod.rs b/src-tauri/src/database/mod.rs index b2f68bd..4d575b5 100644 --- a/src-tauri/src/database/mod.rs +++ b/src-tauri/src/database/mod.rs @@ -227,5 +227,5 @@ pub fn open_encrypted_database( let mut db = state.0.lock().map_err(|e| e.to_string())?; *db = Some(conn); - Ok(format!("Verschlüsselte CRDT-Datenbank geöffnet: {}", path)) + Ok(format!("success")) } diff --git a/src-tauri/src/extension/core.rs b/src-tauri/src/extension/core.rs index 52986e7..cdd44a0 100644 --- a/src-tauri/src/extension/core.rs +++ b/src-tauri/src/extension/core.rs @@ -1,12 +1,70 @@ use mime; +use serde::Deserialize; +use std::fmt; use std::fs; use std::path::PathBuf; -use std::str::FromStr; + use tauri::{ - http::{Request, Response, Uri}, - AppHandle, Error as TauriError, Manager, Runtime, + http::{Request, Response}, + AppHandle, Error as TauriError, Manager, Runtime, UriSchemeContext, }; +#[derive(Deserialize, Debug)] +struct ExtensionInfo { + id: String, + version: String, +} + +#[derive(Debug)] +enum DataProcessingError { + HexDecoding(hex::FromHexError), + Utf8Conversion(std::string::FromUtf8Error), + JsonParsing(serde_json::Error), +} + +// Implementierung von Display für benutzerfreundliche Fehlermeldungen +impl fmt::Display for DataProcessingError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + DataProcessingError::HexDecoding(e) => write!(f, "Hex-Dekodierungsfehler: {}", e), + DataProcessingError::Utf8Conversion(e) => { + write!(f, "UTF-8-Konvertierungsfehler: {}", e) + } + DataProcessingError::JsonParsing(e) => write!(f, "JSON-Parsing-Fehler: {}", e), + } + } +} + +// Implementierung von std::error::Error (optional, aber gute Praxis für bibliotheksähnlichen Code) +impl std::error::Error for DataProcessingError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + DataProcessingError::HexDecoding(e) => Some(e), + DataProcessingError::Utf8Conversion(e) => Some(e), + DataProcessingError::JsonParsing(e) => Some(e), + } + } +} + +// Implementierung von From-Traits für einfache Verwendung des '?'-Operators +impl From for DataProcessingError { + fn from(err: hex::FromHexError) -> Self { + DataProcessingError::HexDecoding(err) + } +} + +impl From for DataProcessingError { + fn from(err: std::string::FromUtf8Error) -> Self { + DataProcessingError::Utf8Conversion(err) + } +} + +impl From for DataProcessingError { + fn from(err: serde_json::Error) -> Self { + DataProcessingError::JsonParsing(err) + } +} + pub fn copy_directory(source: String, destination: String) -> Result<(), String> { println!( "Kopiere Verzeichnis von '{}' nach '{}'", @@ -46,6 +104,7 @@ pub fn copy_directory(source: String, destination: String) -> Result<(), String> pub fn resolve_secure_extension_asset_path( app_handle: &AppHandle, extension_id: &str, + extension_version: &str, requested_asset_path: &str, ) -> Result { // 1. Validiere die Extension ID @@ -57,6 +116,17 @@ pub fn resolve_secure_extension_asset_path( return Err(format!("Ungültige Extension ID: {}", extension_id)); } + if extension_version.is_empty() + || !extension_version + .chars() + .all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '.') + { + return Err(format!( + "Ungültige Extension Version: {}", + extension_version + )); + } + // 2. Bestimme das Basisverzeichnis für alle Erweiterungen (Resource Directory) let base_extensions_dir = app_handle .path() @@ -66,7 +136,8 @@ pub fn resolve_secure_extension_asset_path( .join("extensions"); // 3. Verzeichnis für die spezifische Erweiterung - let specific_extension_dir = base_extensions_dir.join(extension_id); + let specific_extension_dir = + base_extensions_dir.join(format!("{}/{}", extension_id, extension_version)); // 4. Bereinige den angeforderten Asset-Pfad let clean_relative_path = requested_asset_path @@ -112,70 +183,106 @@ pub fn resolve_secure_extension_asset_path( } } -pub fn handle_extension_protocol( - app_handle: &AppHandle, +pub fn extension_protocol_handler( + context: &UriSchemeContext<'_, R>, request: &Request>, ) -> Result>, Box> { - let uri_ref = request.uri(); // uri_ref ist &Uri + let uri_ref = request.uri(); println!("Protokoll Handler für: {}", uri_ref); - let uri_string = uri_ref.to_string(); // Konvertiere zu String - let parsed_uri = Uri::from_str(&uri_string)?; // Parse aus &str - - let extension_id = parsed_uri + let host = uri_ref .host() .ok_or("Kein Host (Extension ID) in URI gefunden")? .to_string(); - let requested_asset_path = parsed_uri.path(); + let path_str = uri_ref.path(); + let segments_iter = path_str.split('/').filter(|s| !s.is_empty()); + let resource_segments: Vec<&str> = segments_iter.collect(); + let raw_asset_path = resource_segments.join("/"); - let asset_path_to_load = if requested_asset_path == "/" || requested_asset_path.is_empty() { - "index.html" - } else { - requested_asset_path - }; + match process_hex_encoded_json(&host) { + Ok(info) => { + println!("Daten erfolgreich verarbeitet:"); + println!(" ID: {}", info.id); + println!(" Version: {}", info.version); + let absolute_secure_path = resolve_secure_extension_asset_path( + context.app_handle(), + &info.id, + &info.version, + &raw_asset_path, + )?; - // Sicheren Dateisystempfad auflösen (nutzt jetzt AppHandle) - let absolute_secure_path = - resolve_secure_extension_asset_path(app_handle, &extension_id, asset_path_to_load)?; + println!("absolute_secure_path: {}", absolute_secure_path.display()); - // Datei lesen und Response erstellen (Code wie vorher) - match fs::read(&absolute_secure_path) { - Ok(content) => { - let mime_type = mime_guess::from_path(&absolute_secure_path) - .first_or(mime::APPLICATION_OCTET_STREAM) - .to_string(); - println!( - "Liefere {} ({}) für Extension '{}'", - absolute_secure_path.display(), - mime_type, - extension_id - ); - // *** KORREKTUR: Verwende Response::builder() *** - Response::builder() - .status(200) - .header("Content-Type", mime_type) // Setze Header über .header() - .body(content) // body() gibt Result>, Error> zurück - .map_err(|e| e.into()) // Wandle http::Error in Box um + if absolute_secure_path.exists() && absolute_secure_path.is_file() { + match fs::read(&absolute_secure_path) { + Ok(content) => { + let mime_type = mime_guess::from_path(&absolute_secure_path) + .first_or(mime::APPLICATION_OCTET_STREAM) + .to_string(); + println!( + "Liefere {} ({}) ", + absolute_secure_path.display(), + mime_type + ); + Response::builder() + .status(200) + .header("Content-Type", mime_type) + .body(content) + .map_err(|e| e.into()) + } + Err(e) => { + eprintln!( + "Fehler beim Lesen der Datei {}: {}", + absolute_secure_path.display(), + e + ); + let status_code = if e.kind() == std::io::ErrorKind::NotFound { + 404 + } else if e.kind() == std::io::ErrorKind::PermissionDenied { + 403 + } else { + 500 + }; + + Response::builder() + .status(status_code) + .body(Vec::new()) // Leerer Body für Fehler + .map_err(|e| e.into()) // Wandle http::Error in Box um + } + } + } else { + // Datei nicht gefunden oder es ist keine Datei + eprintln!( + "Asset nicht gefunden oder ist kein File: {}", + absolute_secure_path.display() + ); + Response::builder() + .status(404) // HTTP 404 Not Found + .body(Vec::new()) + .map_err(|e| e.into()) + } } Err(e) => { - eprintln!( - "Fehler beim Lesen der Datei {}: {}", - absolute_secure_path.display(), - e - ); - let status_code = if e.kind() == std::io::ErrorKind::NotFound { - 404 - } else if e.kind() == std::io::ErrorKind::PermissionDenied { - 403 - } else { - 500 - }; - // *** KORREKTUR: Verwende Response::builder() auch für Fehler *** + eprintln!("Fehler bei der Datenverarbeitung: {}", e); + Response::builder() - .status(status_code) + .status("500") .body(Vec::new()) // Leerer Body für Fehler - .map_err(|e| e.into()) // Wandle http::Error in Box um + .map_err(|e| e.into()) } } } + +fn process_hex_encoded_json(hex_input: &str) -> Result { + // Schritt 1: Hex-String zu Bytes dekodieren + let bytes = hex::decode(hex_input)?; // Konvertiert hex::FromHexError automatisch + + // Schritt 2: Bytes zu UTF-8-String konvertieren + let json_string = String::from_utf8(bytes)?; // Konvertiert FromUtf8Error automatisch + + // Schritt 3: JSON-String zu Struktur parsen + let extension_info: ExtensionInfo = serde_json::from_str(&json_string)?; // Konvertiert serde_json::Error automatisch + + Ok(extension_info) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e4673ea..18680e7 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -12,30 +12,37 @@ pub fn run() { let protocol_name = "haex-extension"; tauri::Builder::default() - /* .register_uri_scheme_protocol(protocol_name, move |app_handle, request| { - // Extrahiere den Request aus dem Kontext - //let request = context.request(); - // Rufe die Handler-Logik auf - match extension::core::handle_extension_protocol(0, &request) { - Ok(response) => response, // Gib die erfolgreiche Response zurück + .register_uri_scheme_protocol(protocol_name, move |context, request| { + match extension::core::extension_protocol_handler(&context, &request) { + Ok(response) => response, // Wenn der Handler Ok ist, gib die Response direkt zurück Err(e) => { - // Logge den Fehler - eprintln!("Fehler im Protokoll-Handler für '{}': {}", request.uri(), e); - // Gib eine generische 500er Fehler-Response zurück - Response::builder() - .status(500) - .mimetype("text/plain") // Einfacher Text für die Fehlermeldung - .body(format!("Internal Server Error: {}", e).into_bytes()) // Body als Vec - .unwrap() // .body() kann hier nicht fehlschlagen + // Wenn der Handler einen Fehler zurückgibt, logge ihn und erstelle eine Fehler-Response + eprintln!( + "Fehler im Custom Protocol Handler für URI '{}': {}", + request.uri(), + e + ); + // Erstelle eine HTTP 500 Fehler-Response + // Du kannst hier auch spezifischere Fehler-Responses bauen, falls gewünscht. + tauri::http::Response::builder() + .status(500) + .header("Content-Type", "text/plain") // Optional, aber gut für Klarheit + .body(Vec::from(format!( + "Interner Serverfehler im Protokollhandler: {}", + e + ))) + .unwrap_or_else(|build_err| { + // Fallback, falls selbst das Erstellen der Fehler-Response fehlschlägt + eprintln!("Konnte Fehler-Response nicht erstellen: {}", build_err); + tauri::http::Response::builder() + .status(500) + .body(Vec::new()) + .expect("Konnte minimale Fallback-Response nicht erstellen") + }) } } - }) */ - /* .setup(move |app| { - // Der .setup Hook ist jetzt nur noch für andere Initialisierungen da - // Der AppHandle ist hier nicht mehr nötig für die Protokoll-Registrierung - println!("App Setup abgeschlossen."); - Ok(()) - }) */ + //extension::core::extension_protocol_handler(&context, &request) + }) .plugin(tauri_plugin_http::init()) .manage(DbConnection(Mutex::new(None))) .manage(ExtensionState::default()) @@ -57,3 +64,29 @@ pub fn run() { .run(tauri::generate_context!()) .expect("error while running tauri application"); } + +/* fn extension_protocol_handler( + app_handle: &tauri::AppHandle, // Beachten Sie die Signaturänderung in neueren Tauri-Versionen + request: &tauri::http::Request>, +) -> Result>, Box> { + let uri_str = request.uri().to_string(); +let parsed_url = match Url::parse(&uri_str) { + Ok(url) => url, + Err(e) => { + eprintln!("Fehler beim Parsen der URL '{}': {}", uri_str, e); + return Ok(tauri::http::ResponseBuilder::new().status(400).body(Vec::from("Ungültige URL"))?); + } +}; + +let plugin_id = parsed_url.host_str().ok_or_else(|| "Fehlende Plugin-ID in der URL".to_string())?; +let path_segments: Vec<&str> = parsed_url.path_segments().ok_or_else(|| "URL hat keinen Pfad".to_string())?.collect(); + +if path_segments.len() < 2 { + eprintln!("Unvollständiger Pfad in URL: {}", uri_str); + return Ok(tauri::http::Response::new().status(400).body(Vec::from("Unvollständiger Pfad"))?); +} + +let version = path_segments; +let file_path = path_segments[1..].join("/"); + Ok(tauri::http::Response::builder()::new().status(404).body(Vec::new())?) +} */ diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 411afd4..4ac1339 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -7,7 +7,7 @@ "beforeDevCommand": "pnpm dev", "devUrl": "http://localhost:3003", "beforeBuildCommand": "pnpm generate", - "frontendDist": "../dist" + "frontendDist": "../.output/public" }, "app": { "windows": [ @@ -18,7 +18,14 @@ } ], "security": { - "csp": "default-src 'self' ipc: http://ipc.localhost; img-src 'self' asset: http://asset.localhost", + "csp": { + "default-src": ["'self'", "haex-extensions"], + "script-src": ["'self'", "haex-extensions"], + "style-src": ["'self'", "haex-extensions"], + "connect-src": ["'self'", "haex-extensions"], + "img-src": ["'self'", "haex-extensions", "data:"], + "font-src": ["'self'", "haex-extensions", "data:"] + }, "assetProtocol": { "enable": true, "scope": ["$RESOURCE/extensions/**"] diff --git a/src/assets/css/main.css b/src/assets/css/main.css new file mode 100644 index 0000000..c59e33a --- /dev/null +++ b/src/assets/css/main.css @@ -0,0 +1,9 @@ +@import "tailwindcss"; +@import "flyonui/variants.css"; + +@plugin "@iconify/tailwind4"; +@plugin "flyonui" { + themes: all; +} + +@source "../../node_modules/flyonui/flyonui.js"; diff --git a/src/components/haex/extension/card.vue b/src/components/haex/extension/card.vue new file mode 100644 index 0000000..c79ee28 --- /dev/null +++ b/src/components/haex/extension/card.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/components/haex/extension/dialog/remove.vue b/src/components/haex/extension/dialog/remove.vue new file mode 100644 index 0000000..6d32423 --- /dev/null +++ b/src/components/haex/extension/dialog/remove.vue @@ -0,0 +1,54 @@ + + + + + +{ + "de": { + "title": "Erweiterung löschen", + "question": "Soll {name} wirklich gelöscht werden?", + "abort": "Abbrechen", + "remove": "Löschen" + }, + "en": { + "title": "Remove Extension", + "question": "Soll {name} wirklich gelöscht werden?", + "abort": "Abort", + "remove": "Remove" + } +} + diff --git a/src/components/haex/extension/manifest/confirm.vue b/src/components/haex/extension/manifest/confirm.vue index 5c70688..0c3e17e 100644 --- a/src/components/haex/extension/manifest/confirm.vue +++ b/src/components/haex/extension/manifest/confirm.vue @@ -54,10 +54,12 @@ diff --git a/src/components/ui/dialog/index.vue b/src/components/ui/dialog/index.vue index 31bbc48..056200d 100644 --- a/src/components/ui/dialog/index.vue +++ b/src/components/ui/dialog/index.vue @@ -50,27 +50,10 @@ export interface IDom { const id = useId(); defineProps({ - trigger: { - type: Object as PropType, - default: () => ({ - class: "", - text: "", - }), - }, - title: { type: String, default: "", }, - - description: { - type: Object as PropType, - default: () => ({ - class: "", - text: "", - }), - required: false, - }, }); const open = defineModel("open", { default: false }); @@ -84,8 +67,8 @@ watch(open, async () => { if (open.value) { await modal.value?.open(); } else { - const res = await modal.value?.close(true); - console.log("close dialog", res); + await modal.value?.close(true); + console.log("close dialog"); } }); diff --git a/src/components/ui/input/index.vue b/src/components/ui/input/index.vue index 4991ad5..d1e704f 100644 --- a/src/components/ui/input/index.vue +++ b/src/components/ui/input/index.vue @@ -1,6 +1,6 @@ diff --git a/src/components/ui/sidebar/link/extension.vue b/src/components/ui/sidebar/link/extension.vue deleted file mode 100644 index 5c05d6d..0000000 --- a/src/components/ui/sidebar/link/extension.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/src/components/ui/sidebar/link/index.vue b/src/components/ui/sidebar/link/index.vue index 80293c6..8e0ed13 100644 --- a/src/components/ui/sidebar/link/index.vue +++ b/src/components/ui/sidebar/link/index.vue @@ -8,9 +8,10 @@ - +
+ @@ -23,6 +24,7 @@ const props = defineProps(); const router = useRouter(); +console.log("to", props.to); const isActive = computed(() => { if (props.to?.name === "haexExtension") { return getSingleRouteParam(router.currentRoute.value.params.extensionId) === props.id; @@ -31,9 +33,9 @@ const isActive = computed(() => { } }); -const link = useTemplateRef("link"); +const linkRef = useTemplateRef("linkRef"); -const triggerNavigate = () => link.value?.$el.click(); +const triggerNavigate = () => linkRef.value?.$el.click(); /* computed(() => { const found = useRouter() diff --git a/src/components/vault/button/create.vue b/src/components/vault/button/create.vue index 69c3a8c..d9b1a3f 100644 --- a/src/components/vault/button/create.vue +++ b/src/components/vault/button/create.vue @@ -1,52 +1,51 @@ { - "de": { - "database": { - "label": "Datenbankname", - "placeholder": "Passwörter", - "create": "Neue Vault anlegen", - "name": "Passwörter" - }, - "title": "Neue Datenbank anlegen", - "create": "Erstellen", - "abort": "Abbrechen", - "description": "Haex Vault für deine geheimsten Geheimnisse" + "de": { + "database": { + "label": "Datenbankname", + "placeholder": "Passwörter", + "create": "Neue Vault anlegen", + "name": "Passwörter" }, + "title": "Neue Datenbank anlegen", + "create": "Erstellen", + "abort": "Abbrechen", + "description": "Haex Vault für deine geheimsten Geheimnisse" + }, - "en": { - "database": { - "label": "Databasename", - "placeholder": "Databasename", - "create": "Create new Vault", - "name": "Passwords" - }, - "title": "Create New Database", - "create": "Create", - "abort": "Abort", - "description": "Haex Vault for your most secret secrets" - } + "en": { + "database": { + "label": "Databasename", + "placeholder": "Databasename", + "create": "Create new Vault", + "name": "Passwords" + }, + "title": "Create New Database", + "create": "Create", + "abort": "Abort", + "description": "Haex Vault for your most secret secrets" + } } diff --git a/src/components/vault/button/open.vue b/src/components/vault/button/open.vue index 643532a..cfacb62 100644 --- a/src/components/vault/button/open.vue +++ b/src/components/vault/button/open.vue @@ -102,6 +102,7 @@ const onLoadDatabase = async () => { const localePath = useLocalePath(); +const { currentVault, currentVaultId } = storeToRefs(useVaultStore()); const onOpenDatabase = async () => { try { check.value = true; @@ -110,7 +111,10 @@ const onOpenDatabase = async () => { const passwordCheck = vaultDatabaseSchema.password.safeParse(database.password); if (!pathCheck.success || !passwordCheck.success || !path) { - add({ type: "error", text: "params falsch" }); + add({ + type: "error", + text: `Params falsch. Path: ${pathCheck.error} | Password: ${passwordCheck.error}`, + }); return; } @@ -131,15 +135,14 @@ const onOpenDatabase = async () => { onClose(); + currentVaultId.value = vaultId; + console.log("vault before navigation", currentVault.value, currentVaultId.value, vaultId); await navigateTo( localePath({ name: "vaultOverview", params: { vaultId, }, - query: { - showSidebar: "true", - }, }) ); } catch (error) { diff --git a/src/components/vault/card/index.vue b/src/components/vault/card/index.vue index d141b99..540255d 100644 --- a/src/components/vault/card/index.vue +++ b/src/components/vault/card/index.vue @@ -3,14 +3,19 @@
-
- -
+
+ +
+ {{ title }} +
+ +
+
Your journey starts here
- + aaaaaaaaa
@@ -36,6 +41,8 @@ + diff --git a/src/pages/vault/[vaultId]/browser.vue b/src/pages/vault/[vaultId]/browser.vue index 5fbadb2..7364613 100644 --- a/src/pages/vault/[vaultId]/browser.vue +++ b/src/pages/vault/[vaultId]/browser.vue @@ -1,16 +1,16 @@ diff --git a/src/pages/vault/[vaultId]/extensions/[extensionId].vue b/src/pages/vault/[vaultId]/extensions/[extensionId].vue index 6e3ed13..282ee2e 100644 --- a/src/pages/vault/[vaultId]/extensions/[extensionId].vue +++ b/src/pages/vault/[vaultId]/extensions/[extensionId].vue @@ -1,6 +1,8 @@ @@ -28,11 +30,11 @@ const extensionStore = useExtensionsStore(); watch(iframeSrc, () => console.log("iframeSrc", iframeSrc.value), { immediate: true }); onMounted(async () => { - const minfest = await extensionStore.readManifestFileAsync( + /* const minfest = await extensionStore.readManifestFileAsync( currentExtension.value!.id, currentExtension.value!.version ); - console.log("manifest", minfest, extensionStore.extensionEntry); + console.log("manifest", minfest, extensionStore.extensionEntry); */ }); diff --git a/src/pages/vault/[vaultId]/extensions/index.vue b/src/pages/vault/[vaultId]/extensions/index.vue index e92f02a..3150f41 100644 --- a/src/pages/vault/[vaultId]/extensions/index.vue +++ b/src/pages/vault/[vaultId]/extensions/index.vue @@ -1,15 +1,38 @@ @@ -17,6 +40,7 @@ import { join } from "@tauri-apps/api/path"; import { open } from "@tauri-apps/plugin-dialog"; import { readTextFile } from "@tauri-apps/plugin-fs"; +import type { IHaexHubExtension, IHaexHubExtensionManifest } from "~/types/haexhub"; definePageMeta({ name: "extensionOverview", @@ -35,6 +59,8 @@ const extension = reactive<{ path: "", }); +onMounted(() => console.log("extension overview")); + const loadExtensionManifestAsync = async () => { try { extension.path = await open({ directory: true, recursive: true }); @@ -50,7 +76,8 @@ const loadExtensionManifestAsync = async () => { extension.manifest = manifestFile; showConfirmation.value = true; } catch (error) { - console.error("Fehler beim Laden des Moduls:", error); + console.error("Fehler loadExtensionManifestAsync:", error); + add({ type: "error", text: JSON.stringify(error) }); } }; @@ -67,26 +94,64 @@ const addExtensionAsync = async () => { text: t("extension.success.text"), }); } catch (error) { - console.error("Fehler beim Laden des Moduls:", error); + console.error("Fehler addExtensionAsync:", error); add({ type: "error", text: JSON.stringify(error) }); } }; + +const showRemoveDialog = ref(false); +const extensionToBeRemoved = ref(); + +const onShowRemoveDialog = (extension: IHaexHubExtension) => { + extensionToBeRemoved.value = extension; + showRemoveDialog.value = true; +}; + +const removeExtensionAsync = async () => { + if (!extensionToBeRemoved.value?.id || !extensionToBeRemoved.value?.version) { + add({ type: "error", text: "Erweiterung kann nicht gelöscht werden" }); + return; + } + + try { + await extensionStore.removeExtensionAsync( + extensionToBeRemoved.value.id, + extensionToBeRemoved.value.version + ); + await extensionStore.loadExtensionsAsync(); + add({ + type: "success", + title: t("extension.remove.success.title", { + extensionName: extensionToBeRemoved.value.name, + }), + text: t("extension.remove.success.text", { extensionName: extensionToBeRemoved.value.name }), + }); + } catch (error) { + add({ + type: "error", + title: t("extension.remove.error.title"), + text: t("extension.remove.error.text", { error: JSON.stringify(error) }), + }); + } +}; - -{ - "de": { - "title": "Erweiterung installieren", - "extension": { - "add": "Erweiterung hinzufügen", - "success": { - "title": "{extension} hinzugefügt", - "text": "Die Erweiterung wurde erfolgreich hinzugefügt" - } - } - }, - "en": { - "title": "Install extension" - } -} + +de: + title: "Erweiterung installieren" + extension: + remove: + success: + text: "Erweiterung {extensionName} wurde erfolgreich entfernt" + title: "{extensionName} entfernt" + error: + text: "Erweiterung {extensionName} konnte nicht entfernt werden. \n {error}" + title: "Fehler beim Entfernen von {extensionName}" + + add: "Erweiterung hinzufügen" + success: + title: "{extension} hinzugefügt" + text: "Die Erweiterung wurde erfolgreich hinzugefügt" +en: + title: "Install extension" diff --git a/src/pages/vault/[vaultId]/index.vue b/src/pages/vault/[vaultId]/index.vue index 5a14fde..980b556 100644 --- a/src/pages/vault/[vaultId]/index.vue +++ b/src/pages/vault/[vaultId]/index.vue @@ -1,5 +1,5 @@