@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
@@ -1,4 +1,4 @@
1
- import type { TreeRootProps, TreeRootEmits } from 'reka-ui';
1
+ import type { TreeRootProps, TreeRootEmits, TreeItemSelectEvent, TreeItemToggleEvent } from 'reka-ui';
2
2
  import type { AppConfig } from '@nuxt/schema';
3
3
  import theme from '#build/ui/tree';
4
4
  import type { IconProps } from '../types';
@@ -19,8 +19,8 @@ export type TreeItem = {
19
19
  disabled?: boolean;
20
20
  slot?: string;
21
21
  children?: TreeItem[];
22
- onToggle?(e: Event): void;
23
- onSelect?(e?: Event): void;
22
+ onToggle?: (e: TreeItemToggleEvent<TreeItem>) => void;
23
+ onSelect?: (e: TreeItemSelectEvent<TreeItem>) => void;
24
24
  class?: any;
25
25
  ui?: Pick<Tree['slots'], 'item' | 'itemWithChildren' | 'link' | 'linkLeadingIcon' | 'linkLabel' | 'linkTrailing' | 'linkTrailingIcon' | 'listWithChildren'>;
26
26
  [key: string]: any;
@@ -30,7 +30,10 @@ export interface TreeProps<T extends TreeItem[] = TreeItem[], M extends boolean
30
30
  * The element or component this component should render as.
31
31
  * @defaultValue 'ul'
32
32
  */
33
- as?: any;
33
+ as?: any | {
34
+ root?: any;
35
+ link?: any;
36
+ };
34
37
  /**
35
38
  * @defaultValue 'primary'
36
39
  */
@@ -71,6 +74,31 @@ export interface TreeProps<T extends TreeItem[] = TreeItem[], M extends boolean
71
74
  defaultValue?: M extends true ? T[number][] : T[number];
72
75
  /** Whether multiple options can be selected or not. */
73
76
  multiple?: M & boolean;
77
+ /**
78
+ * Use nested DOM structure (children inside parents) vs flattened structure (all items at same level).
79
+ * When `virtualize` is enabled, this is automatically set to `false`.
80
+ * @defaultValue true
81
+ */
82
+ nested?: boolean;
83
+ /**
84
+ * Enable virtualization for large lists.
85
+ * Note: when enabled, the tree structure is flattened like if `nested` was set to `false`.
86
+ * @defaultValue false
87
+ */
88
+ virtualize?: boolean | {
89
+ /**
90
+ * Number of items rendered outside the visible area
91
+ * @defaultValue 12
92
+ */
93
+ overscan?: number;
94
+ /**
95
+ * Estimated size (in px) of each item
96
+ * @defaultValue 32
97
+ */
98
+ estimateSize?: number;
99
+ };
100
+ onSelect?: (e: TreeItemSelectEvent<T[number]>, item: T[number]) => void;
101
+ onToggle?: (e: TreeItemToggleEvent<T[number]>, item: T[number]) => void;
74
102
  class?: any;
75
103
  ui?: Tree['slots'];
76
104
  }
@@ -81,6 +109,10 @@ type SlotProps<T extends TreeItem> = (props: {
81
109
  level: number;
82
110
  expanded: boolean;
83
111
  selected: boolean;
112
+ indeterminate: boolean | undefined;
113
+ handleSelect: () => void;
114
+ handleToggle: () => void;
115
+ ui: Tree['ui'];
84
116
  }) => any;
