@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.
- package/lib/generators/lightningAppGenerator.js +7 -7
- package/lib/generators/lightningAppGenerator.js.map +1 -1
- package/lib/generators/uiBundleGenerator.d.ts +1 -0
- package/lib/generators/uiBundleGenerator.js +12 -0
- package/lib/generators/uiBundleGenerator.js.map +1 -1
- package/lib/generators/visualforceComponentGenerator.js +2 -2
- package/lib/generators/visualforceComponentGenerator.js.map +1 -1
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +674 -831
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +680 -837
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +1765 -1639
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +1771 -1645
- package/lib/templates/uiBundles/angularbasic/package-lock.json +674 -831
- package/lib/templates/uiBundles/reactbasic/package-lock.json +1765 -1639
- package/lib/templates/uiBundles/vuebasic/.forceignore +15 -0
- package/lib/templates/uiBundles/vuebasic/.graphqlrc.yml +2 -0
- package/lib/templates/uiBundles/vuebasic/.prettierignore +9 -0
- package/lib/templates/uiBundles/vuebasic/.prettierrc +11 -0
- package/lib/templates/uiBundles/vuebasic/README.md +43 -0
- package/lib/templates/uiBundles/vuebasic/_uibundle.uibundle-meta.xml +7 -0
- package/lib/templates/uiBundles/vuebasic/codegen.yml +95 -0
- package/lib/templates/uiBundles/vuebasic/components.json +19 -0
- package/lib/templates/uiBundles/vuebasic/eslint.config.js +110 -0
- package/lib/templates/uiBundles/vuebasic/index.html +12 -0
- package/lib/templates/uiBundles/vuebasic/package-lock.json +15489 -0
- package/lib/templates/uiBundles/vuebasic/package.json +72 -0
- package/lib/templates/uiBundles/vuebasic/playwright.config.ts +24 -0
- package/lib/templates/uiBundles/vuebasic/scripts/get-graphql-schema.mjs +71 -0
- package/lib/templates/uiBundles/vuebasic/scripts/rewrite-e2e-assets.mjs +23 -0
- package/lib/templates/uiBundles/vuebasic/src/App.vue +5 -0
- package/lib/templates/uiBundles/vuebasic/src/api/graphqlClient.ts +44 -0
- package/lib/templates/uiBundles/vuebasic/src/appLayout.vue +80 -0
- package/lib/templates/uiBundles/vuebasic/src/components/alerts/status-alert.vue +59 -0
- package/lib/templates/uiBundles/vuebasic/src/components/layouts/card-layout.vue +30 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/Alert.vue +21 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/AlertAction.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/AlertDescription.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/AlertTitle.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/alert/index.ts +25 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/avatar/Avatar.vue +23 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/avatar/AvatarFallback.vue +31 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/avatar/AvatarImage.vue +16 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/avatar/index.ts +3 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/button/Button.vue +33 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/button/index.ts +43 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/card/Card.vue +29 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardAction.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardContent.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardDescription.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardFooter.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardHeader.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/card/CardTitle.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/card/index.ts +7 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/checkbox/Checkbox.vue +43 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/checkbox/index.ts +1 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/collapsible/Collapsible.vue +19 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/collapsible/CollapsibleContent.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/collapsible/CollapsibleTrigger.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/collapsible/index.ts +3 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/Dialog.vue +15 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogClose.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogContent.vue +59 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogDescription.vue +31 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogFooter.vue +33 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogHeader.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogOverlay.vue +31 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogPortal.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogTitle.vue +26 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/DialogTrigger.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dialog/index.ts +10 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +51 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuContent.vue +47 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuItem.vue +44 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +30 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuPortal.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +52 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +26 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +19 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +37 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +38 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/index.ts +15 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/Field.vue +27 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldContent.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldDescription.vue +24 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldError.vue +48 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldGroup.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldLabel.vue +24 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldLegend.vue +29 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldSeparator.vue +31 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldSet.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/FieldTitle.vue +22 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/field/index.ts +33 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/index.ts +115 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/input/Input.vue +30 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/input/index.ts +1 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/label/Label.vue +29 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/label/index.ts +1 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/Pagination.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationContent.vue +15 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationEllipsis.vue +23 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationItem.vue +7 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationLink.vue +31 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationNext.vue +29 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/PaginationPrevious.vue +29 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/pagination/index.ts +7 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/Popover.vue +15 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverAnchor.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverContent.vue +44 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverDescription.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverHeader.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverTitle.vue +14 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/PopoverTrigger.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/popover/index.ts +7 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/Select.vue +15 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectContent.vue +65 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectGroup.vue +26 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectItem.vue +41 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectLabel.vue +26 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectScrollDownButton.vue +32 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectScrollUpButton.vue +32 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectSeparator.vue +24 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectTrigger.vue +45 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/SelectValue.vue +12 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/select/index.ts +10 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/separator/Separator.vue +33 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/separator/index.ts +1 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/skeleton/Skeleton.vue +15 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/skeleton/index.ts +1 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/sonner/Sonner.vue +29 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/sonner/index.ts +3 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/spinner/Spinner.vue +17 -0
- package/lib/templates/uiBundles/vuebasic/src/components/ui/spinner/index.ts +1 -0
- package/lib/templates/uiBundles/vuebasic/src/composables/useAsyncData.ts +69 -0
- package/lib/templates/uiBundles/vuebasic/src/lib/utils.ts +6 -0
- package/lib/templates/uiBundles/vuebasic/src/main.ts +6 -0
- package/lib/templates/uiBundles/vuebasic/src/pages/Home.vue +10 -0
- package/lib/templates/uiBundles/vuebasic/src/pages/NotFound.vue +18 -0
- package/lib/templates/uiBundles/vuebasic/src/router-utils.ts +32 -0
- package/lib/templates/uiBundles/vuebasic/src/router.ts +40 -0
- package/lib/templates/uiBundles/vuebasic/src/styles/global.css +134 -0
- package/lib/templates/uiBundles/vuebasic/src/test/setup.ts +1 -0
- package/lib/templates/uiBundles/vuebasic/tsconfig.json +45 -0
- package/lib/templates/uiBundles/vuebasic/tsconfig.node.json +13 -0
- package/lib/templates/uiBundles/vuebasic/ui-bundle.json +7 -0
- package/lib/templates/uiBundles/vuebasic/vite-env.d.ts +14 -0
- package/lib/templates/uiBundles/vuebasic/vite.config.ts +106 -0
- package/lib/templates/uiBundles/vuebasic/vitest-env.d.ts +2 -0
- package/lib/utils/constants.d.ts +1 -1
- package/lib/utils/constants.js +1 -1
- package/package.json +2 -1
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuContent.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuGroup.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuLabel.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuPortal.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue
ADDED
|
@@ -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>
|
package/lib/templates/uiBundles/vuebasic/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue
ADDED
|
@@ -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>
|