@nuxt/ui 4.5.1 → 4.6.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 (177) hide show
  1. package/dist/module.d.mts +7 -0
  2. package/dist/module.json +2 -2
  3. package/dist/module.mjs +78 -67
  4. package/dist/runtime/components/Avatar.vue +10 -12
  5. package/dist/runtime/components/Banner.vue +1 -1
  6. package/dist/runtime/components/BlogPost.vue +3 -2
  7. package/dist/runtime/components/Calendar.d.vue.ts +4 -4
  8. package/dist/runtime/components/Calendar.vue.d.ts +4 -4
  9. package/dist/runtime/components/ChangelogVersion.vue +3 -2
  10. package/dist/runtime/components/ChangelogVersions.vue +1 -1
  11. package/dist/runtime/components/ChatMessage.d.vue.ts +4 -1
  12. package/dist/runtime/components/ChatMessage.vue +5 -0
  13. package/dist/runtime/components/ChatMessage.vue.d.ts +4 -1
  14. package/dist/runtime/components/ChatReasoning.d.vue.ts +78 -0
  15. package/dist/runtime/components/ChatReasoning.vue +162 -0
  16. package/dist/runtime/components/ChatReasoning.vue.d.ts +78 -0
  17. package/dist/runtime/components/ChatShimmer.d.vue.ts +34 -0
  18. package/dist/runtime/components/ChatShimmer.vue +37 -0
  19. package/dist/runtime/components/ChatShimmer.vue.d.ts +34 -0
  20. package/dist/runtime/components/ChatTool.d.vue.ts +88 -0
  21. package/dist/runtime/components/ChatTool.vue +105 -0
  22. package/dist/runtime/components/ChatTool.vue.d.ts +88 -0
  23. package/dist/runtime/components/Checkbox.d.vue.ts +22 -19
  24. package/dist/runtime/components/Checkbox.vue +9 -8
  25. package/dist/runtime/components/Checkbox.vue.d.ts +22 -19
  26. package/dist/runtime/components/DashboardGroup.d.vue.ts +1 -1
  27. package/dist/runtime/components/DashboardGroup.vue.d.ts +1 -1
  28. package/dist/runtime/components/DashboardSearchButton.vue +2 -2
  29. package/dist/runtime/components/Drawer.vue +1 -1
  30. package/dist/runtime/components/DropdownMenu.d.vue.ts +29 -3
  31. package/dist/runtime/components/DropdownMenu.vue +9 -0
  32. package/dist/runtime/components/DropdownMenu.vue.d.ts +29 -3
  33. package/dist/runtime/components/DropdownMenuContent.d.vue.ts +9 -3
  34. package/dist/runtime/components/DropdownMenuContent.vue +62 -9
  35. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +9 -3
  36. package/dist/runtime/components/EditorDragHandle.d.vue.ts +4 -4
  37. package/dist/runtime/components/EditorDragHandle.vue.d.ts +4 -4
  38. package/dist/runtime/components/Error.vue +5 -5
  39. package/dist/runtime/components/FileUpload.d.vue.ts +6 -0
  40. package/dist/runtime/components/FileUpload.vue +11 -7
  41. package/dist/runtime/components/FileUpload.vue.d.ts +6 -0
  42. package/dist/runtime/components/Icon.d.vue.ts +2 -1
  43. package/dist/runtime/components/Icon.vue +1 -1
  44. package/dist/runtime/components/Icon.vue.d.ts +2 -1
  45. package/dist/runtime/components/InputDate.d.vue.ts +4 -4
  46. package/dist/runtime/components/InputDate.vue.d.ts +4 -4
  47. package/dist/runtime/components/InputMenu.d.vue.ts +7 -1
  48. package/dist/runtime/components/InputMenu.vue +67 -48
  49. package/dist/runtime/components/InputMenu.vue.d.ts +7 -1
  50. package/dist/runtime/components/InputTime.d.vue.ts +53 -27
  51. package/dist/runtime/components/InputTime.vue +52 -27
  52. package/dist/runtime/components/InputTime.vue.d.ts +53 -27
  53. package/dist/runtime/components/Kbd.vue +1 -1
  54. package/dist/runtime/components/Modal.vue +1 -1
  55. package/dist/runtime/components/NavigationMenu.vue +1 -0
  56. package/dist/runtime/components/Popover.vue +1 -1
  57. package/dist/runtime/components/Progress.d.vue.ts +1 -1
  58. package/dist/runtime/components/Progress.vue.d.ts +1 -1
  59. package/dist/runtime/components/SelectMenu.d.vue.ts +1 -1
  60. package/dist/runtime/components/SelectMenu.vue +1 -1
  61. package/dist/runtime/components/SelectMenu.vue.d.ts +1 -1
  62. package/dist/runtime/components/Sidebar.d.vue.ts +131 -0
  63. package/dist/runtime/components/Sidebar.vue +222 -0
  64. package/dist/runtime/components/Sidebar.vue.d.ts +131 -0
  65. package/dist/runtime/components/Slideover.vue +1 -1
  66. package/dist/runtime/components/Switch.d.vue.ts +22 -19
  67. package/dist/runtime/components/Switch.vue +7 -6
  68. package/dist/runtime/components/Switch.vue.d.ts +22 -19
  69. package/dist/runtime/components/Table.d.vue.ts +1 -1
  70. package/dist/runtime/components/Table.vue +12 -4
  71. package/dist/runtime/components/Table.vue.d.ts +1 -1
  72. package/dist/runtime/components/Tooltip.d.vue.ts +2 -0
  73. package/dist/runtime/components/Tooltip.vue +3 -2
  74. package/dist/runtime/components/Tooltip.vue.d.ts +2 -0
  75. package/dist/runtime/components/color-mode/ColorModeSelect.d.vue.ts +1 -1
  76. package/dist/runtime/components/color-mode/ColorModeSelect.vue.d.ts +1 -1
  77. package/dist/runtime/components/color-mode/ColorModeSwitch.vue +3 -1
  78. package/dist/runtime/components/content/ContentNavigation.vue +9 -2
  79. package/dist/runtime/components/content/ContentSurround.vue +6 -2
  80. package/dist/runtime/components/content/ContentToc.d.vue.ts +5 -0
  81. package/dist/runtime/components/content/ContentToc.vue +57 -11
  82. package/dist/runtime/components/content/ContentToc.vue.d.ts +5 -0
  83. package/dist/runtime/components/locale/LocaleSelect.d.vue.ts +1 -1
  84. package/dist/runtime/components/locale/LocaleSelect.vue.d.ts +1 -1
  85. package/dist/runtime/components/prose/Pre.vue +0 -4
  86. package/dist/runtime/composables/index.d.ts +11 -0
  87. package/dist/runtime/composables/index.js +11 -0
  88. package/dist/runtime/composables/useEditorMenu.js +1 -1
  89. package/dist/runtime/composables/useFileUpload.d.ts +2 -2
  90. package/dist/runtime/composables/useFileUpload.js +3 -3
  91. package/dist/runtime/composables/{internal/useFilter.js → useFilter.js} +1 -1
  92. package/dist/runtime/composables/useScrollShadow.d.ts +23 -0
  93. package/dist/runtime/composables/useScrollShadow.js +36 -0
  94. package/dist/runtime/index.css +1 -1
  95. package/dist/runtime/keyframes.css +1 -1
  96. package/dist/runtime/locale/ar.js +13 -0
  97. package/dist/runtime/locale/az.js +13 -0
  98. package/dist/runtime/locale/be.js +13 -0
  99. package/dist/runtime/locale/bg.js +13 -0
  100. package/dist/runtime/locale/bn.js +13 -0
  101. package/dist/runtime/locale/ca.js +13 -0
  102. package/dist/runtime/locale/ckb.js +13 -0
  103. package/dist/runtime/locale/cs.js +13 -0
  104. package/dist/runtime/locale/da.js +13 -0
  105. package/dist/runtime/locale/de.js +13 -0
  106. package/dist/runtime/locale/de_ch.js +13 -0
  107. package/dist/runtime/locale/el.js +13 -0
  108. package/dist/runtime/locale/en.js +13 -0
  109. package/dist/runtime/locale/es.js +13 -0
  110. package/dist/runtime/locale/et.js +13 -0
  111. package/dist/runtime/locale/eu.js +13 -0
  112. package/dist/runtime/locale/fa_ir.js +13 -0
  113. package/dist/runtime/locale/fi.js +13 -0
  114. package/dist/runtime/locale/fr.js +13 -0
  115. package/dist/runtime/locale/gl.js +13 -0
  116. package/dist/runtime/locale/he.js +13 -0
  117. package/dist/runtime/locale/hi.js +13 -0
  118. package/dist/runtime/locale/hr.js +13 -0
  119. package/dist/runtime/locale/hu.js +13 -0
  120. package/dist/runtime/locale/hy.js +13 -0
  121. package/dist/runtime/locale/id.js +13 -0
  122. package/dist/runtime/locale/index.d.ts +1 -0
  123. package/dist/runtime/locale/index.js +1 -0
  124. package/dist/runtime/locale/is.d.ts +3 -0
  125. package/dist/runtime/locale/is.js +142 -0
  126. package/dist/runtime/locale/it.js +13 -0
  127. package/dist/runtime/locale/ja.js +13 -0
  128. package/dist/runtime/locale/ka.js +13 -0
  129. package/dist/runtime/locale/kk.js +13 -0
  130. package/dist/runtime/locale/km.js +13 -0
  131. package/dist/runtime/locale/ko.js +13 -0
  132. package/dist/runtime/locale/ky.js +13 -0
  133. package/dist/runtime/locale/lb.js +13 -0
  134. package/dist/runtime/locale/lo.js +13 -0
  135. package/dist/runtime/locale/lt.js +13 -0
  136. package/dist/runtime/locale/mn.js +13 -0
  137. package/dist/runtime/locale/ms.js +13 -0
  138. package/dist/runtime/locale/nb_no.js +13 -0
  139. package/dist/runtime/locale/nl.js +13 -0
  140. package/dist/runtime/locale/pl.js +13 -0
  141. package/dist/runtime/locale/pt.js +13 -0
  142. package/dist/runtime/locale/pt_br.js +13 -0
  143. package/dist/runtime/locale/ro.js +13 -0
  144. package/dist/runtime/locale/ru.js +13 -0
  145. package/dist/runtime/locale/sk.js +13 -0
  146. package/dist/runtime/locale/sl.js +13 -0
  147. package/dist/runtime/locale/sq.js +13 -0
  148. package/dist/runtime/locale/sv.js +13 -0
  149. package/dist/runtime/locale/th.js +13 -0
  150. package/dist/runtime/locale/tj.js +13 -0
  151. package/dist/runtime/locale/tr.js +13 -0
  152. package/dist/runtime/locale/ug_cn.js +13 -0
  153. package/dist/runtime/locale/uk.js +13 -0
  154. package/dist/runtime/locale/ur.js +13 -0
  155. package/dist/runtime/locale/uz.js +13 -0
  156. package/dist/runtime/locale/vi.js +13 -0
  157. package/dist/runtime/locale/zh_cn.js +13 -0
  158. package/dist/runtime/locale/zh_tw.js +13 -0
  159. package/dist/runtime/types/index.d.ts +4 -0
  160. package/dist/runtime/types/index.js +4 -0
  161. package/dist/runtime/types/locale.d.ts +13 -0
  162. package/dist/runtime/utils/ai.d.ts +18 -0
  163. package/dist/runtime/utils/ai.js +13 -0
  164. package/dist/runtime/utils/editor.js +17 -5
  165. package/dist/runtime/vue/components/Icon.d.vue.ts +1 -4
  166. package/dist/runtime/vue/components/Icon.vue +28 -3
  167. package/dist/runtime/vue/components/Icon.vue.d.ts +1 -4
  168. package/dist/runtime/vue/components/color-mode/ColorModeSelect.d.vue.ts +1 -1
  169. package/dist/runtime/vue/components/color-mode/ColorModeSelect.vue.d.ts +1 -1
  170. package/dist/runtime/vue/components/color-mode/ColorModeSwitch.vue +3 -1
  171. package/dist/shared/{ui.DI_ypO2T.mjs → ui.DJUbBpE2.mjs} +298 -39
  172. package/dist/unplugin.d.mts +15 -5
  173. package/dist/unplugin.mjs +53 -30
  174. package/dist/vite.d.mts +1 -0
  175. package/dist/vite.mjs +1 -1
  176. package/package.json +49 -46
  177. /package/dist/runtime/composables/{internal/useFilter.d.ts → useFilter.d.ts} +0 -0
