@nuxt/ui 4.0.1 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nuxt/ui/calendar.ts +221 -9
- package/.nuxt/ui/chat-message.ts +10 -3
- package/.nuxt/ui/command-palette.ts +12 -2
- package/.nuxt/ui/context-menu.ts +3 -1
- package/.nuxt/ui/dropdown-menu.ts +3 -1
- package/.nuxt/ui/empty.ts +83 -0
- package/.nuxt/ui/index.ts +1 -0
- package/.nuxt/ui/input-menu.ts +12 -2
- package/.nuxt/ui/input-number.ts +25 -14
- package/.nuxt/ui/kbd.ts +1 -1
- package/.nuxt/ui/prose/code-tree.ts +1 -1
- package/.nuxt/ui/prose/img.ts +2 -1
- package/.nuxt/ui/select-menu.ts +12 -2
- package/.nuxt/ui/select.ts +4 -2
- package/.nuxt/ui/table.ts +8 -2
- package/.nuxt/ui/tree.ts +25 -11
- package/cli/templates.mjs +14 -2
- package/dist/module.d.mts +15 -0
- package/dist/module.json +2 -2
- package/dist/module.mjs +5 -2
- package/dist/runtime/components/Accordion.d.vue.ts +7 -1
- package/dist/runtime/components/Accordion.vue +4 -4
- package/dist/runtime/components/Accordion.vue.d.ts +7 -1
- package/dist/runtime/components/Alert.d.vue.ts +4 -4
- package/dist/runtime/components/Alert.vue +1 -1
- package/dist/runtime/components/Alert.vue.d.ts +4 -4
- package/dist/runtime/components/AuthForm.d.vue.ts +3 -1
- package/dist/runtime/components/AuthForm.vue +1 -1
- package/dist/runtime/components/AuthForm.vue.d.ts +3 -1
- package/dist/runtime/components/Avatar.d.vue.ts +5 -4
- package/dist/runtime/components/Avatar.vue +10 -3
- package/dist/runtime/components/Avatar.vue.d.ts +5 -4
- package/dist/runtime/components/Badge.d.vue.ts +9 -3
- package/dist/runtime/components/Badge.vue +3 -3
- package/dist/runtime/components/Badge.vue.d.ts +9 -3
- package/dist/runtime/components/Banner.d.vue.ts +4 -2
- package/dist/runtime/components/Banner.vue +1 -1
- package/dist/runtime/components/Banner.vue.d.ts +4 -2
- package/dist/runtime/components/BlogPost.d.vue.ts +9 -3
- package/dist/runtime/components/BlogPost.vue +2 -2
- package/dist/runtime/components/BlogPost.vue.d.ts +9 -3
- package/dist/runtime/components/BlogPosts.d.vue.ts +22 -13
- package/dist/runtime/components/BlogPosts.vue +8 -2
- package/dist/runtime/components/BlogPosts.vue.d.ts +22 -13
- package/dist/runtime/components/Breadcrumb.d.vue.ts +19 -4
- package/dist/runtime/components/Breadcrumb.vue +8 -8
- package/dist/runtime/components/Breadcrumb.vue.d.ts +19 -4
- package/dist/runtime/components/Button.d.vue.ts +9 -3
- package/dist/runtime/components/Button.vue +3 -3
- package/dist/runtime/components/Button.vue.d.ts +9 -3
- package/dist/runtime/components/Calendar.d.vue.ts +4 -0
- package/dist/runtime/components/Calendar.vue +3 -1
- package/dist/runtime/components/Calendar.vue.d.ts +4 -0
- package/dist/runtime/components/ChangelogVersion.d.vue.ts +12 -4
- package/dist/runtime/components/ChangelogVersion.vue +3 -3
- package/dist/runtime/components/ChangelogVersion.vue.d.ts +12 -4
- package/dist/runtime/components/ChangelogVersions.d.vue.ts +8 -36
- package/dist/runtime/components/ChangelogVersions.vue +2 -2
- package/dist/runtime/components/ChangelogVersions.vue.d.ts +8 -36
- package/dist/runtime/components/ChatMessage.d.vue.ts +1 -0
- package/dist/runtime/components/ChatMessage.vue +1 -1
- package/dist/runtime/components/ChatMessage.vue.d.ts +1 -0
- package/dist/runtime/components/ChatMessages.d.vue.ts +14 -15
- package/dist/runtime/components/ChatMessages.vue +24 -8
- package/dist/runtime/components/ChatMessages.vue.d.ts +14 -15
- package/dist/runtime/components/CommandPalette.d.vue.ts +43 -12
- package/dist/runtime/components/CommandPalette.vue +134 -68
- package/dist/runtime/components/CommandPalette.vue.d.ts +43 -12
- package/dist/runtime/components/ContextMenu.d.vue.ts +28 -6
- package/dist/runtime/components/ContextMenu.vue +2 -0
- package/dist/runtime/components/ContextMenu.vue.d.ts +28 -6
- package/dist/runtime/components/ContextMenuContent.d.vue.ts +2 -3
- package/dist/runtime/components/ContextMenuContent.vue +21 -11
- package/dist/runtime/components/ContextMenuContent.vue.d.ts +2 -3
- package/dist/runtime/components/DashboardNavbar.d.vue.ts +9 -3
- package/dist/runtime/components/DashboardNavbar.vue +3 -3
- package/dist/runtime/components/DashboardNavbar.vue.d.ts +9 -3
- package/dist/runtime/components/DashboardSearch.d.vue.ts +3 -1
- package/dist/runtime/components/DashboardSearch.vue +2 -2
- package/dist/runtime/components/DashboardSearch.vue.d.ts +3 -1
- package/dist/runtime/components/DashboardSearchButton.vue +2 -2
- package/dist/runtime/components/DashboardSidebar.d.vue.ts +5 -1
- package/dist/runtime/components/DashboardSidebar.vue +4 -4
- package/dist/runtime/components/DashboardSidebar.vue.d.ts +5 -1
- package/dist/runtime/components/Drawer.vue +2 -5
- package/dist/runtime/components/DropdownMenu.d.vue.ts +28 -6
- package/dist/runtime/components/DropdownMenu.vue +2 -0
- package/dist/runtime/components/DropdownMenu.vue.d.ts +28 -6
- package/dist/runtime/components/DropdownMenuContent.d.vue.ts +8 -5
- package/dist/runtime/components/DropdownMenuContent.vue +21 -11
- package/dist/runtime/components/DropdownMenuContent.vue.d.ts +8 -5
- package/dist/runtime/components/Empty.d.vue.ts +53 -0
- package/dist/runtime/components/Empty.vue +68 -0
- package/dist/runtime/components/Empty.vue.d.ts +53 -0
- package/dist/runtime/components/Error.d.vue.ts +0 -1
- package/dist/runtime/components/Error.vue +1 -1
- package/dist/runtime/components/Error.vue.d.ts +0 -1
- package/dist/runtime/components/FileUpload.d.vue.ts +6 -1
- package/dist/runtime/components/FileUpload.vue +8 -7
- package/dist/runtime/components/FileUpload.vue.d.ts +6 -1
- package/dist/runtime/components/FooterColumns.d.vue.ts +9 -2
- package/dist/runtime/components/FooterColumns.vue +2 -2
- package/dist/runtime/components/FooterColumns.vue.d.ts +9 -2
- package/dist/runtime/components/Header.d.vue.ts +4 -1
- package/dist/runtime/components/Header.vue +3 -3
- package/dist/runtime/components/Header.vue.d.ts +4 -1
- package/dist/runtime/components/Input.d.vue.ts +9 -3
- package/dist/runtime/components/Input.vue +3 -3
- package/dist/runtime/components/Input.vue.d.ts +9 -3
- package/dist/runtime/components/InputMenu.d.vue.ts +40 -10
- package/dist/runtime/components/InputMenu.vue +117 -65
- package/dist/runtime/components/InputMenu.vue.d.ts +40 -10
- package/dist/runtime/components/InputNumber.d.vue.ts +4 -2
- package/dist/runtime/components/InputNumber.vue +7 -5
- package/dist/runtime/components/InputNumber.vue.d.ts +4 -2
- package/dist/runtime/components/InputTags.d.vue.ts +10 -3
- package/dist/runtime/components/InputTags.vue +5 -5
- package/dist/runtime/components/InputTags.vue.d.ts +10 -3
- package/dist/runtime/components/Main.d.vue.ts +2 -4
- package/dist/runtime/components/Main.vue +1 -1
- package/dist/runtime/components/Main.vue.d.ts +2 -4
- package/dist/runtime/components/Modal.d.vue.ts +1 -4
- package/dist/runtime/components/Modal.vue +3 -6
- package/dist/runtime/components/Modal.vue.d.ts +1 -4
- package/dist/runtime/components/NavigationMenu.d.vue.ts +16 -4
- package/dist/runtime/components/NavigationMenu.vue +14 -7
- package/dist/runtime/components/NavigationMenu.vue.d.ts +16 -4
- package/dist/runtime/components/PageAnchors.d.vue.ts +9 -2
- package/dist/runtime/components/PageAnchors.vue +2 -2
- package/dist/runtime/components/PageAnchors.vue.d.ts +9 -2
- package/dist/runtime/components/PageCard.d.vue.ts +3 -1
- package/dist/runtime/components/PageCard.vue +1 -1
- package/dist/runtime/components/PageCard.vue.d.ts +3 -1
- package/dist/runtime/components/PageFeature.d.vue.ts +3 -1
- package/dist/runtime/components/PageFeature.vue +1 -1
- package/dist/runtime/components/PageFeature.vue.d.ts +3 -1
- package/dist/runtime/components/PageLinks.d.vue.ts +9 -2
- package/dist/runtime/components/PageLinks.vue +2 -2
- package/dist/runtime/components/PageLinks.vue.d.ts +9 -2
- package/dist/runtime/components/PageSection.d.vue.ts +3 -1
- package/dist/runtime/components/PageSection.vue +1 -1
- package/dist/runtime/components/PageSection.vue.d.ts +3 -1
- package/dist/runtime/components/Pagination.d.vue.ts +3 -1
- package/dist/runtime/components/Pagination.vue +1 -1
- package/dist/runtime/components/Pagination.vue.d.ts +3 -1
- package/dist/runtime/components/Popover.d.vue.ts +24 -23
- package/dist/runtime/components/Popover.vue +4 -4
- package/dist/runtime/components/Popover.vue.d.ts +24 -23
- package/dist/runtime/components/PricingPlan.d.vue.ts +9 -3
- package/dist/runtime/components/PricingPlan.vue +3 -3
- package/dist/runtime/components/PricingPlan.vue.d.ts +9 -3
- package/dist/runtime/components/PricingPlans.d.vue.ts +20 -13
- package/dist/runtime/components/PricingPlans.vue +7 -1
- package/dist/runtime/components/PricingPlans.vue.d.ts +20 -13
- package/dist/runtime/components/Select.d.vue.ts +20 -9
- package/dist/runtime/components/Select.vue +18 -9
- package/dist/runtime/components/Select.vue.d.ts +20 -9
- package/dist/runtime/components/SelectMenu.d.vue.ts +39 -11
- package/dist/runtime/components/SelectMenu.vue +114 -61
- package/dist/runtime/components/SelectMenu.vue.d.ts +39 -11
- package/dist/runtime/components/Separator.d.vue.ts +3 -1
- package/dist/runtime/components/Separator.vue +1 -1
- package/dist/runtime/components/Separator.vue.d.ts +3 -1
- package/dist/runtime/components/Slideover.d.vue.ts +1 -4
- package/dist/runtime/components/Slideover.vue +3 -6
- package/dist/runtime/components/Slideover.vue.d.ts +1 -4
- package/dist/runtime/components/Stepper.d.vue.ts +4 -1
- package/dist/runtime/components/Stepper.vue +1 -1
- package/dist/runtime/components/Stepper.vue.d.ts +4 -1
- package/dist/runtime/components/Table.d.vue.ts +21 -1
- package/dist/runtime/components/Table.vue +126 -60
- package/dist/runtime/components/Table.vue.d.ts +21 -1
- package/dist/runtime/components/Tabs.d.vue.ts +8 -3
- package/dist/runtime/components/Tabs.vue +3 -3
- package/dist/runtime/components/Tabs.vue.d.ts +8 -3
- package/dist/runtime/components/Textarea.d.vue.ts +9 -3
- package/dist/runtime/components/Textarea.vue +3 -3
- package/dist/runtime/components/Textarea.vue.d.ts +9 -3
- package/dist/runtime/components/Toast.d.vue.ts +4 -4
- package/dist/runtime/components/Toast.vue +1 -1
- package/dist/runtime/components/Toast.vue.d.ts +4 -4
- package/dist/runtime/components/Toaster.d.vue.ts +6 -0
- package/dist/runtime/components/Toaster.vue +6 -3
- package/dist/runtime/components/Toaster.vue.d.ts +6 -0
- package/dist/runtime/components/Tooltip.d.vue.ts +3 -1
- package/dist/runtime/components/Tooltip.vue +1 -1
- package/dist/runtime/components/Tooltip.vue.d.ts +3 -1
- package/dist/runtime/components/Tree.d.vue.ts +43 -5
- package/dist/runtime/components/Tree.vue +169 -81
- package/dist/runtime/components/Tree.vue.d.ts +43 -5
- package/dist/runtime/components/User.d.vue.ts +3 -1
- package/dist/runtime/components/User.vue +1 -1
- package/dist/runtime/components/User.vue.d.ts +3 -1
- package/dist/runtime/components/content/ContentNavigation.d.vue.ts +1 -0
- package/dist/runtime/components/content/ContentNavigation.vue +5 -5
- package/dist/runtime/components/content/ContentNavigation.vue.d.ts +1 -0
- package/dist/runtime/components/content/ContentSearch.d.vue.ts +3 -1
- package/dist/runtime/components/content/ContentSearch.vue +4 -2
- package/dist/runtime/components/content/ContentSearch.vue.d.ts +3 -1
- package/dist/runtime/components/content/ContentSearchButton.vue +2 -2
- package/dist/runtime/components/content/ContentSurround.d.vue.ts +1 -0
- package/dist/runtime/components/content/ContentSurround.vue +4 -4
- package/dist/runtime/components/content/ContentSurround.vue.d.ts +1 -0
- package/dist/runtime/components/content/ContentToc.d.vue.ts +2 -0
- package/dist/runtime/components/content/ContentToc.vue +2 -2
- package/dist/runtime/components/content/ContentToc.vue.d.ts +2 -0
- package/dist/runtime/components/prose/Accordion.d.vue.ts +6 -0
- package/dist/runtime/components/prose/Accordion.vue +3 -2
- package/dist/runtime/components/prose/Accordion.vue.d.ts +6 -0
- package/dist/runtime/components/prose/CodeTree.vue +40 -36
- package/dist/runtime/components/prose/Collapsible.d.vue.ts +2 -2
- package/dist/runtime/components/prose/Collapsible.vue +2 -2
- package/dist/runtime/components/prose/Collapsible.vue.d.ts +2 -2
- package/dist/runtime/components/prose/Field.d.vue.ts +1 -1
- package/dist/runtime/components/prose/Field.vue.d.ts +1 -1
- package/dist/runtime/components/prose/Img.vue +14 -3
- package/dist/runtime/components/prose/Tabs.d.vue.ts +6 -0
- package/dist/runtime/components/prose/Tabs.vue +3 -2
- package/dist/runtime/components/prose/Tabs.vue.d.ts +6 -0
- package/dist/runtime/composables/useKbd.js +1 -1
- package/dist/runtime/composables/useToast.d.ts +3 -1
- package/dist/runtime/composables/useToast.js +4 -3
- package/dist/runtime/inertia/components/Link.vue +12 -7
- package/dist/runtime/locale/hr.d.ts +3 -0
- package/dist/runtime/locale/hr.js +129 -0
- package/dist/runtime/locale/index.d.ts +1 -0
- package/dist/runtime/locale/index.js +1 -0
- package/dist/runtime/types/index.d.ts +2 -1
- package/dist/runtime/types/index.js +2 -1
- package/dist/runtime/types/tv.d.ts +6 -0
- package/dist/shared/{ui.D-FDXAUi.mjs → ui.Cmctwxv6.mjs} +381 -48
- package/dist/unplugin.mjs +2 -1
- package/dist/vite.mjs +3 -2
- package/package.json +18 -17
|
@@ -3,10 +3,10 @@ import theme from "#build/ui/command-palette";
|
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script setup>
|
|
6
|
-
import { computed, ref, useTemplateRef } from "vue";
|
|
7
|
-
import { ListboxRoot, ListboxFilter, ListboxContent, ListboxGroup, ListboxGroupLabel, ListboxItem, ListboxItemIndicator, useForwardProps, useForwardPropsEmits } from "reka-ui";
|
|
6
|
+
import { computed, ref, useTemplateRef, toRef } from "vue";
|
|
7
|
+
import { ListboxRoot, ListboxFilter, ListboxContent, ListboxGroup, ListboxGroupLabel, ListboxVirtualizer, ListboxItem, ListboxItemIndicator, useForwardProps, useForwardPropsEmits } from "reka-ui";
|
|
8
8
|
import { defu } from "defu";
|
|
9
|
-
import { reactivePick } from "@vueuse/core";
|
|
9
|
+
import { reactivePick, createReusableTemplate } from "@vueuse/core";
|
|
10
10
|
import { useFuse } from "@vueuse/integrations/useFuse";
|
|
11
11
|
import { useAppConfig } from "#imports";
|
|
12
12
|
import { useLocale } from "../composables/useLocale";
|
|
@@ -25,8 +25,9 @@ import UKbd from "./Kbd.vue";
|
|
|
25
25
|
const props = defineProps({
|
|
26
26
|
as: { type: null, required: false },
|
|
27
27
|
icon: { type: [String, Object], required: false },
|
|
28
|
-
selectedIcon: { type: [String, Object], required: false },
|
|
29
28
|
trailingIcon: { type: [String, Object], required: false },
|
|
29
|
+
selectedIcon: { type: [String, Object], required: false },
|
|
30
|
+
childrenIcon: { type: [String, Object], required: false },
|
|
30
31
|
placeholder: { type: String, required: false },
|
|
31
32
|
autofocus: { type: Boolean, required: false, default: true },
|
|
32
33
|
close: { type: [Boolean, Object], required: false },
|
|
@@ -35,14 +36,17 @@ const props = defineProps({
|
|
|
35
36
|
backIcon: { type: [String, Object], required: false },
|
|
36
37
|
groups: { type: Array, required: false },
|
|
37
38
|
fuse: { type: Object, required: false },
|
|
39
|
+
virtualize: { type: [Boolean, Object], required: false, default: false },
|
|
38
40
|
labelKey: { type: null, required: false, default: "label" },
|
|
41
|
+
descriptionKey: { type: null, required: false, default: "description" },
|
|
42
|
+
preserveGroupOrder: { type: Boolean, required: false, default: false },
|
|
39
43
|
class: { type: null, required: false },
|
|
40
44
|
ui: { type: null, required: false },
|
|
41
45
|
multiple: { type: Boolean, required: false },
|
|
42
46
|
disabled: { type: Boolean, required: false },
|
|
43
47
|
modelValue: { type: null, required: false, default: "" },
|
|
44
48
|
defaultValue: { type: null, required: false },
|
|
45
|
-
highlightOnHover: { type: Boolean, required: false },
|
|
49
|
+
highlightOnHover: { type: Boolean, required: false, default: true },
|
|
46
50
|
selectionBehavior: { type: String, required: false },
|
|
47
51
|
loading: { type: Boolean, required: false },
|
|
48
52
|
loadingIcon: { type: [String, Object], required: false }
|
|
@@ -54,7 +58,26 @@ const { t } = useLocale();
|
|
|
54
58
|
const appConfig = useAppConfig();
|
|
55
59
|
const rootProps = useForwardPropsEmits(reactivePick(props, "as", "disabled", "multiple", "modelValue", "defaultValue", "highlightOnHover"), emits);
|
|
56
60
|
const inputProps = useForwardProps(reactivePick(props, "loading"));
|
|
57
|
-
const
|
|
61
|
+
const virtualizerProps = toRef(() => !!props.virtualize && defu(typeof props.virtualize === "boolean" ? {} : props.virtualize, { estimateSize: 32 }));
|
|
62
|
+
const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate({
|
|
63
|
+
props: {
|
|
64
|
+
item: {
|
|
65
|
+
type: Object,
|
|
66
|
+
required: true
|
|
67
|
+
},
|
|
68
|
+
group: {
|
|
69
|
+
type: Object,
|
|
70
|
+
required: false
|
|
71
|
+
},
|
|
72
|
+
index: {
|
|
73
|
+
type: Number,
|
|
74
|
+
required: false
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.commandPalette || {} })({
|
|
79
|
+
virtualize: !!props.virtualize
|
|
80
|
+
}));
|
|
58
81
|
const fuse = computed(() => defu({}, props.fuse, {
|
|
59
82
|
fuseOptions: {
|
|
60
83
|
ignoreLocation: true,
|
|
@@ -103,6 +126,19 @@ const filteredGroups = computed(() => {
|
|
|
103
126
|
acc[item.group]?.push({ ...item, matches });
|
|
104
127
|
return acc;
|
|
105
128
|
}, {});
|
|
129
|
+
if (props.preserveGroupOrder) {
|
|
130
|
+
const processedGroups = [];
|
|
131
|
+
for (const group of groups.value || []) {
|
|
132
|
+
if (!group.items?.length) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const items2 = group.ignoreFilter ? group.items : groupsById[group.id];
|
|
136
|
+
if (items2?.length) {
|
|
137
|
+
processedGroups.push(getGroupWithItems(group, items2));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return processedGroups;
|
|
141
|
+
}
|
|
106
142
|
const fuseGroups = Object.entries(groupsById).map(([id, items2]) => {
|
|
107
143
|
const group = groups.value?.find((group2) => group2.id === id);
|
|
108
144
|
if (!group) {
|
|
@@ -116,6 +152,7 @@ const filteredGroups = computed(() => {
|
|
|
116
152
|
return acc;
|
|
117
153
|
}, [...fuseGroups]);
|
|
118
154
|
});
|
|
155
|
+
const filteredItems = computed(() => filteredGroups.value.flatMap((group) => group.items || []));
|
|
119
156
|
const listboxRootRef = useTemplateRef("listboxRootRef");
|
|
120
157
|
function navigate(item) {
|
|
121
158
|
if (!item.children?.length) {
|
|
@@ -155,6 +192,73 @@ function onSelect(e, item) {
|
|
|
155
192
|
</script>
|
|
156
193
|
|
|
157
194
|
<template>
|
|
195
|
+
<DefineItemTemplate v-slot="{ item, index, group }">
|
|
196
|
+
<ListboxItem
|
|
197
|
+
:value="omit(item, ['matches', 'group', 'onSelect', 'labelHtml', 'suffixHtml', 'children'])"
|
|
198
|
+
:disabled="item.disabled"
|
|
199
|
+
as-child
|
|
200
|
+
@select="onSelect($event, item)"
|
|
201
|
+
>
|
|
202
|
+
<ULink v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item)" custom>
|
|
203
|
+
<ULinkBase v-bind="slotProps" :class="ui.item({ class: [props.ui?.item, item.ui?.item, item.class], active: active || item.active })">
|
|
204
|
+
<slot :name="item.slot || group?.slot || 'item'" :item="item" :index="index" :ui="ui">
|
|
205
|
+
<slot :name="item.slot ? `${item.slot}-leading` : group?.slot ? `${group.slot}-leading` : `item-leading`" :item="item" :index="index" :ui="ui">
|
|
206
|
+
<UIcon v-if="item.loading" :name="loadingIcon || appConfig.ui.icons.loading" :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon], loading: true })" />
|
|
207
|
+
<UIcon v-else-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon], active: active || item.active })" />
|
|
208
|
+
<UAvatar v-else-if="item.avatar" :size="item.ui?.itemLeadingAvatarSize || props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: [props.ui?.itemLeadingAvatar, item.ui?.itemLeadingAvatar], active: active || item.active })" />
|
|
209
|
+
<UChip
|
|
210
|
+
v-else-if="item.chip"
|
|
211
|
+
:size="item.ui?.itemLeadingChipSize || props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()"
|
|
212
|
+
inset
|
|
213
|
+
standalone
|
|
214
|
+
v-bind="item.chip"
|
|
215
|
+
:class="ui.itemLeadingChip({ class: [props.ui?.itemLeadingChip, item.ui?.itemLeadingChip], active: active || item.active })"
|
|
216
|
+
/>
|
|
217
|
+
</slot>
|
|
218
|
+
|
|
219
|
+
<span v-if="item.prefix || (item.labelHtml || get(item, props.labelKey)) || (item.suffixHtml || item.suffix) || !!slots[item.slot ? `${item.slot}-label` : group?.slot ? `${group.slot}-label` : `item-label`] || (get(item, props.descriptionKey) || !!slots[item.slot ? `${item.slot}-description` : group?.slot ? `${group.slot}-description` : `item-description`])" :class="ui.itemWrapper({ class: [props.ui?.itemWrapper, item.ui?.itemWrapper] })">
|
|
220
|
+
<span :class="ui.itemLabel({ class: [props.ui?.itemLabel, item.ui?.itemLabel], active: active || item.active })">
|
|
221
|
+
<slot :name="item.slot ? `${item.slot}-label` : group?.slot ? `${group.slot}-label` : `item-label`" :item="item" :index="index" :ui="ui">
|
|
222
|
+
<span v-if="item.prefix" :class="ui.itemLabelPrefix({ class: [props.ui?.itemLabelPrefix, item.ui?.itemLabelPrefix] })">{{ item.prefix }}</span>
|
|
223
|
+
|
|
224
|
+
<span :class="ui.itemLabelBase({ class: [props.ui?.itemLabelBase, item.ui?.itemLabelBase], active: active || item.active })" v-html="item.labelHtml || get(item, props.labelKey)" />
|
|
225
|
+
|
|
226
|
+
<span :class="ui.itemLabelSuffix({ class: [props.ui?.itemLabelSuffix, item.ui?.itemLabelSuffix], active: active || item.active })" v-html="item.suffixHtml || item.suffix" />
|
|
227
|
+
</slot>
|
|
228
|
+
</span>
|
|
229
|
+
|
|
230
|
+
<span v-if="get(item, props.descriptionKey)" :class="ui.itemDescription({ class: [props.ui?.itemDescription, item.ui?.itemDescription] })">
|
|
231
|
+
<slot :name="item.slot ? `${item.slot}-description` : group?.slot ? `${group.slot}-description` : `item-description`" :item="item" :index="index" :ui="ui">
|
|
232
|
+
{{ get(item, props.descriptionKey) }}
|
|
233
|
+
</slot>
|
|
234
|
+
</span>
|
|
235
|
+
</span>
|
|
236
|
+
|
|
237
|
+
<span :class="ui.itemTrailing({ class: [props.ui?.itemTrailing, item.ui?.itemTrailing] })">
|
|
238
|
+
<slot :name="item.slot ? `${item.slot}-trailing` : group?.slot ? `${group.slot}-trailing` : `item-trailing`" :item="item" :index="index" :ui="ui">
|
|
239
|
+
<UIcon
|
|
240
|
+
v-if="item.children && item.children.length > 0"
|
|
241
|
+
:name="childrenIcon || appConfig.ui.icons.chevronRight"
|
|
242
|
+
:class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, item.ui?.itemTrailingIcon] })"
|
|
243
|
+
/>
|
|
244
|
+
|
|
245
|
+
<span v-else-if="item.kbds?.length" :class="ui.itemTrailingKbds({ class: [props.ui?.itemTrailingKbds, item.ui?.itemTrailingKbds] })">
|
|
246
|
+
<UKbd v-for="(kbd, kbdIndex) in item.kbds" :key="kbdIndex" :size="item.ui?.itemTrailingKbdsSize || props.ui?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
|
|
247
|
+
</span>
|
|
248
|
+
|
|
249
|
+
<UIcon v-else-if="group?.highlightedIcon" :name="group.highlightedIcon" :class="ui.itemTrailingHighlightedIcon({ class: [props.ui?.itemTrailingHighlightedIcon, item.ui?.itemTrailingHighlightedIcon] })" />
|
|
250
|
+
</slot>
|
|
251
|
+
|
|
252
|
+
<ListboxItemIndicator v-if="!item.children?.length" as-child>
|
|
253
|
+
<UIcon :name="selectedIcon || appConfig.ui.icons.check" :class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, item.ui?.itemTrailingIcon] })" />
|
|
254
|
+
</ListboxItemIndicator>
|
|
255
|
+
</span>
|
|
256
|
+
</slot>
|
|
257
|
+
</ULinkBase>
|
|
258
|
+
</ULink>
|
|
259
|
+
</ListboxItem>
|
|
260
|
+
</DefineItemTemplate>
|
|
261
|
+
|
|
158
262
|
<ListboxRoot v-bind="rootProps" ref="listboxRootRef" :selection-behavior="selectionBehavior" :class="ui.root({ class: [props.ui?.root, props.class] })">
|
|
159
263
|
<ListboxFilter v-model="searchTerm" as-child>
|
|
160
264
|
<UInput
|
|
@@ -163,6 +267,7 @@ function onSelect(e, item) {
|
|
|
163
267
|
:autofocus="autofocus"
|
|
164
268
|
v-bind="inputProps"
|
|
165
269
|
:loading-icon="loadingIcon"
|
|
270
|
+
:trailing-icon="trailingIcon"
|
|
166
271
|
:icon="icon || appConfig.ui.icons.search"
|
|
167
272
|
:class="ui.input({ class: props.ui?.input })"
|
|
168
273
|
@keydown.backspace="onBackspace"
|
|
@@ -200,70 +305,31 @@ function onSelect(e, item) {
|
|
|
200
305
|
|
|
201
306
|
<ListboxContent :class="ui.content({ class: props.ui?.content })">
|
|
202
307
|
<div v-if="filteredGroups?.length" role="presentation" :class="ui.viewport({ class: props.ui?.viewport })">
|
|
203
|
-
<
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
:disabled="item.disabled"
|
|
213
|
-
as-child
|
|
214
|
-
@select="onSelect($event, item)"
|
|
215
|
-
>
|
|
216
|
-
<ULink v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item)" custom>
|
|
217
|
-
<ULinkBase v-bind="slotProps" :class="ui.item({ class: [props.ui?.item, item.ui?.item, item.class], active: active || item.active })">
|
|
218
|
-
<slot :name="item.slot || group.slot || 'item'" :item="item" :index="index">
|
|
219
|
-
<slot :name="item.slot ? `${item.slot}-leading` : group.slot ? `${group.slot}-leading` : `item-leading`" :item="item" :index="index">
|
|
220
|
-
<UIcon v-if="item.loading" :name="loadingIcon || appConfig.ui.icons.loading" :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon], loading: true })" />
|
|
221
|
-
<UIcon v-else-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon], active: active || item.active })" />
|
|
222
|
-
<UAvatar v-else-if="item.avatar" :size="item.ui?.itemLeadingAvatarSize || props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: [props.ui?.itemLeadingAvatar, item.ui?.itemLeadingAvatar], active: active || item.active })" />
|
|
223
|
-
<UChip
|
|
224
|
-
v-else-if="item.chip"
|
|
225
|
-
:size="item.ui?.itemLeadingChipSize || props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()"
|
|
226
|
-
inset
|
|
227
|
-
standalone
|
|
228
|
-
v-bind="item.chip"
|
|
229
|
-
:class="ui.itemLeadingChip({ class: [props.ui?.itemLeadingChip, item.ui?.itemLeadingChip], active: active || item.active })"
|
|
230
|
-
/>
|
|
231
|
-
</slot>
|
|
232
|
-
|
|
233
|
-
<span v-if="item.labelHtml || get(item, props.labelKey) || !!slots[item.slot ? `${item.slot}-label` : group.slot ? `${group.slot}-label` : `item-label`]" :class="ui.itemLabel({ class: [props.ui?.itemLabel, item.ui?.itemLabel], active: active || item.active })">
|
|
234
|
-
<slot :name="item.slot ? `${item.slot}-label` : group.slot ? `${group.slot}-label` : `item-label`" :item="item" :index="index">
|
|
235
|
-
<span v-if="item.prefix" :class="ui.itemLabelPrefix({ class: [props.ui?.itemLabelPrefix, item.ui?.itemLabelPrefix] })">{{ item.prefix }}</span>
|
|
308
|
+
<ListboxVirtualizer
|
|
309
|
+
v-if="!!virtualize"
|
|
310
|
+
v-slot="{ option: item, virtualItem }"
|
|
311
|
+
:options="filteredItems"
|
|
312
|
+
:text-content="(item2) => get(item2, props.labelKey)"
|
|
313
|
+
v-bind="virtualizerProps"
|
|
314
|
+
>
|
|
315
|
+
<ReuseItemTemplate :item="item" :index="virtualItem.index" />
|
|
316
|
+
</ListboxVirtualizer>
|
|
236
317
|
|
|
237
|
-
|
|
318
|
+
<template v-else>
|
|
319
|
+
<ListboxGroup v-for="group in filteredGroups" :key="`group-${group.id}`" :class="ui.group({ class: props.ui?.group })">
|
|
320
|
+
<ListboxGroupLabel v-if="get(group, props.labelKey)" :class="ui.label({ class: props.ui?.label })">
|
|
321
|
+
{{ get(group, props.labelKey) }}
|
|
322
|
+
</ListboxGroupLabel>
|
|
238
323
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
:class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, item.ui?.itemTrailingIcon] })"
|
|
249
|
-
/>
|
|
250
|
-
|
|
251
|
-
<span v-else-if="item.kbds?.length" :class="ui.itemTrailingKbds({ class: [props.ui?.itemTrailingKbds, item.ui?.itemTrailingKbds] })">
|
|
252
|
-
<UKbd v-for="(kbd, kbdIndex) in item.kbds" :key="kbdIndex" :size="item.ui?.itemTrailingKbdsSize || props.ui?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
|
|
253
|
-
</span>
|
|
254
|
-
|
|
255
|
-
<UIcon v-else-if="group.highlightedIcon" :name="group.highlightedIcon" :class="ui.itemTrailingHighlightedIcon({ class: [props.ui?.itemTrailingHighlightedIcon, item.ui?.itemTrailingHighlightedIcon] })" />
|
|
256
|
-
</slot>
|
|
257
|
-
|
|
258
|
-
<ListboxItemIndicator v-if="!item.children?.length" as-child>
|
|
259
|
-
<UIcon :name="selectedIcon || appConfig.ui.icons.check" :class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, item.ui?.itemTrailingIcon] })" />
|
|
260
|
-
</ListboxItemIndicator>
|
|
261
|
-
</span>
|
|
262
|
-
</slot>
|
|
263
|
-
</ULinkBase>
|
|
264
|
-
</ULink>
|
|
265
|
-
</ListboxItem>
|
|
266
|
-
</ListboxGroup>
|
|
324
|
+
<ReuseItemTemplate
|
|
325
|
+
v-for="(item, index) in group.items"
|
|
326
|
+
:key="`group-${group.id}-${index}`"
|
|
327
|
+
:item="item"
|
|
328
|
+
:index="index"
|
|
329
|
+
:group="group"
|
|
330
|
+
/>
|
|
331
|
+
</ListboxGroup>
|
|
332
|
+
</template>
|
|
267
333
|
</div>
|
|
268
334
|
|
|
269
335
|
<div v-else :class="ui.empty({ class: props.ui?.empty })">
|
|
@@ -11,6 +11,7 @@ export interface CommandPaletteItem extends Omit<LinkProps, 'type' | 'raw' | 'cu
|
|
|
11
11
|
prefix?: string;
|
|
12
12
|
label?: string;
|
|
13
13
|
suffix?: string;
|
|
14
|
+
description?: string;
|
|
14
15
|
/**
|
|
15
16
|
* @IconifyIcon
|
|
16
17
|
*/
|
|
@@ -27,9 +28,9 @@ export interface CommandPaletteItem extends Omit<LinkProps, 'type' | 'raw' | 'cu
|
|
|
27
28
|
*/
|
|
28
29
|
placeholder?: string;
|
|
29
30
|
children?: CommandPaletteItem[];
|
|
30
|
-
onSelect
|
|
31
|
+
onSelect?: (e: Event) => void;
|
|
31
32
|
class?: any;
|
|
32
|
-
ui?: Pick<CommandPalette['slots'], 'item' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemLeadingChipSize' | 'itemLeadingChip' | 'itemLabel' | 'itemLabelPrefix' | 'itemLabelBase' | 'itemLabelSuffix' | 'itemTrailing' | 'itemTrailingKbds' | 'itemTrailingKbdsSize' | 'itemTrailingHighlightedIcon' | 'itemTrailingIcon'>;
|
|
33
|
+
ui?: Pick<CommandPalette['slots'], 'item' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemLeadingChipSize' | 'itemLeadingChip' | 'itemWrapper' | 'itemLabel' | 'itemDescription' | 'itemLabelPrefix' | 'itemLabelBase' | 'itemLabelSuffix' | 'itemTrailing' | 'itemTrailingKbds' | 'itemTrailingKbdsSize' | 'itemTrailingHighlightedIcon' | 'itemTrailingIcon'>;
|
|
33
34
|
[key: string]: any;
|
|
34
35
|
}
|
|
35
36
|
export interface CommandPaletteGroup<T extends CommandPaletteItem = CommandPaletteItem> {
|
|
@@ -63,6 +64,12 @@ export interface CommandPaletteProps<G extends CommandPaletteGroup<T> = CommandP
|
|
|
63
64
|
* @IconifyIcon
|
|
64
65
|
*/
|
|
65
66
|
icon?: IconProps['name'];
|
|
67
|
+
/**
|
|
68
|
+
* The icon displayed on the right side of the input.
|
|
69
|
+
* @defaultValue appConfig.ui.icons.search
|
|
70
|
+
* @IconifyIcon
|
|
71
|
+
*/
|
|
72
|
+
trailingIcon?: IconProps['name'];
|
|
66
73
|
/**
|
|
67
74
|
* The icon displayed when an item is selected.
|
|
68
75
|
* @defaultValue appConfig.ui.icons.check
|
|
@@ -74,7 +81,7 @@ export interface CommandPaletteProps<G extends CommandPaletteGroup<T> = CommandP
|
|
|
74
81
|
* @defaultValue appConfig.ui.icons.chevronRight
|
|
75
82
|
* @IconifyIcon
|
|
76
83
|
*/
|
|
77
|
-
|
|
84
|
+
childrenIcon?: IconProps['name'];
|
|
78
85
|
/**
|
|
79
86
|
* The placeholder text for the input.
|
|
80
87
|
* @defaultValue t('commandPalette.placeholder')
|
|
@@ -124,11 +131,39 @@ export interface CommandPaletteProps<G extends CommandPaletteGroup<T> = CommandP
|
|
|
124
131
|
}
|
|
125
132
|
*/
|
|
126
133
|
fuse?: UseFuseOptions<T>;
|
|
134
|
+
/**
|
|
135
|
+
* Enable virtualization for large lists.
|
|
136
|
+
* Note: when enabled, all groups are flattened into a single list due to a limitation of Reka UI (https://github.com/unovue/reka-ui/issues/1885).
|
|
137
|
+
* @defaultValue false
|
|
138
|
+
*/
|
|
139
|
+
virtualize?: boolean | {
|
|
140
|
+
/**
|
|
141
|
+
* Number of items rendered outside the visible area
|
|
142
|
+
* @defaultValue 12
|
|
143
|
+
*/
|
|
144
|
+
overscan?: number;
|
|
145
|
+
/**
|
|
146
|
+
* Estimated size (in px) of each item
|
|
147
|
+
* @defaultValue 32
|
|
148
|
+
*/
|
|
149
|
+
estimateSize?: number;
|
|
150
|
+
};
|
|
127
151
|
/**
|
|
128
152
|
* The key used to get the label from the item.
|
|
129
153
|
* @defaultValue 'label'
|
|
130
154
|
*/
|
|
131
155
|
labelKey?: GetItemKeys<T>;
|
|
156
|
+
/**
|
|
157
|
+
* The key used to get the description from the item.
|
|
158
|
+
* @defaultValue 'description'
|
|
159
|
+
*/
|
|
160
|
+
descriptionKey?: GetItemKeys<T>;
|
|
161
|
+
/**
|
|
162
|
+
* Whether to preserve the order of groups as defined in the `groups` prop when filtering.
|
|
163
|
+
* When `false`, groups will appear based on item matches.
|
|
164
|
+
* @defaultValue false
|
|
165
|
+
*/
|
|
166
|
+
preserveGroupOrder?: boolean;
|
|
132
167
|
class?: any;
|
|
133
168
|
ui?: CommandPalette['slots'];
|
|
134
169
|
}
|
|
@@ -138,29 +173,25 @@ export type CommandPaletteEmits<T extends CommandPaletteItem = CommandPaletteIte
|
|
|
138
173
|
type SlotProps<T> = (props: {
|
|
139
174
|
item: T;
|
|
140
175
|
index: number;
|
|
176
|
+
ui: CommandPalette['ui'];
|
|
141
177
|
}) => any;
|
|
142
178
|
export type CommandPaletteSlots<G extends CommandPaletteGroup<T> = CommandPaletteGroup<any>, T extends CommandPaletteItem = CommandPaletteItem> = {
|
|
143
179
|
'empty'(props: {
|
|
144
180
|
searchTerm?: string;
|
|
145
181
|
}): any;
|
|
146
182
|
'footer'(props: {
|
|
147
|
-
ui:
|
|
148
|
-
[K in keyof Required<CommandPalette['slots']>]: (props?: Record<string, any>) => string;
|
|
149
|
-
};
|
|
183
|
+
ui: CommandPalette['ui'];
|
|
150
184
|
}): any;
|
|
151
185
|
'back'(props: {
|
|
152
|
-
ui:
|
|
153
|
-
[K in keyof Required<CommandPalette['slots']>]: (props?: Record<string, any>) => string;
|
|
154
|
-
};
|
|
186
|
+
ui: CommandPalette['ui'];
|
|
155
187
|
}): any;
|
|
156
188
|
'close'(props: {
|
|
157
|
-
ui:
|
|
158
|
-
[K in keyof Required<CommandPalette['slots']>]: (props?: Record<string, any>) => string;
|
|
159
|
-
};
|
|
189
|
+
ui: CommandPalette['ui'];
|
|
160
190
|
}): any;
|
|
161
191
|
'item': SlotProps<T>;
|
|
162
192
|
'item-leading': SlotProps<T>;
|
|
163
193
|
'item-label': SlotProps<T>;
|
|
194
|
+
'item-description': SlotProps<T>;
|
|
164
195
|
'item-trailing': SlotProps<T>;
|
|
165
196
|
} & Record<string, SlotProps<G>> & Record<string, SlotProps<T>>;
|
|
166
197
|
declare const __VLS_export: <G extends CommandPaletteGroup<T>, T extends CommandPaletteItem>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
@@ -7,13 +7,16 @@ import type { ComponentConfig } from '../types/tv';
|
|
|
7
7
|
type ContextMenu = ComponentConfig<typeof theme, AppConfig, 'contextMenu'>;
|
|
8
8
|
export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
|
|
9
9
|
label?: string;
|
|
10
|
+
description?: string;
|
|
10
11
|
/**
|
|
11
12
|
* @IconifyIcon
|
|
12
13
|
*/
|
|
13
14
|
icon?: IconProps['name'];
|
|
14
15
|
color?: ContextMenu['variants']['color'];
|
|
15
16
|
avatar?: AvatarProps;
|
|
16
|
-
content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> &
|
|
17
|
+
content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> & {
|
|
18
|
+
class?: any;
|
|
19
|
+
} & Partial<EmitsToProps<ContextMenuContentEmits>>;
|
|
17
20
|
kbds?: KbdProps['value'][] | KbdProps[];
|
|
18
21
|
/**
|
|
19
22
|
* The item type.
|
|
@@ -27,10 +30,10 @@ export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custo
|
|
|
27
30
|
open?: boolean;
|
|
28
31
|
defaultOpen?: boolean;
|
|
29
32
|
children?: ArrayOrNested<ContextMenuItem>;
|
|
30
|
-
onSelect
|
|
31
|
-
onUpdateChecked
|
|
33
|
+
onSelect?: (e: Event) => void;
|
|
34
|
+
onUpdateChecked?: (checked: boolean) => void;
|
|
32
35
|
class?: any;
|
|
33
|
-
ui?: Pick<ContextMenu['slots'], 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemLabel' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
|
|
36
|
+
ui?: Pick<ContextMenu['slots'], 'content' | 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemWrapper' | 'itemLabel' | 'itemDescription' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
|
|
34
37
|
[key: string]: any;
|
|
35
38
|
}
|
|
36
39
|
export interface ContextMenuProps<T extends ArrayOrNested<ContextMenuItem> = ArrayOrNested<ContextMenuItem>> extends Omit<ContextMenuRootProps, 'dir'> {
|
|
@@ -70,6 +73,11 @@ export interface ContextMenuProps<T extends ArrayOrNested<ContextMenuItem> = Arr
|
|
|
70
73
|
* @defaultValue 'label'
|
|
71
74
|
*/
|
|
72
75
|
labelKey?: GetItemKeys<T>;
|
|
76
|
+
/**
|
|
77
|
+
* The key used to get the description from the item.
|
|
78
|
+
* @defaultValue 'description'
|
|
79
|
+
*/
|
|
80
|
+
descriptionKey?: GetItemKeys<T>;
|
|
73
81
|
disabled?: boolean;
|
|
74
82
|
class?: any;
|
|
75
83
|
ui?: ContextMenu['slots'];
|
|
@@ -80,18 +88,32 @@ type SlotProps<T extends ContextMenuItem> = (props: {
|
|
|
80
88
|
item: T;
|
|
81
89
|
active?: boolean;
|
|
82
90
|
index: number;
|
|
91
|
+
ui: ContextMenu['ui'];
|
|
83
92
|
}) => any;
|
|
84
93
|
export type ContextMenuSlots<A extends ArrayOrNested<ContextMenuItem> = ArrayOrNested<ContextMenuItem>, T extends NestedItem<A> = NestedItem<A>> = {
|
|
85
94
|
'default'(props?: {}): any;
|
|
86
95
|
'item': SlotProps<T>;
|
|
87
96
|
'item-leading': SlotProps<T>;
|
|
88
|
-
'item-label':
|
|
97
|
+
'item-label': (props: {
|
|
98
|
+
item: T;
|
|
99
|
+
active?: boolean;
|
|
100
|
+
index: number;
|
|
101
|
+
}) => any;
|
|
102
|
+
'item-description': (props: {
|
|
103
|
+
item: T;
|
|
104
|
+
active?: boolean;
|
|
105
|
+
index: number;
|
|
106
|
+
}) => any;
|
|
89
107
|
'item-trailing': SlotProps<T>;
|
|
90
108
|
'content-top': (props?: {}) => any;
|
|
91
109
|
'content-bottom': (props?: {}) => any;
|
|
92
|
-
} & DynamicSlots<MergeTypes<T>, '
|
|
110
|
+
} & DynamicSlots<MergeTypes<T>, 'label' | 'description', {
|
|
111
|
+
active?: boolean;
|
|
112
|
+
index: number;
|
|
113
|
+
}> & DynamicSlots<MergeTypes<T>, 'leading' | 'trailing', {
|
|
93
114
|
active?: boolean;
|
|
94
115
|
index: number;
|
|
116
|
+
ui: ContextMenu['ui'];
|
|
95
117
|
}>;
|
|
96
118
|
declare const __VLS_export: <T extends ArrayOrNested<ContextMenuItem>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
97
119
|
props: __VLS_PrettifyLocal<ContextMenuProps<T> & {
|
|
@@ -19,6 +19,7 @@ const props = defineProps({
|
|
|
19
19
|
content: { type: Object, required: false },
|
|
20
20
|
portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
|
|
21
21
|
labelKey: { type: null, required: false, default: "label" },
|
|
22
|
+
descriptionKey: { type: null, required: false, default: "description" },
|
|
22
23
|
disabled: { type: Boolean, required: false },
|
|
23
24
|
class: { type: null, required: false },
|
|
24
25
|
ui: { type: null, required: false },
|
|
@@ -50,6 +51,7 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contextMenu |
|
|
|
50
51
|
:items="items"
|
|
51
52
|
:portal="portal"
|
|
52
53
|
:label-key="labelKey"
|
|
54
|
+
:description-key="descriptionKey"
|
|
53
55
|
:checked-icon="checkedIcon"
|
|
54
56
|
:loading-icon="loadingIcon"
|
|
55
57
|
:external-icon="externalIcon"
|
|
@@ -7,13 +7,16 @@ import type { ComponentConfig } from '../types/tv';
|
|
|
7
7
|
type ContextMenu = ComponentConfig<typeof theme, AppConfig, 'contextMenu'>;
|
|
8
8
|
export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
|
|
9
9
|
label?: string;
|
|
10
|
+
description?: string;
|
|
10
11
|
/**
|
|
11
12
|
* @IconifyIcon
|
|
12
13
|
*/
|
|
13
14
|
icon?: IconProps['name'];
|
|
14
15
|
color?: ContextMenu['variants']['color'];
|
|
15
16
|
avatar?: AvatarProps;
|
|
16
|
-
content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> &
|
|
17
|
+
content?: Omit<ContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> & {
|
|
18
|
+
class?: any;
|
|
19
|
+
} & Partial<EmitsToProps<ContextMenuContentEmits>>;
|
|
17
20
|
kbds?: KbdProps['value'][] | KbdProps[];
|
|
18
21
|
/**
|
|
19
22
|
* The item type.
|
|
@@ -27,10 +30,10 @@ export interface ContextMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custo
|
|
|
27
30
|
open?: boolean;
|
|
28
31
|
defaultOpen?: boolean;
|
|
29
32
|
children?: ArrayOrNested<ContextMenuItem>;
|
|
30
|
-
onSelect
|
|
31
|
-
onUpdateChecked
|
|
33
|
+
onSelect?: (e: Event) => void;
|
|
34
|
+
onUpdateChecked?: (checked: boolean) => void;
|
|
32
35
|
class?: any;
|
|
33
|
-
ui?: Pick<ContextMenu['slots'], 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemLabel' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
|
|
36
|
+
ui?: Pick<ContextMenu['slots'], 'content' | 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemWrapper' | 'itemLabel' | 'itemDescription' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
|
|
34
37
|
[key: string]: any;
|
|
35
38
|
}
|
|
36
39
|
export interface ContextMenuProps<T extends ArrayOrNested<ContextMenuItem> = ArrayOrNested<ContextMenuItem>> extends Omit<ContextMenuRootProps, 'dir'> {
|
|
@@ -70,6 +73,11 @@ export interface ContextMenuProps<T extends ArrayOrNested<ContextMenuItem> = Arr
|
|
|
70
73
|
* @defaultValue 'label'
|
|
71
74
|
*/
|
|
72
75
|
labelKey?: GetItemKeys<T>;
|
|
76
|
+
/**
|
|
77
|
+
* The key used to get the description from the item.
|
|
78
|
+
* @defaultValue 'description'
|
|
79
|
+
*/
|
|
80
|
+
descriptionKey?: GetItemKeys<T>;
|
|
73
81
|
disabled?: boolean;
|
|
74
82
|
class?: any;
|
|
75
83
|
ui?: ContextMenu['slots'];
|
|
@@ -80,18 +88,32 @@ type SlotProps<T extends ContextMenuItem> = (props: {
|
|
|
80
88
|
item: T;
|
|
81
89
|
active?: boolean;
|
|
82
90
|
index: number;
|
|
91
|
+
ui: ContextMenu['ui'];
|
|
83
92
|
}) => any;
|
|
84
93
|
export type ContextMenuSlots<A extends ArrayOrNested<ContextMenuItem> = ArrayOrNested<ContextMenuItem>, T extends NestedItem<A> = NestedItem<A>> = {
|
|
85
94
|
'default'(props?: {}): any;
|
|
86
95
|
'item': SlotProps<T>;
|
|
87
96
|
'item-leading': SlotProps<T>;
|
|
88
|
-
'item-label':
|
|
97
|
+
'item-label': (props: {
|
|
98
|
+
item: T;
|
|
99
|
+
active?: boolean;
|
|
100
|
+
index: number;
|
|
101
|
+
}) => any;
|
|
102
|
+
'item-description': (props: {
|
|
103
|
+
item: T;
|
|
104
|
+
active?: boolean;
|
|
105
|
+
index: number;
|
|
106
|
+
}) => any;
|
|
89
107
|
'item-trailing': SlotProps<T>;
|
|
90
108
|
'content-top': (props?: {}) => any;
|
|
91
109
|
'content-bottom': (props?: {}) => any;
|
|
92
|
-
} & DynamicSlots<MergeTypes<T>, '
|
|
110
|
+
} & DynamicSlots<MergeTypes<T>, 'label' | 'description', {
|
|
111
|
+
active?: boolean;
|
|
112
|
+
index: number;
|
|
113
|
+
}> & DynamicSlots<MergeTypes<T>, 'leading' | 'trailing', {
|
|
93
114
|
active?: boolean;
|
|
94
115
|
index: number;
|
|
116
|
+
ui: ContextMenu['ui'];
|
|
95
117
|
}>;
|
|
96
118
|
declare const __VLS_export: <T extends ArrayOrNested<ContextMenuItem>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
97
119
|
props: __VLS_PrettifyLocal<ContextMenuProps<T> & {
|
|
@@ -11,6 +11,7 @@ interface ContextMenuContentProps<T extends ArrayOrNested<ContextMenuItem>> exte
|
|
|
11
11
|
portal?: boolean | string | HTMLElement;
|
|
12
12
|
sub?: boolean;
|
|
13
13
|
labelKey: GetItemKeys<T>;
|
|
14
|
+
descriptionKey: GetItemKeys<T>;
|
|
14
15
|
/**
|
|
15
16
|
* @IconifyIcon
|
|
16
17
|
*/
|
|
@@ -24,9 +25,7 @@ interface ContextMenuContentProps<T extends ArrayOrNested<ContextMenuItem>> exte
|
|
|
24
25
|
*/
|
|
25
26
|
externalIcon?: boolean | IconProps['name'];
|
|
26
27
|
class?: any;
|
|
27
|
-
ui:
|
|
28
|
-
[K in keyof Required<ContextMenu['slots']>]: (props?: Record<string, any>) => string;
|
|
29
|
-
};
|
|
28
|
+
ui: ContextMenu['ui'];
|
|
30
29
|
uiOverride?: ContextMenu['slots'];
|
|
31
30
|
}
|
|
32
31
|
declare const __VLS_export: <T extends ArrayOrNested<ContextMenuItem>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|