├── .env.example ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── app ├── app.config.ts ├── app.vue ├── assets │ └── index.css ├── components │ ├── AppBranding.vue │ ├── AppNavigation.vue │ ├── AppThemeSelector.vue │ ├── AuthFormForgotPassword.vue │ ├── AuthFormLogin.vue │ ├── AuthFormRegister.vue │ ├── AuthFormResetPassword.vue │ ├── AuthPageContainer.vue │ ├── AuthTestimonial.vue │ ├── FormFieldBase.vue │ ├── HalftoneWaves.vue │ ├── ProductCard.vue │ ├── SettingsFormAccount.vue │ ├── SettingsFormSecurity.vue │ ├── SettingsHeader.vue │ ├── content │ │ └── ProsePre.vue │ └── ui │ │ ├── accordion │ │ ├── Accordion.vue │ │ ├── AccordionContent.vue │ │ ├── AccordionItem.vue │ │ ├── AccordionTrigger.vue │ │ └── index.ts │ │ ├── alert-dialog │ │ ├── AlertDialog.vue │ │ ├── AlertDialogAction.vue │ │ ├── AlertDialogCancel.vue │ │ ├── AlertDialogContent.vue │ │ ├── AlertDialogDescription.vue │ │ ├── AlertDialogFooter.vue │ │ ├── AlertDialogHeader.vue │ │ ├── AlertDialogTitle.vue │ │ ├── AlertDialogTrigger.vue │ │ └── index.ts │ │ ├── alert │ │ ├── Alert.vue │ │ ├── AlertDescription.vue │ │ ├── AlertTitle.vue │ │ └── index.ts │ │ ├── aspect-ratio │ │ ├── AspectRatio.vue │ │ └── index.ts │ │ ├── auto-form │ │ ├── AutoForm.vue │ │ ├── AutoFormField.vue │ │ ├── AutoFormFieldArray.vue │ │ ├── AutoFormFieldBoolean.vue │ │ ├── AutoFormFieldDate.vue │ │ ├── AutoFormFieldEnum.vue │ │ ├── AutoFormFieldFile.vue │ │ ├── AutoFormFieldInput.vue │ │ ├── AutoFormFieldNumber.vue │ │ ├── AutoFormFieldObject.vue │ │ ├── AutoFormLabel.vue │ │ ├── constant.ts │ │ ├── dependencies.ts │ │ ├── index.ts │ │ ├── interface.ts │ │ └── utils.ts │ │ ├── avatar │ │ ├── Avatar.vue │ │ ├── AvatarFallback.vue │ │ ├── AvatarImage.vue │ │ └── index.ts │ │ ├── badge │ │ ├── Badge.vue │ │ └── index.ts │ │ ├── breadcrumb │ │ ├── Breadcrumb.vue │ │ ├── BreadcrumbEllipsis.vue │ │ ├── BreadcrumbItem.vue │ │ ├── BreadcrumbLink.vue │ │ ├── BreadcrumbList.vue │ │ ├── BreadcrumbPage.vue │ │ ├── BreadcrumbSeparator.vue │ │ └── index.ts │ │ ├── button │ │ ├── Button.vue │ │ └── index.ts │ │ ├── calendar │ │ ├── Calendar.vue │ │ ├── CalendarCell.vue │ │ ├── CalendarCellTrigger.vue │ │ ├── CalendarGrid.vue │ │ ├── CalendarGridBody.vue │ │ ├── CalendarGridHead.vue │ │ ├── CalendarGridRow.vue │ │ ├── CalendarHeadCell.vue │ │ ├── CalendarHeader.vue │ │ ├── CalendarHeading.vue │ │ ├── CalendarNextButton.vue │ │ ├── CalendarPrevButton.vue │ │ └── index.ts │ │ ├── card │ │ ├── Card.vue │ │ ├── CardContent.vue │ │ ├── CardDescription.vue │ │ ├── CardFooter.vue │ │ ├── CardHeader.vue │ │ ├── CardTitle.vue │ │ └── index.ts │ │ ├── carousel │ │ ├── Carousel.vue │ │ ├── CarouselContent.vue │ │ ├── CarouselItem.vue │ │ ├── CarouselNext.vue │ │ ├── CarouselPrevious.vue │ │ ├── index.ts │ │ ├── interface.ts │ │ └── useCarousel.ts │ │ ├── chart-area │ │ ├── AreaChart.vue │ │ └── index.ts │ │ ├── chart-bar │ │ ├── BarChart.vue │ │ └── index.ts │ │ ├── chart-donut │ │ ├── DonutChart.vue │ │ └── index.ts │ │ ├── chart-line │ │ ├── LineChart.vue │ │ └── index.ts │ │ ├── chart │ │ ├── ChartCrosshair.vue │ │ ├── ChartLegend.vue │ │ ├── ChartSingleTooltip.vue │ │ ├── ChartTooltip.vue │ │ ├── index.ts │ │ └── interface.ts │ │ ├── checkbox │ │ ├── Checkbox.vue │ │ └── index.ts │ │ ├── collapsible │ │ ├── Collapsible.vue │ │ ├── CollapsibleContent.vue │ │ ├── CollapsibleTrigger.vue │ │ └── index.ts │ │ ├── command │ │ ├── Command.vue │ │ ├── CommandDialog.vue │ │ ├── CommandEmpty.vue │ │ ├── CommandGroup.vue │ │ ├── CommandInput.vue │ │ ├── CommandItem.vue │ │ ├── CommandList.vue │ │ ├── CommandSeparator.vue │ │ ├── CommandShortcut.vue │ │ └── index.ts │ │ ├── context-menu │ │ ├── ContextMenu.vue │ │ ├── ContextMenuCheckboxItem.vue │ │ ├── ContextMenuContent.vue │ │ ├── ContextMenuGroup.vue │ │ ├── ContextMenuItem.vue │ │ ├── ContextMenuLabel.vue │ │ ├── ContextMenuPortal.vue │ │ ├── ContextMenuRadioGroup.vue │ │ ├── ContextMenuRadioItem.vue │ │ ├── ContextMenuSeparator.vue │ │ ├── ContextMenuShortcut.vue │ │ ├── ContextMenuSub.vue │ │ ├── ContextMenuSubContent.vue │ │ ├── ContextMenuSubTrigger.vue │ │ ├── ContextMenuTrigger.vue │ │ └── index.ts │ │ ├── dialog │ │ ├── Dialog.vue │ │ ├── DialogClose.vue │ │ ├── DialogContent.vue │ │ ├── DialogDescription.vue │ │ ├── DialogFooter.vue │ │ ├── DialogHeader.vue │ │ ├── DialogScrollContent.vue │ │ ├── DialogTitle.vue │ │ ├── DialogTrigger.vue │ │ └── index.ts │ │ ├── drawer │ │ ├── Drawer.vue │ │ ├── DrawerContent.vue │ │ ├── DrawerDescription.vue │ │ ├── DrawerFooter.vue │ │ ├── DrawerHeader.vue │ │ ├── DrawerOverlay.vue │ │ ├── DrawerTitle.vue │ │ └── index.ts │ │ ├── dropdown-menu │ │ ├── DropdownMenu.vue │ │ ├── DropdownMenuCheckboxItem.vue │ │ ├── DropdownMenuContent.vue │ │ ├── DropdownMenuGroup.vue │ │ ├── DropdownMenuItem.vue │ │ ├── DropdownMenuLabel.vue │ │ ├── DropdownMenuRadioGroup.vue │ │ ├── DropdownMenuRadioItem.vue │ │ ├── DropdownMenuSeparator.vue │ │ ├── DropdownMenuShortcut.vue │ │ ├── DropdownMenuSub.vue │ │ ├── DropdownMenuSubContent.vue │ │ ├── DropdownMenuSubTrigger.vue │ │ ├── DropdownMenuTrigger.vue │ │ └── index.ts │ │ ├── form │ │ ├── FormControl.vue │ │ ├── FormDescription.vue │ │ ├── FormItem.vue │ │ ├── FormLabel.vue │ │ ├── FormMessage.vue │ │ ├── index.ts │ │ ├── injectionKeys.ts │ │ └── useFormField.ts │ │ ├── hover-card │ │ ├── HoverCard.vue │ │ ├── HoverCardContent.vue │ │ ├── HoverCardTrigger.vue │ │ └── index.ts │ │ ├── input │ │ ├── Input.vue │ │ └── index.ts │ │ ├── label │ │ ├── Label.vue │ │ └── index.ts │ │ ├── menubar │ │ ├── Menubar.vue │ │ ├── MenubarCheckboxItem.vue │ │ ├── MenubarContent.vue │ │ ├── MenubarGroup.vue │ │ ├── MenubarItem.vue │ │ ├── MenubarLabel.vue │ │ ├── MenubarMenu.vue │ │ ├── MenubarRadioGroup.vue │ │ ├── MenubarRadioItem.vue │ │ ├── MenubarSeparator.vue │ │ ├── MenubarShortcut.vue │ │ ├── MenubarSub.vue │ │ ├── MenubarSubContent.vue │ │ ├── MenubarSubTrigger.vue │ │ ├── MenubarTrigger.vue │ │ └── index.ts │ │ ├── navigation-menu │ │ ├── NavigationMenu.vue │ │ ├── NavigationMenuContent.vue │ │ ├── NavigationMenuIndicator.vue │ │ ├── NavigationMenuItem.vue │ │ ├── NavigationMenuLink.vue │ │ ├── NavigationMenuList.vue │ │ ├── NavigationMenuTrigger.vue │ │ ├── NavigationMenuViewport.vue │ │ └── index.ts │ │ ├── number-field │ │ ├── NumberField.vue │ │ ├── NumberFieldContent.vue │ │ ├── NumberFieldDecrement.vue │ │ ├── NumberFieldIncrement.vue │ │ ├── NumberFieldInput.vue │ │ └── index.ts │ │ ├── pagination │ │ ├── PaginationEllipsis.vue │ │ ├── PaginationFirst.vue │ │ ├── PaginationLast.vue │ │ ├── PaginationNext.vue │ │ ├── PaginationPrev.vue │ │ └── index.ts │ │ ├── pin-input │ │ ├── PinInput.vue │ │ ├── PinInputGroup.vue │ │ ├── PinInputInput.vue │ │ ├── PinInputSeparator.vue │ │ └── index.ts │ │ ├── popover │ │ ├── Popover.vue │ │ ├── PopoverContent.vue │ │ ├── PopoverTrigger.vue │ │ └── index.ts │ │ ├── progress │ │ ├── Progress.vue │ │ └── index.ts │ │ ├── radio-group │ │ ├── RadioGroup.vue │ │ ├── RadioGroupItem.vue │ │ └── index.ts │ │ ├── range-calendar │ │ ├── RangeCalendar.vue │ │ ├── RangeCalendarCell.vue │ │ ├── RangeCalendarCellTrigger.vue │ │ ├── RangeCalendarGrid.vue │ │ ├── RangeCalendarGridBody.vue │ │ ├── RangeCalendarGridHead.vue │ │ ├── RangeCalendarGridRow.vue │ │ ├── RangeCalendarHeadCell.vue │ │ ├── RangeCalendarHeader.vue │ │ ├── RangeCalendarHeading.vue │ │ ├── RangeCalendarNextButton.vue │ │ ├── RangeCalendarPrevButton.vue │ │ └── index.ts │ │ ├── resizable │ │ ├── ResizableHandle.vue │ │ ├── ResizablePanelGroup.vue │ │ └── index.ts │ │ ├── scroll-area │ │ ├── ScrollArea.vue │ │ ├── ScrollBar.vue │ │ └── index.ts │ │ ├── select │ │ ├── Select.vue │ │ ├── SelectContent.vue │ │ ├── SelectGroup.vue │ │ ├── SelectItem.vue │ │ ├── SelectItemText.vue │ │ ├── SelectLabel.vue │ │ ├── SelectScrollDownButton.vue │ │ ├── SelectScrollUpButton.vue │ │ ├── SelectSeparator.vue │ │ ├── SelectTrigger.vue │ │ ├── SelectValue.vue │ │ └── index.ts │ │ ├── separator │ │ ├── Separator.vue │ │ └── index.ts │ │ ├── sheet │ │ ├── Sheet.vue │ │ ├── SheetClose.vue │ │ ├── SheetContent.vue │ │ ├── SheetDescription.vue │ │ ├── SheetFooter.vue │ │ ├── SheetHeader.vue │ │ ├── SheetTitle.vue │ │ ├── SheetTrigger.vue │ │ └── index.ts │ │ ├── sidebar │ │ ├── Sidebar.vue │ │ ├── SidebarContent.vue │ │ ├── SidebarFooter.vue │ │ ├── SidebarGroup.vue │ │ ├── SidebarGroupAction.vue │ │ ├── SidebarGroupContent.vue │ │ ├── SidebarGroupLabel.vue │ │ ├── SidebarHeader.vue │ │ ├── SidebarInput.vue │ │ ├── SidebarInset.vue │ │ ├── SidebarMenu.vue │ │ ├── SidebarMenuAction.vue │ │ ├── SidebarMenuBadge.vue │ │ ├── SidebarMenuButton.vue │ │ ├── SidebarMenuButtonChild.vue │ │ ├── SidebarMenuItem.vue │ │ ├── SidebarMenuSkeleton.vue │ │ ├── SidebarMenuSub.vue │ │ ├── SidebarMenuSubButton.vue │ │ ├── SidebarMenuSubItem.vue │ │ ├── SidebarProvider.vue │ │ ├── SidebarRail.vue │ │ ├── SidebarSeparator.vue │ │ ├── SidebarTrigger.vue │ │ ├── index.ts │ │ └── utils.ts │ │ ├── skeleton │ │ ├── Skeleton.vue │ │ └── index.ts │ │ ├── slider │ │ ├── Slider.vue │ │ └── index.ts │ │ ├── stepper │ │ ├── Stepper.vue │ │ ├── StepperDescription.vue │ │ ├── StepperIndicator.vue │ │ ├── StepperItem.vue │ │ ├── StepperSeparator.vue │ │ ├── StepperTitle.vue │ │ ├── StepperTrigger.vue │ │ └── index.ts │ │ ├── switch │ │ ├── Switch.vue │ │ └── index.ts │ │ ├── table │ │ ├── Table.vue │ │ ├── TableBody.vue │ │ ├── TableCaption.vue │ │ ├── TableCell.vue │ │ ├── TableEmpty.vue │ │ ├── TableFooter.vue │ │ ├── TableHead.vue │ │ ├── TableHeader.vue │ │ ├── TableRow.vue │ │ └── index.ts │ │ ├── tabs │ │ ├── Tabs.vue │ │ ├── TabsContent.vue │ │ ├── TabsList.vue │ │ ├── TabsTrigger.vue │ │ └── index.ts │ │ ├── tags-input │ │ ├── TagsInput.vue │ │ ├── TagsInputInput.vue │ │ ├── TagsInputItem.vue │ │ ├── TagsInputItemDelete.vue │ │ ├── TagsInputItemText.vue │ │ └── index.ts │ │ ├── textarea │ │ ├── Textarea.vue │ │ └── index.ts │ │ ├── toast │ │ ├── Toast.vue │ │ ├── ToastAction.vue │ │ ├── ToastClose.vue │ │ ├── ToastDescription.vue │ │ ├── ToastProvider.vue │ │ ├── ToastTitle.vue │ │ ├── ToastViewport.vue │ │ ├── Toaster.vue │ │ ├── index.ts │ │ └── use-toast.ts │ │ ├── toggle-group │ │ ├── ToggleGroup.vue │ │ ├── ToggleGroupItem.vue │ │ └── index.ts │ │ ├── toggle │ │ ├── Toggle.vue │ │ └── index.ts │ │ └── tooltip │ │ ├── Tooltip.vue │ │ ├── TooltipContent.vue │ │ ├── TooltipProvider.vue │ │ ├── TooltipTrigger.vue │ │ └── index.ts ├── layouts │ ├── auth.vue │ ├── default.vue │ ├── docs.vue │ ├── landing.vue │ └── settings.vue ├── middleware │ └── auth.ts ├── pages │ ├── app │ │ ├── another-page │ │ │ └── index.vue │ │ ├── index.vue │ │ ├── settings │ │ │ ├── account.vue │ │ │ ├── billing.vue │ │ │ └── security.vue │ │ └── third-page │ │ │ └── index.vue │ ├── auth │ │ ├── forgot-password.vue │ │ ├── login.vue │ │ ├── register.vue │ │ ├── reset-password.vue │ │ └── verify-email.vue │ ├── docs │ │ └── [...path].vue │ └── index.vue └── stores │ └── user.ts ├── components.json ├── content.config.ts ├── content └── docs │ ├── 1.getting-started │ ├── 1.index.md │ ├── 2.installation.md │ └── 3.setup.md │ ├── 2.auth │ ├── 1.index.md │ ├── 2.client-side.md │ └── 3.server-side.md │ ├── 3.database │ └── 1.index.md │ ├── 4.emails │ └── 1.index.md │ ├── 5.configuration │ └── 1.index.md │ ├── 6.payments │ └── 1.index.md │ └── 7.deployment │ └── 1.index.md ├── drizzle.config.ts ├── eslint.config.mjs ├── lib └── auth-client.ts ├── nuxt.config.ts ├── package.json ├── pnpm-lock.yaml ├── public ├── favicon.ico └── robots.txt ├── server ├── api │ ├── auth │ │ └── [...all].ts │ └── billing │ │ ├── checkout.get.ts │ │ ├── portal.get.ts │ │ ├── subscription.get.ts │ │ ├── success.get.ts │ │ └── webhook.post.ts ├── database │ ├── migrations │ │ ├── 0000_futuristic_devos.sql │ │ ├── 0001_fantastic_magik.sql │ │ ├── 0002_exotic_magneto.sql │ │ ├── 0003_smiling_aqueduct.sql │ │ └── meta │ │ │ ├── 0000_snapshot.json │ │ │ ├── 0001_snapshot.json │ │ │ ├── 0002_snapshot.json │ │ │ ├── 0003_snapshot.json │ │ │ └── _journal.json │ ├── schema.ts │ └── schemas │ │ ├── accounts.ts │ │ ├── purchases.ts │ │ ├── sessions.ts │ │ ├── shared.ts │ │ ├── subscriptions.ts │ │ ├── users.ts │ │ └── verifications.ts ├── emails │ ├── AccountConfirmationEmail.vue │ ├── ChangeEmailEmail.vue │ ├── PasswordResetEmail.vue │ └── base.vue ├── middleware │ └── 1.authentication.ts ├── tsconfig.json └── utils │ ├── auth.ts │ ├── drizzle.ts │ ├── emails.ts │ ├── enhanced-request.ts │ └── stripe.ts ├── tailwind.config.js └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | NUXT_PUBLIC_SITE_URL=http://localhost:3000 2 | 3 | # Mail configuration 4 | # See https://github.com/eckhardt-d/mailchannels-dev 5 | NUXT_MAIL_CHANNELS_BASE_URL=http://localhost:8008 6 | NUXT_MAIL_CHANNELS_API_KEY= 7 | NUXT_MAIL_SENDER_EMAIL= 8 | NUXT_MAIL_SENDER_NAME= 9 | 10 | # Stripe configuration 11 | NUXT_STRIPE_SECRET_KEY= 12 | NUXT_STRIPE_WEBHOOK_SECRET= 13 | 14 | # Should not be prefixed with NUXT_ 15 | # Secure random 32 character string 16 | BETTER_AUTH_SECRET= 17 | BETTER_AUTH_URL=http://localhost:3000 18 | 19 | 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .data 4 | .nuxt 5 | .nitro 6 | .cache 7 | .wrangler 8 | dist 9 | 10 | # Node dependencies 11 | node_modules 12 | 13 | # Logs 14 | logs 15 | *.log 16 | 17 | # Misc 18 | .DS_Store 19 | .fleet 20 | .idea 21 | 22 | # Local env files 23 | .env 24 | .env.* 25 | !.env.example 26 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2025 Kaizen Media CC 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /app/app.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 14 | -------------------------------------------------------------------------------- /app/components/AppBranding.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 17 | -------------------------------------------------------------------------------- /app/components/AuthTestimonial.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 15 | -------------------------------------------------------------------------------- /app/components/FormFieldBase.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 30 | -------------------------------------------------------------------------------- /app/components/SettingsHeader.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /app/components/content/ProsePre.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | 23 | -------------------------------------------------------------------------------- /app/components/ui/accordion/Accordion.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /app/components/ui/accordion/AccordionContent.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 27 | -------------------------------------------------------------------------------- /app/components/ui/accordion/AccordionItem.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /app/components/ui/accordion/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Accordion } from './Accordion.vue' 2 | export { default as AccordionContent } from './AccordionContent.vue' 3 | export { default as AccordionItem } from './AccordionItem.vue' 4 | export { default as AccordionTrigger } from './AccordionTrigger.vue' 5 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/AlertDialog.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/AlertDialogAction.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 23 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/AlertDialogCancel.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 30 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/AlertDialogDescription.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 28 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/AlertDialogFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/AlertDialogHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/AlertDialogTitle.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/AlertDialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/alert-dialog/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AlertDialog } from './AlertDialog.vue' 2 | export { default as AlertDialogAction } from './AlertDialogAction.vue' 3 | export { default as AlertDialogCancel } from './AlertDialogCancel.vue' 4 | export { default as AlertDialogContent } from './AlertDialogContent.vue' 5 | export { default as AlertDialogDescription } from './AlertDialogDescription.vue' 6 | export { default as AlertDialogFooter } from './AlertDialogFooter.vue' 7 | export { default as AlertDialogHeader } from './AlertDialogHeader.vue' 8 | export { default as AlertDialogTitle } from './AlertDialogTitle.vue' 9 | export { default as AlertDialogTrigger } from './AlertDialogTrigger.vue' 10 | -------------------------------------------------------------------------------- /app/components/ui/alert/Alert.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /app/components/ui/alert/AlertDescription.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/alert/AlertTitle.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/alert/index.ts: -------------------------------------------------------------------------------- 1 | import type { VariantProps } from 'class-variance-authority' 2 | import { cva } from 'class-variance-authority' 3 | 4 | export { default as Alert } from './Alert.vue' 5 | export { default as AlertDescription } from './AlertDescription.vue' 6 | export { default as AlertTitle } from './AlertTitle.vue' 7 | 8 | export const alertVariants = cva( 9 | 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', 10 | { 11 | variants: { 12 | variant: { 13 | default: 'bg-background text-foreground', 14 | destructive: 15 | 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', 16 | }, 17 | }, 18 | defaultVariants: { 19 | variant: 'default', 20 | }, 21 | }, 22 | ) 23 | 24 | export type AlertVariants = VariantProps 25 | -------------------------------------------------------------------------------- /app/components/ui/aspect-ratio/AspectRatio.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/aspect-ratio/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AspectRatio } from './AspectRatio.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/auto-form/AutoFormLabel.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 15 | -------------------------------------------------------------------------------- /app/components/ui/auto-form/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AutoForm } from './AutoForm.vue' 2 | export { default as AutoFormField } from './AutoFormField.vue' 3 | 4 | export { default as AutoFormFieldArray } from './AutoFormFieldArray.vue' 5 | export { default as AutoFormFieldBoolean } from './AutoFormFieldBoolean.vue' 6 | export { default as AutoFormFieldDate } from './AutoFormFieldDate.vue' 7 | 8 | export { default as AutoFormFieldEnum } from './AutoFormFieldEnum.vue' 9 | export { default as AutoFormFieldFile } from './AutoFormFieldFile.vue' 10 | export { default as AutoFormFieldInput } from './AutoFormFieldInput.vue' 11 | export { default as AutoFormFieldNumber } from './AutoFormFieldNumber.vue' 12 | export { default as AutoFormFieldObject } from './AutoFormFieldObject.vue' 13 | export { default as AutoFormLabel } from './AutoFormLabel.vue' 14 | export type { Config, ConfigItem, FieldProps } from './interface' 15 | export { getBaseSchema, getBaseType, getObjectFormSchema } from './utils' 16 | -------------------------------------------------------------------------------- /app/components/ui/avatar/Avatar.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 23 | -------------------------------------------------------------------------------- /app/components/ui/avatar/AvatarFallback.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/avatar/AvatarImage.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/components/ui/avatar/index.ts: -------------------------------------------------------------------------------- 1 | import type { VariantProps } from 'class-variance-authority' 2 | import { cva } from 'class-variance-authority' 3 | 4 | export { default as Avatar } from './Avatar.vue' 5 | export { default as AvatarFallback } from './AvatarFallback.vue' 6 | export { default as AvatarImage } from './AvatarImage.vue' 7 | 8 | export const avatarVariant = cva( 9 | 'inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden', 10 | { 11 | variants: { 12 | size: { 13 | sm: 'h-10 w-10 text-xs', 14 | base: 'h-16 w-16 text-2xl', 15 | lg: 'h-32 w-32 text-5xl', 16 | }, 17 | shape: { 18 | circle: 'rounded-full', 19 | square: 'rounded-md', 20 | }, 21 | }, 22 | }, 23 | ) 24 | 25 | export type AvatarVariants = VariantProps 26 | -------------------------------------------------------------------------------- /app/components/ui/badge/Badge.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /app/components/ui/badge/index.ts: -------------------------------------------------------------------------------- 1 | import type { VariantProps } from 'class-variance-authority' 2 | import { cva } from 'class-variance-authority' 3 | 4 | export { default as Badge } from './Badge.vue' 5 | 6 | export const badgeVariants = cva( 7 | 'inline-flex 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', 8 | { 9 | variants: { 10 | variant: { 11 | default: 12 | 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80', 13 | secondary: 14 | 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', 15 | destructive: 16 | 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80', 17 | outline: 'text-foreground', 18 | }, 19 | }, 20 | defaultVariants: { 21 | variant: 'default', 22 | }, 23 | }, 24 | ) 25 | 26 | export type BadgeVariants = VariantProps 27 | -------------------------------------------------------------------------------- /app/components/ui/breadcrumb/Breadcrumb.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /app/components/ui/breadcrumb/BreadcrumbEllipsis.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 23 | -------------------------------------------------------------------------------- /app/components/ui/breadcrumb/BreadcrumbItem.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /app/components/ui/breadcrumb/BreadcrumbLink.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /app/components/ui/breadcrumb/BreadcrumbList.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /app/components/ui/breadcrumb/BreadcrumbPage.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | -------------------------------------------------------------------------------- /app/components/ui/breadcrumb/BreadcrumbSeparator.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /app/components/ui/breadcrumb/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Breadcrumb } from './Breadcrumb.vue' 2 | export { default as BreadcrumbEllipsis } from './BreadcrumbEllipsis.vue' 3 | export { default as BreadcrumbItem } from './BreadcrumbItem.vue' 4 | export { default as BreadcrumbLink } from './BreadcrumbLink.vue' 5 | export { default as BreadcrumbList } from './BreadcrumbList.vue' 6 | export { default as BreadcrumbPage } from './BreadcrumbPage.vue' 7 | export { default as BreadcrumbSeparator } from './BreadcrumbSeparator.vue' 8 | -------------------------------------------------------------------------------- /app/components/ui/button/Button.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 29 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarCell.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarGrid.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarGridBody.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarGridHead.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarGridRow.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarHeadCell.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarHeader.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarHeading.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 34 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarNextButton.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 35 | -------------------------------------------------------------------------------- /app/components/ui/calendar/CalendarPrevButton.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 35 | -------------------------------------------------------------------------------- /app/components/ui/calendar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Calendar } from './Calendar.vue' 2 | export { default as CalendarCell } from './CalendarCell.vue' 3 | export { default as CalendarCellTrigger } from './CalendarCellTrigger.vue' 4 | export { default as CalendarGrid } from './CalendarGrid.vue' 5 | export { default as CalendarGridBody } from './CalendarGridBody.vue' 6 | export { default as CalendarGridHead } from './CalendarGridHead.vue' 7 | export { default as CalendarGridRow } from './CalendarGridRow.vue' 8 | export { default as CalendarHeadCell } from './CalendarHeadCell.vue' 9 | export { default as CalendarHeader } from './CalendarHeader.vue' 10 | export { default as CalendarHeading } from './CalendarHeading.vue' 11 | export { default as CalendarNextButton } from './CalendarNextButton.vue' 12 | export { default as CalendarPrevButton } from './CalendarPrevButton.vue' 13 | -------------------------------------------------------------------------------- /app/components/ui/card/Card.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | -------------------------------------------------------------------------------- /app/components/ui/card/CardContent.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/card/CardDescription.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/card/CardFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/card/CardHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/card/CardTitle.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /app/components/ui/card/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Card } from './Card.vue' 2 | export { default as CardContent } from './CardContent.vue' 3 | export { default as CardDescription } from './CardDescription.vue' 4 | export { default as CardFooter } from './CardFooter.vue' 5 | export { default as CardHeader } from './CardHeader.vue' 6 | export { default as CardTitle } from './CardTitle.vue' 7 | -------------------------------------------------------------------------------- /app/components/ui/carousel/CarouselContent.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 30 | -------------------------------------------------------------------------------- /app/components/ui/carousel/CarouselItem.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | -------------------------------------------------------------------------------- /app/components/ui/carousel/CarouselNext.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 32 | -------------------------------------------------------------------------------- /app/components/ui/carousel/CarouselPrevious.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 32 | -------------------------------------------------------------------------------- /app/components/ui/carousel/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Carousel } from './Carousel.vue' 2 | export { default as CarouselContent } from './CarouselContent.vue' 3 | export { default as CarouselItem } from './CarouselItem.vue' 4 | export { default as CarouselNext } from './CarouselNext.vue' 5 | export { default as CarouselPrevious } from './CarouselPrevious.vue' 6 | export type { 7 | UnwrapRefCarouselApi as CarouselApi, 8 | } from './interface' 9 | 10 | export { useCarousel } from './useCarousel' 11 | -------------------------------------------------------------------------------- /app/components/ui/carousel/interface.ts: -------------------------------------------------------------------------------- 1 | import type useEmblaCarousel from 'embla-carousel-vue' 2 | import type { 3 | EmblaCarouselVueType, 4 | } from 'embla-carousel-vue' 5 | import type { HTMLAttributes, UnwrapRef } from 'vue' 6 | 7 | type CarouselApi = EmblaCarouselVueType[1] 8 | type UseCarouselParameters = Parameters 9 | type CarouselOptions = UseCarouselParameters[0] 10 | type CarouselPlugin = UseCarouselParameters[1] 11 | 12 | export type UnwrapRefCarouselApi = UnwrapRef 13 | 14 | export interface CarouselProps { 15 | opts?: CarouselOptions 16 | plugins?: CarouselPlugin 17 | orientation?: 'horizontal' | 'vertical' 18 | } 19 | 20 | export interface CarouselEmits { 21 | (e: 'init-api', payload: UnwrapRefCarouselApi): void 22 | } 23 | 24 | export interface WithClassAsProps { 25 | class?: HTMLAttributes['class'] 26 | } 27 | -------------------------------------------------------------------------------- /app/components/ui/chart-donut/index.ts: -------------------------------------------------------------------------------- 1 | export { default as DonutChart } from './DonutChart.vue' 2 | 3 | import type { Spacing } from '@unovis/ts' 4 | 5 | type KeyOf> = Extract 6 | 7 | export interface BaseChartProps> { 8 | /** 9 | * The source data, in which each entry is a dictionary. 10 | */ 11 | data: T[] 12 | /** 13 | * Sets the key to map the data to the axis. 14 | */ 15 | index: KeyOf 16 | /** 17 | * Change the default colors. 18 | */ 19 | colors?: string[] 20 | /** 21 | * Margin of each the container 22 | */ 23 | margin?: Spacing 24 | /** 25 | * Change the opacity of the non-selected field 26 | * @default 0.2 27 | */ 28 | filterOpacity?: number 29 | /** 30 | * Controls the visibility of tooltip. 31 | * @default true 32 | */ 33 | showTooltip?: boolean 34 | /** 35 | * Controls the visibility of legend. 36 | * @default true 37 | */ 38 | showLegend?: boolean 39 | } 40 | -------------------------------------------------------------------------------- /app/components/ui/chart/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ChartCrosshair } from './ChartCrosshair.vue' 2 | export { default as ChartLegend } from './ChartLegend.vue' 3 | export { default as ChartSingleTooltip } from './ChartSingleTooltip.vue' 4 | export { default as ChartTooltip } from './ChartTooltip.vue' 5 | 6 | export function defaultColors(count: number = 3) { 7 | const quotient = Math.floor(count / 2) 8 | const remainder = count % 2 9 | 10 | const primaryCount = quotient + remainder 11 | const secondaryCount = quotient 12 | return [ 13 | ...Array.from(new Array(primaryCount).keys()).map(i => `hsl(var(--vis-primary-color) / ${1 - (1 / primaryCount) * i})`), 14 | ...Array.from(new Array(secondaryCount).keys()).map(i => `hsl(var(--vis-secondary-color) / ${1 - (1 / secondaryCount) * i})`), 15 | ]; 16 | } 17 | 18 | export * from './interface' 19 | -------------------------------------------------------------------------------- /app/components/ui/checkbox/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Checkbox } from './Checkbox.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/collapsible/Collapsible.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/collapsible/CollapsibleContent.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/collapsible/CollapsibleTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/collapsible/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Collapsible } from './Collapsible.vue' 2 | export { default as CollapsibleContent } from './CollapsibleContent.vue' 3 | export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue' 4 | -------------------------------------------------------------------------------- /app/components/ui/command/Command.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 32 | -------------------------------------------------------------------------------- /app/components/ui/command/CommandDialog.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /app/components/ui/command/CommandEmpty.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | -------------------------------------------------------------------------------- /app/components/ui/command/CommandGroup.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 31 | -------------------------------------------------------------------------------- /app/components/ui/command/CommandItem.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 28 | -------------------------------------------------------------------------------- /app/components/ui/command/CommandList.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 29 | -------------------------------------------------------------------------------- /app/components/ui/command/CommandSeparator.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /app/components/ui/command/CommandShortcut.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/command/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Command } from './Command.vue' 2 | export { default as CommandDialog } from './CommandDialog.vue' 3 | export { default as CommandEmpty } from './CommandEmpty.vue' 4 | export { default as CommandGroup } from './CommandGroup.vue' 5 | export { default as CommandInput } from './CommandInput.vue' 6 | export { default as CommandItem } from './CommandItem.vue' 7 | export { default as CommandList } from './CommandList.vue' 8 | export { default as CommandSeparator } from './CommandSeparator.vue' 9 | export { default as CommandShortcut } from './CommandShortcut.vue' 10 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenu.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenuGroup.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenuLabel.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 28 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenuPortal.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenuRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenuSeparator.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 23 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenuSub.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/ContextMenuTrigger.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/context-menu/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ContextMenu } from './ContextMenu.vue' 2 | export { default as ContextMenuCheckboxItem } from './ContextMenuCheckboxItem.vue' 3 | export { default as ContextMenuContent } from './ContextMenuContent.vue' 4 | export { default as ContextMenuGroup } from './ContextMenuGroup.vue' 5 | export { default as ContextMenuItem } from './ContextMenuItem.vue' 6 | export { default as ContextMenuLabel } from './ContextMenuLabel.vue' 7 | export { default as ContextMenuRadioGroup } from './ContextMenuRadioGroup.vue' 8 | export { default as ContextMenuRadioItem } from './ContextMenuRadioItem.vue' 9 | export { default as ContextMenuSeparator } from './ContextMenuSeparator.vue' 10 | export { default as ContextMenuShortcut } from './ContextMenuShortcut.vue' 11 | export { default as ContextMenuSub } from './ContextMenuSub.vue' 12 | export { default as ContextMenuSubContent } from './ContextMenuSubContent.vue' 13 | export { default as ContextMenuSubTrigger } from './ContextMenuSubTrigger.vue' 14 | export { default as ContextMenuTrigger } from './ContextMenuTrigger.vue' 15 | -------------------------------------------------------------------------------- /app/components/ui/dialog/Dialog.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/dialog/DialogClose.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/dialog/DialogDescription.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /app/components/ui/dialog/DialogFooter.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 20 | -------------------------------------------------------------------------------- /app/components/ui/dialog/DialogHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /app/components/ui/dialog/DialogTitle.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 32 | -------------------------------------------------------------------------------- /app/components/ui/dialog/DialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/dialog/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Dialog } from './Dialog.vue' 2 | export { default as DialogClose } from './DialogClose.vue' 3 | export { default as DialogContent } from './DialogContent.vue' 4 | export { default as DialogDescription } from './DialogDescription.vue' 5 | export { default as DialogFooter } from './DialogFooter.vue' 6 | export { default as DialogHeader } from './DialogHeader.vue' 7 | export { default as DialogScrollContent } from './DialogScrollContent.vue' 8 | export { default as DialogTitle } from './DialogTitle.vue' 9 | export { default as DialogTrigger } from './DialogTrigger.vue' 10 | -------------------------------------------------------------------------------- /app/components/ui/drawer/Drawer.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /app/components/ui/drawer/DrawerContent.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | -------------------------------------------------------------------------------- /app/components/ui/drawer/DrawerDescription.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | -------------------------------------------------------------------------------- /app/components/ui/drawer/DrawerFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/drawer/DrawerHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/drawer/DrawerOverlay.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 20 | -------------------------------------------------------------------------------- /app/components/ui/drawer/DrawerTitle.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | -------------------------------------------------------------------------------- /app/components/ui/drawer/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Drawer } from './Drawer.vue' 2 | export { default as DrawerContent } from './DrawerContent.vue' 3 | export { default as DrawerDescription } from './DrawerDescription.vue' 4 | export { default as DrawerFooter } from './DrawerFooter.vue' 5 | export { default as DrawerHeader } from './DrawerHeader.vue' 6 | export { default as DrawerOverlay } from './DrawerOverlay.vue' 7 | export { default as DrawerTitle } from './DrawerTitle.vue' 8 | export { DrawerClose, DrawerPortal, DrawerTrigger } from 'vaul-vue' 9 | -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu/DropdownMenu.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu/DropdownMenuGroup.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu/DropdownMenuLabel.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu/DropdownMenuSeparator.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 25 | -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu/DropdownMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu/DropdownMenuSub.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu/DropdownMenuTrigger.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/form/FormControl.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /app/components/ui/form/FormDescription.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /app/components/ui/form/FormItem.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /app/components/ui/form/FormLabel.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 24 | -------------------------------------------------------------------------------- /app/components/ui/form/FormMessage.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /app/components/ui/form/index.ts: -------------------------------------------------------------------------------- 1 | export { default as FormControl } from './FormControl.vue' 2 | export { default as FormDescription } from './FormDescription.vue' 3 | export { default as FormItem } from './FormItem.vue' 4 | export { default as FormLabel } from './FormLabel.vue' 5 | export { default as FormMessage } from './FormMessage.vue' 6 | export { FORM_ITEM_INJECTION_KEY } from './injectionKeys' 7 | export { Form, Field as FormField } from 'vee-validate' 8 | -------------------------------------------------------------------------------- /app/components/ui/form/injectionKeys.ts: -------------------------------------------------------------------------------- 1 | import type { InjectionKey } from 'vue' 2 | 3 | export const FORM_ITEM_INJECTION_KEY 4 | = Symbol() as InjectionKey 5 | -------------------------------------------------------------------------------- /app/components/ui/form/useFormField.ts: -------------------------------------------------------------------------------- 1 | import { FieldContextKey, useFieldError, useIsFieldDirty, useIsFieldTouched, useIsFieldValid } from 'vee-validate' 2 | import { inject } from 'vue' 3 | import { FORM_ITEM_INJECTION_KEY } from './injectionKeys' 4 | 5 | export function useFormField() { 6 | const fieldContext = inject(FieldContextKey) 7 | const fieldItemContext = inject(FORM_ITEM_INJECTION_KEY) 8 | 9 | if (!fieldContext) 10 | throw new Error('useFormField should be used within ') 11 | 12 | const { name } = fieldContext 13 | const id = fieldItemContext 14 | 15 | const fieldState = { 16 | valid: useIsFieldValid(name), 17 | isDirty: useIsFieldDirty(name), 18 | isTouched: useIsFieldTouched(name), 19 | error: useFieldError(name), 20 | } 21 | 22 | return { 23 | id, 24 | name, 25 | formItemId: `${id}-form-item`, 26 | formDescriptionId: `${id}-form-item-description`, 27 | formMessageId: `${id}-form-item-message`, 28 | ...fieldState, 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/components/ui/hover-card/HoverCard.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/hover-card/HoverCardTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/hover-card/index.ts: -------------------------------------------------------------------------------- 1 | export { default as HoverCard } from './HoverCard.vue' 2 | export { default as HoverCardContent } from './HoverCardContent.vue' 3 | export { default as HoverCardTrigger } from './HoverCardTrigger.vue' 4 | -------------------------------------------------------------------------------- /app/components/ui/input/Input.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 25 | -------------------------------------------------------------------------------- /app/components/ui/input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Input } from './Input.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/label/Label.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 30 | -------------------------------------------------------------------------------- /app/components/ui/label/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Label } from './Label.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/menubar/Menubar.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 37 | -------------------------------------------------------------------------------- /app/components/ui/menubar/MenubarGroup.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/menubar/MenubarLabel.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/menubar/MenubarMenu.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/menubar/MenubarRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /app/components/ui/menubar/MenubarSeparator.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /app/components/ui/menubar/MenubarShortcut.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/menubar/MenubarSub.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /app/components/ui/menubar/MenubarTrigger.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 32 | -------------------------------------------------------------------------------- /app/components/ui/menubar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Menubar } from './Menubar.vue' 2 | export { default as MenubarCheckboxItem } from './MenubarCheckboxItem.vue' 3 | export { default as MenubarContent } from './MenubarContent.vue' 4 | export { default as MenubarGroup } from './MenubarGroup.vue' 5 | export { default as MenubarItem } from './MenubarItem.vue' 6 | export { default as MenubarLabel } from './MenubarLabel.vue' 7 | export { default as MenubarMenu } from './MenubarMenu.vue' 8 | export { default as MenubarRadioGroup } from './MenubarRadioGroup.vue' 9 | export { default as MenubarRadioItem } from './MenubarRadioItem.vue' 10 | export { default as MenubarSeparator } from './MenubarSeparator.vue' 11 | export { default as MenubarShortcut } from './MenubarShortcut.vue' 12 | export { default as MenubarSub } from './MenubarSub.vue' 13 | export { default as MenubarSubContent } from './MenubarSubContent.vue' 14 | export { default as MenubarSubTrigger } from './MenubarSubTrigger.vue' 15 | export { default as MenubarTrigger } from './MenubarTrigger.vue' 16 | -------------------------------------------------------------------------------- /app/components/ui/navigation-menu/NavigationMenu.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 35 | -------------------------------------------------------------------------------- /app/components/ui/navigation-menu/NavigationMenuIndicator.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /app/components/ui/navigation-menu/NavigationMenuItem.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/navigation-menu/NavigationMenuLink.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /app/components/ui/navigation-menu/NavigationMenuList.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 32 | -------------------------------------------------------------------------------- /app/components/ui/number-field/NumberField.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /app/components/ui/number-field/NumberFieldContent.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/number-field/NumberFieldDecrement.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 27 | -------------------------------------------------------------------------------- /app/components/ui/number-field/NumberFieldIncrement.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 27 | -------------------------------------------------------------------------------- /app/components/ui/number-field/NumberFieldInput.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 17 | -------------------------------------------------------------------------------- /app/components/ui/number-field/index.ts: -------------------------------------------------------------------------------- 1 | export { default as NumberField } from './NumberField.vue' 2 | export { default as NumberFieldContent } from './NumberFieldContent.vue' 3 | export { default as NumberFieldDecrement } from './NumberFieldDecrement.vue' 4 | export { default as NumberFieldIncrement } from './NumberFieldIncrement.vue' 5 | export { default as NumberFieldInput } from './NumberFieldInput.vue' 6 | -------------------------------------------------------------------------------- /app/components/ui/pagination/PaginationEllipsis.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 25 | -------------------------------------------------------------------------------- /app/components/ui/pagination/PaginationFirst.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 32 | -------------------------------------------------------------------------------- /app/components/ui/pagination/PaginationLast.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 32 | -------------------------------------------------------------------------------- /app/components/ui/pagination/PaginationNext.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 32 | -------------------------------------------------------------------------------- /app/components/ui/pagination/PaginationPrev.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 32 | -------------------------------------------------------------------------------- /app/components/ui/pagination/index.ts: -------------------------------------------------------------------------------- 1 | export { default as PaginationEllipsis } from './PaginationEllipsis.vue' 2 | export { default as PaginationFirst } from './PaginationFirst.vue' 3 | export { default as PaginationLast } from './PaginationLast.vue' 4 | export { default as PaginationNext } from './PaginationNext.vue' 5 | export { default as PaginationPrev } from './PaginationPrev.vue' 6 | export { 7 | PaginationRoot as Pagination, 8 | PaginationList, 9 | PaginationListItem, 10 | } from 'radix-vue' 11 | -------------------------------------------------------------------------------- /app/components/ui/pin-input/PinInput.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 26 | -------------------------------------------------------------------------------- /app/components/ui/pin-input/PinInputGroup.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /app/components/ui/pin-input/PinInputInput.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 21 | -------------------------------------------------------------------------------- /app/components/ui/pin-input/PinInputSeparator.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /app/components/ui/pin-input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as PinInput } from './PinInput.vue' 2 | export { default as PinInputGroup } from './PinInputGroup.vue' 3 | export { default as PinInputInput } from './PinInputInput.vue' 4 | export { default as PinInputSeparator } from './PinInputSeparator.vue' 5 | -------------------------------------------------------------------------------- /app/components/ui/popover/Popover.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/popover/PopoverTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/popover/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Popover } from './Popover.vue' 2 | export { default as PopoverContent } from './PopoverContent.vue' 3 | export { default as PopoverTrigger } from './PopoverTrigger.vue' 4 | -------------------------------------------------------------------------------- /app/components/ui/progress/Progress.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 42 | -------------------------------------------------------------------------------- /app/components/ui/progress/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Progress } from './Progress.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/radio-group/RadioGroup.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 28 | -------------------------------------------------------------------------------- /app/components/ui/radio-group/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RadioGroup } from './RadioGroup.vue' 2 | export { default as RadioGroupItem } from './RadioGroupItem.vue' 3 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarGrid.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarGridBody.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarGridHead.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarGridRow.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarHeadCell.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarHeader.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarHeading.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 34 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarNextButton.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 35 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/RangeCalendarPrevButton.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 35 | -------------------------------------------------------------------------------- /app/components/ui/range-calendar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RangeCalendar } from './RangeCalendar.vue' 2 | export { default as RangeCalendarCell } from './RangeCalendarCell.vue' 3 | export { default as RangeCalendarCellTrigger } from './RangeCalendarCellTrigger.vue' 4 | export { default as RangeCalendarGrid } from './RangeCalendarGrid.vue' 5 | export { default as RangeCalendarGridBody } from './RangeCalendarGridBody.vue' 6 | export { default as RangeCalendarGridHead } from './RangeCalendarGridHead.vue' 7 | export { default as RangeCalendarGridRow } from './RangeCalendarGridRow.vue' 8 | export { default as RangeCalendarHeadCell } from './RangeCalendarHeadCell.vue' 9 | export { default as RangeCalendarHeader } from './RangeCalendarHeader.vue' 10 | export { default as RangeCalendarHeading } from './RangeCalendarHeading.vue' 11 | export { default as RangeCalendarNextButton } from './RangeCalendarNextButton.vue' 12 | export { default as RangeCalendarPrevButton } from './RangeCalendarPrevButton.vue' 13 | -------------------------------------------------------------------------------- /app/components/ui/resizable/ResizablePanelGroup.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/components/ui/resizable/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ResizableHandle } from './ResizableHandle.vue' 2 | export { default as ResizablePanelGroup } from './ResizablePanelGroup.vue' 3 | export { SplitterPanel as ResizablePanel } from 'radix-vue' 4 | -------------------------------------------------------------------------------- /app/components/ui/scroll-area/ScrollArea.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 32 | -------------------------------------------------------------------------------- /app/components/ui/scroll-area/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ScrollArea } from './ScrollArea.vue' 2 | export { default as ScrollBar } from './ScrollBar.vue' 3 | -------------------------------------------------------------------------------- /app/components/ui/select/Select.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/select/SelectGroup.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | -------------------------------------------------------------------------------- /app/components/ui/select/SelectItemText.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/select/SelectLabel.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/select/SelectScrollDownButton.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 27 | -------------------------------------------------------------------------------- /app/components/ui/select/SelectScrollUpButton.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 27 | -------------------------------------------------------------------------------- /app/components/ui/select/SelectSeparator.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 20 | -------------------------------------------------------------------------------- /app/components/ui/select/SelectValue.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/select/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Select } from './Select.vue' 2 | export { default as SelectContent } from './SelectContent.vue' 3 | export { default as SelectGroup } from './SelectGroup.vue' 4 | export { default as SelectItem } from './SelectItem.vue' 5 | export { default as SelectItemText } from './SelectItemText.vue' 6 | export { default as SelectLabel } from './SelectLabel.vue' 7 | export { default as SelectScrollDownButton } from './SelectScrollDownButton.vue' 8 | export { default as SelectScrollUpButton } from './SelectScrollUpButton.vue' 9 | export { default as SelectSeparator } from './SelectSeparator.vue' 10 | export { default as SelectTrigger } from './SelectTrigger.vue' 11 | export { default as SelectValue } from './SelectValue.vue' 12 | -------------------------------------------------------------------------------- /app/components/ui/separator/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Separator } from './Separator.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/sheet/Sheet.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/sheet/SheetClose.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/sheet/SheetDescription.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /app/components/ui/sheet/SheetFooter.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 20 | -------------------------------------------------------------------------------- /app/components/ui/sheet/SheetHeader.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /app/components/ui/sheet/SheetTitle.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /app/components/ui/sheet/SheetTrigger.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarContent.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarGroup.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarGroupAction.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 27 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarGroupContent.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarGroupLabel.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 25 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarInput.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarInset.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 21 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarMenu.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarMenuBadge.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 26 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarMenuButtonChild.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 36 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarMenuItem.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarMenuSkeleton.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 35 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarMenuSub.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarMenuSubItem.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarSeparator.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/SidebarTrigger.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 27 | -------------------------------------------------------------------------------- /app/components/ui/sidebar/utils.ts: -------------------------------------------------------------------------------- 1 | import type { ComputedRef, Ref } from 'vue' 2 | import { createContext } from 'radix-vue' 3 | 4 | export const SIDEBAR_COOKIE_NAME = 'sidebar:state' 5 | export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 6 | export const SIDEBAR_WIDTH = '16rem' 7 | export const SIDEBAR_WIDTH_MOBILE = '18rem' 8 | export const SIDEBAR_WIDTH_ICON = '3rem' 9 | export const SIDEBAR_KEYBOARD_SHORTCUT = 'b' 10 | 11 | export const [useSidebar, provideSidebarContext] = createContext<{ 12 | state: ComputedRef<'expanded' | 'collapsed'> 13 | open: Ref 14 | setOpen: (value: boolean) => void 15 | isMobile: Ref 16 | openMobile: Ref 17 | setOpenMobile: (value: boolean) => void 18 | toggleSidebar: () => void 19 | }>('Sidebar') 20 | -------------------------------------------------------------------------------- /app/components/ui/skeleton/Skeleton.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /app/components/ui/skeleton/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Skeleton } from './Skeleton.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/slider/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Slider } from './Slider.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/stepper/Stepper.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 33 | -------------------------------------------------------------------------------- /app/components/ui/stepper/StepperDescription.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /app/components/ui/stepper/StepperItem.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 29 | -------------------------------------------------------------------------------- /app/components/ui/stepper/StepperSeparator.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 33 | -------------------------------------------------------------------------------- /app/components/ui/stepper/StepperTitle.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /app/components/ui/stepper/StepperTrigger.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 28 | -------------------------------------------------------------------------------- /app/components/ui/stepper/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Stepper } from './Stepper.vue' 2 | export { default as StepperDescription } from './StepperDescription.vue' 3 | export { default as StepperIndicator } from './StepperIndicator.vue' 4 | export { default as StepperItem } from './StepperItem.vue' 5 | export { default as StepperSeparator } from './StepperSeparator.vue' 6 | export { default as StepperTitle } from './StepperTitle.vue' 7 | export { default as StepperTrigger } from './StepperTrigger.vue' 8 | -------------------------------------------------------------------------------- /app/components/ui/switch/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Switch } from './Switch.vue' 2 | -------------------------------------------------------------------------------- /app/components/ui/table/Table.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /app/components/ui/table/TableBody.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/table/TableCaption.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/table/TableCell.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | -------------------------------------------------------------------------------- /app/components/ui/table/TableEmpty.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 39 | -------------------------------------------------------------------------------- /app/components/ui/table/TableFooter.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/table/TableHead.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/table/TableHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/table/TableRow.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/components/ui/table/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Table } from './Table.vue' 2 | export { default as TableBody } from './TableBody.vue' 3 | export { default as TableCaption } from './TableCaption.vue' 4 | export { default as TableCell } from './TableCell.vue' 5 | export { default as TableEmpty } from './TableEmpty.vue' 6 | export { default as TableFooter } from './TableFooter.vue' 7 | export { default as TableHead } from './TableHead.vue' 8 | export { default as TableHeader } from './TableHeader.vue' 9 | export { default as TableRow } from './TableRow.vue' 10 | -------------------------------------------------------------------------------- /app/components/ui/tabs/Tabs.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/components/ui/tabs/TabsContent.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /app/components/ui/tabs/TabsList.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 28 | -------------------------------------------------------------------------------- /app/components/ui/tabs/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tabs } from './Tabs.vue' 2 | export { default as TabsContent } from './TabsContent.vue' 3 | export { default as TabsList } from './TabsList.vue' 4 | export { default as TabsTrigger } from './TabsTrigger.vue' 5 | -------------------------------------------------------------------------------- /app/components/ui/tags-input/TagsInput.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /app/components/ui/tags-input/TagsInputInput.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /app/components/ui/tags-input/TagsInputItem.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /app/components/ui/tags-input/TagsInputItemDelete.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 27 | -------------------------------------------------------------------------------- /app/components/ui/tags-input/TagsInputItemText.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /app/components/ui/tags-input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as TagsInput } from './TagsInput.vue' 2 | export { default as TagsInputInput } from './TagsInputInput.vue' 3 | export { default as TagsInputItem } from './TagsInputItem.vue' 4 | export { default as TagsInputItemDelete } from './TagsInputItemDelete.vue' 5 | export { default as TagsInputItemText } from './TagsInputItemText.vue' 6 | -------------------------------------------------------------------------------- /app/components/ui/textarea/Textarea.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 |