@salesforce/templates 66.17.0-beta.3 → 66.17.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 (154) hide show
  1. package/lib/generators/lightningAppGenerator.js +7 -7
  2. package/lib/generators/lightningAppGenerator.js.map +1 -1
  3. package/lib/generators/uiBundleGenerator.d.ts +1 -0
  4. package/lib/generators/uiBundleGenerator.js +12 -0
  5. package/lib/generators/uiBundleGenerator.js.map +1 -1
  6. package/lib/generators/visualforceComponentGenerator.js +2 -2
  7. package/lib/generators/visualforceComponentGenerator.js.map +1 -1
  8. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +674 -831
  9. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +680 -837
  10. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +1765 -1639
  11. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +1771 -1645
  12. package/lib/templates/uiBundles/angularbasic/package-lock.json +674 -831
  13. package/lib/templates/uiBundles/reactbasic/package-lock.json +1765 -1639
  14. package/lib/templates/uiBundles/vuebasic/.forceignore +15 -0
  15. package/lib/templates/uiBundles/vuebasic/.graphqlrc.yml +2 -0
  16. package/lib/templates/uiBundles/vuebasic/.prettierignore +9 -0
  17. package/lib/templates/uiBundles/vuebasic/.prettierrc +11 -0
  18. package/lib/templates/uiBundles/vuebasic/README.md +43 -0
  19. package/lib/templates/uiBundles/vuebasic/_uibundle.uibundle-meta.xml +7 -0
  20. package/lib/templates/uiBundles/vuebasic/codegen.yml +95 -0
  21. package/lib/templates/uiBundles/vuebasic/components.json +19 -0
  22. package/lib/templates/uiBundles/vuebasic/eslint.config.js +110 -0
  23. package/lib/templates/uiBundles/vuebasic/index.html +12 -0
  24. package/lib/templates/uiBundles/vuebasic/package-lock.json +15489 -0
  25. package/lib/templates/uiBundles/vuebasic/package.json +72 -0
  26. package/lib/templates/uiBundles/vuebasic/playwright.config.ts +24 -0
  27. package/lib/templates/uiBundles/vuebasic/scripts/get-graphql-schema.mjs +71 -0
  28. package/lib/templates/uiBundles/vuebasic/scripts/rewrite-e2e-assets.mjs +23 -0
  29. package/lib/templates/uiBundles/vuebasic/src/App.vue +5 -0
  30. package/lib/templates/uiBundles/vuebasic/src/api/graphqlClient.ts +44 -0
  31. package/lib/templates/uiBundles/vuebasic/src/appLayout.vue +80 -0
  32. package/lib/templates/uiBundles/vuebasic/src/components/alerts/status-alert.vue +59 -0
  33. package/lib/templates/uiBundles/vuebasic/src/components/layouts/card-layout.vue +30 -0
  34. package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/Alert.vue +21 -0
  35. package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/AlertAction.vue +17 -0
  36. package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/AlertDescription.vue +22 -0
  37. package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/AlertTitle.vue +22 -0
  38. package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/index.ts +25 -0
  39. package/lib/templates/uiBundles/vuebasic/src/components/ui/avatar/Avatar.vue +23 -0
  40. package/lib/templates/uiBundles/vuebasic/src/components/ui/avatar/AvatarFallback.vue +31 -0
  41. package/lib/templates/uiBundles/vuebasic/src/components/ui/avatar/AvatarImage.vue +16 -0
  42. package/lib/templates/uiBundles/vuebasic/src/components/ui/avatar/index.ts +3 -0
  43. package/lib/templates/uiBundles/vuebasic/src/components/ui/button/Button.vue +33 -0
  44. package/lib/templates/uiBundles/vuebasic/src/components/ui/button/index.ts +43 -0
  45. package/lib/templates/uiBundles/vuebasic/src/components/ui/card/Card.vue +29 -0
  46. package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardAction.vue +22 -0
  47. package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardContent.vue +17 -0
  48. package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardDescription.vue +17 -0
  49. package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardFooter.vue +22 -0
  50. package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardHeader.vue +22 -0
  51. package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardTitle.vue +22 -0
  52. package/lib/templates/uiBundles/vuebasic/src/components/ui/card/index.ts +7 -0
  53. package/lib/templates/uiBundles/vuebasic/src/components/ui/checkbox/Checkbox.vue +43 -0
  54. package/lib/templates/uiBundles/vuebasic/src/components/ui/checkbox/index.ts +1 -0
  55. package/lib/templates/uiBundles/vuebasic/src/components/ui/collapsible/Collapsible.vue +19 -0
  56. package/lib/templates/uiBundles/vuebasic/src/components/ui/collapsible/CollapsibleContent.vue +12 -0
  57. package/lib/templates/uiBundles/vuebasic/src/components/ui/collapsible/CollapsibleTrigger.vue +12 -0
  58. package/lib/templates/uiBundles/vuebasic/src/components/ui/collapsible/index.ts +3 -0
  59. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/Dialog.vue +15 -0
  60. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogClose.vue +12 -0
  61. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogContent.vue +59 -0
  62. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogDescription.vue +31 -0
  63. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogFooter.vue +33 -0
  64. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogHeader.vue +17 -0
  65. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogOverlay.vue +31 -0
  66. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogPortal.vue +12 -0
  67. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogTitle.vue +26 -0
  68. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogTrigger.vue +12 -0
  69. package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/index.ts +10 -0
  70. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
  71. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +51 -0
  72. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuContent.vue +47 -0
  73. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
  74. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuItem.vue +44 -0
  75. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +30 -0
  76. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuPortal.vue +12 -0
  77. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
  78. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +52 -0
  79. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +26 -0
  80. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +19 -0
  81. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
  82. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +37 -0
  83. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +38 -0
  84. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  85. package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/index.ts +15 -0
  86. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/Field.vue +27 -0
  87. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldContent.vue +22 -0
  88. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldDescription.vue +24 -0
  89. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldError.vue +48 -0
  90. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldGroup.vue +22 -0
  91. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldLabel.vue +24 -0
  92. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldLegend.vue +29 -0
  93. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldSeparator.vue +31 -0
  94. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldSet.vue +22 -0
  95. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldTitle.vue +22 -0
  96. package/lib/templates/uiBundles/vuebasic/src/components/ui/field/index.ts +33 -0
  97. package/lib/templates/uiBundles/vuebasic/src/components/ui/index.ts +115 -0
  98. package/lib/templates/uiBundles/vuebasic/src/components/ui/input/Input.vue +30 -0
  99. package/lib/templates/uiBundles/vuebasic/src/components/ui/input/index.ts +1 -0
  100. package/lib/templates/uiBundles/vuebasic/src/components/ui/label/Label.vue +29 -0
  101. package/lib/templates/uiBundles/vuebasic/src/components/ui/label/index.ts +1 -0
  102. package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/Pagination.vue +17 -0
  103. package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationContent.vue +15 -0
  104. package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationEllipsis.vue +23 -0
  105. package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationItem.vue +7 -0
  106. package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationLink.vue +31 -0
  107. package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationNext.vue +29 -0
  108. package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationPrevious.vue +29 -0
  109. package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/index.ts +7 -0
  110. package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/Popover.vue +15 -0
  111. package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverAnchor.vue +12 -0
  112. package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverContent.vue +44 -0
  113. package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverDescription.vue +17 -0
  114. package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverHeader.vue +17 -0
  115. package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverTitle.vue +14 -0
  116. package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverTrigger.vue +12 -0
  117. package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/index.ts +7 -0
  118. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/Select.vue +15 -0
  119. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectContent.vue +65 -0
  120. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectGroup.vue +26 -0
  121. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectItem.vue +41 -0
  122. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectLabel.vue +26 -0
  123. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectScrollDownButton.vue +32 -0
  124. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectScrollUpButton.vue +32 -0
  125. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectSeparator.vue +24 -0
  126. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectTrigger.vue +45 -0
  127. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectValue.vue +12 -0
  128. package/lib/templates/uiBundles/vuebasic/src/components/ui/select/index.ts +10 -0
  129. package/lib/templates/uiBundles/vuebasic/src/components/ui/separator/Separator.vue +33 -0
  130. package/lib/templates/uiBundles/vuebasic/src/components/ui/separator/index.ts +1 -0
  131. package/lib/templates/uiBundles/vuebasic/src/components/ui/skeleton/Skeleton.vue +15 -0
  132. package/lib/templates/uiBundles/vuebasic/src/components/ui/skeleton/index.ts +1 -0
  133. package/lib/templates/uiBundles/vuebasic/src/components/ui/sonner/Sonner.vue +29 -0
  134. package/lib/templates/uiBundles/vuebasic/src/components/ui/sonner/index.ts +3 -0
  135. package/lib/templates/uiBundles/vuebasic/src/components/ui/spinner/Spinner.vue +17 -0
  136. package/lib/templates/uiBundles/vuebasic/src/components/ui/spinner/index.ts +1 -0
  137. package/lib/templates/uiBundles/vuebasic/src/composables/useAsyncData.ts +69 -0
  138. package/lib/templates/uiBundles/vuebasic/src/lib/utils.ts +6 -0
  139. package/lib/templates/uiBundles/vuebasic/src/main.ts +6 -0
  140. package/lib/templates/uiBundles/vuebasic/src/pages/Home.vue +10 -0
  141. package/lib/templates/uiBundles/vuebasic/src/pages/NotFound.vue +18 -0
  142. package/lib/templates/uiBundles/vuebasic/src/router-utils.ts +32 -0
  143. package/lib/templates/uiBundles/vuebasic/src/router.ts +40 -0
  144. package/lib/templates/uiBundles/vuebasic/src/styles/global.css +134 -0
  145. package/lib/templates/uiBundles/vuebasic/src/test/setup.ts +1 -0
  146. package/lib/templates/uiBundles/vuebasic/tsconfig.json +45 -0
  147. package/lib/templates/uiBundles/vuebasic/tsconfig.node.json +13 -0
  148. package/lib/templates/uiBundles/vuebasic/ui-bundle.json +7 -0
  149. package/lib/templates/uiBundles/vuebasic/vite-env.d.ts +14 -0
  150. package/lib/templates/uiBundles/vuebasic/vite.config.ts +106 -0
  151. package/lib/templates/uiBundles/vuebasic/vitest-env.d.ts +2 -0
  152. package/lib/utils/constants.d.ts +1 -1
  153. package/lib/utils/constants.js +1 -1
  154. package/package.json +2 -1
