@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.
- package/dist/module.d.mts +7 -0
- package/dist/module.json +2 -2
- package/dist/module.mjs +78 -67
- package/dist/runtime/components/Avatar.vue +10 -12
- package/dist/runtime/components/Banner.vue +1 -1
- package/dist/runtime/components/BlogPost.vue +3 -2
- package/dist/runtime/components/Calendar.d.vue.ts +4 -4
- package/dist/runtime/components/Calendar.vue.d.ts +4 -4
- package/dist/runtime/components/ChangelogVersion.vue +3 -2
- package/dist/runtime/components/ChangelogVersions.vue +1 -1
- package/dist/runtime/components/ChatMessage.d.vue.ts +4 -1
- package/dist/runtime/components/ChatMessage.vue +5 -0
- package/dist/runtime/components/ChatMessage.vue.d.ts +4 -1
- package/dist/runtime/components/ChatReasoning.d.vue.ts +78 -0
- package/dist/runtime/components/ChatReasoning.vue +162 -0
- package/dist/runtime/components/ChatReasoning.vue.d.ts +78 -0
- package/dist/runtime/components/ChatShimmer.d.vue.ts +34 -0
- package/dist/runtime/components/ChatShimmer.vue +37 -0
- package/dist/runtime/components/ChatShimmer.vue.d.ts +34 -0
- package/dist/runtime/components/ChatTool.d.vue.ts +88 -0
- package/dist/runtime/components/ChatTool.vue +105 -0
- package/dist/runtime/components/ChatTool.vue.d.ts +88 -0
- package/dist/runtime/components/Checkbox.d.vue.ts +22 -19
- package/dist/runtime/components/Checkbox.vue +9 -8
- package/dist/runtime/components/Checkbox.vue.d.ts +22 -19
- package/dist/runtime/components/DashboardGroup.d.vue.ts +1 -1
- package/dist/runtime/components/DashboardGroup.vue.d.ts +1 -1
- package/dist/runtime/components/DashboardSearchButton.vue +2 -2
- package/dist/runtime/components/Drawer.vue +1 -1
- package/dist/runtime/components/DropdownMenu.d.vue.ts +29 -3
- package/dist/runtime/components/DropdownMenu.vue +9 -0
- package/dist/runtime/components/DropdownMenu.vue.d.ts +29 -3
- package/dist/runtime/components/DropdownMenuContent.d.vue.ts +9 -3
- package/dist/runtime/components/DropdownMenuContent.vue +62 -9
- package/dist/runtime/components/DropdownMenuContent.vue.d.ts +9 -3
- package/dist/runtime/components/EditorDragHandle.d.vue.ts +4 -4
- package/dist/runtime/components/EditorDragHandle.vue.d.ts +4 -4
- package/dist/runtime/components/Error.vue +5 -5
- package/dist/runtime/components/FileUpload.d.vue.ts +6 -0
- package/dist/runtime/components/FileUpload.vue +11 -7
- package/dist/runtime/components/FileUpload.vue.d.ts +6 -0
- package/dist/runtime/components/Icon.d.vue.ts +2 -1
- package/dist/runtime/components/Icon.vue +1 -1
- package/dist/runtime/components/Icon.vue.d.ts +2 -1
- package/dist/runtime/components/InputDate.d.vue.ts +4 -4
- package/dist/runtime/components/InputDate.vue.d.ts +4 -4
- package/dist/runtime/components/InputMenu.d.vue.ts +7 -1
- package/dist/runtime/components/InputMenu.vue +67 -48
- package/dist/runtime/components/InputMenu.vue.d.ts +7 -1
- package/dist/runtime/components/InputTime.d.vue.ts +53 -27
- package/dist/runtime/components/InputTime.vue +52 -27
- package/dist/runtime/components/InputTime.vue.d.ts +53 -27
- package/dist/runtime/components/Kbd.vue +1 -1
- package/dist/runtime/components/Modal.vue +1 -1
- package/dist/runtime/components/NavigationMenu.vue +1 -0
- package/dist/runtime/components/Popover.vue +1 -1
- package/dist/runtime/components/Progress.d.vue.ts +1 -1
- package/dist/runtime/components/Progress.vue.d.ts +1 -1
- package/dist/runtime/components/SelectMenu.d.vue.ts +1 -1
- package/dist/runtime/components/SelectMenu.vue +1 -1
- package/dist/runtime/components/SelectMenu.vue.d.ts +1 -1
- package/dist/runtime/components/Sidebar.d.vue.ts +131 -0
- package/dist/runtime/components/Sidebar.vue +222 -0
- package/dist/runtime/components/Sidebar.vue.d.ts +131 -0
- package/dist/runtime/components/Slideover.vue +1 -1
- package/dist/runtime/components/Switch.d.vue.ts +22 -19
- package/dist/runtime/components/Switch.vue +7 -6
- package/dist/runtime/components/Switch.vue.d.ts +22 -19
- package/dist/runtime/components/Table.d.vue.ts +1 -1
- package/dist/runtime/components/Table.vue +12 -4
- package/dist/runtime/components/Table.vue.d.ts +1 -1
- package/dist/runtime/components/Tooltip.d.vue.ts +2 -0
- package/dist/runtime/components/Tooltip.vue +3 -2
- package/dist/runtime/components/Tooltip.vue.d.ts +2 -0
- package/dist/runtime/components/color-mode/ColorModeSelect.d.vue.ts +1 -1
- package/dist/runtime/components/color-mode/ColorModeSelect.vue.d.ts +1 -1
- package/dist/runtime/components/color-mode/ColorModeSwitch.vue +3 -1
- package/dist/runtime/components/content/ContentNavigation.vue +9 -2
- package/dist/runtime/components/content/ContentSurround.vue +6 -2
- package/dist/runtime/components/content/ContentToc.d.vue.ts +5 -0
- package/dist/runtime/components/content/ContentToc.vue +57 -11
- package/dist/runtime/components/content/ContentToc.vue.d.ts +5 -0
- package/dist/runtime/components/locale/LocaleSelect.d.vue.ts +1 -1
- package/dist/runtime/components/locale/LocaleSelect.vue.d.ts +1 -1
- package/dist/runtime/components/prose/Pre.vue +0 -4
- package/dist/runtime/composables/index.d.ts +11 -0
- package/dist/runtime/composables/index.js +11 -0
- package/dist/runtime/composables/useEditorMenu.js +1 -1
- package/dist/runtime/composables/useFileUpload.d.ts +2 -2
- package/dist/runtime/composables/useFileUpload.js +3 -3
- package/dist/runtime/composables/{internal/useFilter.js → useFilter.js} +1 -1
- package/dist/runtime/composables/useScrollShadow.d.ts +23 -0
- package/dist/runtime/composables/useScrollShadow.js +36 -0
- package/dist/runtime/index.css +1 -1
- package/dist/runtime/keyframes.css +1 -1
- package/dist/runtime/locale/ar.js +13 -0
- package/dist/runtime/locale/az.js +13 -0
- package/dist/runtime/locale/be.js +13 -0
- package/dist/runtime/locale/bg.js +13 -0
- package/dist/runtime/locale/bn.js +13 -0
- package/dist/runtime/locale/ca.js +13 -0
- package/dist/runtime/locale/ckb.js +13 -0
- package/dist/runtime/locale/cs.js +13 -0
- package/dist/runtime/locale/da.js +13 -0
- package/dist/runtime/locale/de.js +13 -0
- package/dist/runtime/locale/de_ch.js +13 -0
- package/dist/runtime/locale/el.js +13 -0
- package/dist/runtime/locale/en.js +13 -0
- package/dist/runtime/locale/es.js +13 -0
- package/dist/runtime/locale/et.js +13 -0
- package/dist/runtime/locale/eu.js +13 -0
- package/dist/runtime/locale/fa_ir.js +13 -0
- package/dist/runtime/locale/fi.js +13 -0
- package/dist/runtime/locale/fr.js +13 -0
- package/dist/runtime/locale/gl.js +13 -0
- package/dist/runtime/locale/he.js +13 -0
- package/dist/runtime/locale/hi.js +13 -0
- package/dist/runtime/locale/hr.js +13 -0
- package/dist/runtime/locale/hu.js +13 -0
- package/dist/runtime/locale/hy.js +13 -0
- package/dist/runtime/locale/id.js +13 -0
- package/dist/runtime/locale/index.d.ts +1 -0
- package/dist/runtime/locale/index.js +1 -0
- package/dist/runtime/locale/is.d.ts +3 -0
- package/dist/runtime/locale/is.js +142 -0
- package/dist/runtime/locale/it.js +13 -0
- package/dist/runtime/locale/ja.js +13 -0
- package/dist/runtime/locale/ka.js +13 -0
- package/dist/runtime/locale/kk.js +13 -0
- package/dist/runtime/locale/km.js +13 -0
- package/dist/runtime/locale/ko.js +13 -0
- package/dist/runtime/locale/ky.js +13 -0
- package/dist/runtime/locale/lb.js +13 -0
- package/dist/runtime/locale/lo.js +13 -0
- package/dist/runtime/locale/lt.js +13 -0
- package/dist/runtime/locale/mn.js +13 -0
- package/dist/runtime/locale/ms.js +13 -0
- package/dist/runtime/locale/nb_no.js +13 -0
- package/dist/runtime/locale/nl.js +13 -0
- package/dist/runtime/locale/pl.js +13 -0
- package/dist/runtime/locale/pt.js +13 -0
- package/dist/runtime/locale/pt_br.js +13 -0
- package/dist/runtime/locale/ro.js +13 -0
- package/dist/runtime/locale/ru.js +13 -0
- package/dist/runtime/locale/sk.js +13 -0
- package/dist/runtime/locale/sl.js +13 -0
- package/dist/runtime/locale/sq.js +13 -0
- package/dist/runtime/locale/sv.js +13 -0
- package/dist/runtime/locale/th.js +13 -0
- package/dist/runtime/locale/tj.js +13 -0
- package/dist/runtime/locale/tr.js +13 -0
- package/dist/runtime/locale/ug_cn.js +13 -0
- package/dist/runtime/locale/uk.js +13 -0
- package/dist/runtime/locale/ur.js +13 -0
- package/dist/runtime/locale/uz.js +13 -0
- package/dist/runtime/locale/vi.js +13 -0
- package/dist/runtime/locale/zh_cn.js +13 -0
- package/dist/runtime/locale/zh_tw.js +13 -0
- package/dist/runtime/types/index.d.ts +4 -0
- package/dist/runtime/types/index.js +4 -0
- package/dist/runtime/types/locale.d.ts +13 -0
- package/dist/runtime/utils/ai.d.ts +18 -0
- package/dist/runtime/utils/ai.js +13 -0
- package/dist/runtime/utils/editor.js +17 -5
- package/dist/runtime/vue/components/Icon.d.vue.ts +1 -4
- package/dist/runtime/vue/components/Icon.vue +28 -3
- package/dist/runtime/vue/components/Icon.vue.d.ts +1 -4
- package/dist/runtime/vue/components/color-mode/ColorModeSelect.d.vue.ts +1 -1
- package/dist/runtime/vue/components/color-mode/ColorModeSelect.vue.d.ts +1 -1
- package/dist/runtime/vue/components/color-mode/ColorModeSwitch.vue +3 -1
- package/dist/shared/{ui.DI_ypO2T.mjs → ui.DJUbBpE2.mjs} +298 -39
- package/dist/unplugin.d.mts +15 -5
- package/dist/unplugin.mjs +53 -30
- package/dist/vite.d.mts +1 -0
- package/dist/vite.mjs +1 -1
- package/package.json +49 -46
- /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
|
-
|
|
55
|
+
nodeChange: (args_0: {
|
|
56
56
|
node: JSONContent;
|
|
57
57
|
pos: number;
|
|
58
58
|
}) => any;
|
|
59
|
-
|
|
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
|
-
|
|
64
|
+
onNodeChange?: ((args_0: {
|
|
65
65
|
node: JSONContent;
|
|
66
66
|
pos: number;
|
|
67
67
|
}) => any) | undefined;
|
|
68
|
-
|
|
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
|
-
|
|
55
|
+
nodeChange: (args_0: {
|
|
56
56
|
node: JSONContent;
|
|
57
57
|
pos: number;
|
|
58
58
|
}) => any;
|
|
59
|
-
|
|
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
|
-
|
|
64
|
+
onNodeChange?: ((args_0: {
|
|
65
65
|
node: JSONContent;
|
|
66
66
|
pos: number;
|
|
67
67
|
}) => any) | undefined;
|
|
68
|
-
|
|
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
|
|
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
|
|
54
|
-
reset
|
|
55
|
-
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,
|
|
101
|
+
function onUpdate(files, reset2 = false) {
|
|
98
102
|
if (props.multiple) {
|
|
99
|
-
if (
|
|
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?:
|
|
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?:
|
|
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': [
|
|
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"?: ((
|
|
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",
|
|
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': [
|
|
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"?: ((
|
|
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",
|
|
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 {
|
|
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/
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
<
|
|
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
|
-
</
|
|
302
|
+
</Component.Item>
|
|
283
303
|
</DefineCreateItemTemplate>
|
|
284
304
|
|
|
285
305
|
<DefineItemTemplate v-slot="{ item, index }">
|
|
286
|
-
<
|
|
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
|
-
</
|
|
308
|
+
</Component.Label>
|
|
289
309
|
|
|
290
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
</
|
|
354
|
+
</Component.ItemIndicator>
|
|
335
355
|
</span>
|
|
336
356
|
</slot>
|
|
337
|
-
</
|
|
357
|
+
</Component.Item>
|
|
338
358
|
</DefineItemTemplate>
|
|
339
359
|
|
|
340
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
</
|
|
409
|
+
</Component.Input>
|
|
390
410
|
</TagsInputRoot>
|
|
391
411
|
|
|
392
|
-
<
|
|
412
|
+
<Component.Input
|
|
393
413
|
v-else
|
|
394
414
|
:id="id"
|
|
395
415
|
ref="inputRef"
|
|
396
|
-
|
|
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="
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
</
|
|
434
|
-
</
|
|
452
|
+
</Component.Trigger>
|
|
453
|
+
</Component.Anchor>
|
|
435
454
|
|
|
436
|
-
<
|
|
437
|
-
<
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
<
|
|
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
|
-
</
|
|
476
|
+
</Component.Virtualizer>
|
|
458
477
|
|
|
459
478
|
<ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'bottom'" />
|
|
460
479
|
</template>
|
|
461
480
|
|
|
462
481
|
<template v-else>
|
|
463
|
-
<
|
|
482
|
+
<Component.Group v-if="createItem && createItemPosition === 'top'" data-slot="group" :class="ui.group({ class: uiProp?.group })">
|
|
464
483
|
<ReuseCreateItemTemplate />
|
|
465
|
-
</
|
|
484
|
+
</Component.Group>
|
|
466
485
|
|
|
467
|
-
<
|
|
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
|
-
</
|
|
488
|
+
</Component.Group>
|
|
470
489
|
|
|
471
|
-
<
|
|
490
|
+
<Component.Group v-if="createItem && createItemPosition === 'bottom'" data-slot="group" :class="ui.group({ class: uiProp?.group })">
|
|
472
491
|
<ReuseCreateItemTemplate />
|
|
473
|
-
</
|
|
492
|
+
</Component.Group>
|
|
474
493
|
</template>
|
|
475
494
|
</div>
|
|
476
495
|
|
|
477
496
|
<slot name="content-bottom" />
|
|
478
497
|
|
|
479
|
-
<
|
|
480
|
-
</
|
|
481
|
-
</
|
|
482
|
-
</
|
|
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
|