@nuxt/ui 3.0.2 → 3.1.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 (220) hide show
  1. package/.nuxt/ui/accordion.ts +25 -4
  2. package/.nuxt/ui/alert.ts +52 -31
  3. package/.nuxt/ui/avatar-group.ts +24 -3
  4. package/.nuxt/ui/avatar.ts +26 -5
  5. package/.nuxt/ui/badge.ts +56 -35
  6. package/.nuxt/ui/breadcrumb.ts +28 -7
  7. package/.nuxt/ui/button-group.ts +23 -2
  8. package/.nuxt/ui/button.ts +66 -45
  9. package/.nuxt/ui/calendar.ts +39 -18
  10. package/.nuxt/ui/card.ts +28 -7
  11. package/.nuxt/ui/carousel.ts +29 -8
  12. package/.nuxt/ui/checkbox-group.ts +82 -0
  13. package/.nuxt/ui/checkbox.ts +163 -29
  14. package/.nuxt/ui/chip.ts +31 -10
  15. package/.nuxt/ui/collapsible.ts +23 -2
  16. package/.nuxt/ui/color-picker.ts +26 -5
  17. package/.nuxt/ui/command-palette.ts +37 -16
  18. package/.nuxt/ui/container.ts +23 -2
  19. package/.nuxt/ui/context-menu.ts +56 -35
  20. package/.nuxt/ui/drawer.ts +33 -12
  21. package/.nuxt/ui/dropdown-menu.ts +57 -36
  22. package/.nuxt/ui/form-field.ts +29 -8
  23. package/.nuxt/ui/form.ts +23 -2
  24. package/.nuxt/ui/index.ts +1 -0
  25. package/.nuxt/ui/input-menu.ts +65 -44
  26. package/.nuxt/ui/input-number.ts +43 -22
  27. package/.nuxt/ui/input.ts +46 -25
  28. package/.nuxt/ui/kbd.ts +27 -6
  29. package/.nuxt/ui/link.ts +26 -5
  30. package/.nuxt/ui/modal.ts +28 -7
  31. package/.nuxt/ui/navigation-menu.ts +102 -83
  32. package/.nuxt/ui/pagination.ts +23 -2
  33. package/.nuxt/ui/pin-input.ts +43 -22
  34. package/.nuxt/ui/popover.ts +25 -4
  35. package/.nuxt/ui/progress.ts +40 -19
  36. package/.nuxt/ui/radio-group.ts +273 -37
  37. package/.nuxt/ui/select-menu.ts +59 -35
  38. package/.nuxt/ui/select.ts +55 -34
  39. package/.nuxt/ui/separator.ts +31 -10
  40. package/.nuxt/ui/skeleton.ts +24 -3
  41. package/.nuxt/ui/slideover.ts +27 -6
  42. package/.nuxt/ui/slider.ts +39 -18
  43. package/.nuxt/ui/stepper.ts +41 -20
  44. package/.nuxt/ui/switch.ts +43 -22
  45. package/.nuxt/ui/table.ts +38 -17
  46. package/.nuxt/ui/tabs.ts +55 -34
  47. package/.nuxt/ui/textarea.ts +63 -37
  48. package/.nuxt/ui/toast.ts +47 -26
  49. package/.nuxt/ui/toaster.ts +23 -2
  50. package/.nuxt/ui/tooltip.ts +25 -4
  51. package/.nuxt/ui/tree.ts +41 -20
  52. package/.nuxt/ui.css +56 -12
  53. package/README.md +11 -0
  54. package/cli/templates.mjs +18 -17
  55. package/dist/module.json +5 -5
  56. package/dist/module.mjs +11 -7
  57. package/dist/runtime/components/Accordion.vue +36 -93
  58. package/dist/runtime/components/Accordion.vue.d.ts +91 -0
  59. package/dist/runtime/components/Alert.vue +37 -100
  60. package/dist/runtime/components/Alert.vue.d.ts +96 -0
  61. package/dist/runtime/components/App.vue +28 -34
  62. package/dist/runtime/components/App.vue.d.ts +24 -0
  63. package/dist/runtime/components/Avatar.vue +42 -75
  64. package/dist/runtime/components/Avatar.vue.d.ts +60 -0
  65. package/dist/runtime/components/AvatarGroup.vue +40 -77
  66. package/dist/runtime/components/AvatarGroup.vue.d.ts +40 -0
  67. package/dist/runtime/components/Badge.vue +33 -62
  68. package/dist/runtime/components/Badge.vue.d.ts +62 -0
  69. package/dist/runtime/components/Breadcrumb.vue +37 -90
  70. package/dist/runtime/components/Breadcrumb.vue.d.ts +82 -0
  71. package/dist/runtime/components/Button.vue +95 -104
  72. package/dist/runtime/components/Button.vue.d.ts +73 -0
  73. package/dist/runtime/components/ButtonGroup.vue +20 -46
  74. package/dist/runtime/components/ButtonGroup.vue.d.ts +55 -0
  75. package/dist/runtime/components/Calendar.vue +67 -150
  76. package/dist/runtime/components/Calendar.vue.d.ts +107 -0
  77. package/dist/runtime/components/Card.vue +18 -40
  78. package/dist/runtime/components/Card.vue.d.ts +38 -0
  79. package/dist/runtime/components/Carousel.vue +112 -234
  80. package/dist/runtime/components/Carousel.vue.d.ts +120 -0
  81. package/dist/runtime/components/Checkbox.vue +52 -93
  82. package/dist/runtime/components/Checkbox.vue.d.ts +76 -0
  83. package/dist/runtime/components/CheckboxGroup.vue +121 -0
  84. package/dist/runtime/components/CheckboxGroup.vue.d.ts +75 -0
  85. package/dist/runtime/components/Chip.vue +26 -69
  86. package/dist/runtime/components/Chip.vue.d.ts +71 -0
  87. package/dist/runtime/components/Collapsible.vue +22 -41
  88. package/dist/runtime/components/Collapsible.vue.d.ts +50 -0
  89. package/dist/runtime/components/ColorPicker.vue +111 -197
  90. package/dist/runtime/components/ColorPicker.vue.d.ts +63 -0
  91. package/dist/runtime/components/CommandPalette.vue +96 -237
  92. package/dist/runtime/components/CommandPalette.vue.d.ts +173 -0
  93. package/dist/runtime/components/Container.vue +15 -28
  94. package/dist/runtime/components/Container.vue.d.ts +27 -0
  95. package/dist/runtime/components/ContextMenu.vue +34 -133
  96. package/dist/runtime/components/ContextMenu.vue.d.ts +127 -0
  97. package/dist/runtime/components/ContextMenuContent.vue +73 -81
  98. package/dist/runtime/components/ContextMenuContent.vue.d.ts +105 -0
  99. package/dist/runtime/components/Drawer.vue +49 -83
  100. package/dist/runtime/components/Drawer.vue.d.ts +88 -0
  101. package/dist/runtime/components/DropdownMenu.vue +39 -142
  102. package/dist/runtime/components/DropdownMenu.vue.d.ts +141 -0
  103. package/dist/runtime/components/DropdownMenuContent.vue +78 -88
  104. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +55 -0
  105. package/dist/runtime/components/Form.vue +135 -220
  106. package/dist/runtime/components/Form.vue.d.ts +66 -0
  107. package/dist/runtime/components/FormField.vue +35 -77
  108. package/dist/runtime/components/FormField.vue.d.ts +70 -0
  109. package/dist/runtime/components/Icon.vue +12 -19
  110. package/dist/runtime/components/Icon.vue.d.ts +17 -0
  111. package/dist/runtime/components/Input.vue +82 -140
  112. package/dist/runtime/components/Input.vue.d.ts +91 -0
  113. package/dist/runtime/components/InputMenu.vue +185 -332
  114. package/dist/runtime/components/InputMenu.vue.d.ts +312 -0
  115. package/dist/runtime/components/InputNumber.vue +71 -133
  116. package/dist/runtime/components/InputNumber.vue.d.ts +193 -0
  117. package/dist/runtime/components/Kbd.vue +20 -46
  118. package/dist/runtime/components/Kbd.vue.d.ts +55 -0
  119. package/dist/runtime/components/Link.vue +98 -176
  120. package/dist/runtime/components/Link.vue.d.ts +124 -0
  121. package/dist/runtime/components/LinkBase.vue +33 -42
  122. package/dist/runtime/components/LinkBase.vue.d.ts +48 -0
  123. package/dist/runtime/components/Modal.vue +53 -116
  124. package/dist/runtime/components/Modal.vue.d.ts +109 -0
  125. package/dist/runtime/components/NavigationMenu.vue +77 -209
  126. package/dist/runtime/components/NavigationMenu.vue.d.ts +159 -0
  127. package/dist/runtime/components/OverlayProvider.vue +14 -18
  128. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -0
  129. package/dist/runtime/components/Pagination.vue +46 -140
  130. package/dist/runtime/components/Pagination.vue.d.ts +143 -0
  131. package/dist/runtime/components/PinInput.vue +61 -78
  132. package/dist/runtime/components/PinInput.vue.d.ts +68 -0
  133. package/dist/runtime/components/Popover.vue +47 -84
  134. package/dist/runtime/components/Popover.vue.d.ts +80 -0
  135. package/dist/runtime/components/Progress.vue +70 -131
  136. package/dist/runtime/components/Progress.vue.d.ts +97 -0
  137. package/dist/runtime/components/RadioGroup.vue +70 -132
  138. package/dist/runtime/components/RadioGroup.vue.d.ts +88 -0
  139. package/dist/runtime/components/Select.vue +110 -224
  140. package/dist/runtime/components/Select.vue.d.ts +139 -0
  141. package/dist/runtime/components/SelectMenu.vue +161 -310
  142. package/dist/runtime/components/SelectMenu.vue.d.ts +184 -0
  143. package/dist/runtime/components/Separator.vue +29 -71
  144. package/dist/runtime/components/Separator.vue.d.ts +75 -0
  145. package/dist/runtime/components/Skeleton.vue +21 -23
  146. package/dist/runtime/components/Skeleton.vue.d.ts +26 -0
  147. package/dist/runtime/components/Slideover.vue +53 -120
  148. package/dist/runtime/components/Slideover.vue.d.ts +111 -0
  149. package/dist/runtime/components/Slider.vue +46 -84
  150. package/dist/runtime/components/Slider.vue.d.ts +71 -0
  151. package/dist/runtime/components/Stepper.vue +45 -115
  152. package/dist/runtime/components/Stepper.vue.d.ts +89 -0
  153. package/dist/runtime/components/Switch.vue +45 -93
  154. package/dist/runtime/components/Switch.vue.d.ts +73 -0
  155. package/dist/runtime/components/Table.vue +163 -267
  156. package/dist/runtime/components/Table.vue.d.ts +183 -0
  157. package/dist/runtime/components/Tabs.vue +41 -107
  158. package/dist/runtime/components/Tabs.vue.d.ts +104 -0
  159. package/dist/runtime/components/Textarea.vue +113 -158
  160. package/dist/runtime/components/Textarea.vue.d.ts +95 -0
  161. package/dist/runtime/components/Toast.vue +49 -110
  162. package/dist/runtime/components/Toast.vue.d.ts +95 -0
  163. package/dist/runtime/components/Toaster.vue +70 -107
  164. package/dist/runtime/components/Toaster.vue.d.ts +63 -0
  165. package/dist/runtime/components/Tooltip.vue +38 -65
  166. package/dist/runtime/components/Tooltip.vue.d.ts +65 -0
  167. package/dist/runtime/components/Tree.vue +59 -166
  168. package/dist/runtime/components/Tree.vue.d.ts +128 -0
  169. package/dist/runtime/composables/defineShortcuts.d.ts +1 -1
  170. package/dist/runtime/composables/useAvatarGroup.d.ts +1 -1
  171. package/dist/runtime/composables/useButtonGroup.d.ts +2 -2
  172. package/dist/runtime/composables/useFormField.d.ts +2 -2
  173. package/dist/runtime/composables/useOverlay.d.ts +14 -7
  174. package/dist/runtime/composables/useOverlay.js +14 -6
  175. package/dist/runtime/composables/usePortal.d.ts +6 -0
  176. package/dist/runtime/composables/usePortal.js +17 -0
  177. package/dist/runtime/index.css +1 -1
  178. package/dist/runtime/inertia/components/Link.vue +146 -0
  179. package/dist/runtime/inertia/components/Link.vue.d.ts +92 -0
  180. package/dist/runtime/inertia/stubs.d.ts +43 -0
  181. package/dist/runtime/inertia/stubs.js +82 -0
  182. package/dist/runtime/locale/bg.d.ts +3 -0
  183. package/dist/runtime/locale/bg.js +54 -0
  184. package/dist/runtime/locale/index.d.ts +5 -1
  185. package/dist/runtime/locale/index.js +5 -1
  186. package/dist/runtime/locale/kk.d.ts +3 -0
  187. package/dist/runtime/locale/kk.js +54 -0
  188. package/dist/runtime/locale/tj.d.ts +3 -0
  189. package/dist/runtime/locale/tj.js +54 -0
  190. package/dist/runtime/locale/ug_cn.d.ts +3 -0
  191. package/dist/runtime/locale/ug_cn.js +55 -0
  192. package/dist/runtime/types/form.d.ts +4 -1
  193. package/dist/runtime/types/index.d.ts +1 -0
  194. package/dist/runtime/types/index.js +1 -0
  195. package/dist/runtime/types/utils.d.ts +47 -7
  196. package/dist/runtime/utils/link.d.ts +3 -3
  197. package/dist/runtime/utils/link.js +1 -0
  198. package/dist/runtime/utils/tv.js +2 -2
  199. package/dist/runtime/vue/components/Icon.vue +7 -8
  200. package/dist/runtime/vue/components/Icon.vue.d.ts +14 -0
  201. package/dist/runtime/vue/components/Link.vue +118 -202
  202. package/dist/runtime/vue/components/Link.vue.d.ts +124 -0
  203. package/dist/runtime/vue/stubs.d.ts +2 -2
  204. package/dist/shared/{ui.BkNUP964.mjs → ui.D7lOOabO.mjs} +621 -362
  205. package/dist/types.d.mts +3 -5
  206. package/dist/unplugin.d.mts +4 -0
  207. package/dist/unplugin.mjs +25 -4
  208. package/dist/vite.mjs +1 -1
  209. package/package.json +94 -53
  210. package/dist/module.cjs +0 -62
  211. package/dist/module.d.cts +0 -45
  212. package/dist/module.d.ts +0 -45
  213. package/dist/shared/ui.BL-XB3u1.cjs +0 -3555
  214. package/dist/types.d.ts +0 -7
  215. package/dist/unplugin.cjs +0 -232
  216. package/dist/unplugin.d.cts +0 -62
  217. package/dist/unplugin.d.ts +0 -62
  218. package/dist/vite.cjs +0 -23
  219. package/dist/vite.d.cts +0 -15
  220. package/dist/vite.d.ts +0 -15