85
117
  export type TreeSlots<T extends TreeItem[] = TreeItem[]> = {
86
118
  'item-wrapper': SlotProps<T[number]>;
@@ -92,14 +124,20 @@ export type TreeSlots<T extends TreeItem[] = TreeItem[]> = {
92
124
  index: number;
93
125
  level: number;
94
126
  expanded: boolean;
127
+ ui: Tree['ui'];
95
128
  selected: boolean;
129
+ indeterminate: boolean | undefined;
130
+ handleSelect: () => void;
131
+ handleToggle: () => void;
96
132
  }>;
97
133
  declare const __VLS_export: <T extends TreeItem[], 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<{
98
134
  props: __VLS_PrettifyLocal<TreeProps<T, M> & {
99
135
  "onUpdate:modelValue"?: ((val: M extends true ? T[number][] : T[number]) => any) | undefined;
100
136
  "onUpdate:expanded"?: ((val: string[]) => any) | undefined;
101
137
  }> & import("vue").PublicProps;
102
- expose: (exposed: {}) => void;
138
+ expose: (exposed: import("vue").ShallowUnwrapRef<{
139
+ readonly $el: any;
140
+ }>) => void;
103
141
  attrs: any;
104
142
  slots: TreeSlots<T>;
105
143
  emit: ((evt: "update:modelValue", val: M extends true ? T[number][] : T[number]) => void) & ((evt: "update:expanded", val: string[]) => void);
@@ -3,9 +3,10 @@ import theme from "#build/ui/tree";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
- import { computed } from "vue";
7
- import { TreeRoot, TreeItem, useForwardPropsEmits } from "reka-ui";
6
+ import { computed, toRef, ref } from "vue";
7
+ import { TreeRoot, TreeItem, TreeVirtualizer, useForwardPropsEmits } from "reka-ui";
8
8
  import { reactivePick, createReusableTemplate } from "@vueuse/core";
9
+ import { defu } from "defu";
9
10
  import { useAppConfig } from "#imports";
10
11
  import { get } from "../utils";
11
12
  import { tv } from "../utils/tv";
@@ -24,6 +25,10 @@ const props = defineProps({
24
25
  modelValue: { type: null, required: false },
25
26
  defaultValue: { type: null, required: false },
26
27
  multiple: { type: Boolean, required: false },
28
+ nested: { type: Boolean, required: false, default: true },
29
+ virtualize: { type: [Boolean, Object], required: false, default: false },
30
+ onSelect: { type: Function, required: false },
31
+ onToggle: { type: Function, required: false },
27
32
  class: { type: null, required: false },
28
33
  ui: { type: null, required: false },
29
34
  expanded: { type: Array, required: false },
@@ -36,12 +41,62 @@ const props = defineProps({
36
41
  const emits = defineEmits(["update:modelValue", "update:expanded"]);
37
42
  const slots = defineSlots();
38
43
  const appConfig = useAppConfig();
39
- const rootProps = useForwardPropsEmits(reactivePick(props, "as", "items", "multiple", "expanded", "disabled", "propagateSelect", "bubbleSelect"), emits);
44
+ const rootProps = useForwardPropsEmits(reactivePick(props, "items", "multiple", "expanded", "disabled", "propagateSelect", "bubbleSelect"), emits);
45
+ const as = computed(() => {
46
+ if (typeof props.as === "string" || typeof props.as?.render === "function") {
47
+ return { root: props.as, link: "button" };
48
+ }
49
+ return defu(props.as, { root: "ul", link: "button" });
50
+ });
51
+ const nested = computed(() => props.virtualize ? false : props.nested);
52
+ const flattenedPaddingFormula = computed(() => {
53
+ const sizeConfig = {
54
+ xs: { base: 2, perLevel: 5.5 },
55
+ // px-2, ms-4 + ps-1.5
56
+ sm: { base: 2.5, perLevel: 6 },
57
+ // px-2.5, ms-4.5 + ps-1.5
58
+ md: { base: 2.5, perLevel: 6.5 },
59
+ // px-2.5, ms-5 + ps-1.5
60
+ lg: { base: 3, perLevel: 7 },
61
+ // px-3, ms-5.5 + ps-1.5
62
+ xl: { base: 3, perLevel: 7.5 }
63
+ // px-3, ms-6 + ps-1.5
64
+ };
65
+ const config = sizeConfig[props.size || "md"];
66
+ return (level) => `calc(var(--spacing) * ${(level - 1) * config.perLevel + config.base})`;
67
+ });
68
+ const virtualizerProps = toRef(() => !!props.virtualize && defu(typeof props.virtualize === "boolean" ? {} : props.virtualize, {
69
+ estimateSize: {
70
+ xs: 24,
71
+ sm: 28,
72
+ md: 32,
73
+ lg: 36,
74
+ xl: 40
75
+ }[props.size || "md"]
76
+ }));
40
77
  const [DefineTreeTemplate, ReuseTreeTemplate] = createReusableTemplate();
78
+ const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate({
79
+ props: {
80
+ item: {
81
+ type: Object,
82
+ required: true
83
+ },
84
+ index: {
85
+ type: Number,
86
+ required: true
87
+ },
88
+ level: {
89
+ type: Number,
90
+ required: true
91
+ }
92
+ }
93
+ });
41
94
  const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.tree || {} })({
42
95
  color: props.color,
43
- size: props.size
96
+ size: props.size,
97
+ virtualize: !!props.virtualize
44
98
  }));
99
+ const rootRef = ref();
45
100
  function getItemLabel(item) {
46
101
  return get(item, props.labelKey);
47
102
  }
@@ -53,106 +108,120 @@ function getDefaultOpenedItems(item) {
53
108
  const childItems = item.children?.flatMap((child) => getDefaultOpenedItems(child)) ?? [];
54
109
  return [currentItem, ...childItems].filter(Boolean);
55
110
  }
56
- const defaultExpanded = computed(
57
- () => props.defaultExpanded ?? props.items?.flatMap((item) => getDefaultOpenedItems(item))
58
- );
111
+ const defaultExpanded = computed(() => props.defaultExpanded ?? props.items?.flatMap((item) => getDefaultOpenedItems(item)));
112
+ defineExpose({
113
+ get $el() {
114
+ return rootRef.value?.$el;
115
+ }
116
+ });
59
117
  </script>
60
118
 
61
119
  <template>
62
- <DefineTreeTemplate v-slot="{ items, level }">
63
- <TreeItem
64
- v-for="(item, index) in items"
65
- :key="`${level}-${index}`"
66
- v-slot="{ isExpanded, isSelected }"
67
- :level="level"
68
- :value="item"
69
- :class="level > 1 ? ui.itemWithChildren({ class: [props.ui?.itemWithChildren, item.ui?.itemWithChildren] }) : ui.item({ class: [props.ui?.item, item.ui?.item] })"
70
- @toggle="item.onToggle"
71
- @select="item.onSelect"
120
+ <DefineItemTemplate v-slot="{ item, index, level }">
121
+ <li
122
+ role="presentation"
123
+ :class="!!nested && level > 1 ? ui.itemWithChildren({ class: [props.ui?.itemWithChildren, item.ui?.itemWithChildren] }) : ui.item({ class: [props.ui?.item, item.ui?.item] })"
72
124
  >
73
- <slot
74
- :name="item.slot ? `${item.slot}-wrapper` : 'item-wrapper'"
75
- v-bind="{ index, level, expanded: isExpanded, selected: isSelected }"
76
- :item="item"
125
+ <TreeItem
126
+ v-slot="{ isExpanded, isSelected, isIndeterminate, handleSelect, handleToggle }"
127
+ :level="level"
128
+ :value="item"
129
+ as-child
130
+ @toggle="(item.onToggle ?? props.onToggle)?.($event, item)"
131
+ @select="(item.onSelect ?? props.onSelect)?.($event, item)"
77
132
  >
78
- <button
79
- type="button"
80
- :disabled="item.disabled || disabled"
81
- :data-expanded="isExpanded"
82
- :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], selected: isSelected, disabled: item.disabled || disabled })"
133
+ <slot
134
+ :name="item.slot ? `${item.slot}-wrapper` : 'item-wrapper'"
135
+ v-bind="{ index, level, expanded: isExpanded, selected: isSelected, indeterminate: isIndeterminate, handleSelect, handleToggle, ui }"
136
+ :item="item"
83
137
  >
