@personizely/ui 0.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.
Files changed (221) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +1 -0
  3. package/dist/personizely-ui.css +6 -0
  4. package/dist/personizely-ui.js +26854 -0
  5. package/dist/personizely-ui.umd.cjs +111 -0
  6. package/package.json +117 -0
  7. package/src/assets/index.css +136 -0
  8. package/src/components/ui/accordion/Accordion.vue +19 -0
  9. package/src/components/ui/accordion/AccordionContent.vue +24 -0
  10. package/src/components/ui/accordion/AccordionItem.vue +37 -0
  11. package/src/components/ui/accordion/AccordionTrigger.vue +39 -0
  12. package/src/components/ui/accordion/index.ts +2 -0
  13. package/src/components/ui/alert/Alert.vue +68 -0
  14. package/src/components/ui/alert/index.ts +22 -0
  15. package/src/components/ui/alert-dialog/AlertDialog.vue +66 -0
  16. package/src/components/ui/alert-dialog/AlertDialogContent.vue +44 -0
  17. package/src/components/ui/alert-dialog/AlertDialogProvider.vue +27 -0
  18. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
  19. package/src/components/ui/alert-dialog/index.ts +3 -0
  20. package/src/components/ui/alert-dialog/useAlertDialog.ts +19 -0
  21. package/src/components/ui/autocomplete/Autocomplete.vue +170 -0
  22. package/src/components/ui/autocomplete/AutocompleteContent.vue +27 -0
  23. package/src/components/ui/autocomplete/AutocompleteEmpty.vue +20 -0
  24. package/src/components/ui/autocomplete/AutocompleteGroup.vue +29 -0
  25. package/src/components/ui/autocomplete/AutocompleteItem.vue +26 -0
  26. package/src/components/ui/autocomplete/AutocompleteRoot.vue +31 -0
  27. package/src/components/ui/autocomplete/AutocompleteSeparator.vue +23 -0
  28. package/src/components/ui/autocomplete/index.ts +1 -0
  29. package/src/components/ui/avatar/Avatar.vue +31 -0
  30. package/src/components/ui/avatar/AvatarFallback.vue +11 -0
  31. package/src/components/ui/avatar/AvatarImage.vue +9 -0
  32. package/src/components/ui/avatar/index.ts +19 -0
  33. package/src/components/ui/badge/Badge.vue +16 -0
  34. package/src/components/ui/badge/index.ts +22 -0
  35. package/src/components/ui/button/Button.vue +123 -0
  36. package/src/components/ui/button/index.ts +78 -0
  37. package/src/components/ui/calendar/Calendar.vue +76 -0
  38. package/src/components/ui/calendar/CalendarCell.vue +24 -0
  39. package/src/components/ui/calendar/CalendarCellTrigger.vue +38 -0
  40. package/src/components/ui/calendar/CalendarGrid.vue +24 -0
  41. package/src/components/ui/calendar/CalendarGridBody.vue +11 -0
  42. package/src/components/ui/calendar/CalendarGridHead.vue +11 -0
  43. package/src/components/ui/calendar/CalendarGridRow.vue +21 -0
  44. package/src/components/ui/calendar/CalendarHeadCell.vue +21 -0
  45. package/src/components/ui/calendar/CalendarHeader.vue +21 -0
  46. package/src/components/ui/calendar/CalendarHeading.vue +27 -0
  47. package/src/components/ui/calendar/CalendarNextButton.vue +32 -0
  48. package/src/components/ui/calendar/CalendarPrevButton.vue +32 -0
  49. package/src/components/ui/calendar/index.ts +1 -0
  50. package/src/components/ui/card/Card.vue +57 -0
  51. package/src/components/ui/card/CardContent.vue +14 -0
  52. package/src/components/ui/card/CardDescription.vue +14 -0
  53. package/src/components/ui/card/CardFooter.vue +14 -0
  54. package/src/components/ui/card/CardHeader.vue +14 -0
  55. package/src/components/ui/card/CardTitle.vue +18 -0
  56. package/src/components/ui/card/CardTray.vue +14 -0
  57. package/src/components/ui/card/index.ts +1 -0
  58. package/src/components/ui/checkbox/Checkbox.vue +63 -0
  59. package/src/components/ui/checkbox/CheckboxBase.vue +39 -0
  60. package/src/components/ui/checkbox/index.ts +1 -0
  61. package/src/components/ui/checkbox-group/CheckboxGroup.vue +65 -0
  62. package/src/components/ui/checkbox-group/index.ts +15 -0
  63. package/src/components/ui/color-picker/Alpha.vue +63 -0
  64. package/src/components/ui/color-picker/Angle.vue +145 -0
  65. package/src/components/ui/color-picker/Checkboard.vue +43 -0
  66. package/src/components/ui/color-picker/Color.vue +255 -0
  67. package/src/components/ui/color-picker/ColorPicker.vue +25 -0
  68. package/src/components/ui/color-picker/Gradient.vue +172 -0
  69. package/src/components/ui/color-picker/Handle.vue +19 -0
  70. package/src/components/ui/color-picker/Hue.vue +80 -0
  71. package/src/components/ui/color-picker/LabelInput.vue +16 -0
  72. package/src/components/ui/color-picker/Rail.vue +100 -0
  73. package/src/components/ui/color-picker/Saturation.vue +142 -0
  74. package/src/components/ui/color-picker/index.ts +4 -0
  75. package/src/components/ui/combobox/Combobox.vue +202 -0
  76. package/src/components/ui/combobox/ComboboxContent.vue +27 -0
  77. package/src/components/ui/combobox/ComboboxEmpty.vue +20 -0
  78. package/src/components/ui/combobox/ComboboxGroup.vue +29 -0
  79. package/src/components/ui/combobox/ComboboxInput.vue +52 -0
  80. package/src/components/ui/combobox/ComboboxItem.vue +26 -0
  81. package/src/components/ui/combobox/ComboboxRoot.vue +31 -0
  82. package/src/components/ui/combobox/ComboboxSeparator.vue +23 -0
  83. package/src/components/ui/combobox/index.ts +1 -0
  84. package/src/components/ui/date-picker/DatePicker.vue +55 -0
  85. package/src/components/ui/date-picker/index.ts +1 -0
  86. package/src/components/ui/date-range-picker/DateRangePicker.vue +137 -0
  87. package/src/components/ui/date-range-picker/index.ts +1 -0
  88. package/src/components/ui/dialog/Dialog.vue +78 -0
  89. package/src/components/ui/dialog/DialogContent.vue +46 -0
  90. package/src/components/ui/dialog/DialogDescription.vue +24 -0
  91. package/src/components/ui/dialog/DialogFooter.vue +19 -0
  92. package/src/components/ui/dialog/DialogHeader.vue +16 -0
  93. package/src/components/ui/dialog/DialogTitle.vue +29 -0
  94. package/src/components/ui/dialog/DialogTrigger.vue +11 -0
  95. package/src/components/ui/dialog/index.ts +1 -0
  96. package/src/components/ui/drawer/Drawer.vue +88 -0
  97. package/src/components/ui/drawer/DrawerContent.vue +57 -0
  98. package/src/components/ui/drawer/DrawerDescription.vue +22 -0
  99. package/src/components/ui/drawer/DrawerFooter.vue +19 -0
  100. package/src/components/ui/drawer/DrawerHeader.vue +16 -0
  101. package/src/components/ui/drawer/DrawerTitle.vue +22 -0
  102. package/src/components/ui/drawer/DrawerTrigger.vue +11 -0
  103. package/src/components/ui/drawer/index.ts +21 -0
  104. package/src/components/ui/dropdown-menu/DropdownCheckboxGroupMenu.vue +87 -0
  105. package/src/components/ui/dropdown-menu/DropdownMenu.vue +72 -0
  106. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
  107. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +37 -0
  108. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
  109. package/src/components/ui/dropdown-menu/DropdownMenuHelp.vue +14 -0
  110. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +28 -0
  111. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +24 -0
  112. package/src/components/ui/dropdown-menu/DropdownMenuPart.vue +64 -0
  113. package/src/components/ui/dropdown-menu/DropdownMenuPartItem.vue +76 -0
  114. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
  115. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +41 -0
  116. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +22 -0
  117. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  118. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
  119. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +30 -0
  120. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +33 -0
  121. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
  122. package/src/components/ui/dropdown-menu/DropdownRadioGroupMenu.vue +75 -0
  123. package/src/components/ui/dropdown-menu/index.ts +36 -0
  124. package/src/components/ui/file-upload-button/FileUploadButton.vue +55 -0
  125. package/src/components/ui/file-upload-button/index.ts +1 -0
  126. package/src/components/ui/form/Form.vue +13 -0
  127. package/src/components/ui/form/FormControl.vue +16 -0
  128. package/src/components/ui/form/FormDescription.vue +20 -0
  129. package/src/components/ui/form/FormField.vue +61 -0
  130. package/src/components/ui/form/FormLabel.vue +23 -0
  131. package/src/components/ui/form/FormMessage.vue +16 -0
  132. package/src/components/ui/form/index.ts +2 -0
  133. package/src/components/ui/form/useFormField.ts +30 -0
  134. package/src/components/ui/icon/Icon.vue +16 -0
  135. package/src/components/ui/icon/index.ts +1 -0
  136. package/src/components/ui/input/Input.vue +51 -0
  137. package/src/components/ui/input/InputBase.vue +18 -0
  138. package/src/components/ui/input/index.ts +1 -0
  139. package/src/components/ui/label/Label.vue +27 -0
  140. package/src/components/ui/label/index.ts +1 -0
  141. package/src/components/ui/pagination/Pagination.vue +50 -0
  142. package/src/components/ui/pagination/PaginationContent.vue +21 -0
  143. package/src/components/ui/pagination/PaginationEllipsis.vue +24 -0
  144. package/src/components/ui/pagination/PaginationFirst.vue +32 -0
  145. package/src/components/ui/pagination/PaginationItem.vue +32 -0
  146. package/src/components/ui/pagination/PaginationLast.vue +32 -0
  147. package/src/components/ui/pagination/PaginationNext.vue +32 -0
  148. package/src/components/ui/pagination/PaginationPrevious.vue +32 -0
  149. package/src/components/ui/pagination/index.ts +1 -0
  150. package/src/components/ui/popover/Popover.vue +57 -0
  151. package/src/components/ui/popover/PopoverTrigger.vue +15 -0
  152. package/src/components/ui/popover/index.ts +1 -0
  153. package/src/components/ui/progress/Progress.vue +35 -0
  154. package/src/components/ui/progress/ProgressIndicator.vue +19 -0
  155. package/src/components/ui/progress/index.ts +2 -0
  156. package/src/components/ui/progress-circular/ProgressCircular.vue +85 -0
  157. package/src/components/ui/progress-circular/index.ts +1 -0
  158. package/src/components/ui/radio-group/RadioGroup.vue +81 -0
  159. package/src/components/ui/radio-group/RadioGroupItem.vue +39 -0
  160. package/src/components/ui/radio-group/index.ts +15 -0
  161. package/src/components/ui/range-calendar/RangeCalendar.vue +71 -0
  162. package/src/components/ui/range-calendar/RangeCalendarCell.vue +28 -0
  163. package/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue +40 -0
  164. package/src/components/ui/range-calendar/RangeCalendarGrid.vue +24 -0
  165. package/src/components/ui/range-calendar/RangeCalendarGridBody.vue +11 -0
  166. package/src/components/ui/range-calendar/RangeCalendarGridHead.vue +11 -0
  167. package/src/components/ui/range-calendar/RangeCalendarGridRow.vue +21 -0
  168. package/src/components/ui/range-calendar/RangeCalendarHeadCell.vue +21 -0
  169. package/src/components/ui/range-calendar/RangeCalendarHeader.vue +21 -0
  170. package/src/components/ui/range-calendar/RangeCalendarHeading.vue +27 -0
  171. package/src/components/ui/range-calendar/RangeCalendarNextButton.vue +32 -0
  172. package/src/components/ui/range-calendar/RangeCalendarPrevButton.vue +32 -0
  173. package/src/components/ui/range-calendar/index.ts +1 -0
  174. package/src/components/ui/select/Select.vue +120 -0
  175. package/src/components/ui/select/SelectContent.vue +45 -0
  176. package/src/components/ui/select/SelectGroup.vue +19 -0
  177. package/src/components/ui/select/SelectItem.vue +43 -0
  178. package/src/components/ui/select/SelectLabel.vue +13 -0
  179. package/src/components/ui/select/SelectSeparator.vue +17 -0
  180. package/src/components/ui/select/SelectTrigger.vue +31 -0
  181. package/src/components/ui/select/SelectValue.vue +11 -0
  182. package/src/components/ui/select/index.ts +1 -0
  183. package/src/components/ui/slider/Slider.vue +100 -0
  184. package/src/components/ui/slider/index.ts +1 -0
  185. package/src/components/ui/switch/Switch.vue +40 -0
  186. package/src/components/ui/switch/SwitchBase.vue +36 -0
  187. package/src/components/ui/switch/index.ts +1 -0
  188. package/src/components/ui/tabs/Tabs.vue +63 -0
  189. package/src/components/ui/tabs/TabsContent.vue +26 -0
  190. package/src/components/ui/tabs/TabsTrigger.vue +27 -0
  191. package/src/components/ui/tabs/index.ts +28 -0
  192. package/src/components/ui/textarea/Textarea.vue +13 -0
  193. package/src/components/ui/textarea/index.ts +1 -0
  194. package/src/components/ui/toast/Toast.vue +28 -0
  195. package/src/components/ui/toast/ToastAction.vue +26 -0
  196. package/src/components/ui/toast/ToastClose.vue +29 -0
  197. package/src/components/ui/toast/ToastDescription.vue +19 -0
  198. package/src/components/ui/toast/ToastProvider.vue +11 -0
  199. package/src/components/ui/toast/ToastTitle.vue +19 -0
  200. package/src/components/ui/toast/ToastViewport.vue +17 -0
  201. package/src/components/ui/toast/Toaster.vue +30 -0
  202. package/src/components/ui/toast/index.ts +34 -0
  203. package/src/components/ui/toast/useToast.ts +163 -0
  204. package/src/components/ui/toggle/Toggle.vue +51 -0
  205. package/src/components/ui/toggle/index.ts +71 -0
  206. package/src/components/ui/toggle-group/ToggleGroup.vue +58 -0
  207. package/src/components/ui/toggle-group/ToggleGroupItem.vue +54 -0
  208. package/src/components/ui/toggle-group/index.ts +1 -0
  209. package/src/components/ui/tooltip/Tooltip.vue +42 -0
  210. package/src/components/ui/tooltip/TooltipProvider.vue +11 -0
  211. package/src/components/ui/tooltip/index.ts +2 -0
  212. package/src/composables/delegated-props.ts +6 -0
  213. package/src/composables/emits-as-props.ts +17 -0
  214. package/src/composables/forward-props-emits.ts +11 -0
  215. package/src/directives/autofocus.ts +7 -0
  216. package/src/index.ts +159 -0
  217. package/src/options-provider.ts +19 -0
  218. package/src/utils/gradient.ts +158 -0
  219. package/src/utils/options.ts +40 -0
  220. package/src/utils/tailwind.ts +14 -0
  221. package/web-types.json +10560 -0