@@ -1,168 +1,61 @@
1
- <!-- eslint-disable vue/block-tag-newline -->
2
- <script lang="ts">
3
- import type { VariantProps } from 'tailwind-variants'
4
- import type { TreeRootProps, TreeRootEmits } from 'reka-ui'
5
- import type { AppConfig } from '@nuxt/schema'
6
- import _appConfig from '#build/app.config'
7
- import theme from '#build/ui/tree'
8
- import { tv } from '../utils/tv'
9
- import type {
10
- DynamicSlots,
11
- GetItemKeys,
12
- GetModelValue,
13
- GetModelValueEmits,
14
- NestedItem,
15
- PartialString
16
- } from '../types/utils'
17
-
18
- const appConfig = _appConfig as AppConfig & { ui: { tree: Partial<typeof theme> } }
19
-
20
- const tree = tv({ extend: tv(theme), ...(appConfig.ui?.tree || {}) })
21
-
22
- type TreeVariants = VariantProps<typeof tree>
23
-
24
- export type TreeItem = {
25
- /**
26
- * @IconifyIcon
27
- */
28
- icon?: string
29
- label?: string
30
- /**
31
- * @IconifyIcon
32
- */
33
- trailingIcon?: string
34
- defaultExpanded?: boolean
35
- disabled?: boolean
36
- value?: string
37
- slot?: string
38
- children?: TreeItem[]
39
- onToggle?(e: Event): void
40
- onSelect?(e?: Event): void
41
- [key: string]: any
42
- }
43
-
44
- export interface TreeProps<T extends TreeItem[] = TreeItem[], VK extends GetItemKeys<T> = 'value', M extends boolean = false> extends Pick<TreeRootProps<T>, 'expanded' | 'defaultExpanded' | 'selectionBehavior' | 'propagateSelect' | 'disabled'> {
45
- /**
46
- * The element or component this component should render as.
47
- * @defaultValue 'ul'
48
- */
49
- as?: any
50
- /**
51
- * @defaultValue 'primary'
52
- */
53
- color?: TreeVariants['color']
54
- /**
55
- * @defaultValue 'md'
56
- */
57
- size?: TreeVariants['size']
58
- /**
59
- * The key used to get the value from the item.
60
- * @defaultValue 'value'
61
- */
62
- valueKey?: VK
63
- /**
64
- * The key used to get the label from the item.
65
- * @defaultValue 'label'
66
- */
67
- labelKey?: keyof NestedItem<T>
68
- /**
69
- * The icon displayed on the right side of a parent node.
70
- * @defaultValue appConfig.ui.icons.chevronDown
71
- * @IconifyIcon
72
- */
73
- trailingIcon?: string
74
- /**
75
- * The icon displayed when a parent node is expanded.
76
- * @defaultValue appConfig.ui.icons.folderOpen
77
- * @IconifyIcon
78
- */
79
- expandedIcon?: string
80
- /**
81
- * The icon displayed when a parent node is collapsed.
82
- * @defaultValue appConfig.ui.icons.folder
83
- * @IconifyIcon
84
- */
85
- collapsedIcon?: string
86
- items?: T
87
- /** The controlled value of the Tree. Can be bind as `v-model`. */
88
- modelValue?: GetModelValue<T, VK, M>
89
- /** The value of the Tree when initially rendered. Use when you do not need to control the state of the Tree. */
90
- defaultValue?: GetModelValue<T, VK, M>
91
- /** Whether multiple options can be selected or not. */
92
- multiple?: M & boolean
93
- class?: any
94
- ui?: PartialString<typeof tree.slots>
95
- }
96
-
97
- export type TreeEmits<A extends TreeItem[], VK extends GetItemKeys<A> | undefined, M extends boolean> = Omit<TreeRootEmits, 'update:modelValue'> & GetModelValueEmits<A, VK, M>
98
-
99
- type SlotProps<T extends TreeItem> = (props: { item: T, index: number, level: number, expanded: boolean, selected: boolean }) => any
100
-
101
- export type TreeSlots<
102
- A extends TreeItem[] = TreeItem[],
103
- T extends NestedItem<A> = NestedItem<A>
104
- > = {
105
- 'item': SlotProps<T>
106
- 'item-leading': SlotProps<T>
107
- 'item-label': SlotProps<T>
108
- 'item-trailing': SlotProps<T>
109
- } & DynamicSlots<T, undefined, { index: number, level: number, expanded: boolean, selected: boolean }>
110
-
1
+ <script>
2
+ import theme from "#build/ui/tree";
111
3
  </script>