84
- <slot
85
- :name="item.slot || 'item'"
86
- v-bind="{ index, level, expanded: isExpanded, selected: isSelected }"
87
- :item="item"
138
+ <component
139
+ :is="as.link"
140
+ :type="as.link === 'button' ? 'button' : void 0"
141
+ :disabled="item.disabled || disabled"
142
+ :class="ui.link({ class: [props.ui?.link, item.ui?.link, item.class], selected: isSelected, disabled: item.disabled || disabled })"
143
+ :style="!nested && level > 1 ? { paddingLeft: flattenedPaddingFormula(level) } : void 0"
88
144
  >
89
145
  <slot
90
- :name="item.slot ? `${item.slot}-leading` : 'item-leading'"
91
- v-bind="{ index, level, expanded: isExpanded, selected: isSelected }"
146
+ :name="item.slot || 'item'"
147
+ v-bind="{ index, level, expanded: isExpanded, selected: isSelected, indeterminate: isIndeterminate, handleSelect, handleToggle, ui }"
92
148
  :item="item"
93
- >
94
- <UIcon
95
- v-if="item.icon"
96
- :name="item.icon"
97
- :class="ui.linkLeadingIcon({ class: [props.ui?.linkLeadingIcon, item.ui?.linkLeadingIcon] })"
98
- />
99
- <UIcon
100
- v-else-if="item.children?.length"
101
- :name="isExpanded ? expandedIcon ?? appConfig.ui.icons.folderOpen : collapsedIcon ?? appConfig.ui.icons.folder"
102
- :class="ui.linkLeadingIcon({ class: [props.ui?.linkLeadingIcon, item.ui?.linkLeadingIcon] })"
103
- />
104
- </slot>
105
-
106
- <span
107
- v-if="getItemLabel(item) || !!slots[item.slot ? `${item.slot}-label` : 'item-label']"
108
- :class="ui.linkLabel({ class: [props.ui?.linkLabel, item.ui?.linkLabel] })"
109
149
  >
