@nuxt/ui 4.5.1 → 4.6.1

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 (183) hide show
  1. package/README.md +1 -1
  2. package/dist/module.d.mts +7 -0
  3. package/dist/module.json +2 -2
  4. package/dist/module.mjs +79 -67
  5. package/dist/runtime/components/Avatar.vue +10 -12
  6. package/dist/runtime/components/Banner.vue +1 -1
  7. package/dist/runtime/components/BlogPost.vue +3 -2
  8. package/dist/runtime/components/Calendar.d.vue.ts +4 -4
  9. package/dist/runtime/components/Calendar.vue.d.ts +4 -4
  10. package/dist/runtime/components/ChangelogVersion.vue +3 -2
  11. package/dist/runtime/components/ChangelogVersions.vue +1 -1
  12. package/dist/runtime/components/ChatMessage.d.vue.ts +4 -1
  13. package/dist/runtime/components/ChatMessage.vue +5 -0
  14. package/dist/runtime/components/ChatMessage.vue.d.ts +4 -1
  15. package/dist/runtime/components/ChatMessages.vue +14 -1
  16. package/dist/runtime/components/ChatPrompt.vue +6 -1
  17. package/dist/runtime/components/ChatReasoning.d.vue.ts +78 -0
  18. package/dist/runtime/components/ChatReasoning.vue +162 -0
  19. package/dist/runtime/components/ChatReasoning.vue.d.ts +78 -0
  20. package/dist/runtime/components/ChatShimmer.d.vue.ts +34 -0
  21. package/dist/runtime/components/ChatShimmer.vue +37 -0
  22. package/dist/runtime/components/ChatShimmer.vue.d.ts +34 -0
  23. package/dist/runtime/components/ChatTool.d.vue.ts +88 -0
  24. package/dist/runtime/components/ChatTool.vue +105 -0
  25. package/dist/runtime/components/ChatTool.vue.d.ts +88 -0
  26. package/dist/runtime/components/Checkbox.d.vue.ts +22 -19
  27. package/dist/runtime/components/Checkbox.vue +9 -8
  28. package/dist/runtime/components/Checkbox.vue.d.ts +22 -19
  29. package/dist/runtime/components/DashboardGroup.d.vue.ts +1 -1
  30. package/dist/runtime/components/DashboardGroup.vue.d.ts +1 -1
  31. package/dist/runtime/components/DashboardSearchButton.vue +2 -2
  32. package/dist/runtime/components/DashboardSidebar.vue +6 -3
  33. package/dist/runtime/components/Drawer.vue +6 -4
  34. package/dist/runtime/components/DropdownMenu.d.vue.ts +29 -3
  35. package/dist/runtime/components/DropdownMenu.vue +9 -0
  36. package/dist/runtime/components/DropdownMenu.vue.d.ts +29 -3
  37. package/dist/runtime/components/DropdownMenuContent.d.vue.ts +9 -3
  38. package/dist/runtime/components/DropdownMenuContent.vue +62 -9
  39. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +9 -3
  40. package/dist/runtime/components/EditorDragHandle.d.vue.ts +4 -4
  41. package/dist/runtime/components/EditorDragHandle.vue.d.ts +4 -4
  42. package/dist/runtime/components/Error.vue +5 -5
  43. package/dist/runtime/components/FileUpload.d.vue.ts +6 -0
  44. package/dist/runtime/components/FileUpload.vue +11 -7
  45. package/dist/runtime/components/FileUpload.vue.d.ts +6 -0
  46. package/dist/runtime/components/Icon.d.vue.ts +2 -1
  47. package/dist/runtime/components/Icon.vue +3 -3
  48. package/dist/runtime/components/Icon.vue.d.ts +2 -1
  49. package/dist/runtime/components/InputDate.d.vue.ts +4 -4
  50. package/dist/runtime/components/InputDate.vue.d.ts +4 -4
  51. package/dist/runtime/components/InputMenu.d.vue.ts +7 -1
  52. package/dist/runtime/components/InputMenu.vue +67 -48
  53. package/dist/runtime/components/InputMenu.vue.d.ts +7 -1
  54. package/dist/runtime/components/InputTime.d.vue.ts +53 -27
  55. package/dist/runtime/components/InputTime.vue +52 -27
  56. package/dist/runtime/components/InputTime.vue.d.ts +53 -27
  57. package/dist/runtime/components/Kbd.vue +1 -1
  58. package/dist/runtime/components/Modal.vue +6 -4
  59. package/dist/runtime/components/NavigationMenu.vue +1 -0
  60. package/dist/runtime/components/Popover.vue +1 -1
  61. package/dist/runtime/components/Progress.d.vue.ts +1 -1
  62. package/dist/runtime/components/Progress.vue.d.ts +1 -1
  63. package/dist/runtime/components/SelectMenu.d.vue.ts +1 -1
  64. package/dist/runtime/components/SelectMenu.vue +1 -1
  65. package/dist/runtime/components/SelectMenu.vue.d.ts +1 -1
  66. package/dist/runtime/components/Sidebar.d.vue.ts +131 -0
  67. package/dist/runtime/components/Sidebar.vue +222 -0
  68. package/dist/runtime/components/Sidebar.vue.d.ts +131 -0
  69. package/dist/runtime/components/Slideover.vue +6 -4
  70. package/dist/runtime/components/Switch.d.vue.ts +22 -19
  71. package/dist/runtime/components/Switch.vue +7 -6
  72. package/dist/runtime/components/Switch.vue.d.ts +22 -19
  73. package/dist/runtime/components/Table.d.vue.ts +1 -1
  74. package/dist/runtime/components/Table.vue +12 -4
  75. package/dist/runtime/components/Table.vue.d.ts +1 -1
  76. package/dist/runtime/components/Tooltip.d.vue.ts +2 -0
  77. package/dist/runtime/components/Tooltip.vue +3 -2
  78. package/dist/runtime/components/Tooltip.vue.d.ts +2 -0
  79. package/dist/runtime/components/color-mode/ColorModeSelect.d.vue.ts +1 -1
  80. package/dist/runtime/components/color-mode/ColorModeSelect.vue.d.ts +1 -1
  81. package/dist/runtime/components/color-mode/ColorModeSwitch.vue +3 -1
  82. package/dist/runtime/components/content/ContentNavigation.vue +9 -2
  83. package/dist/runtime/components/content/ContentSurround.vue +6 -2
  84. package/dist/runtime/components/content/ContentToc.d.vue.ts +5 -0
  85. package/dist/runtime/components/content/ContentToc.vue +57 -11
  86. package/dist/runtime/components/content/ContentToc.vue.d.ts +5 -0
  87. package/dist/runtime/components/locale/LocaleSelect.d.vue.ts +1 -1
  88. package/dist/runtime/components/locale/LocaleSelect.vue.d.ts +1 -1
  89. package/dist/runtime/components/prose/Pre.vue +0 -4
  90. package/dist/runtime/composables/index.d.ts +12 -0
  91. package/dist/runtime/composables/index.js +12 -0
  92. package/dist/runtime/composables/useEditorMenu.js +1 -1
  93. package/dist/runtime/composables/useFileUpload.d.ts +2 -2
  94. package/dist/runtime/composables/useFileUpload.js +3 -3
  95. package/dist/runtime/composables/{internal/useFilter.js → useFilter.js} +1 -1
  96. package/dist/runtime/composables/useIMEGuard.d.ts +10 -0
  97. package/dist/runtime/composables/useIMEGuard.js +22 -0
  98. package/dist/runtime/composables/useScrollShadow.d.ts +23 -0
  99. package/dist/runtime/composables/useScrollShadow.js +36 -0
  100. package/dist/runtime/index.css +1 -1
  101. package/dist/runtime/keyframes.css +1 -1
  102. package/dist/runtime/locale/ar.js +13 -0
  103. package/dist/runtime/locale/az.js +13 -0
  104. package/dist/runtime/locale/be.js +13 -0
  105. package/dist/runtime/locale/bg.js +13 -0
  106. package/dist/runtime/locale/bn.js +13 -0
  107. package/dist/runtime/locale/ca.js +13 -0
  108. package/dist/runtime/locale/ckb.js +13 -0
  109. package/dist/runtime/locale/cs.js +13 -0
  110. package/dist/runtime/locale/da.js +13 -0
  111. package/dist/runtime/locale/de.js +13 -0
  112. package/dist/runtime/locale/de_ch.js +13 -0
  113. package/dist/runtime/locale/el.js +13 -0
  114. package/dist/runtime/locale/en.js +13 -0
  115. package/dist/runtime/locale/es.js +13 -0
  116. package/dist/runtime/locale/et.js +13 -0
  117. package/dist/runtime/locale/eu.js +13 -0
  118. package/dist/runtime/locale/fa_ir.js +13 -0
  119. package/dist/runtime/locale/fi.js +13 -0
  120. package/dist/runtime/locale/fr.js +13 -0
  121. package/dist/runtime/locale/gl.js +13 -0
  122. package/dist/runtime/locale/he.js +13 -0
  123. package/dist/runtime/locale/hi.js +13 -0
  124. package/dist/runtime/locale/hr.js +13 -0
  125. package/dist/runtime/locale/hu.js +13 -0
  126. package/dist/runtime/locale/hy.js +13 -0
  127. package/dist/runtime/locale/id.js +13 -0
  128. package/dist/runtime/locale/index.d.ts +1 -0
  129. package/dist/runtime/locale/index.js +1 -0
  130. package/dist/runtime/locale/is.d.ts +3 -0
  131. package/dist/runtime/locale/is.js +142 -0
  132. package/dist/runtime/locale/it.js +13 -0
  133. package/dist/runtime/locale/ja.js +13 -0
  134. package/dist/runtime/locale/ka.js +13 -0
  135. package/dist/runtime/locale/kk.js +13 -0
  136. package/dist/runtime/locale/km.js +13 -0
  137. package/dist/runtime/locale/ko.js +13 -0
  138. package/dist/runtime/locale/ky.js +13 -0
  139. package/dist/runtime/locale/lb.js +13 -0
  140. package/dist/runtime/locale/lo.js +13 -0
  141. package/dist/runtime/locale/lt.js +13 -0
  142. package/dist/runtime/locale/mn.js +13 -0
  143. package/dist/runtime/locale/ms.js +13 -0
  144. package/dist/runtime/locale/nb_no.js +13 -0
  145. package/dist/runtime/locale/nl.js +13 -0
  146. package/dist/runtime/locale/pl.js +13 -0
  147. package/dist/runtime/locale/pt.js +13 -0
  148. package/dist/runtime/locale/pt_br.js +13 -0
  149. package/dist/runtime/locale/ro.js +13 -0
  150. package/dist/runtime/locale/ru.js +13 -0
  151. package/dist/runtime/locale/sk.js +13 -0
  152. package/dist/runtime/locale/sl.js +13 -0
  153. package/dist/runtime/locale/sq.js +13 -0
  154. package/dist/runtime/locale/sv.js +13 -0
  155. package/dist/runtime/locale/th.js +13 -0
  156. package/dist/runtime/locale/tj.js +13 -0
  157. package/dist/runtime/locale/tr.js +13 -0
  158. package/dist/runtime/locale/ug_cn.js +13 -0
  159. package/dist/runtime/locale/uk.js +13 -0
  160. package/dist/runtime/locale/ur.js +13 -0
  161. package/dist/runtime/locale/uz.js +13 -0
  162. package/dist/runtime/locale/vi.js +13 -0
  163. package/dist/runtime/locale/zh_cn.js +13 -0
  164. package/dist/runtime/locale/zh_tw.js +13 -0
  165. package/dist/runtime/types/index.d.ts +4 -0
  166. package/dist/runtime/types/index.js +4 -0
  167. package/dist/runtime/types/locale.d.ts +13 -0
  168. package/dist/runtime/utils/ai.d.ts +23 -0
  169. package/dist/runtime/utils/ai.js +16 -0
  170. package/dist/runtime/utils/editor.js +17 -5
  171. package/dist/runtime/vue/components/Icon.d.vue.ts +1 -4
  172. package/dist/runtime/vue/components/Icon.vue +28 -3
  173. package/dist/runtime/vue/components/Icon.vue.d.ts +1 -4
  174. package/dist/runtime/vue/components/color-mode/ColorModeSelect.d.vue.ts +1 -1
  175. package/dist/runtime/vue/components/color-mode/ColorModeSelect.vue.d.ts +1 -1
  176. package/dist/runtime/vue/components/color-mode/ColorModeSwitch.vue +3 -1
  177. package/dist/shared/{ui.DI_ypO2T.mjs → ui.DJUbBpE2.mjs} +298 -39
  178. package/dist/unplugin.d.mts +15 -5
  179. package/dist/unplugin.mjs +53 -30
  180. package/dist/vite.d.mts +1 -0
  181. package/dist/vite.mjs +1 -1
  182. package/package.json +50 -47
  183. /package/dist/runtime/composables/{internal/useFilter.d.ts → useFilter.d.ts} +0 -0
