@nuxt/ui 4.0.1 → 4.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 (234) hide show
  1. package/.nuxt/ui/calendar.ts +221 -9
  2. package/.nuxt/ui/chat-message.ts +10 -3
  3. package/.nuxt/ui/command-palette.ts +12 -2
  4. package/.nuxt/ui/context-menu.ts +3 -1
  5. package/.nuxt/ui/dropdown-menu.ts +3 -1
  6. package/.nuxt/ui/empty.ts +83 -0
  7. package/.nuxt/ui/index.ts +1 -0
  8. package/.nuxt/ui/input-menu.ts +12 -2
  9. package/.nuxt/ui/input-number.ts +25 -14
  10. package/.nuxt/ui/kbd.ts +1 -1
  11. package/.nuxt/ui/prose/code-tree.ts +1 -1
  12. package/.nuxt/ui/prose/img.ts +2 -1
  13. package/.nuxt/ui/select-menu.ts +12 -2
  14. package/.nuxt/ui/select.ts +4 -2
  15. package/.nuxt/ui/table.ts +8 -2
  16. package/.nuxt/ui/tree.ts +25 -11
  17. package/cli/templates.mjs +14 -2
  18. package/dist/module.d.mts +15 -0
  19. package/dist/module.json +2 -2
  20. package/dist/module.mjs +5 -2
  21. package/dist/runtime/components/Accordion.d.vue.ts +7 -1
  22. package/dist/runtime/components/Accordion.vue +4 -4
  23. package/dist/runtime/components/Accordion.vue.d.ts +7 -1
  24. package/dist/runtime/components/Alert.d.vue.ts +4 -4
  25. package/dist/runtime/components/Alert.vue +1 -1
  26. package/dist/runtime/components/Alert.vue.d.ts +4 -4
  27. package/dist/runtime/components/AuthForm.d.vue.ts +3 -1
  28. package/dist/runtime/components/AuthForm.vue +1 -1
  29. package/dist/runtime/components/AuthForm.vue.d.ts +3 -1
  30. package/dist/runtime/components/Avatar.d.vue.ts +5 -4
  31. package/dist/runtime/components/Avatar.vue +10 -3
  32. package/dist/runtime/components/Avatar.vue.d.ts +5 -4
  33. package/dist/runtime/components/Badge.d.vue.ts +9 -3
  34. package/dist/runtime/components/Badge.vue +3 -3
  35. package/dist/runtime/components/Badge.vue.d.ts +9 -3
  36. package/dist/runtime/components/Banner.d.vue.ts +4 -2
  37. package/dist/runtime/components/Banner.vue +1 -1
  38. package/dist/runtime/components/Banner.vue.d.ts +4 -2
  39. package/dist/runtime/components/BlogPost.d.vue.ts +9 -3
  40. package/dist/runtime/components/BlogPost.vue +2 -2
  41. package/dist/runtime/components/BlogPost.vue.d.ts +9 -3
  42. package/dist/runtime/components/BlogPosts.d.vue.ts +22 -13
  43. package/dist/runtime/components/BlogPosts.vue +8 -2
  44. package/dist/runtime/components/BlogPosts.vue.d.ts +22 -13
  45. package/dist/runtime/components/Breadcrumb.d.vue.ts +19 -4
  46. package/dist/runtime/components/Breadcrumb.vue +8 -8
  47. package/dist/runtime/components/Breadcrumb.vue.d.ts +19 -4
  48. package/dist/runtime/components/Button.d.vue.ts +9 -3
  49. package/dist/runtime/components/Button.vue +3 -3
  50. package/dist/runtime/components/Button.vue.d.ts +9 -3
  51. package/dist/runtime/components/Calendar.d.vue.ts +4 -0
  52. package/dist/runtime/components/Calendar.vue +3 -1
  53. package/dist/runtime/components/Calendar.vue.d.ts +4 -0
  54. package/dist/runtime/components/ChangelogVersion.d.vue.ts +12 -4
  55. package/dist/runtime/components/ChangelogVersion.vue +3 -3
  56. package/dist/runtime/components/ChangelogVersion.vue.d.ts +12 -4
  57. package/dist/runtime/components/ChangelogVersions.d.vue.ts +8 -36
  58. package/dist/runtime/components/ChangelogVersions.vue +2 -2
  59. package/dist/runtime/components/ChangelogVersions.vue.d.ts +8 -36
  60. package/dist/runtime/components/ChatMessage.d.vue.ts +1 -0
  61. package/dist/runtime/components/ChatMessage.vue +1 -1
  62. package/dist/runtime/components/ChatMessage.vue.d.ts +1 -0
  63. package/dist/runtime/components/ChatMessages.d.vue.ts +14 -15
  64. package/dist/runtime/components/ChatMessages.vue +24 -8
  65. package/dist/runtime/components/ChatMessages.vue.d.ts +14 -15
  66. package/dist/runtime/components/CommandPalette.d.vue.ts +43 -12
  67. package/dist/runtime/components/CommandPalette.vue +134 -68
  68. package/dist/runtime/components/CommandPalette.vue.d.ts +43 -12
  69. package/dist/runtime/components/ContextMenu.d.vue.ts +28 -6
  70. package/dist/runtime/components/ContextMenu.vue +2 -0
  71. package/dist/runtime/components/ContextMenu.vue.d.ts +28 -6
  72. package/dist/runtime/components/ContextMenuContent.d.vue.ts +2 -3
  73. package/dist/runtime/components/ContextMenuContent.vue +21 -11
  74. package/dist/runtime/components/ContextMenuContent.vue.d.ts +2 -3
  75. package/dist/runtime/components/DashboardNavbar.d.vue.ts +9 -3
  76. package/dist/runtime/components/DashboardNavbar.vue +3 -3
  77. package/dist/runtime/components/DashboardNavbar.vue.d.ts +9 -3
  78. package/dist/runtime/components/DashboardSearch.d.vue.ts +3 -1
  79. package/dist/runtime/components/DashboardSearch.vue +2 -2
  80. package/dist/runtime/components/DashboardSearch.vue.d.ts +3 -1
  81. package/dist/runtime/components/DashboardSearchButton.vue +2 -2
  82. package/dist/runtime/components/DashboardSidebar.d.vue.ts +5 -1
  83. package/dist/runtime/components/DashboardSidebar.vue +4 -4
  84. package/dist/runtime/components/DashboardSidebar.vue.d.ts +5 -1
  85. package/dist/runtime/components/Drawer.vue +2 -5
  86. package/dist/runtime/components/DropdownMenu.d.vue.ts +28 -6
  87. package/dist/runtime/components/DropdownMenu.vue +2 -0
  88. package/dist/runtime/components/DropdownMenu.vue.d.ts +28 -6
  89. package/dist/runtime/components/DropdownMenuContent.d.vue.ts +8 -5
  90. package/dist/runtime/components/DropdownMenuContent.vue +21 -11
  91. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +8 -5
  92. package/dist/runtime/components/Empty.d.vue.ts +53 -0
  93. package/dist/runtime/components/Empty.vue +68 -0
  94. package/dist/runtime/components/Empty.vue.d.ts +53 -0
  95. package/dist/runtime/components/Error.d.vue.ts +0 -1
  96. package/dist/runtime/components/Error.vue +1 -1
  97. package/dist/runtime/components/Error.vue.d.ts +0 -1
  98. package/dist/runtime/components/FileUpload.d.vue.ts +6 -1
  99. package/dist/runtime/components/FileUpload.vue +8 -7
  100. package/dist/runtime/components/FileUpload.vue.d.ts +6 -1
  101. package/dist/runtime/components/FooterColumns.d.vue.ts +9 -2
  102. package/dist/runtime/components/FooterColumns.vue +2 -2
  103. package/dist/runtime/components/FooterColumns.vue.d.ts +9 -2
  104. package/dist/runtime/components/Header.d.vue.ts +4 -1
  105. package/dist/runtime/components/Header.vue +3 -3
  106. package/dist/runtime/components/Header.vue.d.ts +4 -1
  107. package/dist/runtime/components/Input.d.vue.ts +9 -3
  108. package/dist/runtime/components/Input.vue +3 -3
  109. package/dist/runtime/components/Input.vue.d.ts +9 -3
  110. package/dist/runtime/components/InputMenu.d.vue.ts +40 -10
  111. package/dist/runtime/components/InputMenu.vue +117 -65
  112. package/dist/runtime/components/InputMenu.vue.d.ts +40 -10
  113. package/dist/runtime/components/InputNumber.d.vue.ts +4 -2
  114. package/dist/runtime/components/InputNumber.vue +7 -5
  115. package/dist/runtime/components/InputNumber.vue.d.ts +4 -2
  116. package/dist/runtime/components/InputTags.d.vue.ts +10 -3
  117. package/dist/runtime/components/InputTags.vue +5 -5
  118. package/dist/runtime/components/InputTags.vue.d.ts +10 -3
  119. package/dist/runtime/components/Main.d.vue.ts +2 -4
  120. package/dist/runtime/components/Main.vue +1 -1
  121. package/dist/runtime/components/Main.vue.d.ts +2 -4
  122. package/dist/runtime/components/Modal.d.vue.ts +1 -4
  123. package/dist/runtime/components/Modal.vue +3 -6
  124. package/dist/runtime/components/Modal.vue.d.ts +1 -4
  125. package/dist/runtime/components/NavigationMenu.d.vue.ts +16 -4
  126. package/dist/runtime/components/NavigationMenu.vue +14 -7
  127. package/dist/runtime/components/NavigationMenu.vue.d.ts +16 -4
  128. package/dist/runtime/components/PageAnchors.d.vue.ts +9 -2
  129. package/dist/runtime/components/PageAnchors.vue +2 -2
  130. package/dist/runtime/components/PageAnchors.vue.d.ts +9 -2
  131. package/dist/runtime/components/PageCard.d.vue.ts +3 -1
  132. package/dist/runtime/components/PageCard.vue +1 -1
  133. package/dist/runtime/components/PageCard.vue.d.ts +3 -1
  134. package/dist/runtime/components/PageFeature.d.vue.ts +3 -1
  135. package/dist/runtime/components/PageFeature.vue +1 -1
  136. package/dist/runtime/components/PageFeature.vue.d.ts +3 -1
  137. package/dist/runtime/components/PageLinks.d.vue.ts +9 -2
  138. package/dist/runtime/components/PageLinks.vue +2 -2
  139. package/dist/runtime/components/PageLinks.vue.d.ts +9 -2
  140. package/dist/runtime/components/PageSection.d.vue.ts +3 -1
  141. package/dist/runtime/components/PageSection.vue +1 -1
  142. package/dist/runtime/components/PageSection.vue.d.ts +3 -1
  143. package/dist/runtime/components/Pagination.d.vue.ts +3 -1
  144. package/dist/runtime/components/Pagination.vue +1 -1
  145. package/dist/runtime/components/Pagination.vue.d.ts +3 -1
  146. package/dist/runtime/components/Popover.d.vue.ts +24 -23
  147. package/dist/runtime/components/Popover.vue +4 -4
  148. package/dist/runtime/components/Popover.vue.d.ts +24 -23
  149. package/dist/runtime/components/PricingPlan.d.vue.ts +9 -3
  150. package/dist/runtime/components/PricingPlan.vue +3 -3
  151. package/dist/runtime/components/PricingPlan.vue.d.ts +9 -3
  152. package/dist/runtime/components/PricingPlans.d.vue.ts +20 -13
  153. package/dist/runtime/components/PricingPlans.vue +7 -1
  154. package/dist/runtime/components/PricingPlans.vue.d.ts +20 -13
  155. package/dist/runtime/components/Select.d.vue.ts +20 -9
  156. package/dist/runtime/components/Select.vue +18 -9
  157. package/dist/runtime/components/Select.vue.d.ts +20 -9
  158. package/dist/runtime/components/SelectMenu.d.vue.ts +39 -11
  159. package/dist/runtime/components/SelectMenu.vue +114 -61
  160. package/dist/runtime/components/SelectMenu.vue.d.ts +39 -11
  161. package/dist/runtime/components/Separator.d.vue.ts +3 -1
  162. package/dist/runtime/components/Separator.vue +1 -1
  163. package/dist/runtime/components/Separator.vue.d.ts +3 -1
  164. package/dist/runtime/components/Slideover.d.vue.ts +1 -4
  165. package/dist/runtime/components/Slideover.vue +3 -6
  166. package/dist/runtime/components/Slideover.vue.d.ts +1 -4
  167. package/dist/runtime/components/Stepper.d.vue.ts +4 -1
  168. package/dist/runtime/components/Stepper.vue +1 -1
  169. package/dist/runtime/components/Stepper.vue.d.ts +4 -1
  170. package/dist/runtime/components/Table.d.vue.ts +21 -1
  171. package/dist/runtime/components/Table.vue +126 -60
  172. package/dist/runtime/components/Table.vue.d.ts +21 -1
  173. package/dist/runtime/components/Tabs.d.vue.ts +8 -3
  174. package/dist/runtime/components/Tabs.vue +3 -3
  175. package/dist/runtime/components/Tabs.vue.d.ts +8 -3
  176. package/dist/runtime/components/Textarea.d.vue.ts +9 -3
  177. package/dist/runtime/components/Textarea.vue +3 -3
  178. package/dist/runtime/components/Textarea.vue.d.ts +9 -3
  179. package/dist/runtime/components/Toast.d.vue.ts +4 -4
  180. package/dist/runtime/components/Toast.vue +1 -1
  181. package/dist/runtime/components/Toast.vue.d.ts +4 -4
  182. package/dist/runtime/components/Toaster.d.vue.ts +6 -0
  183. package/dist/runtime/components/Toaster.vue +6 -3
  184. package/dist/runtime/components/Toaster.vue.d.ts +6 -0
  185. package/dist/runtime/components/Tooltip.d.vue.ts +3 -1
  186. package/dist/runtime/components/Tooltip.vue +1 -1
  187. package/dist/runtime/components/Tooltip.vue.d.ts +3 -1
  188. package/dist/runtime/components/Tree.d.vue.ts +43 -5
  189. package/dist/runtime/components/Tree.vue +169 -81
  190. package/dist/runtime/components/Tree.vue.d.ts +43 -5
  191. package/dist/runtime/components/User.d.vue.ts +3 -1
  192. package/dist/runtime/components/User.vue +1 -1
  193. package/dist/runtime/components/User.vue.d.ts +3 -1
  194. package/dist/runtime/components/content/ContentNavigation.d.vue.ts +1 -0
  195. package/dist/runtime/components/content/ContentNavigation.vue +5 -5
  196. package/dist/runtime/components/content/ContentNavigation.vue.d.ts +1 -0
  197. package/dist/runtime/components/content/ContentSearch.d.vue.ts +3 -1
  198. package/dist/runtime/components/content/ContentSearch.vue +4 -2
  199. package/dist/runtime/components/content/ContentSearch.vue.d.ts +3 -1
  200. package/dist/runtime/components/content/ContentSearchButton.vue +2 -2
  201. package/dist/runtime/components/content/ContentSurround.d.vue.ts +1 -0
  202. package/dist/runtime/components/content/ContentSurround.vue +4 -4
  203. package/dist/runtime/components/content/ContentSurround.vue.d.ts +1 -0
  204. package/dist/runtime/components/content/ContentToc.d.vue.ts +2 -0
  205. package/dist/runtime/components/content/ContentToc.vue +2 -2
  206. package/dist/runtime/components/content/ContentToc.vue.d.ts +2 -0
  207. package/dist/runtime/components/prose/Accordion.d.vue.ts +6 -0
  208. package/dist/runtime/components/prose/Accordion.vue +3 -2
  209. package/dist/runtime/components/prose/Accordion.vue.d.ts +6 -0
  210. package/dist/runtime/components/prose/CodeTree.vue +40 -36
  211. package/dist/runtime/components/prose/Collapsible.d.vue.ts +2 -2
  212. package/dist/runtime/components/prose/Collapsible.vue +2 -2
  213. package/dist/runtime/components/prose/Collapsible.vue.d.ts +2 -2
  214. package/dist/runtime/components/prose/Field.d.vue.ts +1 -1
  215. package/dist/runtime/components/prose/Field.vue.d.ts +1 -1
  216. package/dist/runtime/components/prose/Img.vue +14 -3
  217. package/dist/runtime/components/prose/Tabs.d.vue.ts +6 -0
  218. package/dist/runtime/components/prose/Tabs.vue +3 -2
  219. package/dist/runtime/components/prose/Tabs.vue.d.ts +6 -0
  220. package/dist/runtime/composables/useKbd.js +1 -1
  221. package/dist/runtime/composables/useToast.d.ts +3 -1
  222. package/dist/runtime/composables/useToast.js +4 -3
  223. package/dist/runtime/inertia/components/Link.vue +12 -7
  224. package/dist/runtime/locale/hr.d.ts +3 -0
  225. package/dist/runtime/locale/hr.js +129 -0
  226. package/dist/runtime/locale/index.d.ts +1 -0
  227. package/dist/runtime/locale/index.js +1 -0
  228. package/dist/runtime/types/index.d.ts +2 -1
  229. package/dist/runtime/types/index.js +2 -1
  230. package/dist/runtime/types/tv.d.ts +6 -0
  231. package/dist/shared/{ui.D-FDXAUi.mjs → ui.Cmctwxv6.mjs} +381 -48
  232. package/dist/unplugin.mjs +2 -1
  233. package/dist/vite.mjs +3 -2
  234. package/package.json +18 -17
