Compare commits

...

3 commits

Author SHA1 Message Date
Jesse Wierzbinski 18cf63de51
refactor: ♻️ Rewrite composer code
Some checks failed
CodeQL / Analyze (javascript) (push) Failing after 0s
Deploy to GitHub Pages / build (push) Failing after 0s
Deploy to GitHub Pages / deploy (push) Has been skipped
Docker / build (push) Failing after 0s
Mirror to Codeberg / Mirror (push) Failing after 0s
2025-06-27 00:28:14 +02:00
Jesse Wierzbinski fa8603d816
chore: ⬆️ Upgrade dependencies 2025-06-26 22:40:57 +02:00
Jesse Wierzbinski 9b55759220
chore: ⬆️ Upgrade Biome to v2 2025-06-26 22:39:02 +02:00
165 changed files with 901 additions and 739 deletions

View file

@ -19,6 +19,7 @@ import ConfirmationModal from "./components/modals/confirm.vue";
import { Toaster } from "./components/ui/sonner"; import { Toaster } from "./components/ui/sonner";
import { TooltipProvider } from "./components/ui/tooltip"; import { TooltipProvider } from "./components/ui/tooltip";
import { overwriteGetLocale } from "./paraglide/runtime"; import { overwriteGetLocale } from "./paraglide/runtime";
// Sin // Sin
//import "~/styles/mcdonalds.css"; //import "~/styles/mcdonalds.css";

View file

@ -1,18 +1,18 @@
{ {
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", "$schema": "https://biomejs.dev/schemas/2.0.5/schema.json",
"organizeImports": { "assist": { "actions": { "source": { "organizeImports": "on" } } },
"enabled": true
},
"linter": { "linter": {
"enabled": true, "enabled": true,
"rules": { "rules": {
"all": true,
"suspicious": { "suspicious": {
"noConsole": "off", "noConsole": "off",
"noExplicitAny": "off" "noExplicitAny": "off",
"noDuplicateElseIf": "error",
"noDocumentCookie": "off"
}, },
"performance": { "performance": {
"noBarrelFile": "off" "noBarrelFile": "off",
"noNamespaceImport": "off"
}, },
"correctness": { "correctness": {
"noNodejsModules": "off", "noNodejsModules": "off",
@ -30,7 +30,6 @@
"style": { "style": {
"noDefaultExport": "off", "noDefaultExport": "off",
"noParameterProperties": "off", "noParameterProperties": "off",
"noNamespaceImport": "off",
"useFilenamingConvention": "off", "useFilenamingConvention": "off",
"useNamingConvention": { "useNamingConvention": {
"level": "warn", "level": "warn",
@ -63,12 +62,20 @@
} }
] ]
} }
}
}, },
"nursery": { "noParameterAssign": "error",
"noDuplicateElseIf": "error", "useAsConstAssertion": "error",
"useDefaultParameterLast": "error",
"useEnumInitializers": "error",
"useSelfClosingElements": "error",
"useSingleVarDeclarator": "error",
"noUnusedTemplateLiteral": "error",
"useNumberNamespace": "error",
"noInferrableTypes": "error",
"noUselessElse": "error",
"noCommonJs": "error" "noCommonJs": "error"
} },
"nursery": {}
} }
}, },
"formatter": { "formatter": {
@ -76,15 +83,31 @@
"indentStyle": "space", "indentStyle": "space",
"indentWidth": 4 "indentWidth": 4
}, },
"overrides": [
{
"includes": ["**/*.vue"],
"linter": {
"rules": {
"correctness": {
"noUnusedImports": "off"
},
"style": {
"useImportType": "off"
}
}
}
}
],
"files": { "files": {
"ignore": [ "includes": [
"node_modules/**/*", "**",
"dist/**/*", "!**/node_modules/**/*",
".output", "!**/dist/**/*",
".nuxt", "!**/.output",
"paraglide", "!**/.nuxt",
"result", "!**/paraglide",
"project.inlang" "!**/result",
"!**/project.inlang"
] ]
} }
} }

176
bun.lock
View file