110
150
  <slot
111
- :name="item.slot ? `${item.slot}-label` : 'item-label'"
112
- v-bind="{ index, level, expanded: isExpanded, selected: isSelected }"
113
- :item="item"
114
- >
115
- {{ getItemLabel(item) }}
116
- </slot>
117
- </span>
118
-
119
- <span
120
- v-if="item.trailingIcon || item.children?.length || !!slots[item.slot ? `${item.slot}-trailing` : 'item-trailing']"
121
- :class="ui.linkTrailing({ class: [props.ui?.linkTrailing, item.ui?.linkTrailing] })"
122
- >
123
- <slot
124
- :name="item.slot ? `${item.slot}-trailing` : 'item-trailing'"
125
- v-bind="{ index, level, expanded: isExpanded, selected: isSelected }"
151
+ :name="item.slot ? `${item.slot}-leading` : 'item-leading'"
152
+ v-bind="{ index, level, expanded: isExpanded, selected: isSelected, indeterminate: isIndeterminate, handleSelect, handleToggle, ui }"
126
153
  :item="item"
127
154
  >
128
155
  <UIcon
129
- v-if="item.trailingIcon"
130
- :name="item.trailingIcon"
131
- :class="ui.linkTrailingIcon({ class: [props.ui?.linkTrailingIcon, item.ui?.linkTrailingIcon] })"
156
+ v-if="item.icon"
157
+ :name="item.icon"
158
+ :class="ui.linkLeadingIcon({ class: [props.ui?.linkLeadingIcon, item.ui?.linkLeadingIcon] })"
132
159
  />
133
160
  <UIcon
134
161
  v-else-if="item.children?.length"
135
- :name="trailingIcon ?? appConfig.ui.icons.chevronDown"
136
- :class="ui.linkTrailingIcon({ class: [props.ui?.linkTrailingIcon, item.ui?.linkTrailingIcon] })"
162
+ :name="isExpanded ? expandedIcon ?? appConfig.ui.icons.folderOpen : collapsedIcon ?? appConfig.ui.icons.folder"
163
+ :class="ui.linkLeadingIcon({ class: [props.ui?.linkLeadingIcon, item.ui?.linkLeadingIcon] })"
137
164
  />
138
165
  </slot>
139
- </span>
140
- </slot>
141
- </button>
142
- </slot>
143
166
 
