@reinvented/design 0.2.0 → 0.2.1

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.
Files changed (182) hide show
  1. package/docs/components/alert-dialog.md +32 -0
  2. package/docs/components/avatar.md +14 -0
  3. package/docs/components/badge.md +24 -0
  4. package/docs/components/button.md +69 -0
  5. package/docs/components/card.md +49 -0
  6. package/docs/components/dialog.md +46 -0
  7. package/docs/components/dropdown-menu.md +32 -0
  8. package/docs/components/index.md +69 -50
  9. package/docs/components/input.md +34 -0
  10. package/docs/components/remaining-components.md +253 -0
  11. package/docs/components/scroll-area.md +17 -0
  12. package/docs/components/select.md +31 -0
  13. package/docs/components/separator.md +14 -0
  14. package/docs/components/sheet.md +32 -0
  15. package/docs/components/skeleton.md +20 -0
  16. package/docs/components/table.md +33 -0
  17. package/docs/components/tabs.md +23 -0
  18. package/docs/layouts/dashboard.md +70 -0
  19. package/docs/layouts/detail-page.md +83 -0
  20. package/docs/layouts/index.md +37 -24
  21. package/docs/layouts/list-page.md +107 -0
  22. package/docs/layouts/settings-page.md +79 -0
  23. package/docs/layouts/step-wizard.md +73 -0
  24. package/package.json +1 -1
  25. package/src/components/ui/accordion/Accordion.vue +13 -0
  26. package/src/components/ui/accordion/AccordionContent.vue +20 -0
  27. package/src/components/ui/accordion/AccordionItem.vue +15 -0
  28. package/src/components/ui/accordion/AccordionTrigger.vue +25 -0
  29. package/src/components/ui/accordion/index.ts +4 -0
  30. package/src/components/ui/alert/Alert.vue +38 -0
  31. package/src/components/ui/alert/AlertDescription.vue +12 -0
  32. package/src/components/ui/alert/AlertTitle.vue +12 -0
  33. package/src/components/ui/alert/index.ts +3 -0
  34. package/src/components/ui/alert-dialog/AlertDialog.vue +13 -0
  35. package/src/components/ui/alert-dialog/AlertDialogAction.vue +21 -0
  36. package/src/components/ui/alert-dialog/AlertDialogCancel.vue +21 -0
  37. package/src/components/ui/alert-dialog/AlertDialogContent.vue +39 -0
  38. package/src/components/ui/alert-dialog/AlertDialogDescription.vue +15 -0
  39. package/src/components/ui/alert-dialog/AlertDialogFooter.vue +12 -0
  40. package/src/components/ui/alert-dialog/AlertDialogHeader.vue +12 -0
  41. package/src/components/ui/alert-dialog/AlertDialogTitle.vue +15 -0
  42. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
  43. package/src/components/ui/alert-dialog/index.ts +9 -0
  44. package/src/components/ui/breadcrumb/Breadcrumb.vue +6 -0
  45. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +12 -0
  46. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +6 -0
  47. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +20 -0
  48. package/src/components/ui/breadcrumb/BreadcrumbList.vue +6 -0
  49. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +6 -0
  50. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +11 -0
  51. package/src/components/ui/breadcrumb/index.ts +7 -0
  52. package/src/components/ui/button/Button.vue +0 -1
  53. package/src/components/ui/checkbox/Checkbox.vue +25 -0
  54. package/src/components/ui/checkbox/index.ts +1 -0
  55. package/src/components/ui/collapsible/Collapsible.vue +13 -0
  56. package/src/components/ui/collapsible/index.ts +2 -0
  57. package/src/components/ui/command/Command.vue +16 -0
  58. package/src/components/ui/command/CommandEmpty.vue +5 -0
  59. package/src/components/ui/command/CommandGroup.vue +22 -0
  60. package/src/components/ui/command/CommandInput.vue +21 -0
  61. package/src/components/ui/command/CommandItem.vue +22 -0
  62. package/src/components/ui/command/CommandList.vue +17 -0
  63. package/src/components/ui/command/CommandSeparator.vue +5 -0
  64. package/src/components/ui/command/index.ts +7 -0
  65. package/src/components/ui/context-menu/ContextMenuContent.vue +24 -0
  66. package/src/components/ui/context-menu/ContextMenuItem.vue +16 -0
  67. package/src/components/ui/context-menu/ContextMenuLabel.vue +9 -0
  68. package/src/components/ui/context-menu/ContextMenuSeparator.vue +9 -0
  69. package/src/components/ui/context-menu/ContextMenuSubContent.vue +14 -0
  70. package/src/components/ui/context-menu/index.ts +9 -0
  71. package/src/components/ui/dialog/Dialog.vue +14 -0
  72. package/src/components/ui/dialog/DialogClose.vue +12 -0
  73. package/src/components/ui/dialog/DialogContent.vue +48 -0
  74. package/src/components/ui/dialog/DialogDescription.vue +23 -0
  75. package/src/components/ui/dialog/DialogFooter.vue +12 -0
  76. package/src/components/ui/dialog/DialogHeader.vue +12 -0
  77. package/src/components/ui/dialog/DialogScrollContent.vue +47 -0
  78. package/src/components/ui/dialog/DialogTitle.vue +23 -0
  79. package/src/components/ui/dialog/DialogTrigger.vue +12 -0
  80. package/src/components/ui/dialog/index.ts +9 -0
  81. package/src/components/ui/dropdown-menu/DropdownMenu.vue +13 -0
  82. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +28 -0
  83. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +33 -0
  84. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
  85. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +27 -0
  86. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  87. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +13 -0
  88. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +27 -0
  89. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +13 -0
  90. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +12 -0
  91. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +13 -0
  92. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -0
  93. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +23 -0
  94. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +11 -0
  95. package/src/components/ui/dropdown-menu/index.ts +14 -0
  96. package/src/components/ui/form/FormControl.vue +3 -0
  97. package/src/components/ui/form/FormDescription.vue +6 -0
  98. package/src/components/ui/form/FormItem.vue +6 -0
  99. package/src/components/ui/form/FormLabel.vue +10 -0
  100. package/src/components/ui/form/FormMessage.vue +10 -0
  101. package/src/components/ui/form/index.ts +9 -0
  102. package/src/components/ui/hover-card/HoverCard.vue +13 -0
  103. package/src/components/ui/hover-card/HoverCardContent.vue +26 -0
  104. package/src/components/ui/hover-card/HoverCardTrigger.vue +11 -0
  105. package/src/components/ui/hover-card/index.ts +3 -0
  106. package/src/components/ui/label/Label.vue +18 -0
  107. package/src/components/ui/label/index.ts +1 -0
  108. package/src/components/ui/menubar/MenubarContent.vue +15 -0
  109. package/src/components/ui/menubar/MenubarItem.vue +13 -0
  110. package/src/components/ui/menubar/MenubarTrigger.vue +13 -0
  111. package/src/components/ui/menubar/index.ts +5 -0
  112. package/src/components/ui/navigation-menu/NavigationMenuContent.vue +14 -0
  113. package/src/components/ui/navigation-menu/NavigationMenuTrigger.vue +15 -0
  114. package/src/components/ui/navigation-menu/index.ts +4 -0
  115. package/src/components/ui/pagination/PaginationContent.vue +13 -0
  116. package/src/components/ui/pagination/PaginationEllipsis.vue +12 -0
  117. package/src/components/ui/pagination/PaginationNext.vue +14 -0
  118. package/src/components/ui/pagination/PaginationPrev.vue +14 -0
  119. package/src/components/ui/pagination/index.ts +6 -0
  120. package/src/components/ui/popover/Popover.vue +13 -0
  121. package/src/components/ui/popover/PopoverContent.vue +27 -0
  122. package/src/components/ui/popover/PopoverTrigger.vue +11 -0
  123. package/src/components/ui/popover/index.ts +3 -0
  124. package/src/components/ui/progress/Progress.vue +21 -0
  125. package/src/components/ui/progress/index.ts +1 -0
  126. package/src/components/ui/radio-group/RadioGroup.vue +16 -0
  127. package/src/components/ui/radio-group/RadioGroupItem.vue +24 -0
  128. package/src/components/ui/radio-group/index.ts +2 -0
  129. package/src/components/ui/select/Select.vue +13 -0
  130. package/src/components/ui/select/SelectContent.vue +40 -0
  131. package/src/components/ui/select/SelectGroup.vue +15 -0
  132. package/src/components/ui/select/SelectItem.vue +30 -0
  133. package/src/components/ui/select/SelectLabel.vue +15 -0
  134. package/src/components/ui/select/SelectSeparator.vue +13 -0
  135. package/src/components/ui/select/SelectTrigger.vue +23 -0
  136. package/src/components/ui/select/SelectValue.vue +11 -0
  137. package/src/components/ui/select/index.ts +8 -0
  138. package/src/components/ui/sheet/Sheet.vue +13 -0
  139. package/src/components/ui/sheet/SheetClose.vue +11 -0
  140. package/src/components/ui/sheet/SheetContent.vue +65 -0
  141. package/src/components/ui/sheet/SheetDescription.vue +15 -0
  142. package/src/components/ui/sheet/SheetFooter.vue +12 -0
  143. package/src/components/ui/sheet/SheetHeader.vue +12 -0
  144. package/src/components/ui/sheet/SheetTitle.vue +15 -0
  145. package/src/components/ui/sheet/SheetTrigger.vue +11 -0
  146. package/src/components/ui/sheet/index.ts +8 -0
  147. package/src/components/ui/slider/Slider.vue +26 -0
  148. package/src/components/ui/slider/index.ts +1 -0
  149. package/src/components/ui/switch/Switch.vue +24 -0
  150. package/src/components/ui/switch/index.ts +1 -0
  151. package/src/components/ui/table/Table.vue +13 -0
  152. package/src/components/ui/table/TableBody.vue +6 -0
  153. package/src/components/ui/table/TableCaption.vue +6 -0
  154. package/src/components/ui/table/TableCell.vue +6 -0
  155. package/src/components/ui/table/TableFooter.vue +6 -0
  156. package/src/components/ui/table/TableHead.vue +6 -0
  157. package/src/components/ui/table/TableHeader.vue +6 -0
  158. package/src/components/ui/table/TableRow.vue +6 -0
  159. package/src/components/ui/table/index.ts +8 -0
  160. package/src/components/ui/tabs/Tabs.vue +13 -0
  161. package/src/components/ui/tabs/TabsContent.vue +21 -0
  162. package/src/components/ui/tabs/TabsList.vue +21 -0
  163. package/src/components/ui/tabs/TabsTrigger.vue +21 -0
  164. package/src/components/ui/tabs/index.ts +4 -0
  165. package/src/components/ui/textarea/Textarea.vue +29 -0
  166. package/src/components/ui/textarea/index.ts +1 -0
  167. package/src/components/ui/toggle/Toggle.vue +40 -0
  168. package/src/components/ui/toggle/index.ts +1 -0
  169. package/src/components/ui/toggle-group/ToggleGroup.vue +16 -0
  170. package/src/components/ui/toggle-group/ToggleGroupItem.vue +21 -0
  171. package/src/components/ui/toggle-group/index.ts +2 -0
  172. package/src/components/ui/tooltip/Tooltip.vue +13 -0
  173. package/src/components/ui/tooltip/TooltipContent.vue +27 -0
  174. package/src/components/ui/tooltip/TooltipProvider.vue +12 -0
  175. package/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
  176. package/src/components/ui/tooltip/index.ts +4 -0
  177. package/src/index.ts +46 -192
  178. package/src/patterns/DetailView.vue +2 -2
  179. package/src/patterns/EmptyState.vue +2 -2
  180. package/src/patterns/FormView.vue +2 -2
  181. package/src/patterns/ListView.vue +2 -2
  182. package/tsconfig.json +17 -3