@ -7,28 +7,28 @@
"@nuxt/fonts": "^0.11.4", "@nuxt/fonts": "^0.11.4",
"@nuxtjs/color-mode": "3.5.2", "@nuxtjs/color-mode": "3.5.2",
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.16",
"@tailwindcss/vite": "^4.1.10", "@tailwindcss/vite": "^4.1.11",
"@tanstack/vue-table": "^8.21.3", "@tanstack/vue-table": "^8.21.3",
"@tiptap/extension-highlight": "^2.14.0", "@tiptap/extension-highlight": "^2.22.3",
"@tiptap/extension-image": "^2.14.0", "@tiptap/extension-image": "^2.22.3",
"@tiptap/extension-link": "^2.14.0", "@tiptap/extension-link": "^2.22.3",
"@tiptap/extension-mention": "^2.14.0", "@tiptap/extension-mention": "^2.22.3",
"@tiptap/extension-placeholder": "^2.14.0", "@tiptap/extension-placeholder": "^2.22.3",
"@tiptap/extension-subscript": "^2.14.0", "@tiptap/extension-subscript": "^2.22.3",
"@tiptap/extension-superscript": "^2.14.0", "@tiptap/extension-superscript": "^2.22.3",
"@tiptap/extension-task-item": "^2.14.0", "@tiptap/extension-task-item": "^2.22.3",
"@tiptap/extension-task-list": "^2.14.0", "@tiptap/extension-task-list": "^2.22.3",
"@tiptap/extension-underline": "^2.14.0", "@tiptap/extension-underline": "^2.22.3",
"@tiptap/pm": "^2.14.0", "@tiptap/pm": "^2.22.3",
"@tiptap/starter-kit": "^2.14.0", "@tiptap/starter-kit": "^2.22.3",
"@tiptap/suggestion": "^2.14.0", "@tiptap/suggestion": "^2.22.3",
"@tiptap/vue-3": "^2.14.0", "@tiptap/vue-3": "^2.22.3",
"@vee-validate/zod": "^4.15.1", "@vee-validate/zod": "^4.15.1",
"@versia/client": "0.2.0-alpha.4", "@versia/client": "0.2.0-alpha.4",
"@videojs-player/vue": "^1.0.0", "@videojs-player/vue": "^1.0.0",
"@vite-pwa/nuxt": "^1.0.4", "@vite-pwa/nuxt": "^1.0.4",
"@vueuse/core": "^13.3.0", "@vueuse/core": "^13.4.0",
"@vueuse/nuxt": "^13.3.0", "@vueuse/nuxt": "^13.4.0",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"embla-carousel-vue": "^8.6.0", "embla-carousel-vue": "^8.6.0",
@ -36,7 +36,7 @@
"emojibase-data": "^16.0.3", "emojibase-data": "^16.0.3",
"fuzzysort": "^3.1.0", "fuzzysort": "^3.1.0",
"html-to-text": "^9.0.5", "html-to-text": "^9.0.5",
"lucide-vue-next": "^0.517.0", "lucide-vue-next": "^0.523.0",
"magic-regexp": "^0.10.0", "magic-regexp": "^0.10.0",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"nanoid": "^5.1.5", "nanoid": "^5.1.5",
@ -45,7 +45,7 @@
"reka-ui": "^2.3.1", "reka-ui": "^2.3.1",
"shadcn-nuxt": "2.2.0", "shadcn-nuxt": "2.2.0",
"tailwind-merge": "^3.3.1", "tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.10", "tailwindcss": "^4.1.11",
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "^1.0.7",
"tw-animate-css": "^1.3.4", "tw-animate-css": "^1.3.4",
"vaul-vue": "^0.4.1", "vaul-vue": "^0.4.1",
@ -54,11 +54,11 @@
"vue": "^3.5.17", "vue": "^3.5.17",
"vue-draggable-plus": "^0.6.0", "vue-draggable-plus": "^0.6.0",
"vue-router": "^4.5.1", "vue-router": "^4.5.1",
"vue-sonner": "^2.0.0", "vue-sonner": "^2.0.1",
"zod": "^3.25.67", "zod": "^3.25.67",
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^1.9.4", "@biomejs/biome": "^2.0.5",
"@iconify-json/fluent-emoji": "^1.2.3", "@iconify-json/fluent-emoji": "^1.2.3",
"@iconify-json/fluent-emoji-flat": "^1.2.3", "@iconify-json/fluent-emoji-flat": "^1.2.3",
"@iconify-json/noto": "^1.2.3", "@iconify-json/noto": "^1.2.3",
@ -274,23 +274,23 @@
"@badgateway/oauth2-client": ["@badgateway/oauth2-client@3.2.0", "", {}, "sha512-EHsoV6oLHot7HeYkIoSxCZApNgBjwNo1OTV9kXIDnmijGAshlVkJreVAAtexFn+sfDKPE0JW5SCPYJV1y4IoMg=="], "@badgateway/oauth2-client": ["@badgateway/oauth2-client@3.2.0", "", {}, "sha512-EHsoV6oLHot7HeYkIoSxCZApNgBjwNo1OTV9kXIDnmijGAshlVkJreVAAtexFn+sfDKPE0JW5SCPYJV1y4IoMg=="],
"@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], "@biomejs/biome": ["@biomejs/biome@2.0.5", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.5", "@biomejs/cli-darwin-x64": "2.0.5", "@biomejs/cli-linux-arm64": "2.0.5", "@biomejs/cli-linux-arm64-musl": "2.0.5", "@biomejs/cli-linux-x64": "2.0.5", "@biomejs/cli-linux-x64-musl": "2.0.5", "@biomejs/cli-win32-arm64": "2.0.5", "@biomejs/cli-win32-x64": "2.0.5" }, "bin": { "biome": "bin/biome" } }, "sha512-MztFGhE6cVjf3QmomWu83GpTFyWY8KIcskgRf2AqVEMSH4qI4rNdBLdpAQ11TNK9pUfLGz3IIOC1ZYwgBePtig=="],
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VIIWQv9Rcj9XresjCf3isBFfWjFStsdGZvm8SmwJzKs/22YQj167ge7DkxuaaZbNf2kmYif0AcjAKvtNedEoEw=="],
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-DRpGxBgf5Z7HUFcNUB6n66UiD4VlBlMpngNf32wPraxX8vYU6N9cb3xQWOXIQVBBQ64QfsSLJnjNu79i/LNmSg=="],
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-FQTfDNMXOknf8+g9Eede2daaduRjTC2SNbfWPNFMadN9K3UKjeZ62jwiYxztPaz9zQQsZU8VbddQIaeQY5CmIA=="],
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-OpflTCOw/ElEs7QZqN/HFaSViPHjAsAPxFJ22LhWUWvuJgcy/Z8+hRV0/3mk/ZRWy5A6fCDKHZqAxU+xB6W4mA=="],
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.5", "", { "os": "linux", "cpu": "x64" }, "sha512-znpfydUDPuDkyBTulnODrQVK2FaG/4hIOPcQSsF2GeauQOYrBAOplj0etGB0NUrr0dFsvaQ15nzDXYb60ACoiw=="],
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.5", "", { "os": "linux", "cpu": "x64" }, "sha512-9lmjCnajAzpZXbav2P6D87ugkhnaDpJtDvOH5uQbY2RXeW6Rq18uOUltxgacGBP+d8GusTr+s3IFOu7SN0Ok8g=="],
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-CP2wKQB+gh8HdJTFKYRFETqReAjxlcN9AlYDEoye8v2eQp+L9v+PUeDql/wsbaUhSsLR0sjj3PtbBtt+02AN3A=="],
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.5", "", { "os": "win32", "cpu": "x64" }, "sha512-Sw3rz2m6bBADeQpr3+MD7Ch4E1l15DTt/+dfqKnwkm3cn4BrYwnArmvKeZdVsFRDjMyjlKIP88bw1r7o+9aqzw=="],
"@capsizecss/metrics": ["@capsizecss/metrics@3.5.0", "", {}, "sha512-Ju2I/Qn3c1OaU8FgeW4Tc22D4C9NwyVfKzNmzst59bvxBjPoLYNZMqFYn+HvCtn4MpXwiaDtCE8fNuQLpdi9yA=="], "@capsizecss/metrics": ["@capsizecss/metrics@3.5.0", "", {}, "sha512-Ju2I/Qn3c1OaU8FgeW4Tc22D4C9NwyVfKzNmzst59bvxBjPoLYNZMqFYn+HvCtn4MpXwiaDtCE8fNuQLpdi9yA=="],
@ -622,37 +622,37 @@
"@tailwindcss/forms": ["@tailwindcss/forms@0.5.10", "", { "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw=="], "@tailwindcss/forms": ["@tailwindcss/forms@0.5.10", "", { "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw=="],
"@tailwindcss/node": ["@tailwindcss/node@4.1.10", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.10" } }, "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ=="], "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="],
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.10", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.10", "@tailwindcss/oxide-darwin-arm64": "4.1.10", "@tailwindcss/oxide-darwin-x64": "4.1.10", "@tailwindcss/oxide-freebsd-x64": "4.1.10", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", "@tailwindcss/oxide-linux-x64-musl": "4.1.10", "@tailwindcss/oxide-wasm32-wasi": "4.1.10", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" } }, "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q=="], "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="],
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.10", "", { "os": "android", "cpu": "arm64" }, "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ=="], "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.11", "", { "os": "android", "cpu": "arm64" }, "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg=="],
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ=="], "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ=="],
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ=="], "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw=="],
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g=="], "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA=="],
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10", "", { "os": "linux", "cpu": "arm" }, "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ=="], "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11", "", { "os": "linux", "cpu": "arm" }, "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg=="],
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA=="], "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ=="],
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ=="], "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ=="],
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA=="], "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg=="],
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA=="], "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q=="],
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.10", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q=="], "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g=="],
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA=="], "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w=="],
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.10", "", { "os": "win32", "cpu": "x64" }, "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA=="], "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.11", "", { "os": "win32", "cpu": "x64" }, "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg=="],
"@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="], "@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="],
"@tailwindcss/vite": ["@tailwindcss/vite@4.1.10", "", { "dependencies": { "@tailwindcss/node": "4.1.10", "@tailwindcss/oxide": "4.1.10", "tailwindcss": "4.1.10" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A=="], "@tailwindcss/vite": ["@tailwindcss/vite@4.1.11", "", { "dependencies": { "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "tailwindcss": "4.1.11" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw=="],
"@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="],
@ -662,77 +662,77 @@
"@tanstack/vue-virtual": ["@tanstack/vue-virtual@3.13.10", "", { "dependencies": { "@tanstack/virtual-core": "3.13.10" }, "peerDependencies": { "vue": "^2.7.0 || ^3.0.0" } }, "sha512-1UZmUiMNyKxQ1JFPtO3rfRmK7IuLYwfj/foPC7FVWj6yHand4ry5joFh8LQ1Ckm7Dfe/08cv6LKZNc4WYj7hxQ=="], "@tanstack/vue-virtual": ["@tanstack/vue-virtual@3.13.10", "", { "dependencies": { "@tanstack/virtual-core": "3.13.10" }, "peerDependencies": { "vue": "^2.7.0 || ^3.0.0" } }, "sha512-1UZmUiMNyKxQ1JFPtO3rfRmK7IuLYwfj/foPC7FVWj6yHand4ry5joFh8LQ1Ckm7Dfe/08cv6LKZNc4WYj7hxQ=="],
"@tiptap/core": ["@tiptap/core@2.14.0", "", { "peerDependencies": { "@tiptap/pm": "^2.7.0" } }, "sha512-MBSMzGYRFlwYCocvx3dU7zpCBSDQ0qWByNtStaEzuBUgzCJ6wn2DP/xG0cMcLmE3Ia0VLM4nwbLOAAvBXOtylA=="], "@tiptap/core": ["@tiptap/core@2.22.3", "", { "peerDependencies": { "@tiptap/pm": "^2.7.0" } }, "sha512-czyBPXZG/ZFyObZEF1kyusGf58Ai3X8TnaxlUUn3gqLLWPy0idXZg85NETCidzi/gAxWxL9j6Pcy+zwS4pbZYQ=="],
"@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-AwqPP0jLYNioKxakiVw0vlfH/ceGFbV+SGoqBbPSGFPRdSbHhxHDNBlTtiThmT3N2PiVwXAD9xislJV+WY4GUA=="], "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-HvTXvqeGaANg0owk0Xxkgyc4lJMO5CZES2Lc3JJp8u5kV+HZIwd78eJ7fbKBMtkpKb4zOk4xQsHQ/TuhghJaeA=="],
"@tiptap/extension-bold": ["@tiptap/extension-bold@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-8DWwelH55H8KtLECSIv0wh8x/F/6lpagV/pMvT+Azujad0oqK+1iAPKU/kLgjXbFSkisrpV6KSwQts5neCtfRQ=="], "@tiptap/extension-bold": ["@tiptap/extension-bold@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-J3GxKwijD42eqCwU1SS7PK5aSgnp0wgQDetLz9izAD0RQBrKj5WZA13GnPoTTlzLU4qwjcPRV+6mvF+llH6b6A=="],
"@tiptap/extension-bubble-menu": ["@tiptap/extension-bubble-menu@2.14.0", "", { "dependencies": { "tippy.js": "^6.3.7" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-sN15n0RjPh+2Asvxs7l47hVEvX6c0aPempU8QQWcPUlHoGf1D/XkyHXy6GWVPSxZ5Rj5uAwgKvhHsG/FJ/YGKQ=="], "@tiptap/extension-bubble-menu": ["@tiptap/extension-bubble-menu@2.22.3", "", { "dependencies": { "tippy.js": "^6.3.7" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-8iQLNrRf3iBPKqI3dQnfvMxMfgp6y9TAbO803LihvzbIGqBaX264ES7fHtoyFIIeVjy2xFruVsTZCZofWTupGg=="],
"@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-SWnL4bP8Mm/mWN42AMQNoqYE0V6LgSBTVsHwwAki2wIUQdr9HyoAnohvHy3IME56NMwoyZyo+Mzl45wOqUxziA=="], "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-SYvLIxqmuV0kTj4/3ZFlnZ1fr9Y233qX00BKuIpGnczeFsWQmzBJo8vGm3d1IlKPCQN+jTRtDdDE1aSum8Kv2w=="],
"@tiptap/extension-code": ["@tiptap/extension-code@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-kyo02mnzqgwXayMcyRA/fHQgb+nMmQQpIt1irZwjtEoFZshA7NnY/6b5SJmRcxQ4/X4r2Y2Ha2sWmOcEkLmt4A=="], "@tiptap/extension-code": ["@tiptap/extension-code@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-s+W6jHezq+n9cC40xZ3hZF6cGGSl+fBELik1b2x8+cb0WoIlqmcdWin1dgeMNrWlRZUw1aD2DNwy/PdXI5vn2g=="],
"@tiptap/extension-code-block": ["@tiptap/extension-code-block@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-LRYYZeh8U2XgfTsJ4houB9s9cVRt7PRfVa4MaCeOYKfowVOKQh67yV5oom8Azk9XrMPkPxDmMmdPAEPxeVYFvw=="], "@tiptap/extension-code-block": ["@tiptap/extension-code-block@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-twPCBpb/ygNixlSBAXgvfo+t56Ucpb8lvPDiZn+cH8OjmmO0ayBoSfSrjKWgaEWGPcXBrFAfsBRbYHyoHj7pXg=="],
"@tiptap/extension-document": ["@tiptap/extension-document@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-qwEgpPIJ3AgXdEtRTr88hODbXRdt14VAwLj27PTSqexB5V7Ra1Jy7iQDhqRwBCoUomVywBsWYxkSuDisSRG+9w=="], "@tiptap/extension-document": ["@tiptap/extension-document@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-7MnILbhRZRyROlMUgyntzRZ/EZlqNB8fO761RNjJxR2WMb49R4yc04fz7/+f/QH/hwxoS13bKfsNUDAsDxA5Aw=="],
"@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-FIh5cdPuoPKvZ0GqSKhzMZGixm05ac3hSgqhMNCBZmXX459qBUI9CvDl/uzSnY9koBDeLVV3HYMthWQQLSXl9A=="], "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-yQxSfTWjdUQS+bh6KiNLR9KIMsn1SElzycQe4XE+0eoaetapGtKqxfwkTbbQdNgQOU5wQG1KOda221mnPvkpAA=="],
"@tiptap/extension-floating-menu": ["@tiptap/extension-floating-menu@2.14.0", "", { "dependencies": { "tippy.js": "^6.3.7" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-Khx7M7RfZlD1/T/PUlpJmao6FtEBa2L6td2hhaW1USflwGJGk0U/ud4UEqh+aZoJZrkot/EMhEvzmORF3nq+xw=="], "@tiptap/extension-floating-menu": ["@tiptap/extension-floating-menu@2.22.3", "", { "dependencies": { "tippy.js": "^6.3.7" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-GeJRRdulxpwsshxzBkpOf/xJkLD2fa+49o+3FqRCmrm7AioC8oUcZZmzuzjLj5a3ZNGKPuJ9xxDkYWUjH4tE1g=="],
"@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-as+SqC39FRshw4Fm1XVlrdSXveiusf5xiC4nuefLmXsUxO7Yx67x8jS0/VQbxWTLHZ6R1YEW8prLtnxGmVLCAQ=="], "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-6Q8TLL4PVGcZLn27eQazCC+be8LP8uzuz5Z5e4TpIeswPAju49cerQOdEGNFKkuYv/FelWIhXNtkWFMf4eSmyw=="],
"@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-A8c8n8881iBq3AusNqibh6Hloybr+FgYdg4Lg4jNxbbEaL0WhyLFge1bWlGVpbHXFqdv5YldMUAu6Rop3FhNvw=="], "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-tbEji/V4Za3UhxYwB36amYhyonwe5j66iYTNRWzgjNixjrcGDbWk6cfaF9jMAgPgIDBmmtQLJY+moKskwgpnZg=="],
"@tiptap/extension-heading": ["@tiptap/extension-heading@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-vM//6G3Ox3mxPv9eilhrDqylELCc8kEP1aQ4xUuOw7vCidjNtGggOa1ERnnpV2dCa2A9E8y4FHtN4Xh29stXQg=="], "@tiptap/extension-heading": ["@tiptap/extension-heading@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-+MexJD+kXtNwMDbNTFa7jCFipx1DqAdT+n9GgInqebAN9bK+CWjC+SskzZNRqeMrQ0Er7QTsi6YC09M+74sevA=="],
"@tiptap/extension-highlight": ["@tiptap/extension-highlight@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-21eouZEuCBFrpGeefnnU9yJ1SH32L9gSlT9MOJXBSXCX5HFskNLdN8Q4cQSyRXSt6r5kEz1GG5a4I805/U2TMQ=="], "@tiptap/extension-highlight": ["@tiptap/extension-highlight@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-cdPSeQ3QcThhJdzkjK9a1871uPQjwmOf0WzTGW33lJyJDQHypWIRNUus56c3pGA7BgV9P59QW7Fm8rDnM8XkbA=="],
"@tiptap/extension-history": ["@tiptap/extension-history@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-/qnOHQFCEPfkb3caykqd+sqzEC2gx30EQB/mM7+5kIG7CQy7XXaGjFAEaqzE1xJ783Q2E7GVk4JxWM+3NhYSLw=="], "@tiptap/extension-history": ["@tiptap/extension-history@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-F9sC45zPw7vbjKrwSKuSLZ0ODyc/X3bGPeCa6HYLEHKfgqsdt2v2fQLvxjpmlwO2ZMrnkBkg76KDxHfVyrZ2zQ=="],
"@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-OrKWgHOhmJtVHjPYaEJetNLiNEvrI85lTrGxzeQa+a8ACb93h4svyHe9J+LHs5pKkXDQFcpYEXJntu0LVLLiDw=="], "@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-3GvY798p9pCXUBbCebIdSmi1q80l7VZz/B6NN4uUMQ9iwxWopd8yaZ0O7xx2hM2UBzPEtY3M4FAhhpYUTXNFgQ=="],
"@tiptap/extension-image": ["@tiptap/extension-image@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-pYCUzZBgsxIvVGTzuW03cPz6PIrAo26xpoxqq4W090uMVoK0SgY5W5y0IqCdw4QyLkJ2/oNSFNc2EP9jVi1CcQ=="], "@tiptap/extension-image": ["@tiptap/extension-image@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-JO8n5YOqOs+bckPZZ3qJFFLpRbYlu4N52n/7Do0XmxEMWaa3fLcR0Rsa1v3X4dGH2T5cKQ475dWSpJQRc+x07w=="],
"@tiptap/extension-italic": ["@tiptap/extension-italic@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-yEw2S+smoVR8DMYQMAWckVW2Sstf7z5+GBZ8zm8NMGhMKb1JFCPZUv5KTTIPnq7ZrKuuZHvjN9+Ef1dRYD8T2A=="], "@tiptap/extension-italic": ["@tiptap/extension-italic@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-W/rQDo7qFL7MfwfaYEcdtbk862fOmBv30qIEwVdqElBye7BFJYKtRuWBzNbG2BwKanjwMbVc/tBXF5W1sqfT7Q=="],
"@tiptap/extension-link": ["@tiptap/extension-link@2.14.0", "", { "dependencies": { "linkifyjs": "^4.2.0" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-fsqW7eRD2xoD6xy7eFrNPAdIuZ3eicA4jKC45Vcft/Xky0DJoIehlVBLxsPbfmv3f27EBrtPkg5+msLXkLyzJA=="], "@tiptap/extension-link": ["@tiptap/extension-link@2.22.3", "", { "dependencies": { "linkifyjs": "^4.2.0" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-05whzrw8uuRHpFah27a+K3XVjZ78aifO1C5ncQiEgjG8oMbaPG0FpU7yJ9awNtr1U5dvFUEbGvkg1WDW2fLTzA=="],
"@tiptap/extension-list-item": ["@tiptap/extension-list-item@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-t1jXDPEd82sC6vZVE/12/CB52uuiydCIcRfwdh21xNgBMckToKO9S0K6XEp4ROtrKQdlIH2JDVPfpUBvVrYN8Q=="], "@tiptap/extension-list-item": ["@tiptap/extension-list-item@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-B7Fze+eM1sYbGOZtDDAwAivnj1ow2wN5RqaQPC1la3wdTK4Wgp7bdzGjvUbrN6gp3zMFCEWlqP2toc/mRAHCtA=="],
"@tiptap/extension-mention": ["@tiptap/extension-mention@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0", "@tiptap/suggestion": "^2.7.0" } }, "sha512-mmEv5rBOn9b90hcp0iQg/YWxJPgthfBD6Rp8FRbYauB7laiBUa7rhT5iuY9nj3UFUy8009lEZjc1gvtkC9B9ug=="], "@tiptap/extension-mention": ["@tiptap/extension-mention@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0", "@tiptap/suggestion": "^2.7.0" } }, "sha512-5OX2o8Ss0PaBAZdeOjesCKwVK63Sfvw+AA1h7Yxs+i3sODofIpkjb2Y/t5mFzR1ltlBnrPmAiCMDAp1V01k+vg=="],
"@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-QUZcyuW9AKvSfpFHcGmbyRCqxcpY0VNf0xipEtogxbA+JDDw3ZSPqU1dUgz9wk00RahPTwNDdY5aVjdQ5N4N9Q=="], "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-pHGkuZhV/uAAHI9vzk/lpAkbdpMT4wUR1FI17/GE3zNrogfzx0VopCQrXq4+sQVsLUW4I6Cj6VeBjm9wB6qlIw=="],
"@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-bsQesVpgvDS2e+wr2fp59QO7rWRp2FqcJvBafwXS3Br9U5Mx3eFYryx4wC7cUnhlhUwX5pmaoA7zISgV9dZDgg=="], "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-TYvgS7CweNFo/xVxsKWSt0wnm46Y8OtsfDSjnLbSC4Pj4ZNa6PU3zpvDTW+UxYakr+8zIPvI2WgLBkyTHq6oQA=="],
"@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-xzfjHvuukbch4i5O/5uyS2K2QgNEaMKi6e6GExTTgVwnFjKfJmgTqee33tt5JCqSItBvtSZlU3SX/vpiaIof+w=="], "@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-kYrO2iTOtGRr6IaVsaWSWCJmQZL7wuPOl19AmTxIJaxsiOgViocuoU5k14Fd6pU06yn8jmglD+Rirrn6eW5+5g=="],
"@tiptap/extension-strike": ["@tiptap/extension-strike@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-rD5d/IL3XPfBOrHRHxt+b+0X1jbIbWONGiad/3sX0ZYQD3PandtCWboH40r/J5tFksebuY12dVYyYQKgLpDBOQ=="], "@tiptap/extension-strike": ["@tiptap/extension-strike@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-I+s2Csw2cTHae2vFJiojnHK+NnQjDr6441mSlAd+e7kEly1kjZ4g7J+JMj02ajNQhr/ob8/hb5r6EdIyv2xtoA=="],
"@tiptap/extension-subscript": ["@tiptap/extension-subscript@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-1gQucSZ6WqhKukc8YA7ZfQzBYaVY00F6G7+trD2iWSm6EpiabaUVP0vMjuonIiujTioEwe04KmZuC9ZLbEU9dQ=="], "@tiptap/extension-subscript": ["@tiptap/extension-subscript@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-YfhlYUXRJ7Eazkaweimm6PORGRfPYiRgh3xB4P+v70GevibGOUxSvp9HAuDlq/mpR8mkMQgXcXxT5GnEAFkS3A=="],
"@tiptap/extension-superscript": ["@tiptap/extension-superscript@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-BnsqY9TxN15KxxoX1rulL0sV0Wu3umD4Un0E90LZ5G/QRrVUeohAuOiraqRJ4GnJPVJBR2H0+7Sg5sKqYuIpnQ=="], "@tiptap/extension-superscript": ["@tiptap/extension-superscript@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-k+aA60szjWLX1y98BPTlQ6mdv2Wb0kMDh0lI2PoH6Lq+L6AA8aL9fv5I6Jnkw1BiVJw7puKHtByCZIH19V3LyQ=="],
"@tiptap/extension-task-item": ["@tiptap/extension-task-item@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-MFE928s1J2ACyjOlkx52D/+r6aqz6c516C0tvnP2vzrkijFaSMNY4Xg7L1wTinzIdijh184AYQpyw7LezJa1ug=="], "@tiptap/extension-task-item": ["@tiptap/extension-task-item@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-aVfSa2dLF77bfXpAlrsfPUNdhiHJhw3VJ/pnCTxrEnBXYilDuH59AhtU6DygSNhMZWUgzI4OPqf3crF+yzrHag=="],
"@tiptap/extension-task-list": ["@tiptap/extension-task-list@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-o2VELXgkDIHS15pnF1W2OFfxZGvo9V6RcwjzCYUS0mqMF9TTbfHwddRcv4t3pifpMO3sWhspVARavJAGaP5zdQ=="], "@tiptap/extension-task-list": ["@tiptap/extension-task-list@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-prOnD/S6mHOhzj2CLvd4Q/GJymyJMcdgTTJaI+Yk/Plup1OuH6fRlBdo67Tve0xzeQz4sfxrzp9kQ6EsEwhv0w=="],
"@tiptap/extension-text": ["@tiptap/extension-text@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-rHny566nGZHq61zRLwQ9BPG55W/O+eDKwUJl+LhrLiVWwzpvAl9QQYixtoxJKOY48VK41PKwxe3bgDYgNs/Fhg=="], "@tiptap/extension-text": ["@tiptap/extension-text@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-07cymWkPTfq6nuum88Yf90YYArbowed8nNiu0Tw3jCvwpzf9J9TDaovT+LAKuSKtrOsnNpFB/9IqUwFxZepOGw=="],
"@tiptap/extension-text-style": ["@tiptap/extension-text-style@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-dl0oi2i0rjLpBqTf4wGy6SLidvPpjxLcmX727pwJlCklkFJVDf8wSFeD4ddxJXiD2Rwef0D/lkcwXSY73CoDcA=="], "@tiptap/extension-text-style": ["@tiptap/extension-text-style@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-M3FLOUPcO8fR+rM97mR2gQ54KFkdlAUQtEPKQpO1f312gtcVdBNxgq0WgqTnBY7thWLyqQSKiAsL6y88+JddSA=="],
"@tiptap/extension-underline": ["@tiptap/extension-underline@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-rlBasbwElFikaL5qPyp3OeoEBH2p9Dve0K6liqIWF4i9cECH2Bm53y2S0enVEe01hmgQEWmoYK+fq67rxr3XsQ=="], "@tiptap/extension-underline": ["@tiptap/extension-underline@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-floLjh1UbQ2pKgdwfw7qCAJ5VojvH1uqj7xW2RCv79aWYUuJCPD6UBpaBOt/jv7gXDJJ9EeV3m2Hga49CXBrEQ=="],
"@tiptap/pm": ["@tiptap/pm@2.14.0", "", { "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-collab": "^1.3.1", "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-inputrules": "^1.4.0", "prosemirror-keymap": "^1.2.2", "prosemirror-markdown": "^1.13.1", "prosemirror-menu": "^1.2.4", "prosemirror-model": "^1.23.0", "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.4.1", "prosemirror-state": "^1.4.3", "prosemirror-tables": "^1.6.4", "prosemirror-trailing-node": "^3.0.0", "prosemirror-transform": "^1.10.2", "prosemirror-view": "^1.37.0" } }, "sha512-cnsfaIlvTFCDtLP/A2Fd3LmpttgY0O/tuTM2fC71vetONz83wUTYT+aD9uvxdX0GkSocoh840b0TsEazbBxhpA=="], "@tiptap/pm": ["@tiptap/pm@2.22.3", "", { "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-collab": "^1.3.1", "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-inputrules": "^1.4.0", "prosemirror-keymap": "^1.2.2", "prosemirror-markdown": "^1.13.1", "prosemirror-menu": "^1.2.4", "prosemirror-model": "^1.23.0", "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.4.1", "prosemirror-state": "^1.4.3", "prosemirror-tables": "^1.6.4", "prosemirror-trailing-node": "^3.0.0", "prosemirror-transform": "^1.10.2", "prosemirror-view": "^1.37.0" } }, "sha512-uWPeIScnpQVCYdTnL140XgcvbT1qH288CstMJ6S0Y11lC5PclPK9CxfAipsqgWWrIK7yatxKUVCg6TzfG9zpmA=="],
"@tiptap/starter-kit": ["@tiptap/starter-kit@2.14.0", "", { "dependencies": { "@tiptap/core": "^2.14.0", "@tiptap/extension-blockquote": "^2.14.0", "@tiptap/extension-bold": "^2.14.0", "@tiptap/extension-bullet-list": "^2.14.0", "@tiptap/extension-code": "^2.14.0", "@tiptap/extension-code-block": "^2.14.0", "@tiptap/extension-document": "^2.14.0", "@tiptap/extension-dropcursor": "^2.14.0", "@tiptap/extension-gapcursor": "^2.14.0", "@tiptap/extension-hard-break": "^2.14.0", "@tiptap/extension-heading": "^2.14.0", "@tiptap/extension-history": "^2.14.0", "@tiptap/extension-horizontal-rule": "^2.14.0", "@tiptap/extension-italic": "^2.14.0", "@tiptap/extension-list-item": "^2.14.0", "@tiptap/extension-ordered-list": "^2.14.0", "@tiptap/extension-paragraph": "^2.14.0", "@tiptap/extension-strike": "^2.14.0", "@tiptap/extension-text": "^2.14.0", "@tiptap/extension-text-style": "^2.14.0", "@tiptap/pm": "^2.14.0" } }, "sha512-Z1bKAfHl14quRI3McmdU+bs675jp6/iexEQTI9M9oHa6l3McFF38g9N3xRpPPX02MX83DghsUPupndUW/yJvEQ=="], "@tiptap/starter-kit": ["@tiptap/starter-kit@2.22.3", "", { "dependencies": { "@tiptap/core": "^2.22.3", "@tiptap/extension-blockquote": "^2.22.3", "@tiptap/extension-bold": "^2.22.3", "@tiptap/extension-bullet-list": "^2.22.3", "@tiptap/extension-code": "^2.22.3", "@tiptap/extension-code-block": "^2.22.3", "@tiptap/extension-document": "^2.22.3", "@tiptap/extension-dropcursor": "^2.22.3", "@tiptap/extension-gapcursor": "^2.22.3", "@tiptap/extension-hard-break": "^2.22.3", "@tiptap/extension-heading": "^2.22.3", "@tiptap/extension-history": "^2.22.3", "@tiptap/extension-horizontal-rule": "^2.22.3", "@tiptap/extension-italic": "^2.22.3", "@tiptap/extension-list-item": "^2.22.3", "@tiptap/extension-ordered-list": "^2.22.3", "@tiptap/extension-paragraph": "^2.22.3", "@tiptap/extension-strike": "^2.22.3", "@tiptap/extension-text": "^2.22.3", "@tiptap/extension-text-style": "^2.22.3", "@tiptap/pm": "^2.22.3" } }, "sha512-GkvheaR2ORnHJ9g9R6xIT38w2uppGja/iAIrXLZ9vY1QuR+0cya/ZZ5vKU6r9C2PeyBs3aKYxRD1/j3HDhuGXw=="],
"@tiptap/suggestion": ["@tiptap/suggestion@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-AXzEw0KYIyg5id8gz5geIffnBtkZqan5MWe29rGo3gXTfKH+Ik8tWbZdnlMVheycsUCllrymDRei4zw9DqVqkQ=="], "@tiptap/suggestion": ["@tiptap/suggestion@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-B/X1U4HXXos6h7qqdf0MgWhlB8G4CFLJUiGBuVySlLG7BIyr9KfLrE+/G/5iaLWjAlQC5HgxB8uIO7wfCQl6fA=="],
"@tiptap/vue-3": ["@tiptap/vue-3@2.14.0", "", { "dependencies": { "@tiptap/extension-bubble-menu": "^2.14.0", "@tiptap/extension-floating-menu": "^2.14.0" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0", "vue": "^3.0.0" } }, "sha512-w7jzOYmaNgL/1p4q3wRJf4NdvO23IvOgGR6sUM/3ULtjG0dchn9JMpD3Vm7Y9FLSKBcwAWZim4gR6PFIvIsETA=="], "@tiptap/vue-3": ["@tiptap/vue-3@2.22.3", "", { "dependencies": { "@tiptap/extension-bubble-menu": "^2.22.3", "@tiptap/extension-floating-menu": "^2.22.3" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0", "vue": "^3.0.0" } }, "sha512-bndOqQJzFy/vTFib8jTG47CE86KJsgl+9+3Wp1qJNQMDKNoNvV2NQq46fb1eLGw2ZOaMH8+AGkOaUCiWxmreLg=="],
"@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="],
@ -844,13 +844,13 @@
"@vue/shared": ["@vue/shared@3.5.17", "", {}, "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg=="], "@vue/shared": ["@vue/shared@3.5.17", "", {}, "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg=="],
"@vueuse/core": ["@vueuse/core@13.3.0", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "13.3.0", "@vueuse/shared": "13.3.0" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-uYRz5oEfebHCoRhK4moXFM3NSCd5vu2XMLOq/Riz5FdqZMy2RvBtazdtL3gEcmDyqkztDe9ZP/zymObMIbiYSg=="], "@vueuse/core": ["@vueuse/core@13.4.0", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "13.4.0", "@vueuse/shared": "13.4.0" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-OnK7zW3bTq/QclEk17+vDFN3tuAm8ONb9zQUIHrYQkkFesu3WeGUx/3YzpEp+ly53IfDAT9rsYXgGW6piNZC5w=="],
"@vueuse/metadata": ["@vueuse/metadata@13.3.0", "", {}, "sha512-42IzJIOYCKIb0Yjv1JfaKpx8JlCiTmtCWrPxt7Ja6Wzoq0h79+YVXmBV03N966KEmDEESTbp5R/qO3AB5BDnGw=="], "@vueuse/metadata": ["@vueuse/metadata@13.4.0", "", {}, "sha512-CPDQ/IgOeWbqItg1c/pS+Ulum63MNbpJ4eecjFJqgD/JUCJ822zLfpw6M9HzSvL6wbzMieOtIAW/H8deQASKHg=="],
"@vueuse/nuxt": ["@vueuse/nuxt@13.3.0", "", { "dependencies": { "@nuxt/kit": "^3.17.4", "@vueuse/core": "13.3.0", "@vueuse/metadata": "13.3.0", "local-pkg": "^1.1.1" }, "peerDependencies": { "nuxt": "^3.0.0 || ^4.0.0-0", "vue": "^3.5.0" } }, "sha512-7Sw9xZAKqp3NCqwY1LixtkMS0/OH3Y+f8zELlq3Yn9k53ntsvWMKzL2RNKWmhMCAZqaLHBJLBB3q+J+NNrDqXQ=="], "@vueuse/nuxt": ["@vueuse/nuxt@13.4.0", "", { "dependencies": { "@nuxt/kit": "^3.17.5", "@vueuse/core": "13.4.0", "@vueuse/metadata": "13.4.0", "local-pkg": "^1.1.1" }, "peerDependencies": { "nuxt": "^3.0.0 || ^4.0.0-0", "vue": "^3.5.0" } }, "sha512-0NY8CXQVTZhPipgfUyK9TuEP+tIiy1PteDVPcjdCkDqyGzhrUef4/6j7FeVn/YGgOFqFWfgdrmayESMwHv/onQ=="],
"@vueuse/shared": ["@vueuse/shared@13.3.0", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-L1QKsF0Eg9tiZSFXTgodYnu0Rsa2P0En2LuLrIs/jgrkyiDuJSsPZK+tx+wU0mMsYHUYEjNsuE41uqqkuR8VhA=="], "@vueuse/shared": ["@vueuse/shared@13.4.0", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-+AxuKbw8R1gYy5T21V5yhadeNM7rJqb4cPaRI9DdGnnNl3uqXh+unvQ3uCaA2DjYLbNr1+l7ht/B4qEsRegX6A=="],
"@whatwg-node/disposablestack": ["@whatwg-node/disposablestack@0.0.6", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.6.3" } }, "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw=="], "@whatwg-node/disposablestack": ["@whatwg-node/disposablestack@0.0.6", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.6.3" } }, "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw=="],
@ -1638,7 +1638,7 @@
"lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
"lucide-vue-next": ["lucide-vue-next@0.517.0", "", { "peerDependencies": { "vue": ">=3.0.1" } }, "sha512-kTrZCEaK2C918CCCeLdI6kTj8eSx1fXKN9bQM/eFpRi5E1be4/g1TDsKhorZLfXdpzpsub3zBtAe4btQsOW23A=="], "lucide-vue-next": ["lucide-vue-next@0.523.0", "", { "peerDependencies": { "vue": ">=3.0.1" } }, "sha512-PLbjArdcFgUcJLtszpCzGyaGm4AUfZ/SzDKfPjhkoEpG6j5k6fS3AGbMEbwt/xGJdD9DuSEgypNT/eqSPLfHfw=="],
"luxon": ["luxon@3.6.1", "", {}, "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ=="], "luxon": ["luxon@3.6.1", "", {}, "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ=="],
@ -2180,7 +2180,7 @@
"tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="], "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="],
"tailwindcss": ["tailwindcss@4.1.10", "", {}, "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA=="], "tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="],
"tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="],
@ -2364,7 +2364,7 @@
"vue-router": ["vue-router@4.5.1", "", { "dependencies": { "@vue/devtools-api": "^6.6.4" }, "peerDependencies": { "vue": "^3.2.0" } }, "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw=="], "vue-router": ["vue-router@4.5.1", "", { "dependencies": { "@vue/devtools-api": "^6.6.4" }, "peerDependencies": { "vue": "^3.2.0" } }, "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw=="],
"vue-sonner": ["vue-sonner@2.0.0", "", {}, "sha512-nvlqGGWvxEv9UnKcZxsGdKpHrODEdv3CXAJF3er+1pLC03caJt2+v9HuWtRqlBQwUr1SFttsYuwVbpbEl05n4A=="], "vue-sonner": ["vue-sonner@2.0.1", "", {}, "sha512-sn4vjCRzRcnMaxaLa9aNSyZQi6S+gshiea5Lc3eqpkj0ES9LH8ljg+WJCkxefr28V4PZ9xkUXBIWpxGfQxstIg=="],
"vue-tsc": ["vue-tsc@2.2.10", "", { "dependencies": { "@volar/typescript": "~2.4.11", "@vue/language-core": "2.2.10" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ=="], "vue-tsc": ["vue-tsc@2.2.10", "", { "dependencies": { "@volar/typescript": "~2.4.11", "@vue/language-core": "2.2.10" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ=="],

View file

@ -0,0 +1,18 @@
<template>
<Tooltip>
<TooltipTrigger as="div">
<slot />
</TooltipTrigger>
<TooltipContent>
<p>{{ tooltip }}</p>
</TooltipContent>
</Tooltip>
</template>
<script lang="ts" setup>
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip";
const { tooltip } = defineProps<{
tooltip: string;
}>();
</script>

View file

@ -0,0 +1,84 @@
<template>
<ComposerButton :tooltip="m.game_tough_seal_adore()">
<Button variant="ghost" size="icon">
<AtSign class="!size-5" />
</Button>
</ComposerButton>
<ComposerButton :tooltip="m.plane_born_koala_hope()">
<Toggle variant="default" size="sm" :model-value="contentType === 'text/html'" @update:model-value="
(i) =>
(contentType = i ? 'text/html' : 'text/plain')
">
<LetterText class="!size-5" />
</Toggle>
</ComposerButton>
<VisibilityPicker v-model:visibility="visibility">
<Button variant="ghost" size="icon" :disabled="relation?.type === 'edit'">
<component :is="visibilities[visibility].icon" />
</Button>
</VisibilityPicker>
<ComposerButton :tooltip="m.blue_ornate_coyote_tickle()">
<Button variant="ghost" size="icon">
<Smile class="!size-5" />
</Button>
</ComposerButton>
<ComposerButton :tooltip="m.top_patchy_earthworm_vent()">
<Button variant="ghost" size="icon" @click="emit('pickFile')">
<FilePlus2 class="!size-5" />
</Button>
</ComposerButton>
<ComposerButton :tooltip="m.frail_broad_mallard_dart()">
<Toggle variant="default" size="sm" v-model="sensitive">
<TriangleAlert class="!size-5" />
</Toggle>
</ComposerButton>
<CharacterCounter class="ml-auto" :max="(identity as Identity).instance.configuration.statuses.max_characters" :current="rawContent.length" />
<Button type="submit" size="lg" :disabled="sending || !canSend" @click="emit('submit')">
<Loader v-if="sending" class="!size-5 animate-spin" />
{{
relation?.type === "edit"
? m.gaudy_strong_puma_slide()
: m.free_teal_bulldog_learn()
}}
</Button>
</template>
<script lang="ts" setup>
import {
AtSign,
FilePlus2,
LetterText,
Loader,
Smile,
TriangleAlert,
} from "lucide-vue-next";
import * as m from "~/paraglide/messages.js";
import { Button } from "../ui/button";
import { Toggle } from "../ui/toggle";
import ComposerButton from "./button.vue";
import CharacterCounter from "./character-counter.vue";
import { type ComposerState, visibilities } from "./composer";
import VisibilityPicker from "./visibility-picker.vue";
const { relation, sending, canSend, rawContent } = defineProps<{
relation?: ComposerState["relation"];
sending: boolean;
canSend: boolean;
rawContent: string;
}>();
const contentType = defineModel<ComposerState["contentType"]>("contentType", {
required: true,
});
const visibility = defineModel<ComposerState["visibility"]>("visibility", {
required: true,
});
const sensitive = defineModel<ComposerState["sensitive"]>("sensitive", {
required: true,
});
const emit = defineEmits<{
submit: [];
pickFile: [];
}>();
</script>

View file

@ -0,0 +1,39 @@
<template>
<Tooltip>
<TooltipTrigger as-child>
<div v-bind="$attrs" class="m-1">
<TriangleAlert v-if="isOverflowing" class="text-destructive-foreground size-6" />
<svg v-else viewBox="0 0 100 100" class="transform rotate-[-90deg] size-6">
<!-- Background Circle -->
<circle cx="50" cy="50" r="46" stroke="currentColor" class="text-muted" stroke-width="8"
fill="none" />
<!-- Progress Circle -->
<circle cx="50" cy="50" r="46" stroke="currentColor" stroke-width="8" fill="none"
stroke-dasharray="100" :stroke-dashoffset="100 - percentage" pathLength="100"
stroke-linecap="round" class="text-accent-foreground transition-all duration-500" />
</svg>
</div>
</TooltipTrigger>
<TooltipContent class="text-center">
<p>{{ current }} / {{ max }}</p>
<p v-if="isOverflowing">Too long!</p>
</TooltipContent>
</Tooltip>
</template>
<script lang="ts" setup>
import { TriangleAlert } from "lucide-vue-next";
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip";
const { max, current } = defineProps<{
max: number;
current: number;
}>();
const percentage = computed(() => {
return Math.min((current / max) * 100, 100);
});
const isOverflowing = computed(() => {
return current > max;
});
</script>

View file

@ -0,0 +1,240 @@
import type { ResponseError } from "@versia/client";
import type { Attachment, Status, StatusSource } from "@versia/client/schemas";
import { AtSign, Globe, Lock, LockOpen } from "lucide-vue-next";
import type { FunctionalComponent } from "vue";
import { toast } from "vue-sonner";
import type { z } from "zod";
import * as m from "~/paraglide/messages.js";
export interface ComposerState {
relation?: {
type: "reply" | "quote" | "edit";
note: z.infer<typeof Status>;
source?: z.infer<typeof StatusSource>;
};
content: string;
rawContent: string;
sensitive: boolean;
contentWarning: string;
contentType: "text/html" | "text/plain";
visibility: z.infer<typeof Status.shape.visibility>;
files: {
apiId?: string;
file: File;
alt?: string;
uploading: boolean;
updating: boolean;
}[];
sending: boolean;
canSend: boolean;
}
const { play } = useAudio();
export const state = reactive<ComposerState>({
relation: undefined,
content: "",
rawContent: "",
sensitive: false,
contentWarning: "",
contentType: "text/html",
visibility: preferences.default_visibility.value,
files: [],
sending: false,
canSend: false,
});
watch(
state,
(newState) => {
const characterLimit = (identity.value as Identity).instance
.configuration.statuses.max_characters;
const characterCount = newState.rawContent.length;
state.canSend =
characterCount > 0
? characterCount <= characterLimit
: newState.files.length > 0;
},
{ immediate: true },
);
export const visibilities: Record<
z.infer<typeof Status.shape.visibility>,
{
icon: FunctionalComponent;
name: string;
text: string;
}
> = {
public: {
icon: Globe,
name: m.lost_trick_dog_grace(),
text: m.last_mean_peacock_zip(),
},
unlisted: {
icon: LockOpen,
name: m.funny_slow_jannes_walk(),
text: m.grand_strong_gibbon_race(),
},
private: {
icon: Lock,
name: m.grassy_empty_raven_startle(),
text: m.white_teal_ostrich_yell(),
},
direct: {
icon: AtSign,
name: m.pretty_bold_baboon_wave(),
text: m.lucky_mean_robin_link(),
},
};
export const getRandomSplash = (): string => {
const splashes = useConfig().COMPOSER_SPLASHES;
return splashes[Math.floor(Math.random() * splashes.length)] as string;
};
export const calculateMentionsFromReply = (
note: z.infer<typeof Status>,
): string => {
const peopleToMention = note.mentions
.concat(note.account)
// Deduplicate mentions
.filter((men, i, a) => a.indexOf(men) === i)
// Remove self
.filter((men) => men.id !== identity.value?.account.id);
if (peopleToMention.length === 0) {
return "";
}
const mentions = peopleToMention.map((me) => `@${me.acct}`).join(" ");
return `${mentions} `;
};
const fileFromUrl = (url: URL | string): Promise<File> => {
return fetch(url).then((response) => {
if (!response.ok) {
throw new Error("Failed to fetch file");
}
return response.blob().then((blob) => {
const file = new File([blob], "file", { type: blob.type });
return file;
});
});
};
export const stateFromRelation = async (
relationType: "reply" | "quote" | "edit",
note: z.infer<typeof Status>,
source?: z.infer<typeof StatusSource>,
): Promise<void> => {
state.relation = {
type: relationType,
note,
source,
};
state.content = note.content || calculateMentionsFromReply(note);
state.rawContent = source?.text || "";
if (relationType === "edit") {
state.sensitive = note.sensitive;
state.contentWarning = source?.spoiler_text || note.spoiler_text;
state.visibility = note.visibility;
state.files = await Promise.all(
note.media_attachments.map(async (file) => ({
apiId: file.id,
alt: file.description ?? undefined,
file: await fileFromUrl(file.url),
uploading: false,
updating: false,
})),
);
}
};
export const uploadFile = (file: File): Promise<void> => {
const index =
state.files.push({
file,
uploading: true,
updating: false,
}) - 1;
return client.value
.uploadMedia(file)
.then((media) => {
if (!state.files[index]) {
throw new Error("File not found");
}
state.files[index].uploading = false;
state.files[index].apiId = (
media.data as z.infer<typeof Attachment>
).id;
})
.catch(() => {
state.files.splice(index, 1);
});
};
export const send = async (): Promise<void> => {
if (state.sending) {
return;
}
state.sending = true;
try {
if (state.relation?.type === "edit") {
const { data } = await client.value.editStatus(
state.relation.note.id,
{
status: state.content,
content_type: state.contentType,
sensitive: state.sensitive,
spoiler_text: state.sensitive
? state.contentWarning
: undefined,
media_ids: state.files
.map((f) => f.apiId)
.filter((f) => f !== undefined),
},
);
useEvent("composer:send-edit", data);
play("publish");
useEvent("composer:close");
} else {
const { data } = await client.value.postStatus(state.content, {
content_type: state.contentType,
sensitive: state.sensitive,
spoiler_text: state.sensitive
? state.contentWarning
: undefined,
media_ids: state.files
.map((f) => f.apiId)
.filter((f) => f !== undefined),
quote_id:
state.relation?.type === "quote"
? state.relation.note.id
: undefined,
in_reply_to_id:
state.relation?.type === "reply"
? state.relation.note.id
: undefined,
visibility: state.visibility,
});
useEvent("composer:send", data as z.infer<typeof Status>);
play("publish");
useEvent("composer:close");
}
} catch (e) {
toast.error((e as ResponseError).message);
} finally {
state.sending = false;
}
};

View file

@ -3,358 +3,81 @@
<Note :note="relation.note" :hide-actions="true" :small-layout="true" /> <Note :note="relation.note" :hide-actions="true" :small-layout="true" />
</div> </div>
<Input <ContentWarning v-if="state.sensitive" v-model="state.contentWarning" />
v-model:model-value="state.contentWarning"
v-if="state.sensitive"
placeholder="Put your content warning here"
/>
<EditorContent <EditorContent @paste-files="uploadFiles" v-model:content="state.content" v-model:raw-content="state.rawContent" :placeholder="getRandomSplash()"
v-model:content="state.content"
:placeholder="chosenSplash"
class="*:!border-none *:!ring-0 *:!outline-none *:rounded-none p-0 *:max-h-[50dvh] *:overflow-y-auto *:min-h-48 *:!ring-offset-0 *:h-full" class="*:!border-none *:!ring-0 *:!outline-none *:rounded-none p-0 *:max-h-[50dvh] *:overflow-y-auto *:min-h-48 *:!ring-offset-0 *:h-full"
:disabled="sending" :disabled="state.sending" :mode="state.contentType === 'text/html' ? 'rich' : 'plain'" />
:mode="state.contentType === 'text/html' ? 'rich' : 'plain'"
/>
<div class="w-full flex flex-row gap-2 overflow-x-auto *:shrink-0 pb-2"> <div class="w-full flex flex-row gap-2 overflow-x-auto *:shrink-0 pb-2">
<input <input type="file" ref="fileInput" @change="uploadFileFromEvent" class="hidden" multiple />
type="file"
ref="fileInput"
@change="uploadFileFromEvent"
class="hidden"
multiple
/>
<Files v-model:files="state.files" /> <Files v-model:files="state.files" />
</div> </div>
<DialogFooter class="items-center flex-row"> <DialogFooter class="items-center flex-row overflow-x-auto">
<Tooltip> <ComposerButtons @submit="send" @pick-file="fileInput?.click()" v-model:content-type="state.contentType" v-model:sensitive="state.sensitive" v-model:visibility="state.visibility" :relation="state.relation" :sending="state.sending" :can-send="state.canSend" :raw-content="state.rawContent" />
<TooltipTrigger as="div">
<Button variant="ghost" size="icon">
<AtSign class="!size-5" />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>{{ m.game_tough_seal_adore() }}</p>
</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger as="div">
<Toggle
variant="default"
size="sm"
:model-value="state.contentType === 'text/html'"
@update:model-value="
(i) =>
(state.contentType = i ? 'text/html' : 'text/plain')
"
>
<LetterText class="!size-5" />
</Toggle>
</TooltipTrigger>
<TooltipContent>
<p>{{ m.plane_born_koala_hope() }}</p>
</TooltipContent>
</Tooltip>
<Select v-model:model-value="state.visibility">
<SelectTrigger
:as-child="true"
:disabled="relation?.type === 'edit'"
:disable-default-classes="true"
:disable-select-icon="true"
>
<Button variant="ghost" size="icon">
<component
:is="visibilities[state.visibility].icon"
/>
</Button>
</SelectTrigger>
<SelectContent>
<SelectItem
v-for="(v, k) in visibilities"
:key="k"
@click="state.visibility = k"
:value="k"
>
<div
class="flex flex-row gap-4 items-center w-full justify-between"
>
<div class="flex flex-col gap-1">
<span class="font-semibold">{{ v.name }}</span>
<span>{{ v.text }}</span>
</div>
<component :is="v.icon" class="!size-5" />
</div>
</SelectItem>
</SelectContent>
</Select>
<Tooltip>
<TooltipTrigger as="div">
<Button variant="ghost" size="icon">
<Smile class="!size-5" />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>{{ m.blue_ornate_coyote_tickle() }}</p>
</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger as="div">
<Button variant="ghost" size="icon" @click="fileInput?.click()">
<FilePlus2 class="!size-5" />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>{{ m.top_patchy_earthworm_vent() }}</p>
</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger as="div">
<Toggle variant="default" size="sm" v-model="state.sensitive">
<TriangleAlert class="!size-5" />
</Toggle>
</TooltipTrigger>
<TooltipContent>
<p>{{ m.frail_broad_mallard_dart() }}</p>
</TooltipContent>
</Tooltip>
<Button
type="submit"
size="lg"
class="ml-auto"
:disabled="sending"
@click="submit"
>
<Loader v-if="sending" class="!size-5 animate-spin" />
{{
relation?.type === "edit"
? m.gaudy_strong_puma_slide()
: m.free_teal_bulldog_learn()
}}
</Button>
</DialogFooter> </DialogFooter>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { ResponseError } from "@versia/client";
import type { Attachment, Status, StatusSource } from "@versia/client/schemas";
import {
AtSign,
FilePlus2,
Globe,
LetterText,
Loader,
Lock,
LockOpen,
Smile,
TriangleAlert,
} from "lucide-vue-next";
import { toast } from "vue-sonner";
import type { z } from "zod";
import Note from "~/components/notes/note.vue"; import Note from "~/components/notes/note.vue";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
} from "~/components/ui/select";
import * as m from "~/paraglide/messages.js";
import EditorContent from "../editor/content.vue"; import EditorContent from "../editor/content.vue";
import { Button } from "../ui/button";
import { DialogFooter } from "../ui/dialog"; import { DialogFooter } from "../ui/dialog";
import { Input } from "../ui/input"; import ComposerButtons from "./buttons.vue";
import { Toggle } from "../ui/toggle"; import {
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip"; type ComposerState,
getRandomSplash,
send,
state,
stateFromRelation,
uploadFile,
} from "./composer";
import ContentWarning from "./content-warning.vue";
import Files from "./files.vue"; import Files from "./files.vue";
const { Control_Enter, Command_Enter } = useMagicKeys(); const { Control_Enter, Command_Enter } = useMagicKeys();
const { play } = useAudio(); const fileInput = useTemplateRef<HTMLInputElement>("fileInput");
const fileInput = ref<HTMLInputElement | null>(null);
watch([Control_Enter, Command_Enter], () => { watch([Control_Enter, Command_Enter], () => {
if (sending.value || !preferences.ctrl_enter_send.value) { if (state.sending || !preferences.ctrl_enter_send.value) {
return; return;
} }
submit(); send();
}); });
const { relation } = defineProps<{ const props = defineProps<{
relation?: { relation?: ComposerState["relation"];
type: "reply" | "quote" | "edit";
note: z.infer<typeof Status>;
source?: z.infer<typeof StatusSource>;
};
}>(); }>();
const getMentions = () => { watch(
if (!relation || relation.type !== "reply") { props,
return ""; async (props) => {
if (props.relation) {
await stateFromRelation(
props.relation.type,
props.relation.note,
props.relation.source,
);
} }
},
const note = relation.note.reblog || relation.note; { immediate: true },
);
const peopleToMention = note.mentions
.concat(note.account)
// Deduplicate mentions
.filter((men, i, a) => a.indexOf(men) === i)
// Remove self
.filter((men) => men.id !== identity.value?.account.id);
if (peopleToMention.length === 0) {
return "";
}
const mentions = peopleToMention.map((me) => `@${me.acct}`).join(" ");
return `${mentions} `;
};
const state = reactive({
// If editing, use the original content
// If sending a reply, prefill with mentions
content: relation?.source?.text || getMentions(),
sensitive: relation?.type === "edit" ? relation.note.sensitive : false,
contentWarning: relation?.type === "edit" ? relation.note.spoiler_text : "",
contentType: "text/html" as "text/html" | "text/plain",
visibility:
relation?.type === "edit"
? relation.note.visibility
: preferences.default_visibility.value,
files: (relation?.type === "edit"
? relation.note.media_attachments.map((a) => ({
apiId: a.id,
file: new File([], a.url),
alt: a.description,
uploading: false,
updating: false,
}))
: []) as {
apiId?: string;
file: File;
alt?: string;
uploading: boolean;
updating: boolean;
}[],
});
const sending = ref(false);
const splashes = useConfig().COMPOSER_SPLASHES;
const chosenSplash = splashes[Math.floor(Math.random() * splashes.length)];
const submit = async () => {
sending.value = true;
try {
if (relation?.type === "edit") {
const { data } = await client.value.editStatus(relation.note.id, {
status: state.content,
content_type: state.contentType,
sensitive: state.sensitive,
spoiler_text: state.sensitive
? state.contentWarning
: undefined,
media_ids: state.files
.map((f) => f.apiId)
.filter((f) => f !== undefined),
});
useEvent("composer:send-edit", data);
play("publish");
useEvent("composer:close");
} else {
const { data } = await client.value.postStatus(state.content, {
content_type: state.contentType,
sensitive: state.sensitive,
spoiler_text: state.sensitive
? state.contentWarning
: undefined,
media_ids: state.files
.map((f) => f.apiId)
.filter((f) => f !== undefined),
quote_id:
relation?.type === "quote" ? relation.note.id : undefined,
in_reply_to_id:
relation?.type === "reply" ? relation.note.id : undefined,
visibility: state.visibility,
});
useEvent("composer:send", data as z.infer<typeof Status>);
play("publish");
useEvent("composer:close");
}
} catch (_e) {
const e = _e as ResponseError;
toast.error(e.message);
} finally {
sending.value = false;
}
};
const uploadFileFromEvent = (e: Event) => { const uploadFileFromEvent = (e: Event) => {
const target = e.target as HTMLInputElement; const target = e.target as HTMLInputElement;
const files = Array.from(target.files ?? []); const files = Array.from(target.files ?? []);
uploadFiles(files); for (const file of files) {
uploadFile(file);
}
target.value = ""; target.value = "";
}; };
const uploadFiles = (files: File[]) => { const uploadFiles = (files: File[]) => {
for (const file of files) { for (const file of files) {
state.files.push({ uploadFile(file);
file,
uploading: true,
updating: false,
});
client.value
.uploadMedia(file)
.then((media) => {
const index = state.files.findIndex((f) => f.file === file);
if (!state.files[index]) {
return;
} }
state.files[index].apiId = (
media.data as z.infer<typeof Attachment>
).id;
state.files[index].uploading = false;
})
.catch(() => {
const index = state.files.findIndex((f) => f.file === file);
if (!state.files[index]) {
return;
}
state.files.splice(index, 1);
});
}
};
const visibilities = {
public: {
icon: Globe,
name: m.lost_trick_dog_grace(),
text: m.last_mean_peacock_zip(),
},
unlisted: {
icon: LockOpen,
name: m.funny_slow_jannes_walk(),
text: m.grand_strong_gibbon_race(),
},
private: {
icon: Lock,
name: m.grassy_empty_raven_startle(),
text: m.white_teal_ostrich_yell(),
},
direct: {
icon: AtSign,
name: m.pretty_bold_baboon_wave(),
text: m.lucky_mean_robin_link(),
},
}; };
</script> </script>

View file

@ -0,0 +1,9 @@
<template>
<Input v-model:model-value="contentWarning" placeholder="Put your content warning here" />
</template>
<script lang="ts" setup>
import { Input } from "../ui/input";
const contentWarning = defineModel<string>();
</script>

View file

@ -1,13 +1,13 @@
<script setup lang="ts"> <script setup lang="ts">
import type { Status, StatusSource } from "@versia/client/schemas";
import { toast } from "vue-sonner";
import type { z } from "zod";
import { import {
Dialog, Dialog,
DialogContent, DialogContent,
DialogDescription, DialogDescription,
DialogTitle, DialogTitle,
} from "@/components/ui/dialog"; } from "@/components/ui/dialog";
import type { Status, StatusSource } from "@versia/client/schemas";
import { toast } from "vue-sonner";
import type { z } from "zod";
import * as m from "~/paraglide/messages.js"; import * as m from "~/paraglide/messages.js";
import Composer from "./composer.vue"; import Composer from "./composer.vue";
@ -79,7 +79,7 @@ const relation = ref(
> >
<DialogContent <DialogContent
:hide-close="true" :hide-close="true"
class="sm:max-w-xl max-w-full w-[calc(100%-2*0.5rem)] grid-rows-[minmax(0,1fr)_auto] max-h-[90dvh] p-5 pt-6 top-2 sm:top-1/2 translate-y-0 sm:-translate-y-1/2 rounded" class="sm:max-w-xl max-w-full w-[calc(100%-2*0.5rem)] grid-cols-1 max-h-[90dvh] p-5 pt-6 top-2 sm:top-1/2 translate-y-0 sm:-translate-y-1/2"
> >
<DialogTitle class="sr-only"> <DialogTitle class="sr-only">
{{ {{

View file

@ -5,14 +5,9 @@
:disabled="file.uploading || file.updating" :disabled="file.uploading || file.updating"
class="block bg-card text-card-foreground shadow-sm h-28 overflow-hidden rounded relative min-w-28 *:disabled:opacity-50" class="block bg-card text-card-foreground shadow-sm h-28 overflow-hidden rounded relative min-w-28 *:disabled:opacity-50"
> >
<Avatar class="h-28 w-full" shape="square"> <img :src="createObjectURL(file.file)" class="object-contain h-28 w-full" :alt="file.alt" />
<AvatarImage
class="!object-contain"
:src="createObjectURL(file.file)"
/>
</Avatar>
<Badge <Badge
v-if="file.uploading && !file.updating" v-if="!(file.uploading || file.updating)"
class="absolute bottom-1 right-1" class="absolute bottom-1 right-1"
variant="default" variant="default"
>{{ formatBytes(file.file.size) }}</Badge >{{ formatBytes(file.file.size) }}</Badge
@ -22,29 +17,27 @@
<DropdownMenuContent class="min-w-48"> <DropdownMenuContent class="min-w-48">
<DropdownMenuLabel>{{ file.file.name }}</DropdownMenuLabel> <DropdownMenuLabel>{{ file.file.name }}</DropdownMenuLabel>
<DropdownMenuSeparator /> <DropdownMenuSeparator />
<DropdownMenuItem @click="editName"> <DropdownMenuItem @click="editName">
<TextCursorInput /> <TextCursorInput />
<span>Rename</span> Rename
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem @click="editCaption"> <DropdownMenuItem @click="editCaption">
<Captions /> <Captions />
<span>Add caption</span> Add caption
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuSeparator /> <DropdownMenuSeparator />
<DropdownMenuItem @click="emit('remove')"> <DropdownMenuItem @click="emit('remove')">
<Delete /> <Delete />
<span>Remove</span> Remove
</DropdownMenuItem> </DropdownMenuItem>
</DropdownMenuContent> </DropdownMenuContent>
</DropdownMenu> </DropdownMenu>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { Captions, Delete, Loader, TextCursorInput } from "lucide-vue-next"; import { Captions, Delete, TextCursorInput } from "lucide-vue-next";
import Spinner from "~/components/graphics/spinner.vue"; import Spinner from "~/components/graphics/spinner.vue";
import { confirmModalService } from "~/components/modals/composable.ts"; import { confirmModalService } from "~/components/modals/composable.ts";
import { Avatar, AvatarImage } from "~/components/ui/avatar";
import { Badge } from "~/components/ui/badge"; import { Badge } from "~/components/ui/badge";
import { import {
DropdownMenu, DropdownMenu,
@ -54,14 +47,9 @@ import {
DropdownMenuSeparator, DropdownMenuSeparator,
DropdownMenuTrigger, DropdownMenuTrigger,
} from "~/components/ui/dropdown-menu"; } from "~/components/ui/dropdown-menu";
import type { ComposerState } from "./composer";
const file = defineModel<{ const file = defineModel<ComposerState["files"][number]>("file", {
apiId?: string;
file: File;
alt?: string;
uploading: boolean;
updating: boolean;
}>("file", {
required: true, required: true,
}); });

View file

@ -1,19 +1,13 @@
<template> <template>
<FilePreview v-for="(file, index) in files" :key="file.apiId" :file="file" @update:file="files[index] = $event" @remove="files.splice(index, 1)" /> <FilePreview v-for="(file, index) in files" :key="file.apiId" :file="file" @update:file="files[index] = $event"
@remove="files.splice(index, 1)" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { ComposerState } from "./composer";
import FilePreview from "./file-preview.vue"; import FilePreview from "./file-preview.vue";
const files = defineModel< const files = defineModel<ComposerState["files"]>("files", {
{
apiId?: string;
file: File;
alt?: string;
uploading: boolean;
updating: boolean;
}[]
>("files", {
required: true, required: true,
}); });
</script> </script>

View file

@ -0,0 +1,33 @@
<template>
<Select v-model:model-value="visibility">
<SelectTrigger as-child disable-default-classes disable-select-icon>
<slot />
</SelectTrigger>
<SelectContent>
<SelectItem v-for="(v, k) in visibilities" :key="k" @click="visibility = k" :value="k">
<div class="flex flex-row gap-3 items-center w-full justify-between">
<component :is="v.icon" class="size-4" />
<div class="flex flex-col gap-1">
<span class="font-semibold">{{ v.name }}</span>
<span>{{ v.text }}</span>
</div>
</div>
</SelectItem>
</SelectContent>
</Select>
</template>
<script lang="ts" setup>
import { Button } from "~/components/ui/button";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
} from "~/components/ui/select";
import { type ComposerState, visibilities } from "./composer";
const visibility = defineModel<ComposerState["visibility"]>("visibility", {
required: true,
});
</script>

View file

@ -17,6 +17,7 @@ import { Emoji } from "./emoji.ts";
import suggestion from "./suggestion.ts"; import suggestion from "./suggestion.ts";
const content = defineModel<string>("content"); const content = defineModel<string>("content");
const rawContent = defineModel<string>("rawContent");
const { const {
placeholder, placeholder,
disabled, disabled,
@ -27,6 +28,10 @@ const {
disabled?: boolean; disabled?: boolean;
}>(); }>();
const emit = defineEmits<{
pasteFiles: [files: File[]];
}>();
const editor = new Editor({ const editor = new Editor({
extensions: [ extensions: [
StarterKit, StarterKit,
@ -49,6 +54,15 @@ const editor = new Editor({
content: content.value, content: content.value,
onUpdate: ({ editor }) => { onUpdate: ({ editor }) => {
content.value = mode === "rich" ? editor.getHTML() : editor.getText(); content.value = mode === "rich" ? editor.getHTML() : editor.getText();
rawContent.value = editor.getText();
},
onPaste: (event) => {
// If pasting files, prevent the default behavior
if (event.clipboardData && event.clipboardData.files.length > 0) {
event.preventDefault();
const files = Array.from(event.clipboardData.files);
emit("pasteFiles", files);
}
}, },
autofocus: true, autofocus: true,
editable: !disabled, editable: !disabled,

View file

@ -24,9 +24,7 @@ declare module "@tiptap/core" {
* .commands * .commands
* .setEmoji({ shortcode: 'smile' }) * .setEmoji({ shortcode: 'smile' })
*/ */
setImage: (options: { setImage: (options: { shortcode: string }) => ReturnType;
shortcode: string;
}) => ReturnType;
}; };
} }
} }

View file

@ -29,7 +29,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Bell, Home, Pen, User } from "lucide-vue-next"; import { Bell, Home, Pen, User } from "lucide-vue-next";
import * as m from "~/paraglide/messages.js";
import { NuxtLink } from "#components"; import { NuxtLink } from "#components";
import * as m from "~/paraglide/messages.js";
import { Button } from "../ui/button"; import { Button } from "../ui/button";
</script> </script>

View file

@ -12,9 +12,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import { BedSingle, Globe, House, MapIcon } from "lucide-vue-next"; import { BedSingle, Globe, House, MapIcon } from "lucide-vue-next";
import { NuxtLink } from "#components";
import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs"; import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs";
import * as m from "~/paraglide/messages.js"; import * as m from "~/paraglide/messages.js";
import { NuxtLink } from "#components";
const timelines = [ const timelines = [
{ {

View file

@ -14,10 +14,10 @@
</template> </template>
<script lang="tsx" setup> <script lang="tsx" setup>
import { cn } from "@/lib/utils";
import { Check, Clipboard } from "lucide-vue-next"; import { Check, Clipboard } from "lucide-vue-next";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { toast } from "vue-sonner"; import { toast } from "vue-sonner";
import { cn } from "@/lib/utils";
import * as m from "~/paraglide/messages.js"; import * as m from "~/paraglide/messages.js";
const { text } = defineProps<{ const { text } = defineProps<{

View file

@ -43,7 +43,6 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import type { Account, Status } from "@versia/client/schemas"; import type { Account, Status } from "@versia/client/schemas";
import type { import type {
UseTimeAgoMessages, UseTimeAgoMessages,
@ -51,6 +50,7 @@ import type {
} from "@vueuse/core"; } from "@vueuse/core";
import { AtSign, Globe, Lock, LockOpen } from "lucide-vue-next"; import { AtSign, Globe, Lock, LockOpen } from "lucide-vue-next";
import type { z } from "zod"; import type { z } from "zod";
import { cn } from "@/lib/utils";
import { getLocale } from "~/paraglide/runtime"; import { getLocale } from "~/paraglide/runtime";
import Avatar from "../profiles/avatar.vue"; import Avatar from "../profiles/avatar.vue";
import SmallCard from "../profiles/small-card.vue"; import SmallCard from "../profiles/small-card.vue";

View file

@ -1,12 +1,4 @@
<script setup lang="tsx"> <script setup lang="tsx">
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { import {
Ban, Ban,
Code, Code,
@ -19,6 +11,14 @@ import {
Trash, Trash,
} from "lucide-vue-next"; } from "lucide-vue-next";
import { toast } from "vue-sonner"; import { toast } from "vue-sonner";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { confirmModalService } from "~/components/modals/composable.ts"; import { confirmModalService } from "~/components/modals/composable.ts";
import * as m from "~/paraglide/messages.js"; import * as m from "~/paraglide/messages.js";

View file

@ -75,9 +75,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { Status } from "@versia/client/schemas"; import type { Status } from "@versia/client/schemas";
import type { z } from "zod"; import type { z } from "zod";
import { cn } from "@/lib/utils";
import { Card, CardContent, CardFooter, CardHeader } from "../ui/card"; import { Card, CardContent, CardFooter, CardHeader } from "../ui/card";
import Actions from "./actions.vue"; import Actions from "./actions.vue";
import Content from "./content.vue"; import Content from "./content.vue";

View file

@ -43,7 +43,7 @@ import {
} from "~/components/ui/popover"; } from "~/components/ui/popover";
import CategoryHeader from "./category-header.vue"; import CategoryHeader from "./category-header.vue";
import EmojiDisplay from "./display.vue"; import EmojiDisplay from "./display.vue";
import { type EmojiGroupId, type UnicodeEmoji, emojiGroups } from "./emoji.ts"; import { type EmojiGroupId, emojiGroups, type UnicodeEmoji } from "./emoji.ts";
import Emoji from "./emoji.vue"; import Emoji from "./emoji.vue";
import Sidebar from "./sidebar.vue"; import Sidebar from "./sidebar.vue";
import { EMOJI_PER_ROW, getVirtualizedItems } from "./virtual.ts"; import { EMOJI_PER_ROW, getVirtualizedItems } from "./virtual.ts";

View file

@ -2,7 +2,7 @@ import type { CustomEmoji } from "@versia/client/schemas";
import { go } from "fuzzysort"; import { go } from "fuzzysort";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import type { z } from "zod"; import type { z } from "zod";
import { type UnicodeEmoji, emojiGroups } from "./emoji"; import { emojiGroups, type UnicodeEmoji } from "./emoji";
export const EMOJI_PER_ROW = 7; export const EMOJI_PER_ROW = 7;
export type VirtualizedItem = export type VirtualizedItem =

View file

@ -1,4 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { toTypedSchema } from "@vee-validate/zod";
import type { Instance } from "@versia/client/schemas";
import { Loader } from "lucide-vue-next";
import { useForm } from "vee-validate";
import * as z from "zod";
import { import {
FormControl, FormControl,
FormField, FormField,
@ -6,11 +11,6 @@ import {
FormLabel, FormLabel,
FormMessage, FormMessage,
} from "@/components/ui/form"; } from "@/components/ui/form";
import { toTypedSchema } from "@vee-validate/zod";
import type { Instance } from "@versia/client/schemas";
import { Loader } from "lucide-vue-next";
import { useForm } from "vee-validate";
import * as z from "zod";
import { Button } from "~/components/ui/button"; import { Button } from "~/components/ui/button";
import { Input } from "~/components/ui/input"; import { Input } from "~/components/ui/input";
import * as m from "~/paraglide/messages.js"; import * as m from "~/paraglide/messages.js";

View file

@ -19,8 +19,14 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Card, CardTitle } from "../ui/card/index.ts"; import { Card, CardTitle } from "../ui/card/index.ts";
// biome-ignore lint/style/useImportType: <explanation>
import { preferences as prefs } from "./preferences.ts"; import { preferences as prefs } from "./preferences.ts";
import BooleanPreferenceVue from "./types/boolean.vue";
import CodePreferenceVue from "./types/code.vue";
import MultiSelectPreferenceVue from "./types/multiselect.vue";
import NumberPreferenceVue from "./types/number.vue";
import SelectPreferenceVue from "./types/select.vue";
import TextPreferenceVue from "./types/text.vue";
import UrlPreferenceVue from "./types/url.vue";
import { import {
BooleanPreference, BooleanPreference,
CodePreference, CodePreference,
@ -30,13 +36,6 @@ import {
TextPreference, TextPreference,
UrlPreference, UrlPreference,
} from "./types.ts"; } from "./types.ts";
import BooleanPreferenceVue from "./types/boolean.vue";
import CodePreferenceVue from "./types/code.vue";
import MultiSelectPreferenceVue from "./types/multiselect.vue";
import NumberPreferenceVue from "./types/number.vue";
import SelectPreferenceVue from "./types/select.vue";
import TextPreferenceVue from "./types/text.vue";
import UrlPreferenceVue from "./types/url.vue";
const { preferences = [], name } = defineProps<{ const { preferences = [], name } = defineProps<{
preferences: (keyof typeof prefs)[]; preferences: (keyof typeof prefs)[];

View file

@ -1,11 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
import { import {
InfoIcon, InfoIcon,
PaletteIcon, PaletteIcon,
@ -15,6 +8,13 @@ import {
TerminalSquareIcon, TerminalSquareIcon,
UserIcon, UserIcon,
} from "lucide-vue-next"; } from "lucide-vue-next";
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
import pkg from "~/package.json"; import pkg from "~/package.json";
import Avatar from "../profiles/avatar.vue"; import Avatar from "../profiles/avatar.vue";
import TinyCard from "../profiles/tiny-card.vue"; import TinyCard from "../profiles/tiny-card.vue";

View file

@ -1,21 +1,4 @@
<script setup lang="tsx"> <script setup lang="tsx">
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { Input } from "@/components/ui/input";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import type { import type {
ColumnDef, ColumnDef,
ColumnFiltersState, ColumnFiltersState,
@ -46,6 +29,23 @@ import {
} from "lucide-vue-next"; } from "lucide-vue-next";
import { ref } from "vue"; import { ref } from "vue";
import type { z } from "zod"; import type { z } from "zod";
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { Input } from "@/components/ui/input";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import BatchDropdown from "./batch-dropdown.vue"; import BatchDropdown from "./batch-dropdown.vue";
import Dropdown from "./dropdown.vue"; import Dropdown from "./dropdown.vue";
import Uploader from "./uploader.vue"; import Uploader from "./uploader.vue";

View file

@ -35,9 +35,6 @@ defineSlots<{
value: any; value: any;
setValue: (value: MaybeRef<any>) => void; setValue: (value: MaybeRef<any>) => void;
}): any; }): any;
extra(props: { extra(props: { value: any; setValue: (value: MaybeRef<any>) => void }): any;
value: any;
setValue: (value: MaybeRef<any>) => void;
}): any;
}>(); }>();
</script> </script>

View file

@ -63,14 +63,6 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import type { Account } from "@versia/client/schemas"; import type { Account } from "@versia/client/schemas";
import { import {
AtSign, AtSign,
@ -85,6 +77,14 @@ import {
} from "lucide-vue-next"; } from "lucide-vue-next";
import { toast } from "vue-sonner"; import { toast } from "vue-sonner";
import type { z } from "zod"; import type { z } from "zod";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import * as m from "~/paraglide/messages.js"; import * as m from "~/paraglide/messages.js";
const { account } = defineProps<{ const { account } = defineProps<{

View file

@ -46,6 +46,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { LogIn, LogOut, UserPlus } from "lucide-vue-next"; import { LogIn, LogOut, UserPlus } from "lucide-vue-next";
import { toast } from "vue-sonner"; import { toast } from "vue-sonner";
import { NuxtLink } from "#components";
import { identity as currentIdentity } from "#imports";
import TinyCard from "~/components/profiles/tiny-card.vue"; import TinyCard from "~/components/profiles/tiny-card.vue";
import { Button } from "~/components/ui/button"; import { Button } from "~/components/ui/button";
import { import {
@ -58,8 +60,6 @@ import {
DialogTrigger, DialogTrigger,
} from "~/components/ui/dialog"; } from "~/components/ui/dialog";
import * as m from "~/paraglide/messages.js"; import * as m from "~/paraglide/messages.js";
import { NuxtLink } from "#components";
import { identity as currentIdentity } from "#imports";
const appData = useAppData(); const appData = useAppData();

View file

@ -16,6 +16,7 @@ import {
} from "~/components/ui/sidebar"; } from "~/components/ui/sidebar";
import * as m from "~/paraglide/messages.js"; import * as m from "~/paraglide/messages.js";
import AccountManager from "../account/account-manager.vue"; import AccountManager from "../account/account-manager.vue";
const { $pwa } = useNuxtApp(); const { $pwa } = useNuxtApp();
</script> </script>

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { AlertDialogAction, type AlertDialogActionProps } from "reka-ui";
import { computed, type HTMLAttributes } from "vue";
import { buttonVariants } from "@/components/ui/button"; import { buttonVariants } from "@/components/ui/button";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { AlertDialogAction, type AlertDialogActionProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue";
const props = defineProps< const props = defineProps<
AlertDialogActionProps & { class?: HTMLAttributes["class"] } AlertDialogActionProps & { class?: HTMLAttributes["class"] }

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { AlertDialogCancel, type AlertDialogCancelProps } from "reka-ui";
import { computed, type HTMLAttributes } from "vue";
import { buttonVariants } from "@/components/ui/button"; import { buttonVariants } from "@/components/ui/button";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { AlertDialogCancel, type AlertDialogCancelProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue";
const props = defineProps< const props = defineProps<
AlertDialogCancelProps & { class?: HTMLAttributes["class"] } AlertDialogCancelProps & { class?: HTMLAttributes["class"] }

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { import {
AlertDialogContent, AlertDialogContent,
type AlertDialogContentEmits, type AlertDialogContentEmits,
@ -8,7 +7,8 @@ import {
AlertDialogPortal, AlertDialogPortal,
useForwardPropsEmits, useForwardPropsEmits,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
AlertDialogContentProps & { class?: HTMLAttributes["class"] } AlertDialogContentProps & { class?: HTMLAttributes["class"] }

View file

@ -1,10 +1,10 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { import {
AlertDialogDescription, AlertDialogDescription,
type AlertDialogDescriptionProps, type AlertDialogDescriptionProps,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
AlertDialogDescriptionProps & { class?: HTMLAttributes["class"] } AlertDialogDescriptionProps & { class?: HTMLAttributes["class"] }

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { AlertDialogTitle, type AlertDialogTitleProps } from "reka-ui"; import { AlertDialogTitle, type AlertDialogTitleProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
AlertDialogTitleProps & { class?: HTMLAttributes["class"] } AlertDialogTitleProps & { class?: HTMLAttributes["class"] }

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
import { type AlertVariants, alertVariants } from "."; import { type AlertVariants, alertVariants } from ".";
const props = defineProps<{ const props = defineProps<{

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,4 +1,4 @@
import { type VariantProps, cva } from "class-variance-authority"; import { cva, type VariantProps } from "class-variance-authority";
export { default as Alert } from "./Alert.vue"; export { default as Alert } from "./Alert.vue";
export { default as AlertDescription } from "./AlertDescription.vue"; export { default as AlertDescription } from "./AlertDescription.vue";

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { AvatarRoot } from "reka-ui"; import { AvatarRoot } from "reka-ui";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { AvatarFallback, type AvatarFallbackProps } from "reka-ui"; import { AvatarFallback, type AvatarFallbackProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
AvatarFallbackProps & { class?: HTMLAttributes["class"] } AvatarFallbackProps & { class?: HTMLAttributes["class"] }

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { PrimitiveProps } from "reka-ui"; import type { PrimitiveProps } from "reka-ui";
import { Primitive } from "reka-ui"; import { Primitive } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
import { type BadgeVariants, badgeVariants } from "."; import { type BadgeVariants, badgeVariants } from ".";
const props = defineProps< const props = defineProps<

View file

@ -1,4 +1,4 @@
import { type VariantProps, cva } from "class-variance-authority"; import { cva, type VariantProps } from "class-variance-authority";
export { default as Badge } from "./Badge.vue"; export { default as Badge } from "./Badge.vue";

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { Primitive, type PrimitiveProps } from "reka-ui"; import { Primitive, type PrimitiveProps } from "reka-ui";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
import { type ButtonVariants, buttonVariants } from "."; import { type ButtonVariants, buttonVariants } from ".";
interface Props extends PrimitiveProps { interface Props extends PrimitiveProps {

View file

@ -1,4 +1,4 @@
import { type VariantProps, cva } from "class-variance-authority"; import { cva, type VariantProps } from "class-variance-authority";
export { default as Button } from "./Button.vue"; export { default as Button } from "./Button.vue";

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,9 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { Check } from "lucide-vue-next"; import { Check } from "lucide-vue-next";
import type { CheckboxRootEmits, CheckboxRootProps } from "reka-ui"; import type { CheckboxRootEmits, CheckboxRootProps } from "reka-ui";
import { CheckboxIndicator, CheckboxRoot, useForwardPropsEmits } from "reka-ui"; import { CheckboxIndicator, CheckboxRoot, useForwardPropsEmits } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
CheckboxRootProps & { class?: HTMLAttributes["class"] } CheckboxRootProps & { class?: HTMLAttributes["class"] }

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { ListboxRootEmits, ListboxRootProps } from "reka-ui"; import type { ListboxRootEmits, ListboxRootProps } from "reka-ui";
import { ListboxRoot, useFilter, useForwardPropsEmits } from "reka-ui"; import { ListboxRoot, useFilter, useForwardPropsEmits } from "reka-ui";
import { type HTMLAttributes, computed, reactive, ref, watch } from "vue"; import { computed, type HTMLAttributes, reactive, ref, watch } from "vue";
import { cn } from "@/lib/utils";
import { provideCommandContext } from "."; import { provideCommandContext } from ".";
const props = withDefaults( const props = withDefaults(

View file

@ -1,4 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import type { DialogRootEmits, DialogRootProps } from "reka-ui";
import { useForwardPropsEmits } from "reka-ui";
import { import {
Dialog, Dialog,
DialogContent, DialogContent,
@ -6,8 +8,6 @@ import {
DialogHeader, DialogHeader,
DialogTitle, DialogTitle,
} from "@/components/ui/dialog"; } from "@/components/ui/dialog";
import type { DialogRootEmits, DialogRootProps } from "reka-ui";
import { useForwardPropsEmits } from "reka-ui";
import Command from "./Command.vue"; import Command from "./Command.vue";
const props = withDefaults( const props = withDefaults(

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { PrimitiveProps } from "reka-ui"; import type { PrimitiveProps } from "reka-ui";
import { Primitive } from "reka-ui"; import { Primitive } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
import { useCommand } from "."; import { useCommand } from ".";
const props = defineProps< const props = defineProps<

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { ListboxGroupProps } from "reka-ui"; import type { ListboxGroupProps } from "reka-ui";
import { ListboxGroup, ListboxGroupLabel, useId } from "reka-ui"; import { ListboxGroup, ListboxGroupLabel, useId } from "reka-ui";
import { type HTMLAttributes, computed, onMounted, onUnmounted } from "vue"; import { computed, type HTMLAttributes, onMounted, onUnmounted } from "vue";
import { cn } from "@/lib/utils";
import { provideCommandGroupContext, useCommand } from "."; import { provideCommandGroupContext, useCommand } from ".";
const props = defineProps< const props = defineProps<

View file

@ -1,12 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { Search } from "lucide-vue-next"; import { Search } from "lucide-vue-next";
import { import {
ListboxFilter, ListboxFilter,
type ListboxFilterProps, type ListboxFilterProps,
useForwardProps, useForwardProps,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
import { useCommand } from "."; import { useCommand } from ".";
defineOptions({ defineOptions({

View file

@ -1,15 +1,15 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { useCurrentElement } from "@vueuse/core"; import { useCurrentElement } from "@vueuse/core";
import type { ListboxItemEmits, ListboxItemProps } from "reka-ui"; import type { ListboxItemEmits, ListboxItemProps } from "reka-ui";
import { ListboxItem, useForwardPropsEmits, useId } from "reka-ui"; import { ListboxItem, useForwardPropsEmits, useId } from "reka-ui";
import { import {
type HTMLAttributes,
computed, computed,
type HTMLAttributes,
onMounted, onMounted,
onUnmounted, onUnmounted,
ref, ref,
} from "vue"; } from "vue";
import { cn } from "@/lib/utils";
import { useCommand, useCommandGroup } from "."; import { useCommand, useCommandGroup } from ".";
const props = defineProps< const props = defineProps<

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { ListboxContentProps } from "reka-ui"; import type { ListboxContentProps } from "reka-ui";
import { ListboxContent, useForwardProps } from "reka-ui"; import { ListboxContent, useForwardProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
ListboxContentProps & { class?: HTMLAttributes["class"] } ListboxContentProps & { class?: HTMLAttributes["class"] }

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { SeparatorProps } from "reka-ui"; import type { SeparatorProps } from "reka-ui";
import { Separator } from "reka-ui"; import { Separator } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
SeparatorProps & { class?: HTMLAttributes["class"] } SeparatorProps & { class?: HTMLAttributes["class"] }

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { X } from "lucide-vue-next"; import { X } from "lucide-vue-next";
import { import {
DialogClose, DialogClose,
@ -9,7 +8,8 @@ import {
DialogPortal, DialogPortal,
useForwardPropsEmits, useForwardPropsEmits,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
import DialogOverlay from "./DialogOverlay.vue"; import DialogOverlay from "./DialogOverlay.vue";
const props = defineProps< const props = defineProps<

View file

@ -1,11 +1,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { import {
DialogDescription, DialogDescription,
type DialogDescriptionProps, type DialogDescriptionProps,
useForwardProps, useForwardProps,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DialogDescriptionProps & { class?: HTMLAttributes["class"] } DialogDescriptionProps & { class?: HTMLAttributes["class"] }

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ class?: HTMLAttributes["class"] }>(); const props = defineProps<{ class?: HTMLAttributes["class"] }>();
</script> </script>

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { DialogOverlay, type DialogOverlayProps } from "reka-ui"; import { DialogOverlay, type DialogOverlayProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DialogOverlayProps & { class?: HTMLAttributes["class"] } DialogOverlayProps & { class?: HTMLAttributes["class"] }

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { X } from "lucide-vue-next"; import { X } from "lucide-vue-next";
import { import {
DialogClose, DialogClose,
@ -10,7 +9,8 @@ import {
DialogPortal, DialogPortal,
useForwardPropsEmits, useForwardPropsEmits,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DialogContentProps & { class?: HTMLAttributes["class"] } DialogContentProps & { class?: HTMLAttributes["class"] }

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { DialogTitle, type DialogTitleProps, useForwardProps } from "reka-ui"; import { DialogTitle, type DialogTitleProps, useForwardProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DialogTitleProps & { class?: HTMLAttributes["class"] } DialogTitleProps & { class?: HTMLAttributes["class"] }

View file

@ -1,9 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import type { DialogContentEmits, DialogContentProps } from "reka-ui"; import type { DialogContentEmits, DialogContentProps } from "reka-ui";
import { useForwardPropsEmits } from "reka-ui"; import { useForwardPropsEmits } from "reka-ui";
import { DrawerContent, DrawerPortal } from "vaul-vue"; import { DrawerContent, DrawerPortal } from "vaul-vue";
import type { HtmlHTMLAttributes } from "vue"; import type { HtmlHTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
import DrawerOverlay from "./DrawerOverlay.vue"; import DrawerOverlay from "./DrawerOverlay.vue";
const props = defineProps< const props = defineProps<

View file

@ -1,8 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import type { DrawerDescriptionProps } from "vaul-vue"; import type { DrawerDescriptionProps } from "vaul-vue";
import { DrawerDescription } from "vaul-vue"; import { DrawerDescription } from "vaul-vue";
import { type HtmlHTMLAttributes, computed } from "vue"; import { computed, type HtmlHTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DrawerDescriptionProps & { class?: HtmlHTMLAttributes["class"] } DrawerDescriptionProps & { class?: HtmlHTMLAttributes["class"] }

View file

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import type { HtmlHTMLAttributes } from "vue"; import type { HtmlHTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HtmlHTMLAttributes["class"]; class?: HtmlHTMLAttributes["class"];

View file

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import type { HtmlHTMLAttributes } from "vue"; import type { HtmlHTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HtmlHTMLAttributes["class"]; class?: HtmlHTMLAttributes["class"];

View file

@ -1,8 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import type { DialogOverlayProps } from "reka-ui"; import type { DialogOverlayProps } from "reka-ui";
import { DrawerOverlay } from "vaul-vue"; import { DrawerOverlay } from "vaul-vue";
import { type HtmlHTMLAttributes, computed } from "vue"; import { computed, type HtmlHTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DialogOverlayProps & { class?: HtmlHTMLAttributes["class"] } DialogOverlayProps & { class?: HtmlHTMLAttributes["class"] }

View file

@ -1,8 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import type { DrawerTitleProps } from "vaul-vue"; import type { DrawerTitleProps } from "vaul-vue";
import { DrawerTitle } from "vaul-vue"; import { DrawerTitle } from "vaul-vue";
import { type HtmlHTMLAttributes, computed } from "vue"; import { computed, type HtmlHTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DrawerTitleProps & { class?: HtmlHTMLAttributes["class"] } DrawerTitleProps & { class?: HtmlHTMLAttributes["class"] }

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { Check } from "lucide-vue-next"; import { Check } from "lucide-vue-next";
import { import {
DropdownMenuCheckboxItem, DropdownMenuCheckboxItem,
@ -8,7 +7,8 @@ import {
DropdownMenuItemIndicator, DropdownMenuItemIndicator,
useForwardPropsEmits, useForwardPropsEmits,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DropdownMenuCheckboxItemProps & { class?: HTMLAttributes["class"] } DropdownMenuCheckboxItemProps & { class?: HTMLAttributes["class"] }

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { import {
DropdownMenuContent, DropdownMenuContent,
type DropdownMenuContentEmits, type DropdownMenuContentEmits,
@ -7,7 +6,8 @@ import {
DropdownMenuPortal, DropdownMenuPortal,
useForwardPropsEmits, useForwardPropsEmits,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = withDefaults( const props = withDefaults(
defineProps< defineProps<

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { reactiveOmit } from "@vueuse/core"; import { reactiveOmit } from "@vueuse/core";
import { import {
DropdownMenuItem, DropdownMenuItem,
@ -7,6 +6,7 @@ import {
useForwardProps, useForwardProps,
} from "reka-ui"; } from "reka-ui";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = withDefaults( const props = withDefaults(
defineProps< defineProps<

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { reactiveOmit } from "@vueuse/core"; import { reactiveOmit } from "@vueuse/core";
import { import {
DropdownMenuLabel, DropdownMenuLabel,
@ -7,6 +6,7 @@ import {
useForwardProps, useForwardProps,
} from "reka-ui"; } from "reka-ui";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DropdownMenuLabelProps & { DropdownMenuLabelProps & {

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { Circle } from "lucide-vue-next"; import { Circle } from "lucide-vue-next";
import { import {
DropdownMenuItemIndicator, DropdownMenuItemIndicator,
@ -8,7 +7,8 @@ import {
type DropdownMenuRadioItemProps, type DropdownMenuRadioItemProps,
useForwardPropsEmits, useForwardPropsEmits,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DropdownMenuRadioItemProps & { class?: HTMLAttributes["class"] } DropdownMenuRadioItemProps & { class?: HTMLAttributes["class"] }

View file

@ -1,10 +1,10 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { import {
DropdownMenuSeparator, DropdownMenuSeparator,
type DropdownMenuSeparatorProps, type DropdownMenuSeparatorProps,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DropdownMenuSeparatorProps & { DropdownMenuSeparatorProps & {

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,12 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { import {
DropdownMenuSubContent, DropdownMenuSubContent,
type DropdownMenuSubContentEmits, type DropdownMenuSubContentEmits,
type DropdownMenuSubContentProps, type DropdownMenuSubContentProps,
useForwardPropsEmits, useForwardPropsEmits,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DropdownMenuSubContentProps & { class?: HTMLAttributes["class"] } DropdownMenuSubContentProps & { class?: HTMLAttributes["class"] }

View file

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { reactiveOmit } from "@vueuse/core"; import { reactiveOmit } from "@vueuse/core";
import { ChevronRight } from "lucide-vue-next"; import { ChevronRight } from "lucide-vue-next";
import { import {
@ -8,6 +7,7 @@ import {
useForwardProps, useForwardProps,
} from "reka-ui"; } from "reka-ui";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
DropdownMenuSubTriggerProps & { DropdownMenuSubTriggerProps & {

View file

@ -1,5 +1,5 @@
export { DropdownMenuPortal } from "reka-ui";
export { default as DropdownMenu } from "./DropdownMenu.vue"; export { default as DropdownMenu } from "./DropdownMenu.vue";
export { default as DropdownMenuCheckboxItem } from "./DropdownMenuCheckboxItem.vue"; export { default as DropdownMenuCheckboxItem } from "./DropdownMenuCheckboxItem.vue";
export { default as DropdownMenuContent } from "./DropdownMenuContent.vue"; export { default as DropdownMenuContent } from "./DropdownMenuContent.vue";
export { default as DropdownMenuGroup } from "./DropdownMenuGroup.vue"; export { default as DropdownMenuGroup } from "./DropdownMenuGroup.vue";
@ -13,4 +13,3 @@ export { default as DropdownMenuSub } from "./DropdownMenuSub.vue";
export { default as DropdownMenuSubContent } from "./DropdownMenuSubContent.vue"; export { default as DropdownMenuSubContent } from "./DropdownMenuSubContent.vue";
export { default as DropdownMenuSubTrigger } from "./DropdownMenuSubTrigger.vue"; export { default as DropdownMenuSubTrigger } from "./DropdownMenuSubTrigger.vue";
export { default as DropdownMenuTrigger } from "./DropdownMenuTrigger.vue"; export { default as DropdownMenuTrigger } from "./DropdownMenuTrigger.vue";
export { DropdownMenuPortal } from "reka-ui";

View file

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
import { useFormField } from "./useFormField"; import { useFormField } from "./useFormField";
const props = defineProps<{ const props = defineProps<{

View file

@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import { useId } from "reka-ui"; import { useId } from "reka-ui";
import { type HTMLAttributes, provide } from "vue"; import { type HTMLAttributes, provide } from "vue";
import { cn } from "@/lib/utils";
import { FORM_ITEM_INJECTION_KEY } from "./injectionKeys"; import { FORM_ITEM_INJECTION_KEY } from "./injectionKeys";
const props = defineProps<{ const props = defineProps<{

View file

@ -1,8 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Label } from "@/components/ui/label";
import { cn } from "@/lib/utils";
import type { LabelProps } from "reka-ui"; import type { LabelProps } from "reka-ui";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { Label } from "@/components/ui/label";
import { cn } from "@/lib/utils";
import { useFormField } from "./useFormField"; import { useFormField } from "./useFormField";
const props = defineProps<LabelProps & { class?: HTMLAttributes["class"] }>(); const props = defineProps<LabelProps & { class?: HTMLAttributes["class"] }>();

View file

@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { cn } from "@/lib/utils";
import { ErrorMessage } from "vee-validate"; import { ErrorMessage } from "vee-validate";
import { type HTMLAttributes, toValue } from "vue"; import { type HTMLAttributes, toValue } from "vue";
import { cn } from "@/lib/utils";
import { useFormField } from "./useFormField"; import { useFormField } from "./useFormField";
const props = defineProps<{ const props = defineProps<{

View file

@ -1,11 +1,11 @@
export {
Field as FormField,
FieldArray as FormFieldArray,
Form,
} from "vee-validate";
export { default as FormControl } from "./FormControl.vue"; export { default as FormControl } from "./FormControl.vue";
export { default as FormDescription } from "./FormDescription.vue"; export { default as FormDescription } from "./FormDescription.vue";
export { default as FormItem } from "./FormItem.vue"; export { default as FormItem } from "./FormItem.vue";
export { default as FormLabel } from "./FormLabel.vue"; export { default as FormLabel } from "./FormLabel.vue";
export { default as FormMessage } from "./FormMessage.vue"; export { default as FormMessage } from "./FormMessage.vue";
export { FORM_ITEM_INJECTION_KEY } from "./injectionKeys"; export { FORM_ITEM_INJECTION_KEY } from "./injectionKeys";
export {
Form,
Field as FormField,
FieldArray as FormFieldArray,
} from "vee-validate";

View file

@ -1,12 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { import {
HoverCardContent, HoverCardContent,
type HoverCardContentProps, type HoverCardContentProps,
HoverCardPortal, HoverCardPortal,
useForwardProps, useForwardProps,
} from "reka-ui"; } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = withDefaults( const props = withDefaults(
defineProps<HoverCardContentProps & { class?: HTMLAttributes["class"] }>(), defineProps<HoverCardContentProps & { class?: HTMLAttributes["class"] }>(),

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { useVModel } from "@vueuse/core"; import { useVModel } from "@vueuse/core";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
defaultValue?: string | number; defaultValue?: string | number;

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { Label, type LabelProps } from "reka-ui"; import { Label, type LabelProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<LabelProps & { class?: HTMLAttributes["class"] }>(); const props = defineProps<LabelProps & { class?: HTMLAttributes["class"] }>();

View file

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { NumberFieldRootEmits, NumberFieldRootProps } from "reka-ui"; import type { NumberFieldRootEmits, NumberFieldRootProps } from "reka-ui";
import { NumberFieldRoot, useForwardPropsEmits } from "reka-ui"; import { NumberFieldRoot, useForwardPropsEmits } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
NumberFieldRootProps & { class?: HTMLAttributes["class"] } NumberFieldRootProps & { class?: HTMLAttributes["class"] }

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "vue"; import type { HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes["class"]; class?: HTMLAttributes["class"];

View file

@ -1,9 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { Minus } from "lucide-vue-next"; import { Minus } from "lucide-vue-next";
import type { NumberFieldDecrementProps } from "reka-ui"; import type { NumberFieldDecrementProps } from "reka-ui";
import { NumberFieldDecrement, useForwardProps } from "reka-ui"; import { NumberFieldDecrement, useForwardProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
NumberFieldDecrementProps & { class?: HTMLAttributes["class"] } NumberFieldDecrementProps & { class?: HTMLAttributes["class"] }

View file

@ -1,9 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { cn } from "@/lib/utils";
import { Plus } from "lucide-vue-next"; import { Plus } from "lucide-vue-next";
import type { NumberFieldIncrementProps } from "reka-ui"; import type { NumberFieldIncrementProps } from "reka-ui";
import { NumberFieldIncrement, useForwardProps } from "reka-ui"; import { NumberFieldIncrement, useForwardProps } from "reka-ui";
import { type HTMLAttributes, computed } from "vue"; import { computed, type HTMLAttributes } from "vue";
import { cn } from "@/lib/utils";
const props = defineProps< const props = defineProps<
NumberFieldIncrementProps & { class?: HTMLAttributes["class"] } NumberFieldIncrementProps & { class?: HTMLAttributes["class"] }

Some files were not shown because too many files have changed in this diff Show more