@@ -3,10 +3,10 @@ import theme from "#build/ui/command-palette";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
- import { computed, ref, useTemplateRef } from "vue";
7
- import { ListboxRoot, ListboxFilter, ListboxContent, ListboxGroup, ListboxGroupLabel, ListboxItem, ListboxItemIndicator, useForwardProps, useForwardPropsEmits } from "reka-ui";
6
+ import { computed, ref, useTemplateRef, toRef } from "vue";
7
+ import { ListboxRoot, ListboxFilter, ListboxContent, ListboxGroup, ListboxGroupLabel, ListboxVirtualizer, ListboxItem, ListboxItemIndicator, useForwardProps, useForwardPropsEmits } from "reka-ui";
8
8
  import { defu } from "defu";
9
- import { reactivePick } from "@vueuse/core";
9
+ import { reactivePick, createReusableTemplate } from "@vueuse/core";
10
10
  import { useFuse } from "@vueuse/integrations/useFuse";
11
11
  import { useAppConfig } from "#imports";
12
12
  import { useLocale } from "../composables/useLocale";
@@ -25,8 +25,9 @@ import UKbd from "./Kbd.vue";
25
25
  const props = defineProps({
26
26
  as: { type: null, required: false },
27
27
  icon: { type: [String, Object], required: false },
28
- selectedIcon: { type: [String, Object], required: false },
29
28
  trailingIcon: { type: [String, Object], required: false },
29
+ selectedIcon: { type: [String, Object], required: false },
30
+ childrenIcon: { type: [String, Object], required: false },
30
31
  placeholder: { type: String, required: false },
31
32
  autofocus: { type: Boolean, required: false, default: true },
32
33
  close: { type: [Boolean, Object], required: false },
@@ -35,14 +36,17 @@ const props = defineProps({
35
36
  backIcon: { type: [String, Object], required: false },
36
37
  groups: { type: Array, required: false },
37
38
  fuse: { type: Object, required: false },
39
+ virtualize: { type: [Boolean, Object], required: false, default: false },
38
40
  labelKey: { type: null, required: false, default: "label" },
41
+ descriptionKey: { type: null, required: false, default: "description" },
42
+ preserveGroupOrder: { type: Boolean, required: false, default: false },
39
43
  class: { type: null, required: false },
40
44
  ui: { type: null, required: false },
41
45
  multiple: { type: Boolean, required: false },
42
46
  disabled: { type: Boolean, required: false },
43
47
  modelValue: { type: null, required: false, default: "" },
44
48
  defaultValue: { type: null, required: false },
45
- highlightOnHover: { type: Boolean, required: false },
49
+ highlightOnHover: { type: Boolean, required: false, default: true },
46
50
  selectionBehavior: { type: String, required: false },
47
51
  loading: { type: Boolean, required: false },
48
52
  loadingIcon: { type: [String, Object], required: false }
@@ -54,7 +58,26 @@ const { t } = useLocale();
54
58
  const appConfig = useAppConfig();
55
59
  const rootProps = useForwardPropsEmits(reactivePick(props, "as", "disabled", "multiple", "modelValue", "defaultValue", "highlightOnHover"), emits);
56
60
  const inputProps = useForwardProps(reactivePick(props, "loading"));
57
- const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.commandPalette || {} })());
61
+ const virtualizerProps = toRef(() => !!props.virtualize && defu(typeof props.virtualize === "boolean" ? {} : props.virtualize, { estimateSize: 32 }));
62
+ const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate({
63
+ props: {
64
+ item: {
65
+ type: Object,
66
+ required: true
67
+ },
68
+ group: {
69
+ type: Object,
70
+ required: false
71
+ },
72
+ index: {
73
+ type: Number,
74
+ required: false
75
+ }
76
+ }
77
+ });
78
+ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.commandPalette || {} })({
79
+ virtualize: !!props.virtualize
80
+ }));
58
81
  const fuse = computed(() => defu({}, props.fuse, {
59
82
  fuseOptions: {
60
83
  ignoreLocation: true,
@@ -103,6 +126,19 @@ const filteredGroups = computed(() => {
103
126
  acc[item.group]?.push({ ...item, matches });
104
127
  return acc;
105
128
  }, {});
129
+ if (props.preserveGroupOrder) {
130
+ const processedGroups = [];
131
+ for (const group of groups.value || []) {
132
+ if (!group.items?.length) {
133
+ continue;
134
+ }
135
+ const items2 = group.ignoreFilter ? group.items : groupsById[group.id];
136
+ if (items2?.length) {
137
+ processedGroups.push(getGroupWithItems(group, items2));
138
+ }
139
+ }
140
+ return processedGroups;
141
+ }
106
142
  const fuseGroups = Object.entries(groupsById).map(([id, items2]) => {
107
143
  const group = groups.value?.find((group2) => group2.id === id);
108
144
  if (!group) {
@@ -116,6 +152,7 @@ const filteredGroups = computed(() => {
116
152
  return acc;
117
153
  }, [...fuseGroups]);
118
154
  });
155
+ const filteredItems = computed(() => filteredGroups.value.flatMap((group) => group.items || []));
119
156
  const listboxRootRef = useTemplateRef("listboxRootRef");
120
157
  function navigate(item) {
121
158
  if (!item.children?.length) {
@@ -155,6 +192,73 @@ function onSelect(e, item) {
155
192
  </script>
156
193
 
157
194
  <template>
195
+ <DefineItemTemplate v-slot="{ item, index, group }">
196
+ <ListboxItem
197
+ :value="omit(item, ['matches', 'group', 'onSelect', 'labelHtml', 'suffixHtml', 'children'])"
198
+ :disabled="item.disabled"
199
+ as-child
200
+ @select="onSelect($event, item)"
201
+ >
202
+ <ULink v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item)" custom>
203
+ <ULinkBase v-bind="slotProps" :class="ui.item({ class: [props.ui?.item, item.ui?.item, item.class], active: active || item.active })">
204
+ <slot :name="item.slot || group?.slot || 'item'" :item="item" :index="index" :ui="ui">
205
+ <slot :name="item.slot ? `${item.slot}-leading` : group?.slot ? `${group.slot}-leading` : `item-leading`" :item="item" :index="index" :ui="ui">
206
+ <UIcon v-if="item.loading" :name="loadingIcon || appConfig.ui.icons.loading" :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon], loading: true })" />
207
+ <UIcon v-else-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon], active: active || item.active })" />
208
+ <UAvatar v-else-if="item.avatar" :size="item.ui?.itemLeadingAvatarSize || props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: [props.ui?.itemLeadingAvatar, item.ui?.itemLeadingAvatar], active: active || item.active })" />
209
+ <UChip
210
+ v-else-if="item.chip"
211
+ :size="item.ui?.itemLeadingChipSize || props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()"
212
+ inset
213
+ standalone
214
+ v-bind="item.chip"
215
+ :class="ui.itemLeadingChip({ class: [props.ui?.itemLeadingChip, item.ui?.itemLeadingChip], active: active || item.active })"
216
+ />
217
+ </slot>
218
+
219
+ <span v-if="item.prefix || (item.labelHtml || get(item, props.labelKey)) || (item.suffixHtml || item.suffix) || !!slots[item.slot ? `${item.slot}-label` : group?.slot ? `${group.slot}-label` : `item-label`] || (get(item, props.descriptionKey) || !!slots[item.slot ? `${item.slot}-description` : group?.slot ? `${group.slot}-description` : `item-description`])" :class="ui.itemWrapper({ class: [props.ui?.itemWrapper, item.ui?.itemWrapper] })">
220
+ <span :class="ui.itemLabel({ class: [props.ui?.itemLabel, item.ui?.itemLabel], active: active || item.active })">
221
+ <slot :name="item.slot ? `${item.slot}-label` : group?.slot ? `${group.slot}-label` : `item-label`" :item="item" :index="index" :ui="ui">
222
+ <span v-if="item.prefix" :class="ui.itemLabelPrefix({ class: [props.ui?.itemLabelPrefix, item.ui?.itemLabelPrefix] })">{{ item.prefix }}</span>
223
+
224
+ <span :class="ui.itemLabelBase({ class: [props.ui?.itemLabelBase, item.ui?.itemLabelBase], active: active || item.active })" v-html="item.labelHtml || get(item, props.labelKey)" />
225
+
226
+ <span :class="ui.itemLabelSuffix({ class: [props.ui?.itemLabelSuffix, item.ui?.itemLabelSuffix], active: active || item.active })" v-html="item.suffixHtml || item.suffix" />
227
+ </slot>
228
+ </span>
229
+
230
+ <span v-if="get(item, props.descriptionKey)" :class="ui.itemDescription({ class: [props.ui?.itemDescription, item.ui?.itemDescription] })">
231
+ <slot :name="item.slot ? `${item.slot}-description` : group?.slot ? `${group.slot}-description` : `item-description`" :item="item" :index="index" :ui="ui">
232
+ {{ get(item, props.descriptionKey) }}
233
+ </slot>
234
+ </span>
235
+ </span>
236
+
237
+ <span :class="ui.itemTrailing({ class: [props.ui?.itemTrailing, item.ui?.itemTrailing] })">
238
+ <slot :name="item.slot ? `${item.slot}-trailing` : group?.slot ? `${group.slot}-trailing` : `item-trailing`" :item="item" :index="index" :ui="ui">
239
+ <UIcon
240
+ v-if="item.children && item.children.length > 0"
241
+ :name="childrenIcon || appConfig.ui.icons.chevronRight"
242
+ :class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, item.ui?.itemTrailingIcon] })"
243
+ />
244
+
245
+ <span v-else-if="item.kbds?.length" :class="ui.itemTrailingKbds({ class: [props.ui?.itemTrailingKbds, item.ui?.itemTrailingKbds] })">
246
+ <UKbd v-for="(kbd, kbdIndex) in item.kbds" :key="kbdIndex" :size="item.ui?.itemTrailingKbdsSize || props.ui?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
247
+ </span>
248
+
249
+ <UIcon v-else-if="group?.highlightedIcon" :name="group.highlightedIcon" :class="ui.itemTrailingHighlightedIcon({ class: [props.ui?.itemTrailingHighlightedIcon, item.ui?.itemTrailingHighlightedIcon] })" />
250
+ </slot>
251
+
252
+ <ListboxItemIndicator v-if="!item.children?.length" as-child>
253
+ <UIcon :name="selectedIcon || appConfig.ui.icons.check" :class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, item.ui?.itemTrailingIcon] })" />
254
+ </ListboxItemIndicator>
255
+ </span>
256
+ </slot>
257
+ </ULinkBase>
258
+ </ULink>
259
+ </ListboxItem>
260
+ </DefineItemTemplate>
261
+
158
262
  <ListboxRoot v-bind="rootProps" ref="listboxRootRef" :selection-behavior="selectionBehavior" :class="ui.root({ class: [props.ui?.root, props.class] })">
