@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.
- package/README.md +1 -1
- package/dist/module.d.mts +7 -0
- package/dist/module.json +2 -2
- package/dist/module.mjs +79 -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/ChatMessages.vue +14 -1
- package/dist/runtime/components/ChatPrompt.vue +6 -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/DashboardSidebar.vue +6 -3
- package/dist/runtime/components/Drawer.vue +6 -4
- 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 +3 -3
- 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 +6 -4
- 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 +6 -4
- 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 +12 -0
- package/dist/runtime/composables/index.js +12 -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/useIMEGuard.d.ts +10 -0
- package/dist/runtime/composables/useIMEGuard.js +22 -0
- 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 +23 -0
- package/dist/runtime/utils/ai.js +16 -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 +50 -47
- /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
|
-
(
|
|
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
|
|
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
|
-
|
|
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,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, "
|
|
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?:
|
|
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
|