From 5c916bb87a470e07a68702b791393f58a1bbe6fe Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sat, 25 Jul 2026 10:12:14 +0700 Subject: [PATCH] copy from web folder and remove docs, register and onboarding --- .env.example | 2 + .gitignore | 29 + AGENTS.md | 47 + README.md | 75 + app/app.vue | 13 + app/assets/css/tailwind.css | 152 + app/components/AppSidebar.vue | 77 + app/components/ChartAreaInteractive.vue | 275 ++ app/components/DataTable.vue | 477 +++ app/components/DeleteDialog.vue | 59 + app/components/DragHandle.vue | 19 + app/components/DraggableRow.vue | 31 + app/components/LoginForm.vue | 170 ++ app/components/NavUser.vue | 108 + app/components/PriceDisplay.vue | 66 + app/components/RegisterForm.vue | 215 ++ app/components/SectionCards.vue | 106 + app/components/SiteHeader.vue | 101 + app/components/data-table/DataTable.vue | 136 + .../data-table/DataTablePagination.vue | 64 + app/components/ui/avatar/Avatar.vue | 18 + app/components/ui/avatar/AvatarFallback.vue | 21 + app/components/ui/avatar/AvatarImage.vue | 16 + app/components/ui/avatar/index.ts | 3 + app/components/ui/badge/Badge.vue | 26 + app/components/ui/badge/index.ts | 26 + app/components/ui/button/Button.vue | 31 + app/components/ui/button/index.ts | 40 + app/components/ui/card/Card.vue | 22 + app/components/ui/card/CardAction.vue | 17 + app/components/ui/card/CardContent.vue | 17 + app/components/ui/card/CardDescription.vue | 17 + app/components/ui/card/CardFooter.vue | 17 + app/components/ui/card/CardHeader.vue | 17 + app/components/ui/card/CardTitle.vue | 17 + app/components/ui/card/index.ts | 7 + app/components/ui/chart/ChartContainer.vue | 59 + .../ui/chart/ChartLegendContent.vue | 60 + app/components/ui/chart/ChartStyle.vue | 42 + .../ui/chart/ChartTooltipContent.vue | 105 + app/components/ui/chart/index.ts | 29 + app/components/ui/chart/utils.ts | 44 + app/components/ui/checkbox/Checkbox.vue | 35 + app/components/ui/checkbox/index.ts | 1 + app/components/ui/dialog/Dialog.vue | 19 + app/components/ui/dialog/DialogClose.vue | 15 + app/components/ui/dialog/DialogContent.vue | 53 + .../ui/dialog/DialogDescription.vue | 23 + app/components/ui/dialog/DialogFooter.vue | 27 + app/components/ui/dialog/DialogHeader.vue | 17 + app/components/ui/dialog/DialogOverlay.vue | 21 + .../ui/dialog/DialogScrollContent.vue | 59 + app/components/ui/dialog/DialogTitle.vue | 23 + app/components/ui/dialog/DialogTrigger.vue | 15 + app/components/ui/dialog/index.ts | 10 + .../ui/dropdown-menu/DropdownMenu.vue | 19 + .../DropdownMenuCheckboxItem.vue | 39 + .../ui/dropdown-menu/DropdownMenuContent.vue | 39 + .../ui/dropdown-menu/DropdownMenuGroup.vue | 15 + .../ui/dropdown-menu/DropdownMenuItem.vue | 31 + .../ui/dropdown-menu/DropdownMenuLabel.vue | 23 + .../dropdown-menu/DropdownMenuRadioGroup.vue | 21 + .../dropdown-menu/DropdownMenuRadioItem.vue | 40 + .../dropdown-menu/DropdownMenuSeparator.vue | 23 + .../ui/dropdown-menu/DropdownMenuShortcut.vue | 17 + .../ui/dropdown-menu/DropdownMenuSub.vue | 18 + .../dropdown-menu/DropdownMenuSubContent.vue | 27 + .../dropdown-menu/DropdownMenuSubTrigger.vue | 31 + .../ui/dropdown-menu/DropdownMenuTrigger.vue | 17 + app/components/ui/dropdown-menu/index.ts | 16 + app/components/ui/empty/Empty.vue | 20 + app/components/ui/empty/EmptyContent.vue | 20 + app/components/ui/empty/EmptyDescription.vue | 20 + app/components/ui/empty/EmptyHeader.vue | 20 + app/components/ui/empty/EmptyMedia.vue | 21 + app/components/ui/empty/EmptyTitle.vue | 17 + app/components/ui/empty/index.ts | 26 + app/components/ui/field/Field.vue | 25 + app/components/ui/field/FieldContent.vue | 20 + app/components/ui/field/FieldDescription.vue | 22 + app/components/ui/field/FieldError.vue | 53 + app/components/ui/field/FieldGroup.vue | 20 + app/components/ui/field/FieldLabel.vue | 23 + app/components/ui/field/FieldLegend.vue | 24 + app/components/ui/field/FieldSeparator.vue | 29 + app/components/ui/field/FieldSet.vue | 21 + app/components/ui/field/FieldTitle.vue | 20 + app/components/ui/field/index.ts | 39 + app/components/ui/input-group/InputGroup.vue | 35 + .../ui/input-group/InputGroupAddon.vue | 36 + .../ui/input-group/InputGroupButton.vue | 29 + .../ui/input-group/InputGroupInput.vue | 19 + .../ui/input-group/InputGroupText.vue | 19 + .../ui/input-group/InputGroupTextarea.vue | 19 + app/components/ui/input-group/index.ts | 51 + app/components/ui/input/Input.vue | 33 + app/components/ui/input/index.ts | 1 + app/components/ui/label/Label.vue | 26 + app/components/ui/label/index.ts | 1 + app/components/ui/select/Select.vue | 19 + app/components/ui/select/SelectContent.vue | 51 + app/components/ui/select/SelectGroup.vue | 15 + app/components/ui/select/SelectItem.vue | 44 + app/components/ui/select/SelectItemText.vue | 15 + app/components/ui/select/SelectLabel.vue | 17 + .../ui/select/SelectScrollDownButton.vue | 26 + .../ui/select/SelectScrollUpButton.vue | 26 + app/components/ui/select/SelectSeparator.vue | 19 + app/components/ui/select/SelectTrigger.vue | 33 + app/components/ui/select/SelectValue.vue | 15 + app/components/ui/select/index.ts | 11 + app/components/ui/separator/Separator.vue | 29 + app/components/ui/separator/index.ts | 1 + app/components/ui/sheet/Sheet.vue | 19 + app/components/ui/sheet/SheetClose.vue | 15 + app/components/ui/sheet/SheetContent.vue | 62 + app/components/ui/sheet/SheetDescription.vue | 21 + app/components/ui/sheet/SheetFooter.vue | 16 + app/components/ui/sheet/SheetHeader.vue | 15 + app/components/ui/sheet/SheetOverlay.vue | 21 + app/components/ui/sheet/SheetTitle.vue | 21 + app/components/ui/sheet/SheetTrigger.vue | 15 + app/components/ui/sheet/index.ts | 8 + app/components/ui/sidebar/Sidebar.vue | 96 + app/components/ui/sidebar/SidebarContent.vue | 18 + app/components/ui/sidebar/SidebarFooter.vue | 18 + app/components/ui/sidebar/SidebarGroup.vue | 18 + .../ui/sidebar/SidebarGroupAction.vue | 27 + .../ui/sidebar/SidebarGroupContent.vue | 18 + .../ui/sidebar/SidebarGroupLabel.vue | 25 + app/components/ui/sidebar/SidebarHeader.vue | 18 + app/components/ui/sidebar/SidebarInput.vue | 22 + app/components/ui/sidebar/SidebarInset.vue | 21 + app/components/ui/sidebar/SidebarMenu.vue | 18 + .../ui/sidebar/SidebarMenuAction.vue | 35 + .../ui/sidebar/SidebarMenuBadge.vue | 26 + .../ui/sidebar/SidebarMenuButton.vue | 48 + .../ui/sidebar/SidebarMenuButtonChild.vue | 36 + app/components/ui/sidebar/SidebarMenuItem.vue | 18 + .../ui/sidebar/SidebarMenuSkeleton.vue | 35 + app/components/ui/sidebar/SidebarMenuSub.vue | 22 + .../ui/sidebar/SidebarMenuSubButton.vue | 36 + .../ui/sidebar/SidebarMenuSubItem.vue | 18 + app/components/ui/sidebar/SidebarProvider.vue | 82 + app/components/ui/sidebar/SidebarRail.vue | 33 + .../ui/sidebar/SidebarSeparator.vue | 19 + app/components/ui/sidebar/SidebarTrigger.vue | 27 + app/components/ui/sidebar/index.ts | 60 + app/components/ui/sidebar/utils.ts | 19 + app/components/ui/skeleton/Skeleton.vue | 17 + app/components/ui/skeleton/index.ts | 1 + app/components/ui/sonner/Sonner.vue | 42 + app/components/ui/sonner/index.ts | 1 + app/components/ui/switch/Switch.vue | 38 + app/components/ui/switch/index.ts | 1 + app/components/ui/table/Table.vue | 16 + app/components/ui/table/TableBody.vue | 17 + app/components/ui/table/TableCaption.vue | 17 + app/components/ui/table/TableCell.vue | 22 + app/components/ui/table/TableEmpty.vue | 34 + app/components/ui/table/TableFooter.vue | 17 + app/components/ui/table/TableHead.vue | 17 + app/components/ui/table/TableHeader.vue | 17 + app/components/ui/table/TableRow.vue | 17 + app/components/ui/table/index.ts | 9 + app/components/ui/table/utils.ts | 10 + app/components/ui/tabs/Tabs.vue | 24 + app/components/ui/tabs/TabsContent.vue | 21 + app/components/ui/tabs/TabsList.vue | 24 + app/components/ui/tabs/TabsTrigger.vue | 26 + app/components/ui/tabs/index.ts | 4 + app/components/ui/textarea/Textarea.vue | 28 + app/components/ui/textarea/index.ts | 1 + app/components/ui/tooltip/Tooltip.vue | 19 + app/components/ui/tooltip/TooltipContent.vue | 34 + app/components/ui/tooltip/TooltipProvider.vue | 14 + app/components/ui/tooltip/TooltipTrigger.vue | 15 + app/components/ui/tooltip/index.ts | 4 + app/composables/useGoogleAuth.ts | 104 + app/lib/utils.ts | 13 + app/pages/admin/business-types/columns.ts | 130 + app/pages/admin/business-types/index.vue | 323 +++ app/pages/admin/dashboard/index.vue | 314 ++ app/pages/admin/plans/columns.ts | 145 + app/pages/admin/plans/index.vue | 333 +++ app/pages/auth/login/index.vue | 14 + bun.lock | 2552 +++++++++++++++++ components.json | 24 + nuxt.config.ts | 22 + package.json | 36 + public/favicon.ico | Bin 0 -> 4286 bytes public/robots.txt | 2 + tsconfig.json | 18 + 193 files changed, 10160 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 README.md create mode 100644 app/app.vue create mode 100644 app/assets/css/tailwind.css create mode 100644 app/components/AppSidebar.vue create mode 100644 app/components/ChartAreaInteractive.vue create mode 100644 app/components/DataTable.vue create mode 100644 app/components/DeleteDialog.vue create mode 100644 app/components/DragHandle.vue create mode 100644 app/components/DraggableRow.vue create mode 100644 app/components/LoginForm.vue create mode 100644 app/components/NavUser.vue create mode 100644 app/components/PriceDisplay.vue create mode 100644 app/components/RegisterForm.vue create mode 100644 app/components/SectionCards.vue create mode 100644 app/components/SiteHeader.vue create mode 100644 app/components/data-table/DataTable.vue create mode 100644 app/components/data-table/DataTablePagination.vue create mode 100644 app/components/ui/avatar/Avatar.vue create mode 100644 app/components/ui/avatar/AvatarFallback.vue create mode 100644 app/components/ui/avatar/AvatarImage.vue create mode 100644 app/components/ui/avatar/index.ts create mode 100644 app/components/ui/badge/Badge.vue create mode 100644 app/components/ui/badge/index.ts create mode 100644 app/components/ui/button/Button.vue create mode 100644 app/components/ui/button/index.ts create mode 100644 app/components/ui/card/Card.vue create mode 100644 app/components/ui/card/CardAction.vue create mode 100644 app/components/ui/card/CardContent.vue create mode 100644 app/components/ui/card/CardDescription.vue create mode 100644 app/components/ui/card/CardFooter.vue create mode 100644 app/components/ui/card/CardHeader.vue create mode 100644 app/components/ui/card/CardTitle.vue create mode 100644 app/components/ui/card/index.ts create mode 100644 app/components/ui/chart/ChartContainer.vue create mode 100644 app/components/ui/chart/ChartLegendContent.vue create mode 100644 app/components/ui/chart/ChartStyle.vue create mode 100644 app/components/ui/chart/ChartTooltipContent.vue create mode 100644 app/components/ui/chart/index.ts create mode 100644 app/components/ui/chart/utils.ts create mode 100644 app/components/ui/checkbox/Checkbox.vue create mode 100644 app/components/ui/checkbox/index.ts create mode 100644 app/components/ui/dialog/Dialog.vue create mode 100644 app/components/ui/dialog/DialogClose.vue create mode 100644 app/components/ui/dialog/DialogContent.vue create mode 100644 app/components/ui/dialog/DialogDescription.vue create mode 100644 app/components/ui/dialog/DialogFooter.vue create mode 100644 app/components/ui/dialog/DialogHeader.vue create mode 100644 app/components/ui/dialog/DialogOverlay.vue create mode 100644 app/components/ui/dialog/DialogScrollContent.vue create mode 100644 app/components/ui/dialog/DialogTitle.vue create mode 100644 app/components/ui/dialog/DialogTrigger.vue create mode 100644 app/components/ui/dialog/index.ts create mode 100644 app/components/ui/dropdown-menu/DropdownMenu.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuContent.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuGroup.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuItem.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuLabel.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuRadioItem.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuSeparator.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuShortcut.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuSub.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuSubContent.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue create mode 100644 app/components/ui/dropdown-menu/DropdownMenuTrigger.vue create mode 100644 app/components/ui/dropdown-menu/index.ts create mode 100644 app/components/ui/empty/Empty.vue create mode 100644 app/components/ui/empty/EmptyContent.vue create mode 100644 app/components/ui/empty/EmptyDescription.vue create mode 100644 app/components/ui/empty/EmptyHeader.vue create mode 100644 app/components/ui/empty/EmptyMedia.vue create mode 100644 app/components/ui/empty/EmptyTitle.vue create mode 100644 app/components/ui/empty/index.ts create mode 100644 app/components/ui/field/Field.vue create mode 100644 app/components/ui/field/FieldContent.vue create mode 100644 app/components/ui/field/FieldDescription.vue create mode 100644 app/components/ui/field/FieldError.vue create mode 100644 app/components/ui/field/FieldGroup.vue create mode 100644 app/components/ui/field/FieldLabel.vue create mode 100644 app/components/ui/field/FieldLegend.vue create mode 100644 app/components/ui/field/FieldSeparator.vue create mode 100644 app/components/ui/field/FieldSet.vue create mode 100644 app/components/ui/field/FieldTitle.vue create mode 100644 app/components/ui/field/index.ts create mode 100644 app/components/ui/input-group/InputGroup.vue create mode 100644 app/components/ui/input-group/InputGroupAddon.vue create mode 100644 app/components/ui/input-group/InputGroupButton.vue create mode 100644 app/components/ui/input-group/InputGroupInput.vue create mode 100644 app/components/ui/input-group/InputGroupText.vue create mode 100644 app/components/ui/input-group/InputGroupTextarea.vue create mode 100644 app/components/ui/input-group/index.ts create mode 100644 app/components/ui/input/Input.vue create mode 100644 app/components/ui/input/index.ts create mode 100644 app/components/ui/label/Label.vue create mode 100644 app/components/ui/label/index.ts create mode 100644 app/components/ui/select/Select.vue create mode 100644 app/components/ui/select/SelectContent.vue create mode 100644 app/components/ui/select/SelectGroup.vue create mode 100644 app/components/ui/select/SelectItem.vue create mode 100644 app/components/ui/select/SelectItemText.vue create mode 100644 app/components/ui/select/SelectLabel.vue create mode 100644 app/components/ui/select/SelectScrollDownButton.vue create mode 100644 app/components/ui/select/SelectScrollUpButton.vue create mode 100644 app/components/ui/select/SelectSeparator.vue create mode 100644 app/components/ui/select/SelectTrigger.vue create mode 100644 app/components/ui/select/SelectValue.vue create mode 100644 app/components/ui/select/index.ts create mode 100644 app/components/ui/separator/Separator.vue create mode 100644 app/components/ui/separator/index.ts create mode 100644 app/components/ui/sheet/Sheet.vue create mode 100644 app/components/ui/sheet/SheetClose.vue create mode 100644 app/components/ui/sheet/SheetContent.vue create mode 100644 app/components/ui/sheet/SheetDescription.vue create mode 100644 app/components/ui/sheet/SheetFooter.vue create mode 100644 app/components/ui/sheet/SheetHeader.vue create mode 100644 app/components/ui/sheet/SheetOverlay.vue create mode 100644 app/components/ui/sheet/SheetTitle.vue create mode 100644 app/components/ui/sheet/SheetTrigger.vue create mode 100644 app/components/ui/sheet/index.ts create mode 100644 app/components/ui/sidebar/Sidebar.vue create mode 100644 app/components/ui/sidebar/SidebarContent.vue create mode 100644 app/components/ui/sidebar/SidebarFooter.vue create mode 100644 app/components/ui/sidebar/SidebarGroup.vue create mode 100644 app/components/ui/sidebar/SidebarGroupAction.vue create mode 100644 app/components/ui/sidebar/SidebarGroupContent.vue create mode 100644 app/components/ui/sidebar/SidebarGroupLabel.vue create mode 100644 app/components/ui/sidebar/SidebarHeader.vue create mode 100644 app/components/ui/sidebar/SidebarInput.vue create mode 100644 app/components/ui/sidebar/SidebarInset.vue create mode 100644 app/components/ui/sidebar/SidebarMenu.vue create mode 100644 app/components/ui/sidebar/SidebarMenuAction.vue create mode 100644 app/components/ui/sidebar/SidebarMenuBadge.vue create mode 100644 app/components/ui/sidebar/SidebarMenuButton.vue create mode 100644 app/components/ui/sidebar/SidebarMenuButtonChild.vue create mode 100644 app/components/ui/sidebar/SidebarMenuItem.vue create mode 100644 app/components/ui/sidebar/SidebarMenuSkeleton.vue create mode 100644 app/components/ui/sidebar/SidebarMenuSub.vue create mode 100644 app/components/ui/sidebar/SidebarMenuSubButton.vue create mode 100644 app/components/ui/sidebar/SidebarMenuSubItem.vue create mode 100644 app/components/ui/sidebar/SidebarProvider.vue create mode 100644 app/components/ui/sidebar/SidebarRail.vue create mode 100644 app/components/ui/sidebar/SidebarSeparator.vue create mode 100644 app/components/ui/sidebar/SidebarTrigger.vue create mode 100644 app/components/ui/sidebar/index.ts create mode 100644 app/components/ui/sidebar/utils.ts create mode 100644 app/components/ui/skeleton/Skeleton.vue create mode 100644 app/components/ui/skeleton/index.ts create mode 100644 app/components/ui/sonner/Sonner.vue create mode 100644 app/components/ui/sonner/index.ts create mode 100644 app/components/ui/switch/Switch.vue create mode 100644 app/components/ui/switch/index.ts create mode 100644 app/components/ui/table/Table.vue create mode 100644 app/components/ui/table/TableBody.vue create mode 100644 app/components/ui/table/TableCaption.vue create mode 100644 app/components/ui/table/TableCell.vue create mode 100644 app/components/ui/table/TableEmpty.vue create mode 100644 app/components/ui/table/TableFooter.vue create mode 100644 app/components/ui/table/TableHead.vue create mode 100644 app/components/ui/table/TableHeader.vue create mode 100644 app/components/ui/table/TableRow.vue create mode 100644 app/components/ui/table/index.ts create mode 100644 app/components/ui/table/utils.ts create mode 100644 app/components/ui/tabs/Tabs.vue create mode 100644 app/components/ui/tabs/TabsContent.vue create mode 100644 app/components/ui/tabs/TabsList.vue create mode 100644 app/components/ui/tabs/TabsTrigger.vue create mode 100644 app/components/ui/tabs/index.ts create mode 100644 app/components/ui/textarea/Textarea.vue create mode 100644 app/components/ui/textarea/index.ts create mode 100644 app/components/ui/tooltip/Tooltip.vue create mode 100644 app/components/ui/tooltip/TooltipContent.vue create mode 100644 app/components/ui/tooltip/TooltipProvider.vue create mode 100644 app/components/ui/tooltip/TooltipTrigger.vue create mode 100644 app/components/ui/tooltip/index.ts create mode 100644 app/composables/useGoogleAuth.ts create mode 100644 app/lib/utils.ts create mode 100644 app/pages/admin/business-types/columns.ts create mode 100644 app/pages/admin/business-types/index.vue create mode 100644 app/pages/admin/dashboard/index.vue create mode 100644 app/pages/admin/plans/columns.ts create mode 100644 app/pages/admin/plans/index.vue create mode 100644 app/pages/auth/login/index.vue create mode 100644 bun.lock create mode 100644 components.json create mode 100644 nuxt.config.ts create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 tsconfig.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..de4e0d8 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +NUXT_PUBLIC_API_BASE=http://localhost:8000/v1 +NUXT_PUBLIC_GOOGLE_CLIENT_ID= \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b79730b --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Nuxt dev/build outputs +.output +.data +.nuxt +.nitro +.cache +dist + +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example + +.agents +.mcp.json +opencode.json +skills-lock.json \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..43cbe49 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,47 @@ +# AGENTS.md + +## Aturan Utama + +### Dokumentasi Perubahan + +**WAJIB** catat setiap perubahan yang dilakukan ke dalam folder `docs/history/` setelah selesai mengerjakan suatu fitur/bugfix/refactor. + +#### Format Penulisan + +Buat file markdown dengan nama format: `YYYY-MM-DD-singkatan-perubahan.md` + +Contoh: `2026-07-24-sidebar-icon-mode.md` + +#### Struktur Dokumen + +```markdown +# Judul Perubahan + +**Tanggal:** YYYY-MM-DD +**Status:** Selesai + +## Tujuan +Deskripsi singkat tujuan perubahan. + +## Yang Dikerjakan + +### 1. Judul Sub Perubahan +- Detail perubahan yang dilakukan +- Sebelum → Sesudah (jika ada perubahan value) + +## File yang Diubah + +| File | Aksi | Detail | +|------|------|--------| +| `path/to/file` | Diubah/Dibuat/Dihapus | Penjelasan singkat | + +## Notes +Catatan tambahan jika perlu. +``` + +#### Aturan Tambahan + +- Selalu cantumkan file apa saja yang diubah, dibuat, atau dihapus +- Gunakan tabel untuk perubahan value (sebelum → sesudah) +- Cantumkan behavior/efek perubahan jika relevan +- Dokumen harus dalam Bahasa Indonesia diff --git a/README.md b/README.md new file mode 100644 index 0000000..25b5821 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# Nuxt Minimal Starter + +Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. + +## Setup + +Make sure to install dependencies: + +```bash +# npm +npm install + +# pnpm +pnpm install + +# yarn +yarn install + +# bun +bun install +``` + +## Development Server + +Start the development server on `http://localhost:3000`: + +```bash +# npm +npm run dev + +# pnpm +pnpm dev + +# yarn +yarn dev + +# bun +bun run dev +``` + +## Production + +Build the application for production: + +```bash +# npm +npm run build + +# pnpm +pnpm build + +# yarn +yarn build + +# bun +bun run build +``` + +Locally preview production build: + +```bash +# npm +npm run preview + +# pnpm +pnpm preview + +# yarn +yarn preview + +# bun +bun run preview +``` + +Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. diff --git a/app/app.vue b/app/app.vue new file mode 100644 index 0000000..ab79902 --- /dev/null +++ b/app/app.vue @@ -0,0 +1,13 @@ + + + diff --git a/app/assets/css/tailwind.css b/app/assets/css/tailwind.css new file mode 100644 index 0000000..5a1e24d --- /dev/null +++ b/app/assets/css/tailwind.css @@ -0,0 +1,152 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap'); +@import "vue-sonner/style.css"; + +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --font-heading: var(--font-sans); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --color-foreground: var(--foreground); + --color-background: var(--background); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + + body { + @apply bg-background text-foreground; + } +} + +* { + scrollbar-width: thin; + scrollbar-color: #c4c4c4 transparent; +} + +.dark * { + scrollbar-color: #444 transparent; +} + +*::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +*::-webkit-scrollbar-track { + background: transparent; +} + +*::-webkit-scrollbar-thumb { + background-color: #c4c4c4; + border-radius: 9999px; +} + +.dark *::-webkit-scrollbar-thumb { + background-color: #444; +} \ No newline at end of file diff --git a/app/components/AppSidebar.vue b/app/components/AppSidebar.vue new file mode 100644 index 0000000..457b74b --- /dev/null +++ b/app/components/AppSidebar.vue @@ -0,0 +1,77 @@ + + + diff --git a/app/components/ChartAreaInteractive.vue b/app/components/ChartAreaInteractive.vue new file mode 100644 index 0000000..c4cb5db --- /dev/null +++ b/app/components/ChartAreaInteractive.vue @@ -0,0 +1,275 @@ + + + diff --git a/app/components/DataTable.vue b/app/components/DataTable.vue new file mode 100644 index 0000000..f316858 --- /dev/null +++ b/app/components/DataTable.vue @@ -0,0 +1,477 @@ + + + + + diff --git a/app/components/DeleteDialog.vue b/app/components/DeleteDialog.vue new file mode 100644 index 0000000..80201e8 --- /dev/null +++ b/app/components/DeleteDialog.vue @@ -0,0 +1,59 @@ + + + diff --git a/app/components/DragHandle.vue b/app/components/DragHandle.vue new file mode 100644 index 0000000..72aa1b7 --- /dev/null +++ b/app/components/DragHandle.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/DraggableRow.vue b/app/components/DraggableRow.vue new file mode 100644 index 0000000..f9e6232 --- /dev/null +++ b/app/components/DraggableRow.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/LoginForm.vue b/app/components/LoginForm.vue new file mode 100644 index 0000000..8d83dc9 --- /dev/null +++ b/app/components/LoginForm.vue @@ -0,0 +1,170 @@ + + + diff --git a/app/components/NavUser.vue b/app/components/NavUser.vue new file mode 100644 index 0000000..a275164 --- /dev/null +++ b/app/components/NavUser.vue @@ -0,0 +1,108 @@ + + + diff --git a/app/components/PriceDisplay.vue b/app/components/PriceDisplay.vue new file mode 100644 index 0000000..5a044ff --- /dev/null +++ b/app/components/PriceDisplay.vue @@ -0,0 +1,66 @@ + + + diff --git a/app/components/RegisterForm.vue b/app/components/RegisterForm.vue new file mode 100644 index 0000000..e43ee05 --- /dev/null +++ b/app/components/RegisterForm.vue @@ -0,0 +1,215 @@ + + + diff --git a/app/components/SectionCards.vue b/app/components/SectionCards.vue new file mode 100644 index 0000000..d37f845 --- /dev/null +++ b/app/components/SectionCards.vue @@ -0,0 +1,106 @@ + + + diff --git a/app/components/SiteHeader.vue b/app/components/SiteHeader.vue new file mode 100644 index 0000000..d32b6a1 --- /dev/null +++ b/app/components/SiteHeader.vue @@ -0,0 +1,101 @@ + + + diff --git a/app/components/data-table/DataTable.vue b/app/components/data-table/DataTable.vue new file mode 100644 index 0000000..83dfb67 --- /dev/null +++ b/app/components/data-table/DataTable.vue @@ -0,0 +1,136 @@ + + + diff --git a/app/components/data-table/DataTablePagination.vue b/app/components/data-table/DataTablePagination.vue new file mode 100644 index 0000000..86ef88d --- /dev/null +++ b/app/components/data-table/DataTablePagination.vue @@ -0,0 +1,64 @@ + + + diff --git a/app/components/ui/avatar/Avatar.vue b/app/components/ui/avatar/Avatar.vue new file mode 100644 index 0000000..bb7e669 --- /dev/null +++ b/app/components/ui/avatar/Avatar.vue @@ -0,0 +1,18 @@ + + + diff --git a/app/components/ui/avatar/AvatarFallback.vue b/app/components/ui/avatar/AvatarFallback.vue new file mode 100644 index 0000000..16b588a --- /dev/null +++ b/app/components/ui/avatar/AvatarFallback.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/ui/avatar/AvatarImage.vue b/app/components/ui/avatar/AvatarImage.vue new file mode 100644 index 0000000..24a8166 --- /dev/null +++ b/app/components/ui/avatar/AvatarImage.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/ui/avatar/index.ts b/app/components/ui/avatar/index.ts new file mode 100644 index 0000000..cf0e003 --- /dev/null +++ b/app/components/ui/avatar/index.ts @@ -0,0 +1,3 @@ +export { default as Avatar } from "./Avatar.vue" +export { default as AvatarFallback } from "./AvatarFallback.vue" +export { default as AvatarImage } from "./AvatarImage.vue" diff --git a/app/components/ui/badge/Badge.vue b/app/components/ui/badge/Badge.vue new file mode 100644 index 0000000..d894dfe --- /dev/null +++ b/app/components/ui/badge/Badge.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/ui/badge/index.ts b/app/components/ui/badge/index.ts new file mode 100644 index 0000000..635c961 --- /dev/null +++ b/app/components/ui/badge/index.ts @@ -0,0 +1,26 @@ +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 items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +) +export type BadgeVariants = VariantProps diff --git a/app/components/ui/button/Button.vue b/app/components/ui/button/Button.vue new file mode 100644 index 0000000..3763470 --- /dev/null +++ b/app/components/ui/button/Button.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/ui/button/index.ts b/app/components/ui/button/index.ts new file mode 100644 index 0000000..0a62178 --- /dev/null +++ b/app/components/ui/button/index.ts @@ -0,0 +1,40 @@ +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-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-white 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 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", + "xs": "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-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-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3", + "icon-sm": "size-8", + "icon-lg": "size-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +) +export type ButtonVariants = VariantProps diff --git a/app/components/ui/card/Card.vue b/app/components/ui/card/Card.vue new file mode 100644 index 0000000..f5a0707 --- /dev/null +++ b/app/components/ui/card/Card.vue @@ -0,0 +1,22 @@ + + + diff --git a/app/components/ui/card/CardAction.vue b/app/components/ui/card/CardAction.vue new file mode 100644 index 0000000..c91638b --- /dev/null +++ b/app/components/ui/card/CardAction.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/card/CardContent.vue b/app/components/ui/card/CardContent.vue new file mode 100644 index 0000000..dfbc552 --- /dev/null +++ b/app/components/ui/card/CardContent.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/card/CardDescription.vue b/app/components/ui/card/CardDescription.vue new file mode 100644 index 0000000..71c1b8d --- /dev/null +++ b/app/components/ui/card/CardDescription.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/card/CardFooter.vue b/app/components/ui/card/CardFooter.vue new file mode 100644 index 0000000..9e3739e --- /dev/null +++ b/app/components/ui/card/CardFooter.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/card/CardHeader.vue b/app/components/ui/card/CardHeader.vue new file mode 100644 index 0000000..4fe4da4 --- /dev/null +++ b/app/components/ui/card/CardHeader.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/card/CardTitle.vue b/app/components/ui/card/CardTitle.vue new file mode 100644 index 0000000..5f479e7 --- /dev/null +++ b/app/components/ui/card/CardTitle.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/card/index.ts b/app/components/ui/card/index.ts new file mode 100644 index 0000000..1627758 --- /dev/null +++ b/app/components/ui/card/index.ts @@ -0,0 +1,7 @@ +export { default as Card } from "./Card.vue" +export { default as CardAction } from "./CardAction.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/app/components/ui/chart/ChartContainer.vue b/app/components/ui/chart/ChartContainer.vue new file mode 100644 index 0000000..b4357f9 --- /dev/null +++ b/app/components/ui/chart/ChartContainer.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/app/components/ui/chart/ChartLegendContent.vue b/app/components/ui/chart/ChartLegendContent.vue new file mode 100644 index 0000000..3f79637 --- /dev/null +++ b/app/components/ui/chart/ChartLegendContent.vue @@ -0,0 +1,60 @@ + + + diff --git a/app/components/ui/chart/ChartStyle.vue b/app/components/ui/chart/ChartStyle.vue new file mode 100644 index 0000000..d6f59dd --- /dev/null +++ b/app/components/ui/chart/ChartStyle.vue @@ -0,0 +1,42 @@ + + + diff --git a/app/components/ui/chart/ChartTooltipContent.vue b/app/components/ui/chart/ChartTooltipContent.vue new file mode 100644 index 0000000..801851f --- /dev/null +++ b/app/components/ui/chart/ChartTooltipContent.vue @@ -0,0 +1,105 @@ + + + diff --git a/app/components/ui/chart/index.ts b/app/components/ui/chart/index.ts new file mode 100644 index 0000000..12b8062 --- /dev/null +++ b/app/components/ui/chart/index.ts @@ -0,0 +1,29 @@ +import type { Component, Ref } from "vue" +import { createContext } from "reka-ui" + +export { default as ChartContainer } from "./ChartContainer.vue" +export { default as ChartLegendContent } from "./ChartLegendContent.vue" +export { default as ChartTooltipContent } from "./ChartTooltipContent.vue" +export { componentToString } from "./utils" + +// Format: { THEME_NAME: CSS_SELECTOR } +export const THEMES = { light: "", dark: ".dark" } as const + +export type ChartConfig = { + [k in string]: { + label?: string | Component + icon?: string | Component + } & ( + | { color?: string, theme?: never } + | { color?: never, theme: Record } + ) +} + +interface ChartContextProps { + id: string + config: Ref +} + +export const [useChart, provideChartContext] = createContext("Chart") + +export { VisCrosshair as ChartCrosshair, VisTooltip as ChartTooltip } from "@unovis/vue" diff --git a/app/components/ui/chart/utils.ts b/app/components/ui/chart/utils.ts new file mode 100644 index 0000000..b6d0652 --- /dev/null +++ b/app/components/ui/chart/utils.ts @@ -0,0 +1,44 @@ +import type { ChartConfig } from "." +import { isClient } from "@vueuse/core" +import { useId } from "reka-ui" +import { h, render } from "vue" + +// Simple cache using a Map to store serialized object keys +const cache = new Map() + +// Convert object to a consistent string key +function serializeKey(key: Record): string { + return JSON.stringify(key, Object.keys(key).sort()) +} + +interface Constructor