159
263
  <ListboxFilter v-model="searchTerm" as-child>
160
264
  <UInput
@@ -163,6 +267,7 @@ function onSelect(e, item) {
163
267
  :autofocus="autofocus"
164
268
  v-bind="inputProps"
165
269
  :loading-icon="loadingIcon"
270
+ :trailing-icon="trailingIcon"
166
271
  :icon="icon || appConfig.ui.icons.search"
167
272
  :class="ui.input({ class: props.ui?.input })"
168
273
  @keydown.backspace="onBackspace"
@@ -200,70 +305,31 @@ function onSelect(e, item) {
200
305
 
201
306
  <ListboxContent :class="ui.content({ class: props.ui?.content })">
202
307
  <div v-if="filteredGroups?.length" role="presentation" :class="ui.viewport({ class: props.ui?.viewport })">
203
- <ListboxGroup v-for="group in filteredGroups" :key="`group-${group.id}`" :class="ui.group({ class: props.ui?.group })">
204
- <ListboxGroupLabel v-if="get(group, props.labelKey)" :class="ui.label({ class: props.ui?.label })">
205
- {{ get(group, props.labelKey) }}
206
- </ListboxGroupLabel>
207
-
208
- <ListboxItem
209
- v-for="(item, index) in group.items"
210
- :key="`group-${group.id}-${index}`"
211
- :value="omit(item, ['matches', 'group', 'onSelect', 'labelHtml', 'suffixHtml', 'children'])"
212
- :disabled="item.disabled"
213
- as-child
214
- @select="onSelect($event, item)"
215
- >
216
- <ULink v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item)" custom>
217
- <ULinkBase v-bind="slotProps" :class="ui.item({ class: [props.ui?.item, item.ui?.item, item.class], active: active || item.active })">
218
- <slot :name="item.slot || group.slot || 'item'" :item="item" :index="index">
219
- <slot :name="item.slot ? `${item.slot}-leading` : group.slot ? `${group.slot}-leading` : `item-leading`" :item="item" :index="index">
220
- <UIcon v-if="item.loading" :name="loadingIcon || appConfig.ui.icons.loading" :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon], loading: true })" />
221
- <UIcon v-else-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon], active: active || item.active })" />
222
- <UAvatar v-else-if="item.avatar" :size="item.ui?.itemLeadingAvatarSize || props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: [props.ui?.itemLeadingAvatar, item.ui?.itemLeadingAvatar], active: active || item.active })" />
223
- <UChip
224
- v-else-if="item.chip"
225
- :size="item.ui?.itemLeadingChipSize || props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()"
226
- inset
227
- standalone
228
- v-bind="item.chip"
229
- :class="ui.itemLeadingChip({ class: [props.ui?.itemLeadingChip, item.ui?.itemLeadingChip], active: active || item.active })"
230
- />
231
- </slot>
232
-
233
- <span v-if="item.labelHtml || get(item, props.labelKey) || !!slots[item.slot ? `${item.slot}-label` : group.slot ? `${group.slot}-label` : `item-label`]" :class="ui.itemLabel({ class: [props.ui?.itemLabel, item.ui?.itemLabel], active: active || item.active })">
234
- <slot :name="item.slot ? `${item.slot}-label` : group.slot ? `${group.slot}-label` : `item-label`" :item="item" :index="index">
235
- <span v-if="item.prefix" :class="ui.itemLabelPrefix({ class: [props.ui?.itemLabelPrefix, item.ui?.itemLabelPrefix] })">{{ item.prefix }}</span>
308
+ <ListboxVirtualizer
309
+ v-if="!!virtualize"
310
+ v-slot="{ option: item, virtualItem }"
311
+ :options="filteredItems"
312
+ :text-content="(item2) => get(item2, props.labelKey)"
313
+ v-bind="virtualizerProps"
314
+ >
315
+ <ReuseItemTemplate :item="item" :index="virtualItem.index" />
316
+ </ListboxVirtualizer>
236
317
 
