vuetify 3.10.5 → 3.10.7
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 +0 -6
- package/dist/json/attributes.json +3488 -3512
- package/dist/json/importMap-labs.json +20 -20
- package/dist/json/importMap.json +176 -176
- package/dist/json/tags.json +3 -9
- package/dist/json/web-types.json +6467 -6520
- package/dist/vuetify-labs.cjs +190 -82
- package/dist/vuetify-labs.css +4945 -4895
- package/dist/vuetify-labs.d.ts +117 -172
- package/dist/vuetify-labs.esm.js +190 -82
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +190 -82
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +171 -72
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +3926 -3898
- package/dist/vuetify.d.ts +117 -137
- package/dist/vuetify.esm.js +171 -72
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +171 -72
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +118 -107
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VAutocomplete/VAutocomplete.d.ts +0 -61
- package/lib/components/VAutocomplete/VAutocomplete.js +15 -12
- package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/lib/components/VChipGroup/VChipGroup.d.ts +37 -0
- package/lib/components/VChipGroup/VChipGroup.js +3 -1
- package/lib/components/VChipGroup/VChipGroup.js.map +1 -1
- package/lib/components/VCombobox/VCombobox.d.ts +6 -67
- package/lib/components/VCombobox/VCombobox.js +29 -30
- package/lib/components/VCombobox/VCombobox.js.map +1 -1
- package/lib/components/VCounter/VCounter.css +1 -0
- package/lib/components/VCounter/VCounter.sass +1 -0
- package/lib/components/VDatePicker/VDatePicker.js +1 -1
- package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
- package/lib/components/VFileInput/VFileInput.js +3 -2
- package/lib/components/VFileInput/VFileInput.js.map +1 -1
- package/lib/components/VList/VListItem.css +14 -12
- package/lib/components/VList/VListItem.js +4 -2
- package/lib/components/VList/VListItem.js.map +1 -1
- package/lib/components/VList/VListItem.sass +20 -18
- package/lib/components/VMenu/VMenu.js +22 -4
- package/lib/components/VMenu/VMenu.js.map +1 -1
- package/lib/components/VNumberInput/VNumberInput.css +8 -0
- package/lib/components/VNumberInput/VNumberInput.js +5 -2
- package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
- package/lib/components/VNumberInput/VNumberInput.sass +10 -4
- package/lib/components/VSelect/VSelect.js +2 -1
- package/lib/components/VSelect/VSelect.js.map +1 -1
- package/lib/components/VSkeletonLoader/VSkeletonLoader.css +17 -0
- package/lib/components/VSkeletonLoader/VSkeletonLoader.js +3 -3
- package/lib/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
- package/lib/components/VSkeletonLoader/VSkeletonLoader.sass +7 -0
- package/lib/components/VSlideGroup/VSlideGroup.d.ts +25 -0
- package/lib/components/VSlideGroup/VSlideGroup.js +5 -1
- package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
- package/lib/components/VTabs/VTabs.d.ts +25 -0
- package/lib/components/VTextField/VTextField.js +3 -5
- package/lib/components/VTextField/VTextField.js.map +1 -1
- package/lib/components/VTextarea/VTextarea.css +2 -2
- package/lib/components/VTextarea/VTextarea.d.ts +3 -3
- package/lib/components/VTextarea/VTextarea.js +23 -3
- package/lib/components/VTextarea/VTextarea.js.map +1 -1
- package/lib/components/VTextarea/VTextarea.sass +4 -2
- package/lib/components/VWindow/VWindow.js +39 -3
- package/lib/components/VWindow/VWindow.js.map +1 -1
- package/lib/composables/date/date.js +1 -1
- package/lib/composables/date/date.js.map +1 -1
- package/lib/composables/group.js +1 -1
- package/lib/composables/group.js.map +1 -1
- package/lib/composables/nested/nested.js +12 -2
- package/lib/composables/nested/nested.js.map +1 -1
- package/lib/composables/virtual.js +2 -2
- package/lib/composables/virtual.js.map +1 -1
- package/lib/entry-bundler.js +1 -1
- package/lib/framework.d.ts +60 -60
- package/lib/framework.js +1 -1
- package/lib/labs/VColorInput/VColorInput.d.ts +0 -40
- package/lib/labs/VColorInput/VColorInput.js +2 -2
- package/lib/labs/VColorInput/VColorInput.js.map +1 -1
- package/lib/labs/VDateInput/VDateInput.d.ts +0 -30
- package/lib/labs/VDateInput/VDateInput.js +16 -7
- package/lib/labs/VDateInput/VDateInput.js.map +1 -1
- package/lib/labs/VIconBtn/VIconBtn.css +22 -0
- package/lib/labs/VIconBtn/VIconBtn.scss +32 -0
- package/lib/labs/VMaskInput/VMaskInput.js +1 -1
- package/lib/labs/VMaskInput/VMaskInput.js.map +1 -1
- package/lib/labs/rules/rules.js +1 -1
- package/lib/labs/rules/rules.js.map +1 -1
- package/lib/util/helpers.js +4 -2
- package/lib/util/helpers.js.map +1 -1
- package/package.json +1 -1
package/dist/vuetify.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Vuetify v3.10.
|
|
2
|
+
* Vuetify v3.10.7
|
|
3
3
|
* Forged by John Leider
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
@@ -401,8 +401,10 @@
|
|
|
401
401
|
}
|
|
402
402
|
function focusableChildren(el) {
|
|
403
403
|
let filterByTabIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
404
|
-
const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled])`).join(', ');
|
|
405
|
-
return [...el.querySelectorAll(targets)]
|
|
404
|
+
const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', 'details:not(:has(> summary))', 'details > summary', '[tabindex]', '[contenteditable]:not([contenteditable="false"])', 'audio[controls]', 'video[controls]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled], [inert])`).join(', ');
|
|
405
|
+
return [...el.querySelectorAll(targets)].filter(x => !x.closest('[inert]')) // does not have inert parent
|
|
406
|
+
.filter(x => !!x.offsetParent || x.getClientRects().length > 0) // is rendered
|
|
407
|
+
.filter(x => !x.parentElement?.closest('details:not([open])') || x.tagName === 'SUMMARY' && x.parentElement?.tagName === 'DETAILS');
|
|
406
408
|
}
|
|
407
409
|
function getNextElement(elements, location, condition) {
|
|
408
410
|
let _el;
|
|
@@ -5023,7 +5025,7 @@
|
|
|
5023
5025
|
function unregister() {
|
|
5024
5026
|
group?.unregister(id);
|
|
5025
5027
|
}
|
|
5026
|
-
|
|
5028
|
+
register();
|
|
5027
5029
|
vue.onBeforeUnmount(() => unregister());
|
|
5028
5030
|
const isSelected = vue.computed(() => {
|
|
5029
5031
|
return group.isSelected(id);
|
|
@@ -8343,6 +8345,10 @@
|
|
|
8343
8345
|
const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
|
|
8344
8346
|
const makeVSlideGroupProps = propsFactory({
|
|
8345
8347
|
centerActive: Boolean,
|
|
8348
|
+
scrollToActive: {
|
|
8349
|
+
type: Boolean,
|
|
8350
|
+
default: true
|
|
8351
|
+
},
|
|
8346
8352
|
contentClass: null,
|
|
8347
8353
|
direction: {
|
|
8348
8354
|
type: String,
|
|
@@ -8431,7 +8437,7 @@
|
|
|
8431
8437
|
contentSize.value = contentRect.value[sizeProperty];
|
|
8432
8438
|
isOverflowing.value = containerSize.value + 1 < contentSize.value;
|
|
8433
8439
|
}
|
|
8434
|
-
if (firstSelectedIndex.value >= 0 && contentRef.el) {
|
|
8440
|
+
if (props.scrollToActive && firstSelectedIndex.value >= 0 && contentRef.el) {
|
|
8435
8441
|
// TODO: Is this too naive? Should we store element references in group composable?
|
|
8436
8442
|
const selectedElement = contentRef.el.children[lastSelectedIndex.value];
|
|
8437
8443
|
scrollToChildren(selectedElement, props.centerActive);
|
|
@@ -8700,7 +8706,9 @@
|
|
|
8700
8706
|
type: Function,
|
|
8701
8707
|
default: deepEqual
|
|
8702
8708
|
},
|
|
8703
|
-
...makeVSlideGroupProps(
|
|
8709
|
+
...makeVSlideGroupProps({
|
|
8710
|
+
scrollToActive: false
|
|
8711
|
+
}),
|
|
8704
8712
|
...makeComponentProps(),
|
|
8705
8713
|
...makeGroupProps({
|
|
8706
8714
|
selectedClass: 'v-chip--selected'
|
|
@@ -9799,7 +9807,9 @@
|
|
|
9799
9807
|
};
|
|
9800
9808
|
vue.onBeforeMount(() => {
|
|
9801
9809
|
if (!parent.isGroupActivator) {
|
|
9802
|
-
|
|
9810
|
+
vue.nextTick(() => {
|
|
9811
|
+
parent.root.register(computedId.value, parent.id.value, vue.toValue(isDisabled), isGroup);
|
|
9812
|
+
});
|
|
9803
9813
|
}
|
|
9804
9814
|
});
|
|
9805
9815
|
vue.onBeforeUnmount(() => {
|
|
@@ -9807,6 +9817,14 @@
|
|
|
9807
9817
|
parent.root.unregister(computedId.value);
|
|
9808
9818
|
}
|
|
9809
9819
|
});
|
|
9820
|
+
vue.watch(computedId, (val, oldVal) => {
|
|
9821
|
+
if (!parent.isGroupActivator) {
|
|
9822
|
+
parent.root.unregister(oldVal);
|
|
9823
|
+
vue.nextTick(() => {
|
|
9824
|
+
parent.root.register(val, parent.id.value, vue.toValue(isDisabled), isGroup);
|
|
9825
|
+
});
|
|
9826
|
+
}
|
|
9827
|
+
});
|
|
9810
9828
|
isGroup && vue.provide(VNestedSymbol, item);
|
|
9811
9829
|
return item;
|
|
9812
9830
|
};
|
|
@@ -10057,7 +10075,9 @@
|
|
|
10057
10075
|
handleActiveLink();
|
|
10058
10076
|
});
|
|
10059
10077
|
vue.onBeforeMount(() => {
|
|
10060
|
-
if (link.isActive?.value)
|
|
10078
|
+
if (link.isActive?.value) {
|
|
10079
|
+
vue.nextTick(() => handleActiveLink());
|
|
10080
|
+
}
|
|
10061
10081
|
});
|
|
10062
10082
|
function handleActiveLink() {
|
|
10063
10083
|
if (parent.value != null) {
|
|
@@ -12305,25 +12325,41 @@
|
|
|
12305
12325
|
document.removeEventListener('focusin', onFocusIn);
|
|
12306
12326
|
});
|
|
12307
12327
|
vue.onDeactivated(() => isActive.value = false);
|
|
12328
|
+
let focusTrapSuppressed = false;
|
|
12329
|
+
let focusTrapSuppressionTimeout = -1;
|
|
12330
|
+
async function onPointerdown() {
|
|
12331
|
+
focusTrapSuppressed = true;
|
|
12332
|
+
focusTrapSuppressionTimeout = window.setTimeout(() => {
|
|
12333
|
+
focusTrapSuppressed = false;
|
|
12334
|
+
}, 100);
|
|
12335
|
+
}
|
|
12308
12336
|
async function onFocusIn(e) {
|
|
12309
12337
|
const before = e.relatedTarget;
|
|
12310
12338
|
const after = e.target;
|
|
12311
12339
|
await vue.nextTick();
|
|
12312
12340
|
if (isActive.value && before !== after && overlay.value?.contentEl &&
|
|
12313
|
-
// We're the
|
|
12314
|
-
overlay.value?.
|
|
12341
|
+
// We're the menu without open submenus or overlays
|
|
12342
|
+
overlay.value?.localTop &&
|
|
12315
12343
|
// It isn't the document or the menu body
|
|
12316
12344
|
![document, overlay.value.contentEl].includes(after) &&
|
|
12317
12345
|
// It isn't inside the menu body
|
|
12318
12346
|
!overlay.value.contentEl.contains(after)) {
|
|
12319
|
-
|
|
12320
|
-
|
|
12347
|
+
if (focusTrapSuppressed) {
|
|
12348
|
+
if (!props.openOnHover && !overlay.value.activatorEl?.contains(after)) {
|
|
12349
|
+
isActive.value = false;
|
|
12350
|
+
}
|
|
12351
|
+
} else {
|
|
12352
|
+
const focusable = focusableChildren(overlay.value.contentEl);
|
|
12353
|
+
focusable[0]?.focus();
|
|
12354
|
+
document.removeEventListener('pointerdown', onPointerdown);
|
|
12355
|
+
}
|
|
12321
12356
|
}
|
|
12322
12357
|
}
|
|
12323
12358
|
vue.watch(isActive, val => {
|
|
12324
12359
|
if (val) {
|
|
12325
12360
|
parent?.register();
|
|
12326
12361
|
if (IN_BROWSER && !props.disableInitialFocus) {
|
|
12362
|
+
document.addEventListener('pointerdown', onPointerdown);
|
|
12327
12363
|
document.addEventListener('focusin', onFocusIn, {
|
|
12328
12364
|
once: true
|
|
12329
12365
|
});
|
|
@@ -12331,6 +12367,8 @@
|
|
|
12331
12367
|
} else {
|
|
12332
12368
|
parent?.unregister();
|
|
12333
12369
|
if (IN_BROWSER) {
|
|
12370
|
+
clearTimeout(focusTrapSuppressionTimeout);
|
|
12371
|
+
document.removeEventListener('pointerdown', onPointerdown);
|
|
12334
12372
|
document.removeEventListener('focusin', onFocusIn);
|
|
12335
12373
|
}
|
|
12336
12374
|
}
|
|
@@ -12924,7 +12962,6 @@
|
|
|
12924
12962
|
e.stopPropagation();
|
|
12925
12963
|
onFocus();
|
|
12926
12964
|
vue.nextTick(() => {
|
|
12927
|
-
model.value = null;
|
|
12928
12965
|
reset();
|
|
12929
12966
|
callEvent(props['onClick:clear'], e);
|
|
12930
12967
|
});
|
|
@@ -12979,8 +13016,6 @@
|
|
|
12979
13016
|
"onMousedown": onControlMousedown,
|
|
12980
13017
|
"onClick": onControlClick,
|
|
12981
13018
|
"onClick:clear": e => onClear(e, reset),
|
|
12982
|
-
"onClick:prependInner": props['onClick:prependInner'],
|
|
12983
|
-
"onClick:appendInner": props['onClick:appendInner'],
|
|
12984
13019
|
"role": props.role
|
|
12985
13020
|
}, omit(fieldProps, ['onClick:clear']), {
|
|
12986
13021
|
"id": id.value,
|
|
@@ -12997,10 +13032,11 @@
|
|
|
12997
13032
|
props: {
|
|
12998
13033
|
class: fieldClass,
|
|
12999
13034
|
...slotProps
|
|
13000
|
-
}
|
|
13035
|
+
},
|
|
13036
|
+
controlRef
|
|
13001
13037
|
} = _ref3;
|
|
13002
13038
|
const inputNode = vue.withDirectives(vue.createElementVNode("input", vue.mergeProps({
|
|
13003
|
-
"ref": inputRef,
|
|
13039
|
+
"ref": val => inputRef.value = controlRef.value = val,
|
|
13004
13040
|
"value": model.value,
|
|
13005
13041
|
"onInput": onInput,
|
|
13006
13042
|
"autofocus": props.autofocus,
|
|
@@ -13156,7 +13192,7 @@
|
|
|
13156
13192
|
const start = performance.now();
|
|
13157
13193
|
offsets[0] = 0;
|
|
13158
13194
|
const length = items.value.length;
|
|
13159
|
-
for (let i = 1; i <= length
|
|
13195
|
+
for (let i = 1; i <= length; i++) {
|
|
13160
13196
|
offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
|
|
13161
13197
|
}
|
|
13162
13198
|
updateTime.value = Math.max(updateTime.value, performance.now() - start);
|
|
@@ -13191,7 +13227,7 @@
|
|
|
13191
13227
|
}
|
|
13192
13228
|
}
|
|
13193
13229
|
function calculateOffset(index) {
|
|
13194
|
-
index = clamp(index, 0, items.value.length
|
|
13230
|
+
index = clamp(index, 0, items.value.length);
|
|
13195
13231
|
const whole = Math.floor(index);
|
|
13196
13232
|
const fraction = index % 1;
|
|
13197
13233
|
const next = whole + 1;
|
|
@@ -13924,7 +13960,8 @@
|
|
|
13924
13960
|
"key": item.value,
|
|
13925
13961
|
"modelValue": isSelected,
|
|
13926
13962
|
"ripple": false,
|
|
13927
|
-
"tabindex": "-1"
|
|
13963
|
+
"tabindex": "-1",
|
|
13964
|
+
"onClick": event => event.preventDefault()
|
|
13928
13965
|
}, null) : undefined, camelizedProps.prependAvatar && vue.createVNode(VAvatar, {
|
|
13929
13966
|
"image": camelizedProps.prependAvatar
|
|
13930
13967
|
}, null), camelizedProps.prependIcon && vue.createVNode(VIcon, {
|
|
@@ -14196,10 +14233,7 @@
|
|
|
14196
14233
|
...omit(makeVTextFieldProps({
|
|
14197
14234
|
modelValue: null,
|
|
14198
14235
|
role: 'combobox'
|
|
14199
|
-
}), ['validationValue', 'dirty', 'appendInnerIcon'])
|
|
14200
|
-
...makeTransitionProps({
|
|
14201
|
-
transition: false
|
|
14202
|
-
})
|
|
14236
|
+
}), ['validationValue', 'dirty', 'appendInnerIcon'])
|
|
14203
14237
|
}, 'VAutocomplete');
|
|
14204
14238
|
const VAutocomplete = genericComponent()({
|
|
14205
14239
|
name: 'VAutocomplete',
|
|
@@ -14224,6 +14258,7 @@
|
|
|
14224
14258
|
const vMenuRef = vue.ref();
|
|
14225
14259
|
const vVirtualScrollRef = vue.ref();
|
|
14226
14260
|
const selectionIndex = vue.shallowRef(-1);
|
|
14261
|
+
const _searchLock = vue.shallowRef(null);
|
|
14227
14262
|
const {
|
|
14228
14263
|
items,
|
|
14229
14264
|
transformIn,
|
|
@@ -14245,9 +14280,9 @@
|
|
|
14245
14280
|
const {
|
|
14246
14281
|
filteredItems,
|
|
14247
14282
|
getMatches
|
|
14248
|
-
} = useFilter(props, items, () => isPristine.value ? '' : search.value);
|
|
14283
|
+
} = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
|
|
14249
14284
|
const displayItems = vue.computed(() => {
|
|
14250
|
-
if (props.hideSelected) {
|
|
14285
|
+
if (props.hideSelected && _searchLock.value === null) {
|
|
14251
14286
|
return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
|
|
14252
14287
|
}
|
|
14253
14288
|
return filteredItems.value;
|
|
@@ -14378,6 +14413,7 @@
|
|
|
14378
14413
|
isPristine.value = true;
|
|
14379
14414
|
vTextFieldRef.value?.focus();
|
|
14380
14415
|
}
|
|
14416
|
+
_searchLock.value = null;
|
|
14381
14417
|
}
|
|
14382
14418
|
function onFocusin(e) {
|
|
14383
14419
|
isFocused.value = true;
|
|
@@ -14413,6 +14449,7 @@
|
|
|
14413
14449
|
} else {
|
|
14414
14450
|
const add = set !== false;
|
|
14415
14451
|
model.value = add ? [item] : [];
|
|
14452
|
+
_searchLock.value = isPristine.value ? '' : search.value ?? '';
|
|
14416
14453
|
search.value = add && !hasSelectionSlot.value ? item.title : '';
|
|
14417
14454
|
|
|
14418
14455
|
// watch for search watcher to trigger
|
|
@@ -14432,6 +14469,9 @@
|
|
|
14432
14469
|
} else {
|
|
14433
14470
|
if (!props.multiple && search.value == null) model.value = [];
|
|
14434
14471
|
menu.value = false;
|
|
14472
|
+
if (!isPristine.value && search.value) {
|
|
14473
|
+
_searchLock.value = search.value;
|
|
14474
|
+
}
|
|
14435
14475
|
search.value = '';
|
|
14436
14476
|
selectionIndex.value = -1;
|
|
14437
14477
|
}
|
|
@@ -14441,13 +14481,14 @@
|
|
|
14441
14481
|
if (val) menu.value = true;
|
|
14442
14482
|
isPristine.value = !val;
|
|
14443
14483
|
});
|
|
14444
|
-
vue.watch(menu,
|
|
14445
|
-
if (!props.hideSelected &&
|
|
14484
|
+
vue.watch(menu, val => {
|
|
14485
|
+
if (!props.hideSelected && val && model.value.length && isPristine.value) {
|
|
14446
14486
|
const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
|
|
14447
14487
|
IN_BROWSER && window.requestAnimationFrame(() => {
|
|
14448
14488
|
index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
|
|
14449
14489
|
});
|
|
14450
14490
|
}
|
|
14491
|
+
if (val) _searchLock.value = null;
|
|
14451
14492
|
});
|
|
14452
14493
|
vue.watch(items, (newVal, oldVal) => {
|
|
14453
14494
|
if (menu.value) return;
|
|
@@ -14498,7 +14539,6 @@
|
|
|
14498
14539
|
"maxHeight": 310,
|
|
14499
14540
|
"openOnClick": false,
|
|
14500
14541
|
"closeOnContentClick": false,
|
|
14501
|
-
"transition": props.transition,
|
|
14502
14542
|
"onAfterEnter": onAfterEnter,
|
|
14503
14543
|
"onAfterLeave": onAfterLeave
|
|
14504
14544
|
}, props.menuProps), {
|
|
@@ -14568,7 +14608,8 @@
|
|
|
14568
14608
|
"key": item.value,
|
|
14569
14609
|
"modelValue": isSelected,
|
|
14570
14610
|
"ripple": false,
|
|
14571
|
-
"tabindex": "-1"
|
|
14611
|
+
"tabindex": "-1",
|
|
14612
|
+
"onClick": event => event.preventDefault()
|
|
14572
14613
|
}, null) : undefined, item.props.prependAvatar && vue.createVNode(VAvatar, {
|
|
14573
14614
|
"image": item.props.prependAvatar
|
|
14574
14615
|
}, null), item.props.prependIcon && vue.createVNode(VIcon, {
|
|
@@ -15926,7 +15967,19 @@
|
|
|
15926
15967
|
const activeIndex = vue.computed(() => {
|
|
15927
15968
|
return group.items.value.findIndex(item => group.selected.value.includes(item.id));
|
|
15928
15969
|
});
|
|
15970
|
+
|
|
15971
|
+
// Fix for https://github.com/vuetifyjs/vuetify/issues/18447
|
|
15929
15972
|
vue.watch(activeIndex, (newVal, oldVal) => {
|
|
15973
|
+
let scrollableParent;
|
|
15974
|
+
const savedScrollPosition = {
|
|
15975
|
+
left: 0,
|
|
15976
|
+
top: 0
|
|
15977
|
+
};
|
|
15978
|
+
if (IN_BROWSER && oldVal >= 0) {
|
|
15979
|
+
scrollableParent = getScrollParent(rootRef.value);
|
|
15980
|
+
savedScrollPosition.left = scrollableParent?.scrollLeft;
|
|
15981
|
+
savedScrollPosition.top = scrollableParent?.scrollTop;
|
|
15982
|
+
}
|
|
15930
15983
|
const itemsLength = group.items.value.length;
|
|
15931
15984
|
const lastIndex = itemsLength - 1;
|
|
15932
15985
|
if (itemsLength <= 2) {
|
|
@@ -15938,7 +15991,30 @@
|
|
|
15938
15991
|
} else {
|
|
15939
15992
|
isReversed.value = newVal < oldVal;
|
|
15940
15993
|
}
|
|
15941
|
-
|
|
15994
|
+
vue.nextTick(() => {
|
|
15995
|
+
if (!IN_BROWSER || !scrollableParent) return;
|
|
15996
|
+
const currentScrollY = scrollableParent.scrollTop;
|
|
15997
|
+
if (currentScrollY !== savedScrollPosition.top) {
|
|
15998
|
+
scrollableParent.scrollTo({
|
|
15999
|
+
...savedScrollPosition,
|
|
16000
|
+
behavior: 'instant'
|
|
16001
|
+
});
|
|
16002
|
+
}
|
|
16003
|
+
requestAnimationFrame(() => {
|
|
16004
|
+
if (!scrollableParent) return;
|
|
16005
|
+
const rafScrollY = scrollableParent.scrollTop;
|
|
16006
|
+
if (rafScrollY !== savedScrollPosition.top) {
|
|
16007
|
+
scrollableParent.scrollTo({
|
|
16008
|
+
...savedScrollPosition,
|
|
16009
|
+
behavior: 'instant'
|
|
16010
|
+
});
|
|
16011
|
+
}
|
|
16012
|
+
});
|
|
16013
|
+
});
|
|
16014
|
+
}, {
|
|
16015
|
+
flush: 'sync'
|
|
16016
|
+
}); // Run synchronously before DOM updates
|
|
16017
|
+
|
|
15942
16018
|
vue.provide(VWindowSymbol, {
|
|
15943
16019
|
transition,
|
|
15944
16020
|
isReversed,
|
|
@@ -18843,7 +18919,7 @@
|
|
|
18843
18919
|
};
|
|
18844
18920
|
}
|
|
18845
18921
|
function createDateRange(adapter, start, stop) {
|
|
18846
|
-
const diff = adapter.getDiff(adapter.
|
|
18922
|
+
const diff = adapter.getDiff(new Date(`${adapter.toISO(stop ?? start)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
|
|
18847
18923
|
const datesInRange = [start];
|
|
18848
18924
|
for (let i = 1; i < diff; i++) {
|
|
18849
18925
|
const nextDate = adapter.addDays(start, i);
|
|
@@ -19517,10 +19593,7 @@
|
|
|
19517
19593
|
...omit(makeVTextFieldProps({
|
|
19518
19594
|
modelValue: null,
|
|
19519
19595
|
role: 'combobox'
|
|
19520
|
-
}), ['validationValue', 'dirty', 'appendInnerIcon'])
|
|
19521
|
-
...makeTransitionProps({
|
|
19522
|
-
transition: false
|
|
19523
|
-
})
|
|
19596
|
+
}), ['validationValue', 'dirty', 'appendInnerIcon'])
|
|
19524
19597
|
}, 'VCombobox');
|
|
19525
19598
|
const VCombobox = genericComponent()({
|
|
19526
19599
|
name: 'VCombobox',
|
|
@@ -19564,13 +19637,16 @@
|
|
|
19564
19637
|
const hasChips = vue.computed(() => !!(props.chips || slots.chip));
|
|
19565
19638
|
const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
|
|
19566
19639
|
const _search = vue.shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
|
|
19640
|
+
const _searchLock = vue.shallowRef(null);
|
|
19567
19641
|
const search = vue.computed({
|
|
19568
19642
|
get: () => {
|
|
19569
19643
|
return _search.value;
|
|
19570
19644
|
},
|
|
19571
19645
|
set: async val => {
|
|
19572
19646
|
_search.value = val ?? '';
|
|
19573
|
-
if (!props.multiple && !hasSelectionSlot.value) {
|
|
19647
|
+
if (val === null || val === '' && !props.multiple && !hasSelectionSlot.value) {
|
|
19648
|
+
model.value = [];
|
|
19649
|
+
} else if (!props.multiple && !hasSelectionSlot.value) {
|
|
19574
19650
|
model.value = [transformItem$3(props, val)];
|
|
19575
19651
|
vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
|
|
19576
19652
|
}
|
|
@@ -19598,9 +19674,9 @@
|
|
|
19598
19674
|
const {
|
|
19599
19675
|
filteredItems,
|
|
19600
19676
|
getMatches
|
|
19601
|
-
} = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
|
|
19677
|
+
} = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
|
|
19602
19678
|
const displayItems = vue.computed(() => {
|
|
19603
|
-
if (props.hideSelected) {
|
|
19679
|
+
if (props.hideSelected && _searchLock.value === null) {
|
|
19604
19680
|
return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
|
|
19605
19681
|
}
|
|
19606
19682
|
return filteredItems.value;
|
|
@@ -19681,22 +19757,19 @@
|
|
|
19681
19757
|
if (['Escape'].includes(e.key)) {
|
|
19682
19758
|
menu.value = false;
|
|
19683
19759
|
}
|
|
19684
|
-
if (['Enter', '
|
|
19685
|
-
|
|
19686
|
-
|
|
19687
|
-
|
|
19688
|
-
|
|
19689
|
-
|
|
19690
|
-
|
|
19691
|
-
select(filteredItems.value[0]);
|
|
19692
|
-
}
|
|
19693
|
-
isPristine.value = true;
|
|
19760
|
+
if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
|
|
19761
|
+
let {
|
|
19762
|
+
value
|
|
19763
|
+
} = _ref2;
|
|
19764
|
+
return value === displayItems.value[0].value;
|
|
19765
|
+
})) {
|
|
19766
|
+
select(filteredItems.value[0]);
|
|
19694
19767
|
}
|
|
19695
19768
|
if (e.key === 'ArrowDown' && highlightFirst.value) {
|
|
19696
19769
|
listRef.value?.focus('next');
|
|
19697
19770
|
}
|
|
19698
19771
|
if (e.key === 'Enter' && search.value) {
|
|
19699
|
-
select(transformItem$3(props, search.value));
|
|
19772
|
+
select(transformItem$3(props, search.value), true, true);
|
|
19700
19773
|
if (hasSelectionSlot.value) _search.value = '';
|
|
19701
19774
|
}
|
|
19702
19775
|
if (['Backspace', 'Delete'].includes(e.key)) {
|
|
@@ -19741,13 +19814,15 @@
|
|
|
19741
19814
|
}
|
|
19742
19815
|
function onAfterLeave() {
|
|
19743
19816
|
if (isFocused.value) {
|
|
19744
|
-
isPristine.value = true;
|
|
19745
19817
|
vTextFieldRef.value?.focus();
|
|
19746
19818
|
}
|
|
19819
|
+
isPristine.value = true;
|
|
19820
|
+
_searchLock.value = null;
|
|
19747
19821
|
}
|
|
19748
19822
|
/** @param set - null means toggle */
|
|
19749
19823
|
function select(item) {
|
|
19750
19824
|
let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
19825
|
+
let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
19751
19826
|
if (!item || item.props.disabled) return;
|
|
19752
19827
|
if (props.multiple) {
|
|
19753
19828
|
const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
|
|
@@ -19765,11 +19840,14 @@
|
|
|
19765
19840
|
} else {
|
|
19766
19841
|
const add = set !== false;
|
|
19767
19842
|
model.value = add ? [item] : [];
|
|
19843
|
+
if ((!isPristine.value || props.alwaysFilter) && _search.value) {
|
|
19844
|
+
_searchLock.value = _search.value;
|
|
19845
|
+
}
|
|
19768
19846
|
_search.value = add && !hasSelectionSlot.value ? item.title : '';
|
|
19769
19847
|
|
|
19770
19848
|
// watch for search watcher to trigger
|
|
19771
19849
|
vue.nextTick(() => {
|
|
19772
|
-
menu.value =
|
|
19850
|
+
menu.value = keepMenu;
|
|
19773
19851
|
isPristine.value = true;
|
|
19774
19852
|
});
|
|
19775
19853
|
}
|
|
@@ -19783,9 +19861,6 @@
|
|
|
19783
19861
|
function onFocusout(e) {
|
|
19784
19862
|
listHasFocus.value = false;
|
|
19785
19863
|
}
|
|
19786
|
-
function onUpdateModelValue(v) {
|
|
19787
|
-
if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = [];
|
|
19788
|
-
}
|
|
19789
19864
|
vue.watch(isFocused, (val, oldVal) => {
|
|
19790
19865
|
if (val || val === oldVal) return;
|
|
19791
19866
|
selectionIndex.value = -1;
|
|
@@ -19808,13 +19883,14 @@
|
|
|
19808
19883
|
}
|
|
19809
19884
|
}
|
|
19810
19885
|
});
|
|
19811
|
-
vue.watch(menu,
|
|
19812
|
-
if (!props.hideSelected &&
|
|
19886
|
+
vue.watch(menu, val => {
|
|
19887
|
+
if (!props.hideSelected && val && model.value.length && isPristine.value) {
|
|
19813
19888
|
const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
|
|
19814
19889
|
IN_BROWSER && window.requestAnimationFrame(() => {
|
|
19815
19890
|
index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
|
|
19816
19891
|
});
|
|
19817
19892
|
}
|
|
19893
|
+
if (val) _searchLock.value = null;
|
|
19818
19894
|
});
|
|
19819
19895
|
vue.watch(items, (newVal, oldVal) => {
|
|
19820
19896
|
if (menu.value) return;
|
|
@@ -19830,7 +19906,7 @@
|
|
|
19830
19906
|
"ref": vTextFieldRef
|
|
19831
19907
|
}, textFieldProps, {
|
|
19832
19908
|
"modelValue": search.value,
|
|
19833
|
-
"onUpdate:modelValue":
|
|
19909
|
+
"onUpdate:modelValue": $event => search.value = $event,
|
|
19834
19910
|
"focused": isFocused.value,
|
|
19835
19911
|
"onUpdate:focused": $event => isFocused.value = $event,
|
|
19836
19912
|
"validationValue": model.externalValue,
|
|
@@ -19865,7 +19941,6 @@
|
|
|
19865
19941
|
"maxHeight": 310,
|
|
19866
19942
|
"openOnClick": false,
|
|
19867
19943
|
"closeOnContentClick": false,
|
|
19868
|
-
"transition": props.transition,
|
|
19869
19944
|
"onAfterEnter": onAfterEnter,
|
|
19870
19945
|
"onAfterLeave": onAfterLeave
|
|
19871
19946
|
}, props.menuProps), {
|
|
@@ -19935,7 +20010,8 @@
|
|
|
19935
20010
|
"key": item.value,
|
|
19936
20011
|
"modelValue": isSelected,
|
|
19937
20012
|
"ripple": false,
|
|
19938
|
-
"tabindex": "-1"
|
|
20013
|
+
"tabindex": "-1",
|
|
20014
|
+
"onClick": event => event.preventDefault()
|
|
19939
20015
|
}, null) : undefined, item.props.prependAvatar && vue.createVNode(VAvatar, {
|
|
19940
20016
|
"image": item.props.prependAvatar
|
|
19941
20017
|
}, null), item.props.prependIcon && vue.createVNode(VIcon, {
|
|
@@ -24345,7 +24421,7 @@
|
|
|
24345
24421
|
function isAllowedInRange(start, end) {
|
|
24346
24422
|
const allowedDates = props.allowedDates;
|
|
24347
24423
|
if (typeof allowedDates !== 'function') return true;
|
|
24348
|
-
const days = adapter.getDiff(end, start, 'days');
|
|
24424
|
+
const days = 1 + adapter.getDiff(new Date(`${adapter.toISO(end)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
|
|
24349
24425
|
for (let i = 0; i < days; i++) {
|
|
24350
24426
|
if (allowedDates(adapter.addDays(start, i))) return true;
|
|
24351
24427
|
}
|
|
@@ -25368,10 +25444,11 @@
|
|
|
25368
25444
|
props: {
|
|
25369
25445
|
class: fieldClass,
|
|
25370
25446
|
...slotProps
|
|
25371
|
-
}
|
|
25447
|
+
},
|
|
25448
|
+
controlRef
|
|
25372
25449
|
} = _ref4;
|
|
25373
25450
|
return vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("input", vue.mergeProps({
|
|
25374
|
-
"ref": inputRef,
|
|
25451
|
+
"ref": val => inputRef.value = controlRef.value = val,
|
|
25375
25452
|
"type": "file",
|
|
25376
25453
|
"accept": inputAccept,
|
|
25377
25454
|
"readonly": isReadonly.value,
|
|
@@ -26848,7 +26925,7 @@
|
|
|
26848
26925
|
const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
|
|
26849
26926
|
const _inputText = vue.shallowRef(null);
|
|
26850
26927
|
vue.watchEffect(() => {
|
|
26851
|
-
if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
|
|
26928
|
+
if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, '.')) === model.value) ; else if (model.value == null) {
|
|
26852
26929
|
_inputText.value = null;
|
|
26853
26930
|
} else if (!isNaN(model.value)) {
|
|
26854
26931
|
_inputText.value = correctPrecision(model.value);
|
|
@@ -26943,6 +27020,7 @@
|
|
|
26943
27020
|
if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
|
|
26944
27021
|
e.preventDefault();
|
|
26945
27022
|
inputElement.value = potentialNewNumber;
|
|
27023
|
+
vue.nextTick(() => inputText.value = potentialNewNumber);
|
|
26946
27024
|
}
|
|
26947
27025
|
if (props.precision == null) return;
|
|
26948
27026
|
|
|
@@ -26950,13 +27028,15 @@
|
|
|
26950
27028
|
if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
|
|
26951
27029
|
e.preventDefault();
|
|
26952
27030
|
inputElement.value = potentialNewNumber;
|
|
27031
|
+
vue.nextTick(() => inputText.value = potentialNewNumber);
|
|
26953
27032
|
const cursorPosition = (selectionStart ?? 0) + e.data.length;
|
|
26954
27033
|
inputElement.setSelectionRange(cursorPosition, cursorPosition);
|
|
26955
27034
|
}
|
|
26956
27035
|
// Ignore decimal separator when precision = 0
|
|
26957
|
-
if (props.precision === 0 && potentialNewInputVal.
|
|
27036
|
+
if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
|
|
26958
27037
|
e.preventDefault();
|
|
26959
27038
|
inputElement.value = potentialNewNumber;
|
|
27039
|
+
vue.nextTick(() => inputText.value = potentialNewNumber);
|
|
26960
27040
|
}
|
|
26961
27041
|
}
|
|
26962
27042
|
async function onKeydown(e) {
|
|
@@ -28152,12 +28232,12 @@
|
|
|
28152
28232
|
ariaLabel: t(props.loadingText),
|
|
28153
28233
|
role: 'alert'
|
|
28154
28234
|
};
|
|
28155
|
-
return
|
|
28235
|
+
return isLoading ? vue.createElementVNode("div", vue.mergeProps({
|
|
28156
28236
|
"class": ['v-skeleton-loader', {
|
|
28157
28237
|
'v-skeleton-loader--boilerplate': props.boilerplate
|
|
28158
28238
|
}, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
|
|
28159
28239
|
"style": [backgroundColorStyles.value, dimensionStyles.value]
|
|
28160
|
-
}, loadingProps, attrs), [items.value]) : slots.default?.()]);
|
|
28240
|
+
}, loadingProps, attrs), [items.value]) : vue.createElementVNode(vue.Fragment, null, [slots.default?.()]);
|
|
28161
28241
|
});
|
|
28162
28242
|
return {};
|
|
28163
28243
|
}
|
|
@@ -30022,6 +30102,10 @@
|
|
|
30022
30102
|
const vFieldRef = vue.ref();
|
|
30023
30103
|
const controlHeight = vue.shallowRef('');
|
|
30024
30104
|
const textareaRef = vue.ref();
|
|
30105
|
+
const scrollbarWidth = vue.ref(0);
|
|
30106
|
+
const {
|
|
30107
|
+
platform
|
|
30108
|
+
} = useDisplay();
|
|
30025
30109
|
const autocomplete = useAutocomplete(props);
|
|
30026
30110
|
const isActive = vue.computed(() => props.persistentPlaceholder || isFocused.value || props.active);
|
|
30027
30111
|
function onFocus() {
|
|
@@ -30066,6 +30150,18 @@
|
|
|
30066
30150
|
if (!props.autoGrow) rows.value = Number(props.rows);
|
|
30067
30151
|
});
|
|
30068
30152
|
function calculateInputHeight() {
|
|
30153
|
+
vue.nextTick(() => {
|
|
30154
|
+
if (!textareaRef.value) return;
|
|
30155
|
+
if (platform.value.firefox) {
|
|
30156
|
+
scrollbarWidth.value = 12;
|
|
30157
|
+
return;
|
|
30158
|
+
}
|
|
30159
|
+
const {
|
|
30160
|
+
offsetWidth,
|
|
30161
|
+
clientWidth
|
|
30162
|
+
} = textareaRef.value;
|
|
30163
|
+
scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
|
|
30164
|
+
});
|
|
30069
30165
|
if (!props.autoGrow) return;
|
|
30070
30166
|
vue.nextTick(() => {
|
|
30071
30167
|
if (!sizerRef.value || !vFieldRef.value) return;
|
|
@@ -30126,7 +30222,9 @@
|
|
|
30126
30222
|
'v-textarea--no-resize': props.noResize || props.autoGrow,
|
|
30127
30223
|
'v-input--plain-underlined': isPlainOrUnderlined.value
|
|
30128
30224
|
}, props.class],
|
|
30129
|
-
"style":
|
|
30225
|
+
"style": [{
|
|
30226
|
+
'--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
|
|
30227
|
+
}, props.style]
|
|
30130
30228
|
}, rootAttrs, inputProps, {
|
|
30131
30229
|
"centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
|
|
30132
30230
|
"focused": isFocused.value
|
|
@@ -30166,12 +30264,13 @@
|
|
|
30166
30264
|
props: {
|
|
30167
30265
|
class: fieldClass,
|
|
30168
30266
|
...slotProps
|
|
30169
|
-
}
|
|
30267
|
+
},
|
|
30268
|
+
controlRef
|
|
30170
30269
|
} = _ref3;
|
|
30171
30270
|
return vue.createElementVNode(vue.Fragment, null, [props.prefix && vue.createElementVNode("span", {
|
|
30172
30271
|
"class": "v-text-field__prefix"
|
|
30173
30272
|
}, [props.prefix]), vue.withDirectives(vue.createElementVNode("textarea", vue.mergeProps({
|
|
30174
|
-
"ref": textareaRef,
|
|
30273
|
+
"ref": val => textareaRef.value = controlRef.value = val,
|
|
30175
30274
|
"class": fieldClass,
|
|
30176
30275
|
"value": model.value,
|
|
30177
30276
|
"onInput": onInput,
|
|
@@ -32281,7 +32380,7 @@
|
|
|
32281
32380
|
};
|
|
32282
32381
|
});
|
|
32283
32382
|
}
|
|
32284
|
-
const version$1 = "3.10.
|
|
32383
|
+
const version$1 = "3.10.7";
|
|
32285
32384
|
createVuetify$1.version = version$1;
|
|
32286
32385
|
|
|
32287
32386
|
// Vue's inject() can only be used in setup
|
|
@@ -32306,7 +32405,7 @@
|
|
|
32306
32405
|
...options
|
|
32307
32406
|
});
|
|
32308
32407
|
};
|
|
32309
|
-
const version = "3.10.
|
|
32408
|
+
const version = "3.10.7";
|
|
32310
32409
|
createVuetify.version = version;
|
|
32311
32410
|
|
|
32312
32411
|
exports.blueprints = index;
|