@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,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
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { ComponentPublicInstance, VNode } from 'vue';
|
|
2
|
-
import type { TimeFieldRootProps,
|
|
2
|
+
import type { TimeFieldRootEmits, TimeFieldRootProps, TimeRangeFieldRootEmits, TimeRangeFieldRootProps, TimeValue } from 'reka-ui';
|
|
3
3
|
import type { AppConfig } from '@nuxt/schema';
|
|
4
4
|
import theme from '#build/ui/input-time';
|
|
5
5
|
import type { UseComponentIconsProps } from '../composables/useComponentIcons';
|
|
6
|
+
import type { IconProps } from '../types';
|
|
6
7
|
import type { ComponentConfig } from '../types/tv';
|
|
7
8
|
type InputTime = ComponentConfig<typeof theme, AppConfig, 'inputTime'>;
|
|
8
|
-
|
|
9
|
+
type InputTimeDefaultValue<R extends boolean = false> = R extends true ? TimeRangeFieldRootProps['defaultValue'] : TimeFieldRootProps['defaultValue'];
|
|
10
|
+
type InputTimeModelValue<R extends boolean = false> = (R extends true ? TimeRangeFieldRootProps['modelValue'] : TimeFieldRootProps['modelValue']) | undefined;
|
|
11
|
+
type _TimeFieldRootProps = Omit<TimeFieldRootProps, 'as' | 'asChild' | 'modelValue' | 'defaultValue' | 'dir' | 'locale'>;
|
|
12
|
+
type _TimeRangeFieldRootProps = Omit<TimeRangeFieldRootProps, 'as' | 'asChild' | 'modelValue' | 'defaultValue' | 'dir' | 'locale'>;
|
|
13
|
+
export interface InputTimeProps<R extends boolean = false> extends UseComponentIconsProps, _TimeFieldRootProps, _TimeRangeFieldRootProps {
|
|
9
14
|
/**
|
|
10
15
|
* The element or component this component should render as.
|
|
11
16
|
* @defaultValue 'div'
|
|
@@ -29,13 +34,29 @@ export interface InputTimeProps extends Omit<TimeFieldRootProps, 'as' | 'asChild
|
|
|
29
34
|
fixed?: boolean;
|
|
30
35
|
autofocus?: boolean;
|
|
31
36
|
autofocusDelay?: number;
|
|
37
|
+
/**
|
|
38
|
+
* The icon to use as a range separator.
|
|
39
|
+
* @defaultValue appConfig.ui.icons.minus
|
|
40
|
+
* @IconifyIcon
|
|
41
|
+
*/
|
|
42
|
+
separatorIcon?: IconProps['name'];
|
|
43
|
+
/**
|
|
44
|
+
* Enable time range selection.
|
|
45
|
+
* @defaultValue false
|
|
46
|
+
*/
|
|
47
|
+
range?: R & boolean;
|
|
48
|
+
/** The value of the input when initially rendered. Use when you do not need to control the state of the input. */
|
|
49
|
+
defaultValue?: InputTimeDefaultValue<R>;
|
|
50
|
+
/** The controlled value of the input. Can be bind as `v-model`. */
|
|
51
|
+
modelValue?: InputTimeModelValue<R>;
|
|
32
52
|
class?: any;
|
|
33
53
|
ui?: InputTime['slots'];
|
|
34
54
|
}
|
|
35
|
-
export interface InputTimeEmits extends TimeFieldRootEmits {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
export interface InputTimeEmits<R extends boolean = false> extends Omit<TimeFieldRootEmits & TimeRangeFieldRootEmits, 'update:modelValue'> {
|
|
56
|
+
'update:modelValue': [value: InputTimeModelValue<R>];
|
|
57
|
+
'change': [event: Event];
|
|
58
|
+
'blur': [event: FocusEvent];
|
|
59
|
+
'focus': [event: FocusEvent];
|
|
39
60
|
}
|
|
40
61
|
export interface InputTimeSlots {
|
|
41
62
|
leading?(props: {
|
|
@@ -47,28 +68,33 @@ export interface InputTimeSlots {
|
|
|
47
68
|
trailing?(props: {
|
|
48
69
|
ui: InputTime['ui'];
|
|
49
70
|
}): VNode[];
|
|
71
|
+
separator?(props: {
|
|
72
|
+
ui: InputTime['ui'];
|
|
73
|
+
}): VNode[];
|
|
50
74
|
}
|
|
51
75
|
declare const _default: typeof __VLS_export;
|
|
52
76
|
export default _default;
|
|
53
|
-
declare const __VLS_export:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
new (): {
|
|
72
|
-
$slots: S;
|
|
73
|
-
};
|
|
77
|
+
declare const __VLS_export: <R extends boolean>(__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<{
|
|
78
|
+
props: import("vue").PublicProps & __VLS_PrettifyLocal<InputTimeProps<R> & {
|
|
79
|
+
onBlur?: ((event: FocusEvent) => any) | undefined;
|
|
80
|
+
onChange?: ((event: Event) => any) | undefined;
|
|
81
|
+
onFocus?: ((event: FocusEvent) => any) | undefined;
|
|
82
|
+
"onUpdate:modelValue"?: ((value: InputTimeModelValue<R>) => any) | undefined;
|
|
83
|
+
"onUpdate:placeholder"?: ((...args: TimeValue[]) => any) | undefined;
|
|
84
|
+
}> & (typeof globalThis extends {
|
|
85
|
+
__VLS_PROPS_FALLBACK: infer P;
|
|
86
|
+
} ? P : {});
|
|
87
|
+
expose: (exposed: import("vue").ShallowUnwrapRef<{
|
|
88
|
+
inputsRef: import("vue").Ref<ComponentPublicInstance[], ComponentPublicInstance[]>;
|
|
89
|
+
}>) => void;
|
|
90
|
+
attrs: any;
|
|
91
|
+
slots: InputTimeSlots;
|
|
92
|
+
emit: ((evt: "blur", event: FocusEvent) => void) & ((evt: "change", event: Event) => void) & ((evt: "focus", event: FocusEvent) => void) & ((evt: "update:modelValue", value: InputTimeModelValue<R>) => void) & ((evt: "update:placeholder", ...args: [date: TimeValue] & [date: TimeValue]) => void);
|
|
93
|
+
}>) => import("vue").VNode & {
|
|
94
|
+
__ctx?: Awaited<typeof __VLS_setup>;
|
|
74
95
|
};
|
|
96
|
+
type __VLS_PrettifyLocal<T> = (T extends any ? {
|
|
97
|
+
[K in keyof T]: T[K];
|
|
98
|
+
} : {
|
|
99
|
+
[K in keyof T as K]: T[K];
|
|
100
|
+
}) & {};
|
|
@@ -4,8 +4,9 @@ import theme from "#build/ui/input-time";
|
|
|
4
4
|
|
|
5
5
|
<script setup>
|
|
6
6
|
import { computed, onMounted, ref } from "vue";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { TimeRangeFieldRoot, TimeRangeFieldInput, useForwardPropsEmits } from "reka-ui";
|
|
8
|
+
import { TimeField as SingleTimeField } from "reka-ui/namespaced";
|
|
9
|
+
import { reactiveOmit, createReusableTemplate } from "@vueuse/core";
|
|
9
10
|
import { useAppConfig } from "#imports";
|
|
10
11
|
import { useComponentUI } from "../composables/useComponentUI";
|
|
11
12
|
import { useFieldGroup } from "../composables/useFieldGroup";
|
|
@@ -14,6 +15,7 @@ import { useFormField } from "../composables/useFormField";
|
|
|
14
15
|
import { tv } from "../utils/tv";
|
|
15
16
|
import UIcon from "./Icon.vue";
|
|
16
17
|
import UAvatar from "./Avatar.vue";
|
|
18
|
+
defineOptions({ inheritAttrs: false });
|
|
17
19
|
const props = defineProps({
|
|
18
20
|
as: { type: null, required: false },
|
|
19
21
|
color: { type: null, required: false },
|
|
@@ -23,12 +25,22 @@ const props = defineProps({
|
|
|
23
25
|
fixed: { type: Boolean, required: false },
|
|
24
26
|
autofocus: { type: Boolean, required: false },
|
|
25
27
|
autofocusDelay: { type: Number, required: false, default: 0 },
|
|
28
|
+
separatorIcon: { type: null, required: false },
|
|
29
|
+
range: { type: Boolean, required: false },
|
|
30
|
+
defaultValue: { type: null, required: false },
|
|
31
|
+
modelValue: { type: null, required: false },
|
|
26
32
|
class: { type: null, required: false },
|
|
27
33
|
ui: { type: Object, required: false },
|
|
28
|
-
|
|
34
|
+
icon: { type: null, required: false },
|
|
35
|
+
avatar: { type: Object, required: false },
|
|
36
|
+
leading: { type: Boolean, required: false },
|
|
37
|
+
leadingIcon: { type: null, required: false },
|
|
38
|
+
trailing: { type: Boolean, required: false },
|
|
39
|
+
trailingIcon: { type: null, required: false },
|
|
40
|
+
loading: { type: Boolean, required: false },
|
|
41
|
+
loadingIcon: { type: null, required: false },
|
|
29
42
|
defaultPlaceholder: { type: Object, required: false },
|
|
30
43
|
placeholder: { type: Object, required: false },
|
|
31
|
-
modelValue: { type: [Object, null], required: false },
|
|
32
44
|
hourCycle: { type: null, required: false },
|
|
33
45
|
step: { type: Object, required: false },
|
|
34
46
|
stepSnapping: { type: Boolean, required: false },
|
|
@@ -41,20 +53,13 @@ const props = defineProps({
|
|
|
41
53
|
id: { type: String, required: false },
|
|
42
54
|
name: { type: String, required: false },
|
|
43
55
|
required: { type: Boolean, required: false },
|
|
44
|
-
|
|
45
|
-
avatar: { type: Object, required: false },
|
|
46
|
-
leading: { type: Boolean, required: false },
|
|
47
|
-
leadingIcon: { type: null, required: false },
|
|
48
|
-
trailing: { type: Boolean, required: false },
|
|
49
|
-
trailingIcon: { type: null, required: false },
|
|
50
|
-
loading: { type: Boolean, required: false },
|
|
51
|
-
loadingIcon: { type: null, required: false }
|
|
56
|
+
isTimeUnavailable: { type: Function, required: false }
|
|
52
57
|
});
|
|
53
|
-
const emits = defineEmits(["
|
|
58
|
+
const emits = defineEmits(["update:modelValue", "change", "blur", "focus", "update:placeholder"]);
|
|
54
59
|
const slots = defineSlots();
|
|
55
60
|
const appConfig = useAppConfig();
|
|
56
61
|
const uiProp = useComponentUI("inputTime", props);
|
|
57
|
-
const rootProps = useForwardPropsEmits(reactiveOmit(props, "id", "name", "color", "variant", "size", "highlight", "fixed", "disabled", "autofocus", "autofocusDelay", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "class", "ui"), emits);
|
|
62
|
+
const rootProps = useForwardPropsEmits(reactiveOmit(props, "id", "name", "range", "modelValue", "defaultValue", "color", "variant", "size", "highlight", "fixed", "disabled", "autofocus", "autofocusDelay", "icon", "avatar", "leading", "leadingIcon", "trailing", "trailingIcon", "loading", "loadingIcon", "separatorIcon", "class", "ui"), emits);
|
|
58
63
|
const { emitFormBlur, emitFormFocus, emitFormChange, emitFormInput, id, color, size: formGroupSize, name, highlight, disabled, ariaAttrs } = useFormField(props);
|
|
59
64
|
const { orientation, size: fieldGroupSize } = useFieldGroup(props);
|
|
60
65
|
const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(props);
|
|
@@ -70,7 +75,10 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.inputTime ||
|
|
|
70
75
|
trailing: isTrailing.value || !!slots.trailing,
|
|
71
76
|
fieldGroup: orientation.value
|
|
72
77
|
}));
|
|
78
|
+
const [DefineSegmentsTemplate, ReuseSegmentsTemplate] = createReusableTemplate();
|
|
73
79
|
const inputsRef = ref([]);
|
|
80
|
+
const RangeTimeField = { Root: TimeRangeFieldRoot, Input: TimeRangeFieldInput };
|
|
81
|
+
const TimeField = computed(() => props.range ? RangeTimeField : SingleTimeField);
|
|
74
82
|
function setInputRef(index, el) {
|
|
75
83
|
inputsRef.value[index] = el;
|
|
76
84
|
}
|
|
@@ -104,28 +112,45 @@ defineExpose({
|
|
|
104
112
|
</script>
|
|
105
113
|
|
|
106
114
|
<template>
|
|
107
|
-
<
|
|
108
|
-
|
|
115
|
+
<DefineSegmentsTemplate v-slot="{ segments, type }">
|
|
116
|
+
<TimeField.Input
|
|
117
|
+
v-for="(segment, index) in segments"
|
|
118
|
+
:key="`${segment.part}-${index}`"
|
|
119
|
+
:ref="(el) => setInputRef(index, el)"
|
|
120
|
+
:type="type"
|
|
121
|
+
:part="segment.part"
|
|
122
|
+
data-slot="segment"
|
|
123
|
+
:class="ui.segment({ class: uiProp?.segment })"
|
|
124
|
+
:data-segment="segment.part"
|
|
125
|
+
>
|
|
126
|
+
{{ segment.value.trim() }}
|
|
127
|
+
</TimeField.Input>
|
|
128
|
+
</DefineSegmentsTemplate>
|
|
129
|
+
|
|
130
|
+
<TimeField.Root
|
|
131
|
+
v-bind="{ ...rootProps, ...$attrs, ...ariaAttrs }"
|
|
109
132
|
:id="id"
|
|
110
133
|
v-slot="{ segments }"
|
|
111
134
|
:name="name"
|
|
112
135
|
:disabled="disabled"
|
|
136
|
+
:model-value="modelValue"
|
|
137
|
+
:default-value="defaultValue"
|
|
113
138
|
data-slot="base"
|
|
114
139
|
:class="ui.base({ class: [uiProp?.base, props.class] })"
|
|
115
140
|
@update:model-value="onUpdate"
|
|
116
141
|
@blur="onBlur"
|
|
117
142
|
@focus="onFocus"
|
|
118
143
|
>
|
|
119
|
-
<
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
</
|
|
144
|
+
<template v-if="Array.isArray(segments)">
|
|
145
|
+
<ReuseSegmentsTemplate :segments="segments" />
|
|
146
|
+
</template>
|
|
147
|
+
<template v-else>
|
|
148
|
+
<ReuseSegmentsTemplate :segments="segments.start" type="start" />
|
|
149
|
+
<slot name="separator" :ui="ui">
|
|
150
|
+
<UIcon :name="separatorIcon || appConfig.ui.icons.minus" data-slot="separatorIcon" :class="ui.separatorIcon({ class: uiProp?.separatorIcon })" />
|
|
151
|
+
</slot>
|
|
152
|
+
<ReuseSegmentsTemplate :segments="segments.end" type="end" />
|
|
153
|
+
</template>
|
|
129
154
|
|
|
130
155
|
<slot :ui="ui" />
|
|
131
156
|
|
|
@@ -141,5 +166,5 @@ defineExpose({
|
|
|
141
166
|
<UIcon v-if="trailingIconName" :name="trailingIconName" data-slot="trailingIcon" :class="ui.trailingIcon({ class: uiProp?.trailingIcon })" />
|
|
142
167
|
</slot>
|
|
143
168
|
</span>
|
|
144
|
-
</
|
|
169
|
+
</TimeField.Root>
|
|
145
170
|
</template>
|