237
- <span :class="ui.itemLabelBase({ class: [props.ui?.itemLabelBase, item.ui?.itemLabelBase], active: active || item.active })" v-html="item.labelHtml || get(item, props.labelKey)" />
318
+ <template v-else>
319
+ <ListboxGroup v-for="group in filteredGroups" :key="`group-${group.id}`" :class="ui.group({ class: props.ui?.group })">
320
+ <ListboxGroupLabel v-if="get(group, props.labelKey)" :class="ui.label({ class: props.ui?.label })">
321
+ {{ get(group, props.labelKey) }}
322
+ </ListboxGroupLabel>
238
323
 
239
- <span :class="ui.itemLabelSuffix({ class: [props.ui?.itemLabelSuffix, item.ui?.itemLabelSuffix], active: active || item.active })" v-html="item.suffixHtml || item.suffix" />
240
- </slot>
241
- </span>
242
-
243
- <span :class="ui.itemTrailing({ class: [props.ui?.itemTrailing, item.ui?.itemTrailing] })">
244
- <slot :name="item.slot ? `${item.slot}-trailing` : group.slot ? `${group.slot}-trailing` : `item-trailing`" :item="item" :index="index">
245
- <UIcon
246
- v-if="item.children && item.children.length > 0"
247
- :name="trailingIcon || appConfig.ui.icons.chevronRight"
248
- :class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, item.ui?.itemTrailingIcon] })"
249
- />
250
-
251
- <span v-else-if="item.kbds?.length" :class="ui.itemTrailingKbds({ class: [props.ui?.itemTrailingKbds, item.ui?.itemTrailingKbds] })">
252
- <UKbd v-for="(kbd, kbdIndex) in item.kbds" :key="kbdIndex" :size="item.ui?.itemTrailingKbdsSize || props.ui?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
253
- </span>
254
-
255
- <UIcon v-else-if="group.highlightedIcon" :name="group.highlightedIcon" :class="ui.itemTrailingHighlightedIcon({ class: [props.ui?.itemTrailingHighlightedIcon, item.ui?.itemTrailingHighlightedIcon] })" />
256
- </slot>
257
-
258
- <ListboxItemIndicator v-if="!item.children?.length" as-child>
259
- <UIcon :name="selectedIcon || appConfig.ui.icons.check" :class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, item.ui?.itemTrailingIcon] })" />
260
- </ListboxItemIndicator>
261
- </span>
262
- </slot>
263
- </ULinkBase>
264
- </ULink>
265
- </ListboxItem>
266
- </ListboxGroup>
324
+ <ReuseItemTemplate
325
+ v-for="(item, index) in group.items"
326
+ :key="`group-${group.id}-${index}`"
327
+ :item="item"
328
+ :index="index"
329
+ :group="group"
330
+ />
331
+ </ListboxGroup>
332
+ </template>
267
333
  </div>
