@reinvented/design 0.2.0 → 0.3.0

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 (185) hide show
  1. package/README.md +105 -0
  2. package/docs/components/alert-dialog.md +32 -0
  3. package/docs/components/avatar.md +14 -0
  4. package/docs/components/badge.md +24 -0
  5. package/docs/components/button.md +69 -0
  6. package/docs/components/card.md +49 -0
  7. package/docs/components/dialog.md +46 -0
  8. package/docs/components/dropdown-menu.md +32 -0
  9. package/docs/components/index.md +69 -50
  10. package/docs/components/input.md +34 -0
  11. package/docs/components/remaining-components.md +253 -0
  12. package/docs/components/scroll-area.md +17 -0
  13. package/docs/components/select.md +31 -0
  14. package/docs/components/separator.md +14 -0
  15. package/docs/components/sheet.md +32 -0
  16. package/docs/components/skeleton.md +20 -0
  17. package/docs/components/table.md +33 -0
  18. package/docs/components/tabs.md +23 -0
  19. package/docs/layouts/dashboard.md +70 -0
  20. package/docs/layouts/detail-page.md +83 -0
  21. package/docs/layouts/index.md +37 -24
  22. package/docs/layouts/list-page.md +107 -0
  23. package/docs/layouts/settings-page.md +79 -0
  24. package/docs/layouts/step-wizard.md +73 -0
  25. package/package.json +7 -3
  26. package/src/components/ui/accordion/Accordion.vue +13 -0
  27. package/src/components/ui/accordion/AccordionContent.vue +20 -0
  28. package/src/components/ui/accordion/AccordionItem.vue +15 -0
  29. package/src/components/ui/accordion/AccordionTrigger.vue +25 -0
  30. package/src/components/ui/accordion/index.ts +4 -0
  31. package/src/components/ui/alert/Alert.vue +38 -0
  32. package/src/components/ui/alert/AlertDescription.vue +12 -0
  33. package/src/components/ui/alert/AlertTitle.vue +12 -0
  34. package/src/components/ui/alert/index.ts +3 -0
  35. package/src/components/ui/alert-dialog/AlertDialog.vue +13 -0
  36. package/src/components/ui/alert-dialog/AlertDialogAction.vue +21 -0
  37. package/src/components/ui/alert-dialog/AlertDialogCancel.vue +21 -0
  38. package/src/components/ui/alert-dialog/AlertDialogContent.vue +39 -0
  39. package/src/components/ui/alert-dialog/AlertDialogDescription.vue +15 -0
  40. package/src/components/ui/alert-dialog/AlertDialogFooter.vue +12 -0
  41. package/src/components/ui/alert-dialog/AlertDialogHeader.vue +12 -0
  42. package/src/components/ui/alert-dialog/AlertDialogTitle.vue +15 -0
  43. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
  44. package/src/components/ui/alert-dialog/index.ts +9 -0
  45. package/src/components/ui/breadcrumb/Breadcrumb.vue +6 -0
  46. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +12 -0
  47. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +6 -0
  48. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +20 -0
  49. package/src/components/ui/breadcrumb/BreadcrumbList.vue +6 -0
  50. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +6 -0
  51. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +11 -0
  52. package/src/components/ui/breadcrumb/index.ts +7 -0
  53. package/src/components/ui/button/Button.vue +0 -1
  54. package/src/components/ui/checkbox/Checkbox.vue +25 -0
  55. package/src/components/ui/checkbox/index.ts +1 -0
  56. package/src/components/ui/collapsible/Collapsible.vue +13 -0
  57. package/src/components/ui/collapsible/index.ts +2 -0
  58. package/src/components/ui/command/Command.vue +16 -0
  59. package/src/components/ui/command/CommandEmpty.vue +5 -0
  60. package/src/components/ui/command/CommandGroup.vue +22 -0
  61. package/src/components/ui/command/CommandInput.vue +21 -0
  62. package/src/components/ui/command/CommandItem.vue +22 -0
  63. package/src/components/ui/command/CommandList.vue +17 -0
  64. package/src/components/ui/command/CommandSeparator.vue +5 -0
  65. package/src/components/ui/command/index.ts +7 -0
  66. package/src/components/ui/context-menu/ContextMenuContent.vue +24 -0
  67. package/src/components/ui/context-menu/ContextMenuItem.vue +16 -0
  68. package/src/components/ui/context-menu/ContextMenuLabel.vue +9 -0
  69. package/src/components/ui/context-menu/ContextMenuSeparator.vue +9 -0
  70. package/src/components/ui/context-menu/ContextMenuSubContent.vue +14 -0
  71. package/src/components/ui/context-menu/index.ts +9 -0
  72. package/src/components/ui/dialog/Dialog.vue +14 -0
  73. package/src/components/ui/dialog/DialogClose.vue +12 -0
  74. package/src/components/ui/dialog/DialogContent.vue +48 -0
  75. package/src/components/ui/dialog/DialogDescription.vue +23 -0
  76. package/src/components/ui/dialog/DialogFooter.vue +12 -0
  77. package/src/components/ui/dialog/DialogHeader.vue +12 -0
  78. package/src/components/ui/dialog/DialogScrollContent.vue +47 -0
  79. package/src/components/ui/dialog/DialogTitle.vue +23 -0
  80. package/src/components/ui/dialog/DialogTrigger.vue +12 -0
  81. package/src/components/ui/dialog/index.ts +9 -0
  82. package/src/components/ui/dropdown-menu/DropdownMenu.vue +13 -0
  83. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +28 -0
  84. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +33 -0
  85. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
  86. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +27 -0
  87. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  88. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +13 -0
  89. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +27 -0
  90. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +13 -0
  91. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +12 -0
  92. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +13 -0
  93. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -0
  94. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +23 -0
  95. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +11 -0
  96. package/src/components/ui/dropdown-menu/index.ts +14 -0
  97. package/src/components/ui/form/FormControl.vue +3 -0
  98. package/src/components/ui/form/FormDescription.vue +6 -0
  99. package/src/components/ui/form/FormItem.vue +6 -0
  100. package/src/components/ui/form/FormLabel.vue +10 -0
  101. package/src/components/ui/form/FormMessage.vue +10 -0
  102. package/src/components/ui/form/index.ts +9 -0
  103. package/src/components/ui/hover-card/HoverCard.vue +13 -0
  104. package/src/components/ui/hover-card/HoverCardContent.vue +26 -0
  105. package/src/components/ui/hover-card/HoverCardTrigger.vue +11 -0
  106. package/src/components/ui/hover-card/index.ts +3 -0
  107. package/src/components/ui/label/Label.vue +18 -0
  108. package/src/components/ui/label/index.ts +1 -0
  109. package/src/components/ui/menubar/MenubarContent.vue +15 -0
  110. package/src/components/ui/menubar/MenubarItem.vue +13 -0
  111. package/src/components/ui/menubar/MenubarTrigger.vue +13 -0
  112. package/src/components/ui/menubar/index.ts +5 -0
  113. package/src/components/ui/navigation-menu/NavigationMenuContent.vue +14 -0
  114. package/src/components/ui/navigation-menu/NavigationMenuTrigger.vue +15 -0
  115. package/src/components/ui/navigation-menu/index.ts +4 -0
  116. package/src/components/ui/pagination/PaginationContent.vue +13 -0
  117. package/src/components/ui/pagination/PaginationEllipsis.vue +12 -0
  118. package/src/components/ui/pagination/PaginationNext.vue +14 -0
  119. package/src/components/ui/pagination/PaginationPrev.vue +14 -0
  120. package/src/components/ui/pagination/index.ts +6 -0
  121. package/src/components/ui/popover/Popover.vue +13 -0
  122. package/src/components/ui/popover/PopoverContent.vue +27 -0
  123. package/src/components/ui/popover/PopoverTrigger.vue +11 -0
  124. package/src/components/ui/popover/index.ts +3 -0
  125. package/src/components/ui/progress/Progress.vue +21 -0
  126. package/src/components/ui/progress/index.ts +1 -0
  127. package/src/components/ui/radio-group/RadioGroup.vue +16 -0
  128. package/src/components/ui/radio-group/RadioGroupItem.vue +24 -0
  129. package/src/components/ui/radio-group/index.ts +2 -0
  130. package/src/components/ui/select/Select.vue +13 -0
  131. package/src/components/ui/select/SelectContent.vue +40 -0
  132. package/src/components/ui/select/SelectGroup.vue +15 -0
  133. package/src/components/ui/select/SelectItem.vue +30 -0
  134. package/src/components/ui/select/SelectLabel.vue +15 -0
  135. package/src/components/ui/select/SelectSeparator.vue +13 -0
  136. package/src/components/ui/select/SelectTrigger.vue +23 -0
  137. package/src/components/ui/select/SelectValue.vue +11 -0
  138. package/src/components/ui/select/index.ts +8 -0
  139. package/src/components/ui/sheet/Sheet.vue +13 -0
  140. package/src/components/ui/sheet/SheetClose.vue +11 -0
  141. package/src/components/ui/sheet/SheetContent.vue +65 -0
  142. package/src/components/ui/sheet/SheetDescription.vue +15 -0
  143. package/src/components/ui/sheet/SheetFooter.vue +12 -0
  144. package/src/components/ui/sheet/SheetHeader.vue +12 -0
  145. package/src/components/ui/sheet/SheetTitle.vue +15 -0
  146. package/src/components/ui/sheet/SheetTrigger.vue +11 -0
  147. package/src/components/ui/sheet/index.ts +8 -0
  148. package/src/components/ui/slider/Slider.vue +26 -0
  149. package/src/components/ui/slider/index.ts +1 -0
  150. package/src/components/ui/switch/Switch.vue +24 -0
  151. package/src/components/ui/switch/index.ts +1 -0
  152. package/src/components/ui/table/Table.vue +13 -0
  153. package/src/components/ui/table/TableBody.vue +6 -0
  154. package/src/components/ui/table/TableCaption.vue +6 -0
  155. package/src/components/ui/table/TableCell.vue +6 -0
  156. package/src/components/ui/table/TableFooter.vue +6 -0
  157. package/src/components/ui/table/TableHead.vue +6 -0
  158. package/src/components/ui/table/TableHeader.vue +6 -0
  159. package/src/components/ui/table/TableRow.vue +6 -0
  160. package/src/components/ui/table/index.ts +8 -0
  161. package/src/components/ui/tabs/Tabs.vue +13 -0
  162. package/src/components/ui/tabs/TabsContent.vue +21 -0
  163. package/src/components/ui/tabs/TabsList.vue +21 -0
  164. package/src/components/ui/tabs/TabsTrigger.vue +21 -0
  165. package/src/components/ui/tabs/index.ts +4 -0
  166. package/src/components/ui/textarea/Textarea.vue +29 -0
  167. package/src/components/ui/textarea/index.ts +1 -0
  168. package/src/components/ui/toggle/Toggle.vue +40 -0
  169. package/src/components/ui/toggle/index.ts +1 -0
  170. package/src/components/ui/toggle-group/ToggleGroup.vue +16 -0
  171. package/src/components/ui/toggle-group/ToggleGroupItem.vue +21 -0
  172. package/src/components/ui/toggle-group/index.ts +2 -0
  173. package/src/components/ui/tooltip/Tooltip.vue +13 -0
  174. package/src/components/ui/tooltip/TooltipContent.vue +27 -0
  175. package/src/components/ui/tooltip/TooltipProvider.vue +12 -0
  176. package/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
  177. package/src/components/ui/tooltip/index.ts +4 -0
  178. package/src/eslint/index.js +192 -0
  179. package/src/eslint/recommended.js +64 -0
  180. package/src/index.ts +46 -192
  181. package/src/patterns/DetailView.vue +2 -2
  182. package/src/patterns/EmptyState.vue +2 -2
  183. package/src/patterns/FormView.vue +2 -2
  184. package/src/patterns/ListView.vue +2 -2
  185. package/tsconfig.json +17 -3