@@ -3,11 +3,13 @@
3
3
  </script>
4
4
 
5
5
  <script setup>
6
- import { computed, toRef } from "vue";
6
+ import { computed, ref, toRef } from "vue";
7
+ import { defu } from "defu";
7
8
  import { DropdownMenu } from "reka-ui/namespaced";
8
9
  import { useForwardPropsEmits } from "reka-ui";
9
10
  import { reactiveOmit, createReusableTemplate } from "@vueuse/core";
10
11
  import { useAppConfig } from "#imports";
12
+ import { useFilter } from "../composables/useFilter";
11
13
  import { useLocale } from "../composables/useLocale";
12
14
  import { usePortal } from "../composables/usePortal";
13
15
  import { omit, get, isArrayOfArray } from "../utils";
@@ -16,6 +18,7 @@ import ULinkBase from "./LinkBase.vue";
16
18
  import ULink from "./Link.vue";
17
19
  import UAvatar from "./Avatar.vue";
18
20
  import UIcon from "./Icon.vue";
21
+ import UInput from "./Input.vue";
19
22
  import UKbd from "./Kbd.vue";
20
23
  import UDropdownMenuContent from "./DropdownMenuContent.vue";
21
24
  const props = defineProps({
@@ -27,6 +30,11 @@ const props = defineProps({
27
30
  checkedIcon: { type: null, required: false },
28
31
  loadingIcon: { type: null, required: false },
29
32
  externalIcon: { type: [Boolean, String], required: false, skipCheck: true },
33
+ size: { type: null, required: false },
34
+ filter: { type: [Boolean, Object], required: false },
35
+ filterFields: { type: Array, required: false },
36
+ ignoreFilter: { type: Boolean, required: false },
37
+ searchTerm: { type: String, required: false },
30
38
  class: { type: null, required: false },
31
39
  ui: { type: null, required: true },
32
40
  uiOverride: { type: null, required: false },
@@ -50,18 +58,41 @@ const props = defineProps({
50
58
  prioritizePosition: { type: Boolean, required: false },
51
59
  reference: { type: null, required: false }
52
60
  });
53
- const emits = defineEmits(["escapeKeyDown", "pointerDownOutside", "focusOutside", "interactOutside", "closeAutoFocus"]);
61
+ const emits = defineEmits(["update:searchTerm", "escapeKeyDown", "pointerDownOutside", "focusOutside", "interactOutside", "closeAutoFocus"]);
54
62
  const slots = defineSlots();
55
- const { dir } = useLocale();
63
+ const { t, dir } = useLocale();
56
64
  const appConfig = useAppConfig();
65
+ const { filterGroups } = useFilter();
66
+ const _searchTerm = ref("");
67
+ const searchTerm = computed({
68
+ get: () => props.searchTerm ?? _searchTerm.value,
69
+ set: (value) => {
70
+ _searchTerm.value = value;
71
+ emits("update:searchTerm", value);
72
+ }
73
+ });
74
+ const inputProps = toRef(() => defu(props.filter, { placeholder: t("dropdownMenu.search"), variant: "none" }));
57
75
  const portalProps = usePortal(toRef(() => props.portal));
58
- const contentProps = useForwardPropsEmits(reactiveOmit(props, "sub", "items", "portal", "labelKey", "descriptionKey", "checkedIcon", "loadingIcon", "externalIcon", "class", "ui", "uiOverride"), emits);
76
+ const contentProps = useForwardPropsEmits(reactiveOmit(props, "sub", "items", "portal", "labelKey", "descriptionKey", "checkedIcon", "loadingIcon", "externalIcon", "size", "filter", "filterFields", "ignoreFilter", "searchTerm", "class", "ui", "uiOverride"), emits);
59
77
  const getProxySlots = () => omit(slots, ["default"]);
60
78
  const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate();
61
79
  const childrenIcon = computed(() => dir.value === "rtl" ? appConfig.ui.icons.chevronLeft : appConfig.ui.icons.chevronRight);
62
- const groups = computed(
63
- () => props.items?.length ? isArrayOfArray(props.items) ? props.items : [props.items] : []
64
- );
80
+ const groups = computed(() => {
81
+ if (!props.items?.length) return [];
82
+ return isArrayOfArray(props.items) ? props.items : [props.items];
83
+ });
84
+ const isStructuralItem = (item) => !!item.type && ["label", "separator"].includes(item.type);
85
+ const filteredGroups = computed(() => {
86
+ if (!props.filter || props.ignoreFilter || !searchTerm.value) {
87
+ return groups.value;
88
+ }
89
+ const fields = Array.isArray(props.filterFields) && props.filterFields.length ? props.filterFields : [props.labelKey];
90
+ return filterGroups(groups.value, searchTerm.value, {
91
+ fields,
92
+ isStructural: isStructuralItem
93
+ });
94
+ });
95
+ const hasFilteredItems = computed(() => filteredGroups.value.some((group) => group.some((item) => !isStructuralItem(item))));
65
96
  </script>
66
97
 
67
98
  <template>
@@ -106,10 +137,22 @@ const groups = computed(
106
137
 
107
138
  <DropdownMenu.Portal v-bind="portalProps">
108
139
  <component :is="sub ? DropdownMenu.SubContent : DropdownMenu.Content" data-slot="content" :class="ui.content({ class: [uiOverride?.content, props.class] })" v-bind="contentProps">
140
+ <DropdownMenu.Filter v-if="!!filter" v-model="searchTerm" as-child>
141
+ <UInput
142
+ autofocus
143
+ autocomplete="off"
144
+ :size="size"
145
+ v-bind="inputProps"
146
+ data-slot="input"
147
+ :class="ui.input({ class: uiOverride?.input })"
148
+ @change.stop
149
+ />
150
+ </DropdownMenu.Filter>
151
+
109
152
  <slot name="content-top" :sub="sub ?? false" />
110
153
 
111
- <div role="presentation" data-slot="viewport" :class="ui.viewport({ class: uiOverride?.viewport })">
112
- <DropdownMenu.Group v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" data-slot="group" :class="ui.group({ class: uiOverride?.group })">
154
+ <div v-if="!searchTerm || hasFilteredItems" role="presentation" data-slot="viewport" :class="ui.viewport({ class: uiOverride?.viewport })">
155
+ <DropdownMenu.Group v-for="(group, groupIndex) in filteredGroups" :key="`group-${groupIndex}`" data-slot="group" :class="ui.group({ class: uiOverride?.group })">
113
156
  <template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
114
157
  <DropdownMenu.Label v-if="item.type === 'label'" data-slot="label" :class="ui.label({ class: [uiOverride?.label, item.ui?.label, item.class] })">
115
158
  <ReuseItemTemplate :item="item" :index="index" />
@@ -142,6 +185,10 @@ const groups = computed(
142
185
  :checked-icon="checkedIcon"
143
186
  :loading-icon="loadingIcon"
144
187
  :external-icon="externalIcon"
188
+ :size="size"
189
+ :filter="item.filter"
190
+ :filter-fields="item.filterFields || filterFields"
191
+ :ignore-filter="item.ignoreFilter ?? ignoreFilter"
145
192
  v-bind="item.content"
146
193
  >
147
194
  <template v-for="(_, name) in getProxySlots()" #[name]="slotData">
@@ -177,6 +224,12 @@ const groups = computed(
177
224
  </DropdownMenu.Group>
178
225
  </div>
179
226
 
227
+ <div v-if="searchTerm && !hasFilteredItems" data-slot="empty" :class="ui.empty({ class: uiOverride?.empty })">
228
+ <slot name="empty" :search-term="searchTerm">
229
+ {{ t("dropdownMenu.noMatch", { searchTerm }) }}
230
+ </slot>
231
+ </div>
232
+
180
233
  <slot />
181
234
 
182
235
  <slot name="content-bottom" :sub="sub ?? false" />
@@ -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,12 +9,12 @@ 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
- const iconProps = useForwardProps(reactivePick(props, "name", "mode", "size", "customize"));
14
+ const iconProps = useForwardProps(reactivePick(props, "mode", "size", "customize"));
15
15
  </script>
16
16
 
17
17
  <template>
18
- <Icon v-if="typeof name === 'string'" v-bind="iconProps" />
18
+ <Icon v-if="typeof name === 'string'" :name="name" v-bind="iconProps" />
19
19
  <component :is="name" v-else />
20
20
  </template>
@@ -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