268
334
 
269
335
  <div v-else :class="ui.empty({ class: props.ui?.empty })">
@@ -11,6 +11,7 @@ export interface CommandPaletteItem extends Omit<LinkProps, 'type' | 'raw' | 'cu
11
11
  prefix?: string;
12
12
  label?: string;
13
13
  suffix?: string;
14
+ description?: string;
14
15
  /**
15
16
  * @IconifyIcon
16
17
  */
@@ -27,9 +28,9 @@ export interface CommandPaletteItem extends Omit<LinkProps, 'type' | 'raw' | 'cu
27
28
  */
28
29
  placeholder?: string;
29
30
  children?: CommandPaletteItem[];
30
- onSelect?(e?: Event): void;
31
+ onSelect?: (e: Event) => void;
31
32
  class?: any;
32
- ui?: Pick<CommandPalette['slots'], 'item' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemLeadingChipSize' | 'itemLeadingChip' | 'itemLabel' | 'itemLabelPrefix' | 'itemLabelBase' | 'itemLabelSuffix' | 'itemTrailing' | 'itemTrailingKbds' | 'itemTrailingKbdsSize' | 'itemTrailingHighlightedIcon' | 'itemTrailingIcon'>;
33
+ ui?: Pick<CommandPalette['slots'], 'item' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemLeadingChipSize' | 'itemLeadingChip' | 'itemWrapper' | 'itemLabel' | 'itemDescription' | 'itemLabelPrefix' | 'itemLabelBase' | 'itemLabelSuffix' | 'itemTrailing' | 'itemTrailingKbds' | 'itemTrailingKbdsSize' | 'itemTrailingHighlightedIcon' | 'itemTrailingIcon'>;
33
34
  [key: string]: any;