@@ -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>
@@ -0,0 +1,65 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { cva, type VariantProps } from 'class-variance-authority'
4
+ import {
5
+ DialogClose,
6
+ DialogContent,
7
+ type DialogContentEmits,
8
+ type DialogContentProps,
9
+ DialogOverlay,
10
+ DialogPortal,
11
+ useForwardPropsEmits,
12
+ } from 'radix-vue'
13
+ import { X } from 'lucide-vue-next'
14
+ import { cn } from '../lib/utils'
15
+
16
+ const sheetVariants = cva(
17
+ 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out',
18
+ {
19
+ variants: {
20
+ side: {
21
+ top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
22
+ bottom: 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
23
+ left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',
24
+ right: 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',
25
+ },
26
+ },
27
+ defaultVariants: {
28
+ side: 'right',
29
+ },
30
+ },
31
+ )
32
+
33
+ type SheetVariants = VariantProps<typeof sheetVariants>
34
+
35
+ interface SheetContentProps extends DialogContentProps {
36
+ class?: HTMLAttributes['class']
37
+ side?: SheetVariants['side']
38
+ }
39
+
40
+ const props = withDefaults(defineProps<SheetContentProps>(), { side: 'right' })
41
+ const emits = defineEmits<DialogContentEmits>()
42
+ const delegatedProps = computed(() => { const { class: _, side: _s, ...d } = props; return d })
43
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
44
+ </script>
45
+
46
+ <template>
47
+ <DialogPortal>
48
+ <DialogOverlay
49
+ class="fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
50
+ />
51
+ <DialogContent
52
+ v-bind="forwarded"
53
+ :class="cn(sheetVariants({ side }), props.class)"
54
+ >
55
+ <slot />
56
+
57
+ <DialogClose
58
+ class="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary"
59
+ >
60
+ <X class="w-4 h-4" />
61
+ <span class="sr-only">Close</span>
62
+ </DialogClose>
63
+ </DialogContent>
64
+ </DialogPortal>
65
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { DialogDescription, type DialogDescriptionProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<DialogDescriptionProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <DialogDescription v-bind="forwardedProps" :class="cn('text-sm text-muted-foreground', props.class)">
13
+ <slot />
14
+ </DialogDescription>
15
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../lib/utils'
4
+
5
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>()
6
+ </script>
7
+
8
+ <template>
9
+ <div :class="cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2', props.class)">
10
+ <slot />
11
+ </div>
12
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../lib/utils'
4
+
5
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>()
6
+ </script>
7
+
8
+ <template>
9
+ <div :class="cn('flex flex-col gap-y-2 text-center sm:text-left', props.class)">
10
+ <slot />
11
+ </div>
12
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { DialogTitle, type DialogTitleProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<DialogTitleProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <DialogTitle v-bind="forwardedProps" :class="cn('text-lg font-semibold text-foreground', props.class)">
13
+ <slot />
14
+ </DialogTitle>
15
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { DialogTrigger, type DialogTriggerProps } from 'radix-vue'
3
+
4
+ const props = defineProps<DialogTriggerProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <DialogTrigger v-bind="props">
9
+ <slot />
10
+ </DialogTrigger>
11
+ </template>
@@ -0,0 +1,8 @@
1
+ export { default as Sheet } from './Sheet.vue'
2
+ export { default as SheetClose } from './SheetClose.vue'
3
+ export { default as SheetContent } from './SheetContent.vue'
4
+ export { default as SheetDescription } from './SheetDescription.vue'
5
+ export { default as SheetFooter } from './SheetFooter.vue'
6
+ export { default as SheetHeader } from './SheetHeader.vue'
7
+ export { default as SheetTitle } from './SheetTitle.vue'
8
+ export { default as SheetTrigger } from './SheetTrigger.vue'
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { SliderRange, SliderRoot, type SliderRootEmits, type SliderRootProps, SliderThumb, SliderTrack, useForwardPropsEmits } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<SliderRootProps & { class?: HTMLAttributes['class'] }>()
7
+ const emits = defineEmits<SliderRootEmits>()
8
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
9
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
10
+ </script>
11
+
12
+ <template>
13
+ <SliderRoot
14
+ v-bind="forwarded"
15
+ :class="cn('relative flex w-full touch-none select-none items-center', props.class)"
16
+ >
17
+ <SliderTrack class="relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20">
18
+ <SliderRange class="absolute h-full bg-primary" />
19
+ </SliderTrack>
20
+ <SliderThumb
21
+ v-for="(_, i) in (modelValue || [0])"
22
+ :key="i"
23
+ class="block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"
24
+ />
25
+ </SliderRoot>
26
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Slider } from './Slider.vue'
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { SwitchRoot, type SwitchRootEmits, type SwitchRootProps, SwitchThumb, useForwardPropsEmits } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<SwitchRootProps & { class?: HTMLAttributes['class'] }>()
7
+ const emits = defineEmits<SwitchRootEmits>()
8
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
9
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
10
+ </script>
11
+
12
+ <template>
13
+ <SwitchRoot
14
+ v-bind="forwarded"
15
+ :class="cn(
16
+ 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',
17
+ props.class,
18
+ )"
19
+ >
20
+ <SwitchThumb
21
+ class="pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0"
22
+ />
23
+ </SwitchRoot>
24
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Switch } from './Switch.vue'
@@ -0,0 +1,13 @@
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
+
7
+ <template>
8
+ <div class="relative w-full overflow-auto">
9
+ <table :class="cn('w-full caption-bottom text-sm', props.class)">
10
+ <slot />
11
+ </table>
12
+ </div>
13
+ </template>
@@ -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><tbody :class="cn('[&_tr:last-child]:border-0', props.class)"><slot /></tbody></template>
@@ -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><caption :class="cn('mt-4 text-sm text-muted-foreground', props.class)"><slot /></caption></template>
@@ -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><td :class="cn('p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-0.5', props.class)"><slot /></td></template>
@@ -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><tfoot :class="cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', props.class)"><slot /></tfoot></template>
@@ -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><th :class="cn('h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-0.5', props.class)"><slot /></th></template>
@@ -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><thead :class="cn('[&_tr]:border-b', props.class)"><slot /></thead></template>
@@ -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><tr :class="cn('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted', props.class)"><slot /></tr></template>
@@ -0,0 +1,8 @@
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 TableFooter } from './TableFooter.vue'
6
+ export { default as TableHead } from './TableHead.vue'
7
+ export { default as TableHeader } from './TableHeader.vue'
8
+ export { default as TableRow } from './TableRow.vue'
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { TabsRoot, type TabsRootEmits, type TabsRootProps, useForwardPropsEmits } from 'radix-vue'
3
+
4
+ const props = defineProps<TabsRootProps>()
5
+ const emits = defineEmits<TabsRootEmits>()
6
+ const forwarded = useForwardPropsEmits(props, emits)
7
+ </script>
8
+
9
+ <template>
10
+ <TabsRoot v-bind="forwarded">
11
+ <slot />
12
+ </TabsRoot>
13
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TabsContent, type TabsContentProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<TabsContentProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <TabsContent
13
+ v-bind="forwardedProps"
14
+ :class="cn(
15
+ 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
16
+ props.class,
17
+ )"
18
+ >
19
+ <slot />
20
+ </TabsContent>
21
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TabsList, type TabsListProps, useForwardProps } from 'radix-vue'
4
+ import { cn } from '../lib/utils'
5
+
6
+ const props = defineProps<TabsListProps & { class?: HTMLAttributes['class'] }>()
7
+ const delegatedProps = computed(() => { const { class: _, ...d } = props; return d })
8
+ const forwardedProps = useForwardProps(delegatedProps)
9
+ </script>
10
+
11
+ <template>
12
+ <TabsList
13
+ v-bind="forwardedProps"
14
+ :class="cn(
15
+ 'inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',
16
+ props.class,
17
+ )"
18
+ >
19
+ <slot />
20
+ </TabsList>
21
+ </template>