112
4
 
113
- <script setup lang="ts" generic="T extends TreeItem[], VK extends GetItemKeys<T> = 'value', M extends boolean = false">
114
- import { computed } from 'vue'
115
- import type { PropType } from 'vue'
116
- import { TreeRoot, TreeItem, useForwardPropsEmits } from 'reka-ui'
117
- import { reactivePick, createReusableTemplate } from '@vueuse/core'
118
- import { get } from '../utils'
119
- import UIcon from './Icon.vue'
120
-
121
- const props = withDefaults(defineProps<TreeProps<T, VK, M>>(), {
122
- labelKey: 'label' as never,
123
- valueKey: 'value' as never
124
- })
125
- const emits = defineEmits<TreeEmits<T, VK, M>>()
126
- const slots = defineSlots<TreeSlots<T>>()
127
-
128
- const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'modelValue', 'defaultValue', 'items', 'multiple', 'expanded', 'disabled', 'propagateSelect'), emits)
129
-
130
- const [DefineTreeTemplate, ReuseTreeTemplate] = createReusableTemplate<
131
- { items?: NestedItem<T>[], level: number },
132
- TreeSlots<T>
133
- >({
134
- props: {
135
- items: Array as PropType<NestedItem<T>[]>,
136
- level: Number
137
- }
138
- })
139
-
140
- const ui = computed(() => tree({
5
+ <script setup>
6
+ import { computed } from "vue";
7
+ import { TreeRoot, TreeItem, useForwardPropsEmits } from "reka-ui";
8
+ import { reactivePick, createReusableTemplate } from "@vueuse/core";
9
+ import { useAppConfig } from "#imports";
10
+ import { get } from "../utils";
11
+ import { tv } from "../utils/tv";
12
+ import UIcon from "./Icon.vue";
13
+ const props = defineProps({
14
+ as: { type: null, required: false },
15
+ color: { type: null, required: false },
16
+ size: { type: null, required: false },
17
+ valueKey: { type: null, required: false, default: "value" },
18
+ labelKey: { type: null, required: false, default: "label" },
19
+ trailingIcon: { type: String, required: false },
20
+ expandedIcon: { type: String, required: false },
21
+ collapsedIcon: { type: String, required: false },
22
+ items: { type: null, required: false },
23
+ modelValue: { type: null, required: false },
24
+ defaultValue: { type: null, required: false },
25
+ multiple: { type: Boolean, required: false },
26
+ class: { type: null, required: false },
27
+ ui: { type: null, required: false },
28
+ expanded: { type: Array, required: false },
29
+ defaultExpanded: { type: Array, required: false },
30
+ selectionBehavior: { type: String, required: false },
31
+ propagateSelect: { type: Boolean, required: false },
32
+ disabled: { type: Boolean, required: false }
33
+ });
34
+ const emits = defineEmits(["update:expanded", "update:modelValue"]);
35
+ const slots = defineSlots();
36
+ const appConfig = useAppConfig();
37
+ const rootProps = useForwardPropsEmits(reactivePick(props, "as", "modelValue", "defaultValue", "items", "multiple", "expanded", "disabled", "propagateSelect"), emits);
38
+ const [DefineTreeTemplate, ReuseTreeTemplate] = createReusableTemplate();
39
+ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.tree || {} })({
141
40
  color: props.color,
142
41
  size: props.size
143
- }))
144
-
145
- function getItemLabel(item: NestedItem<T>): string {
146
- return get(item, props.labelKey as string)
42
+ }));
43
+ function getItemLabel(item) {
44
+ return get(item, props.labelKey);
147
45
  }