34
35
  }
35
36
  export interface CommandPaletteGroup<T extends CommandPaletteItem = CommandPaletteItem> {
@@ -63,6 +64,12 @@ export interface CommandPaletteProps<G extends CommandPaletteGroup<T> = CommandP
63
64
  * @IconifyIcon
64
65
  */
65
66
  icon?: IconProps['name'];
67
+ /**
68
+ * The icon displayed on the right side of the input.
69
+ * @defaultValue appConfig.ui.icons.search
70
+ * @IconifyIcon
71
+ */
72
+ trailingIcon?: IconProps['name'];
66
73
  /**
67
74
  * The icon displayed when an item is selected.
68
75
  * @defaultValue appConfig.ui.icons.check
@@ -74,7 +81,7 @@ export interface CommandPaletteProps<G extends CommandPaletteGroup<T> = CommandP
74
81
  * @defaultValue appConfig.ui.icons.chevronRight
75
82
  * @IconifyIcon
76
83
  */
77
- trailingIcon?: IconProps['name'];
84
+ childrenIcon?: IconProps['name'];
78
85
  /**
79
86
  * The placeholder text for the input.
80
87
  * @defaultValue t('commandPalette.placeholder')
@@ -124,11 +131,39 @@ export interface CommandPaletteProps<G extends CommandPaletteGroup<T> = CommandP
124
131
  }
125
132
  */
126
133
  fuse?: UseFuseOptions<T>;
134
+ /**
135
+ * Enable virtualization for large lists.
136
+ * Note: when enabled, all groups are flattened into a single list due to a limitation of Reka UI (https://github.com/unovue/reka-ui/issues/1885).
137
+ * @defaultValue false
138
+ */
139
+ virtualize?: boolean | {
140
+ /**
141
+ * Number of items rendered outside the visible area
142
+ * @defaultValue 12
143
+ */
144
+ overscan?: number;
145
+ /**
146
+ * Estimated size (in px) of each item
147
+ * @defaultValue 32
148
+ */
149
+ estimateSize?: number;
150
+ };
127
151
  /**
128
152
  * The key used to get the label from the item.
129
153
  * @defaultValue 'label'
130
154
  */
131
155
  labelKey?: GetItemKeys<T>;
156
+ /**
157
+ * The key used to get the description from the item.
158
+ * @defaultValue 'description'
159
+ */
160
+ descriptionKey?: GetItemKeys<T>;
161
+ /**
162
+ * Whether to preserve the order of groups as defined in the `groups` prop when filtering.
163
+ * When `false`, groups will appear based on item matches.
164
+ * @defaultValue false
165
+ */
166
+ preserveGroupOrder?: boolean;
132
167
  class?: any;
133
168
  ui?: CommandPalette['slots'];
134
169
  }