144
- <ul
145
- v-if="item.children?.length && isExpanded"
146
- role="group"
147
- :class="ui.listWithChildren({ class: [props.ui?.listWithChildren, item.ui?.listWithChildren] })"
148
- >
149
- <ReuseTreeTemplate :items="item.children" :level="level + 1" />
150
- </ul>
151
- </TreeItem>
167
+ <span
168
+ v-if="getItemLabel(item) || !!slots[item.slot ? `${item.slot}-label` : 'item-label']"
169
+ :class="ui.linkLabel({ class: [props.ui?.linkLabel, item.ui?.linkLabel] })"
170
+ >
171
+ <slot
172
+ :name="item.slot ? `${item.slot}-label` : 'item-label'"
173
+ v-bind="{ index, level, expanded: isExpanded, selected: isSelected, indeterminate: isIndeterminate, handleSelect, handleToggle, ui }"
174
+ :item="item"
175
+ >
176
+ {{ getItemLabel(item) }}
177
+ </slot>
178
+ </span>
179
+
180
+ <span
181
+ v-if="item.trailingIcon || item.children?.length || !!slots[item.slot ? `${item.slot}-trailing` : 'item-trailing']"
182
+ :class="ui.linkTrailing({ class: [props.ui?.linkTrailing, item.ui?.linkTrailing] })"
183
+ >
184
+ <slot
185
+ :name="item.slot ? `${item.slot}-trailing` : 'item-trailing'"
186
+ v-bind="{ index, level, expanded: isExpanded, selected: isSelected, indeterminate: isIndeterminate, handleSelect, handleToggle, ui }"
187
+ :item="item"
188
+ >
189
+ <UIcon
190
+ v-if="item.trailingIcon"
191
+ :name="item.trailingIcon"
192
+ :class="ui.linkTrailingIcon({ class: [props.ui?.linkTrailingIcon, item.ui?.linkTrailingIcon] })"
193
+ />
194
+ <UIcon
195
+ v-else-if="item.children?.length"
196
+ :name="trailingIcon ?? appConfig.ui.icons.chevronDown"
197
+ :class="ui.linkTrailingIcon({ class: [props.ui?.linkTrailingIcon, item.ui?.linkTrailingIcon] })"
198
+ />
199
+ </slot>
200
+ </span>
201
+ </slot>
202
+ </component>
203
+ </slot>
204
+
205
+ <ul
206
+ v-if="nested && item.children?.length && isExpanded"
207
+ role="group"
208
+ :class="ui.listWithChildren({ class: [props.ui?.listWithChildren, item.ui?.listWithChildren] })"
209
+ >
210
+ <ReuseTreeTemplate :items="item.children" :level="level + 1" />
211
+ </ul>
212
+ </TreeItem>
213
+ </li>
214
+ </DefineItemTemplate>
215
+
216
+ <DefineTreeTemplate v-slot="{ items, level }">
217
+ <ReuseItemTemplate v-for="(item, index) in items" :key="`${level}-${index}`" :item="item" :index="index" :level="level" />
152
218
  </DefineTreeTemplate>
153
219
 
154
220
  <TreeRoot
221
+ ref="rootRef"
222
+ v-slot="{ flattenItems }"
155
223
  v-bind="{ ...rootProps, ...$attrs }"
224
+ :as="as.root"
156
225
  :model-value="modelValue"
157
226
  :default-value="defaultValue"
158
227
  :class="ui.root({ class: [props.ui?.root, props.class] })"