148
-
149
- function getItemValue(item: NestedItem<T>): string {
150
- return get(item, props.valueKey as string) ?? get(item, props.labelKey as string)
46
+ function getItemValue(item) {
47
+ return get(item, props.valueKey) ?? get(item, props.labelKey);
151
48
  }
152
-
153
- function getDefaultOpenedItems(item: NestedItem<T>): string[] {
154
- const currentItem = item.defaultExpanded ? getItemValue(item) : null
155
- const childItems = item.children?.flatMap((child: TreeItem) => getDefaultOpenedItems(child as NestedItem<T>)) ?? []
156
-
157
- return [currentItem, ...childItems].filter(Boolean) as string[]
49
+ function getDefaultOpenedItems(item) {
50
+ const currentItem = item.defaultExpanded ? getItemValue(item) : null;
51
+ const childItems = item.children?.flatMap((child) => getDefaultOpenedItems(child)) ?? [];
52
+ return [currentItem, ...childItems].filter(Boolean);
158
53
  }
159
-
160
- const defaultExpanded = computed(() =>
161
- props.defaultExpanded ?? props.items?.flatMap(item => getDefaultOpenedItems(item as NestedItem<T>))
162
- )
54
+ const defaultExpanded = computed(
55
+ () => props.defaultExpanded ?? props.items?.flatMap((item) => getDefaultOpenedItems(item))
56
+ );
163
57
  </script>
164
58
 
165
- <!-- eslint-disable vue/no-template-shadow -->
166
59
  <template>
167
60
  <DefineTreeTemplate v-slot="{ items, level }">
168
61
  <li
@@ -179,8 +72,8 @@ const defaultExpanded = computed(() =>
179
72
  @select="item.onSelect"
180
73
  >
181
74
  <button :disabled="item.disabled || disabled" :class="ui.link({ class: props.ui?.link, selected: isSelected, disabled: item.disabled || disabled })">
182
- <slot :name="((item.slot || 'item') as keyof TreeSlots<T>)" v-bind="{ index, level, expanded: isExpanded, selected: isSelected }" :item="(item as Extract<NestedItem<T>, { slot: string; }>)">
183
- <slot :name="((item.slot ? `${item.slot}-leading`: 'item-leading') as keyof TreeSlots<T>)" v-bind="{ index, level, expanded: isExpanded, selected: isSelected }" :item="(item as Extract<NestedItem<T>, { slot: string; }>)">
75
+ <slot :name="item.slot || 'item'" v-bind="{ index, level, expanded: isExpanded, selected: isSelected }" :item="item">
76
+ <slot :name="item.slot ? `${item.slot}-leading` : 'item-leading'" v-bind="{ index, level, expanded: isExpanded, selected: isSelected }" :item="item">
184
77
  <UIcon
185
78
  v-if="item.icon"
186
79
  :name="item.icon"
@@ -188,19 +81,19 @@ const defaultExpanded = computed(() =>
188
81
  />
189
82
  <UIcon
190
83
  v-else-if="item.children?.length"
191
- :name="isExpanded ? (expandedIcon ?? appConfig.ui.icons.folderOpen) : (collapsedIcon ?? appConfig.ui.icons.folder)"
84
+ :name="isExpanded ? expandedIcon ?? appConfig.ui.icons.folderOpen : collapsedIcon ?? appConfig.ui.icons.folder"
192
85
  :class="ui.linkLeadingIcon({ class: props.ui?.linkLeadingIcon })"
193
86
  />
194
87
  </slot>
195
88
 
196
- <span v-if="getItemLabel(item) || !!slots[(item.slot ? `${item.slot}-label`: 'item-label') as keyof TreeSlots<T>]" :class="ui.linkLabel({ class: props.ui?.linkLabel })">
197
- <slot :name="((item.slot ? `${item.slot}-label`: 'item-label') as keyof TreeSlots<T>)" v-bind="{ item, index, level, expanded: isExpanded, selected: isSelected }" :item="(item as Extract<NestedItem<T>, { slot: string; }>)">
89
+ <span v-if="getItemLabel(item) || !!slots[item.slot ? `${item.slot}-label` : 'item-label']" :class="ui.linkLabel({ class: props.ui?.linkLabel })">
90
+ <slot :name="item.slot ? `${item.slot}-label` : 'item-label'" v-bind="{ item, index, level, expanded: isExpanded, selected: isSelected }" :item="item">
198
91
  {{ getItemLabel(item) }}
199
92
  </slot>
200
93
  </span>
201
94
 
202
- <span v-if="item.trailingIcon || item.children?.length || !!slots[(item.slot ? `${item.slot}-trailing`: 'item-trailing') as keyof TreeSlots<T>]" :class="ui.linkTrailing({ class: props.ui?.linkTrailing })">
203
- <slot :name="((item.slot ? `${item.slot}-trailing`: 'item-trailing') as keyof TreeSlots<T>)" v-bind="{ item, index, level, expanded: isExpanded, selected: isSelected }" :item="(item as Extract<NestedItem<T>, { slot: string; }>)">
95
+ <span v-if="item.trailingIcon || item.children?.length || !!slots[item.slot ? `${item.slot}-trailing` : 'item-trailing']" :class="ui.linkTrailing({ class: props.ui?.linkTrailing })">
96
+ <slot :name="item.slot ? `${item.slot}-trailing` : 'item-trailing'" v-bind="{ item, index, level, expanded: isExpanded, selected: isSelected }" :item="item">
204
97
  <UIcon v-if="item.trailingIcon" :name="item.trailingIcon" :class="ui.linkTrailingIcon({ class: props.ui?.linkTrailingIcon })" />
205
98
  <UIcon v-else-if="item.children?.length" :name="trailingIcon ?? appConfig.ui.icons.chevronDown" :class="ui.linkTrailingIcon({ class: props.ui?.linkTrailingIcon })" />
206
99
  </slot>
@@ -209,19 +102,19 @@ const defaultExpanded = computed(() =>
209
102
  </button>
210
103
 
211
104
  <ul v-if="item.children?.length && isExpanded" :class="ui.listWithChildren({ class: props.ui?.listWithChildren })">
212
- <ReuseTreeTemplate :items="(item.children as NestedItem<T>[])" :level="level + 1" />
105
+ <ReuseTreeTemplate :items="item.children" :level="level + 1" />
213
106
  </ul>
214
107
  </TreeItem>
215
108
  </li>
216
109
  </DefineTreeTemplate>
217
110
 
218
111
  <TreeRoot
219
- v-bind="(rootProps as unknown as TreeRootProps<NestedItem<T>>)"
112
+ v-bind="rootProps"
220
113
  :class="ui.root({ class: [props.class, props.ui?.root] })"
221
114
  :get-key="getItemValue"
222
115
  :default-expanded="defaultExpanded"
223
116
  :selection-behavior="selectionBehavior"
224
117
  >
225
- <ReuseTreeTemplate :items="(items as NestedItem<T>[] | undefined)" :level="0" />
118
+ <ReuseTreeTemplate :items="items" :level="0" />
226
119
  </TreeRoot>
227
120
  </template>
@@ -0,0 +1,128 @@
1
+ import type { TreeRootProps, TreeRootEmits } from 'reka-ui';
2
+ import type { AppConfig } from '@nuxt/schema';
3
+ import theme from '#build/ui/tree';
4
+ import type { DynamicSlots, GetItemKeys, GetModelValue, GetModelValueEmits, NestedItem, ComponentConfig } from '../types/utils';
5
+ type Tree = ComponentConfig<typeof theme, AppConfig, 'tree'>;
6
+ export type TreeItem = {
7
+ /**
8
+ * @IconifyIcon
9
+ */
10
+ icon?: string;
11
+ label?: string;
12
+ /**
13
+ * @IconifyIcon
14
+ */
15
+ trailingIcon?: string;
16
+ defaultExpanded?: boolean;
17
+ disabled?: boolean;
18
+ value?: string;
19
+ slot?: string;
20
+ children?: TreeItem[];
21
+ onToggle?(e: Event): void;
22
+ onSelect?(e?: Event): void;
23
+ [key: string]: any;
24
+ };
25
+ export interface TreeProps<T extends TreeItem[] = TreeItem[], VK extends GetItemKeys<T> = 'value', M extends boolean = false> extends Pick<TreeRootProps<T>, 'expanded' | 'defaultExpanded' | 'selectionBehavior' | 'propagateSelect' | 'disabled'> {
26
+ /**
27
+ * The element or component this component should render as.
28
+ * @defaultValue 'ul'
29
+ */
30
+ as?: any;
31
+ /**
32
+ * @defaultValue 'primary'
33
+ */
34
+ color?: Tree['variants']['color'];
35
+ /**
36
+ * @defaultValue 'md'
37
+ */
38
+ size?: Tree['variants']['size'];
39
+ /**
40
+ * The key used to get the value from the item.
41
+ * @defaultValue 'value'
42
+ */
43
+ valueKey?: VK;
44
+ /**
45
+ * The key used to get the label from the item.
46
+ * @defaultValue 'label'
47
+ */
48
+ labelKey?: keyof NestedItem<T>;
49
+ /**
50
+ * The icon displayed on the right side of a parent node.
51
+ * @defaultValue appConfig.ui.icons.chevronDown
52
+ * @IconifyIcon
53
+ */
54
+ trailingIcon?: string;
55
+ /**
56
+ * The icon displayed when a parent node is expanded.
57
+ * @defaultValue appConfig.ui.icons.folderOpen
58
+ * @IconifyIcon
59
+ */
60
+ expandedIcon?: string;
61
+ /**
62
+ * The icon displayed when a parent node is collapsed.
63
+ * @defaultValue appConfig.ui.icons.folder
64
+ * @IconifyIcon
65
+ */
66
+ collapsedIcon?: string;
67
+ items?: T;
68
+ /** The controlled value of the Tree. Can be bind as `v-model`. */
69
+ modelValue?: GetModelValue<T, VK, M>;
70
+ /** The value of the Tree when initially rendered. Use when you do not need to control the state of the Tree. */
71
+ defaultValue?: GetModelValue<T, VK, M>;
72
+ /** Whether multiple options can be selected or not. */
73
+ multiple?: M & boolean;
74
+ class?: any;
75
+ ui?: Tree['slots'];
76
+ }
77
+ export type TreeEmits<A extends TreeItem[], VK extends GetItemKeys<A> | undefined, M extends boolean> = Omit<TreeRootEmits, 'update:modelValue'> & GetModelValueEmits<A, VK, M>;
78
+ type SlotProps<T extends TreeItem> = (props: {
79
+ item: T;
80
+ index: number;
81
+ level: number;
82
+ expanded: boolean;
83
+ selected: boolean;
84
+ }) => any;
85
+ export type TreeSlots<A extends TreeItem[] = TreeItem[], T extends NestedItem<A> = NestedItem<A>> = {
86
+ 'item': SlotProps<T>;
87
+ 'item-leading': SlotProps<T>;
88
+ 'item-label': SlotProps<T>;
89
+ 'item-trailing': SlotProps<T>;
90
+ } & DynamicSlots<T, undefined, {
91
+ index: number;
92
+ level: number;
93
+ expanded: boolean;
94
+ selected: boolean;
95
+ }>;
96
+ declare const _default: <T extends TreeItem[], VK extends GetItemKeys<T> = "value", M extends boolean = false>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
97
+ props: __VLS_PrettifyLocal<any & TreeProps<T, VK, M> & Partial<{}>> & (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps);
98
+ expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
99
+ attrs: any;
100
+ slots: Readonly<{
101
+ item: SlotProps<NestedItem<T>>;
102
+ 'item-leading': SlotProps<NestedItem<T>>;
103
+ 'item-label': SlotProps<NestedItem<T>>;
104
+ 'item-trailing': SlotProps<NestedItem<T>>;
105
+ } & DynamicSlots<NestedItem<T>, undefined, {
106
+ index: number;
107
+ level: number;
108
+ expanded: boolean;
109
+ selected: boolean;
110
+ }>> & {
111
+ item: SlotProps<NestedItem<T>>;
112
+ 'item-leading': SlotProps<NestedItem<T>>;
113
+ 'item-label': SlotProps<NestedItem<T>>;
114
+ 'item-trailing': SlotProps<NestedItem<T>>;
115
+ } & DynamicSlots<NestedItem<T>, undefined, {
116
+ index: number;
117
+ level: number;
118
+ expanded: boolean;
119
+ selected: boolean;
120
+ }>;
121
+ emit: ((evt: "update:modelValue", payload: GetModelValue<T, VK, M>) => void) & ((evt: "update:expanded", val: string[]) => void);
122
+ }>) => import("vue").VNode & {
123
+ __ctx?: Awaited<typeof __VLS_setup>;
124
+ };
125
+ export default _default;
126
+ type __VLS_PrettifyLocal<T> = {
127
+ [K in keyof T]: T[K];
128
+ } & {};
@@ -11,5 +11,5 @@ export interface ShortcutsOptions {
11
11
  chainDelay?: number;
12
12
  }
13
13
  export declare function extractShortcuts(items: any[] | any[][]): Record<string, Handler>;
14
- export declare function defineShortcuts(config: MaybeRef<ShortcutsConfig>, options?: ShortcutsOptions): import("@vueuse/core").Fn;
14
+ export declare function defineShortcuts(config: MaybeRef<ShortcutsConfig>, options?: ShortcutsOptions): import("@vueuse/shared").Fn;
15
15
  export {};
@@ -6,5 +6,5 @@ export declare const avatarGroupInjectionKey: InjectionKey<ComputedRef<{
6
6
  export declare function useAvatarGroup(props: {
7
7
  size: AvatarGroupProps['size'];
8
8
  }): {
9
- size: ComputedRef<any>;
9
+ size: ComputedRef<"md" | "3xs" | "2xs" | "xs" | "sm" | "lg" | "xl" | "2xl" | "3xl" | undefined>;
10
10
  };
@@ -9,7 +9,7 @@ type Props<T> = {
9
9
  size?: GetObjectField<T, 'size'>;
10
10
  };
11
11
  export declare function useButtonGroup<T>(props: Props<T>): {
12
- orientation: ComputedRef<any>;
13
- size: ComputedRef<any>;
12
+ orientation: ComputedRef<"horizontal" | "vertical" | undefined>;
13
+ size: ComputedRef<"md" | "xs" | "sm" | "lg" | "xl" | NonNullable<GetObjectField<T, "size">> | undefined>;
14
14
  };
15
15
  export {};
@@ -26,12 +26,12 @@ export declare function useFormField<T>(props?: Props<T>, opts?: {
26
26
  }): {
27
27
  id: ComputedRef<string | undefined>;
28
28
  name: ComputedRef<string | undefined>;
29
- size: ComputedRef<any>;
29
+ size: ComputedRef<"md" | "xs" | "sm" | "lg" | "xl" | NonNullable<GetObjectField<T, "size">> | undefined>;
30
30
  color: ComputedRef<"error" | GetObjectField<T, "color"> | undefined>;
31
31
  highlight: ComputedRef<boolean | undefined>;
32
32
  disabled: ComputedRef<boolean | undefined>;
33
33
  emitFormBlur: () => void;
34
- emitFormInput: import("@vueuse/core").PromisifyFn<() => void>;
34
+ emitFormInput: import("@vueuse/shared").UseDebounceFnReturn<() => void>;
35
35
  emitFormChange: () => void;
36
36
  emitFormFocus: () => void;
37
37
  ariaAttrs: ComputedRef<{
@@ -6,22 +6,29 @@ export type OverlayOptions<OverlayAttrs = Record<string, any>> = {
6
6
  props?: OverlayAttrs;
7
7
  destroyOnClose?: boolean;
8
8
  };
9
- type ManagedOverlayOptionsPrivate<T extends Component> = {
9
+ interface ManagedOverlayOptionsPrivate<T extends Component> {
10
10
  component?: T;
11
11
  id: symbol;
12
12
  isMounted: boolean;
13
- modelValue: boolean;
14
- resolvePromise?: (value: unknown) => void;
15
- };
13
+ isOpen: boolean;
14
+ resolvePromise?: (value: any) => void;
15
+ }
16
16
  export type Overlay = OverlayOptions<Component> & ManagedOverlayOptionsPrivate<Component>;
17
- interface OverlayInstance<T> {
18
- open: (props?: ComponentProps<T>) => Promise<CloseEventArgType<ComponentEmit<T>>>;
17
+ interface OverlayInstance<T extends Component> extends Omit<ManagedOverlayOptionsPrivate<T>, 'component'> {
18
+ id: symbol;
19
+ result: Promise<CloseEventArgType<ComponentEmit<T>>>;
20
+ open: (props?: ComponentProps<T>) => Omit<OverlayInstance<T>, 'open' | 'close' | 'patch' | 'modelValue' | 'resolvePromise'>;
19
21
  close: (value?: any) => void;
20
22
  patch: (props: Partial<ComponentProps<T>>) => void;
21
23
  }
22
24
  declare function _useOverlay(): {
23
25
  overlays: import("vue").ShallowReactive<Overlay[]>;
24
- open: <T extends Component>(id: symbol, props?: ComponentProps<T>) => Promise<any>;
26
+ open: <T extends Component>(id: symbol, props?: ComponentProps<T>) => {
27
+ id: symbol;
28
+ isMounted: boolean;
29
+ isOpen: boolean;
30
+ result: Promise<any>;
31
+ };
25
32
  close: (id: symbol, value?: any) => void;
26
33
  create: <T extends Component>(component: T, _options?: OverlayOptions<ComponentProps<T>>) => OverlayInstance<T>;
27
34
  patch: <T extends Component>(id: symbol, props: Partial<ComponentProps<T>>) => void;
@@ -6,7 +6,7 @@ function _useOverlay() {
6
6
  const { props, defaultOpen, destroyOnClose } = _options || {};
7
7
  const options = reactive({
8
8
  id: Symbol(import.meta.dev ? "useOverlay" : ""),
9
- modelValue: !!defaultOpen,
9
+ isOpen: !!defaultOpen,
10
10
  component: markRaw(component),
11
11
  isMounted: !!defaultOpen,
12
12
  destroyOnClose: !!destroyOnClose,
@@ -14,6 +14,9 @@ function _useOverlay() {
14
14
  });
15
15
  overlays.push(options);
16
16
  return {
17
+ ...options,
18
+ result: new Promise(() => {
19
+ }),
17
20
  open: (props2) => open(options.id, props2),
18
21
  close: (value) => close(options.id, value),
19
22
  patch: (props2) => patch(options.id, props2)
@@ -24,15 +27,20 @@ function _useOverlay() {
24
27
  if (props) {
25
28
  patch(overlay.id, props);
26
29
  }
27
- overlay.modelValue = true;
30
+ overlay.isOpen = true;
28
31
  overlay.isMounted = true;
29
- return new Promise((resolve) => {
30
- overlay.resolvePromise = resolve;
31
- });
32
+ return {
33
+ id,
34
+ isMounted: overlay.isMounted,
35
+ isOpen: overlay.isOpen,
36
+ result: new Promise((resolve) => {
37
+ overlay.resolvePromise = resolve;
38
+ })
39
+ };
32
40
  };
33
41
  const close = (id, value) => {
34
42
  const overlay = getOverlay(id);
35
- overlay.modelValue = false;
43
+ overlay.isOpen = false;
36
44
  if (overlay.resolvePromise) {
37
45
  overlay.resolvePromise(value);
38
46
  overlay.resolvePromise = void 0;
@@ -0,0 +1,6 @@
1
+ import { type Ref, type InjectionKey } from 'vue';
2
+ export declare const portalTargetInjectionKey: InjectionKey<Ref<string | HTMLElement>>;
3
+ export declare function usePortal(portal: Ref<string | HTMLElement | boolean | undefined>): import("vue").ComputedRef<{
4
+ to: string | HTMLElement;
5
+ disabled: boolean;
6
+ }>;
@@ -0,0 +1,17 @@
1
+ import { inject, provide, computed } from "vue";
2
+ export const portalTargetInjectionKey = Symbol("nuxt-ui.portal-target");
3
+ export function usePortal(portal) {
4
+ const portalTarget = inject(portalTargetInjectionKey, void 0);
5
+ const to = computed(() => {
6
+ if (typeof portal.value === "boolean" || portal.value === void 0) {
7
+ return portalTarget?.value ?? "body";
8
+ }
9
+ return portal.value;
10
+ });
11
+ const disabled = computed(() => typeof portal.value === "boolean" ? !portal.value : false);
12
+ provide(portalTargetInjectionKey, computed(() => to.value));
13
+ return computed(() => ({
14
+ to: to.value,
15
+ disabled: disabled.value
16
+ }));
17
+ }
@@ -1 +1 @@
1
- @import "#build/ui.css";@import "./keyframes.css";@variant light (&:where(.light, .light *));@variant dark (&:where(.dark, .dark *));@layer base{body{@apply antialiased text-(--ui-text) bg-(--ui-bg) scheme-light dark:scheme-dark}.light,:root{--ui-text-dimmed:var(--ui-color-neutral-400);--ui-text-muted:var(--ui-color-neutral-500);--ui-text-toned:var(--ui-color-neutral-600);--ui-text:var(--ui-color-neutral-700);--ui-text-highlighted:var(--ui-color-neutral-900);--ui-bg:var(--color-white);--ui-bg-muted:var(--ui-color-neutral-50);--ui-bg-elevated:var(--ui-color-neutral-100);--ui-bg-accented:var(--ui-color-neutral-200);--ui-bg-inverted:var(--ui-color-neutral-900);--ui-border:var(--ui-color-neutral-200);--ui-border-muted:var(--ui-color-neutral-200);--ui-border-accented:var(--ui-color-neutral-300);--ui-border-inverted:var(--ui-color-neutral-900);--ui-radius:var(--radius-sm);--ui-container:var(--container-7xl)}.dark{--ui-text-dimmed:var(--ui-color-neutral-500);--ui-text-muted:var(--ui-color-neutral-400);--ui-text-toned:var(--ui-color-neutral-300);--ui-text:var(--ui-color-neutral-200);--ui-text-highlighted:var(--color-white);--ui-bg:var(--ui-color-neutral-900);--ui-bg-muted:var(--ui-color-neutral-800);--ui-bg-elevated:var(--ui-color-neutral-800);--ui-bg-accented:var(--ui-color-neutral-700);--ui-bg-inverted:var(--color-white);--ui-border:var(--ui-color-neutral-800);--ui-border-muted:var(--ui-color-neutral-700);--ui-border-accented:var(--ui-color-neutral-700);--ui-border-inverted:var(--color-white)}}
1
+ @import "#build/ui.css";@import "./keyframes.css";@variant light (&:where(.light, .light *));@variant dark (&:where(.dark, .dark *));@layer base{body{@apply antialiased text-default bg-default scheme-light dark:scheme-dark}.light,:root{--ui-text-dimmed:var(--ui-color-neutral-400);--ui-text-muted:var(--ui-color-neutral-500);--ui-text-toned:var(--ui-color-neutral-600);--ui-text:var(--ui-color-neutral-700);--ui-text-highlighted:var(--ui-color-neutral-900);--ui-text-inverted:var(--color-white);--ui-bg:var(--color-white);--ui-bg-muted:var(--ui-color-neutral-50);--ui-bg-elevated:var(--ui-color-neutral-100);--ui-bg-accented:var(--ui-color-neutral-200);--ui-bg-inverted:var(--ui-color-neutral-900);--ui-border:var(--ui-color-neutral-200);--ui-border-muted:var(--ui-color-neutral-200);--ui-border-accented:var(--ui-color-neutral-300);--ui-border-inverted:var(--ui-color-neutral-900);--ui-radius:0.25rem;--ui-container:var(--container-7xl)}.dark{--ui-text-dimmed:var(--ui-color-neutral-500);--ui-text-muted:var(--ui-color-neutral-400);--ui-text-toned:var(--ui-color-neutral-300);--ui-text:var(--ui-color-neutral-200);--ui-text-highlighted:var(--color-white);--ui-text-inverted:var(--ui-color-neutral-900);--ui-bg:var(--ui-color-neutral-900);--ui-bg-muted:var(--ui-color-neutral-800);--ui-bg-elevated:var(--ui-color-neutral-800);--ui-bg-accented:var(--ui-color-neutral-700);--ui-bg-inverted:var(--color-white);--ui-border:var(--ui-color-neutral-800);--ui-border-muted:var(--ui-color-neutral-700);--ui-border-accented:var(--ui-color-neutral-700);--ui-border-inverted:var(--color-white)}}