@@ -138,29 +173,25 @@ export type CommandPaletteEmits<T extends CommandPaletteItem = CommandPaletteIte
138
173
  type SlotProps<T> = (props: {
139
174
  item: T;
140
175
  index: number;
176
+ ui: CommandPalette['ui'];
141
177
  }) => any;
142
178
  export type CommandPaletteSlots<G extends CommandPaletteGroup<T> = CommandPaletteGroup<any>, T extends CommandPaletteItem = CommandPaletteItem> = {
143
179
  'empty'(props: {
144
180
  searchTerm?: string;
145
181
  }): any;
146
182
  'footer'(props: {
147
- ui: {
148
- [K in keyof Required<CommandPalette['slots']>]: (props?: Record<string, any>) => string;
149
- };
183
+ ui: CommandPalette['ui'];
150
184
  }): any;
151
185
  'back'(props: {
152
- ui: {
153
- [K in keyof Required<CommandPalette['slots']>]: (props?: Record<string, any>) => string;
154
- };
186
+ ui: CommandPalette['ui'];
155
187
  }): any;
156
188
  'close'(props: {
157
- ui: {
158
- [K in keyof Required<CommandPalette['slots']>]: (props?: Record<string, any>) => string;
159
- };
189
+ ui: CommandPalette['ui'];
160
190
  }): any;
161
191
  'item': SlotProps<T>;
162
192
  'item-leading': SlotProps<T>;
163
193
  'item-label': SlotProps<T>;
194
+ 'item-description': SlotProps<T>;
164
195
  'item-trailing': SlotProps<T>;
165
196
  } & Record<string, SlotProps<G>> & Record<string, SlotProps<T>>;
