From 572489ed5c6224e44a47616a8629e7e7f7a0c67a Mon Sep 17 00:00:00 2001 From: Antoine Pelletier Date: Wed, 29 Jul 2026 16:47:05 +0200 Subject: [PATCH] first commit --- .env | 2 + .gitignore | 3 + Cargo.lock | 2734 +++++++++++++++++ Cargo.toml | 30 + README.md | 156 + build.rs | 20 + config.example.yml | 15 + db/migrations/20260101000000_create_items.sql | 10 + db/schema.sql | 97 + db/seed.sql | 13 + dev-db/.gitignore | 1 + dev-db/docker-compose.yml | 25 + dev-db/login-servers.php | 52 + frontend/.editorconfig | 8 + frontend/.gitattributes | 1 + frontend/.gitignore | 30 + frontend/.prettierrc.json | 6 + frontend/components.json | 21 + frontend/env.d.ts | 1 + frontend/eslint.config.ts | 32 + frontend/index.html | 18 + frontend/package.json | 58 + frontend/public/favicon.ico | Bin 0 -> 4286 bytes frontend/src/App.vue | 16 + frontend/src/components/AppContent.vue | 11 + frontend/src/components/AppSidebar.vue | 105 + .../src/components/ui/accordion/Accordion.vue | 15 + .../ui/accordion/AccordionContent.vue | 22 + .../components/ui/accordion/AccordionItem.vue | 19 + .../ui/accordion/AccordionTrigger.vue | 31 + frontend/src/components/ui/accordion/index.ts | 4 + .../ui/alert-dialog/AlertDialog.vue | 15 + .../ui/alert-dialog/AlertDialogAction.vue | 18 + .../ui/alert-dialog/AlertDialogCancel.vue | 21 + .../ui/alert-dialog/AlertDialogContent.vue | 38 + .../alert-dialog/AlertDialogDescription.vue | 20 + .../ui/alert-dialog/AlertDialogFooter.vue | 14 + .../ui/alert-dialog/AlertDialogHeader.vue | 14 + .../ui/alert-dialog/AlertDialogTitle.vue | 17 + .../ui/alert-dialog/AlertDialogTrigger.vue | 12 + .../src/components/ui/alert-dialog/index.ts | 9 + frontend/src/components/ui/badge/Badge.vue | 17 + frontend/src/components/ui/badge/index.ts | 25 + frontend/src/components/ui/button/Button.vue | 29 + frontend/src/components/ui/button/index.ts | 36 + frontend/src/components/ui/card/Card.vue | 14 + .../src/components/ui/card/CardContent.vue | 14 + .../components/ui/card/CardDescription.vue | 14 + .../src/components/ui/card/CardFooter.vue | 14 + .../src/components/ui/card/CardHeader.vue | 14 + frontend/src/components/ui/card/CardTitle.vue | 14 + frontend/src/components/ui/card/index.ts | 6 + .../src/components/ui/combobox/Combobox.vue | 15 + .../components/ui/combobox/ComboboxAnchor.vue | 19 + .../components/ui/combobox/ComboboxEmpty.vue | 17 + .../components/ui/combobox/ComboboxGroup.vue | 33 + .../components/ui/combobox/ComboboxInput.vue | 33 + .../components/ui/combobox/ComboboxItem.vue | 28 + .../components/ui/combobox/ComboboxList.vue | 39 + .../ui/combobox/ComboboxSeparator.vue | 17 + .../ui/combobox/ComboboxTrigger.vue | 19 + frontend/src/components/ui/combobox/index.ts | 11 + .../ui/dropdown-menu/DropdownMenu.vue | 15 + .../DropdownMenuCheckboxItem.vue | 35 + .../ui/dropdown-menu/DropdownMenuContent.vue | 36 + .../ui/dropdown-menu/DropdownMenuGroup.vue | 12 + .../ui/dropdown-menu/DropdownMenuItem.vue | 41 + .../ui/dropdown-menu/DropdownMenuLabel.vue | 25 + .../dropdown-menu/DropdownMenuRadioGroup.vue | 15 + .../dropdown-menu/DropdownMenuRadioItem.vue | 36 + .../dropdown-menu/DropdownMenuSeparator.vue | 23 + .../ui/dropdown-menu/DropdownMenuShortcut.vue | 17 + .../ui/dropdown-menu/DropdownMenuSub.vue | 15 + .../dropdown-menu/DropdownMenuSubContent.vue | 29 + .../dropdown-menu/DropdownMenuSubTrigger.vue | 31 + .../ui/dropdown-menu/DropdownMenuTrigger.vue | 14 + .../src/components/ui/dropdown-menu/index.ts | 16 + frontend/src/components/ui/input/Input.vue | 35 + frontend/src/components/ui/input/index.ts | 1 + .../src/components/ui/separator/Separator.vue | 27 + frontend/src/components/ui/separator/index.ts | 1 + frontend/src/components/ui/sheet/Sheet.vue | 15 + .../src/components/ui/sheet/SheetClose.vue | 12 + .../src/components/ui/sheet/SheetContent.vue | 60 + .../components/ui/sheet/SheetDescription.vue | 21 + .../src/components/ui/sheet/SheetFooter.vue | 12 + .../src/components/ui/sheet/SheetHeader.vue | 12 + .../src/components/ui/sheet/SheetOverlay.vue | 26 + .../src/components/ui/sheet/SheetTitle.vue | 21 + .../src/components/ui/sheet/SheetTrigger.vue | 12 + frontend/src/components/ui/sheet/index.ts | 8 + .../src/components/ui/sidebar/Sidebar.vue | 102 + .../components/ui/sidebar/SidebarContent.vue | 23 + .../components/ui/sidebar/SidebarFooter.vue | 18 + .../components/ui/sidebar/SidebarGroup.vue | 18 + .../ui/sidebar/SidebarGroupAction.vue | 31 + .../ui/sidebar/SidebarGroupContent.vue | 18 + .../ui/sidebar/SidebarGroupLabel.vue | 30 + .../components/ui/sidebar/SidebarHeader.vue | 18 + .../components/ui/sidebar/SidebarInput.vue | 19 + .../components/ui/sidebar/SidebarInset.vue | 23 + .../src/components/ui/sidebar/SidebarMenu.vue | 18 + .../ui/sidebar/SidebarMenuAction.vue | 42 + .../ui/sidebar/SidebarMenuBadge.vue | 28 + .../ui/sidebar/SidebarMenuButton.vue | 49 + .../ui/sidebar/SidebarMenuButtonChild.vue | 36 + .../components/ui/sidebar/SidebarMenuItem.vue | 18 + .../ui/sidebar/SidebarMenuSkeleton.vue | 31 + .../components/ui/sidebar/SidebarMenuSub.vue | 24 + .../ui/sidebar/SidebarMenuSubButton.vue | 43 + .../ui/sidebar/SidebarMenuSubItem.vue | 18 + .../components/ui/sidebar/SidebarProvider.vue | 97 + .../src/components/ui/sidebar/SidebarRail.vue | 35 + .../ui/sidebar/SidebarSeparator.vue | 19 + .../components/ui/sidebar/SidebarTrigger.vue | 27 + frontend/src/components/ui/sidebar/index.ts | 60 + frontend/src/components/ui/sidebar/utils.ts | 19 + .../src/components/ui/skeleton/Skeleton.vue | 14 + frontend/src/components/ui/skeleton/index.ts | 1 + frontend/src/components/ui/sonner/Sonner.vue | 54 + frontend/src/components/ui/sonner/index.ts | 1 + frontend/src/components/ui/switch/Switch.vue | 37 + frontend/src/components/ui/switch/index.ts | 1 + frontend/src/components/ui/table/Table.vue | 16 + .../src/components/ui/table/TableBody.vue | 14 + .../src/components/ui/table/TableCaption.vue | 14 + .../src/components/ui/table/TableCell.vue | 14 + .../src/components/ui/table/TableEmpty.vue | 32 + .../src/components/ui/table/TableFooter.vue | 14 + .../src/components/ui/table/TableHead.vue | 21 + .../src/components/ui/table/TableHeader.vue | 14 + frontend/src/components/ui/table/TableRow.vue | 18 + frontend/src/components/ui/table/index.ts | 9 + .../src/components/ui/textarea/Textarea.vue | 32 + frontend/src/components/ui/textarea/index.ts | 1 + .../src/components/ui/tooltip/Tooltip.vue | 15 + .../components/ui/tooltip/TooltipContent.vue | 44 + .../components/ui/tooltip/TooltipProvider.vue | 14 + .../components/ui/tooltip/TooltipTrigger.vue | 12 + frontend/src/components/ui/tooltip/index.ts | 4 + frontend/src/lib/api.d.ts | 100 + frontend/src/lib/utils.ts | 7 + frontend/src/locales/en.yml | 12 + frontend/src/locales/fr.yml | 12 + frontend/src/main.ts | 13 + frontend/src/router/index.ts | 10 + frontend/src/services/api/client.ts | 32 + frontend/src/services/api/items.ts | 39 + frontend/src/services/api/misc.ts | 18 + frontend/src/services/i18n.ts | 40 + frontend/src/styles/tailwind.css | 123 + frontend/src/utils/types.ts | 5 + frontend/src/views/HomeView.vue | 34 + frontend/tsconfig.app.json | 13 + frontend/tsconfig.json | 17 + frontend/tsconfig.node.json | 19 + frontend/vite.config.ts | 38 + rename.sh | 56 + src/api/docs.rs | 45 + src/api/helpers.rs | 22 + src/api/items.rs | 29 + src/api/mod.rs | 66 + src/core/controller/items.rs | 19 + src/core/controller/mod.rs | 55 + src/core/mod.rs | 3 + src/core/models/item.rs | 15 + src/core/models/localized_string.rs | 9 + src/core/models/mod.rs | 2 + src/core/repositories/items_repository.rs | 8 + src/core/repositories/mod.rs | 26 + src/main.rs | 76 + src/services/database/items.rs | 46 + src/services/database/mod.rs | 44 + src/services/mod.rs | 2 + src/utils/config.rs | 70 + src/utils/mod.rs | 1 + 176 files changed, 7171 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 build.rs create mode 100644 config.example.yml create mode 100644 db/migrations/20260101000000_create_items.sql create mode 100644 db/schema.sql create mode 100644 db/seed.sql create mode 100644 dev-db/.gitignore create mode 100644 dev-db/docker-compose.yml create mode 100644 dev-db/login-servers.php create mode 100644 frontend/.editorconfig create mode 100644 frontend/.gitattributes create mode 100644 frontend/.gitignore create mode 100644 frontend/.prettierrc.json create mode 100644 frontend/components.json create mode 100644 frontend/env.d.ts create mode 100644 frontend/eslint.config.ts create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/components/AppContent.vue create mode 100644 frontend/src/components/AppSidebar.vue create mode 100644 frontend/src/components/ui/accordion/Accordion.vue create mode 100644 frontend/src/components/ui/accordion/AccordionContent.vue create mode 100644 frontend/src/components/ui/accordion/AccordionItem.vue create mode 100644 frontend/src/components/ui/accordion/AccordionTrigger.vue create mode 100644 frontend/src/components/ui/accordion/index.ts create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialog.vue create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialogAction.vue create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialogCancel.vue create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialogContent.vue create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialogDescription.vue create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialogFooter.vue create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialogHeader.vue create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialogTitle.vue create mode 100644 frontend/src/components/ui/alert-dialog/AlertDialogTrigger.vue create mode 100644 frontend/src/components/ui/alert-dialog/index.ts create mode 100644 frontend/src/components/ui/badge/Badge.vue create mode 100644 frontend/src/components/ui/badge/index.ts create mode 100644 frontend/src/components/ui/button/Button.vue create mode 100644 frontend/src/components/ui/button/index.ts create mode 100644 frontend/src/components/ui/card/Card.vue create mode 100644 frontend/src/components/ui/card/CardContent.vue create mode 100644 frontend/src/components/ui/card/CardDescription.vue create mode 100644 frontend/src/components/ui/card/CardFooter.vue create mode 100644 frontend/src/components/ui/card/CardHeader.vue create mode 100644 frontend/src/components/ui/card/CardTitle.vue create mode 100644 frontend/src/components/ui/card/index.ts create mode 100644 frontend/src/components/ui/combobox/Combobox.vue create mode 100644 frontend/src/components/ui/combobox/ComboboxAnchor.vue create mode 100644 frontend/src/components/ui/combobox/ComboboxEmpty.vue create mode 100644 frontend/src/components/ui/combobox/ComboboxGroup.vue create mode 100644 frontend/src/components/ui/combobox/ComboboxInput.vue create mode 100644 frontend/src/components/ui/combobox/ComboboxItem.vue create mode 100644 frontend/src/components/ui/combobox/ComboboxList.vue create mode 100644 frontend/src/components/ui/combobox/ComboboxSeparator.vue create mode 100644 frontend/src/components/ui/combobox/ComboboxTrigger.vue create mode 100644 frontend/src/components/ui/combobox/index.ts create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenu.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuContent.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuGroup.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuItem.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuLabel.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuSub.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue create mode 100644 frontend/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue create mode 100644 frontend/src/components/ui/dropdown-menu/index.ts create mode 100644 frontend/src/components/ui/input/Input.vue create mode 100644 frontend/src/components/ui/input/index.ts create mode 100644 frontend/src/components/ui/separator/Separator.vue create mode 100644 frontend/src/components/ui/separator/index.ts create mode 100644 frontend/src/components/ui/sheet/Sheet.vue create mode 100644 frontend/src/components/ui/sheet/SheetClose.vue create mode 100644 frontend/src/components/ui/sheet/SheetContent.vue create mode 100644 frontend/src/components/ui/sheet/SheetDescription.vue create mode 100644 frontend/src/components/ui/sheet/SheetFooter.vue create mode 100644 frontend/src/components/ui/sheet/SheetHeader.vue create mode 100644 frontend/src/components/ui/sheet/SheetOverlay.vue create mode 100644 frontend/src/components/ui/sheet/SheetTitle.vue create mode 100644 frontend/src/components/ui/sheet/SheetTrigger.vue create mode 100644 frontend/src/components/ui/sheet/index.ts create mode 100644 frontend/src/components/ui/sidebar/Sidebar.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarContent.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarFooter.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarGroup.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarGroupAction.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarGroupContent.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarGroupLabel.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarHeader.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarInput.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarInset.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenu.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuAction.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuBadge.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuButton.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuButtonChild.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuItem.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuSkeleton.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuSub.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuSubButton.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarMenuSubItem.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarProvider.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarRail.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarSeparator.vue create mode 100644 frontend/src/components/ui/sidebar/SidebarTrigger.vue create mode 100644 frontend/src/components/ui/sidebar/index.ts create mode 100644 frontend/src/components/ui/sidebar/utils.ts create mode 100644 frontend/src/components/ui/skeleton/Skeleton.vue create mode 100644 frontend/src/components/ui/skeleton/index.ts create mode 100644 frontend/src/components/ui/sonner/Sonner.vue create mode 100644 frontend/src/components/ui/sonner/index.ts create mode 100644 frontend/src/components/ui/switch/Switch.vue create mode 100644 frontend/src/components/ui/switch/index.ts create mode 100644 frontend/src/components/ui/table/Table.vue create mode 100644 frontend/src/components/ui/table/TableBody.vue create mode 100644 frontend/src/components/ui/table/TableCaption.vue create mode 100644 frontend/src/components/ui/table/TableCell.vue create mode 100644 frontend/src/components/ui/table/TableEmpty.vue create mode 100644 frontend/src/components/ui/table/TableFooter.vue create mode 100644 frontend/src/components/ui/table/TableHead.vue create mode 100644 frontend/src/components/ui/table/TableHeader.vue create mode 100644 frontend/src/components/ui/table/TableRow.vue create mode 100644 frontend/src/components/ui/table/index.ts create mode 100644 frontend/src/components/ui/textarea/Textarea.vue create mode 100644 frontend/src/components/ui/textarea/index.ts create mode 100644 frontend/src/components/ui/tooltip/Tooltip.vue create mode 100644 frontend/src/components/ui/tooltip/TooltipContent.vue create mode 100644 frontend/src/components/ui/tooltip/TooltipProvider.vue create mode 100644 frontend/src/components/ui/tooltip/TooltipTrigger.vue create mode 100644 frontend/src/components/ui/tooltip/index.ts create mode 100644 frontend/src/lib/api.d.ts create mode 100644 frontend/src/lib/utils.ts create mode 100644 frontend/src/locales/en.yml create mode 100644 frontend/src/locales/fr.yml create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/router/index.ts create mode 100644 frontend/src/services/api/client.ts create mode 100644 frontend/src/services/api/items.ts create mode 100644 frontend/src/services/api/misc.ts create mode 100644 frontend/src/services/i18n.ts create mode 100644 frontend/src/styles/tailwind.css create mode 100644 frontend/src/utils/types.ts create mode 100644 frontend/src/views/HomeView.vue create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts create mode 100755 rename.sh create mode 100644 src/api/docs.rs create mode 100644 src/api/helpers.rs create mode 100644 src/api/items.rs create mode 100644 src/api/mod.rs create mode 100644 src/core/controller/items.rs create mode 100644 src/core/controller/mod.rs create mode 100644 src/core/mod.rs create mode 100644 src/core/models/item.rs create mode 100644 src/core/models/localized_string.rs create mode 100644 src/core/models/mod.rs create mode 100644 src/core/repositories/items_repository.rs create mode 100644 src/core/repositories/mod.rs create mode 100644 src/main.rs create mode 100644 src/services/database/items.rs create mode 100644 src/services/database/mod.rs create mode 100644 src/services/mod.rs create mode 100644 src/utils/config.rs create mode 100644 src/utils/mod.rs diff --git a/.env b/.env new file mode 100644 index 0000000..f9a79d5 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +# This file is used by dbmate, and by the sqlx macros at compile time. +DATABASE_URL=postgres://postgres:postgres@localhost:5432/app_template?sslmode=disable diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2fd919e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +config.yml +config.yaml diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..b229547 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2734 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "aide" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6966317188cdfe54c58c0900a195d021294afb3ece9b7073d09e4018dbb1e3a2" +dependencies = [ + "aide-macros", + "axum", + "bytes", + "cfg-if", + "http", + "indexmap", + "schemars", + "serde", + "serde_json", + "serde_qs", + "thiserror", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "aide-macros" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f2a08f14808f3c46f3e3004b727bace64af44c3c5996d0480a14d3852b1b25a" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "app-template" +version = "0.1.0" +dependencies = [ + "aide", + "async-trait", + "axum", + "config", + "schemars", + "serde", + "serde_json", + "sqlx", + "thiserror", + "tokio", + "tower-http", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "async-trait" +version = "0.1.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "axum-macros", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "config" +version = "0.15.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b85f248a4de22d204ceabc6299d89d2c70fbd7f09fea53c06c852369652d8139" +dependencies = [ + "async-trait", + "convert_case", + "json5", + "pathdiff", + "ron", + "rust-ini", + "serde-untagged", + "serde_core", + "serde_json", + "toml", + "winnow", + "yaml-rust2", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crossbeam-queue" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" +dependencies = [ + "serde", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-executor" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "hashlink" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "bytes", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +dependencies = [ + "bitflags", + "libc", + "plain", + "redox_syscall 0.9.1", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pest_meta" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c" +dependencies = [ + "pest", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07507be7b4a5f9f26eeb41eeaebb1f5a7ff29dfb29739facc21d35bf8b11c21e" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "ron" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" +dependencies = [ + "bitflags", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rust-ini" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "indexmap", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5016d94c77c6d32f0b8e08b781f7dc8a90c2007d4e77472cc2807bc10a8438fe" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_qs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b417bedc008acbdf6d6b4bc482d29859924114bbe2650b7921fb68a261d0aa6" +dependencies = [ + "axum", + "futures", + "percent-encoding", + "serde", + "thiserror", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink 0.10.0", + "indexmap", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.119", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.119", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +dependencies = [ + "atoi", + "base64", + "bitflags", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +dependencies = [ + "atoi", + "base64", + "bitflags", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "yaml-rust2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "631a50d867fafb7093e709d75aaee9e0e0d5deb934021fcea25ac2fe09edc51e" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink 0.11.1", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..225e75e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "app-template" +version = "0.1.0" +edition = "2024" + +[dependencies] +aide = { version = "0.15.1", features = [ + "axum-json", + "axum-query", + "http", + "macros", + "scalar", +] } +async-trait = "0.1.89" +axum = { version = "0.8.9", features = ["macros"] } +config = "0.15.23" +schemars = "0.9.0" +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.149" +sqlx = { version = "0.8.6", features = [ + "postgres", + "chrono", + "json", + "runtime-tokio", +] } +thiserror = "2.0.18" +tokio = { version = "1.52.3", features = ["rt-multi-thread", "signal"] } +tower-http = { version = "0.6.10", features = ["fs"] } +tracing = "0.1.44" +tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } diff --git a/README.md b/README.md new file mode 100644 index 0000000..b4d2897 --- /dev/null +++ b/README.md @@ -0,0 +1,156 @@ +# App template + +Starting point for an AGEPoly web project: a **Rust** backend (axum + sqlx + aide) serving a +**Vue 3** frontend (TypeScript + vue-query + shadcn-vue), on **PostgreSQL** with **dbmate** +migrations. + +The template is deliberately almost empty: one table (`items`), one route +(`GET /api/items`) and one page (home) that displays it. They exist to show how the layers +fit together — rename them, or delete them once your own code is in place. + +## What you get + +- Layered backend (api / core / services), see [Backend](#backend) +- An OpenAPI document generated from the code, and **TypeScript types generated from it**: + the frontend cannot call an endpoint that does not exist +- i18n (fr/en) on both sides, localized strings stored as JSONB +- `dev-db/`: postgres + adminer in docker for development +- Tailwind 4 and the shadcn-vue components already vendored in `frontend/src/components/ui` +- A single binary in production: the backend serves the built frontend + +There is **no authentication** in this template: add whatever the project needs. + +## Bootstrap a new project + +```bash +cp -r template /path/to/my-project && cd /path/to/my-project +git init + +# 1. Rename the crate and the database (app-template -> my-project) +./rename.sh my-project "My Project" && rm rename.sh + +# 2. Start the development database +cd dev-db && docker compose up -d && cd .. +psql -h localhost -U postgres -c 'CREATE DATABASE my_project' +dbmate up +psql "$(grep DATABASE_URL .env | cut -d= -f2-)" -f db/seed.sql # optional demo data + +# 3. Configure the app +cp config.example.yml config.yml + +# 4. Run the backend (port 3000) +cargo run + +# 5. Run the frontend (port 5000, proxies /api to the backend) +cd frontend && npm install && npm run dev +``` + +Open http://localhost:5000. The api documentation is on http://localhost:3000/api/docs. + +`config.yml` is gitignored: it is where the secrets go. `config.example.yml` documents every +key, keep it up to date. Every value can also come from the environment +(`APP__POSTGRES__PASSWORD=...`), which is how the app is configured in production. + +## Layout + +``` +├── src/ backend +│ ├── api/ http layer: routes, extractors, OpenAPI +│ ├── core/ business logic, independent of axum and sqlx +│ │ ├── controller/ what the app can do +│ │ ├── models/ domain types +│ │ └── repositories/ traits describing what the core needs from the storage +│ ├── services/ implementations of the repositories (postgres/sqlx) +│ └── utils/ configuration +├── db/ +│ ├── migrations/ dbmate migrations +│ ├── schema.sql dump regenerated by dbmate, do not edit by hand +│ └── seed.sql development data +├── dev-db/ postgres + adminer for development +└── frontend/ + └── src/ + ├── components/ shared components (ui/ = shadcn-vue) + ├── views/ one component per route + ├── router/ route table + ├── services/ api/ (one file per domain area) + i18n + ├── lib/api.d.ts generated from the backend, never edited by hand + ├── utils/types.ts shorthands over the generated schemas + └── locales/ fr.yml / en.yml +``` + +## Backend + +Requests flow through three layers, each one only knowing the next: + +``` +api (axum handler) -> core/controller -> core/repositories -> services/database + status codes business logic trait sqlx + postgres + domain models +``` + +The point of the repository traits is that the core never depends on sqlx: you can add +another implementation (a mock in tests, another storage) without touching the logic. +Handlers stay thin — extract the controller, call it, map the error to a status code — and +their OpenAPI documentation sits right next to them (`fn *_docs`). + +### Adding an entity + +1. `dbmate n create_things` and write the migration, then `dbmate up` +2. `src/core/models/thing.rs`: the domain types +3. `src/core/repositories/things_repository.rs`: the trait, added to `DatabaseRepository` +4. `src/services/database/things.rs`: the sqlx implementation +5. `src/core/controller/things.rs`: the logic, plus a `ThingsControllerError` if needed +6. `src/api/things.rs`: the handlers and their docs, mounted in `src/api/mod.rs` +7. `cd frontend && npm run openapi` to regenerate the types, then write the service and the view + +The `Item` entity follows exactly these steps: copy it. + +Request bodies are best kept separate from the domain models (an `api/models.rs` holding +the `...Api` structs and their `Into` impls), so that the public contract does not +change every time a domain model does. + +### sqlx and compilation + +`query!`/`query_as!` check the sql against a **real database at compile time**, so the +development database must be up and migrated for `cargo build` to work. `DATABASE_URL` is +read from `.env`. + +To build without a database (CI, docker image), commit the offline data: + +```bash +cargo install sqlx-cli +cargo sqlx prepare # writes .sqlx/, commit it +``` + +### Migrations + +```bash +dbmate n add_something # creates db/migrations/_add_something.sql +dbmate up # applies, and regenerates db/schema.sql +dbmate rollback # undoes the last migration (write your `migrate:down`!) +``` + +## Frontend + +```bash +npm run dev # dev server on :5000, /api proxied to the backend on :3000 +npm run build # type-check + build into dist/ +npm run type-check +npm run lint +npm run format +npm run openapi # regenerate src/lib/api.d.ts from the running backend +``` + +Rules of thumb: + +- views never call `fetch`: they use a hook from `services/api/`, which returns a vue-query + query or mutation. Caching, loading and error states come for free. +- mutations update the cache in `onSuccess` so the ui reacts immediately. +- texts live in `locales/*.yml` and are used through `$t('key')`, never hardcoded. +- add a shadcn-vue component with `npx shadcn-vue@latest add `. + +## Production + +`cargo build --release`, `npm run build`, then point `frontend_dir` at the built +`frontend/dist`: the backend serves the static files and falls back on `index.html` so the +vue router keeps working on a page reload. Only one process to deploy. diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..7db8f38 --- /dev/null +++ b/build.rs @@ -0,0 +1,20 @@ +use std::process::Command; + +/// Exposes the current commit and the crate name to the code through `env!()` +fn main() { + let git_hash = Command::new("git") + .args(["rev-parse", "HEAD"]) + .output() + .ok() + .filter(|output| output.status.success()) + .and_then(|output| String::from_utf8(output.stdout).ok()) + .map(|hash| hash.trim().chars().take(8).collect::()) + .unwrap_or_else(|| "unknown".to_owned()); + + println!("cargo:rustc-env=GIT_HASH={git_hash}"); + println!( + "cargo:rustc-env=CRATE_NAME={}", + env!("CARGO_PKG_NAME").replace("-", "_") + ); + println!("cargo:rerun-if-changed=.git/HEAD"); +} diff --git a/config.example.yml b/config.example.yml new file mode 100644 index 0000000..de27a26 --- /dev/null +++ b/config.example.yml @@ -0,0 +1,15 @@ +# Copy to config.yml (gitignored) and adapt. +# Every value can also be given as an environment variable, e.g. APP__SERVER__PORT=3000 +server: + address: 0.0.0.0 + port: 3000 + +postgres: + host: localhost + port: 5432 + user: postgres + password: postgres + name: app_template + +# Directory containing the built frontend (frontend/dist after `npm run build`) +frontend_dir: frontend/dist diff --git a/db/migrations/20260101000000_create_items.sql b/db/migrations/20260101000000_create_items.sql new file mode 100644 index 0000000..47c35c6 --- /dev/null +++ b/db/migrations/20260101000000_create_items.sql @@ -0,0 +1,10 @@ +-- migrate:up +-- Example table. Localized texts are stored as JSONB: {"fr": "...", "en": "..."} +CREATE TABLE items ( + id SERIAL PRIMARY KEY, + "name" JSONB NOT NULL, + "description" JSONB NOT NULL +); + +-- migrate:down +DROP TABLE IF EXISTS items; diff --git a/db/schema.sql b/db/schema.sql new file mode 100644 index 0000000..a514af1 --- /dev/null +++ b/db/schema.sql @@ -0,0 +1,97 @@ +\restrict dbmate + +-- Dumped from database version 18.4 +-- Dumped by pg_dump version 18.4 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET transaction_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: items; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.items ( + id integer NOT NULL, + name jsonb NOT NULL, + description jsonb NOT NULL +); + + +-- +-- Name: items_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.items_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: items_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public.items_id_seq OWNED BY public.items.id; + + +-- +-- Name: schema_migrations; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.schema_migrations ( + version character varying NOT NULL +); + + +-- +-- Name: items id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.items ALTER COLUMN id SET DEFAULT nextval('public.items_id_seq'::regclass); + + +-- +-- Name: items items_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.items + ADD CONSTRAINT items_pkey PRIMARY KEY (id); + + +-- +-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.schema_migrations + ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version); + + +-- +-- PostgreSQL database dump complete +-- + +\unrestrict dbmate + + +-- +-- Dbmate schema migrations +-- + +INSERT INTO public.schema_migrations (version) VALUES + ('20260101000000'); diff --git a/db/seed.sql b/db/seed.sql new file mode 100644 index 0000000..16b32de --- /dev/null +++ b/db/seed.sql @@ -0,0 +1,13 @@ +-- Development data. Apply with: +-- psql "$DATABASE_URL" -f db/seed.sql +BEGIN; + +INSERT INTO public.items (id, "name", "description") VALUES + (1, '{"fr": "Premier objet", "en": "First item"}', '{"fr": "Un objet de démonstration.", "en": "A demo item."}'), + (2, '{"fr": "Deuxième objet", "en": "Second item"}', '{"fr": "Un autre objet de démonstration.", "en": "Another demo item."}') +ON CONFLICT DO NOTHING; + +-- Keep the sequence in sync with the explicit ids inserted above +SELECT setval('public.items_id_seq', (SELECT COALESCE(MAX(id), 1) FROM public.items)); + +COMMIT; diff --git a/dev-db/.gitignore b/dev-db/.gitignore new file mode 100644 index 0000000..5baa59d --- /dev/null +++ b/dev-db/.gitignore @@ -0,0 +1 @@ +db \ No newline at end of file diff --git a/dev-db/docker-compose.yml b/dev-db/docker-compose.yml new file mode 100644 index 0000000..fa0120f --- /dev/null +++ b/dev-db/docker-compose.yml @@ -0,0 +1,25 @@ +# This compose file should only be used in development. +# Caution: the ports of db and adminer are open without any application-side protection +services: + db: + image: postgres:18.3-alpine + ports: ["5432:5432"] + environment: + - POSTGRES_PASSWORD=postgres + volumes: + - ./db:/var/lib/postgresql + adminer: + image: adminer + ports: ["8080:8080"] + environment: + - ADMINER_SERVERS={ + "dev db":{ + "driver":"pgsql", + "server":"db", + "username":"postgres", + "password":"postgres", + "db":"" + } + } + volumes: + - ./login-servers.php:/var/www/html/plugins-enabled/login-servers.php diff --git a/dev-db/login-servers.php b/dev-db/login-servers.php new file mode 100644 index 0000000..9202730 --- /dev/null +++ b/dev-db/login-servers.php @@ -0,0 +1,52 @@ +servers = array(); + if (!empty($_ENV['ADMINER_SERVERS'])) { + $this->servers = json_decode($_ENV['ADMINER_SERVERS'], true); + } + + if (!empty($_POST["auth"]["custom_server"])) { + $key = $_POST["auth"]["custom_server"]; + $_POST["auth"]["driver"] = $this->servers[$key]["driver"]; + $_POST["auth"]["server"] = $this->servers[$key]["server"]; + $_POST["auth"]["username"] = $this->servers[$key]["username"]; + $_POST["auth"]["password"] = $this->servers[$key]["password"]; + $_POST["auth"]["db"] = $this->servers[$key]["db"]; + } + } + + function loginFormField($name, $heading, $value) { + if ($name == 'driver') { + return 'Driver' . $value; + } elseif ($name == 'server') { + return 'Host' . $value; + } elseif ($name == 'db' && $_ENV['ADMINER_SERVERS'] != '') { + $out = $heading . $value; + $out .= 'or'; + $out .= 'Server'; + return $out; + } + } +} + +return new AdminerLoginServers(); \ No newline at end of file diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100644 index 0000000..3b510aa --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,8 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +max_line_length = 100 diff --git a/frontend/.gitattributes b/frontend/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/frontend/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/frontend/.prettierrc.json b/frontend/.prettierrc.json new file mode 100644 index 0000000..29a2402 --- /dev/null +++ b/frontend/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "singleQuote": true, + "printWidth": 100 +} diff --git a/frontend/components.json b/frontend/components.json new file mode 100644 index 0000000..5e683eb --- /dev/null +++ b/frontend/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://shadcn-vue.com/schema.json", + "style": "default", + "typescript": true, + "tailwind": { + "config": "", + "css": "src/styles/tailwind.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "composables": "@/composables" + }, + "registries": {} +} diff --git a/frontend/env.d.ts b/frontend/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/frontend/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontend/eslint.config.ts b/frontend/eslint.config.ts new file mode 100644 index 0000000..a244c8d --- /dev/null +++ b/frontend/eslint.config.ts @@ -0,0 +1,32 @@ +import { globalIgnores } from 'eslint/config' +import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript' +import pluginVue from 'eslint-plugin-vue' +import skipFormatting from '@vue/eslint-config-prettier/skip-formatting' + +// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: +// import { configureVueProject } from '@vue/eslint-config-typescript' +// configureVueProject({ scriptLangs: ['ts', 'tsx'] }) +// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup + +export default defineConfigWithVueTs( + { + name: 'app/files-to-lint', + files: ['**/*.{ts,mts,tsx,vue}'], + }, + + globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']), + + pluginVue.configs['flat/essential'], + vueTsConfigs.recommended, + skipFormatting, + + { + // Must come last to win over `flat/essential`. + // shadcn-vue components (Button, Card, ...) are single word by design. + name: 'app/rules', + files: ['**/*.{ts,mts,tsx,vue}'], + rules: { + 'vue/multi-word-component-names': 'off', + }, + }, +) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..714f888 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,18 @@ + + + + + + + + + App template + + +
+ + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..12863a1 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,58 @@ +{ + "name": "app-template-frontend", + "version": "0.0.0", + "private": true, + "type": "module", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build", + "lint": "eslint . --fix", + "format": "prettier --write src/", + "openapi": "openapi-typescript http://localhost:3000/api/docs/private/api.json -o ./src/lib/api.d.ts" + }, + "dependencies": { + "@lucide/vue": "^1.26.0", + "@tailwindcss/vite": "^4.3.0", + "@tanstack/vue-query": "^5.100.10", + "@tanstack/vue-query-devtools": "^6.1.29", + "@vueuse/core": "^14.3.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "http-status-ts": "^2.0.1", + "openapi-fetch": "^0.17.0", + "postcss": "^8.5.14", + "reka-ui": "^2.10.1", + "tailwind-merge": "^3.6.0", + "tailwindcss": "^4.3.0", + "tw-animate-css": "^1.4.0", + "vue": "^3.5.18", + "vue-i18n": "^11.4.2", + "vue-router": "^5.0.7", + "vue-sonner": "^2.0.9" + }, + "devDependencies": { + "@intlify/unplugin-vue-i18n": "^11.2.1", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.8.0", + "@vitejs/plugin-vue": "^6.0.7", + "@vue/eslint-config-prettier": "^10.2.0", + "@vue/eslint-config-typescript": "^14.7.0", + "@vue/tsconfig": "^0.9.1", + "eslint": "^10.4.0", + "eslint-plugin-vue": "~10.9.1", + "jiti": "^2.7.0", + "npm-run-all2": "^8.0.4", + "openapi-typescript": "^7.13.0", + "prettier": "3.8.3", + "typescript": "~5.9.3", + "vite": "^8.0.13", + "vite-plugin-vue-devtools": "^8.1.2", + "vue-tsc": "^3.2.9" + } +} diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..294eb49 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,16 @@ + + + diff --git a/frontend/src/components/AppContent.vue b/frontend/src/components/AppContent.vue new file mode 100644 index 0000000..d6ed1c4 --- /dev/null +++ b/frontend/src/components/AppContent.vue @@ -0,0 +1,11 @@ + + + diff --git a/frontend/src/components/AppSidebar.vue b/frontend/src/components/AppSidebar.vue new file mode 100644 index 0000000..a627344 --- /dev/null +++ b/frontend/src/components/AppSidebar.vue @@ -0,0 +1,105 @@ + + + diff --git a/frontend/src/components/ui/accordion/Accordion.vue b/frontend/src/components/ui/accordion/Accordion.vue new file mode 100644 index 0000000..21502b8 --- /dev/null +++ b/frontend/src/components/ui/accordion/Accordion.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend/src/components/ui/accordion/AccordionContent.vue b/frontend/src/components/ui/accordion/AccordionContent.vue new file mode 100644 index 0000000..353c808 --- /dev/null +++ b/frontend/src/components/ui/accordion/AccordionContent.vue @@ -0,0 +1,22 @@ + + + diff --git a/frontend/src/components/ui/accordion/AccordionItem.vue b/frontend/src/components/ui/accordion/AccordionItem.vue new file mode 100644 index 0000000..42253dc --- /dev/null +++ b/frontend/src/components/ui/accordion/AccordionItem.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend/src/components/ui/accordion/AccordionTrigger.vue b/frontend/src/components/ui/accordion/AccordionTrigger.vue new file mode 100644 index 0000000..8955be0 --- /dev/null +++ b/frontend/src/components/ui/accordion/AccordionTrigger.vue @@ -0,0 +1,31 @@ + + + diff --git a/frontend/src/components/ui/accordion/index.ts b/frontend/src/components/ui/accordion/index.ts new file mode 100644 index 0000000..9340ac0 --- /dev/null +++ b/frontend/src/components/ui/accordion/index.ts @@ -0,0 +1,4 @@ +export { default as Accordion } from './Accordion.vue' +export { default as AccordionContent } from './AccordionContent.vue' +export { default as AccordionItem } from './AccordionItem.vue' +export { default as AccordionTrigger } from './AccordionTrigger.vue' diff --git a/frontend/src/components/ui/alert-dialog/AlertDialog.vue b/frontend/src/components/ui/alert-dialog/AlertDialog.vue new file mode 100644 index 0000000..b4ac7e5 --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialog.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/AlertDialogAction.vue b/frontend/src/components/ui/alert-dialog/AlertDialogAction.vue new file mode 100644 index 0000000..a556c83 --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialogAction.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/AlertDialogCancel.vue b/frontend/src/components/ui/alert-dialog/AlertDialogCancel.vue new file mode 100644 index 0000000..3f47b52 --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialogCancel.vue @@ -0,0 +1,21 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/AlertDialogContent.vue b/frontend/src/components/ui/alert-dialog/AlertDialogContent.vue new file mode 100644 index 0000000..dc3b226 --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialogContent.vue @@ -0,0 +1,38 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/AlertDialogDescription.vue b/frontend/src/components/ui/alert-dialog/AlertDialogDescription.vue new file mode 100644 index 0000000..898743a --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialogDescription.vue @@ -0,0 +1,20 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/AlertDialogFooter.vue b/frontend/src/components/ui/alert-dialog/AlertDialogFooter.vue new file mode 100644 index 0000000..0ef9550 --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialogFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/AlertDialogHeader.vue b/frontend/src/components/ui/alert-dialog/AlertDialogHeader.vue new file mode 100644 index 0000000..3e6c3be --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialogHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/AlertDialogTitle.vue b/frontend/src/components/ui/alert-dialog/AlertDialogTitle.vue new file mode 100644 index 0000000..6b1ada6 --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialogTitle.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/AlertDialogTrigger.vue b/frontend/src/components/ui/alert-dialog/AlertDialogTrigger.vue new file mode 100644 index 0000000..e345909 --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/AlertDialogTrigger.vue @@ -0,0 +1,12 @@ + + + diff --git a/frontend/src/components/ui/alert-dialog/index.ts b/frontend/src/components/ui/alert-dialog/index.ts new file mode 100644 index 0000000..448d519 --- /dev/null +++ b/frontend/src/components/ui/alert-dialog/index.ts @@ -0,0 +1,9 @@ +export { default as AlertDialog } from './AlertDialog.vue' +export { default as AlertDialogAction } from './AlertDialogAction.vue' +export { default as AlertDialogCancel } from './AlertDialogCancel.vue' +export { default as AlertDialogContent } from './AlertDialogContent.vue' +export { default as AlertDialogDescription } from './AlertDialogDescription.vue' +export { default as AlertDialogFooter } from './AlertDialogFooter.vue' +export { default as AlertDialogHeader } from './AlertDialogHeader.vue' +export { default as AlertDialogTitle } from './AlertDialogTitle.vue' +export { default as AlertDialogTrigger } from './AlertDialogTrigger.vue' diff --git a/frontend/src/components/ui/badge/Badge.vue b/frontend/src/components/ui/badge/Badge.vue new file mode 100644 index 0000000..c811fdb --- /dev/null +++ b/frontend/src/components/ui/badge/Badge.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/components/ui/badge/index.ts b/frontend/src/components/ui/badge/index.ts new file mode 100644 index 0000000..ee08546 --- /dev/null +++ b/frontend/src/components/ui/badge/index.ts @@ -0,0 +1,25 @@ +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' + +export { default as Badge } from './Badge.vue' + +export const badgeVariants = cva( + 'inline-flex gap-1 items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + default: 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80', + outline: 'text-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +export type BadgeVariants = VariantProps diff --git a/frontend/src/components/ui/button/Button.vue b/frontend/src/components/ui/button/Button.vue new file mode 100644 index 0000000..47a80b6 --- /dev/null +++ b/frontend/src/components/ui/button/Button.vue @@ -0,0 +1,29 @@ + + + diff --git a/frontend/src/components/ui/button/index.ts b/frontend/src/components/ui/button/index.ts new file mode 100644 index 0000000..f4982ea --- /dev/null +++ b/frontend/src/components/ui/button/index.ts @@ -0,0 +1,36 @@ +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' + +export { default as Button } from './Button.vue' + +export const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90', + destructive: + 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: + 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', + secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-9 px-4 py-2 has-[>svg]:px-3', + sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', + lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', + icon: 'size-9', + 'icon-sm': 'size-8', + 'icon-lg': 'size-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export type ButtonVariants = VariantProps diff --git a/frontend/src/components/ui/card/Card.vue b/frontend/src/components/ui/card/Card.vue new file mode 100644 index 0000000..324f7bb --- /dev/null +++ b/frontend/src/components/ui/card/Card.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/card/CardContent.vue b/frontend/src/components/ui/card/CardContent.vue new file mode 100644 index 0000000..785913a --- /dev/null +++ b/frontend/src/components/ui/card/CardContent.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/card/CardDescription.vue b/frontend/src/components/ui/card/CardDescription.vue new file mode 100644 index 0000000..d5faedd --- /dev/null +++ b/frontend/src/components/ui/card/CardDescription.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/card/CardFooter.vue b/frontend/src/components/ui/card/CardFooter.vue new file mode 100644 index 0000000..1ed2efe --- /dev/null +++ b/frontend/src/components/ui/card/CardFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/card/CardHeader.vue b/frontend/src/components/ui/card/CardHeader.vue new file mode 100644 index 0000000..951d227 --- /dev/null +++ b/frontend/src/components/ui/card/CardHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/card/CardTitle.vue b/frontend/src/components/ui/card/CardTitle.vue new file mode 100644 index 0000000..fe6489a --- /dev/null +++ b/frontend/src/components/ui/card/CardTitle.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/card/index.ts b/frontend/src/components/ui/card/index.ts new file mode 100644 index 0000000..9ff6d5e --- /dev/null +++ b/frontend/src/components/ui/card/index.ts @@ -0,0 +1,6 @@ +export { default as Card } from './Card.vue' +export { default as CardContent } from './CardContent.vue' +export { default as CardDescription } from './CardDescription.vue' +export { default as CardFooter } from './CardFooter.vue' +export { default as CardHeader } from './CardHeader.vue' +export { default as CardTitle } from './CardTitle.vue' diff --git a/frontend/src/components/ui/combobox/Combobox.vue b/frontend/src/components/ui/combobox/Combobox.vue new file mode 100644 index 0000000..170e287 --- /dev/null +++ b/frontend/src/components/ui/combobox/Combobox.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend/src/components/ui/combobox/ComboboxAnchor.vue b/frontend/src/components/ui/combobox/ComboboxAnchor.vue new file mode 100644 index 0000000..1ae79a7 --- /dev/null +++ b/frontend/src/components/ui/combobox/ComboboxAnchor.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend/src/components/ui/combobox/ComboboxEmpty.vue b/frontend/src/components/ui/combobox/ComboboxEmpty.vue new file mode 100644 index 0000000..23e7bb0 --- /dev/null +++ b/frontend/src/components/ui/combobox/ComboboxEmpty.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/components/ui/combobox/ComboboxGroup.vue b/frontend/src/components/ui/combobox/ComboboxGroup.vue new file mode 100644 index 0000000..f3f2847 --- /dev/null +++ b/frontend/src/components/ui/combobox/ComboboxGroup.vue @@ -0,0 +1,33 @@ + + + diff --git a/frontend/src/components/ui/combobox/ComboboxInput.vue b/frontend/src/components/ui/combobox/ComboboxInput.vue new file mode 100644 index 0000000..df9bbae --- /dev/null +++ b/frontend/src/components/ui/combobox/ComboboxInput.vue @@ -0,0 +1,33 @@ + + + diff --git a/frontend/src/components/ui/combobox/ComboboxItem.vue b/frontend/src/components/ui/combobox/ComboboxItem.vue new file mode 100644 index 0000000..ac78344 --- /dev/null +++ b/frontend/src/components/ui/combobox/ComboboxItem.vue @@ -0,0 +1,28 @@ + + + diff --git a/frontend/src/components/ui/combobox/ComboboxList.vue b/frontend/src/components/ui/combobox/ComboboxList.vue new file mode 100644 index 0000000..7c315fa --- /dev/null +++ b/frontend/src/components/ui/combobox/ComboboxList.vue @@ -0,0 +1,39 @@ + + + diff --git a/frontend/src/components/ui/combobox/ComboboxSeparator.vue b/frontend/src/components/ui/combobox/ComboboxSeparator.vue new file mode 100644 index 0000000..2132b7a --- /dev/null +++ b/frontend/src/components/ui/combobox/ComboboxSeparator.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/components/ui/combobox/ComboboxTrigger.vue b/frontend/src/components/ui/combobox/ComboboxTrigger.vue new file mode 100644 index 0000000..187d5a9 --- /dev/null +++ b/frontend/src/components/ui/combobox/ComboboxTrigger.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend/src/components/ui/combobox/index.ts b/frontend/src/components/ui/combobox/index.ts new file mode 100644 index 0000000..f5177e3 --- /dev/null +++ b/frontend/src/components/ui/combobox/index.ts @@ -0,0 +1,11 @@ +export { default as Combobox } from './Combobox.vue' +export { default as ComboboxAnchor } from './ComboboxAnchor.vue' +export { default as ComboboxEmpty } from './ComboboxEmpty.vue' +export { default as ComboboxGroup } from './ComboboxGroup.vue' +export { default as ComboboxInput } from './ComboboxInput.vue' +export { default as ComboboxItem } from './ComboboxItem.vue' +export { default as ComboboxList } from './ComboboxList.vue' +export { default as ComboboxSeparator } from './ComboboxSeparator.vue' +export { default as ComboboxTrigger } from './ComboboxTrigger.vue' + +export { ComboboxCancel, ComboboxItemIndicator } from 'reka-ui' diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenu.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000..0aa4397 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000..0e081a4 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,35 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuContent.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000..5459231 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,36 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuGroup.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000..33184b8 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,12 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuItem.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000..22f80f9 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,41 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuLabel.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000..67e7f96 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,25 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000..8f67ecf --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000..8c2c077 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,36 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000..85b37b4 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,23 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000..1bcbb88 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuSub.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000..7d896c6 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000..3872214 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,29 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000..96a8aba --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,31 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/frontend/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000..3c58c78 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/dropdown-menu/index.ts b/frontend/src/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..f488d39 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { default as DropdownMenu } from './DropdownMenu.vue' + +export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' +export { default as DropdownMenuContent } from './DropdownMenuContent.vue' +export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' +export { default as DropdownMenuItem } from './DropdownMenuItem.vue' +export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' +export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' +export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' +export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' +export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' +export { default as DropdownMenuSub } from './DropdownMenuSub.vue' +export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' +export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' +export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' +export { DropdownMenuPortal } from 'reka-ui' diff --git a/frontend/src/components/ui/input/Input.vue b/frontend/src/components/ui/input/Input.vue new file mode 100644 index 0000000..e50bb82 --- /dev/null +++ b/frontend/src/components/ui/input/Input.vue @@ -0,0 +1,35 @@ + + + diff --git a/frontend/src/components/ui/input/index.ts b/frontend/src/components/ui/input/index.ts new file mode 100644 index 0000000..a691dd6 --- /dev/null +++ b/frontend/src/components/ui/input/index.ts @@ -0,0 +1 @@ +export { default as Input } from './Input.vue' diff --git a/frontend/src/components/ui/separator/Separator.vue b/frontend/src/components/ui/separator/Separator.vue new file mode 100644 index 0000000..013f1b1 --- /dev/null +++ b/frontend/src/components/ui/separator/Separator.vue @@ -0,0 +1,27 @@ + + + diff --git a/frontend/src/components/ui/separator/index.ts b/frontend/src/components/ui/separator/index.ts new file mode 100644 index 0000000..2287bcb --- /dev/null +++ b/frontend/src/components/ui/separator/index.ts @@ -0,0 +1 @@ +export { default as Separator } from './Separator.vue' diff --git a/frontend/src/components/ui/sheet/Sheet.vue b/frontend/src/components/ui/sheet/Sheet.vue new file mode 100644 index 0000000..5286652 --- /dev/null +++ b/frontend/src/components/ui/sheet/Sheet.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend/src/components/ui/sheet/SheetClose.vue b/frontend/src/components/ui/sheet/SheetClose.vue new file mode 100644 index 0000000..f9a549a --- /dev/null +++ b/frontend/src/components/ui/sheet/SheetClose.vue @@ -0,0 +1,12 @@ + + + diff --git a/frontend/src/components/ui/sheet/SheetContent.vue b/frontend/src/components/ui/sheet/SheetContent.vue new file mode 100644 index 0000000..a72cbd7 --- /dev/null +++ b/frontend/src/components/ui/sheet/SheetContent.vue @@ -0,0 +1,60 @@ + + + diff --git a/frontend/src/components/ui/sheet/SheetDescription.vue b/frontend/src/components/ui/sheet/SheetDescription.vue new file mode 100644 index 0000000..ab0e80f --- /dev/null +++ b/frontend/src/components/ui/sheet/SheetDescription.vue @@ -0,0 +1,21 @@ + + + diff --git a/frontend/src/components/ui/sheet/SheetFooter.vue b/frontend/src/components/ui/sheet/SheetFooter.vue new file mode 100644 index 0000000..2776cc6 --- /dev/null +++ b/frontend/src/components/ui/sheet/SheetFooter.vue @@ -0,0 +1,12 @@ + + + diff --git a/frontend/src/components/ui/sheet/SheetHeader.vue b/frontend/src/components/ui/sheet/SheetHeader.vue new file mode 100644 index 0000000..3a6d531 --- /dev/null +++ b/frontend/src/components/ui/sheet/SheetHeader.vue @@ -0,0 +1,12 @@ + + + diff --git a/frontend/src/components/ui/sheet/SheetOverlay.vue b/frontend/src/components/ui/sheet/SheetOverlay.vue new file mode 100644 index 0000000..f9bca11 --- /dev/null +++ b/frontend/src/components/ui/sheet/SheetOverlay.vue @@ -0,0 +1,26 @@ + + + diff --git a/frontend/src/components/ui/sheet/SheetTitle.vue b/frontend/src/components/ui/sheet/SheetTitle.vue new file mode 100644 index 0000000..e5e8ba7 --- /dev/null +++ b/frontend/src/components/ui/sheet/SheetTitle.vue @@ -0,0 +1,21 @@ + + + diff --git a/frontend/src/components/ui/sheet/SheetTrigger.vue b/frontend/src/components/ui/sheet/SheetTrigger.vue new file mode 100644 index 0000000..f1ad672 --- /dev/null +++ b/frontend/src/components/ui/sheet/SheetTrigger.vue @@ -0,0 +1,12 @@ + + + diff --git a/frontend/src/components/ui/sheet/index.ts b/frontend/src/components/ui/sheet/index.ts new file mode 100644 index 0000000..ee33431 --- /dev/null +++ b/frontend/src/components/ui/sheet/index.ts @@ -0,0 +1,8 @@ +export { default as Sheet } from './Sheet.vue' +export { default as SheetClose } from './SheetClose.vue' +export { default as SheetContent } from './SheetContent.vue' +export { default as SheetDescription } from './SheetDescription.vue' +export { default as SheetFooter } from './SheetFooter.vue' +export { default as SheetHeader } from './SheetHeader.vue' +export { default as SheetTitle } from './SheetTitle.vue' +export { default as SheetTrigger } from './SheetTrigger.vue' diff --git a/frontend/src/components/ui/sidebar/Sidebar.vue b/frontend/src/components/ui/sidebar/Sidebar.vue new file mode 100644 index 0000000..262ec3f --- /dev/null +++ b/frontend/src/components/ui/sidebar/Sidebar.vue @@ -0,0 +1,102 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarContent.vue b/frontend/src/components/ui/sidebar/SidebarContent.vue new file mode 100644 index 0000000..b7dac7e --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarContent.vue @@ -0,0 +1,23 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarFooter.vue b/frontend/src/components/ui/sidebar/SidebarFooter.vue new file mode 100644 index 0000000..c324dff --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarFooter.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarGroup.vue b/frontend/src/components/ui/sidebar/SidebarGroup.vue new file mode 100644 index 0000000..57a099f --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarGroup.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarGroupAction.vue b/frontend/src/components/ui/sidebar/SidebarGroupAction.vue new file mode 100644 index 0000000..dcbbe15 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarGroupAction.vue @@ -0,0 +1,31 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarGroupContent.vue b/frontend/src/components/ui/sidebar/SidebarGroupContent.vue new file mode 100644 index 0000000..5d5e2dd --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarGroupContent.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarGroupLabel.vue b/frontend/src/components/ui/sidebar/SidebarGroupLabel.vue new file mode 100644 index 0000000..fc13c68 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarGroupLabel.vue @@ -0,0 +1,30 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarHeader.vue b/frontend/src/components/ui/sidebar/SidebarHeader.vue new file mode 100644 index 0000000..00673f7 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarHeader.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarInput.vue b/frontend/src/components/ui/sidebar/SidebarInput.vue new file mode 100644 index 0000000..9d50abb --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarInput.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarInset.vue b/frontend/src/components/ui/sidebar/SidebarInset.vue new file mode 100644 index 0000000..8ef52cc --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarInset.vue @@ -0,0 +1,23 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenu.vue b/frontend/src/components/ui/sidebar/SidebarMenu.vue new file mode 100644 index 0000000..59ec071 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenu.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuAction.vue b/frontend/src/components/ui/sidebar/SidebarMenuAction.vue new file mode 100644 index 0000000..cad77ef --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuAction.vue @@ -0,0 +1,42 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuBadge.vue b/frontend/src/components/ui/sidebar/SidebarMenuBadge.vue new file mode 100644 index 0000000..a848ce7 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuBadge.vue @@ -0,0 +1,28 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuButton.vue b/frontend/src/components/ui/sidebar/SidebarMenuButton.vue new file mode 100644 index 0000000..3e62192 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuButton.vue @@ -0,0 +1,49 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuButtonChild.vue b/frontend/src/components/ui/sidebar/SidebarMenuButtonChild.vue new file mode 100644 index 0000000..ccf34e0 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuButtonChild.vue @@ -0,0 +1,36 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuItem.vue b/frontend/src/components/ui/sidebar/SidebarMenuItem.vue new file mode 100644 index 0000000..b7b4d3f --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuItem.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuSkeleton.vue b/frontend/src/components/ui/sidebar/SidebarMenuSkeleton.vue new file mode 100644 index 0000000..2c51fae --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuSkeleton.vue @@ -0,0 +1,31 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuSub.vue b/frontend/src/components/ui/sidebar/SidebarMenuSub.vue new file mode 100644 index 0000000..b7770a1 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuSub.vue @@ -0,0 +1,24 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuSubButton.vue b/frontend/src/components/ui/sidebar/SidebarMenuSubButton.vue new file mode 100644 index 0000000..305ab69 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuSubButton.vue @@ -0,0 +1,43 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarMenuSubItem.vue b/frontend/src/components/ui/sidebar/SidebarMenuSubItem.vue new file mode 100644 index 0000000..f0c35bc --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarMenuSubItem.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarProvider.vue b/frontend/src/components/ui/sidebar/SidebarProvider.vue new file mode 100644 index 0000000..bd90596 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarProvider.vue @@ -0,0 +1,97 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarRail.vue b/frontend/src/components/ui/sidebar/SidebarRail.vue new file mode 100644 index 0000000..8abe0d3 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarRail.vue @@ -0,0 +1,35 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarSeparator.vue b/frontend/src/components/ui/sidebar/SidebarSeparator.vue new file mode 100644 index 0000000..1803bff --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarSeparator.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend/src/components/ui/sidebar/SidebarTrigger.vue b/frontend/src/components/ui/sidebar/SidebarTrigger.vue new file mode 100644 index 0000000..c9de646 --- /dev/null +++ b/frontend/src/components/ui/sidebar/SidebarTrigger.vue @@ -0,0 +1,27 @@ + + + diff --git a/frontend/src/components/ui/sidebar/index.ts b/frontend/src/components/ui/sidebar/index.ts new file mode 100644 index 0000000..48da274 --- /dev/null +++ b/frontend/src/components/ui/sidebar/index.ts @@ -0,0 +1,60 @@ +import type { VariantProps } from 'class-variance-authority' +import type { HTMLAttributes } from 'vue' +import { cva } from 'class-variance-authority' + +export interface SidebarProps { + side?: 'left' | 'right' + variant?: 'sidebar' | 'floating' | 'inset' + collapsible?: 'offcanvas' | 'icon' | 'none' + class?: HTMLAttributes['class'] +} + +export { default as Sidebar } from './Sidebar.vue' +export { default as SidebarContent } from './SidebarContent.vue' +export { default as SidebarFooter } from './SidebarFooter.vue' +export { default as SidebarGroup } from './SidebarGroup.vue' +export { default as SidebarGroupAction } from './SidebarGroupAction.vue' +export { default as SidebarGroupContent } from './SidebarGroupContent.vue' +export { default as SidebarGroupLabel } from './SidebarGroupLabel.vue' +export { default as SidebarHeader } from './SidebarHeader.vue' +export { default as SidebarInput } from './SidebarInput.vue' +export { default as SidebarInset } from './SidebarInset.vue' +export { default as SidebarMenu } from './SidebarMenu.vue' +export { default as SidebarMenuAction } from './SidebarMenuAction.vue' +export { default as SidebarMenuBadge } from './SidebarMenuBadge.vue' +export { default as SidebarMenuButton } from './SidebarMenuButton.vue' +export { default as SidebarMenuItem } from './SidebarMenuItem.vue' +export { default as SidebarMenuSkeleton } from './SidebarMenuSkeleton.vue' +export { default as SidebarMenuSub } from './SidebarMenuSub.vue' +export { default as SidebarMenuSubButton } from './SidebarMenuSubButton.vue' +export { default as SidebarMenuSubItem } from './SidebarMenuSubItem.vue' +export { default as SidebarProvider } from './SidebarProvider.vue' +export { default as SidebarRail } from './SidebarRail.vue' +export { default as SidebarSeparator } from './SidebarSeparator.vue' +export { default as SidebarTrigger } from './SidebarTrigger.vue' + +export { useSidebar } from './utils' + +export const sidebarMenuButtonVariants = cva( + 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0', + { + variants: { + variant: { + default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground', + outline: + 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]', + }, + size: { + default: 'h-8 text-sm', + sm: 'h-7 text-xs', + lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export type SidebarMenuButtonVariants = VariantProps diff --git a/frontend/src/components/ui/sidebar/utils.ts b/frontend/src/components/ui/sidebar/utils.ts new file mode 100644 index 0000000..6edb140 --- /dev/null +++ b/frontend/src/components/ui/sidebar/utils.ts @@ -0,0 +1,19 @@ +import type { ComputedRef, Ref } from 'vue' +import { createContext } from 'reka-ui' + +export const SIDEBAR_COOKIE_NAME = 'sidebar_state' +export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 +export const SIDEBAR_WIDTH = '16rem' +export const SIDEBAR_WIDTH_MOBILE = '18rem' +export const SIDEBAR_WIDTH_ICON = '3rem' +export const SIDEBAR_KEYBOARD_SHORTCUT = 'b' + +export const [useSidebar, provideSidebarContext] = createContext<{ + state: ComputedRef<'expanded' | 'collapsed'> + open: Ref + setOpen: (value: boolean) => void + isMobile: Ref + openMobile: Ref + setOpenMobile: (value: boolean) => void + toggleSidebar: () => void +}>('Sidebar') diff --git a/frontend/src/components/ui/skeleton/Skeleton.vue b/frontend/src/components/ui/skeleton/Skeleton.vue new file mode 100644 index 0000000..50f3448 --- /dev/null +++ b/frontend/src/components/ui/skeleton/Skeleton.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/skeleton/index.ts b/frontend/src/components/ui/skeleton/index.ts new file mode 100644 index 0000000..be21fad --- /dev/null +++ b/frontend/src/components/ui/skeleton/index.ts @@ -0,0 +1 @@ +export { default as Skeleton } from './Skeleton.vue' diff --git a/frontend/src/components/ui/sonner/Sonner.vue b/frontend/src/components/ui/sonner/Sonner.vue new file mode 100644 index 0000000..c09fd0b --- /dev/null +++ b/frontend/src/components/ui/sonner/Sonner.vue @@ -0,0 +1,54 @@ + + + diff --git a/frontend/src/components/ui/sonner/index.ts b/frontend/src/components/ui/sonner/index.ts new file mode 100644 index 0000000..0d4a642 --- /dev/null +++ b/frontend/src/components/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Toaster } from './Sonner.vue' diff --git a/frontend/src/components/ui/switch/Switch.vue b/frontend/src/components/ui/switch/Switch.vue new file mode 100644 index 0000000..327255b --- /dev/null +++ b/frontend/src/components/ui/switch/Switch.vue @@ -0,0 +1,37 @@ + + + diff --git a/frontend/src/components/ui/switch/index.ts b/frontend/src/components/ui/switch/index.ts new file mode 100644 index 0000000..87b4b17 --- /dev/null +++ b/frontend/src/components/ui/switch/index.ts @@ -0,0 +1 @@ +export { default as Switch } from './Switch.vue' diff --git a/frontend/src/components/ui/table/Table.vue b/frontend/src/components/ui/table/Table.vue new file mode 100644 index 0000000..a423891 --- /dev/null +++ b/frontend/src/components/ui/table/Table.vue @@ -0,0 +1,16 @@ + + + diff --git a/frontend/src/components/ui/table/TableBody.vue b/frontend/src/components/ui/table/TableBody.vue new file mode 100644 index 0000000..ab7a937 --- /dev/null +++ b/frontend/src/components/ui/table/TableBody.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/table/TableCaption.vue b/frontend/src/components/ui/table/TableCaption.vue new file mode 100644 index 0000000..3904c56 --- /dev/null +++ b/frontend/src/components/ui/table/TableCaption.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/table/TableCell.vue b/frontend/src/components/ui/table/TableCell.vue new file mode 100644 index 0000000..eb8d2ba --- /dev/null +++ b/frontend/src/components/ui/table/TableCell.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/table/TableEmpty.vue b/frontend/src/components/ui/table/TableEmpty.vue new file mode 100644 index 0000000..575f949 --- /dev/null +++ b/frontend/src/components/ui/table/TableEmpty.vue @@ -0,0 +1,32 @@ + + + diff --git a/frontend/src/components/ui/table/TableFooter.vue b/frontend/src/components/ui/table/TableFooter.vue new file mode 100644 index 0000000..693a438 --- /dev/null +++ b/frontend/src/components/ui/table/TableFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/table/TableHead.vue b/frontend/src/components/ui/table/TableHead.vue new file mode 100644 index 0000000..7bab883 --- /dev/null +++ b/frontend/src/components/ui/table/TableHead.vue @@ -0,0 +1,21 @@ + + + diff --git a/frontend/src/components/ui/table/TableHeader.vue b/frontend/src/components/ui/table/TableHeader.vue new file mode 100644 index 0000000..220352f --- /dev/null +++ b/frontend/src/components/ui/table/TableHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/src/components/ui/table/TableRow.vue b/frontend/src/components/ui/table/TableRow.vue new file mode 100644 index 0000000..2164c2a --- /dev/null +++ b/frontend/src/components/ui/table/TableRow.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/components/ui/table/index.ts b/frontend/src/components/ui/table/index.ts new file mode 100644 index 0000000..2b4ce39 --- /dev/null +++ b/frontend/src/components/ui/table/index.ts @@ -0,0 +1,9 @@ +export { default as Table } from './Table.vue' +export { default as TableBody } from './TableBody.vue' +export { default as TableCaption } from './TableCaption.vue' +export { default as TableCell } from './TableCell.vue' +export { default as TableEmpty } from './TableEmpty.vue' +export { default as TableFooter } from './TableFooter.vue' +export { default as TableHead } from './TableHead.vue' +export { default as TableHeader } from './TableHeader.vue' +export { default as TableRow } from './TableRow.vue' diff --git a/frontend/src/components/ui/textarea/Textarea.vue b/frontend/src/components/ui/textarea/Textarea.vue new file mode 100644 index 0000000..c79e390 --- /dev/null +++ b/frontend/src/components/ui/textarea/Textarea.vue @@ -0,0 +1,32 @@ + + +