@@ -0,0 +1,6 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../lib/utils'
4
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>()
5
+ </script>
6
+ <template><div :class="cn('space-y-2', props.class)"><slot /></div></template>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../lib/utils'
4
+ const props = defineProps<{ class?: HTMLAttributes['class']; error?: boolean }>()
5
+ </script>
6
+ <template>
7
+ <label :class="cn('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70', error && 'text-destructive', props.class)">
8
+ <slot />
9
+ </label>
10
+ </template>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../lib/utils'
4
+ const props = defineProps<{ class?: HTMLAttributes['class']; message?: string }>()
5
+ </script>
6
+ <template>
7
+ <p v-if="message" :class="cn('text-[0.8rem] font-medium text-destructive', props.class)">
8
+ {{ message }}
9
+ </p>
10
+ </template>
@@ -0,0 +1,9 @@
1
+ // Form components using vee-validate
2
+ // Re-export vee-validate primitives with standard naming
3
+ export { Form, Field as FormField } from 'vee-validate'
4
+
5
+ export { default as FormItem } from './FormItem.vue'
6
+ export { default as FormLabel } from './FormLabel.vue'
7
+ export { default as FormControl } from './FormControl.vue'
8
+ export { default as FormDescription } from './FormDescription.vue'
9
+ export { default as FormMessage } from './FormMessage.vue'
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { HoverCardRoot, type HoverCardRootEmits, type HoverCardRootProps, useForwardPropsEmits } from 'radix-vue'
3
+
4
+ const props = defineProps<HoverCardRootProps>()
5
+ const emits = defineEmits<HoverCardRootEmits>()
6
+ const forwarded = useForwardPropsEmits(props, emits)
7
+ </script>
8
+
9
+ <template>
10
+ <HoverCardRoot v-bind="forwarded">
11
+ <slot />
12
+ </HoverCardRoot>
13
+ </template>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { HoverCardContent, type HoverCardContentProps, HoverCardPortal, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = withDefaults(
7
+ defineProps<HoverCardContentProps & { class?: HTMLAttributes['class'] }>(),
8
+ { sideOffset: 4, align: 'center' },
9
+ )
10
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
11
+ const forwardedProps = useForwardProps(delegatedProps)
12
+ </script>
13
+
14
+ <template>
15
+ <HoverCardPortal>
16
+ <HoverCardContent
17
+ v-bind="forwardedProps"
18
+ :class="cn(
19
+ 'z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
20
+ props.class,
21
+ )"
22
+ >
23
+ <slot />
24
+ </HoverCardContent>
25
+ </HoverCardPortal>
26
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { HoverCardTrigger, type HoverCardTriggerProps } from 'radix-vue'
3
+
4
+ const props = defineProps<HoverCardTriggerProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <HoverCardTrigger v-bind="props">
9
+ <slot />
10
+ </HoverCardTrigger>
11
+ </template>
@@ -0,0 +1,3 @@
1
+ export { default as HoverCard } from './HoverCard.vue'
2
+ export { default as HoverCardContent } from './HoverCardContent.vue'
3
+ export { default as HoverCardTrigger } from './HoverCardTrigger.vue'
@@ -0,0 +1,18 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { Label as LabelRoot, type LabelProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<LabelProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <LabelRoot
13
+ v-bind="forwardedProps"
14
+ :class="cn('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70', props.class)"
15
+ >
16
+ <slot />
17
+ </LabelRoot>
18
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Label } from './Label.vue'
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { MenubarContent, type MenubarContentProps, MenubarPortal, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+ const props = withDefaults(defineProps<MenubarContentProps & { class?: HTMLAttributes['class'] }>(), { sideOffset: 5, alignOffset: -4 })
6
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
7
+ const forwardedProps = useForwardProps(delegatedProps)
8
+ </script>
9
+ <template>
10
+ <MenubarPortal>
11
+ <MenubarContent v-bind="forwardedProps" :class="cn('z-50 min-w-48 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', props.class)">
12
+ <slot />
13
+ </MenubarContent>
14
+ </MenubarPortal>
15
+ </template>
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { MenubarItem, type MenubarItemProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+ const props = defineProps<MenubarItemProps & { class?: HTMLAttributes['class']; inset?: boolean }>()
6
+ const delegatedProps = computed(() => { const { class: _, inset: _i, ...d } = props; return d })
7
+ const forwardedProps = useForwardProps(delegatedProps)
8
+ </script>
9
+ <template>
10
+ <MenubarItem v-bind="forwardedProps" :class="cn('relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', inset && 'pl-8', props.class)">
11
+ <slot />
12
+ </MenubarItem>
13
+ </template>
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { MenubarTrigger, type MenubarTriggerProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+ const props = defineProps<MenubarTriggerProps & { class?: HTMLAttributes['class'] }>()
6
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
7
+ const forwardedProps = useForwardProps(delegatedProps)
8
+ </script>
9
+ <template>
10
+ <MenubarTrigger v-bind="forwardedProps" :class="cn('flex cursor-default select-none items-center rounded-sm px-3 py-1 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground', props.class)">
11
+ <slot />
12
+ </MenubarTrigger>
13
+ </template>
@@ -0,0 +1,5 @@
1
+ // Menubar — styled wrappers around radix-vue Menubar primitives
2
+ export { MenubarRoot as Menubar, MenubarMenu, MenubarSeparator, MenubarPortal } from 'radix-vue'
3
+ export { default as MenubarContent } from './MenubarContent.vue'
4
+ export { default as MenubarItem } from './MenubarItem.vue'
5
+ export { default as MenubarTrigger } from './MenubarTrigger.vue'
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { NavigationMenuContent, type NavigationMenuContentEmits, type NavigationMenuContentProps, useForwardPropsEmits } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+ const props = defineProps<NavigationMenuContentProps & { class?: HTMLAttributes['class'] }>()
6
+ const emits = defineEmits<NavigationMenuContentEmits>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
9
+ </script>
10
+ <template>
11
+ <NavigationMenuContent v-bind="forwarded" :class="cn('left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto', props.class)">
12
+ <slot />
13
+ </NavigationMenuContent>
14
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { NavigationMenuTrigger, type NavigationMenuTriggerProps, useForwardProps } from 'radix-vue'
4
+ import { ChevronDown } from 'lucide-vue-next'
5
+ import { cn } from '../lib/utils'
6
+ const props = defineProps<NavigationMenuTriggerProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+ <template>
11
+ <NavigationMenuTrigger v-bind="forwardedProps" :class="cn('group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50', props.class)">
12
+ <slot />
13
+ <ChevronDown class="relative top-px ml-1 h-3 w-3 transition duration-300 group-data-[state=open]:rotate-180" aria-hidden="true" />
14
+ </NavigationMenuTrigger>
15
+ </template>
@@ -0,0 +1,4 @@
1
+ // NavigationMenu — styled wrappers around radix-vue NavigationMenu primitives
2
+ export { NavigationMenuRoot as NavigationMenu, NavigationMenuList, NavigationMenuItem, NavigationMenuLink, NavigationMenuViewport, NavigationMenuIndicator } from 'radix-vue'
3
+ export { default as NavigationMenuContent } from './NavigationMenuContent.vue'
4
+ export { default as NavigationMenuTrigger } from './NavigationMenuTrigger.vue'
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { PaginationList, type PaginationListProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+ const props = defineProps<PaginationListProps & { class?: HTMLAttributes['class'] }>()
6
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
7
+ const forwardedProps = useForwardProps(delegatedProps)
8
+ </script>
9
+ <template>
10
+ <PaginationList v-bind="forwardedProps" :class="cn('flex flex-row items-center gap-1', props.class)">
11
+ <slot />
12
+ </PaginationList>
13
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { PaginationEllipsis, type PaginationEllipsisProps } from 'radix-vue'
4
+ import { MoreHorizontal } from 'lucide-vue-next'
5
+ import { cn } from '../lib/utils'
6
+ const props = defineProps<PaginationEllipsisProps & { class?: HTMLAttributes['class'] }>()
7
+ </script>
8
+ <template>
9
+ <PaginationEllipsis v-bind="props" :class="cn('flex h-9 w-9 items-center justify-center', props.class)">
10
+ <slot><MoreHorizontal class="h-4 w-4" /></slot>
11
+ </PaginationEllipsis>
12
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { PaginationNext, type PaginationNextProps, useForwardProps } from 'radix-vue'
4
+ import { ChevronRight } from 'lucide-vue-next'
5
+ import { cn } from '../lib/utils'
6
+ const props = defineProps<PaginationNextProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+ <template>
11
+ <PaginationNext v-bind="forwardedProps" :class="cn('flex items-center gap-1 pr-2.5', props.class)">
12
+ <slot><span>Next</span><ChevronRight class="h-4 w-4" /></slot>
13
+ </PaginationNext>
14
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { PaginationPrev, type PaginationPrevProps, useForwardProps } from 'radix-vue'
4
+ import { ChevronLeft } from 'lucide-vue-next'
5
+ import { cn } from '../lib/utils'
6
+ const props = defineProps<PaginationPrevProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+ <template>
11
+ <PaginationPrev v-bind="forwardedProps" :class="cn('flex items-center gap-1 pl-2.5', props.class)">
12
+ <slot><ChevronLeft class="h-4 w-4" /><span>Previous</span></slot>
13
+ </PaginationPrev>
14
+ </template>
@@ -0,0 +1,6 @@
1
+ // Pagination — styled wrappers
2
+ export { PaginationRoot as Pagination, PaginationFirst, PaginationLast, PaginationListItem } from 'radix-vue'
3
+ export { default as PaginationContent } from './PaginationContent.vue'
4
+ export { default as PaginationEllipsis } from './PaginationEllipsis.vue'
5
+ export { default as PaginationNext } from './PaginationNext.vue'
6
+ export { default as PaginationPrev } from './PaginationPrev.vue'
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { PopoverRoot, type PopoverRootEmits, type PopoverRootProps, useForwardPropsEmits } from 'radix-vue'
3
+
4
+ const props = defineProps<PopoverRootProps>()
5
+ const emits = defineEmits<PopoverRootEmits>()
6
+ const forwarded = useForwardPropsEmits(props, emits)
7
+ </script>
8
+
9
+ <template>
10
+ <PopoverRoot v-bind="forwarded">
11
+ <slot />
12
+ </PopoverRoot>
13
+ </template>
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { PopoverContent, type PopoverContentEmits, type PopoverContentProps, PopoverPortal, useForwardPropsEmits } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = withDefaults(
7
+ defineProps<PopoverContentProps & { class?: HTMLAttributes['class'] }>(),
8
+ { sideOffset: 4, align: 'center' },
9
+ )
10
+ const emits = defineEmits<PopoverContentEmits>()
11
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
12
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
13
+ </script>
14
+
15
+ <template>
16
+ <PopoverPortal>
17
+ <PopoverContent
18
+ v-bind="forwarded"
19
+ :class="cn(
20
+ 'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
21
+ props.class,
22
+ )"
23
+ >
24
+ <slot />
25
+ </PopoverContent>
26
+ </PopoverPortal>
27
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { PopoverTrigger, type PopoverTriggerProps } from 'radix-vue'
3
+
4
+ const props = defineProps<PopoverTriggerProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <PopoverTrigger v-bind="props">
9
+ <slot />
10
+ </PopoverTrigger>
11
+ </template>
@@ -0,0 +1,3 @@
1
+ export { default as Popover } from './Popover.vue'
2
+ export { default as PopoverContent } from './PopoverContent.vue'
3
+ export { default as PopoverTrigger } from './PopoverTrigger.vue'
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { ProgressIndicator, ProgressRoot, type ProgressRootProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<ProgressRootProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <ProgressRoot
13
+ v-bind="forwardedProps"
14
+ :class="cn('relative h-2 w-full overflow-hidden rounded-full bg-primary/20', props.class)"
15
+ >
16
+ <ProgressIndicator
17
+ class="h-full w-full flex-1 bg-primary transition-all"
18
+ :style="{ transform: `translateX(-${100 - (modelValue ?? 0)}%)` }"
19
+ />
20
+ </ProgressRoot>
21
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Progress } from './Progress.vue'
@@ -0,0 +1,16 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { RadioGroupRoot, type RadioGroupRootEmits, type RadioGroupRootProps, useForwardPropsEmits } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<RadioGroupRootProps & { class?: HTMLAttributes['class'] }>()
7
+ const emits = defineEmits<RadioGroupRootEmits>()
8
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
9
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
10
+ </script>
11
+
12
+ <template>
13
+ <RadioGroupRoot v-bind="forwarded" :class="cn('grid gap-2', props.class)">
14
+ <slot />
15
+ </RadioGroupRoot>
16
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { RadioGroupIndicator, RadioGroupItem, type RadioGroupItemProps, useForwardProps } from 'radix-vue'
4
+ import { Circle } from 'lucide-vue-next'
5
+ import { cn } from '../lib/utils'
6
+
7
+ const props = defineProps<RadioGroupItemProps & { class?: HTMLAttributes['class'] }>()
8
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
9
+ const forwardedProps = useForwardProps(delegatedProps)
10
+ </script>
11
+
12
+ <template>
13
+ <RadioGroupItem
14
+ v-bind="forwardedProps"
15
+ :class="cn(
16
+ 'aspect-square h-4 w-4 rounded-full border border-primary text-primary shadow focus:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',
17
+ props.class,
18
+ )"
19
+ >
20
+ <RadioGroupIndicator class="flex items-center justify-center">
21
+ <Circle class="h-3.5 w-3.5 fill-primary" />
22
+ </RadioGroupIndicator>
23
+ </RadioGroupItem>
24
+ </template>
@@ -0,0 +1,2 @@
1
+ export { default as RadioGroup } from './RadioGroup.vue'
2
+ export { default as RadioGroupItem } from './RadioGroupItem.vue'
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { SelectRoot, type SelectRootEmits, type SelectRootProps, useForwardPropsEmits } from 'radix-vue'
3
+
4
+ const props = defineProps<SelectRootProps>()
5
+ const emits = defineEmits<SelectRootEmits>()
6
+ const forwarded = useForwardPropsEmits(props, emits)
7
+ </script>
8
+
9
+ <template>
10
+ <SelectRoot v-bind="forwarded">
11
+ <slot />
12
+ </SelectRoot>
13
+ </template>
@@ -0,0 +1,40 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import {
4
+ SelectContent,
5
+ type SelectContentEmits,
6
+ type SelectContentProps,
7
+ SelectPortal,
8
+ SelectViewport,
9
+ useForwardPropsEmits,
10
+ } from 'radix-vue'
11
+ import { cn } from '../lib/utils'
12
+
13
+ const props = withDefaults(
14
+ defineProps<SelectContentProps & { class?: HTMLAttributes['class'] }>(),
15
+ { position: 'popper' },
16
+ )
17
+ const emits = defineEmits<SelectContentEmits>()
18
+
19
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
20
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
21
+ </script>
22
+
23
+ <template>
24
+ <SelectPortal>
25
+ <SelectContent
26
+ v-bind="{ ...forwarded, ...$attrs }"
27
+ :class="cn(
28
+ 'relative z-50 max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
29
+ position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',
30
+ props.class,
31
+ )"
32
+ >
33
+ <SelectViewport
34
+ :class="cn('p-1', position === 'popper' && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]')"
35
+ >
36
+ <slot />
37
+ </SelectViewport>
38
+ </SelectContent>
39
+ </SelectPortal>
40
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { SelectGroup, type SelectGroupProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<SelectGroupProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <SelectGroup v-bind="forwardedProps" :class="cn('p-1 w-full', props.class)">
13
+ <slot />
14
+ </SelectGroup>
15
+ </template>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { SelectItem, SelectItemIndicator, type SelectItemProps, SelectItemText, useForwardProps } from 'radix-vue'
4
+ import { Check } from 'lucide-vue-next'
5
+ import { cn } from '../lib/utils'
6
+
7
+ const props = defineProps<SelectItemProps & { class?: HTMLAttributes['class'] }>()
8
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
9
+ const forwardedProps = useForwardProps(delegatedProps)
10
+ </script>
11
+
12
+ <template>
13
+ <SelectItem
14
+ v-bind="forwardedProps"
15
+ :class="cn(
16
+ 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
17
+ props.class,
18
+ )"
19
+ >
20
+ <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
21
+ <SelectItemIndicator>
22
+ <Check class="w-4 h-4" />
23
+ </SelectItemIndicator>
24
+ </span>
25
+
26
+ <SelectItemText>
27
+ <slot />
28
+ </SelectItemText>
29
+ </SelectItem>
30
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { SelectLabel, type SelectLabelProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<SelectLabelProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <SelectLabel v-bind="forwardedProps" :class="cn('px-2 py-1.5 text-sm font-semibold', props.class)">
13
+ <slot />
14
+ </SelectLabel>
15
+ </template>
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { SelectSeparator, type SelectSeparatorProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<SelectSeparatorProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <SelectSeparator v-bind="forwardedProps" :class="cn('-mx-1 my-1 h-px bg-muted', props.class)" />
13
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { SelectTrigger, type SelectTriggerProps, useForwardProps } from 'radix-vue'
4
+ import { ChevronDown } from 'lucide-vue-next'
5
+ import { cn } from '../lib/utils'
6
+
7
+ const props = defineProps<SelectTriggerProps & { class?: HTMLAttributes['class'] }>()
8
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
9
+ const forwardedProps = useForwardProps(delegatedProps)
10
+ </script>
11
+
12
+ <template>
13
+ <SelectTrigger
14
+ v-bind="forwardedProps"
15
+ :class="cn(
16
+ 'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',
17
+ props.class,
18
+ )"
19
+ >
20
+ <slot />
21
+ <ChevronDown class="w-4 h-4 opacity-50 shrink-0" />
22
+ </SelectTrigger>
23
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { SelectValue, type SelectValueProps } from 'radix-vue'
3
+
4
+ const props = defineProps<SelectValueProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <SelectValue v-bind="props">
9
+ <slot />
10
+ </SelectValue>
11
+ </template>
@@ -0,0 +1,8 @@
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 SelectLabel } from './SelectLabel.vue'
6
+ export { default as SelectSeparator } from './SelectSeparator.vue'
7
+ export { default as SelectTrigger } from './SelectTrigger.vue'
8
+ export { default as SelectValue } from './SelectValue.vue'
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { DialogRoot, type DialogRootEmits, type DialogRootProps, useForwardPropsEmits } from 'radix-vue'
3
+
4
+ const props = defineProps<DialogRootProps>()
5
+ const emits = defineEmits<DialogRootEmits>()
6
+ const forwarded = useForwardPropsEmits(props, emits)
7
+ </script>
8
+
9
+ <template>
10
+ <DialogRoot v-bind="forwarded">
11
+ <slot />
12
+ </DialogRoot>
13
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { DialogClose, type DialogCloseProps } from 'radix-vue'
3
+
4
+ const props = defineProps<DialogCloseProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <DialogClose v-bind="props">
9
+ <slot />
10
+ </DialogClose>
11
+ </template>