@@ -160,6 +229,25 @@ const defaultExpanded = computed(
160
229
  :default-expanded="defaultExpanded"
161
230
  :selection-behavior="selectionBehavior"
162
231
  >
163
- <ReuseTreeTemplate :items="items" :level="1" />
232
+ <TreeVirtualizer
233
+ v-if="!!virtualize"
234
+ v-slot="{ item, virtualItem }"
235
+ :text-content="(item2) => getItemLabel(item2.value)"
236
+ v-bind="virtualizerProps"
237
+ >
238
+ <ReuseItemTemplate :item="item.value" :index="virtualItem.index" :level="item.level" />
239
+ </TreeVirtualizer>
240
+
241
+ <template v-else-if="!nested">
242
+ <ReuseItemTemplate
243
+ v-for="(item, index) in flattenItems"
244
+ :key="item._id"
245
+ :item="item.value"
246
+ :index="index"
247
+ :level="item.level"
248
+ />
249
+ </template>
250
+
251
+ <ReuseTreeTemplate v-else :items="items" :level="1" />
164
252
  </TreeRoot>
165
253
  </template>
@@ -1,4 +1,4 @@
1
- import type { TreeRootProps, TreeRootEmits } from 'reka-ui';
1
+ import type { TreeRootProps, TreeRootEmits, TreeItemSelectEvent, TreeItemToggleEvent } from 'reka-ui';
2
2
  import type { AppConfig } from '@nuxt/schema';
3
3
  import theme from '#build/ui/tree';
4
4
  import type { IconProps } from '../types';
@@ -19,8 +19,8 @@ export type TreeItem = {
19
19
  disabled?: boolean;
20
20
  slot?: string;
21
21
  children?: TreeItem[];
22
- onToggle?(e: Event): void;
23
- onSelect?(e?: Event): void;
22
+ onToggle?: (e: TreeItemToggleEvent<TreeItem>) => void;
23
+ onSelect?: (e: TreeItemSelectEvent<TreeItem>) => void;
24
24
  class?: any;
25
25
  ui?: Pick<Tree['slots'], 'item' | 'itemWithChildren' | 'link' | 'linkLeadingIcon' | 'linkLabel' | 'linkTrailing' | 'linkTrailingIcon' | 'listWithChildren'>;
26
26
  [key: string]: any;
@@ -30,7 +30,10 @@ export interface TreeProps<T extends TreeItem[] = TreeItem[], M extends boolean
30
30
  * The element or component this component should render as.
31
31
  * @defaultValue 'ul'
32
32
  */
33
- as?: any;
33
+ as?: any | {
34
+ root?: any;
35
+ link?: any;
36
+ };
34
37
  /**
35
38
  * @defaultValue 'primary'
36
39
  */
@@ -71,6 +74,31 @@ export interface TreeProps<T extends TreeItem[] = TreeItem[], M extends boolean
71
74
  defaultValue?: M extends true ? T[number][] : T[number];
72
75
  /** Whether multiple options can be selected or not. */
73
76
  multiple?: M & boolean;
77
+ /**
78
+ * Use nested DOM structure (children inside parents) vs flattened structure (all items at same level).
79
+ * When `virtualize` is enabled, this is automatically set to `false`.
80
+ * @defaultValue true
81
+ */
82
+ nested?: boolean;
83
+ /**
84
+ * Enable virtualization for large lists.
85
+ * Note: when enabled, the tree structure is flattened like if `nested` was set to `false`.
86
+ * @defaultValue false
87
+ */
88
+ virtualize?: boolean | {
89
+ /**
90
+ * Number of items rendered outside the visible area
91
+ * @defaultValue 12
92
+ */
93
+ overscan?: number;
94
+ /**
95
+ * Estimated size (in px) of each item
96
+ * @defaultValue 32
97
+ */
98
+ estimateSize?: number;
99
+ };
100
+ onSelect?: (e: TreeItemSelectEvent<T[number]>, item: T[number]) => void;
101
+ onToggle?: (e: TreeItemToggleEvent<T[number]>, item: T[number]) => void;
74
102
  class?: any;
75
103
  ui?: Tree['slots'];
76
104
  }
@@ -81,6 +109,10 @@ type SlotProps<T extends TreeItem> = (props: {
81
109
  level: number;
82
110
  expanded: boolean;
83
111
  selected: boolean;
112
+ indeterminate: boolean | undefined;
113
+ handleSelect: () => void;
114
+ handleToggle: () => void;
115
+ ui: Tree['ui'];
84
116
  }) => any;
85
117
  export type TreeSlots<T extends TreeItem[] = TreeItem[]> = {
86
118
  'item-wrapper': SlotProps<T[number]>;
@@ -92,14 +124,20 @@ export type TreeSlots<T extends TreeItem[] = TreeItem[]> = {
92
124
  index: number;
93
125
  level: number;
94
126
  expanded: boolean;
127
+ ui: Tree['ui'];
95
128
  selected: boolean;
129
+ indeterminate: boolean | undefined;
130
+ handleSelect: () => void;
131
+ handleToggle: () => void;
96
132
  }>;
97
133
  declare const __VLS_export: <T extends TreeItem[], 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<{
98
134
  props: __VLS_PrettifyLocal<TreeProps<T, M> & {
99
135
  "onUpdate:modelValue"?: ((val: M extends true ? T[number][] : T[number]) => any) | undefined;
100
136
  "onUpdate:expanded"?: ((val: string[]) => any) | undefined;
101
137
  }> & import("vue").PublicProps;
102
- expose: (exposed: {}) => void;
138
+ expose: (exposed: import("vue").ShallowUnwrapRef<{
139
+ readonly $el: any;
140
+ }>) => void;
103
141
  attrs: any;
104
142
  slots: TreeSlots<T>;
105
143
  emit: ((evt: "update:modelValue", val: M extends true ? T[number][] : T[number]) => void) & ((evt: "update:expanded", val: string[]) => void);
@@ -31,7 +31,9 @@ export interface UserProps {
31
31
  ui?: User['slots'];
32
32
  }
33
33
  export interface UserSlots {
34
- avatar(props?: {}): any;
34
+ avatar(props: {
35
+ ui: User['ui'];
36
+ }): any;
35
37
  name(props?: {}): any;
36
38
  description(props?: {}): any;
37
39
  default(props?: {}): any;
@@ -36,7 +36,7 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.user || {} })
36
36
 
37
37
  <template>
38
38
  <Primitive :as="as" :data-orientation="orientation" :class="ui.root({ class: [props.ui?.root, props.class] })" @click="onClick">
39
- <slot name="avatar">
39
+ <slot name="avatar" :ui="ui">
40
40
  <UChip v-if="chip && avatar" inset v-bind="typeof chip === 'object' ? chip : {}" :size="size">
41
41
  <UAvatar :alt="name" v-bind="avatar" :size="size" :class="ui.avatar({ class: props.ui?.avatar })" />
42
42
  </UChip>
@@ -31,7 +31,9 @@ export interface UserProps {
31
31
  ui?: User['slots'];
32
32
  }
33
33
  export interface UserSlots {
34
- avatar(props?: {}): any;
34
+ avatar(props: {
35
+ ui: User['ui'];
36
+ }): any;
35
37
  name(props?: {}): any;
36
38
  description(props?: {}): any;
37
39
  default(props?: {}): any;
@@ -78,6 +78,7 @@ export interface ContentNavigationEmits extends AccordionRootEmits {
78
78
  type SlotProps<T> = (props: {
79
79
  link: T;
80
80
  active?: boolean;
81
+ ui: ContentNavigation['ui'];
81
82
  }) => any;
82
83
  export interface ContentNavigationSlots<T extends ContentNavigationLink = ContentNavigationLink> {
83
84
  'link': SlotProps<T>;
@@ -71,13 +71,13 @@ const defaultValue = computed(() => {
71
71
 
72
72
  <template>
73
73
  <DefineLinkTemplate v-slot="{ link, active }">
74
- <slot name="link" :link="link" :active="active">
75
- <slot name="link-leading" :link="link" :active="active">
74
+ <slot name="link" :link="link" :active="active" :ui="ui">
75
+ <slot name="link-leading" :link="link" :active="active" :ui="ui">
76
76
  <UIcon v-if="link.icon" :name="link.icon" :class="ui.linkLeadingIcon({ class: [props.ui?.linkLeadingIcon, link.ui?.linkLeadingIcon], active })" />
77
77
  </slot>
78
78
 
79
79
  <span v-if="link.title || !!slots['link-title']" :class="ui.linkTitle({ class: [props.ui?.linkTitle, link.ui?.linkTitle], active })">
80
- <slot name="link-title" :link="link" :active="active">
80
+ <slot name="link-title" :link="link" :active="active" :ui="ui">
81
81
  {{ link.title }}
82
82
  </slot>
83
83
 
@@ -85,7 +85,7 @@ const defaultValue = computed(() => {
85
85
  </span>
86
86
 
87
87
  <span v-if="link.badge || link.children?.length && !disabled || link.trailingIcon || !!slots['link-trailing']" :class="ui.linkTrailing({ class: [props.ui?.linkTrailing, link.ui?.linkTrailing] })">
88
- <slot name="link-trailing" :link="link" :active="active">
88
+ <slot name="link-trailing" :link="link" :active="active" :ui="ui">
89
89
  <UBadge
90
90
  v-if="link.badge"
91
91
  color="neutral"
@@ -129,7 +129,7 @@ const defaultValue = computed(() => {
129
129
  :ui="props.ui"
130
130
  >
131
131
  <template v-for="(_, name) in slots" #[name]="slotData">
132
- <slot :name="name" :link="slotData.link" :active="slotData.active" />
132
+ <slot :name="name" v-bind="{ ...slotData, link }" />
133
133
  </template>
134
134
  </UContentNavigation>
135
135
  </AccordionContent>
@@ -78,6 +78,7 @@ export interface ContentNavigationEmits extends AccordionRootEmits {
78
78
  type SlotProps<T> = (props: {
79
79
  link: T;
80
80
  active?: boolean;
81
+ ui: ContentNavigation['ui'];
81
82
  }) => any;
82
83
  export interface ContentNavigationSlots<T extends ContentNavigationLink = ContentNavigationLink> {
83
84
  'link': SlotProps<T>;
@@ -91,7 +91,9 @@ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchL
91
91
  ui?: ContentSearch['slots'] & CommandPaletteProps<CommandPaletteGroup<ContentSearchItem>, ContentSearchItem>['ui'];
92
92
  }
93
93
  export type ContentSearchSlots = CommandPaletteSlots<CommandPaletteGroup<ContentSearchItem>, ContentSearchItem> & {
94
- content(props?: {}): any;
94
+ content(props: {
95
+ close: () => void;
96
+ }): any;
95
97
  };
96
98
  declare const __VLS_export: <T extends ContentSearchLink>(__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
99
  props: __VLS_PrettifyLocal<(ContentSearchProps<T> & {
@@ -62,11 +62,13 @@ function mapLinksItems(links) {
62
62
  return links.flatMap((link) => [{
63
63
  ...link,
64
64
  suffix: link.description,
65
+ description: void 0,
65
66
  icon: link.icon || appConfig.ui.icons.file
66
67
  }, ...link.children?.map((child) => ({
67
68
  ...child,
68
69
  prefix: link.label + " >",
69
70
  suffix: child.description,
71
+ description: void 0,
70
72
  icon: child.icon || link.icon || appConfig.ui.icons.file
71
73
  })) || []]);
72
74
  }
@@ -165,8 +167,8 @@ defineExpose({
165
167
  v-bind="modalProps"
166
168
  :class="ui.modal({ class: [props.ui?.modal, props.class] })"
167
169
  >
168
- <template #content>
169
- <slot name="content">
170
+ <template #content="contentData">
171
+ <slot name="content" v-bind="contentData">
170
172
  <UCommandPalette
171
173
  ref="commandPaletteRef"
172
174
  v-model:search-term="searchTerm"
@@ -91,7 +91,9 @@ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchL
91
91
  ui?: ContentSearch['slots'] & CommandPaletteProps<CommandPaletteGroup<ContentSearchItem>, ContentSearchItem>['ui'];
92
92
  }
93
93
  export type ContentSearchSlots = CommandPaletteSlots<CommandPaletteGroup<ContentSearchItem>, ContentSearchItem> & {
94
- content(props?: {}): any;
94
+ content(props: {
95
+ close: () => void;
96
+ }): any;
95
97
  };
96
98
  declare const __VLS_export: <T extends ContentSearchLink>(__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
99
  props: __VLS_PrettifyLocal<(ContentSearchProps<T> & {
@@ -62,9 +62,9 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentSearch
62
62
  <slot :name="name" v-bind="slotData" />
63
63
  </template>
64
64
 
65
- <template v-if="!collapsed" #trailing>
65
+ <template v-if="!collapsed" #trailing="{ ui: uiProxy }">
66
66
  <div :class="ui.trailing({ class: props.ui?.trailing })">
67
- <slot name="trailing">
67
+ <slot name="trailing" :ui="uiProxy">
68
68
  <template v-if="kbds?.length">
69
69
  <UKbd v-for="(kbd, index) in kbds" :key="index" variant="subtle" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
70
70
  </template>
@@ -37,6 +37,7 @@ export interface ContentSurroundProps<T extends ContentSurroundLink = ContentSur
37
37
  }
38
38
  type SlotProps<T> = (props: {
39
39
  link: T;
40
+ ui: ContentSurround['ui'];
40
41
  }) => any;
41
42
  export interface ContentSurroundSlots<T extends ContentSurroundLink = ContentSurroundLink> {
42
43
  'link': SlotProps<T>;