@edgedev/create-edge-app 1.0.41 → 1.0.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.dev +1 -0
- package/.vscode/settings.json +1 -1
- package/app.vue +72 -21
- package/assets/css/tailwind.css +78 -0
- package/bin/cli.js +1 -1
- package/components/subToolbar.vue +4 -13
- package/components/ui/accordion/Accordion.vue +19 -0
- package/components/ui/accordion/AccordionContent.vue +24 -0
- package/components/ui/accordion/AccordionItem.vue +24 -0
- package/components/ui/accordion/AccordionTrigger.vue +39 -0
- package/components/ui/accordion/index.js +4 -0
- package/components/ui/accordion/index.ts +4 -0
- package/components/ui/alert/Alert.vue +16 -0
- package/components/ui/alert/AlertDescription.vue +14 -0
- package/components/ui/alert/AlertTitle.vue +14 -0
- package/components/ui/alert/index.js +21 -0
- package/components/ui/alert/index.ts +23 -0
- package/components/ui/alert-dialog/AlertDialog.vue +14 -0
- package/components/ui/alert-dialog/AlertDialogAction.vue +20 -0
- package/components/ui/alert-dialog/AlertDialogCancel.vue +20 -0
- package/components/ui/alert-dialog/AlertDialogContent.vue +42 -0
- package/components/ui/alert-dialog/AlertDialogDescription.vue +25 -0
- package/components/ui/alert-dialog/AlertDialogFooter.vue +21 -0
- package/components/ui/alert-dialog/AlertDialogHeader.vue +16 -0
- package/components/ui/alert-dialog/AlertDialogTitle.vue +22 -0
- package/components/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
- package/components/ui/alert-dialog/index.ts +9 -0
- package/components/ui/aspect-ratio/AspectRatio.vue +11 -0
- package/components/ui/aspect-ratio/index.ts +1 -0
- package/components/ui/auto-form/AutoForm.vue +105 -0
- package/components/ui/auto-form/AutoFormField.vue +45 -0
- package/components/ui/auto-form/AutoFormFieldArray.vue +110 -0
- package/components/ui/auto-form/AutoFormFieldBoolean.vue +41 -0
- package/components/ui/auto-form/AutoFormFieldDate.vue +57 -0
- package/components/ui/auto-form/AutoFormFieldEnum.vue +49 -0
- package/components/ui/auto-form/AutoFormFieldFile.vue +74 -0
- package/components/ui/auto-form/AutoFormFieldInput.vue +36 -0
- package/components/ui/auto-form/AutoFormFieldNumber.vue +32 -0
- package/components/ui/auto-form/AutoFormFieldObject.vue +78 -0
- package/components/ui/auto-form/AutoFormLabel.vue +14 -0
- package/components/ui/auto-form/constant.ts +39 -0
- package/components/ui/auto-form/dependencies.ts +92 -0
- package/components/ui/auto-form/index.ts +15 -0
- package/components/ui/auto-form/interface.ts +81 -0
- package/components/ui/auto-form/utils.ts +171 -0
- package/components/ui/avatar/Avatar.vue +21 -0
- package/components/ui/avatar/AvatarFallback.vue +11 -0
- package/components/ui/avatar/AvatarImage.vue +9 -0
- package/components/ui/avatar/index.ts +24 -0
- package/components/ui/badge/Badge.vue +16 -0
- package/components/ui/badge/index.ts +25 -0
- package/components/ui/breadcrumb/Breadcrumb.vue +13 -0
- package/components/ui/breadcrumb/BreadcrumbEllipsis.vue +22 -0
- package/components/ui/breadcrumb/BreadcrumbItem.vue +16 -0
- package/components/ui/breadcrumb/BreadcrumbLink.vue +19 -0
- package/components/ui/breadcrumb/BreadcrumbList.vue +16 -0
- package/components/ui/breadcrumb/BreadcrumbPage.vue +19 -0
- package/components/ui/breadcrumb/BreadcrumbSeparator.vue +21 -0
- package/components/ui/breadcrumb/index.ts +7 -0
- package/components/ui/button/Button.vue +26 -0
- package/components/ui/button/index.js +33 -0
- package/components/ui/button/index.ts +35 -0
- package/components/ui/calendar/Calendar.vue +60 -0
- package/components/ui/calendar/CalendarCell.vue +24 -0
- package/components/ui/calendar/CalendarCellTrigger.vue +38 -0
- package/components/ui/calendar/CalendarGrid.vue +24 -0
- package/components/ui/calendar/CalendarGridBody.vue +11 -0
- package/components/ui/calendar/CalendarGridHead.vue +11 -0
- package/components/ui/calendar/CalendarGridRow.vue +21 -0
- package/components/ui/calendar/CalendarHeadCell.vue +21 -0
- package/components/ui/calendar/CalendarHeader.vue +21 -0
- package/components/ui/calendar/CalendarHeading.vue +27 -0
- package/components/ui/calendar/CalendarNextButton.vue +32 -0
- package/components/ui/calendar/CalendarPrevButton.vue +32 -0
- package/components/ui/calendar/index.ts +12 -0
- package/components/ui/card/Card.vue +21 -0
- package/components/ui/card/CardContent.vue +14 -0
- package/components/ui/card/CardDescription.vue +14 -0
- package/components/ui/card/CardFooter.vue +14 -0
- package/components/ui/card/CardHeader.vue +14 -0
- package/components/ui/card/CardTitle.vue +18 -0
- package/components/ui/card/index.js +6 -0
- package/components/ui/card/index.ts +6 -0
- package/components/ui/carousel/Carousel.vue +44 -0
- package/components/ui/carousel/CarouselContent.vue +29 -0
- package/components/ui/carousel/CarouselItem.vue +23 -0
- package/components/ui/carousel/CarouselNext.vue +30 -0
- package/components/ui/carousel/CarouselPrevious.vue +30 -0
- package/components/ui/carousel/index.ts +10 -0
- package/components/ui/carousel/interface.ts +20 -0
- package/components/ui/carousel/useCarousel.ts +59 -0
- package/components/ui/chart/ChartCrosshair.vue +44 -0
- package/components/ui/chart/ChartLegend.vue +50 -0
- package/components/ui/chart/ChartSingleTooltip.vue +63 -0
- package/components/ui/chart/ChartTooltip.vue +40 -0
- package/components/ui/chart/index.ts +18 -0
- package/components/ui/chart/interface.ts +64 -0
- package/components/ui/chart-area/AreaChart.vue +136 -0
- package/components/ui/chart-area/index.ts +66 -0
- package/components/ui/chart-bar/BarChart.vue +115 -0
- package/components/ui/chart-bar/index.ts +66 -0
- package/components/ui/chart-donut/DonutChart.vue +100 -0
- package/components/ui/chart-donut/index.ts +39 -0
- package/components/ui/chart-line/LineChart.vue +105 -0
- package/components/ui/chart-line/index.ts +66 -0
- package/components/ui/checkbox/Checkbox.vue +33 -0
- package/components/ui/checkbox/index.ts +1 -0
- package/components/ui/collapsible/Collapsible.vue +15 -0
- package/components/ui/collapsible/CollapsibleContent.vue +11 -0
- package/components/ui/collapsible/CollapsibleTrigger.vue +11 -0
- package/components/ui/collapsible/index.ts +3 -0
- package/components/ui/command/Command.vue +30 -0
- package/components/ui/command/CommandDialog.vue +21 -0
- package/components/ui/command/CommandEmpty.vue +20 -0
- package/components/ui/command/CommandGroup.vue +29 -0
- package/components/ui/command/CommandInput.vue +33 -0
- package/components/ui/command/CommandItem.vue +26 -0
- package/components/ui/command/CommandList.vue +27 -0
- package/components/ui/command/CommandSeparator.vue +23 -0
- package/components/ui/command/CommandShortcut.vue +14 -0
- package/components/ui/command/index.js +9 -0
- package/components/ui/command/index.ts +9 -0
- package/components/ui/context-menu/ContextMenu.vue +15 -0
- package/components/ui/context-menu/ContextMenuCheckboxItem.vue +40 -0
- package/components/ui/context-menu/ContextMenuContent.vue +36 -0
- package/components/ui/context-menu/ContextMenuGroup.vue +11 -0
- package/components/ui/context-menu/ContextMenuItem.vue +34 -0
- package/components/ui/context-menu/ContextMenuLabel.vue +25 -0
- package/components/ui/context-menu/ContextMenuPortal.vue +11 -0
- package/components/ui/context-menu/ContextMenuRadioGroup.vue +19 -0
- package/components/ui/context-menu/ContextMenuRadioItem.vue +40 -0
- package/components/ui/context-menu/ContextMenuSeparator.vue +20 -0
- package/components/ui/context-menu/ContextMenuShortcut.vue +14 -0
- package/components/ui/context-menu/ContextMenuSub.vue +19 -0
- package/components/ui/context-menu/ContextMenuSubContent.vue +35 -0
- package/components/ui/context-menu/ContextMenuSubTrigger.vue +34 -0
- package/components/ui/context-menu/ContextMenuTrigger.vue +13 -0
- package/components/ui/context-menu/index.ts +14 -0
- package/components/ui/dialog/Dialog.vue +14 -0
- package/components/ui/dialog/DialogClose.vue +11 -0
- package/components/ui/dialog/DialogContent.vue +50 -0
- package/components/ui/dialog/DialogDescription.vue +24 -0
- package/components/ui/dialog/DialogFooter.vue +19 -0
- package/components/ui/dialog/DialogHeader.vue +16 -0
- package/components/ui/dialog/DialogScrollContent.vue +59 -0
- package/components/ui/dialog/DialogTitle.vue +29 -0
- package/components/ui/dialog/DialogTrigger.vue +11 -0
- package/components/ui/dialog/index.js +9 -0
- package/components/ui/dialog/index.ts +9 -0
- package/components/ui/drawer/Drawer.vue +19 -0
- package/components/ui/drawer/DrawerContent.vue +28 -0
- package/components/ui/drawer/DrawerDescription.vue +20 -0
- package/components/ui/drawer/DrawerFooter.vue +14 -0
- package/components/ui/drawer/DrawerHeader.vue +14 -0
- package/components/ui/drawer/DrawerOverlay.vue +18 -0
- package/components/ui/drawer/DrawerTitle.vue +20 -0
- package/components/ui/drawer/index.ts +8 -0
- package/components/ui/dropdown-menu/DropdownMenu.vue +14 -0
- package/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
- package/components/ui/dropdown-menu/DropdownMenuContent.vue +38 -0
- package/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
- package/components/ui/dropdown-menu/DropdownMenuItem.vue +28 -0
- package/components/ui/dropdown-menu/DropdownMenuLabel.vue +24 -0
- package/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
- package/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +41 -0
- package/components/ui/dropdown-menu/DropdownMenuSeparator.vue +22 -0
- package/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
- package/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
- package/components/ui/dropdown-menu/DropdownMenuSubContent.vue +30 -0
- package/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +33 -0
- package/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
- package/components/ui/dropdown-menu/index.ts +16 -0
- package/components/ui/form/FormControl.vue +16 -0
- package/components/ui/form/FormDescription.vue +20 -0
- package/components/ui/form/FormItem.vue +19 -0
- package/components/ui/form/FormLabel.vue +23 -0
- package/components/ui/form/FormMessage.vue +16 -0
- package/components/ui/form/index.js +7 -0
- package/components/ui/form/index.ts +7 -0
- package/components/ui/form/injectionKeys.js +1 -0
- package/components/ui/form/injectionKeys.ts +4 -0
- package/components/ui/form/useFormField.js +36 -0
- package/components/ui/form/useFormField.ts +30 -0
- package/components/ui/hover-card/HoverCard.vue +14 -0
- package/components/ui/hover-card/HoverCardContent.vue +41 -0
- package/components/ui/hover-card/HoverCardTrigger.vue +11 -0
- package/components/ui/hover-card/index.ts +3 -0
- package/components/ui/input/Input.vue +24 -0
- package/components/ui/input/index.js +1 -0
- package/components/ui/input/index.ts +1 -0
- package/components/ui/label/Label.vue +27 -0
- package/components/ui/label/index.js +1 -0
- package/components/ui/label/index.ts +1 -0
- package/components/ui/menubar/Menubar.vue +35 -0
- package/components/ui/menubar/MenubarCheckboxItem.vue +40 -0
- package/components/ui/menubar/MenubarContent.vue +43 -0
- package/components/ui/menubar/MenubarGroup.vue +11 -0
- package/components/ui/menubar/MenubarItem.vue +35 -0
- package/components/ui/menubar/MenubarLabel.vue +13 -0
- package/components/ui/menubar/MenubarMenu.vue +11 -0
- package/components/ui/menubar/MenubarRadioGroup.vue +20 -0
- package/components/ui/menubar/MenubarRadioItem.vue +40 -0
- package/components/ui/menubar/MenubarSeparator.vue +19 -0
- package/components/ui/menubar/MenubarShortcut.vue +14 -0
- package/components/ui/menubar/MenubarSub.vue +19 -0
- package/components/ui/menubar/MenubarSubContent.vue +39 -0
- package/components/ui/menubar/MenubarSubTrigger.vue +30 -0
- package/components/ui/menubar/MenubarTrigger.vue +29 -0
- package/components/ui/menubar/index.ts +15 -0
- package/components/ui/navigation-menu/NavigationMenu.vue +33 -0
- package/components/ui/navigation-menu/NavigationMenuContent.vue +34 -0
- package/components/ui/navigation-menu/NavigationMenuIndicator.vue +24 -0
- package/components/ui/navigation-menu/NavigationMenuItem.vue +11 -0
- package/components/ui/navigation-menu/NavigationMenuLink.vue +19 -0
- package/components/ui/navigation-menu/NavigationMenuList.vue +29 -0
- package/components/ui/navigation-menu/NavigationMenuTrigger.vue +34 -0
- package/components/ui/navigation-menu/NavigationMenuViewport.vue +33 -0
- package/components/ui/navigation-menu/index.ts +12 -0
- package/components/ui/number-field/NumberField.vue +23 -0
- package/components/ui/number-field/NumberFieldContent.vue +14 -0
- package/components/ui/number-field/NumberFieldDecrement.vue +25 -0
- package/components/ui/number-field/NumberFieldIncrement.vue +25 -0
- package/components/ui/number-field/NumberFieldInput.vue +8 -0
- package/components/ui/number-field/index.ts +5 -0
- package/components/ui/pagination/PaginationEllipsis.vue +22 -0
- package/components/ui/pagination/PaginationFirst.vue +29 -0
- package/components/ui/pagination/PaginationLast.vue +29 -0
- package/components/ui/pagination/PaginationNext.vue +29 -0
- package/components/ui/pagination/PaginationPrev.vue +29 -0
- package/components/ui/pagination/index.ts +10 -0
- package/components/ui/pin-input/PinInput.vue +23 -0
- package/components/ui/pin-input/PinInputGroup.vue +18 -0
- package/components/ui/pin-input/PinInputInput.vue +18 -0
- package/components/ui/pin-input/PinInputSeparator.vue +15 -0
- package/components/ui/pin-input/index.ts +4 -0
- package/components/ui/popover/Popover.vue +15 -0
- package/components/ui/popover/PopoverContent.vue +48 -0
- package/components/ui/popover/PopoverTrigger.vue +11 -0
- package/components/ui/popover/index.js +3 -0
- package/components/ui/popover/index.ts +3 -0
- package/components/ui/progress/Progress.vue +39 -0
- package/components/ui/progress/index.js +1 -0
- package/components/ui/progress/index.ts +1 -0
- package/components/ui/radio-group/RadioGroup.vue +25 -0
- package/components/ui/radio-group/RadioGroupItem.vue +39 -0
- package/components/ui/radio-group/index.ts +2 -0
- package/components/ui/range-calendar/RangeCalendar.vue +60 -0
- package/components/ui/range-calendar/RangeCalendarCell.vue +24 -0
- package/components/ui/range-calendar/RangeCalendarCellTrigger.vue +40 -0
- package/components/ui/range-calendar/RangeCalendarGrid.vue +24 -0
- package/components/ui/range-calendar/RangeCalendarGridBody.vue +11 -0
- package/components/ui/range-calendar/RangeCalendarGridHead.vue +11 -0
- package/components/ui/range-calendar/RangeCalendarGridRow.vue +21 -0
- package/components/ui/range-calendar/RangeCalendarHeadCell.vue +21 -0
- package/components/ui/range-calendar/RangeCalendarHeader.vue +21 -0
- package/components/ui/range-calendar/RangeCalendarHeading.vue +27 -0
- package/components/ui/range-calendar/RangeCalendarNextButton.vue +32 -0
- package/components/ui/range-calendar/RangeCalendarPrevButton.vue +32 -0
- package/components/ui/range-calendar/index.ts +12 -0
- package/components/ui/resizable/ResizableHandle.vue +26 -0
- package/components/ui/resizable/ResizablePanelGroup.vue +21 -0
- package/components/ui/resizable/index.ts +3 -0
- package/components/ui/scroll-area/ScrollArea.vue +29 -0
- package/components/ui/scroll-area/ScrollBar.vue +30 -0
- package/components/ui/scroll-area/index.ts +2 -0
- package/components/ui/select/Select.vue +15 -0
- package/components/ui/select/SelectContent.vue +53 -0
- package/components/ui/select/SelectGroup.vue +19 -0
- package/components/ui/select/SelectItem.vue +44 -0
- package/components/ui/select/SelectItemText.vue +11 -0
- package/components/ui/select/SelectLabel.vue +13 -0
- package/components/ui/select/SelectScrollDownButton.vue +24 -0
- package/components/ui/select/SelectScrollUpButton.vue +24 -0
- package/components/ui/select/SelectSeparator.vue +17 -0
- package/components/ui/select/SelectTrigger.vue +31 -0
- package/components/ui/select/SelectValue.vue +11 -0
- package/components/ui/select/index.ts +11 -0
- package/components/ui/separator/Separator.vue +20 -0
- package/components/ui/separator/index.js +1 -0
- package/components/ui/separator/index.ts +1 -0
- package/components/ui/sheet/Sheet.vue +14 -0
- package/components/ui/sheet/SheetClose.vue +11 -0
- package/components/ui/sheet/SheetContent.vue +56 -0
- package/components/ui/sheet/SheetDescription.vue +22 -0
- package/components/ui/sheet/SheetFooter.vue +19 -0
- package/components/ui/sheet/SheetHeader.vue +16 -0
- package/components/ui/sheet/SheetTitle.vue +22 -0
- package/components/ui/sheet/SheetTrigger.vue +11 -0
- package/components/ui/sheet/index.ts +31 -0
- package/components/ui/skeleton/Skeleton.vue +14 -0
- package/components/ui/skeleton/index.ts +1 -0
- package/components/ui/slider/Slider.vue +36 -0
- package/components/ui/slider/index.ts +1 -0
- package/components/ui/sonner/Sonner.vue +22 -0
- package/components/ui/sonner/index.ts +1 -0
- package/components/ui/switch/Switch.vue +37 -0
- package/components/ui/switch/index.ts +1 -0
- package/components/ui/table/Table.vue +16 -0
- package/components/ui/table/TableBody.vue +14 -0
- package/components/ui/table/TableCaption.vue +14 -0
- package/components/ui/table/TableCell.vue +21 -0
- package/components/ui/table/TableEmpty.vue +37 -0
- package/components/ui/table/TableFooter.vue +14 -0
- package/components/ui/table/TableHead.vue +14 -0
- package/components/ui/table/TableHeader.vue +14 -0
- package/components/ui/table/TableRow.vue +14 -0
- package/components/ui/table/index.ts +8 -0
- package/components/ui/tabs/Tabs.vue +15 -0
- package/components/ui/tabs/TabsContent.vue +22 -0
- package/components/ui/tabs/TabsList.vue +25 -0
- package/components/ui/tabs/TabsTrigger.vue +27 -0
- package/components/ui/tabs/index.ts +4 -0
- package/components/ui/tags-input/TagsInput.vue +22 -0
- package/components/ui/tags-input/TagsInputInput.vue +19 -0
- package/components/ui/tags-input/TagsInputItem.vue +22 -0
- package/components/ui/tags-input/TagsInputItemDelete.vue +24 -0
- package/components/ui/tags-input/TagsInputItemText.vue +19 -0
- package/components/ui/tags-input/index.ts +5 -0
- package/components/ui/textarea/Textarea.vue +24 -0
- package/components/ui/textarea/index.ts +1 -0
- package/components/ui/toast/Toast.vue +28 -0
- package/components/ui/toast/ToastAction.vue +19 -0
- package/components/ui/toast/ToastClose.vue +22 -0
- package/components/ui/toast/ToastDescription.vue +19 -0
- package/components/ui/toast/ToastProvider.vue +11 -0
- package/components/ui/toast/ToastTitle.vue +19 -0
- package/components/ui/toast/ToastViewport.vue +17 -0
- package/components/ui/toast/Toaster.vue +30 -0
- package/components/ui/toast/index.ts +38 -0
- package/components/ui/toast/use-toast.ts +165 -0
- package/components/ui/toggle/Toggle.vue +35 -0
- package/components/ui/toggle/index.ts +27 -0
- package/components/ui/toggle-group/ToggleGroup.vue +34 -0
- package/components/ui/toggle-group/ToggleGroupItem.vue +35 -0
- package/components/ui/toggle-group/index.ts +2 -0
- package/components/ui/tooltip/Tooltip.vue +14 -0
- package/components/ui/tooltip/TooltipContent.vue +31 -0
- package/components/ui/tooltip/TooltipProvider.vue +11 -0
- package/components/ui/tooltip/TooltipTrigger.vue +11 -0
- package/components/ui/tooltip/index.ts +4 -0
- package/components/ui/v-calendar/Calendar.vue +331 -0
- package/components/ui/v-calendar/index.ts +22 -0
- package/components.json +17 -0
- package/edge-components-install.sh +1 -0
- package/jsconfig.json +9 -0
- package/lib/utils.ts +6 -0
- package/nuxt.config.ts +28 -11
- package/package.json +33 -14
- package/pages/app/account/[page].vue +71 -0
- package/pages/app/dashboard/[[collection]]/[[docId]].vue +181 -0
- package/pages/app/login.vue +9 -7
- package/pages/app/signup.vue +9 -7
- package/plugins/icons.ts +72 -0
- package/tailwind.config.js +85 -0
- package/components/.gitkeep +0 -0
- package/components/account.vue +0 -107
- package/components/billing.vue +0 -8
- package/components/bottomMenu.vue +0 -35
- package/components/dashboard.vue +0 -186
- package/components/editor.vue +0 -247
- package/components/topMenu.vue +0 -17
- package/components/userMenu.vue +0 -64
- package/composables/vuetify.ts +0 -10
- package/pages/app/[[page]]/[[collection]]/[[docId]].vue +0 -48
- package/plugins/edgeFirebaseFramework.ts +0 -5
- package/plugins/vuetify.ts +0 -14
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { FormLabel } from '@/components/ui/form'
|
|
3
|
+
|
|
4
|
+
defineProps<{
|
|
5
|
+
required?: boolean
|
|
6
|
+
}>()
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<template>
|
|
10
|
+
<FormLabel>
|
|
11
|
+
<slot />
|
|
12
|
+
<span v-if="required" class="text-destructive"> *</span>
|
|
13
|
+
</FormLabel>
|
|
14
|
+
</template>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import AutoFormFieldArray from './AutoFormFieldArray.vue'
|
|
2
|
+
import AutoFormFieldBoolean from './AutoFormFieldBoolean.vue'
|
|
3
|
+
import AutoFormFieldDate from './AutoFormFieldDate.vue'
|
|
4
|
+
import AutoFormFieldEnum from './AutoFormFieldEnum.vue'
|
|
5
|
+
import AutoFormFieldFile from './AutoFormFieldFile.vue'
|
|
6
|
+
import AutoFormFieldInput from './AutoFormFieldInput.vue'
|
|
7
|
+
import AutoFormFieldNumber from './AutoFormFieldNumber.vue'
|
|
8
|
+
import AutoFormFieldObject from './AutoFormFieldObject.vue'
|
|
9
|
+
|
|
10
|
+
export const INPUT_COMPONENTS = {
|
|
11
|
+
date: AutoFormFieldDate,
|
|
12
|
+
select: AutoFormFieldEnum,
|
|
13
|
+
radio: AutoFormFieldEnum,
|
|
14
|
+
checkbox: AutoFormFieldBoolean,
|
|
15
|
+
switch: AutoFormFieldBoolean,
|
|
16
|
+
textarea: AutoFormFieldInput,
|
|
17
|
+
number: AutoFormFieldNumber,
|
|
18
|
+
string: AutoFormFieldInput,
|
|
19
|
+
file: AutoFormFieldFile,
|
|
20
|
+
array: AutoFormFieldArray,
|
|
21
|
+
object: AutoFormFieldObject,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Define handlers for specific Zod types.
|
|
26
|
+
* You can expand this object to support more types.
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_ZOD_HANDLERS: {
|
|
29
|
+
[key: string]: keyof typeof INPUT_COMPONENTS
|
|
30
|
+
} = {
|
|
31
|
+
ZodString: 'string',
|
|
32
|
+
ZodBoolean: 'checkbox',
|
|
33
|
+
ZodDate: 'date',
|
|
34
|
+
ZodEnum: 'select',
|
|
35
|
+
ZodNativeEnum: 'select',
|
|
36
|
+
ZodNumber: 'number',
|
|
37
|
+
ZodArray: 'array',
|
|
38
|
+
ZodObject: 'object',
|
|
39
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type * as z from 'zod'
|
|
2
|
+
import type { Ref } from 'vue'
|
|
3
|
+
import { computed, ref, watch } from 'vue'
|
|
4
|
+
import { useFieldValue, useFormValues } from 'vee-validate'
|
|
5
|
+
import { createContext } from 'radix-vue'
|
|
6
|
+
import { type Dependency, DependencyType, type EnumValues } from './interface'
|
|
7
|
+
import { getFromPath, getIndexIfArray } from './utils'
|
|
8
|
+
|
|
9
|
+
export const [injectDependencies, provideDependencies] = createContext<Ref<Dependency<z.infer<z.ZodObject<any>>>[] | undefined>>('AutoFormDependencies')
|
|
10
|
+
|
|
11
|
+
export default function useDependencies(
|
|
12
|
+
fieldName: string,
|
|
13
|
+
) {
|
|
14
|
+
const form = useFormValues()
|
|
15
|
+
// parsed test[0].age => test.age
|
|
16
|
+
const currentFieldName = fieldName.replace(/\[\d+\]/g, '')
|
|
17
|
+
const currentFieldValue = useFieldValue<any>(fieldName)
|
|
18
|
+
|
|
19
|
+
if (!form)
|
|
20
|
+
throw new Error('useDependencies should be used within <AutoForm>')
|
|
21
|
+
|
|
22
|
+
const dependencies = injectDependencies()
|
|
23
|
+
const isDisabled = ref(false)
|
|
24
|
+
const isHidden = ref(false)
|
|
25
|
+
const isRequired = ref(false)
|
|
26
|
+
const overrideOptions = ref<EnumValues | undefined>()
|
|
27
|
+
|
|
28
|
+
const currentFieldDependencies = computed(() => dependencies.value?.filter(
|
|
29
|
+
dependency => dependency.targetField === currentFieldName,
|
|
30
|
+
))
|
|
31
|
+
|
|
32
|
+
function getSourceValue(dep: Dependency<any>) {
|
|
33
|
+
const source = dep.sourceField as string
|
|
34
|
+
const index = getIndexIfArray(fieldName) ?? -1
|
|
35
|
+
const [sourceLast, ...sourceInitial] = source.split('.').toReversed()
|
|
36
|
+
const [_targetLast, ...targetInitial] = (dep.targetField as string).split('.').toReversed()
|
|
37
|
+
|
|
38
|
+
if (index >= 0 && sourceInitial.join(',') === targetInitial.join(',')) {
|
|
39
|
+
const [_currentLast, ...currentInitial] = fieldName.split('.').toReversed()
|
|
40
|
+
return getFromPath(form.value, currentInitial.join('.') + sourceLast)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return getFromPath(form.value, source)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const sourceFieldValues = computed(() => currentFieldDependencies.value?.map(dep => getSourceValue(dep)))
|
|
47
|
+
|
|
48
|
+
const resetConditionState = () => {
|
|
49
|
+
isDisabled.value = false
|
|
50
|
+
isHidden.value = false
|
|
51
|
+
isRequired.value = false
|
|
52
|
+
overrideOptions.value = undefined
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
watch([sourceFieldValues, dependencies], () => {
|
|
56
|
+
resetConditionState()
|
|
57
|
+
currentFieldDependencies.value?.forEach((dep) => {
|
|
58
|
+
const sourceValue = getSourceValue(dep)
|
|
59
|
+
const conditionMet = dep.when(sourceValue, currentFieldValue.value)
|
|
60
|
+
|
|
61
|
+
switch (dep.type) {
|
|
62
|
+
case DependencyType.DISABLES:
|
|
63
|
+
if (conditionMet)
|
|
64
|
+
isDisabled.value = true
|
|
65
|
+
|
|
66
|
+
break
|
|
67
|
+
case DependencyType.REQUIRES:
|
|
68
|
+
if (conditionMet)
|
|
69
|
+
isRequired.value = true
|
|
70
|
+
|
|
71
|
+
break
|
|
72
|
+
case DependencyType.HIDES:
|
|
73
|
+
if (conditionMet)
|
|
74
|
+
isHidden.value = true
|
|
75
|
+
|
|
76
|
+
break
|
|
77
|
+
case DependencyType.SETS_OPTIONS:
|
|
78
|
+
if (conditionMet)
|
|
79
|
+
overrideOptions.value = dep.options
|
|
80
|
+
|
|
81
|
+
break
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
}, { immediate: true, deep: true })
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
isDisabled,
|
|
88
|
+
isHidden,
|
|
89
|
+
isRequired,
|
|
90
|
+
overrideOptions,
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { getObjectFormSchema, getBaseSchema, getBaseType } from './utils'
|
|
2
|
+
export type { Config, ConfigItem, FieldProps } from './interface'
|
|
3
|
+
|
|
4
|
+
export { default as AutoForm } from './AutoForm.vue'
|
|
5
|
+
export { default as AutoFormField } from './AutoFormField.vue'
|
|
6
|
+
export { default as AutoFormLabel } from './AutoFormLabel.vue'
|
|
7
|
+
|
|
8
|
+
export { default as AutoFormFieldArray } from './AutoFormFieldArray.vue'
|
|
9
|
+
export { default as AutoFormFieldBoolean } from './AutoFormFieldBoolean.vue'
|
|
10
|
+
export { default as AutoFormFieldDate } from './AutoFormFieldDate.vue'
|
|
11
|
+
export { default as AutoFormFieldEnum } from './AutoFormFieldEnum.vue'
|
|
12
|
+
export { default as AutoFormFieldFile } from './AutoFormFieldFile.vue'
|
|
13
|
+
export { default as AutoFormFieldInput } from './AutoFormFieldInput.vue'
|
|
14
|
+
export { default as AutoFormFieldNumber } from './AutoFormFieldNumber.vue'
|
|
15
|
+
export { default as AutoFormFieldObject } from './AutoFormFieldObject.vue'
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Component, InputHTMLAttributes } from 'vue'
|
|
2
|
+
import type { ZodAny, z } from 'zod'
|
|
3
|
+
import type { INPUT_COMPONENTS } from './constant'
|
|
4
|
+
|
|
5
|
+
export interface FieldProps {
|
|
6
|
+
fieldName: string
|
|
7
|
+
label?: string
|
|
8
|
+
required?: boolean
|
|
9
|
+
config?: ConfigItem
|
|
10
|
+
disabled?: boolean
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface Shape {
|
|
14
|
+
type: string
|
|
15
|
+
default?: any
|
|
16
|
+
required?: boolean
|
|
17
|
+
options?: string[]
|
|
18
|
+
schema?: ZodAny
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ConfigItem {
|
|
22
|
+
/** Value for the `FormLabel` */
|
|
23
|
+
label?: string
|
|
24
|
+
/** Value for the `FormDescription` */
|
|
25
|
+
description?: string
|
|
26
|
+
/** Pick which component to be rendered. */
|
|
27
|
+
component?: keyof typeof INPUT_COMPONENTS | Component
|
|
28
|
+
/** Hide `FormLabel`. */
|
|
29
|
+
hideLabel?: boolean
|
|
30
|
+
inputProps?: InputHTMLAttributes
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Define a type to unwrap an array
|
|
34
|
+
type UnwrapArray<T> = T extends (infer U)[] ? U : never
|
|
35
|
+
|
|
36
|
+
export type Config<SchemaType extends object> = {
|
|
37
|
+
// If SchemaType.key is an object, create a nested Config, otherwise ConfigItem
|
|
38
|
+
[Key in keyof SchemaType]?:
|
|
39
|
+
SchemaType[Key] extends any[]
|
|
40
|
+
? UnwrapArray<Config<SchemaType[Key]>>
|
|
41
|
+
: SchemaType[Key] extends object
|
|
42
|
+
? Config<SchemaType[Key]>
|
|
43
|
+
: ConfigItem;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export enum DependencyType {
|
|
47
|
+
DISABLES,
|
|
48
|
+
REQUIRES,
|
|
49
|
+
HIDES,
|
|
50
|
+
SETS_OPTIONS,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface BaseDependency<SchemaType extends z.infer<z.ZodObject<any, any>>> {
|
|
54
|
+
sourceField: keyof SchemaType
|
|
55
|
+
type: DependencyType
|
|
56
|
+
targetField: keyof SchemaType
|
|
57
|
+
when: (sourceFieldValue: any, targetFieldValue: any) => boolean
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type ValueDependency<SchemaType extends z.infer<z.ZodObject<any, any>>> =
|
|
61
|
+
BaseDependency<SchemaType> & {
|
|
62
|
+
type:
|
|
63
|
+
| DependencyType.DISABLES
|
|
64
|
+
| DependencyType.REQUIRES
|
|
65
|
+
| DependencyType.HIDES
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type EnumValues = readonly [string, ...string[]]
|
|
69
|
+
|
|
70
|
+
export type OptionsDependency<
|
|
71
|
+
SchemaType extends z.infer<z.ZodObject<any, any>>,
|
|
72
|
+
> = BaseDependency<SchemaType> & {
|
|
73
|
+
type: DependencyType.SETS_OPTIONS
|
|
74
|
+
|
|
75
|
+
// Partial array of values from sourceField that will trigger the dependency
|
|
76
|
+
options: EnumValues
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type Dependency<SchemaType extends z.infer<z.ZodObject<any, any>>> =
|
|
80
|
+
| ValueDependency<SchemaType>
|
|
81
|
+
| OptionsDependency<SchemaType>
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
// TODO: This should support recursive ZodEffects but TypeScript doesn't allow circular type definitions.
|
|
4
|
+
export type ZodObjectOrWrapped =
|
|
5
|
+
| z.ZodObject<any, any>
|
|
6
|
+
| z.ZodEffects<z.ZodObject<any, any>>
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Beautify a camelCase string.
|
|
10
|
+
* e.g. "myString" -> "My String"
|
|
11
|
+
*/
|
|
12
|
+
export function beautifyObjectName(string: string) {
|
|
13
|
+
// Remove bracketed indices
|
|
14
|
+
// if numbers only return the string
|
|
15
|
+
let output = string.replace(/\[\d+\]/g, '').replace(/([A-Z])/g, ' $1')
|
|
16
|
+
output = output.charAt(0).toUpperCase() + output.slice(1)
|
|
17
|
+
return output
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Parse string and extract the index
|
|
22
|
+
* @param string
|
|
23
|
+
* @returns index or undefined
|
|
24
|
+
*/
|
|
25
|
+
export function getIndexIfArray(string: string) {
|
|
26
|
+
const indexRegex = /\[(\d+)\]/
|
|
27
|
+
// Match the index
|
|
28
|
+
const match = string.match(indexRegex)
|
|
29
|
+
// Extract the index (number)
|
|
30
|
+
const index = match ? Number.parseInt(match[1]) : undefined
|
|
31
|
+
return index
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get the lowest level Zod type.
|
|
36
|
+
* This will unpack optionals, refinements, etc.
|
|
37
|
+
*/
|
|
38
|
+
export function getBaseSchema<
|
|
39
|
+
ChildType extends z.ZodAny | z.AnyZodObject = z.ZodAny,
|
|
40
|
+
>(schema: ChildType | z.ZodEffects<ChildType>): ChildType | null {
|
|
41
|
+
if (!schema)
|
|
42
|
+
return null
|
|
43
|
+
if ('innerType' in schema._def)
|
|
44
|
+
return getBaseSchema(schema._def.innerType as ChildType)
|
|
45
|
+
|
|
46
|
+
if ('schema' in schema._def)
|
|
47
|
+
return getBaseSchema(schema._def.schema as ChildType)
|
|
48
|
+
|
|
49
|
+
return schema as ChildType
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Get the type name of the lowest level Zod type.
|
|
54
|
+
* This will unpack optionals, refinements, etc.
|
|
55
|
+
*/
|
|
56
|
+
export function getBaseType(schema: z.ZodAny) {
|
|
57
|
+
const baseSchema = getBaseSchema(schema)
|
|
58
|
+
return baseSchema ? baseSchema._def.typeName : ''
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Search for a "ZodDefault" in the Zod stack and return its value.
|
|
63
|
+
*/
|
|
64
|
+
export function getDefaultValueInZodStack(schema: z.ZodAny): any {
|
|
65
|
+
const typedSchema = schema as unknown as z.ZodDefault<
|
|
66
|
+
z.ZodNumber | z.ZodString
|
|
67
|
+
>
|
|
68
|
+
|
|
69
|
+
if (typedSchema._def.typeName === 'ZodDefault')
|
|
70
|
+
return typedSchema._def.defaultValue()
|
|
71
|
+
|
|
72
|
+
if ('innerType' in typedSchema._def) {
|
|
73
|
+
return getDefaultValueInZodStack(
|
|
74
|
+
typedSchema._def.innerType as unknown as z.ZodAny,
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
if ('schema' in typedSchema._def) {
|
|
78
|
+
return getDefaultValueInZodStack(
|
|
79
|
+
(typedSchema._def as any).schema as z.ZodAny,
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function getObjectFormSchema(
|
|
87
|
+
schema: ZodObjectOrWrapped,
|
|
88
|
+
): z.ZodObject<any, any> {
|
|
89
|
+
if (schema?._def.typeName === 'ZodEffects') {
|
|
90
|
+
const typedSchema = schema as z.ZodEffects<z.ZodObject<any, any>>
|
|
91
|
+
return getObjectFormSchema(typedSchema._def.schema)
|
|
92
|
+
}
|
|
93
|
+
return schema as z.ZodObject<any, any>
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function isIndex(value: unknown): value is number {
|
|
97
|
+
return Number(value) >= 0
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Constructs a path with dot paths for arrays to use brackets to be compatible with vee-validate path syntax
|
|
101
|
+
*/
|
|
102
|
+
export function normalizeFormPath(path: string): string {
|
|
103
|
+
const pathArr = path.split('.')
|
|
104
|
+
if (!pathArr.length)
|
|
105
|
+
return ''
|
|
106
|
+
|
|
107
|
+
let fullPath = String(pathArr[0])
|
|
108
|
+
for (let i = 1; i < pathArr.length; i++) {
|
|
109
|
+
if (isIndex(pathArr[i])) {
|
|
110
|
+
fullPath += `[${pathArr[i]}]`
|
|
111
|
+
continue
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fullPath += `.${pathArr[i]}`
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return fullPath
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
type NestedRecord = Record<string, unknown> | { [k: string]: NestedRecord }
|
|
121
|
+
/**
|
|
122
|
+
* Checks if the path opted out of nested fields using `[fieldName]` syntax
|
|
123
|
+
*/
|
|
124
|
+
export function isNotNestedPath(path: string) {
|
|
125
|
+
return /^\[.+\]$/.test(path)
|
|
126
|
+
}
|
|
127
|
+
function isObject(obj: unknown): obj is Record<string, unknown> {
|
|
128
|
+
return obj !== null && !!obj && typeof obj === 'object' && !Array.isArray(obj)
|
|
129
|
+
}
|
|
130
|
+
function isContainerValue(value: unknown): value is Record<string, unknown> {
|
|
131
|
+
return isObject(value) || Array.isArray(value)
|
|
132
|
+
}
|
|
133
|
+
function cleanupNonNestedPath(path: string) {
|
|
134
|
+
if (isNotNestedPath(path))
|
|
135
|
+
return path.replace(/\[|\]/g, '')
|
|
136
|
+
|
|
137
|
+
return path
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Gets a nested property value from an object
|
|
142
|
+
*/
|
|
143
|
+
export function getFromPath<TValue = unknown>(object: NestedRecord | undefined, path: string): TValue | undefined
|
|
144
|
+
export function getFromPath<TValue = unknown, TFallback = TValue>(
|
|
145
|
+
object: NestedRecord | undefined,
|
|
146
|
+
path: string,
|
|
147
|
+
fallback?: TFallback,
|
|
148
|
+
): TValue | TFallback
|
|
149
|
+
export function getFromPath<TValue = unknown, TFallback = TValue>(
|
|
150
|
+
object: NestedRecord | undefined,
|
|
151
|
+
path: string,
|
|
152
|
+
fallback?: TFallback,
|
|
153
|
+
): TValue | TFallback | undefined {
|
|
154
|
+
if (!object)
|
|
155
|
+
return fallback
|
|
156
|
+
|
|
157
|
+
if (isNotNestedPath(path))
|
|
158
|
+
return object[cleanupNonNestedPath(path)] as TValue | undefined
|
|
159
|
+
|
|
160
|
+
const resolvedValue = (path || '')
|
|
161
|
+
.split(/\.|\[(\d+)\]/)
|
|
162
|
+
.filter(Boolean)
|
|
163
|
+
.reduce((acc, propKey) => {
|
|
164
|
+
if (isContainerValue(acc) && propKey in acc)
|
|
165
|
+
return acc[propKey]
|
|
166
|
+
|
|
167
|
+
return fallback
|
|
168
|
+
}, object as unknown)
|
|
169
|
+
|
|
170
|
+
return resolvedValue as TValue | undefined
|
|
171
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
import { AvatarRoot } from 'radix-vue'
|
|
4
|
+
import { type AvatarVariants, avatarVariant } from '.'
|
|
5
|
+
import { cn } from '@/lib/utils'
|
|
6
|
+
|
|
7
|
+
const props = withDefaults(defineProps<{
|
|
8
|
+
class?: HTMLAttributes['class']
|
|
9
|
+
size?: AvatarVariants['size']
|
|
10
|
+
shape?: AvatarVariants['shape']
|
|
11
|
+
}>(), {
|
|
12
|
+
size: 'sm',
|
|
13
|
+
shape: 'circle',
|
|
14
|
+
})
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<template>
|
|
18
|
+
<AvatarRoot :class="cn(avatarVariant({ size, shape }), props.class)">
|
|
19
|
+
<slot />
|
|
20
|
+
</AvatarRoot>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type VariantProps, cva } from 'class-variance-authority'
|
|
2
|
+
|
|
3
|
+
export { default as Avatar } from './Avatar.vue'
|
|
4
|
+
export { default as AvatarImage } from './AvatarImage.vue'
|
|
5
|
+
export { default as AvatarFallback } from './AvatarFallback.vue'
|
|
6
|
+
|
|
7
|
+
export const avatarVariant = cva(
|
|
8
|
+
'inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden',
|
|
9
|
+
{
|
|
10
|
+
variants: {
|
|
11
|
+
size: {
|
|
12
|
+
sm: 'h-10 w-10 text-xs',
|
|
13
|
+
base: 'h-16 w-16 text-2xl',
|
|
14
|
+
lg: 'h-32 w-32 text-5xl',
|
|
15
|
+
},
|
|
16
|
+
shape: {
|
|
17
|
+
circle: 'rounded-full',
|
|
18
|
+
square: 'rounded-md',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
export type AvatarVariants = VariantProps<typeof avatarVariant>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
import { type BadgeVariants, badgeVariants } from '.'
|
|
4
|
+
import { cn } from '@/lib/utils'
|
|
5
|
+
|
|
6
|
+
const props = defineProps<{
|
|
7
|
+
variant?: BadgeVariants['variant']
|
|
8
|
+
class?: HTMLAttributes['class']
|
|
9
|
+
}>()
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<div :class="cn(badgeVariants({ variant }), props.class)">
|
|
14
|
+
<slot />
|
|
15
|
+
</div>
|
|
16
|
+
</template>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type VariantProps, cva } from 'class-variance-authority'
|
|
2
|
+
|
|
3
|
+
export { default as Badge } from './Badge.vue'
|
|
4
|
+
|
|
5
|
+
export const badgeVariants = cva(
|
|
6
|
+
'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',
|
|
7
|
+
{
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
default:
|
|
11
|
+
'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',
|
|
12
|
+
secondary:
|
|
13
|
+
'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',
|
|
14
|
+
destructive:
|
|
15
|
+
'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',
|
|
16
|
+
outline: 'text-foreground',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
variant: 'default',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
export type BadgeVariants = VariantProps<typeof badgeVariants>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
|
|
4
|
+
const props = defineProps<{
|
|
5
|
+
class?: HTMLAttributes['class']
|
|
6
|
+
}>()
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<template>
|
|
10
|
+
<nav aria-label="breadcrumb" :class="props.class">
|
|
11
|
+
<slot />
|
|
12
|
+
</nav>
|
|
13
|
+
</template>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
import { MoreHorizontal } from 'lucide-vue-next'
|
|
4
|
+
import { cn } from '@/lib/utils'
|
|
5
|
+
|
|
6
|
+
const props = defineProps<{
|
|
7
|
+
class?: HTMLAttributes['class']
|
|
8
|
+
}>()
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<span
|
|
13
|
+
role="presentation"
|
|
14
|
+
aria-hidden="true"
|
|
15
|
+
:class="cn('flex h-9 w-9 items-center justify-center', props.class)"
|
|
16
|
+
>
|
|
17
|
+
<slot>
|
|
18
|
+
<MoreHorizontal class="h-4 w-4" />
|
|
19
|
+
</slot>
|
|
20
|
+
<span class="sr-only">More</span>
|
|
21
|
+
</span>
|
|
22
|
+
</template>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
import { cn } from '@/lib/utils'
|
|
4
|
+
|
|
5
|
+
const props = defineProps<{
|
|
6
|
+
class?: HTMLAttributes['class']
|
|
7
|
+
}>()
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<li
|
|
12
|
+
:class="cn('inline-flex items-center gap-1.5', props.class)"
|
|
13
|
+
>
|
|
14
|
+
<slot />
|
|
15
|
+
</li>
|
|
16
|
+
</template>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
import { Primitive, type PrimitiveProps } from 'radix-vue'
|
|
4
|
+
import { cn } from '@/lib/utils'
|
|
5
|
+
|
|
6
|
+
const props = withDefaults(defineProps<PrimitiveProps & { class?: HTMLAttributes['class'] }>(), {
|
|
7
|
+
as: 'a',
|
|
8
|
+
})
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<Primitive
|
|
13
|
+
:as="as"
|
|
14
|
+
:as-child="asChild"
|
|
15
|
+
:class="cn('transition-colors hover:text-foreground', props.class)"
|
|
16
|
+
>
|
|
17
|
+
<slot />
|
|
18
|
+
</Primitive>
|
|
19
|
+
</template>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
import { cn } from '@/lib/utils'
|
|
4
|
+
|
|
5
|
+
const props = defineProps<{
|
|
6
|
+
class?: HTMLAttributes['class']
|
|
7
|
+
}>()
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<ol
|
|
12
|
+
:class="cn('flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5', props.class)"
|
|
13
|
+
>
|
|
14
|
+
<slot />
|
|
15
|
+
</ol>
|
|
16
|
+
</template>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
import { cn } from '@/lib/utils'
|
|
4
|
+
|
|
5
|
+
const props = defineProps<{
|
|
6
|
+
class?: HTMLAttributes['class']
|
|
7
|
+
}>()
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<span
|
|
12
|
+
role="link"
|
|
13
|
+
aria-disabled="true"
|
|
14
|
+
aria-current="page"
|
|
15
|
+
:class="cn('font-normal text-foreground', props.class)"
|
|
16
|
+
>
|
|
17
|
+
<slot />
|
|
18
|
+
</span>
|
|
19
|
+
</template>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { HTMLAttributes } from 'vue'
|
|
3
|
+
import { ChevronRight } from 'lucide-vue-next'
|
|
4
|
+
import { cn } from '@/lib/utils'
|
|
5
|
+
|
|
6
|
+
const props = defineProps<{
|
|
7
|
+
class?: HTMLAttributes['class']
|
|
8
|
+
}>()
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<li
|
|
13
|
+
role="presentation"
|
|
14
|
+
aria-hidden="true"
|
|
15
|
+
:class="cn('[&>svg]:size-3.5', props.class)"
|
|
16
|
+
>
|
|
17
|
+
<slot>
|
|
18
|
+
<ChevronRight />
|
|
19
|
+
</slot>
|
|
20
|
+
</li>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,7 @@
|
|
|
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'
|