@@ -3,7 +3,7 @@ import type { DropdownMenuContentProps as RekaDropdownMenuContentProps } from 'r
3
3
  import type { VNode } from 'vue';
4
4
  import type { AppConfig } from '@nuxt/schema';
5
5
  import type theme from '#build/ui/dropdown-menu';
6
- import type { DropdownMenuItem, DropdownMenuSlots, IconProps } from '../types';
6
+ import type { DropdownMenuItem, DropdownMenuSlots, IconProps, InputProps } from '../types';
7
7
  import type { ArrayOrNested, GetItemKeys, NestedItem, DynamicSlots, MergeTypes } from '../types/utils';
8
8
  import type { ComponentConfig } from '../types/tv';
9
9
  type DropdownMenu = ComponentConfig<typeof theme, AppConfig, 'dropdownMenu'>;
@@ -25,11 +25,16 @@ interface DropdownMenuContentProps<T extends ArrayOrNested<DropdownMenuItem>> ex
25
25
  * @IconifyIcon
26
26
  */
27
27
  externalIcon?: boolean | IconProps['name'];
28
+ size?: DropdownMenu['variants']['size'];
29
+ filter?: boolean | Omit<InputProps, 'modelValue' | 'defaultValue'>;
30
+ filterFields?: string[];
31
+ ignoreFilter?: boolean;
32
+ searchTerm?: string;
28
33
  class?: any;