@@ -0,0 +1,78 @@
1
+ <template>
2
+ <DialogRoot v-bind="forwarded">
3
+ <DialogTrigger v-if="$slots.trigger" as-child>
4
+ <slot name="trigger" />
5
+ </DialogTrigger>
6
+
7
+ <DialogContent :class="props.class" @hide="$emit('hide')">
8
+ <DialogHeader>
9
+ <DialogTitle v-if="title || $slots.title">
10
+ <slot name="title">
11
+ {{ title }}
12
+ </slot>
13
+ </DialogTitle>
14
+ <DialogDescription v-if="description || $slots.description">
15
+ <slot name="description">
16
+ {{ description }}
17
+ </slot>
18
+ </DialogDescription>
19
+ </DialogHeader>
20
+
21
+ <div v-if="$slots.default" class="text-sm overflow-auto p-2">
22
+ <slot />
23
+ </div>
24
+
25
+ <DialogFooter v-if="$slots.footer">
26
+ <slot name="footer" />
27
+ </DialogFooter>
28
+
29
+ <DialogClose
30
+ v-if="!removeCloseButton"
31
+ as-child
32
+ class="absolute right-4 top-4"
33
+ >
34
+ <Button
35
+ size="sm"
36
+ icon="x"
37
+ variant="ghost"
38
+ />
39
+ </DialogClose>
40
+ </DialogContent>
41
+ </DialogRoot>
42
+ </template>
43
+
44
+ <script setup lang="ts">
45
+ import {
46
+ DialogClose,
47
+ DialogRoot,
48
+ type DialogRootEmits,
49
+ type DialogRootProps
50
+ } from 'reka-ui'
51
+ import { Button } from '@/components/ui/button'
52
+ import DialogTrigger from './DialogTrigger.vue'
53
+ import DialogHeader from './DialogHeader.vue'
54
+ import DialogTitle from './DialogTitle.vue'
55
+ import DialogDescription from './DialogDescription.vue'
56
+ import DialogContent from './DialogContent.vue'
57
+ import DialogFooter from './DialogFooter.vue'
58
+ import type { HTMLAttributes } from 'vue'
59
+ import { useDelegatedProps } from '@/composables/delegated-props'
60
+ import { useEmitAsProps } from '@/composables/emits-as-props'
61
+ import { useForwardPropsEmits } from '@/composables/forward-props-emits'
62
+
63
+ const props = withDefaults(defineProps<DialogRootProps & {
64
+ class?: HTMLAttributes['class'],
65
+ title?: string,
66
+ description?: string,
67
+ removeCloseButton?: boolean
68
+ }>(), {
69
+ removeCloseButton: false
70
+ })
71
+ const emits = defineEmits<DialogRootEmits & {
72
+ hide: []
73
+ }>()
74
+
75
+ const delegatedProps = useDelegatedProps(props, ['class', 'title', 'description', 'removeCloseButton'])
76
+ const delegatedEmits = useEmitAsProps(emits, ['hide'])
77
+ const forwarded = useForwardPropsEmits(delegatedProps, delegatedEmits)
78
+ </script>
@@ -0,0 +1,46 @@
1
+ <template>
2
+ <DialogPortal :to="options.portalTo">
3
+ <DialogOverlay
4
+ 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"
5
+ @after-leave="$emit('hide')"
6
+ />
7
+ <DialogContent
8
+ v-bind="forwarded"
9
+ :class="
10
+ cn(
11
+ 'fixed left-[50%] top-[50%] z-50 flex w-full max-h-[90dvh] max-w-xl flex-col gap-4 transform-[translate(-50%,-50%)] border bg-background p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=open]:slide-in-from-left-1/2 data-[state=closed]:slide-out-to-top-1/2 data-[state=open]:slide-in-from-top-1/2 sm:rounded-lg',
12
+ props.class,
13
+ )"
14
+ >
15
+ <slot />
16
+ </DialogContent>
17
+ </DialogPortal>
18
+ </template>
19
+
20
+ <script setup lang="ts">
21
+ import { type HTMLAttributes, computed } from 'vue'
22
+ import {
23
+ DialogContent,
24
+ type DialogContentEmits,
25
+ type DialogContentProps,
26
+ DialogOverlay,
27
+ DialogPortal,
28
+ useForwardPropsEmits
29
+ } from 'reka-ui'
30
+ import { cn } from '@/utils/tailwind'
31
+ import { getOptions } from '@/options-provider'
32
+
33
+ const props = defineProps<DialogContentProps & { class?: HTMLAttributes['class'] }>()
34
+ const emits = defineEmits<DialogContentEmits & {
35
+ hide: []
36
+ }>()
37
+ const options = getOptions()
38
+
39
+ const delegatedProps = computed(() => {
40
+ const { class: _, ...delegated } = props
41
+
42
+ return delegated
43
+ })
44
+
45
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
46
+ </script>
@@ -0,0 +1,24 @@
1
+ <template>
2
+ <DialogDescription
3
+ v-bind="forwardedProps"
4
+ :class="cn('text-sm text-muted-foreground', props.class)"
5
+ >
6
+ <slot />
7
+ </DialogDescription>
8
+ </template>
9
+
10
+ <script setup lang="ts">
11
+ import { type HTMLAttributes, computed } from 'vue'
12
+ import { DialogDescription, type DialogDescriptionProps, useForwardProps } from 'reka-ui'
13
+ import { cn } from '@/utils/tailwind'
14
+
15
+ const props = defineProps<DialogDescriptionProps & { class?: HTMLAttributes['class'] }>()
16
+
17
+ const delegatedProps = computed(() => {
18
+ const { class: _, ...delegated } = props
19
+
20
+ return delegated
21
+ })
22
+
23
+ const forwardedProps = useForwardProps(delegatedProps)
24
+ </script>
@@ -0,0 +1,19 @@
1
+ <template>
2
+ <div
3
+ :class="
4
+ cn(
5
+ 'flex flex-col-reverse p-2 sm:flex-row sm:justify-end sm:gap-x-2',
6
+ props.class,
7
+ )
8
+ "
9
+ >
10
+ <slot />
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import type { HTMLAttributes } from 'vue'
16
+ import { cn } from '@/utils/tailwind'
17
+
18
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>()
19
+ </script>
@@ -0,0 +1,16 @@
1
+ <template>
2
+ <div
3
+ :class="cn('flex flex-col gap-y-1.5 p-2 text-center sm:text-left', props.class)"
4
+ >
5
+ <slot />
6
+ </div>
7
+ </template>
8
+
9
+ <script setup lang="ts">
10
+ import type { HTMLAttributes } from 'vue'
11
+ import { cn } from '@/utils/tailwind'
12
+
13
+ const props = defineProps<{
14
+ class?: HTMLAttributes['class']
15
+ }>()
16
+ </script>
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <DialogTitle
3
+ v-bind="forwardedProps"
4
+ :class="
5
+ cn(
6
+ 'text-lg font-medium leading-none tracking-tight',
7
+ props.class,
8
+ )
9
+ "
10
+ >
11
+ <slot />
12
+ </DialogTitle>
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ import { type HTMLAttributes, computed } from 'vue'
17
+ import { DialogTitle, type DialogTitleProps, useForwardProps } from 'reka-ui'
18
+ import { cn } from '@/utils/tailwind'
19
+
20
+ const props = defineProps<DialogTitleProps & { class?: HTMLAttributes['class'] }>()
21
+
22
+ const delegatedProps = computed(() => {
23
+ const { class: _, ...delegated } = props
24
+
25
+ return delegated
26
+ })
27
+
28
+ const forwardedProps = useForwardProps(delegatedProps)
29
+ </script>
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <DialogTrigger v-bind="props">
3
+ <slot />
4
+ </DialogTrigger>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { DialogTrigger, type DialogTriggerProps } from 'reka-ui'
9
+
10
+ const props = defineProps<DialogTriggerProps>()
11
+ </script>
@@ -0,0 +1 @@
1
+ export { default as Dialog } from './Dialog.vue'
@@ -0,0 +1,88 @@
1
+ <template>
2
+ <DialogRoot v-bind="forwarded">
3
+ <DrawerTrigger v-if="$slots.trigger" as-child>
4
+ <slot name="trigger" />
5
+ </DrawerTrigger>
6
+
7
+ <DrawerContent
8
+ :side="side"
9
+ :class="props.class"
10
+ :disable-overlay="disableOverlay"
11
+ :disable-outside-pointer-events="disableOutsidePointerEvents"
12
+ @hide="$emit('hide')"
13
+ >
14
+ <DrawerHeader v-if="$slots.header || $slots.title || title">
15
+ <slot name="header">
16
+ <DrawerTitle
17
+ v-if="$slots.title || title"
18
+ >
19
+ <slot name="title">
20
+ {{ title }}
21
+ </slot>
22
+ </DrawerTitle>
23
+
24
+ <DrawerDescription
25
+ v-if="$slots.description || description"
26
+ >
27
+ <slot name="description">
28
+ {{ description }}
29
+ </slot>
30
+ </DrawerDescription>
31
+ </slot>
32
+ </DrawerHeader>
33
+
34
+ <div class="text-sm max-h-[90dvh] overflow-auto px-6 py-1">
35
+ <slot />
36
+ </div>
37
+
38
+ <DrawerFooter v-if="$slots.footer">
39
+ <slot name="footer" />
40
+ </DrawerFooter>
41
+
42
+ <DialogClose as-child class="absolute right-4 top-4">
43
+ <Button icon="x" variant="ghost" size="sm" />
44
+ </DialogClose>
45
+ </DrawerContent>
46
+ </DialogRoot>
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import {
51
+ DialogClose,
52
+ DialogRoot,
53
+ type DialogRootEmits,
54
+ type DialogRootProps
55
+ } from 'reka-ui'
56
+ import { Button } from '@/components/ui/button'
57
+ import type { HTMLAttributes } from 'vue'
58
+ import DrawerTrigger from './DrawerTrigger.vue'
59
+ import DrawerContent from './DrawerContent.vue'
60
+ import DrawerHeader from './DrawerHeader.vue'
61
+ import DrawerFooter from './DrawerFooter.vue'
62
+ import DrawerTitle from './DrawerTitle.vue'
63
+ import DrawerDescription from './DrawerDescription.vue'
64
+ import { type DrawerVariants } from './'
65
+ import { useDelegatedProps } from '@/composables/delegated-props'
66
+ import { useEmitAsProps } from '@/composables/emits-as-props'
67
+ import { useForwardPropsEmits } from '@/composables/forward-props-emits'
68
+
69
+ const props = withDefaults(defineProps<DialogRootProps & {
70
+ class?: HTMLAttributes['class']
71
+ title?: string
72
+ side?: DrawerVariants['side']
73
+ description?: string
74
+ disableOverlay?: boolean
75
+ disableOutsidePointerEvents?: boolean
76
+ }>(), {
77
+ side: 'right',
78
+ disableOverlay: false,
79
+ disableOutsidePointerEvents: true
80
+ })
81
+ const emits = defineEmits<DialogRootEmits & {
82
+ hide: []
83
+ }>()
84
+
85
+ const delegatedProps = useDelegatedProps(props, ['class', 'title', 'side', 'description', 'disableOverlay', 'disableOutsidePointerEvents'])
86
+ const delegatedEmits = useEmitAsProps(emits, ['hide'])
87
+ const forwarded = useForwardPropsEmits(delegatedProps, delegatedEmits)
88
+ </script>
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <DialogPortal :to="options.portalTo">
3
+ <DialogOverlay
4
+ v-if="!disableOverlay"
5
+ class="fixed inset-0 z-50 bg-black/80 ata-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
6
+ @after-leave="$emit('hide')"
7
+ />
8
+ <DialogContent
9
+ :class="cn(drawerVariants({ side }), props.class)"
10
+ v-bind="{ ...forwarded, ...$attrs }"
11
+ >
12
+ <slot />
13
+ </DialogContent>
14
+ </DialogPortal>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { type HTMLAttributes, computed } from 'vue'
19
+ import {
20
+ DialogContent,
21
+ type DialogContentEmits,
22
+ type DialogContentProps,
23
+ DialogOverlay,
24
+ DialogPortal,
25
+ useForwardPropsEmits
26
+ } from 'reka-ui'
27
+ import { type DrawerVariants, drawerVariants } from '.'
28
+ import { cn } from '@/utils/tailwind'
29
+ import { getOptions } from '@/options-provider'
30
+
31
+ interface SheetContentProps extends DialogContentProps {
32
+ class?: HTMLAttributes['class']
33
+ side?: DrawerVariants['side']
34
+ disableOverlay?: boolean
35
+ }
36
+
37
+ defineOptions({
38
+ inheritAttrs: false
39
+ })
40
+
41
+ const props = withDefaults(defineProps<SheetContentProps>(), {
42
+ disableOverlay: false
43
+ })
44
+
45
+ const emits = defineEmits<DialogContentEmits & {
46
+ hide: []
47
+ }>()
48
+
49
+ const delegatedProps = computed(() => {
50
+ const { class: _, side: _side, disableOverlay: _disableOverlay, ...delegated } = props
51
+
52
+ return delegated
53
+ })
54
+
55
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
56
+ const options = getOptions()
57
+ </script>
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <DialogDescription
3
+ :class="cn('text-sm text-muted-foreground', props.class)"
4
+ v-bind="delegatedProps"
5
+ >
6
+ <slot />
7
+ </DialogDescription>
8
+ </template>
9
+
10
+ <script setup lang="ts">
11
+ import { type HTMLAttributes, computed } from 'vue'
12
+ import { DialogDescription, type DialogDescriptionProps } from 'reka-ui'
13
+ import { cn } from '@/utils/tailwind'
14
+
15
+ const props = defineProps<DialogDescriptionProps & { class?: HTMLAttributes['class'] }>()
16
+
17
+ const delegatedProps = computed(() => {
18
+ const { class: _, ...delegated } = props
19
+
20
+ return delegated
21
+ })
22
+ </script>
@@ -0,0 +1,19 @@
1
+ <template>
2
+ <div
3
+ :class="
4
+ cn(
5
+ 'flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2 px-6',
6
+ props.class,
7
+ )
8
+ "
9
+ >
10
+ <slot />
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import type { HTMLAttributes } from 'vue'
16
+ import { cn } from '@/utils/tailwind'
17
+
18
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>()
19
+ </script>
@@ -0,0 +1,16 @@
1
+ <template>
2
+ <div
3
+ :class="
4
+ cn('flex flex-col gap-y-2 text-center px-6 sm:text-left', props.class)
5
+ "
6
+ >
7
+ <slot />
8
+ </div>
9
+ </template>
10
+
11
+ <script setup lang="ts">
12
+ import type { HTMLAttributes } from 'vue'
13
+ import { cn } from '@/utils/tailwind'
14
+
15
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>()
16
+ </script>
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <DialogTitle
3
+ :class="cn('text-lg font-medium text-foreground', props.class)"
4
+ v-bind="delegatedProps"
5
+ >
6
+ <slot />
7
+ </DialogTitle>
8
+ </template>
9
+
10
+ <script setup lang="ts">
11
+ import { type HTMLAttributes, computed } from 'vue'
12
+ import { DialogTitle, type DialogTitleProps } from 'reka-ui'
13
+ import { cn } from '@/utils/tailwind'
14
+
15
+ const props = defineProps<DialogTitleProps & { class?: HTMLAttributes['class'] }>()
16
+
17
+ const delegatedProps = computed(() => {
18
+ const { class: _, ...delegated } = props
19
+
20
+ return delegated
21
+ })
22
+ </script>
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <DialogTrigger v-bind="props">
3
+ <slot />
4
+ </DialogTrigger>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { DialogTrigger, type DialogTriggerProps } from 'reka-ui'
9
+
10
+ const props = defineProps<DialogTriggerProps>()
11
+ </script>
@@ -0,0 +1,21 @@
1
+ import { type VariantProps, cva } from 'class-variance-authority'
2
+
3
+ export { default as Drawer } from './Drawer.vue'
4
+
5
+ export const drawerVariants = cva('fixed z-50 flex flex-col gap-4 bg-background py-6 px-0 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500', {
6
+ variants: {
7
+ side: {
8
+ top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
9
+ bottom:
10
+ 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
11
+ left: 'inset-y-0 left-0 h-full w-1/3 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left max-w-full',
12
+ right:
13
+ 'inset-y-0 right-0 h-full w-1/3 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right max-w-full'
14
+ }
15
+ },
16
+ defaultVariants: {
17
+ side: 'right'
18
+ }
19
+ })
20
+
21
+ export type DrawerVariants = VariantProps<typeof drawerVariants>
@@ -0,0 +1,87 @@
1
+ <template>
2
+ <DropdownMenuRoot v-bind="forwarded">
3
+ <DropdownMenuTrigger as-child>
4
+ <slot name="trigger" />
5
+ </DropdownMenuTrigger>
6
+
7
+ <DropdownMenuContent
8
+ :class="cn('min-w-32', props.class)"
9
+ :side-offset="4"
10
+ :align-offset="4"
11
+ :align="align"
12
+ :side="side"
13
+ >
14
+ <template v-if="label || $slots.label">
15
+ <DropdownMenuLabel>
16
+ <slot name="label">
17
+ {{ label }}
18
+ </slot>
19
+ </DropdownMenuLabel>
20
+ <DropdownMenuSeparator />
21
+ </template>
22
+ <DropdownMenuCheckboxItem
23
+ v-for="(item, index) in items"
24
+ :key="index"
25
+ :value="item.value"
26
+ :model-value="modelValue.includes(item.value)"
27
+ @update:model-value="updateValue(item, $event)"
28
+ @select="$emit('select', item)"
29
+ >
30
+ <span>{{ item.label }}</span>
31
+ <DropdownMenuHelp v-if="item.help">
32
+ {{ item.help }}
33
+ </DropdownMenuHelp>
34
+ </DropdownMenuCheckboxItem>
35
+ </DropdownMenuContent>
36
+ </DropdownMenuRoot>
37
+ </template>
38
+
39
+ <script setup lang="ts">
40
+ import {
41
+ DropdownMenuRoot,
42
+ type DropdownMenuRootEmits,
43
+ type DropdownMenuRootProps,
44
+ type DropdownMenuContentProps
45
+ } from 'reka-ui'
46
+ import DropdownMenuTrigger from './DropdownMenuTrigger.vue'
47
+ import DropdownMenuContent from './DropdownMenuContent.vue'
48
+ import DropdownMenuSeparator from './DropdownMenuSeparator.vue'
49
+ import DropdownMenuHelp from './DropdownMenuHelp.vue'
50
+ import DropdownMenuLabel from './DropdownMenuLabel.vue'
51
+ import DropdownMenuCheckboxItem from './DropdownMenuCheckboxItem.vue'
52
+ import type { MenuCheckboxItem } from './'
53
+ import { type HTMLAttributes, provide } from 'vue'
54
+ import { cn } from '@/utils/tailwind'
55
+ import { useDelegatedProps } from '@/composables/delegated-props'
56
+ import { useEmitAsProps } from '@/composables/emits-as-props'
57
+ import { useForwardPropsEmits } from '@/composables/forward-props-emits'
58
+
59
+ const modelValue = defineModel<any[]>({
60
+ required: true
61
+ })
62
+
63
+ const props = defineProps<DropdownMenuRootProps & Pick<DropdownMenuContentProps, 'side' | 'align'> & {
64
+ items: MenuCheckboxItem[]
65
+ label?: string,
66
+ class?: HTMLAttributes['class']
67
+ }>()
68
+ const emits = defineEmits<DropdownMenuRootEmits & {
69
+ select: [item: MenuCheckboxItem]
70
+ }>()
71
+
72
+ const delegatedProps = useDelegatedProps(props, ['align', 'side', 'label', 'items', 'class', 'modelValue'])
73
+ const delegatedEmits = useEmitAsProps(emits, ['select', 'update:modelValue'])
74
+ const forwarded = useForwardPropsEmits(delegatedProps, delegatedEmits)
75
+
76
+ provide('hasDropdown', true)
77
+
78
+ const updateValue = (item: MenuCheckboxItem, checked: boolean) => {
79
+ const value = [...modelValue.value]
80
+ if (checked) {
81
+ value.push(item.value)
82
+ } else {
83
+ value.splice(value.indexOf(item.value), 1)
84
+ }
85
+ modelValue.value = value
86
+ }
87
+ </script>
@@ -0,0 +1,72 @@
1
+ <template>
2
+ <DropdownMenuRoot v-bind="forwarded">
3
+ <DropdownMenuTrigger as-child>
4
+ <slot name="trigger" />
5
+ </DropdownMenuTrigger>
6
+
7
+ <DropdownMenuContent
8
+ :class="props.class"
9
+ :side-offset="4"
10
+ :align="align"
11
+ :side="side"
12
+ >
13
+ <template v-if="label || $slots.label">
14
+ <DropdownMenuLabel>
15
+ <slot name="label">
16
+ {{ label }}
17
+ </slot>
18
+ </DropdownMenuLabel>
19
+ <DropdownMenuSeparator />
20
+ </template>
21
+
22
+ <template v-for="(item, index) in items" :key="index">
23
+ <DropdownMenuPart :item="item" @select="$emit('select', $event)">
24
+ <template v-if="$slots['item-icon']" #item-icon="{ item }">
25
+ <slot name="item-icon" v-bind="{ item }" />
26
+ </template>
27
+ <template v-if="$slots['item-label']" #item-label="{ item }">
28
+ <slot name="item-label" v-bind="{ item }" />
29
+ </template>
30
+ <template v-if="$slots['item-help']" #item-help="{ item }">
31
+ <slot name="item-help" v-bind="{ item }" />
32
+ </template>
33
+ </DropdownMenuPart>
34
+ <DropdownMenuSeparator v-if="index !== items.length - 1 && ('items' in item || 'items' in items[index + 1])" />
35
+ </template>
36
+ </DropdownMenuContent>
37
+ </DropdownMenuRoot>
38
+ </template>
39
+
40
+ <script setup lang="ts">
41
+ import { type HTMLAttributes, provide } from 'vue'
42
+ import {
43
+ DropdownMenuRoot,
44
+ type DropdownMenuRootEmits,
45
+ type DropdownMenuRootProps,
46
+ type DropdownMenuContentProps
47
+ } from 'reka-ui'
48
+ import DropdownMenuTrigger from './DropdownMenuTrigger.vue'
49
+ import DropdownMenuContent from './DropdownMenuContent.vue'
50
+ import DropdownMenuSeparator from './DropdownMenuSeparator.vue'
51
+ import DropdownMenuLabel from './DropdownMenuLabel.vue'
52
+ import DropdownMenuPart from './DropdownMenuPart.vue'
53
+ import type { MenuItem, MenuItemWithChildren, MenuGroupItem } from './'
54
+ import { useDelegatedProps } from '@/composables/delegated-props'
55
+ import { useEmitAsProps } from '@/composables/emits-as-props'
56
+ import { useForwardPropsEmits } from '@/composables/forward-props-emits'
57
+
58
+ const props = defineProps<DropdownMenuRootProps & Pick<DropdownMenuContentProps, 'side' | 'align'> & {
59
+ items: (MenuItem | MenuItemWithChildren | MenuGroupItem)[]
60
+ label?: string,
61
+ class?: HTMLAttributes['class']
62
+ }>()
63
+ const emits = defineEmits<DropdownMenuRootEmits & {
64
+ select: [item: MenuItem]
65
+ }>()
66
+
67
+ provide('hasDropdown', true)
68
+
69
+ const delegatedProps = useDelegatedProps(props, ['align', 'side', 'label', 'items', 'class'])
70
+ const delegatedEmits = useEmitAsProps(emits, ['select'])
71
+ const forwarded = useForwardPropsEmits(delegatedProps, delegatedEmits)
72
+ </script>