166
197
  declare const __VLS_export: <G extends CommandPaletteGroup<T>, T extends CommandPaletteItem>(__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<{
@@ -7,13 +7,16 @@ import type { ComponentConfig } from '../types/tv';
7
7
  type ContextMenu = ComponentConfig<typeof theme, AppConfig, 'contextMenu'>;
8
8
  export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
9
9
  label?: string;
10
+ description?: string;
10
11
  /**
11
12
  * @IconifyIcon
12
13
  */
13
14
  icon?: IconProps['name'];
14
15
  color?: ContextMenu['variants']['color'];
15
16
  avatar?: AvatarProps;
16
- content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<ContextMenuContentEmits>>;
17
+ content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> & {
18
+ class?: any;
19
+ } & Partial<EmitsToProps<ContextMenuContentEmits>>;
17
20
  kbds?: KbdProps['value'][] | KbdProps[];
18
21
  /**
19
22
  * The item type.
@@ -27,10 +30,10 @@ export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custo
27
30
  open?: boolean;
28
31
  defaultOpen?: boolean;
29
32
  children?: ArrayOrNested<ContextMenuItem>;
30
- onSelect?(e: Event): void;
31
- onUpdateChecked?(checked: boolean): void;
33
+ onSelect?: (e: Event) => void;
34
+ onUpdateChecked?: (checked: boolean) => void;
32
35
  class?: any;
33
- ui?: Pick<ContextMenu['slots'], 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemLabel' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
36
+ ui?: Pick<ContextMenu['slots'], 'content' | 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemWrapper' | 'itemLabel' | 'itemDescription' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
34
37
  [key: string]: any;
35
38
  }
36
39
  export interface ContextMenuProps<T extends ArrayOrNested<ContextMenuItem> = ArrayOrNested<ContextMenuItem>> extends Omit<ContextMenuRootProps, 'dir'> {
@@ -70,6 +73,11 @@ export interface ContextMenuProps<T extends ArrayOrNested<ContextMenuItem> = Arr
70
73
  * @defaultValue 'label'
71
74
  */
72
75
  labelKey?: GetItemKeys<T>;
76
+ /**
77
+ * The key used to get the description from the item.
78
+ * @defaultValue 'description'
79
+ */
80
+ descriptionKey?: GetItemKeys<T>;
73
81
  disabled?: boolean;
74
82
  class?: any;
75
83
  ui?: ContextMenu['slots'];
@@ -80,18 +88,32 @@ type SlotProps<T extends ContextMenuItem> = (props: {
80
88
  item: T;
81
89
  active?: boolean;
82
90
  index: number;
91
+ ui: ContextMenu['ui'];
83
92
  }) => any;
84
93
  export type ContextMenuSlots<A extends ArrayOrNested<ContextMenuItem> = ArrayOrNested<ContextMenuItem>, T extends NestedItem<A> = NestedItem<A>> = {
85
94
  'default'(props?: {}): any;
86
95
  'item': SlotProps<T>;
87
96
  'item-leading': SlotProps<T>;
88
- 'item-label': SlotProps<T>;
97
+ 'item-label': (props: {
98
+ item: T;
99
+ active?: boolean;
100
+ index: number;
101
+ }) => any;
102
+ 'item-description': (props: {
103
+ item: T;
104
+ active?: boolean;
105
+ index: number;
106
+ }) => any;
89
107
  'item-trailing': SlotProps<T>;
90
108
  'content-top': (props?: {}) => any;
91
109
  'content-bottom': (props?: {}) => any;
92
- } & DynamicSlots<MergeTypes<T>, 'leading' | 'label' | 'trailing', {
110
+ } & DynamicSlots<MergeTypes<T>, 'label' | 'description', {
111
+ active?: boolean;
112
+ index: number;
113
+ }> & DynamicSlots<MergeTypes<T>, 'leading' | 'trailing', {
93
114
  active?: boolean;
94
115
  index: number;
116
+ ui: ContextMenu['ui'];
95
117
  }>;
96
118
  declare const __VLS_export: <T extends ArrayOrNested<ContextMenuItem>>(__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
119
  props: __VLS_PrettifyLocal<ContextMenuProps<T> & {
@@ -19,6 +19,7 @@ const props = defineProps({
19
19
  content: { type: Object, required: false },
20
20
  portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
21
21
  labelKey: { type: null, required: false, default: "label" },
22
+ descriptionKey: { type: null, required: false, default: "description" },
22
23
  disabled: { type: Boolean, required: false },
23
24
  class: { type: null, required: false },
24
25
  ui: { type: null, required: false },
@@ -50,6 +51,7 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contextMenu |
50
51
  :items="items"
51
52
  :portal="portal"
52
53
  :label-key="labelKey"
54
+ :description-key="descriptionKey"
53
55
  :checked-icon="checkedIcon"
54
56
  :loading-icon="loadingIcon"
55
57
  :external-icon="externalIcon"
@@ -7,13 +7,16 @@ import type { ComponentConfig } from '../types/tv';
7
7
  type ContextMenu = ComponentConfig<typeof theme, AppConfig, 'contextMenu'>;
8
8
  export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
9
9
  label?: string;
10
+ description?: string;
10
11
  /**
11
12
  * @IconifyIcon
12
13
  */
13
14
  icon?: IconProps['name'];
14
15
  color?: ContextMenu['variants']['color'];
15
16
  avatar?: AvatarProps;
16
- content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<ContextMenuContentEmits>>;
17
+ content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> & {
18
+ class?: any;
19
+ } & Partial<EmitsToProps<ContextMenuContentEmits>>;
17
20
  kbds?: KbdProps['value'][] | KbdProps[];
18
21
  /**
19
22
  * The item type.
@@ -27,10 +30,10 @@ export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custo
27
30
  open?: boolean;
28
31
  defaultOpen?: boolean;
29
32
  children?: ArrayOrNested<ContextMenuItem>;
30
- onSelect?(e: Event): void;
31
- onUpdateChecked?(checked: boolean): void;
33
+ onSelect?: (e: Event) => void;
34
+ onUpdateChecked?: (checked: boolean) => void;
32
35
  class?: any;
33
- ui?: Pick<ContextMenu['slots'], 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemLabel' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
36
+ ui?: Pick<ContextMenu['slots'], 'content' | 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemWrapper' | 'itemLabel' | 'itemDescription' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
34
37
  [key: string]: any;
35
38
  }
36
39
  export interface ContextMenuProps<T extends ArrayOrNested<ContextMenuItem> = ArrayOrNested<ContextMenuItem>> extends Omit<ContextMenuRootProps, 'dir'> {
@@ -70,6 +73,11 @@ export interface ContextMenuProps<T extends ArrayOrNested<ContextMenuItem> = Arr
70
73
  * @defaultValue 'label'
71
74
  */
72
75
  labelKey?: GetItemKeys<T>;
76
+ /**
77
+ * The key used to get the description from the item.
78
+ * @defaultValue 'description'
79
+ */
80
+ descriptionKey?: GetItemKeys<T>;
73
81
  disabled?: boolean;
74
82
  class?: any;
75
83
  ui?: ContextMenu['slots'];
@@ -80,18 +88,32 @@ type SlotProps<T extends ContextMenuItem> = (props: {
80
88
  item: T;
81
89
  active?: boolean;
82
90
  index: number;
91
+ ui: ContextMenu['ui'];
83
92
  }) => any;
84
93
  export type ContextMenuSlots<A extends ArrayOrNested<ContextMenuItem> = ArrayOrNested<ContextMenuItem>, T extends NestedItem<A> = NestedItem<A>> = {
85
94
  'default'(props?: {}): any;
86
95
  'item': SlotProps<T>;
87
96
  'item-leading': SlotProps<T>;
88
- 'item-label': SlotProps<T>;
97
+ 'item-label': (props: {
98
+ item: T;
99
+ active?: boolean;
100
+ index: number;
101
+ }) => any;
102
+ 'item-description': (props: {
103
+ item: T;
104
+ active?: boolean;
105
+ index: number;
106
+ }) => any;
89
107
  'item-trailing': SlotProps<T>;
90
108
  'content-top': (props?: {}) => any;
91
109
  'content-bottom': (props?: {}) => any;
92
- } & DynamicSlots<MergeTypes<T>, 'leading' | 'label' | 'trailing', {
110
+ } & DynamicSlots<MergeTypes<T>, 'label' | 'description', {
111
+ active?: boolean;
112
+ index: number;
113
+ }> & DynamicSlots<MergeTypes<T>, 'leading' | 'trailing', {
93
114
  active?: boolean;
94
115
  index: number;
116
+ ui: ContextMenu['ui'];
95
117
  }>;
96
118
  declare const __VLS_export: <T extends ArrayOrNested<ContextMenuItem>>(__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
119
  props: __VLS_PrettifyLocal<ContextMenuProps<T> & {
@@ -11,6 +11,7 @@ interface ContextMenuContentProps<T extends ArrayOrNested<ContextMenuItem>> exte
11
11
  portal?: boolean | string | HTMLElement;
12
12
  sub?: boolean;
13
13
  labelKey: GetItemKeys<T>;
14
+ descriptionKey: GetItemKeys<T>;
14
15
  /**
15
16
  * @IconifyIcon
16
17
  */
@@ -24,9 +25,7 @@ interface ContextMenuContentProps<T extends ArrayOrNested<ContextMenuItem>> exte
24
25
  */
25
26
  externalIcon?: boolean | IconProps['name'];
26
27
  class?: any;
27
- ui: {
28
- [K in keyof Required<ContextMenu['slots']>]: (props?: Record<string, any>) => string;
29
- };
28
+ ui: ContextMenu['ui'];
30
29
  uiOverride?: ContextMenu['slots'];
31
30
  }
32
31
  declare const __VLS_export: <T extends ArrayOrNested<ContextMenuItem>>(__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<{