@@ -0,0 +1,47 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ DropdownMenuContentEmits,
4
+ DropdownMenuContentProps,
5
+ } from 'reka-ui';
6
+ import type { HTMLAttributes } from 'vue';
7
+ import { computed } from 'vue';
8
+ import { DropdownMenuContent, useForwardPropsEmits } from 'reka-ui';
9
+ import { cn } from '@/lib/utils';
10
+ import DropdownMenuPortal from './DropdownMenuPortal.vue';
11
+
12
+ defineOptions({
13
+ inheritAttrs: false,
14
+ });
15
+
16
+ const props = withDefaults(
17
+ defineProps<DropdownMenuContentProps & { class?: HTMLAttributes['class'] }>(),
18
+ {
19
+ sideOffset: 4,
20
+ }
21
+ );
22
+ const emits = defineEmits<DropdownMenuContentEmits>();
23
+
24
+ const delegatedProps = computed(() => {
25
+ const { class: _class, ...rest } = props;
26
+ return rest;
27
+ });
28
+
29
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
30
+ </script>
31
+
32
+ <template>
33
+ <DropdownMenuPortal>
34
+ <DropdownMenuContent
35
+ data-slot="dropdown-menu-content"
36
+ v-bind="{ ...$attrs, ...forwarded }"
37
+ :class="
38
+ cn(
39
+ 'z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
40
+ props.class
41
+ )
42
+ "
43
+ >
44
+ <slot />
45
+ </DropdownMenuContent>
46
+ </DropdownMenuPortal>
47
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuGroupProps } from 'reka-ui';
3
+ import { DropdownMenuGroup } from 'reka-ui';
4
+
5
+ const props = defineProps<DropdownMenuGroupProps>();
6
+ </script>
7
+
8
+ <template>
9
+ <DropdownMenuGroup data-slot="dropdown-menu-group" v-bind="props">
10
+ <slot />
11
+ </DropdownMenuGroup>
12
+ </template>
@@ -0,0 +1,44 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuItemProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { computed } from 'vue';
5
+ import { DropdownMenuItem, useForwardProps } from 'reka-ui';
6
+ import { cn } from '@/lib/utils';
7
+
8
+ const props = withDefaults(
9
+ defineProps<
10
+ DropdownMenuItemProps & {
11
+ class?: HTMLAttributes['class'];
12
+ inset?: boolean;
13
+ variant?: 'default' | 'destructive';
14
+ }
15
+ >(),
16
+ {
17
+ variant: 'default',
18
+ }
19
+ );
20
+
21
+ const delegatedProps = computed(() => {
22
+ const { class: _class, inset: _inset, variant: _variant, ...rest } = props;
23
+ return rest;
24
+ });
25
+
26
+ const forwardedProps = useForwardProps(delegatedProps);
27
+ </script>
28
+
29
+ <template>
30
+ <DropdownMenuItem
31
+ data-slot="dropdown-menu-item"
32
+ :data-inset="inset ? '' : undefined"
33
+ :data-variant="variant"
34
+ v-bind="forwardedProps"
35
+ :class="
36
+ cn(
37
+ `relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!`,
38
+ props.class
39
+ )
40
+ "
41
+ >
42
+ <slot />
43
+ </DropdownMenuItem>
44
+ </template>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuLabelProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { computed } from 'vue';
5
+ import { DropdownMenuLabel, useForwardProps } from 'reka-ui';
6
+ import { cn } from '@/lib/utils';
7
+
8
+ const props = defineProps<
9
+ DropdownMenuLabelProps & { class?: HTMLAttributes['class']; inset?: boolean }
10
+ >();
11
+
12
+ const delegatedProps = computed(() => {
13
+ const { class: _class, inset: _inset, ...rest } = props;
14
+ return rest;
15
+ });
16
+ const forwardedProps = useForwardProps(delegatedProps);
17
+ </script>
18
+
19
+ <template>
20
+ <DropdownMenuLabel
21
+ data-slot="dropdown-menu-label"
22
+ :data-inset="inset ? '' : undefined"
23
+ v-bind="forwardedProps"
24
+ :class="
25
+ cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', props.class)
26
+ "
27
+ >
28
+ <slot />
29
+ </DropdownMenuLabel>
30
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuPortalProps } from 'reka-ui';
3
+ import { DropdownMenuPortal } from 'reka-ui';
4
+
5
+ const props = defineProps<DropdownMenuPortalProps>();
6
+ </script>
7
+
8
+ <template>
9
+ <DropdownMenuPortal data-slot="dropdown-menu-portal" v-bind="props">
10
+ <slot />
11
+ </DropdownMenuPortal>
12
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ DropdownMenuRadioGroupEmits,
4
+ DropdownMenuRadioGroupProps,
5
+ } from 'reka-ui';
6
+ import { DropdownMenuRadioGroup, useForwardPropsEmits } from 'reka-ui';
7
+
8
+ const props = defineProps<DropdownMenuRadioGroupProps>();
9
+ const emits = defineEmits<DropdownMenuRadioGroupEmits>();
10
+
11
+ const forwarded = useForwardPropsEmits(props, emits);
12
+ </script>
13
+
14
+ <template>
15
+ <DropdownMenuRadioGroup
16
+ data-slot="dropdown-menu-radio-group"
17
+ v-bind="forwarded"
18
+ >
19
+ <slot />
20
+ </DropdownMenuRadioGroup>
21
+ </template>
@@ -0,0 +1,52 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ DropdownMenuRadioItemEmits,
4
+ DropdownMenuRadioItemProps,
5
+ } from 'reka-ui';
6
+ import type { HTMLAttributes } from 'vue';
7
+ import { computed } from 'vue';
8
+ import { CircleIcon } from '@lucide/vue';
9
+ import {
10
+ DropdownMenuItemIndicator,
11
+ DropdownMenuRadioItem,
12
+ useForwardPropsEmits,
13
+ } from 'reka-ui';
14
+ import { cn } from '@/lib/utils';
15
+
16
+ const props = defineProps<
17
+ DropdownMenuRadioItemProps & { class?: HTMLAttributes['class'] }
18
+ >();
19
+
20
+ const emits = defineEmits<DropdownMenuRadioItemEmits>();
21
+
22
+ const delegatedProps = computed(() => {
23
+ const { class: _class, ...rest } = props;
24
+ return rest;
25
+ });
26
+
27
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
28
+ </script>
29
+
30
+ <template>
31
+ <DropdownMenuRadioItem
32
+ data-slot="dropdown-menu-radio-item"
33
+ v-bind="forwarded"
34
+ :class="
35
+ cn(
36
+ `focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,
37
+ props.class
38
+ )
39
+ "
40
+ >
41
+ <span
42
+ class="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center"
43
+ >
44
+ <DropdownMenuItemIndicator>
45
+ <slot name="indicator-icon">
46
+ <CircleIcon class="size-2 fill-current" />
47
+ </slot>
48
+ </DropdownMenuItemIndicator>
49
+ </span>
50
+ <slot />
51
+ </DropdownMenuRadioItem>
52
+ </template>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuSeparatorProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { computed } from 'vue';
5
+ import { DropdownMenuSeparator } from 'reka-ui';
6
+ import { cn } from '@/lib/utils';
7
+
8
+ const props = defineProps<
9
+ DropdownMenuSeparatorProps & {
10
+ class?: HTMLAttributes['class'];
11
+ }
12
+ >();
13
+
14
+ const delegatedProps = computed(() => {
15
+ const { class: _class, ...rest } = props;
16
+ return rest;
17
+ });
18
+ </script>
19
+
20
+ <template>
21
+ <DropdownMenuSeparator
22
+ data-slot="dropdown-menu-separator"
23
+ v-bind="delegatedProps"
24
+ :class="cn('-mx-1 my-1 h-px bg-border', props.class)"
25
+ />
26
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class'];
7
+ }>();
8
+ </script>
9
+
10
+ <template>
11
+ <span
12
+ data-slot="dropdown-menu-shortcut"
13
+ :class="
14
+ cn('ml-auto text-xs tracking-widest text-muted-foreground', props.class)
15
+ "
16
+ >
17
+ <slot />
18
+ </span>
19
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuSubEmits, DropdownMenuSubProps } from 'reka-ui';
3
+ import { DropdownMenuSub, useForwardPropsEmits } from 'reka-ui';
4
+
5
+ const props = defineProps<DropdownMenuSubProps>();
6
+ const emits = defineEmits<DropdownMenuSubEmits>();
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits);
9
+ </script>
10
+
11
+ <template>
12
+ <DropdownMenuSub
13
+ v-slot="slotProps"
14
+ data-slot="dropdown-menu-sub"
15
+ v-bind="forwarded"
16
+ >
17
+ <slot v-bind="slotProps" />
18
+ </DropdownMenuSub>
19
+ </template>
@@ -0,0 +1,37 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ DropdownMenuSubContentEmits,
4
+ DropdownMenuSubContentProps,
5
+ } from 'reka-ui';
6
+ import type { HTMLAttributes } from 'vue';
7
+ import { computed } from 'vue';
8
+ import { DropdownMenuSubContent, useForwardPropsEmits } from 'reka-ui';
9
+ import { cn } from '@/lib/utils';
10
+
11
+ const props = defineProps<
12
+ DropdownMenuSubContentProps & { class?: HTMLAttributes['class'] }
13
+ >();
14
+ const emits = defineEmits<DropdownMenuSubContentEmits>();
15
+
16
+ const delegatedProps = computed(() => {
17
+ const { class: _class, ...rest } = props;
18
+ return rest;
19
+ });
20
+
21
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
22
+ </script>
23
+
24
+ <template>
25
+ <DropdownMenuSubContent
26
+ data-slot="dropdown-menu-sub-content"
27
+ v-bind="forwarded"
28
+ :class="
29
+ cn(
30
+ 'z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
31
+ props.class
32
+ )
33
+ "
34
+ >
35
+ <slot />
36
+ </DropdownMenuSubContent>
37
+ </template>
@@ -0,0 +1,38 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuSubTriggerProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { computed } from 'vue';
5
+ import { ChevronRightIcon } from '@lucide/vue';
6
+ import { DropdownMenuSubTrigger, useForwardProps } from 'reka-ui';
7
+ import { cn } from '@/lib/utils';
8
+
9
+ const props = defineProps<
10
+ DropdownMenuSubTriggerProps & {
11
+ class?: HTMLAttributes['class'];
12
+ inset?: boolean;
13
+ }
14
+ >();
15
+
16
+ const delegatedProps = computed(() => {
17
+ const { class: _class, inset: _inset, ...rest } = props;
18
+ return rest;
19
+ });
20
+ const forwardedProps = useForwardProps(delegatedProps);
21
+ </script>
22
+
23
+ <template>
24
+ <DropdownMenuSubTrigger
25
+ data-slot="dropdown-menu-sub-trigger"
26
+ v-bind="forwardedProps"
27
+ :data-inset="inset ? '' : undefined"
28
+ :class="
29
+ cn(
30
+ `relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`,
31
+ props.class
32
+ )
33
+ "
34
+ >
35
+ <slot />
36
+ <ChevronRightIcon class="ml-auto size-4" />
37
+ </DropdownMenuSubTrigger>
38
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuTriggerProps } from 'reka-ui';
3
+ import { DropdownMenuTrigger, useForwardProps } from 'reka-ui';
4
+
5
+ const props = defineProps<DropdownMenuTriggerProps>();
6
+
7
+ const forwardedProps = useForwardProps(props);
8
+ </script>
9
+
10
+ <template>
11
+ <DropdownMenuTrigger
12
+ data-slot="dropdown-menu-trigger"
13
+ v-bind="forwardedProps"
14
+ >
15
+ <slot />
16
+ </DropdownMenuTrigger>
17
+ </template>
@@ -0,0 +1,15 @@
1
+ export { default as DropdownMenu } from './DropdownMenu.vue';
2
+ export { default as DropdownMenuPortal } from './DropdownMenuPortal.vue';
3
+ export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue';
4
+ export { default as DropdownMenuContent } from './DropdownMenuContent.vue';
5
+ export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue';
6
+ export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue';
7
+ export { default as DropdownMenuItem } from './DropdownMenuItem.vue';
8
+ export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue';
9
+ export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue';
10
+ export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue';
11
+ export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue';
12
+ export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue';
13
+ export { default as DropdownMenuSub } from './DropdownMenuSub.vue';
14
+ export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue';
15
+ export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue';
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import type { FieldVariants } from '.';
4
+ import { cn } from '@/lib/utils';
5
+ import { fieldVariants } from '.';
6
+
7
+ const props = withDefaults(
8
+ defineProps<{
9
+ class?: HTMLAttributes['class'];
10
+ orientation?: FieldVariants['orientation'];
11
+ }>(),
12
+ {
13
+ orientation: 'vertical',
14
+ }
15
+ );
16
+ </script>
17
+
18
+ <template>
19
+ <div
20
+ role="group"
21
+ data-slot="field"
22
+ :data-orientation="orientation"
23
+ :class="cn(fieldVariants({ orientation }), props.class)"
24
+ >
25
+ <slot />
26
+ </div>
27
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class'];
7
+ }>();
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ data-slot="field-content"
13
+ :class="
14
+ cn(
15
+ 'gap-0.5 group/field-content flex flex-1 flex-col leading-snug',
16
+ props.class
17
+ )
18
+ "
19
+ >
20
+ <slot />
21
+ </div>
22
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class'];
7
+ }>();
8
+ </script>
9
+
10
+ <template>
11
+ <p
12
+ data-slot="field-description"
13
+ :class="
14
+ cn(
15
+ 'text-muted-foreground text-left text-sm [[data-variant=legend]+&]:-mt-1.5 leading-normal font-normal group-has-data-horizontal/field:text-balance',
16
+ 'last:mt-0 nth-last-2:-mt-1',
17
+ '[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4',
18
+ props.class
19
+ )
20
+ "
21
+ >
22
+ <slot />
23
+ </p>
24
+ </template>
@@ -0,0 +1,48 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { computed } from 'vue';
4
+ import { cn } from '@/lib/utils';
5
+
6
+ const props = defineProps<{
7
+ class?: HTMLAttributes['class'];
8
+ errors?: Array<{ message?: string } | undefined>;
9
+ }>();
10
+
11
+ const content = computed(() => {
12
+ if (!props.errors?.length) {
13
+ return null;
14
+ }
15
+
16
+ const uniqueErrors = [
17
+ ...new Map(props.errors.map(error => [error?.message, error])).values(),
18
+ ];
19
+
20
+ if (uniqueErrors.length === 1) {
21
+ return uniqueErrors[0]?.message;
22
+ }
23
+
24
+ return uniqueErrors;
25
+ });
26
+ </script>
27
+
28
+ <template>
29
+ <div
30
+ v-if="$slots.default || content"
31
+ role="alert"
32
+ data-slot="field-error"
33
+ :class="cn('text-destructive text-sm font-normal', props.class)"
34
+ >
35
+ <slot v-if="$slots.default" />
36
+ <template v-else-if="typeof content === 'string'">
37
+ {{ content }}
38
+ </template>
39
+ <ul
40
+ v-else-if="Array.isArray(content)"
41
+ class="ml-4 flex list-disc flex-col gap-1"
42
+ >
43
+ <li v-for="(error, index) in content" :key="index">
44
+ <template v-if="error?.message">{{ error.message }}</template>
45
+ </li>
46
+ </ul>
47
+ </div>
48
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class'];
7
+ }>();
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ data-slot="field-group"
13
+ :class="
14
+ cn(
15
+ 'gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4 group/field-group @container/field-group flex w-full flex-col',
16
+ props.class
17
+ )
18
+ "
19
+ >
20
+ <slot />
21
+ </div>
22
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import type { LabelProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { cn } from '@/lib/utils';
5
+ import { Label } from '@/components/ui/label';
6
+
7
+ const props = defineProps<LabelProps & { class?: HTMLAttributes['class'] }>();
8
+ </script>
9
+
10
+ <template>
11
+ <Label
12
+ data-slot="field-label"
13
+ v-bind="props"
14
+ :class="
15
+ cn(
16
+ 'has-data-checked:bg-primary/5 has-data-checked:border-primary/30 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10 gap-2 group-data-[disabled=true]/field:opacity-50 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 group/field-label peer/field-label flex w-fit leading-snug',
17
+ 'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col',
18
+ props.class
19
+ )
20
+ "
21
+ >
22
+ <slot />
23
+ </Label>
24
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const props = withDefaults(
6
+ defineProps<{
7
+ class?: HTMLAttributes['class'];
8
+ variant?: 'legend' | 'label';
9
+ }>(),
10
+ {
11
+ variant: 'legend',
12
+ }
13
+ );
14
+ </script>
15
+
16
+ <template>
17
+ <legend
18
+ data-slot="field-legend"
19
+ :data-variant="variant"
20
+ :class="
21
+ cn(
22
+ 'mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base',
23
+ props.class
24
+ )
25
+ "
26
+ >
27
+ <slot />
28
+ </legend>
29
+ </template>
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+ import { Separator } from '@/components/ui/separator';
5
+
6
+ const props = defineProps<{
7
+ class?: HTMLAttributes['class'];
8
+ }>();
9
+ </script>
10
+
11
+ <template>
12
+ <div
13
+ data-slot="field-separator"
14
+ :data-content="!!$slots.default"
15
+ :class="
16
+ cn(
17
+ '-my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2 relative',
18
+ props.class
19
+ )
20
+ "
21
+ >
22
+ <Separator class="absolute inset-0 top-1/2" />
23
+ <span
24
+ v-if="$slots.default"
25
+ class="text-muted-foreground px-2 bg-background relative mx-auto block w-fit"
26
+ data-slot="field-separator-content"
27
+ >
28
+ <slot />
29
+ </span>
30
+ </div>
31
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class'];
7
+ }>();
8
+ </script>
9
+
10
+ <template>
11
+ <fieldset
12
+ data-slot="field-set"
13
+ :class="
14
+ cn(
15
+ 'gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3 flex flex-col',
16
+ props.class
17
+ )
18
+ "
19
+ >
20
+ <slot />
21
+ </fieldset>
22
+ </template>