29
34
  ui: DropdownMenu['ui'];
30
35
  uiOverride?: DropdownMenu['slots'];
31
36
  }
32
- type DropdownMenuContentSlots<A extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>, T extends NestedItem<A> = NestedItem<A>> = Pick<DropdownMenuSlots<A>, 'item' | 'item-leading' | 'item-label' | 'item-description' | 'item-trailing' | 'content-top' | 'content-bottom'> & {
37
+ type DropdownMenuContentSlots<A extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>, T extends NestedItem<A> = NestedItem<A>> = Pick<DropdownMenuSlots<A>, 'item' | 'item-leading' | 'item-label' | 'item-description' | 'item-trailing' | 'empty' | 'content-top' | 'content-bottom'> & {
33
38
  default?(props?: {}): VNode[];
34
39
  } & DynamicSlots<MergeTypes<T>, 'label' | 'description', {
35
40
  active: boolean;
@@ -44,6 +49,7 @@ export default _default;
44
49
  declare const __VLS_export: <T extends ArrayOrNested<DropdownMenuItem>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
45
50
  props: import("vue").PublicProps & __VLS_PrettifyLocal<DropdownMenuContentProps<T> & {
46
51
  onEscapeKeyDown?: ((event: KeyboardEvent) => any) | undefined;
52
+ "onUpdate:searchTerm"?: ((value: string) => any) | undefined;
47
53
  onPointerDownOutside?: ((event: import("reka-ui").PointerDownOutsideEvent) => any) | undefined;
48
54
  onFocusOutside?: ((event: import("reka-ui").FocusOutsideEvent) => any) | undefined;
49
55
  onInteractOutside?: ((event: import("reka-ui").PointerDownOutsideEvent | import("reka-ui").FocusOutsideEvent) => any) | undefined;
@@ -54,7 +60,7 @@ declare const __VLS_export: <T extends ArrayOrNested<DropdownMenuItem>>(__VLS_pr
54
60
  expose: (exposed: {}) => void;
55
61
  attrs: any;
56
62
  slots: DropdownMenuContentSlots<T, NestedItem<T>>;
57
- emit: ((evt: "escapeKeyDown", event: KeyboardEvent) => void) & ((evt: "pointerDownOutside", event: import("reka-ui").PointerDownOutsideEvent) => void) & ((evt: "focusOutside", event: import("reka-ui").FocusOutsideEvent) => void) & ((evt: "interactOutside", event: import("reka-ui").PointerDownOutsideEvent | import("reka-ui").FocusOutsideEvent) => void) & ((evt: "closeAutoFocus", event: Event) => void);
63
+ emit: ((evt: "escapeKeyDown", event: KeyboardEvent) => void) & ((evt: "update:searchTerm", value: string) => void) & ((evt: "pointerDownOutside", event: import("reka-ui").PointerDownOutsideEvent) => void) & ((evt: "focusOutside", event: import("reka-ui").FocusOutsideEvent) => void) & ((evt: "interactOutside", event: import("reka-ui").PointerDownOutsideEvent | import("reka-ui").FocusOutsideEvent) => void) & ((evt: "closeAutoFocus", event: Event) => void);
58
64
  }>) => import("vue").VNode & {
59
65
  __ctx?: Awaited<typeof __VLS_setup>;
60
66
  };
@@ -52,20 +52,20 @@ export interface EditorDragHandleEmits {
52
52
  declare const _default: typeof __VLS_export;
53
53
  export default _default;
54
54
  declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<EditorDragHandleProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
55
- hover: (args_0: {
55
+ nodeChange: (args_0: {
56
56
  node: JSONContent;
57
57
  pos: number;
58
58
  }) => any;
59
- nodeChange: (args_0: {
59
+ hover: (args_0: {
60
60
  node: JSONContent;
61
61
  pos: number;
62
62
  }) => any;
63
63
  }, string, import("vue").PublicProps, Readonly<EditorDragHandleProps> & Readonly<{
64
- onHover?: ((args_0: {
64
+ onNodeChange?: ((args_0: {
65
65
  node: JSONContent;
66
66
  pos: number;
67
67
  }) => any) | undefined;
68
- onNodeChange?: ((args_0: {
68
+ onHover?: ((args_0: {
69
69
  node: JSONContent;
70
70
  pos: number;
71
71
  }) => any) | undefined;
@@ -52,20 +52,20 @@ export interface EditorDragHandleEmits {
52
52
  declare const _default: typeof __VLS_export;
53
53
  export default _default;
54
54
  declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<EditorDragHandleProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
55
- hover: (args_0: {
55
+ nodeChange: (args_0: {
56
56
  node: JSONContent;
57
57
  pos: number;
58
58
  }) => any;
59
- nodeChange: (args_0: {
59
+ hover: (args_0: {
60
60
  node: JSONContent;
61
61
  pos: number;
62
62
  }) => any;
63
63
  }, string, import("vue").PublicProps, Readonly<EditorDragHandleProps> & Readonly<{
64
- onHover?: ((args_0: {
64
+ onNodeChange?: ((args_0: {
65
65
  node: JSONContent;
66
66
  pos: number;
67
67
  }) => any) | undefined;
68
- onNodeChange?: ((args_0: {
68
+ onHover?: ((args_0: {
69
69
  node: JSONContent;
70
70
  pos: number;
71
71
  }) => any) | undefined;
@@ -30,17 +30,17 @@ function handleError() {
30
30
 
31
31
  <template>
32
32
  <Primitive :as="as" data-slot="root" :class="ui.root({ class: [uiProp?.root, props.class] })">
33
- <p v-if="!!props.error?.statusCode || !!slots.statusCode" data-slot="statusCode" :class="ui.statusCode({ class: uiProp?.statusCode })">
33
+ <p v-if="!!props.error?.statusCode || !!props.error?.status || !!slots.statusCode" data-slot="statusCode" :class="ui.statusCode({ class: uiProp?.statusCode })">
34
34
  <slot name="statusCode">
35
- {{ props.error?.statusCode }}
35
+ {{ props.error?.statusCode || props.error?.status }}
36
36
  </slot>
37
37
  </p>
38
- <h1 v-if="!!props.error?.statusMessage || !!slots.statusMessage" data-slot="statusMessage" :class="ui.statusMessage({ class: uiProp?.statusMessage })">
38
+ <h1 v-if="!!props.error?.statusMessage || !!props.error?.statusText || !!slots.statusMessage" data-slot="statusMessage" :class="ui.statusMessage({ class: uiProp?.statusMessage })">
39
39
  <slot name="statusMessage">
40
- {{ props.error?.statusMessage }}
40
+ {{ props.error?.statusMessage || props.error?.statusText }}
41
41
  </slot>
42
42
  </h1>
43
- <p v-if="props.error?.message && props.error.message !== props.error.statusMessage || !!slots.message" data-slot="message" :class="ui.message({ class: uiProp?.message })">
43
+ <p v-if="props.error?.message && props.error.message !== (props.error.statusMessage || props.error.statusText) || !!slots.message" data-slot="message" :class="ui.message({ class: uiProp?.message })">
44
44
  <slot name="message">
45
45
  {{ props.error?.message }}
46
46
  </slot>
@@ -79,6 +79,12 @@ export interface FileUploadProps<M extends boolean = false> extends /** @vue-ign
79
79
  * @IconifyIcon
80
80
  */
81
81
  fileIcon?: IconProps['name'];
82
+ /**
83
+ * Preview the file (currently only `<img>` is rendered)
84
+ * When set false, only `fileIcon` is displayed
85
+ * @defaultValue true
86
+ */
87
+ fileImage?: boolean;
82
88
  /**
83
89
  * Configure the delete button for the file.
84
90
  * When `layout` is `grid`, the default is `{ color: 'neutral', variant: 'solid', size: 'xs' }`{lang="ts-type"}
@@ -3,10 +3,11 @@ import theme from "#build/ui/file-upload";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
- import { computed, toRef, watch } from "vue";
6
+ import { computed, toRef, toRefs, watch } from "vue";
7
7
  import { Primitive, VisuallyHidden } from "reka-ui";
8
8
  import { createReusableTemplate } from "@vueuse/core";
9
- import { useAppConfig, useLocale } from "#imports";
9
+ import { useAppConfig } from "#imports";
10
+ import { useLocale } from "../composables/useLocale";
10
11
  import { useComponentUI } from "../composables/useComponentUI";
11
12
  import { useFormField } from "../composables/useFormField";
12
13
  import { useFileUpload } from "../composables/useFileUpload";
@@ -36,6 +37,7 @@ const props = defineProps({
36
37
  required: { type: Boolean, required: false },
37
38
  disabled: { type: Boolean, required: false },
38
39
  fileIcon: { type: null, required: false },
40
+ fileImage: { type: Boolean, required: false, default: true },
39
41
  fileDelete: { type: [Boolean, Object], required: false, default: true },
40
42
  fileDeleteIcon: { type: null, required: false },
41
43
  preview: { type: Boolean, required: false, default: true },
@@ -49,10 +51,11 @@ const appConfig = useAppConfig();
49
51
  const uiProp = useComponentUI("fileUpload", props);
50
52
  const { t } = useLocale();
51
53
  const [DefineFilesTemplate, ReuseFilesTemplate] = createReusableTemplate();
54
+ const { accept, multiple, reset } = toRefs(props);
52
55
  const { isDragging, open, inputRef, dropzoneRef } = useFileUpload({
53
- accept: props.accept,
54
- reset: props.reset,
55
- multiple: props.multiple,
56
+ accept,
57
+ reset,
58
+ multiple,
56
59
  dropzone: props.dropzone,
57
60
  onUpdate
58
61
  });
@@ -81,6 +84,7 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.fileUpload ||
81
84
  disabled: props.disabled
82
85
  }));
83
86
  function createObjectUrl(file) {
87
+ if (!props.fileImage) return void 0;
84
88
  return URL.createObjectURL(file);
85
89
  }
86
90
  function formatFileSize(bytes) {
@@ -94,9 +98,9 @@ function formatFileSize(bytes) {
94
98
  const formattedSize = i === 0 ? size.toString() : size.toFixed(0);
95
99
  return `${formattedSize}${sizes[i]}`;
96
100
  }
97
- function onUpdate(files, reset = false) {
101
+ function onUpdate(files, reset2 = false) {
98
102
  if (props.multiple) {
99
- if (reset) {
103
+ if (reset2) {
100
104
  modelValue.value = files;
101
105
  } else {
102
106
  const existingFiles = modelValue.value || [];
@@ -79,6 +79,12 @@ export interface FileUploadProps<M extends boolean = false> extends /** @vue-ign
79
79
  * @IconifyIcon
80
80
  */
81
81
  fileIcon?: IconProps['name'];
82
+ /**
83
+ * Preview the file (currently only `<img>` is rendered)
84
+ * When set false, only `fileIcon` is displayed
85
+ * @defaultValue true
86
+ */
87
+ fileImage?: boolean;
82
88
  /**
83
89
  * Configure the delete button for the file.
84
90
  * When `layout` is `grid`, the default is `{ color: 'neutral', variant: 'solid', size: 'xs' }`{lang="ts-type"}
@@ -1,8 +1,9 @@
1
+ import type { RuntimeOptions } from '@nuxt/icon';
1
2
  export interface IconProps {
2
3
  name: string | any;
3
4
  mode?: 'svg' | 'css';
4
5
  size?: string | number;
5
- customize?: (content: string, name?: string, prefix?: string, provider?: string) => string;
6
+ customize?: RuntimeOptions['customize'] | boolean | null;
6
7
  }
7
8
  declare const _default: typeof __VLS_export;
8
9
  export default _default;
@@ -9,7 +9,7 @@ const props = defineProps({
9
9
  name: { type: null, required: true },
10
10
  mode: { type: String, required: false },
11
11
  size: { type: [String, Number], required: false },
12
- customize: { type: Function, required: false }
12
+ customize: { type: [Function, Boolean, null], required: false }
13
13
  });
14
14
  const iconProps = useForwardProps(reactivePick(props, "name", "mode", "size", "customize"));
15
15
  </script>
@@ -1,8 +1,9 @@
1
+ import type { RuntimeOptions } from '@nuxt/icon';
1
2
  export interface IconProps {
2
3
  name: string | any;
3
4
  mode?: 'svg' | 'css';
4
5
  size?: string | number;
5
- customize?: (content: string, name?: string, prefix?: string, provider?: string) => string;
6
+ customize?: RuntimeOptions['customize'] | boolean | null;
6
7
  }
7
8
  declare const _default: typeof __VLS_export;
8
9
  export default _default;
@@ -47,8 +47,8 @@ export interface InputDateProps<R extends boolean = false> extends UseComponentI
47
47
  class?: any;
48
48
  ui?: InputDate['slots'];
49
49
  }
50
- export interface InputDateEmits<R extends boolean> extends Omit<DateFieldRootEmits & DateRangeFieldRootEmits, 'update:modelValue'> {
51
- 'update:modelValue': [date: InputDateModelValue<R>];
50
+ export interface InputDateEmits<R extends boolean = false> extends Omit<DateFieldRootEmits & DateRangeFieldRootEmits, 'update:modelValue'> {
51
+ 'update:modelValue': [value: InputDateModelValue<R>];
52
52
  'change': [event: Event];
53
53
  'blur': [event: FocusEvent];
54
54
  'focus': [event: FocusEvent];
@@ -74,7 +74,7 @@ declare const __VLS_export: <R extends boolean>(__VLS_props: NonNullable<Awaited
74
74
  onBlur?: ((event: FocusEvent) => any) | undefined;
75
75
  onChange?: ((event: Event) => any) | undefined;
76
76
  onFocus?: ((event: FocusEvent) => any) | undefined;
77
- "onUpdate:modelValue"?: ((date: InputDateModelValue<R>) => any) | undefined;
77
+ "onUpdate:modelValue"?: ((value: InputDateModelValue<R>) => any) | undefined;
78
78
  "onUpdate:placeholder"?: ((...args: DateValue[]) => any) | undefined;
79
79
  }> & (typeof globalThis extends {
80
80
  __VLS_PROPS_FALLBACK: infer P;
@@ -84,7 +84,7 @@ declare const __VLS_export: <R extends boolean>(__VLS_props: NonNullable<Awaited
84
84
  }>) => void;
85
85
  attrs: any;
86
86
  slots: InputDateSlots;
87
- emit: ((evt: "blur", event: FocusEvent) => void) & ((evt: "change", event: Event) => void) & ((evt: "focus", event: FocusEvent) => void) & ((evt: "update:modelValue", date: InputDateModelValue<R>) => void) & ((evt: "update:placeholder", ...args: [date: DateValue] & [date: DateValue]) => void);
87
+ emit: ((evt: "blur", event: FocusEvent) => void) & ((evt: "change", event: Event) => void) & ((evt: "focus", event: FocusEvent) => void) & ((evt: "update:modelValue", value: InputDateModelValue<R>) => void) & ((evt: "update:placeholder", ...args: [date: DateValue] & [date: DateValue]) => void);
88
88
  }>) => import("vue").VNode & {
89
89
  __ctx?: Awaited<typeof __VLS_setup>;
90
90
  };
@@ -47,8 +47,8 @@ export interface InputDateProps<R extends boolean = false> extends UseComponentI
47
47
  class?: any;
48
48
  ui?: InputDate['slots'];
49
49
  }
50
- export interface InputDateEmits<R extends boolean> extends Omit<DateFieldRootEmits & DateRangeFieldRootEmits, 'update:modelValue'> {
51
- 'update:modelValue': [date: InputDateModelValue<R>];
50
+ export interface InputDateEmits<R extends boolean = false> extends Omit<DateFieldRootEmits & DateRangeFieldRootEmits, 'update:modelValue'> {
51
+ 'update:modelValue': [value: InputDateModelValue<R>];
52
52
  'change': [event: Event];
53
53
  'blur': [event: FocusEvent];
54
54
  'focus': [event: FocusEvent];
@@ -74,7 +74,7 @@ declare const __VLS_export: <R extends boolean>(__VLS_props: NonNullable<Awaited
74
74
  onBlur?: ((event: FocusEvent) => any) | undefined;
75
75
  onChange?: ((event: Event) => any) | undefined;
76
76
  onFocus?: ((event: FocusEvent) => any) | undefined;
77
- "onUpdate:modelValue"?: ((date: InputDateModelValue<R>) => any) | undefined;
77
+ "onUpdate:modelValue"?: ((value: InputDateModelValue<R>) => any) | undefined;
78
78
  "onUpdate:placeholder"?: ((...args: DateValue[]) => any) | undefined;
79
79
  }> & (typeof globalThis extends {
80
80
  __VLS_PROPS_FALLBACK: infer P;
@@ -84,7 +84,7 @@ declare const __VLS_export: <R extends boolean>(__VLS_props: NonNullable<Awaited
84
84
  }>) => void;
85
85
  attrs: any;
86
86
  slots: InputDateSlots;
87
- emit: ((evt: "blur", event: FocusEvent) => void) & ((evt: "change", event: Event) => void) & ((evt: "focus", event: FocusEvent) => void) & ((evt: "update:modelValue", date: InputDateModelValue<R>) => void) & ((evt: "update:placeholder", ...args: [date: DateValue] & [date: DateValue]) => void);
87
+ emit: ((evt: "blur", event: FocusEvent) => void) & ((evt: "change", event: Event) => void) & ((evt: "focus", event: FocusEvent) => void) & ((evt: "update:modelValue", value: InputDateModelValue<R>) => void) & ((evt: "update:placeholder", ...args: [date: DateValue] & [date: DateValue]) => void);
88
88
  }>) => import("vue").VNode & {
89
89
  __ctx?: Awaited<typeof __VLS_setup>;
90
90
  };
@@ -34,7 +34,7 @@ type ExcludeItem = {
34
34
  type: 'label' | 'separator';
35
35
  };
36
36
  type IsClearUsed<M extends boolean, C extends boolean | object> = M extends false ? (C extends true ? null : C extends object ? null : never) : never;
37
- export interface InputMenuProps<T extends ArrayOrNested<InputMenuItem> = ArrayOrNested<InputMenuItem>, VK extends GetItemKeys<T> | undefined = undefined, M extends boolean = false, Mod extends Omit<ModelModifiers, 'lazy'> = Omit<ModelModifiers, 'lazy'>, C extends boolean | object = false> extends Pick<ComboboxRootProps<T>, 'open' | 'defaultOpen' | 'disabled' | 'name' | 'resetSearchTermOnBlur' | 'resetSearchTermOnSelect' | 'resetModelValueOnClear' | 'highlightOnHover' | 'openOnClick' | 'openOnFocus' | 'by'>, UseComponentIconsProps, /** @vue-ignore */ Omit<InputHTMLAttributes, 'disabled' | 'name' | 'type' | 'placeholder' | 'autofocus' | 'maxlength' | 'minlength' | 'pattern' | 'size' | 'min' | 'max' | 'step'> {
37
+ export interface InputMenuProps<T extends ArrayOrNested<InputMenuItem> = ArrayOrNested<InputMenuItem>, VK extends GetItemKeys<T> | undefined = undefined, M extends boolean = false, Mod extends Omit<ModelModifiers, 'lazy'> = Omit<ModelModifiers, 'lazy'>, C extends boolean | object = false> extends Pick<ComboboxRootProps<T>, 'open' | 'defaultOpen' | 'disabled' | 'name' | 'resetSearchTermOnBlur' | 'resetSearchTermOnSelect' | 'resetModelValueOnClear' | 'highlightOnHover' | 'openOnClick' | 'openOnFocus' | 'by'>, UseComponentIconsProps, /** @vue-ignore */ Omit<InputHTMLAttributes, 'autocomplete' | 'disabled' | 'name' | 'type' | 'placeholder' | 'autofocus' | 'maxlength' | 'minlength' | 'pattern' | 'size' | 'min' | 'max' | 'step'> {
38
38
  /**
39
39
  * The element or component this component should render as.
40
40
  * @defaultValue 'div'
@@ -150,6 +150,12 @@ export interface InputMenuProps<T extends ArrayOrNested<InputMenuItem> = ArrayOr
150
150
  highlight?: boolean;
151
151
  /** Keep the mobile text size on all breakpoints. */
152
152
  fixed?: boolean;
153
+ /**
154
+ * When `true`, the input accepts free-form text with optional suggestions.
155
+ * The `modelValue` becomes the input text (string) instead of a selected item.
156
+ * @defaultValue false
157
+ */
158
+ autocomplete?: boolean;
153
159
  /**
154
160
  * Determines if custom user input that does not exist in options can be added.
155
161
  * @defaultValue false
@@ -3,17 +3,18 @@ import theme from "#build/ui/input-menu";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
- import { computed, useTemplateRef, toRef, onMounted, toRaw, nextTick } from "vue";
7
- import { ComboboxRoot, ComboboxArrow, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxCancel, ComboboxPortal, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxVirtualizer, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, TagsInputRoot, TagsInputItem, TagsInputItemText, TagsInputItemDelete, TagsInputInput, useForwardPropsEmits } from "reka-ui";
6
+ import { computed, useTemplateRef, toRef, onMounted, toRaw, nextTick, watch } from "vue";
7
+ import { TagsInputRoot, TagsInputItem, TagsInputItemText, TagsInputItemDelete, TagsInputInput, useForwardPropsEmits } from "reka-ui";
8
+ import { Combobox, Autocomplete } from "reka-ui/namespaced";
8
9
  import { defu } from "defu";
9
10
  import { isEqual } from "ohash/utils";
10
- import { reactivePick, createReusableTemplate } from "@vueuse/core";
11
+ import { reactivePick, reactiveOmit, createReusableTemplate } from "@vueuse/core";
11
12
  import { useAppConfig } from "#imports";
12
13
  import { useComponentUI } from "../composables/useComponentUI";
13
14
  import { useFieldGroup } from "../composables/useFieldGroup";
14
15
  import { useComponentIcons } from "../composables/useComponentIcons";
15
16
  import { useFormField } from "../composables/useFormField";
16
- import { useFilter } from "../composables/internal/useFilter";
17
+ import { useFilter } from "../composables/useFilter";
17
18
  import { useLocale } from "../composables/useLocale";
18
19
  import { usePortal } from "../composables/usePortal";
19
20
  import { compare, get, getDisplayValue, isArrayOfArray, looseToNumber } from "../utils";
@@ -54,6 +55,7 @@ const props = defineProps({
54
55
  multiple: { type: Boolean, required: false },
55
56
  highlight: { type: Boolean, required: false },
56
57
  fixed: { type: Boolean, required: false },
58
+ autocomplete: { type: Boolean, required: false },
57
59
  createItem: { type: [Boolean, String, Object], required: false },
58
60
  filterFields: { type: Array, required: false },
59
61
  ignoreFilter: { type: Boolean, required: false },
@@ -85,7 +87,9 @@ const { t } = useLocale();
85
87
  const appConfig = useAppConfig();
86
88
  const uiProp = useComponentUI("inputMenu", props);
87
89
  const { filterGroups } = useFilter();
88
- const rootProps = useForwardPropsEmits(reactivePick(props, "as", "modelValue", "defaultValue", "open", "defaultOpen", "required", "multiple", "resetSearchTermOnBlur", "resetSearchTermOnSelect", "resetModelValueOnClear", "highlightOnHover", "openOnClick", "openOnFocus", "by"), emits);
90
+ const rootPropsPick = reactivePick(props, "as", "modelValue", "defaultValue", "open", "defaultOpen", "required", "multiple", "resetSearchTermOnBlur", "resetSearchTermOnSelect", "resetModelValueOnClear", "highlightOnHover", "openOnClick", "openOnFocus", "by");
91
+ const rootProps = useForwardPropsEmits(props.autocomplete ? reactiveOmit(rootPropsPick, "multiple", "resetSearchTermOnSelect", "resetModelValueOnClear", "by") : rootPropsPick, emits);
92
+ const Component = computed(() => props.autocomplete ? Autocomplete : Combobox);
89
93
  const portalProps = usePortal(toRef(() => props.portal));
90
94
  const contentProps = toRef(() => defu(props.content, { side: "bottom", sideOffset: 8, collisionPadding: 8, position: "popper" }));
91
95
  const arrowProps = toRef(() => defu(props.arrow, { rounded: true }));
@@ -167,12 +171,21 @@ function autoFocus() {
167
171
  }
168
172
  onMounted(() => {
169
173
  nextTick(() => {
170
- searchTerm.value = "";
174
+ if (props.autocomplete) {
175
+ searchTerm.value = String(props.modelValue ?? props.defaultValue ?? "");
176
+ } else {
177
+ searchTerm.value = "";
178
+ }
171
179
  });
172
180
  setTimeout(() => {
173
181
  autoFocus();
174
182
  }, props.autofocusDelay);
175
183
  });
184
+ watch(() => props.modelValue, (newValue) => {
185
+ if (props.autocomplete) {
186
+ searchTerm.value = String(newValue ?? "");
187
+ }
188
+ });
176
189
  function onUpdate(value) {
177
190
  if (toRaw(props.modelValue) === value) {
178
191
  return;
@@ -193,10 +206,17 @@ function onUpdate(value) {
193
206
  emits("change", event);
194
207
  emitFormChange();
195
208
  emitFormInput();
196
- if (props.resetSearchTermOnSelect) {
209
+ if (props.autocomplete) {
210
+ searchTerm.value = String(value ?? "");
211
+ } else if (props.resetSearchTermOnSelect) {
197
212
  searchTerm.value = "";
198
213
  }
199
214
  }
215
+ function onInputUpdate(value) {
216
+ if (!props.autocomplete) {
217
+ searchTerm.value = value;
218
+ }
219
+ }
200
220
  function onBlur(event) {
201
221
  emits("blur", event);
202
222
  emitFormBlur();
@@ -211,7 +231,7 @@ function onUpdateOpen(value) {
211
231
  const event = new FocusEvent("blur");
212
232
  emits("blur", event);
213
233
  emitFormBlur();
214
- if (props.resetSearchTermOnBlur) {
234
+ if (!props.autocomplete && props.resetSearchTermOnBlur) {
215
235
  const STATE_ANIMATION_DELAY_MS = 100;
216
236
  timeoutId = setTimeout(() => {
217
237
  searchTerm.value = "";
@@ -268,7 +288,7 @@ defineExpose({
268
288
 
269
289
  <template>
270
290
  <DefineCreateItemTemplate>
271
- <ComboboxItem
291
+ <Component.Item
272
292
  data-slot="item"
273
293
  :class="ui.item({ class: uiProp?.item })"
274
294
  :value="searchTerm"
@@ -279,17 +299,17 @@ defineExpose({
279
299
  {{ t("inputMenu.create", { label: searchTerm }) }}
280
300
  </slot>
281
301
  </span>
282
- </ComboboxItem>
302
+ </Component.Item>
283
303
  </DefineCreateItemTemplate>
284
304
 
285
305
  <DefineItemTemplate v-slot="{ item, index }">
286
- <ComboboxLabel v-if="isInputItem(item) && item.type === 'label'" data-slot="label" :class="ui.label({ class: [uiProp?.label, item.ui?.label, item.class] })">
306
+ <Component.Label v-if="isInputItem(item) && item.type === 'label'" data-slot="label" :class="ui.label({ class: [uiProp?.label, item.ui?.label, item.class] })">
287
307
  {{ get(item, props.labelKey) }}
288
- </ComboboxLabel>
308
+ </Component.Label>
289
309
 
290
- <ComboboxSeparator v-else-if="isInputItem(item) && item.type === 'separator'" data-slot="separator" :class="ui.separator({ class: [uiProp?.separator, item.ui?.separator, item.class] })" />
310
+ <Component.Separator v-else-if="isInputItem(item) && item.type === 'separator'" data-slot="separator" :class="ui.separator({ class: [uiProp?.separator, item.ui?.separator, item.class] })" />
291
311
 
292
- <ComboboxItem
312
+ <Component.Item
293
313
  v-else
294
314
  data-slot="item"
295
315
  :class="ui.item({ class: [uiProp?.item, isInputItem(item) && item.ui?.item, isInputItem(item) && item.class] })"
@@ -329,29 +349,29 @@ defineExpose({
329
349
  <span data-slot="itemTrailing" :class="ui.itemTrailing({ class: [uiProp?.itemTrailing, isInputItem(item) && item.ui?.itemTrailing] })">
330
350
  <slot name="item-trailing" :item="item" :index="index" :ui="ui" />
331
351
 
332
- <ComboboxItemIndicator as-child>
352
+ <Component.ItemIndicator v-if="!autocomplete" as-child>
333
353
  <UIcon :name="selectedIcon || appConfig.ui.icons.check" data-slot="itemTrailingIcon" :class="ui.itemTrailingIcon({ class: [uiProp?.itemTrailingIcon, isInputItem(item) && item.ui?.itemTrailingIcon] })" />
334
- </ComboboxItemIndicator>
354
+ </Component.ItemIndicator>
335
355
  </span>
336
356
  </slot>
337
- </ComboboxItem>
357
+ </Component.Item>
338
358
  </DefineItemTemplate>
339
359
 
340
- <ComboboxRoot
360
+ <Component.Root
341
361
  v-slot="{ modelValue, open }"
342
362
  v-bind="rootProps"
343
363
  :name="name"
344
364
  :disabled="disabled"
345
365
  data-slot="root"
346
366
  :class="ui.root({ class: [uiProp?.root, props.class] })"
347
- :as-child="!!multiple"
367
+ :as-child="!!multiple && !autocomplete"
348
368
  ignore-filter
349
369
  @update:model-value="onUpdate"
350
370
  @update:open="onUpdateOpen"
351
371
  >
352
- <ComboboxAnchor :as-child="!multiple" data-slot="base" :class="ui.base({ class: uiProp?.base })">
372
+ <Component.Anchor :as-child="!multiple" data-slot="base" :class="ui.base({ class: uiProp?.base })">
353
373
  <TagsInputRoot
354
- v-if="multiple"
374
+ v-if="multiple && !autocomplete"
355
375
  v-slot="{ modelValue: tags }"
356
376
  :model-value="modelValue"
357
377
  :disabled="disabled"
@@ -376,7 +396,7 @@ defineExpose({
376
396
  </TagsInputItemDelete>
377
397
  </TagsInputItem>
378
398
 
379
- <ComboboxInput v-model="searchTerm" as-child>
399
+ <Component.Input v-model="searchTerm" as-child>
380
400
  <TagsInputInput
381
401
  :id="id"
382
402
  ref="inputRef"
@@ -386,22 +406,21 @@ defineExpose({
386
406
  :class="ui.tagsInput({ class: uiProp?.tagsInput })"
387
407
  @change.stop
388
408
  />
389
- </ComboboxInput>
409
+ </Component.Input>
390
410
  </TagsInputRoot>
391
411
 
392
- <ComboboxInput
412
+ <Component.Input
393
413
  v-else
394
414
  :id="id"
395
415
  ref="inputRef"
396
- :display-value="displayValue"
397
- v-bind="{ ...$attrs, ...ariaAttrs }"
416
+ v-bind="{ ...!autocomplete ? { displayValue } : {}, ...$attrs, ...ariaAttrs }"
398
417
  :type="type"
399
418
  :placeholder="placeholder"
400
419
  :required="required"
401
420
  @blur="onBlur"
402
421
  @focus="onFocus"
403
422
  @change.stop
404
- @update:model-value="searchTerm = $event"
423
+ @update:model-value="onInputUpdate"
405
424
  />
406
425
 
407
426
  <span v-if="isLeading || !!avatar || !!slots.leading" data-slot="leading" :class="ui.leading({ class: uiProp?.leading })">
@@ -411,9 +430,9 @@ defineExpose({
411
430
  </slot>
412
431
  </span>
413
432
 
414
- <ComboboxTrigger v-if="isTrailing || !!slots.trailing || !!clear" data-slot="trailing" :class="ui.trailing({ class: uiProp?.trailing })">
433
+ <Component.Trigger v-if="isTrailing || !!slots.trailing || !!clear" data-slot="trailing" :class="ui.trailing({ class: uiProp?.trailing })">
415
434
  <slot name="trailing" :model-value="modelValue" :open="open" :ui="ui">
416
- <ComboboxCancel v-if="!!clear && !isModelValueEmpty(modelValue)" as-child>
435
+ <Component.Cancel v-if="!!clear && !isModelValueEmpty(modelValue)" as-child>
417
436
  <UButton
418
437
  as="span"
419
438
  :icon="clearIcon || appConfig.ui.icons.close"
@@ -426,58 +445,58 @@ defineExpose({
426
445
  :class="ui.trailingClear({ class: uiProp?.trailingClear })"
427
446
  @click.stop="onClear"
428
447
  />
429
- </ComboboxCancel>
448
+ </Component.Cancel>
430
449
 
431
450
  <UIcon v-else-if="trailingIconName" :name="trailingIconName" data-slot="trailingIcon" :class="ui.trailingIcon({ class: uiProp?.trailingIcon })" />
432
451
  </slot>
433
- </ComboboxTrigger>
434
- </ComboboxAnchor>
452
+ </Component.Trigger>
453
+ </Component.Anchor>
435
454
 
436
- <ComboboxPortal v-bind="portalProps">
437
- <ComboboxContent data-slot="content" :class="ui.content({ class: uiProp?.content })" v-bind="contentProps" @focus-outside.prevent>
455
+ <Component.Portal v-bind="portalProps">
456
+ <Component.Content data-slot="content" :class="ui.content({ class: uiProp?.content })" v-bind="contentProps" @focus-outside.prevent>
438
457
  <slot name="content-top" />
439
458
 
440
- <ComboboxEmpty data-slot="empty" :class="ui.empty({ class: uiProp?.empty })">
459
+ <Component.Empty data-slot="empty" :class="ui.empty({ class: uiProp?.empty })">
441
460
  <slot name="empty" :search-term="searchTerm">
442
461
  {{ searchTerm ? t("inputMenu.noMatch", { searchTerm }) : t("inputMenu.noData") }}
443
462
  </slot>
444
- </ComboboxEmpty>
463
+ </Component.Empty>
445
464
 
446
465
  <div ref="viewportRef" role="presentation" data-slot="viewport" :class="ui.viewport({ class: uiProp?.viewport })">
447
466
  <template v-if="!!virtualize">
448
467
  <ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'top'" />
449
468
 
450
- <ComboboxVirtualizer
469
+ <Component.Virtualizer
451
470
  v-slot="{ option: item, virtualItem }"
452
471
  :options="filteredItems"
453
472
  :text-content="(item2) => isInputItem(item2) ? get(item2, props.labelKey) : String(item2)"
454
473
  v-bind="virtualizerProps"
455
474
  >
456
475
  <ReuseItemTemplate :item="item" :index="virtualItem.index" />
457
- </ComboboxVirtualizer>
476
+ </Component.Virtualizer>
458
477
 
459
478
  <ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'bottom'" />
460
479
  </template>
461
480
 
462
481
  <template v-else>
463
- <ComboboxGroup v-if="createItem && createItemPosition === 'top'" data-slot="group" :class="ui.group({ class: uiProp?.group })">
482
+ <Component.Group v-if="createItem && createItemPosition === 'top'" data-slot="group" :class="ui.group({ class: uiProp?.group })">
464
483
  <ReuseCreateItemTemplate />
465
- </ComboboxGroup>
484
+ </Component.Group>
466
485
 
467
- <ComboboxGroup v-for="(group, groupIndex) in filteredGroups" :key="`group-${groupIndex}`" data-slot="group" :class="ui.group({ class: uiProp?.group })">
486
+ <Component.Group v-for="(group, groupIndex) in filteredGroups" :key="`group-${groupIndex}`" data-slot="group" :class="ui.group({ class: uiProp?.group })">
468
487
  <ReuseItemTemplate v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`" :item="item" :index="index" />
469
- </ComboboxGroup>
488
+ </Component.Group>
470
489
 
471
- <ComboboxGroup v-if="createItem && createItemPosition === 'bottom'" data-slot="group" :class="ui.group({ class: uiProp?.group })">
490
+ <Component.Group v-if="createItem && createItemPosition === 'bottom'" data-slot="group" :class="ui.group({ class: uiProp?.group })">
472
491
  <ReuseCreateItemTemplate />
473
- </ComboboxGroup>
492
+ </Component.Group>
474
493
  </template>
475
494
  </div>
476
495
 
477
496
  <slot name="content-bottom" />
478
497
 
479
- <ComboboxArrow v-if="!!arrow" v-bind="arrowProps" data-slot="arrow" :class="ui.arrow({ class: uiProp?.arrow })" />
480
- </ComboboxContent>
481
- </ComboboxPortal>
482
- </ComboboxRoot>
498
+ <Component.Arrow v-if="!!arrow" v-bind="arrowProps" data-slot="arrow" :class="ui.arrow({ class: uiProp?.arrow })" />
499
+ </Component.Content>
500
+ </Component.Portal>
501
+ </Component.Root>
483
502
  </template>
@@ -34,7 +34,7 @@ type ExcludeItem = {
34
34
  type: 'label' | 'separator';
35
35
  };
36
36
  type IsClearUsed<M extends boolean, C extends boolean | object> = M extends false ? (C extends true ? null : C extends object ? null : never) : never;
37
- export interface InputMenuProps<T extends ArrayOrNested<InputMenuItem> = ArrayOrNested<InputMenuItem>, VK extends GetItemKeys<T> | undefined = undefined, M extends boolean = false, Mod extends Omit<ModelModifiers, 'lazy'> = Omit<ModelModifiers, 'lazy'>, C extends boolean | object = false> extends Pick<ComboboxRootProps<T>, 'open' | 'defaultOpen' | 'disabled' | 'name' | 'resetSearchTermOnBlur' | 'resetSearchTermOnSelect' | 'resetModelValueOnClear' | 'highlightOnHover' | 'openOnClick' | 'openOnFocus' | 'by'>, UseComponentIconsProps, /** @vue-ignore */ Omit<InputHTMLAttributes, 'disabled' | 'name' | 'type' | 'placeholder' | 'autofocus' | 'maxlength' | 'minlength' | 'pattern' | 'size' | 'min' | 'max' | 'step'> {
37
+ export interface InputMenuProps<T extends ArrayOrNested<InputMenuItem> = ArrayOrNested<InputMenuItem>, VK extends GetItemKeys<T> | undefined = undefined, M extends boolean = false, Mod extends Omit<ModelModifiers, 'lazy'> = Omit<ModelModifiers, 'lazy'>, C extends boolean | object = false> extends Pick<ComboboxRootProps<T>, 'open' | 'defaultOpen' | 'disabled' | 'name' | 'resetSearchTermOnBlur' | 'resetSearchTermOnSelect' | 'resetModelValueOnClear' | 'highlightOnHover' | 'openOnClick' | 'openOnFocus' | 'by'>, UseComponentIconsProps, /** @vue-ignore */ Omit<InputHTMLAttributes, 'autocomplete' | 'disabled' | 'name' | 'type' | 'placeholder' | 'autofocus' | 'maxlength' | 'minlength' | 'pattern' | 'size' | 'min' | 'max' | 'step'> {
38
38
  /**
39
39
  * The element or component this component should render as.
40
40
  * @defaultValue 'div'
@@ -150,6 +150,12 @@ export interface InputMenuProps<T extends ArrayOrNested<InputMenuItem> = ArrayOr
150
150
  highlight?: boolean;
151
151
  /** Keep the mobile text size on all breakpoints. */
152
152
  fixed?: boolean;
153
+ /**
154
+ * When `true`, the input accepts free-form text with optional suggestions.
155
+ * The `modelValue` becomes the input text (string) instead of a selected item.
156
+ * @defaultValue false
157
+ */
158
+ autocomplete?: boolean;
153
159
  /**
154
160
  * Determines if custom user input that does not exist in options can be added.
155
161
  * @defaultValue false