{ + __isFragment?: never + __isTeleport?: never + __isSuspense?: never + new (...args: any[]): { + $props: P + } +} + +export function componentToString

(config: ChartConfig, component: Constructor

, props?: P) { + if (!isClient) + return + + // This function will be called once during mount lifecycle + const id = useId() + + // https://unovis.dev/docs/auxiliary/Crosshair#component-props + return (_data: any, x: number | Date) => { + const data = "data" in _data ? _data.data : _data + const serializedKey = `${id}-${serializeKey(data)}` + const cachedContent = cache.get(serializedKey) + if (cachedContent) + return cachedContent + + const vnode = h(component, { ...props, payload: data, config, x }) + const div = document.createElement("div") + render(vnode, div) + cache.set(serializedKey, div.innerHTML) + return div.innerHTML + } +} diff --git a/app/components/ui/checkbox/Checkbox.vue b/app/components/ui/checkbox/Checkbox.vue new file mode 100644 index 0000000..b8e0485 --- /dev/null +++ b/app/components/ui/checkbox/Checkbox.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/ui/checkbox/index.ts b/app/components/ui/checkbox/index.ts new file mode 100644 index 0000000..3391a85 --- /dev/null +++ b/app/components/ui/checkbox/index.ts @@ -0,0 +1 @@ +export { default as Checkbox } from "./Checkbox.vue" diff --git a/app/components/ui/dialog/Dialog.vue b/app/components/ui/dialog/Dialog.vue new file mode 100644 index 0000000..ade5260 --- /dev/null +++ b/app/components/ui/dialog/Dialog.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/ui/dialog/DialogClose.vue b/app/components/ui/dialog/DialogClose.vue new file mode 100644 index 0000000..c5fae04 --- /dev/null +++ b/app/components/ui/dialog/DialogClose.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/ui/dialog/DialogContent.vue b/app/components/ui/dialog/DialogContent.vue new file mode 100644 index 0000000..05172f0 --- /dev/null +++ b/app/components/ui/dialog/DialogContent.vue @@ -0,0 +1,53 @@ + + + diff --git a/app/components/ui/dialog/DialogDescription.vue b/app/components/ui/dialog/DialogDescription.vue new file mode 100644 index 0000000..f52e655 --- /dev/null +++ b/app/components/ui/dialog/DialogDescription.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/ui/dialog/DialogFooter.vue b/app/components/ui/dialog/DialogFooter.vue new file mode 100644 index 0000000..c7500a9 --- /dev/null +++ b/app/components/ui/dialog/DialogFooter.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/ui/dialog/DialogHeader.vue b/app/components/ui/dialog/DialogHeader.vue new file mode 100644 index 0000000..bfc3c64 --- /dev/null +++ b/app/components/ui/dialog/DialogHeader.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/dialog/DialogOverlay.vue b/app/components/ui/dialog/DialogOverlay.vue new file mode 100644 index 0000000..7790077 --- /dev/null +++ b/app/components/ui/dialog/DialogOverlay.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/ui/dialog/DialogScrollContent.vue b/app/components/ui/dialog/DialogScrollContent.vue new file mode 100644 index 0000000..abfb3a1 --- /dev/null +++ b/app/components/ui/dialog/DialogScrollContent.vue @@ -0,0 +1,59 @@ + + + diff --git a/app/components/ui/dialog/DialogTitle.vue b/app/components/ui/dialog/DialogTitle.vue new file mode 100644 index 0000000..860f01a --- /dev/null +++ b/app/components/ui/dialog/DialogTitle.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/ui/dialog/DialogTrigger.vue b/app/components/ui/dialog/DialogTrigger.vue new file mode 100644 index 0000000..49667e9 --- /dev/null +++ b/app/components/ui/dialog/DialogTrigger.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/ui/dialog/index.ts b/app/components/ui/dialog/index.ts new file mode 100644 index 0000000..6768b09 --- /dev/null +++ b/app/components/ui/dialog/index.ts @@ -0,0 +1,10 @@ +export { default as Dialog } from "./Dialog.vue" +export { default as DialogClose } from "./DialogClose.vue" +export { default as DialogContent } from "./DialogContent.vue" +export { default as DialogDescription } from "./DialogDescription.vue" +export { default as DialogFooter } from "./DialogFooter.vue" +export { default as DialogHeader } from "./DialogHeader.vue" +export { default as DialogOverlay } from "./DialogOverlay.vue" +export { default as DialogScrollContent } from "./DialogScrollContent.vue" +export { default as DialogTitle } from "./DialogTitle.vue" +export { default as DialogTrigger } from "./DialogTrigger.vue" diff --git a/app/components/ui/dropdown-menu/DropdownMenu.vue b/app/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000..e1c9ee3 --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/app/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000..5dab856 --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,39 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuContent.vue b/app/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000..7c43014 --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,39 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuGroup.vue b/app/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000..da634ec --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuItem.vue b/app/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000..fde7a6d --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuLabel.vue b/app/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000..8bca83c --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/app/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000..fe82cad --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/app/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000..c26cb94 --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000..1b936c3 --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/app/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000..60be75c --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuSub.vue b/app/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000..7472e77 --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,18 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/app/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000..5f6da9b --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/app/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000..48b0594 --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/app/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000..75cd747 --- /dev/null +++ b/app/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/dropdown-menu/index.ts b/app/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..955fe3a --- /dev/null +++ b/app/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/app/components/ui/empty/Empty.vue b/app/components/ui/empty/Empty.vue new file mode 100644 index 0000000..2637b3c --- /dev/null +++ b/app/components/ui/empty/Empty.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/ui/empty/EmptyContent.vue b/app/components/ui/empty/EmptyContent.vue new file mode 100644 index 0000000..d19ee00 --- /dev/null +++ b/app/components/ui/empty/EmptyContent.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/ui/empty/EmptyDescription.vue b/app/components/ui/empty/EmptyDescription.vue new file mode 100644 index 0000000..e4ed5fb --- /dev/null +++ b/app/components/ui/empty/EmptyDescription.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/ui/empty/EmptyHeader.vue b/app/components/ui/empty/EmptyHeader.vue new file mode 100644 index 0000000..ac21d8c --- /dev/null +++ b/app/components/ui/empty/EmptyHeader.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/ui/empty/EmptyMedia.vue b/app/components/ui/empty/EmptyMedia.vue new file mode 100644 index 0000000..c68397c --- /dev/null +++ b/app/components/ui/empty/EmptyMedia.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/ui/empty/EmptyTitle.vue b/app/components/ui/empty/EmptyTitle.vue new file mode 100644 index 0000000..90c950d --- /dev/null +++ b/app/components/ui/empty/EmptyTitle.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/ui/empty/index.ts b/app/components/ui/empty/index.ts new file mode 100644 index 0000000..ce0c489 --- /dev/null +++ b/app/components/ui/empty/index.ts @@ -0,0 +1,26 @@ +import type { VariantProps } from "class-variance-authority" +import { cva } from "class-variance-authority" + +export { default as Empty } from "./Empty.vue" +export { default as EmptyContent } from "./EmptyContent.vue" +export { default as EmptyDescription } from "./EmptyDescription.vue" +export { default as EmptyHeader } from "./EmptyHeader.vue" +export { default as EmptyMedia } from "./EmptyMedia.vue" +export { default as EmptyTitle } from "./EmptyTitle.vue" + +export const emptyMediaVariants = cva( + "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-transparent", + icon: "bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +) + +export type EmptyMediaVariants = VariantProps diff --git a/app/components/ui/field/Field.vue b/app/components/ui/field/Field.vue new file mode 100644 index 0000000..5519d37 --- /dev/null +++ b/app/components/ui/field/Field.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/ui/field/FieldContent.vue b/app/components/ui/field/FieldContent.vue new file mode 100644 index 0000000..d9a23fd --- /dev/null +++ b/app/components/ui/field/FieldContent.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/ui/field/FieldDescription.vue b/app/components/ui/field/FieldDescription.vue new file mode 100644 index 0000000..7240a83 --- /dev/null +++ b/app/components/ui/field/FieldDescription.vue @@ -0,0 +1,22 @@ + + + diff --git a/app/components/ui/field/FieldError.vue b/app/components/ui/field/FieldError.vue new file mode 100644 index 0000000..8a0a63f --- /dev/null +++ b/app/components/ui/field/FieldError.vue @@ -0,0 +1,53 @@ + + + diff --git a/app/components/ui/field/FieldGroup.vue b/app/components/ui/field/FieldGroup.vue new file mode 100644 index 0000000..834d8ce --- /dev/null +++ b/app/components/ui/field/FieldGroup.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/ui/field/FieldLabel.vue b/app/components/ui/field/FieldLabel.vue new file mode 100644 index 0000000..ce6c498 --- /dev/null +++ b/app/components/ui/field/FieldLabel.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/ui/field/FieldLegend.vue b/app/components/ui/field/FieldLegend.vue new file mode 100644 index 0000000..c620fed --- /dev/null +++ b/app/components/ui/field/FieldLegend.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/ui/field/FieldSeparator.vue b/app/components/ui/field/FieldSeparator.vue new file mode 100644 index 0000000..97d0efa --- /dev/null +++ b/app/components/ui/field/FieldSeparator.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/ui/field/FieldSet.vue b/app/components/ui/field/FieldSet.vue new file mode 100644 index 0000000..7be4dc9 --- /dev/null +++ b/app/components/ui/field/FieldSet.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/ui/field/FieldTitle.vue b/app/components/ui/field/FieldTitle.vue new file mode 100644 index 0000000..f564b8b --- /dev/null +++ b/app/components/ui/field/FieldTitle.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/ui/field/index.ts b/app/components/ui/field/index.ts new file mode 100644 index 0000000..162ba14 --- /dev/null +++ b/app/components/ui/field/index.ts @@ -0,0 +1,39 @@ +import type { VariantProps } from "class-variance-authority" +import { cva } from "class-variance-authority" + +export const fieldVariants = cva( + "group/field flex w-full gap-3 data-[invalid=true]:text-destructive", + { + variants: { + orientation: { + vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"], + horizontal: [ + "flex-row items-center", + "[&>[data-slot=field-label]]:flex-auto", + "has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", + ], + responsive: [ + "flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto", + "@md/field-group:[&>[data-slot=field-label]]:flex-auto", + "@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", + ], + }, + }, + defaultVariants: { + orientation: "vertical", + }, + }, +) + +export type FieldVariants = VariantProps + +export { default as Field } from "./Field.vue" +export { default as FieldContent } from "./FieldContent.vue" +export { default as FieldDescription } from "./FieldDescription.vue" +export { default as FieldError } from "./FieldError.vue" +export { default as FieldGroup } from "./FieldGroup.vue" +export { default as FieldLabel } from "./FieldLabel.vue" +export { default as FieldLegend } from "./FieldLegend.vue" +export { default as FieldSeparator } from "./FieldSeparator.vue" +export { default as FieldSet } from "./FieldSet.vue" +export { default as FieldTitle } from "./FieldTitle.vue" diff --git a/app/components/ui/input-group/InputGroup.vue b/app/components/ui/input-group/InputGroup.vue new file mode 100644 index 0000000..53f37cb --- /dev/null +++ b/app/components/ui/input-group/InputGroup.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/ui/input-group/InputGroupAddon.vue b/app/components/ui/input-group/InputGroupAddon.vue new file mode 100644 index 0000000..709f482 --- /dev/null +++ b/app/components/ui/input-group/InputGroupAddon.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/ui/input-group/InputGroupButton.vue b/app/components/ui/input-group/InputGroupButton.vue new file mode 100644 index 0000000..027329e --- /dev/null +++ b/app/components/ui/input-group/InputGroupButton.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/ui/input-group/InputGroupInput.vue b/app/components/ui/input-group/InputGroupInput.vue new file mode 100644 index 0000000..ca7cbb9 --- /dev/null +++ b/app/components/ui/input-group/InputGroupInput.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/ui/input-group/InputGroupText.vue b/app/components/ui/input-group/InputGroupText.vue new file mode 100644 index 0000000..fa9b36c --- /dev/null +++ b/app/components/ui/input-group/InputGroupText.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/ui/input-group/InputGroupTextarea.vue b/app/components/ui/input-group/InputGroupTextarea.vue new file mode 100644 index 0000000..2090be2 --- /dev/null +++ b/app/components/ui/input-group/InputGroupTextarea.vue @@ -0,0 +1,19 @@ + + +