@meistrari/tela-build 1.0.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/README.md +75 -0
- package/app.config.ts +73 -0
- package/components/tela/animated/animated-calculating-number.vue +16 -0
- package/components/tela/animated/animated-number.mdx +248 -0
- package/components/tela/animated/animated-number.stories.ts +52 -0
- package/components/tela/animated/animated-number.vue +23 -0
- package/components/tela/animated/animated-text.vue +124 -0
- package/components/tela/animated/animated-value.vue +68 -0
- package/components/tela/avatar/avatar.mdx +117 -0
- package/components/tela/avatar/avatar.stories.ts +62 -0
- package/components/tela/avatar/avatar.vue +71 -0
- package/components/tela/avatar/group/avatar-group.stories.ts +78 -0
- package/components/tela/avatar/group/avatar-group.vue +46 -0
- package/components/tela/badge/badge.mdx +154 -0
- package/components/tela/badge/badge.stories.ts +82 -0
- package/components/tela/badge/badge.vue +41 -0
- package/components/tela/button/button.mdx +155 -0
- package/components/tela/button/button.stories.ts +202 -0
- package/components/tela/button/button.vue +107 -0
- package/components/tela/card.vue +30 -0
- package/components/tela/chart/chart-bar.vue +58 -0
- package/components/tela/chat/chat.mdx +268 -0
- package/components/tela/chat/chat.stories.ts +253 -0
- package/components/tela/chat/command/index.vue +41 -0
- package/components/tela/chat/command/mention/index.vue +138 -0
- package/components/tela/chat/index.vue +112 -0
- package/components/tela/chat/pure-text-input/chat-text-input.vue +190 -0
- package/components/tela/chat/text-input/chat-text-input.stories.ts +128 -0
- package/components/tela/chat/text-input/index.vue +217 -0
- package/components/tela/chat/text-message/chat-text-message.stories.ts +138 -0
- package/components/tela/chat/text-message/index.vue +355 -0
- package/components/tela/chat/types.ts +19 -0
- package/components/tela/checkbox/checkbox-card.vue +30 -0
- package/components/tela/checkbox/checkbox.mdx +164 -0
- package/components/tela/checkbox/checkbox.stories.ts +104 -0
- package/components/tela/checkbox/checkbox.vue +43 -0
- package/components/tela/collapsible/Collapsible.vue +15 -0
- package/components/tela/collapsible/CollapsibleContent.vue +59 -0
- package/components/tela/collapsible/CollapsibleTrigger.vue +12 -0
- package/components/tela/collapsible/collapsible.mdx +157 -0
- package/components/tela/collapsible-section/collapsible-section.mdx +180 -0
- package/components/tela/collapsible-section/collapsible-section.stories.ts +53 -0
- package/components/tela/collapsible-section/collapsible-section.vue +51 -0
- package/components/tela/collapsible-section-with-actions.vue +98 -0
- package/components/tela/combobox/combobox-anchor.vue +24 -0
- package/components/tela/combobox/combobox-empty.vue +19 -0
- package/components/tela/combobox/combobox-group.vue +24 -0
- package/components/tela/combobox/combobox-indicator.vue +22 -0
- package/components/tela/combobox/combobox-input.vue +31 -0
- package/components/tela/combobox/combobox-item.vue +28 -0
- package/components/tela/combobox/combobox-label.vue +24 -0
- package/components/tela/combobox/combobox-list.vue +90 -0
- package/components/tela/combobox/combobox-module-selector.vue +366 -0
- package/components/tela/combobox/combobox-root.vue +15 -0
- package/components/tela/combobox/combobox-trigger.vue +12 -0
- package/components/tela/combobox/combobox.mdx +285 -0
- package/components/tela/combobox/combobox.stories.ts +232 -0
- package/components/tela/combobox/combobox.vue +497 -0
- package/components/tela/command/command-dialog.vue +22 -0
- package/components/tela/command/command-empty.vue +25 -0
- package/components/tela/command/command-group.vue +46 -0
- package/components/tela/command/command-input.vue +38 -0
- package/components/tela/command/command-item.vue +78 -0
- package/components/tela/command/command-list.vue +78 -0
- package/components/tela/command/command-separator.vue +23 -0
- package/components/tela/command/command-shortcut.vue +13 -0
- package/components/tela/command/command.vue +88 -0
- package/components/tela/command/dialog-base.vue +15 -0
- package/components/tela/command/dialog-content.vue +50 -0
- package/components/tela/command/utils.ts +15 -0
- package/components/tela/complex-table/complex-table-cell.stories.ts +145 -0
- package/components/tela/complex-table/complex-table-cell.vue +45 -0
- package/components/tela/complex-table/complex-table-header-cell.stories.ts +103 -0
- package/components/tela/complex-table/complex-table-header-cell.vue +48 -0
- package/components/tela/complex-table/complex-table-header.stories.ts +89 -0
- package/components/tela/complex-table/complex-table-header.vue +70 -0
- package/components/tela/complex-table/complex-table-row.vue +199 -0
- package/components/tela/complex-table/complex-table-virtualized.vue +326 -0
- package/components/tela/complex-table/complex-table.stories.ts +358 -0
- package/components/tela/complex-table/complex-table.vue +237 -0
- package/components/tela/complex-table/composables/table-common.ts +93 -0
- package/components/tela/complex-table/composables/table-selection.ts +87 -0
- package/components/tela/complex-table/composables/virtual-scroll.ts +252 -0
- package/components/tela/complex-table/styles/table-shared.css +170 -0
- package/components/tela/complex-table/types.ts +63 -0
- package/components/tela/complex-table/utils.ts +35 -0
- package/components/tela/confirm-button/confirm-button.vue +137 -0
- package/components/tela/confirmation-modal/confirmation-modal.vue +72 -0
- package/components/tela/copy-button.vue +86 -0
- package/components/tela/date-range-picker.vue +221 -0
- package/components/tela/dialog/dialog.mdx +170 -0
- package/components/tela/dialog/dialog.vue +182 -0
- package/components/tela/disabled-area.vue +16 -0
- package/components/tela/disclaimer/disclaimer.mdx +238 -0
- package/components/tela/disclaimer/disclaimer.stories.ts +196 -0
- package/components/tela/disclaimer/disclaimer.vue +125 -0
- package/components/tela/dropdown-menu/DropdownMenu.vue +121 -0
- package/components/tela/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
- package/components/tela/dropdown-menu/DropdownMenuContent.vue +75 -0
- package/components/tela/dropdown-menu/DropdownMenuGroup.vue +12 -0
- package/components/tela/dropdown-menu/DropdownMenuItem.vue +137 -0
- package/components/tela/dropdown-menu/DropdownMenuLabel.vue +26 -0
- package/components/tela/dropdown-menu/DropdownMenuRadioGroup.vue +18 -0
- package/components/tela/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
- package/components/tela/dropdown-menu/DropdownMenuRoot.vue +15 -0
- package/components/tela/dropdown-menu/DropdownMenuSeparator.vue +21 -0
- package/components/tela/dropdown-menu/DropdownMenuShortcut.vue +14 -0
- package/components/tela/dropdown-menu/DropdownMenuSub.vue +18 -0
- package/components/tela/dropdown-menu/DropdownMenuSubContent.vue +30 -0
- package/components/tela/dropdown-menu/DropdownMenuSubTrigger.vue +35 -0
- package/components/tela/dropdown-menu/DropdownMenuTrigger.vue +14 -0
- package/components/tela/dropdown-menu/dropdown-menu.mdx +265 -0
- package/components/tela/dropdown-menu/dropdown-menu.stories.ts +156 -0
- package/components/tela/expandable-input.vue +96 -0
- package/components/tela/file-drop.vue +37 -0
- package/components/tela/file-upload/file-upload.mdx +189 -0
- package/components/tela/file-upload/file-upload.stories.ts +48 -0
- package/components/tela/file-upload/file-upload.vue +205 -0
- package/components/tela/filters/checkbox-filter.stories.ts +218 -0
- package/components/tela/filters/checkbox-filter.vue +165 -0
- package/components/tela/filters/date-filter.stories.ts +258 -0
- package/components/tela/filters/date-filter.vue +200 -0
- package/components/tela/filters/user-filter.stories.ts +344 -0
- package/components/tela/filters/user-filter.vue +271 -0
- package/components/tela/hover-card/hover-card.mdx +221 -0
- package/components/tela/hover-card/hover-card.stories.ts +87 -0
- package/components/tela/hover-card/hover-card.vue +61 -0
- package/components/tela/icon/custom.vue +319 -0
- package/components/tela/icon/spinner.vue +12 -0
- package/components/tela/icon-button/icon-button.vue +114 -0
- package/components/tela/icon.vue +37 -0
- package/components/tela/initials.vue +28 -0
- package/components/tela/inline-input.vue +77 -0
- package/components/tela/input/input.mdx +182 -0
- package/components/tela/input/input.stories.ts +153 -0
- package/components/tela/input/tela-input.vue +240 -0
- package/components/tela/kbd/kbd-return.vue +6 -0
- package/components/tela/kbd/kbd.mdx +238 -0
- package/components/tela/kbd/kbd.vue +18 -0
- package/components/tela/label/label.mdx +121 -0
- package/components/tela/label/label.stories.ts +37 -0
- package/components/tela/label/label.vue +25 -0
- package/components/tela/link-decoration/link-decoration.vue +19 -0
- package/components/tela/live-label.vue +32 -0
- package/components/tela/long-press-button.vue +98 -0
- package/components/tela/menubar/menubar-content.vue +77 -0
- package/components/tela/menubar/menubar-item.vue +32 -0
- package/components/tela/menubar/menubar-label.vue +14 -0
- package/components/tela/menubar/menubar-menu.vue +12 -0
- package/components/tela/menubar/menubar-root.vue +30 -0
- package/components/tela/menubar/menubar-separator.vue +17 -0
- package/components/tela/menubar/menubar-shortcut.vue +14 -0
- package/components/tela/menubar/menubar-sub-content.vue +36 -0
- package/components/tela/menubar/menubar-sub-trigger.vue +28 -0
- package/components/tela/menubar/menubar-sub.vue +20 -0
- package/components/tela/menubar/menubar-trigger.vue +27 -0
- package/components/tela/menubar/menubar.vue +298 -0
- package/components/tela/modal/modal.mdx +145 -0
- package/components/tela/modal/modal.vue +242 -0
- package/components/tela/multiple-select/multiple-select.mdx +274 -0
- package/components/tela/multiple-select/multiple-select.stories.ts +325 -0
- package/components/tela/multiple-select/multiple-select.vue +666 -0
- package/components/tela/pane.vue +110 -0
- package/components/tela/popover/popover-content.vue +48 -0
- package/components/tela/popover/popover-trigger.vue +12 -0
- package/components/tela/popover/popover.mdx +239 -0
- package/components/tela/popover/popover.stories.ts +150 -0
- package/components/tela/popover/popover.vue +15 -0
- package/components/tela/popover-list/popover-list-nested.vue +104 -0
- package/components/tela/popover-list/popover-list.stories.ts +330 -0
- package/components/tela/popover-list/popover-list.vue +191 -0
- package/components/tela/radio-button.vue +66 -0
- package/components/tela/radio-group/radio-group-item.vue +40 -0
- package/components/tela/radio-group/radio-group-root.vue +26 -0
- package/components/tela/radio-group/radio-group.mdx +78 -0
- package/components/tela/radio-group/radio-group.stories.ts +106 -0
- package/components/tela/radio-group/radio-group.vue +23 -0
- package/components/tela/range-calendar.stories.ts +110 -0
- package/components/tela/range-calendar.vue +109 -0
- package/components/tela/scroll-area/scroll-area.mdx +183 -0
- package/components/tela/scroll-area/scroll-area.vue +30 -0
- package/components/tela/scroll-area/scroll-bar.vue +31 -0
- package/components/tela/segment-toggle.stories.ts +114 -0
- package/components/tela/segment-toggle.vue +66 -0
- package/components/tela/select-menu/select-menu-content.vue +106 -0
- package/components/tela/select-menu/select-menu-down-button.vue +20 -0
- package/components/tela/select-menu/select-menu-group.vue +16 -0
- package/components/tela/select-menu/select-menu-item.vue +40 -0
- package/components/tela/select-menu/select-menu-root.vue +15 -0
- package/components/tela/select-menu/select-menu-trigger.vue +34 -0
- package/components/tela/select-menu/select-menu-up-button.vue +20 -0
- package/components/tela/select-menu/select-menu-value.vue +12 -0
- package/components/tela/select-menu/select-menu.mdx +221 -0
- package/components/tela/select-menu/select-menu.stories.ts +91 -0
- package/components/tela/select-menu/select-menu.vue +165 -0
- package/components/tela/selector/selector.vue +47 -0
- package/components/tela/sheet/sheet-close.vue +12 -0
- package/components/tela/sheet/sheet-content.vue +57 -0
- package/components/tela/sheet/sheet-description.vue +23 -0
- package/components/tela/sheet/sheet-footer.vue +18 -0
- package/components/tela/sheet/sheet-header.vue +15 -0
- package/components/tela/sheet/sheet-root.vue +18 -0
- package/components/tela/sheet/sheet-title.vue +23 -0
- package/components/tela/sheet/sheet-trigger.vue +12 -0
- package/components/tela/sheet/sheet.client.vue +150 -0
- package/components/tela/sheet/sheet.mdx +176 -0
- package/components/tela/sheet/sheet.stories.ts +201 -0
- package/components/tela/sheet/variants.ts +22 -0
- package/components/tela/side-sheet/side-sheet.mdx +131 -0
- package/components/tela/side-sheet/side-sheet.stories.ts +134 -0
- package/components/tela/side-sheet/side-sheet.vue +106 -0
- package/components/tela/skeleton/skeleton.mdx +165 -0
- package/components/tela/skeleton/skeleton.stories.ts +35 -0
- package/components/tela/skeleton/skeleton.vue +45 -0
- package/components/tela/skeleton-icon.vue +24 -0
- package/components/tela/span.vue +24 -0
- package/components/tela/star-button.vue +70 -0
- package/components/tela/status/status-lean.vue +30 -0
- package/components/tela/status/status.mdx +187 -0
- package/components/tela/status/status.stories.ts +160 -0
- package/components/tela/status/status.vue +420 -0
- package/components/tela/status-bar/status-bar.mdx +178 -0
- package/components/tela/status-bar/status-bar.stories.ts +64 -0
- package/components/tela/status-bar/status-bar.vue +56 -0
- package/components/tela/status-bar/types.ts +5 -0
- package/components/tela/switch/switch.mdx +118 -0
- package/components/tela/switch/switch.stories.ts +80 -0
- package/components/tela/switch/switch.vue +56 -0
- package/components/tela/table/table-body.vue +13 -0
- package/components/tela/table/table-caption.vue +13 -0
- package/components/tela/table/table-cell.vue +20 -0
- package/components/tela/table/table-empty.vue +37 -0
- package/components/tela/table/table-footer.vue +13 -0
- package/components/tela/table/table-head.vue +13 -0
- package/components/tela/table/table-header.vue +13 -0
- package/components/tela/table/table-row.vue +13 -0
- package/components/tela/table/table.mdx +230 -0
- package/components/tela/table/table.stories.ts +384 -0
- package/components/tela/table/table.vue +15 -0
- package/components/tela/tabs/tabs-content.vue +20 -0
- package/components/tela/tabs/tabs-indicator.vue +22 -0
- package/components/tela/tabs/tabs-list.vue +23 -0
- package/components/tela/tabs/tabs-root.vue +15 -0
- package/components/tela/tabs/tabs-trigger.vue +27 -0
- package/components/tela/tabs/tabs.mdx +138 -0
- package/components/tela/tabs/tabs.stories.ts +72 -0
- package/components/tela/tabs/tabs.vue +61 -0
- package/components/tela/tags/tags-select.mdx +318 -0
- package/components/tela/tags/tags-select.stories.ts +47 -0
- package/components/tela/tags/tags-select.vue +637 -0
- package/components/tela/tags/tags.mdx +151 -0
- package/components/tela/tags/tags.stories.ts +118 -0
- package/components/tela/tags/tags.vue +112 -0
- package/components/tela/textarea/textarea.mdx +102 -0
- package/components/tela/textarea/textarea.stories.ts +50 -0
- package/components/tela/textarea/textarea.vue +34 -0
- package/components/tela/toggle-group.vue +91 -0
- package/components/tela/tooltip/tooltip-content.vue +45 -0
- package/components/tela/tooltip/tooltip-provider.vue +12 -0
- package/components/tela/tooltip/tooltip-root.vue +15 -0
- package/components/tela/tooltip/tooltip-trigger.vue +12 -0
- package/components/tela/tooltip/tooltip.mdx +196 -0
- package/components/tela/tooltip/tooltip.stories.ts +200 -0
- package/components/tela/tooltip/tooltip.vue +91 -0
- package/components/tela/tooltip-group/tooltip-group-trigger.vue +92 -0
- package/components/tela/tooltip-group/tooltip-group.mdx +236 -0
- package/components/tela/tooltip-group/tooltip-group.stories.ts +465 -0
- package/components/tela/tooltip-group/tooltip-group.vue +35 -0
- package/components/tela/transparent-input.vue +151 -0
- package/components/tela/variable-icon.vue +28 -0
- package/components/tela/variable-input.vue +77 -0
- package/components/tela/wide-button/wide-button.vue +40 -0
- package/components.json +18 -0
- package/composables/status-toast.ts +67 -0
- package/css/reset.css +386 -0
- package/css/text.css +22 -0
- package/lib/doc-generator.ts +903 -0
- package/lib/extractors/volar-extract.ts +186 -0
- package/lib/type-resolver.ts +402 -0
- package/lib/utils.ts +6 -0
- package/modules/tela-build-docs/index.ts +139 -0
- package/nuxt.config.ts +80 -0
- package/package.json +84 -0
- package/plugins/test-id.ts +7 -0
- package/tsconfig.json +7 -0
- package/types/custom-icon.ts +1 -0
- package/types/index.ts +2 -0
- package/types/status.ts +1 -0
- package/unocss.config.ts +89 -0
- package/utils/component-utils.ts +30 -0
- package/utils/design-tokens.ts +431 -0
- package/utils/fold.ts +8 -0
- package/utils/select-menu.ts +10 -0
- package/utils/status.ts +1 -0
- package/utils/without-keys.ts +34 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import PopoverList from './popover-list.vue'
|
|
2
|
+
|
|
3
|
+
const meta = {
|
|
4
|
+
title: 'Components/PopoverList',
|
|
5
|
+
component: PopoverList,
|
|
6
|
+
parameters: {
|
|
7
|
+
layout: 'centered',
|
|
8
|
+
docs: {
|
|
9
|
+
description: {
|
|
10
|
+
component: 'A popover list component that displays a list of items in a floating panel. Supports custom item rendering, nested data structures, empty states, and flexible positioning. Useful for displaying lists of data in a popover overlay with title and subtitle support.',
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
argTypes: {
|
|
15
|
+
items: {
|
|
16
|
+
control: 'object',
|
|
17
|
+
description: 'Array of items to display in the list. Can be simple strings or complex objects with nested structures.',
|
|
18
|
+
},
|
|
19
|
+
title: {
|
|
20
|
+
control: 'text',
|
|
21
|
+
description: 'Title displayed at the top of the popover list.',
|
|
22
|
+
},
|
|
23
|
+
subtitle: {
|
|
24
|
+
control: 'text',
|
|
25
|
+
description: 'Subtitle displayed below the title.',
|
|
26
|
+
},
|
|
27
|
+
position: {
|
|
28
|
+
control: { type: 'select' },
|
|
29
|
+
options: ['left', 'center', 'right'],
|
|
30
|
+
description: 'Horizontal position alignment of the popover relative to the trigger.',
|
|
31
|
+
},
|
|
32
|
+
placement: {
|
|
33
|
+
control: { type: 'select' },
|
|
34
|
+
options: ['top', 'bottom'],
|
|
35
|
+
description: 'Vertical placement of the popover relative to the trigger (above or below).',
|
|
36
|
+
},
|
|
37
|
+
nested: {
|
|
38
|
+
control: 'boolean',
|
|
39
|
+
description: 'Enable nested data structure rendering for complex hierarchical data.',
|
|
40
|
+
},
|
|
41
|
+
nestedVariant: {
|
|
42
|
+
control: 'select',
|
|
43
|
+
options: ['attributes', 'detailed'],
|
|
44
|
+
description: 'Variant style for nested data rendering. "attributes" for key-value pairs, "detailed" for more detailed view.',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default meta
|
|
50
|
+
|
|
51
|
+
export const Basic = {
|
|
52
|
+
args: {
|
|
53
|
+
items: ['Item 1', 'Item 2', 'Item 3'],
|
|
54
|
+
title: 'List Title',
|
|
55
|
+
subtitle: 'List subtitle',
|
|
56
|
+
},
|
|
57
|
+
render: (args: any) => ({
|
|
58
|
+
components: { PopoverList },
|
|
59
|
+
setup() {
|
|
60
|
+
return { args }
|
|
61
|
+
},
|
|
62
|
+
template: `
|
|
63
|
+
<PopoverList v-bind="args">
|
|
64
|
+
<template #trigger>
|
|
65
|
+
<button class="px-4 py-2 bg-blue-500 text-white rounded">
|
|
66
|
+
Click me
|
|
67
|
+
</button>
|
|
68
|
+
</template>
|
|
69
|
+
</PopoverList>
|
|
70
|
+
`,
|
|
71
|
+
}),
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export const WithCustomItems = {
|
|
75
|
+
args: {
|
|
76
|
+
items: [
|
|
77
|
+
{ name: 'John Doe', role: 'Developer' },
|
|
78
|
+
{ name: 'Jane Smith', role: 'Designer' },
|
|
79
|
+
{ name: 'Bob Wilson', role: 'Manager' },
|
|
80
|
+
],
|
|
81
|
+
title: 'Team Members',
|
|
82
|
+
},
|
|
83
|
+
render: (args: any) => ({
|
|
84
|
+
components: { PopoverList },
|
|
85
|
+
setup() {
|
|
86
|
+
return { args }
|
|
87
|
+
},
|
|
88
|
+
template: `
|
|
89
|
+
<PopoverList v-bind="args">
|
|
90
|
+
<template #trigger>
|
|
91
|
+
<button class="px-4 py-2 bg-green-500 text-white rounded">
|
|
92
|
+
Show Team
|
|
93
|
+
</button>
|
|
94
|
+
</template>
|
|
95
|
+
<template #item="{ item }">
|
|
96
|
+
<div class="flex flex-col">
|
|
97
|
+
<span class="text-white font-semibold text-[12px]">{{ item.name }}</span>
|
|
98
|
+
<span class="text-gray-400 text-[10px]">{{ item.role }}</span>
|
|
99
|
+
</div>
|
|
100
|
+
</template>
|
|
101
|
+
</PopoverList>
|
|
102
|
+
`,
|
|
103
|
+
}),
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export const LeftPosition = {
|
|
107
|
+
args: {
|
|
108
|
+
items: ['Left Item 1', 'Left Item 2', 'Left Item 3'],
|
|
109
|
+
position: 'left',
|
|
110
|
+
title: 'Left Positioned',
|
|
111
|
+
},
|
|
112
|
+
render: (args: any) => ({
|
|
113
|
+
components: { PopoverList },
|
|
114
|
+
setup() {
|
|
115
|
+
return { args }
|
|
116
|
+
},
|
|
117
|
+
template: `
|
|
118
|
+
<div class="ml-64">
|
|
119
|
+
<PopoverList v-bind="args">
|
|
120
|
+
<template #trigger>
|
|
121
|
+
<button class="px-4 py-2 bg-red-500 text-white rounded">
|
|
122
|
+
Left Popover
|
|
123
|
+
</button>
|
|
124
|
+
</template>
|
|
125
|
+
</PopoverList>
|
|
126
|
+
</div>
|
|
127
|
+
`,
|
|
128
|
+
}),
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export const CenterPosition = {
|
|
132
|
+
args: {
|
|
133
|
+
items: ['Center Item 1', 'Center Item 2', 'Center Item 3'],
|
|
134
|
+
position: 'center',
|
|
135
|
+
title: 'Center Positioned',
|
|
136
|
+
},
|
|
137
|
+
render: (args: any) => ({
|
|
138
|
+
components: { PopoverList },
|
|
139
|
+
setup() {
|
|
140
|
+
return { args }
|
|
141
|
+
},
|
|
142
|
+
template: `
|
|
143
|
+
<PopoverList v-bind="args">
|
|
144
|
+
<template #trigger>
|
|
145
|
+
<button class="px-4 py-2 bg-purple-500 text-white rounded">
|
|
146
|
+
Center Popover
|
|
147
|
+
</button>
|
|
148
|
+
</template>
|
|
149
|
+
</PopoverList>
|
|
150
|
+
`,
|
|
151
|
+
}),
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export const EmptyState = {
|
|
155
|
+
args: {
|
|
156
|
+
items: [],
|
|
157
|
+
title: 'Empty List',
|
|
158
|
+
},
|
|
159
|
+
render: (args: any) => ({
|
|
160
|
+
components: { PopoverList },
|
|
161
|
+
setup() {
|
|
162
|
+
return { args }
|
|
163
|
+
},
|
|
164
|
+
template: `
|
|
165
|
+
<PopoverList v-bind="args">
|
|
166
|
+
<template #trigger>
|
|
167
|
+
<button class="px-4 py-2 bg-gray-500 text-white rounded">
|
|
168
|
+
Empty List
|
|
169
|
+
</button>
|
|
170
|
+
</template>
|
|
171
|
+
<template #empty>
|
|
172
|
+
<div class="flex flex-col items-start gap-4px">
|
|
173
|
+
<p class="text-white text-left font-inter text-[12px] font-semibold w-full leading-[128%] tracking-[-0.06px]">
|
|
174
|
+
Nothing to show here
|
|
175
|
+
</p>
|
|
176
|
+
<p class="text-[#BDC4CC] text-left font-inter text-[11px] font-medium w-full leading-[124%] tracking-[-0.022px]">
|
|
177
|
+
Add some items to see them in the list
|
|
178
|
+
</p>
|
|
179
|
+
</div>
|
|
180
|
+
</template>
|
|
181
|
+
</PopoverList>
|
|
182
|
+
`,
|
|
183
|
+
}),
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export const NestedAttributes = {
|
|
187
|
+
args: {
|
|
188
|
+
nested: true,
|
|
189
|
+
nestedVariant: 'attributes',
|
|
190
|
+
items: [
|
|
191
|
+
{
|
|
192
|
+
name: 'User',
|
|
193
|
+
value: {
|
|
194
|
+
name: { name: 'Name', value: 'John Doe' },
|
|
195
|
+
email: { name: 'Email', value: 'john@example.com' },
|
|
196
|
+
profile: {
|
|
197
|
+
name: 'Profile',
|
|
198
|
+
value: {
|
|
199
|
+
age: { name: 'Age', value: 30 },
|
|
200
|
+
city: { name: 'City', value: 'New York' },
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: 'Settings',
|
|
207
|
+
value: {
|
|
208
|
+
theme: { name: 'Theme', value: 'dark' },
|
|
209
|
+
notifications: { name: 'Notifications', value: true },
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
title: 'Nested Attributes',
|
|
214
|
+
subtitle: 'Tree structure with attributes view',
|
|
215
|
+
},
|
|
216
|
+
render: (args: any) => ({
|
|
217
|
+
components: { PopoverList },
|
|
218
|
+
setup() {
|
|
219
|
+
return { args }
|
|
220
|
+
},
|
|
221
|
+
template: `
|
|
222
|
+
<PopoverList v-bind="args">
|
|
223
|
+
<template #trigger>
|
|
224
|
+
<button class="px-4 py-2 bg-indigo-500 text-white rounded">
|
|
225
|
+
Nested Attributes
|
|
226
|
+
</button>
|
|
227
|
+
</template>
|
|
228
|
+
</PopoverList>
|
|
229
|
+
`,
|
|
230
|
+
}),
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export const NestedDetailed = {
|
|
234
|
+
args: {
|
|
235
|
+
nested: true,
|
|
236
|
+
nestedVariant: 'detailed',
|
|
237
|
+
items: [
|
|
238
|
+
{
|
|
239
|
+
name: 'Database',
|
|
240
|
+
value: {
|
|
241
|
+
host: { name: 'Host', value: 'localhost' },
|
|
242
|
+
port: { name: 'Port', value: 5432 },
|
|
243
|
+
credentials: {
|
|
244
|
+
name: 'Credentials',
|
|
245
|
+
value: {
|
|
246
|
+
username: { name: 'Username', value: 'admin' },
|
|
247
|
+
password: { name: 'Password', value: '***' },
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
name: 'API',
|
|
254
|
+
value: {
|
|
255
|
+
endpoint: { name: 'Endpoint', value: '/api/v1' },
|
|
256
|
+
timeout: { name: 'Timeout', value: 30000 },
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
title: 'Nested Detailed',
|
|
261
|
+
subtitle: 'Tree structure with detailed view',
|
|
262
|
+
},
|
|
263
|
+
render: (args: any) => ({
|
|
264
|
+
components: { PopoverList },
|
|
265
|
+
setup() {
|
|
266
|
+
return { args }
|
|
267
|
+
},
|
|
268
|
+
template: `
|
|
269
|
+
<PopoverList v-bind="args">
|
|
270
|
+
<template #trigger>
|
|
271
|
+
<button class="px-4 py-2 bg-teal-500 text-white rounded">
|
|
272
|
+
Nested Detailed
|
|
273
|
+
</button>
|
|
274
|
+
</template>
|
|
275
|
+
</PopoverList>
|
|
276
|
+
`,
|
|
277
|
+
}),
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export const TopPlacement = {
|
|
281
|
+
args: {
|
|
282
|
+
items: ['Top Item 1', 'Top Item 2', 'Top Item 3'],
|
|
283
|
+
placement: 'top',
|
|
284
|
+
position: 'center',
|
|
285
|
+
title: 'Top Positioned',
|
|
286
|
+
subtitle: 'Appears above the trigger',
|
|
287
|
+
},
|
|
288
|
+
render: (args: any) => ({
|
|
289
|
+
components: { PopoverList },
|
|
290
|
+
setup() {
|
|
291
|
+
return { args }
|
|
292
|
+
},
|
|
293
|
+
template: `
|
|
294
|
+
<div class="mt-64">
|
|
295
|
+
<PopoverList v-bind="args">
|
|
296
|
+
<template #trigger>
|
|
297
|
+
<button class="px-4 py-2 bg-amber-500 text-white rounded">
|
|
298
|
+
Top Popover
|
|
299
|
+
</button>
|
|
300
|
+
</template>
|
|
301
|
+
</PopoverList>
|
|
302
|
+
</div>
|
|
303
|
+
`,
|
|
304
|
+
}),
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export const BottomPlacement = {
|
|
308
|
+
args: {
|
|
309
|
+
items: ['Bottom Item 1', 'Bottom Item 2', 'Bottom Item 3'],
|
|
310
|
+
placement: 'bottom',
|
|
311
|
+
position: 'center',
|
|
312
|
+
title: 'Bottom Positioned',
|
|
313
|
+
subtitle: 'Appears below the trigger',
|
|
314
|
+
},
|
|
315
|
+
render: (args: any) => ({
|
|
316
|
+
components: { PopoverList },
|
|
317
|
+
setup() {
|
|
318
|
+
return { args }
|
|
319
|
+
},
|
|
320
|
+
template: `
|
|
321
|
+
<PopoverList v-bind="args">
|
|
322
|
+
<template #trigger>
|
|
323
|
+
<button class="px-4 py-2 bg-lime-500 text-white rounded">
|
|
324
|
+
Bottom Popover
|
|
325
|
+
</button>
|
|
326
|
+
</template>
|
|
327
|
+
</PopoverList>
|
|
328
|
+
`,
|
|
329
|
+
}),
|
|
330
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
<script setup lang="ts" generic="T">
|
|
2
|
+
import { PopoverContent, PopoverRoot, PopoverTrigger, PopoverPortal } from 'radix-vue'
|
|
3
|
+
import PopoverListNested from './popover-list-nested.vue'
|
|
4
|
+
|
|
5
|
+
interface PopoverListProps<T> {
|
|
6
|
+
items: T[]
|
|
7
|
+
title?: string
|
|
8
|
+
subtitle?: string
|
|
9
|
+
position?: 'left' | 'center' | 'right'
|
|
10
|
+
placement?: 'top' | 'bottom'
|
|
11
|
+
nested?: boolean
|
|
12
|
+
nestedVariant?: 'attributes' | 'detailed'
|
|
13
|
+
hasChildrenFn?: (item: T) => boolean
|
|
14
|
+
getChildrenFn?: (item: T) => T[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const props = withDefaults(defineProps<PopoverListProps<T>>(), {
|
|
18
|
+
position: 'right',
|
|
19
|
+
placement: 'bottom',
|
|
20
|
+
nested: false,
|
|
21
|
+
nestedVariant: 'attributes',
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
const popoverOpen = defineModel('open', {
|
|
25
|
+
type: Boolean,
|
|
26
|
+
default: false,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const hoverTimeout = ref<NodeJS.Timeout>()
|
|
30
|
+
|
|
31
|
+
function handleMouseEnter() {
|
|
32
|
+
clearTimeout(hoverTimeout.value)
|
|
33
|
+
popoverOpen.value = true
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function handleMouseLeave() {
|
|
37
|
+
hoverTimeout.value = setTimeout(() => {
|
|
38
|
+
popoverOpen.value = false
|
|
39
|
+
}, 150)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const popoverSide = computed(() => {
|
|
43
|
+
if (props.placement === 'top') {
|
|
44
|
+
return 'top'
|
|
45
|
+
}
|
|
46
|
+
if (props.placement === 'bottom') {
|
|
47
|
+
return 'bottom'
|
|
48
|
+
}
|
|
49
|
+
// Fallback para position horizontal quando placement não é especificado
|
|
50
|
+
if (props.position === 'left') {
|
|
51
|
+
return 'left'
|
|
52
|
+
}
|
|
53
|
+
if (props.position === 'right') {
|
|
54
|
+
return 'right'
|
|
55
|
+
}
|
|
56
|
+
return 'bottom' // default
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
const popoverAlign = computed(() => {
|
|
60
|
+
if (props.placement === 'top' || props.placement === 'bottom') {
|
|
61
|
+
// Para top/bottom, usar position para alinhamento horizontal
|
|
62
|
+
if (props.position === 'left') {
|
|
63
|
+
return 'start'
|
|
64
|
+
}
|
|
65
|
+
if (props.position === 'right') {
|
|
66
|
+
return 'end'
|
|
67
|
+
}
|
|
68
|
+
if (props.position === 'center') {
|
|
69
|
+
return 'center'
|
|
70
|
+
}
|
|
71
|
+
return 'center' // default para top/bottom
|
|
72
|
+
}
|
|
73
|
+
// Para left/right, usar alinhamento padrão
|
|
74
|
+
return 'start'
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
function hasChildren(item: T): boolean {
|
|
78
|
+
if (props.hasChildrenFn) {
|
|
79
|
+
return props.hasChildrenFn(item)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Default logic for nested objects
|
|
83
|
+
if (typeof item === 'object' && item !== null) {
|
|
84
|
+
const obj = item as any
|
|
85
|
+
return obj.value && typeof obj.value === 'object' && Object.keys(obj.value).length > 0
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return false
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function getChildren(item: T): T[] {
|
|
92
|
+
if (props.getChildrenFn) {
|
|
93
|
+
return props.getChildrenFn(item)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Default logic for nested objects
|
|
97
|
+
if (typeof item === 'object' && item !== null) {
|
|
98
|
+
const obj = item as any
|
|
99
|
+
if (obj.value && typeof obj.value === 'object') {
|
|
100
|
+
return Object.values(obj.value)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return []
|
|
105
|
+
}
|
|
106
|
+
</script>
|
|
107
|
+
|
|
108
|
+
<template>
|
|
109
|
+
<PopoverRoot v-model:open="popoverOpen">
|
|
110
|
+
<PopoverTrigger
|
|
111
|
+
as-child
|
|
112
|
+
@mouseenter="handleMouseEnter"
|
|
113
|
+
@mouseleave="handleMouseLeave"
|
|
114
|
+
>
|
|
115
|
+
<slot name="trigger" />
|
|
116
|
+
</PopoverTrigger>
|
|
117
|
+
<PopoverPortal>
|
|
118
|
+
<PopoverContent
|
|
119
|
+
class="inline-flex flex-col items-start gap-1 rounded-[12px] bg-[#030C16] p-3"
|
|
120
|
+
:style="{
|
|
121
|
+
'box-shadow': '0px 16px 80px 0px #0D2D4814, 0px 4px 16px 0px #0D2D480D',
|
|
122
|
+
'z-index': '11000',
|
|
123
|
+
'width': '200px',
|
|
124
|
+
}"
|
|
125
|
+
:side="popoverSide"
|
|
126
|
+
:align="popoverAlign"
|
|
127
|
+
@mouseenter="handleMouseEnter"
|
|
128
|
+
@mouseleave="handleMouseLeave"
|
|
129
|
+
>
|
|
130
|
+
<!-- Header with title and subtitle -->
|
|
131
|
+
<div v-if="title || subtitle || $slots.title || $slots.subtitle" class="w-full">
|
|
132
|
+
<div v-if="title || $slots.title" class="text-white text-left font-inter text-[12px] font-semibold leading-[16px]" style="font-weight: 580;">
|
|
133
|
+
<slot name="title">
|
|
134
|
+
{{ title }}
|
|
135
|
+
</slot>
|
|
136
|
+
</div>
|
|
137
|
+
<div v-if="subtitle || $slots.subtitle" class="text-[#BDC4CC] text-left font-inter text-[11px] font-medium leading-[124%] tracking-[-0.022px] mt-1">
|
|
138
|
+
<slot name="subtitle">
|
|
139
|
+
{{ subtitle }}
|
|
140
|
+
</slot>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
<!-- List content -->
|
|
145
|
+
<template v-if="items && items.length > 0">
|
|
146
|
+
<div v-if="!nested" class="flex flex-col gap-2px w-full">
|
|
147
|
+
<div
|
|
148
|
+
v-for="(item, index) in items"
|
|
149
|
+
:key="index"
|
|
150
|
+
class="rounded-md"
|
|
151
|
+
>
|
|
152
|
+
<slot name="item" :item="item" :index="index">
|
|
153
|
+
<div class="text-[#D4D9DE] text-left font-inter text-[12px] font-normal leading-[16px] max-w-full truncate">
|
|
154
|
+
{{ item }}
|
|
155
|
+
</div>
|
|
156
|
+
</slot>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
|
|
160
|
+
<!-- Nested display -->
|
|
161
|
+
<div v-else class="w-full">
|
|
162
|
+
<PopoverListNested
|
|
163
|
+
:items="items"
|
|
164
|
+
:variant="nestedVariant"
|
|
165
|
+
:depth="0"
|
|
166
|
+
:has-children-fn="hasChildren"
|
|
167
|
+
:get-children-fn="getChildren"
|
|
168
|
+
>
|
|
169
|
+
<template #item="{ item, index, depth }">
|
|
170
|
+
<slot name="nested-item" :item="item" :index="index" :depth="depth">
|
|
171
|
+
<slot name="item" :item="item" :index="index" />
|
|
172
|
+
</slot>
|
|
173
|
+
</template>
|
|
174
|
+
</PopoverListNested>
|
|
175
|
+
</div>
|
|
176
|
+
</template>
|
|
177
|
+
|
|
178
|
+
<!-- Empty state -->
|
|
179
|
+
<template v-else>
|
|
180
|
+
<slot name="empty">
|
|
181
|
+
<div class="flex flex-col items-start gap-2 w-full">
|
|
182
|
+
<p class="text-[#D4D9DE] text-left font-inter text-[12px] font-normal leading-[16px] w-full">
|
|
183
|
+
{{ $t('common.noItemsAvailable') }}
|
|
184
|
+
</p>
|
|
185
|
+
</div>
|
|
186
|
+
</slot>
|
|
187
|
+
</template>
|
|
188
|
+
</PopoverContent>
|
|
189
|
+
</PopoverPortal>
|
|
190
|
+
</PopoverRoot>
|
|
191
|
+
</template>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps<{
|
|
3
|
+
autoFocus?: boolean
|
|
4
|
+
disabled?: boolean
|
|
5
|
+
modelValue?: boolean
|
|
6
|
+
}>()
|
|
7
|
+
|
|
8
|
+
const checked = defineModel<boolean>()
|
|
9
|
+
|
|
10
|
+
const radioEl = ref<HTMLInputElement | null>(null)
|
|
11
|
+
onMounted(() => {
|
|
12
|
+
if (props.autoFocus) {
|
|
13
|
+
radioEl.value?.focus()
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
function toggle() {
|
|
18
|
+
checked.value = !checked.value
|
|
19
|
+
}
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<template>
|
|
23
|
+
<input
|
|
24
|
+
ref="radioEl"
|
|
25
|
+
type="radio"
|
|
26
|
+
:checked="checked"
|
|
27
|
+
:disabled="disabled"
|
|
28
|
+
b="1px gray-900"
|
|
29
|
+
cursor-pointer
|
|
30
|
+
:class="[checked ? 'bg-gray-900' : 'bg-white hover:bg-gray-200']"
|
|
31
|
+
class="form-radio focus:ring-1 focus:ring-gray-200 text-gray-900"
|
|
32
|
+
@change="toggle"
|
|
33
|
+
>
|
|
34
|
+
</template>
|
|
35
|
+
|
|
36
|
+
<style>
|
|
37
|
+
.form-radio:checked {
|
|
38
|
+
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.form-radio:checked {
|
|
42
|
+
background-color: currentColor;
|
|
43
|
+
background-position: 50%;
|
|
44
|
+
background-repeat: no-repeat;
|
|
45
|
+
background-size: 100% 100%;
|
|
46
|
+
border-color: transparent;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.form-radio {
|
|
50
|
+
border-radius: 100%;
|
|
51
|
+
-webkit-appearance: none;
|
|
52
|
+
-moz-appearance: none;
|
|
53
|
+
appearance: none;
|
|
54
|
+
display: inline-block;
|
|
55
|
+
flex-shrink: 0;
|
|
56
|
+
height: 1rem;
|
|
57
|
+
padding: 0;
|
|
58
|
+
-webkit-print-color-adjust: exact;
|
|
59
|
+
print-color-adjust: exact;
|
|
60
|
+
-webkit-user-select: none;
|
|
61
|
+
-moz-user-select: none;
|
|
62
|
+
user-select: none;
|
|
63
|
+
vertical-align: middle;
|
|
64
|
+
width: 1rem;
|
|
65
|
+
}
|
|
66
|
+
</style>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { RadioGroupItemProps } from 'reka-ui'
|
|
3
|
+
import type { HTMLAttributes } from 'vue'
|
|
4
|
+
import {
|
|
5
|
+
RadioGroupIndicator,
|
|
6
|
+
RadioGroupItem,
|
|
7
|
+
useForwardProps,
|
|
8
|
+
} from 'reka-ui'
|
|
9
|
+
import { computed } from 'vue'
|
|
10
|
+
|
|
11
|
+
const props = defineProps<RadioGroupItemProps & { class?: HTMLAttributes['class'] }>()
|
|
12
|
+
|
|
13
|
+
const delegatedProps = computed(() => {
|
|
14
|
+
const { class: _, ...delegated } = props
|
|
15
|
+
|
|
16
|
+
return delegated
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const forwardedProps = useForwardProps(delegatedProps)
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<template>
|
|
23
|
+
<RadioGroupItem
|
|
24
|
+
v-bind="forwardedProps"
|
|
25
|
+
:class="
|
|
26
|
+
cn(
|
|
27
|
+
'peer aspect-square w-16px h-16px rounded-full border-[1px] border-gray-300 bg-white-1000 hover:bg-gray-50 hover:border-gray-400 disabled:border-gray-200 disabled:bg-gray-100',
|
|
28
|
+
'data-[state=checked]:bg-gray-700 data-[state=checked]:hover:bg-gray-950 disabled:data-[state=checked]:bg-gray-400 data-[state=checked]:!border-transparent',
|
|
29
|
+
'focus:outline-none focus-visible:ring-1 focus-visible:ring-cyan-600 focus-visible:ring-offset-2 disabled:cursor-not-allowed',
|
|
30
|
+
props.class,
|
|
31
|
+
)
|
|
32
|
+
"
|
|
33
|
+
>
|
|
34
|
+
<RadioGroupIndicator
|
|
35
|
+
class="flex items-center justify-center"
|
|
36
|
+
>
|
|
37
|
+
<TelaIcon name="i-ph-circle-fill" color="white-1000" size="6px" />
|
|
38
|
+
</RadioGroupIndicator>
|
|
39
|
+
</RadioGroupItem>
|
|
40
|
+
</template>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { RadioGroupRoot, useForwardPropsEmits } from 'reka-ui'
|
|
3
|
+
import type { RadioGroupRootEmits, RadioGroupRootProps } from 'reka-ui'
|
|
4
|
+
import { computed } from 'vue'
|
|
5
|
+
import type { HTMLAttributes } from 'vue'
|
|
6
|
+
|
|
7
|
+
const props = defineProps<RadioGroupRootProps & { class?: HTMLAttributes['class'] }>()
|
|
8
|
+
const emits = defineEmits<RadioGroupRootEmits>()
|
|
9
|
+
|
|
10
|
+
const delegatedProps = computed(() => {
|
|
11
|
+
const { class: _, ...delegated } = props
|
|
12
|
+
|
|
13
|
+
return delegated
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const forwarded = useForwardPropsEmits(delegatedProps, emits)
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<template>
|
|
20
|
+
<RadioGroupRoot
|
|
21
|
+
:class="cn('grid gap-2', props.class)"
|
|
22
|
+
v-bind="forwarded"
|
|
23
|
+
>
|
|
24
|
+
<slot />
|
|
25
|
+
</RadioGroupRoot>
|
|
26
|
+
</template>
|