vuetify 3.10.5 → 3.10.6
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 +3568 -3592
- package/dist/json/importMap-labs.json +24 -24
- package/dist/json/importMap.json +152 -152
- package/dist/json/tags.json +3 -9
- package/dist/json/web-types.json +6916 -6969
- package/dist/vuetify-labs.cjs +178 -72
- package/dist/vuetify-labs.css +4389 -4339
- package/dist/vuetify-labs.d.ts +108 -163
- package/dist/vuetify-labs.esm.js +178 -72
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +178 -72
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +159 -62
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +4349 -4321
- package/dist/vuetify.d.ts +108 -128
- package/dist/vuetify.esm.js +159 -62
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +159 -62
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +113 -102
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VAutocomplete/VAutocomplete.d.ts +0 -61
- package/lib/components/VAutocomplete/VAutocomplete.js +13 -11
- 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 +26 -28
- 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/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/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 +0 -3
- package/lib/components/VTextField/VTextField.js.map +1 -1
- package/lib/components/VTextarea/VTextarea.css +2 -2
- package/lib/components/VTextarea/VTextarea.js +20 -1
- package/lib/components/VTextarea/VTextarea.js.map +1 -1
- package/lib/components/VTextarea/VTextarea.sass +4 -2
- package/lib/components/VWindow/VWindow.js +43 -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 +54 -54
- 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.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Vuetify v3.10.
|
|
2
|
+
* Vuetify v3.10.6
|
|
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,
|
|
@@ -13156,7 +13191,7 @@
|
|
|
13156
13191
|
const start = performance.now();
|
|
13157
13192
|
offsets[0] = 0;
|
|
13158
13193
|
const length = items.value.length;
|
|
13159
|
-
for (let i = 1; i <= length
|
|
13194
|
+
for (let i = 1; i <= length; i++) {
|
|
13160
13195
|
offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
|
|
13161
13196
|
}
|
|
13162
13197
|
updateTime.value = Math.max(updateTime.value, performance.now() - start);
|
|
@@ -13191,7 +13226,7 @@
|
|
|
13191
13226
|
}
|
|
13192
13227
|
}
|
|
13193
13228
|
function calculateOffset(index) {
|
|
13194
|
-
index = clamp(index, 0, items.value.length
|
|
13229
|
+
index = clamp(index, 0, items.value.length);
|
|
13195
13230
|
const whole = Math.floor(index);
|
|
13196
13231
|
const fraction = index % 1;
|
|
13197
13232
|
const next = whole + 1;
|
|
@@ -14196,10 +14231,7 @@
|
|
|
14196
14231
|
...omit(makeVTextFieldProps({
|
|
14197
14232
|
modelValue: null,
|
|
14198
14233
|
role: 'combobox'
|
|
14199
|
-
}), ['validationValue', 'dirty', 'appendInnerIcon'])
|
|
14200
|
-
...makeTransitionProps({
|
|
14201
|
-
transition: false
|
|
14202
|
-
})
|
|
14234
|
+
}), ['validationValue', 'dirty', 'appendInnerIcon'])
|
|
14203
14235
|
}, 'VAutocomplete');
|
|
14204
14236
|
const VAutocomplete = genericComponent()({
|
|
14205
14237
|
name: 'VAutocomplete',
|
|
@@ -14224,6 +14256,7 @@
|
|
|
14224
14256
|
const vMenuRef = vue.ref();
|
|
14225
14257
|
const vVirtualScrollRef = vue.ref();
|
|
14226
14258
|
const selectionIndex = vue.shallowRef(-1);
|
|
14259
|
+
const _searchLock = vue.shallowRef(null);
|
|
14227
14260
|
const {
|
|
14228
14261
|
items,
|
|
14229
14262
|
transformIn,
|
|
@@ -14245,9 +14278,9 @@
|
|
|
14245
14278
|
const {
|
|
14246
14279
|
filteredItems,
|
|
14247
14280
|
getMatches
|
|
14248
|
-
} = useFilter(props, items, () => isPristine.value ? '' : search.value);
|
|
14281
|
+
} = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
|
|
14249
14282
|
const displayItems = vue.computed(() => {
|
|
14250
|
-
if (props.hideSelected) {
|
|
14283
|
+
if (props.hideSelected && _searchLock.value === null) {
|
|
14251
14284
|
return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
|
|
14252
14285
|
}
|
|
14253
14286
|
return filteredItems.value;
|
|
@@ -14378,6 +14411,7 @@
|
|
|
14378
14411
|
isPristine.value = true;
|
|
14379
14412
|
vTextFieldRef.value?.focus();
|
|
14380
14413
|
}
|
|
14414
|
+
_searchLock.value = null;
|
|
14381
14415
|
}
|
|
14382
14416
|
function onFocusin(e) {
|
|
14383
14417
|
isFocused.value = true;
|
|
@@ -14413,6 +14447,7 @@
|
|
|
14413
14447
|
} else {
|
|
14414
14448
|
const add = set !== false;
|
|
14415
14449
|
model.value = add ? [item] : [];
|
|
14450
|
+
_searchLock.value = isPristine.value ? '' : search.value ?? '';
|
|
14416
14451
|
search.value = add && !hasSelectionSlot.value ? item.title : '';
|
|
14417
14452
|
|
|
14418
14453
|
// watch for search watcher to trigger
|
|
@@ -14432,6 +14467,9 @@
|
|
|
14432
14467
|
} else {
|
|
14433
14468
|
if (!props.multiple && search.value == null) model.value = [];
|
|
14434
14469
|
menu.value = false;
|
|
14470
|
+
if (!isPristine.value && search.value) {
|
|
14471
|
+
_searchLock.value = search.value;
|
|
14472
|
+
}
|
|
14435
14473
|
search.value = '';
|
|
14436
14474
|
selectionIndex.value = -1;
|
|
14437
14475
|
}
|
|
@@ -14441,13 +14479,14 @@
|
|
|
14441
14479
|
if (val) menu.value = true;
|
|
14442
14480
|
isPristine.value = !val;
|
|
14443
14481
|
});
|
|
14444
|
-
vue.watch(menu,
|
|
14445
|
-
if (!props.hideSelected &&
|
|
14482
|
+
vue.watch(menu, val => {
|
|
14483
|
+
if (!props.hideSelected && val && model.value.length && isPristine.value) {
|
|
14446
14484
|
const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
|
|
14447
14485
|
IN_BROWSER && window.requestAnimationFrame(() => {
|
|
14448
14486
|
index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
|
|
14449
14487
|
});
|
|
14450
14488
|
}
|
|
14489
|
+
if (val) _searchLock.value = null;
|
|
14451
14490
|
});
|
|
14452
14491
|
vue.watch(items, (newVal, oldVal) => {
|
|
14453
14492
|
if (menu.value) return;
|
|
@@ -14498,7 +14537,6 @@
|
|
|
14498
14537
|
"maxHeight": 310,
|
|
14499
14538
|
"openOnClick": false,
|
|
14500
14539
|
"closeOnContentClick": false,
|
|
14501
|
-
"transition": props.transition,
|
|
14502
14540
|
"onAfterEnter": onAfterEnter,
|
|
14503
14541
|
"onAfterLeave": onAfterLeave
|
|
14504
14542
|
}, props.menuProps), {
|
|
@@ -15926,7 +15964,21 @@
|
|
|
15926
15964
|
const activeIndex = vue.computed(() => {
|
|
15927
15965
|
return group.items.value.findIndex(item => group.selected.value.includes(item.id));
|
|
15928
15966
|
});
|
|
15967
|
+
|
|
15968
|
+
// Fix for https://github.com/vuetifyjs/vuetify/issues/18447
|
|
15929
15969
|
vue.watch(activeIndex, (newVal, oldVal) => {
|
|
15970
|
+
let scrollableParent;
|
|
15971
|
+
const savedScrollPosition = {
|
|
15972
|
+
x: 0,
|
|
15973
|
+
y: 0
|
|
15974
|
+
};
|
|
15975
|
+
if (IN_BROWSER && oldVal >= 0) {
|
|
15976
|
+
scrollableParent = getScrollParent(rootRef.value);
|
|
15977
|
+
|
|
15978
|
+
// Save current scroll position
|
|
15979
|
+
savedScrollPosition.x = scrollableParent.scrollLeft;
|
|
15980
|
+
savedScrollPosition.y = scrollableParent.scrollTop;
|
|
15981
|
+
}
|
|
15930
15982
|
const itemsLength = group.items.value.length;
|
|
15931
15983
|
const lastIndex = itemsLength - 1;
|
|
15932
15984
|
if (itemsLength <= 2) {
|
|
@@ -15938,7 +15990,32 @@
|
|
|
15938
15990
|
} else {
|
|
15939
15991
|
isReversed.value = newVal < oldVal;
|
|
15940
15992
|
}
|
|
15941
|
-
|
|
15993
|
+
vue.nextTick(() => {
|
|
15994
|
+
if (!IN_BROWSER || !scrollableParent) return;
|
|
15995
|
+
const currentScrollY = scrollableParent.scrollTop;
|
|
15996
|
+
if (currentScrollY !== savedScrollPosition.y) {
|
|
15997
|
+
scrollableParent.scrollTo({
|
|
15998
|
+
left: savedScrollPosition.x,
|
|
15999
|
+
top: savedScrollPosition.y,
|
|
16000
|
+
behavior: 'instant'
|
|
16001
|
+
});
|
|
16002
|
+
}
|
|
16003
|
+
requestAnimationFrame(() => {
|
|
16004
|
+
if (!scrollableParent) return;
|
|
16005
|
+
const rafScrollY = scrollableParent.scrollTop;
|
|
16006
|
+
if (rafScrollY !== savedScrollPosition.y) {
|
|
16007
|
+
scrollableParent.scrollTo({
|
|
16008
|
+
left: savedScrollPosition.x,
|
|
16009
|
+
top: savedScrollPosition.y,
|
|
16010
|
+
behavior: 'instant'
|
|
16011
|
+
});
|
|
16012
|
+
}
|
|
16013
|
+
});
|
|
16014
|
+
});
|
|
16015
|
+
}, {
|
|
16016
|
+
flush: 'sync'
|
|
16017
|
+
}); // Run synchronously before DOM updates
|
|
16018
|
+
|
|
15942
16019
|
vue.provide(VWindowSymbol, {
|
|
15943
16020
|
transition,
|
|
15944
16021
|
isReversed,
|
|
@@ -18843,7 +18920,7 @@
|
|
|
18843
18920
|
};
|
|
18844
18921
|
}
|
|
18845
18922
|
function createDateRange(adapter, start, stop) {
|
|
18846
|
-
const diff = adapter.getDiff(adapter.
|
|
18923
|
+
const diff = adapter.getDiff(new Date(`${adapter.toISO(stop ?? start)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
|
|
18847
18924
|
const datesInRange = [start];
|
|
18848
18925
|
for (let i = 1; i < diff; i++) {
|
|
18849
18926
|
const nextDate = adapter.addDays(start, i);
|
|
@@ -19517,10 +19594,7 @@
|
|
|
19517
19594
|
...omit(makeVTextFieldProps({
|
|
19518
19595
|
modelValue: null,
|
|
19519
19596
|
role: 'combobox'
|
|
19520
|
-
}), ['validationValue', 'dirty', 'appendInnerIcon'])
|
|
19521
|
-
...makeTransitionProps({
|
|
19522
|
-
transition: false
|
|
19523
|
-
})
|
|
19597
|
+
}), ['validationValue', 'dirty', 'appendInnerIcon'])
|
|
19524
19598
|
}, 'VCombobox');
|
|
19525
19599
|
const VCombobox = genericComponent()({
|
|
19526
19600
|
name: 'VCombobox',
|
|
@@ -19564,13 +19638,16 @@
|
|
|
19564
19638
|
const hasChips = vue.computed(() => !!(props.chips || slots.chip));
|
|
19565
19639
|
const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
|
|
19566
19640
|
const _search = vue.shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
|
|
19641
|
+
const _searchLock = vue.shallowRef(null);
|
|
19567
19642
|
const search = vue.computed({
|
|
19568
19643
|
get: () => {
|
|
19569
19644
|
return _search.value;
|
|
19570
19645
|
},
|
|
19571
19646
|
set: async val => {
|
|
19572
19647
|
_search.value = val ?? '';
|
|
19573
|
-
if (!props.multiple && !hasSelectionSlot.value) {
|
|
19648
|
+
if (val === null || val === '' && !props.multiple && !hasSelectionSlot.value) {
|
|
19649
|
+
model.value = [];
|
|
19650
|
+
} else if (!props.multiple && !hasSelectionSlot.value) {
|
|
19574
19651
|
model.value = [transformItem$3(props, val)];
|
|
19575
19652
|
vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
|
|
19576
19653
|
}
|
|
@@ -19598,9 +19675,9 @@
|
|
|
19598
19675
|
const {
|
|
19599
19676
|
filteredItems,
|
|
19600
19677
|
getMatches
|
|
19601
|
-
} = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
|
|
19678
|
+
} = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
|
|
19602
19679
|
const displayItems = vue.computed(() => {
|
|
19603
|
-
if (props.hideSelected) {
|
|
19680
|
+
if (props.hideSelected && _searchLock.value === null) {
|
|
19604
19681
|
return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
|
|
19605
19682
|
}
|
|
19606
19683
|
return filteredItems.value;
|
|
@@ -19681,22 +19758,19 @@
|
|
|
19681
19758
|
if (['Escape'].includes(e.key)) {
|
|
19682
19759
|
menu.value = false;
|
|
19683
19760
|
}
|
|
19684
|
-
if (['Enter', '
|
|
19685
|
-
|
|
19686
|
-
|
|
19687
|
-
|
|
19688
|
-
|
|
19689
|
-
|
|
19690
|
-
|
|
19691
|
-
select(filteredItems.value[0]);
|
|
19692
|
-
}
|
|
19693
|
-
isPristine.value = true;
|
|
19761
|
+
if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
|
|
19762
|
+
let {
|
|
19763
|
+
value
|
|
19764
|
+
} = _ref2;
|
|
19765
|
+
return value === displayItems.value[0].value;
|
|
19766
|
+
})) {
|
|
19767
|
+
select(filteredItems.value[0]);
|
|
19694
19768
|
}
|
|
19695
19769
|
if (e.key === 'ArrowDown' && highlightFirst.value) {
|
|
19696
19770
|
listRef.value?.focus('next');
|
|
19697
19771
|
}
|
|
19698
19772
|
if (e.key === 'Enter' && search.value) {
|
|
19699
|
-
select(transformItem$3(props, search.value));
|
|
19773
|
+
select(transformItem$3(props, search.value), true, true);
|
|
19700
19774
|
if (hasSelectionSlot.value) _search.value = '';
|
|
19701
19775
|
}
|
|
19702
19776
|
if (['Backspace', 'Delete'].includes(e.key)) {
|
|
@@ -19744,10 +19818,12 @@
|
|
|
19744
19818
|
isPristine.value = true;
|
|
19745
19819
|
vTextFieldRef.value?.focus();
|
|
19746
19820
|
}
|
|
19821
|
+
_searchLock.value = null;
|
|
19747
19822
|
}
|
|
19748
19823
|
/** @param set - null means toggle */
|
|
19749
19824
|
function select(item) {
|
|
19750
19825
|
let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
19826
|
+
let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
19751
19827
|
if (!item || item.props.disabled) return;
|
|
19752
19828
|
if (props.multiple) {
|
|
19753
19829
|
const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
|
|
@@ -19765,11 +19841,14 @@
|
|
|
19765
19841
|
} else {
|
|
19766
19842
|
const add = set !== false;
|
|
19767
19843
|
model.value = add ? [item] : [];
|
|
19844
|
+
if ((!isPristine.value || props.alwaysFilter) && _search.value) {
|
|
19845
|
+
_searchLock.value = _search.value;
|
|
19846
|
+
}
|
|
19768
19847
|
_search.value = add && !hasSelectionSlot.value ? item.title : '';
|
|
19769
19848
|
|
|
19770
19849
|
// watch for search watcher to trigger
|
|
19771
19850
|
vue.nextTick(() => {
|
|
19772
|
-
menu.value =
|
|
19851
|
+
menu.value = keepMenu;
|
|
19773
19852
|
isPristine.value = true;
|
|
19774
19853
|
});
|
|
19775
19854
|
}
|
|
@@ -19783,9 +19862,6 @@
|
|
|
19783
19862
|
function onFocusout(e) {
|
|
19784
19863
|
listHasFocus.value = false;
|
|
19785
19864
|
}
|
|
19786
|
-
function onUpdateModelValue(v) {
|
|
19787
|
-
if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = [];
|
|
19788
|
-
}
|
|
19789
19865
|
vue.watch(isFocused, (val, oldVal) => {
|
|
19790
19866
|
if (val || val === oldVal) return;
|
|
19791
19867
|
selectionIndex.value = -1;
|
|
@@ -19808,13 +19884,14 @@
|
|
|
19808
19884
|
}
|
|
19809
19885
|
}
|
|
19810
19886
|
});
|
|
19811
|
-
vue.watch(menu,
|
|
19812
|
-
if (!props.hideSelected &&
|
|
19887
|
+
vue.watch(menu, val => {
|
|
19888
|
+
if (!props.hideSelected && val && model.value.length && isPristine.value) {
|
|
19813
19889
|
const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
|
|
19814
19890
|
IN_BROWSER && window.requestAnimationFrame(() => {
|
|
19815
19891
|
index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
|
|
19816
19892
|
});
|
|
19817
19893
|
}
|
|
19894
|
+
if (val) _searchLock.value = null;
|
|
19818
19895
|
});
|
|
19819
19896
|
vue.watch(items, (newVal, oldVal) => {
|
|
19820
19897
|
if (menu.value) return;
|
|
@@ -19830,7 +19907,7 @@
|
|
|
19830
19907
|
"ref": vTextFieldRef
|
|
19831
19908
|
}, textFieldProps, {
|
|
19832
19909
|
"modelValue": search.value,
|
|
19833
|
-
"onUpdate:modelValue":
|
|
19910
|
+
"onUpdate:modelValue": $event => search.value = $event,
|
|
19834
19911
|
"focused": isFocused.value,
|
|
19835
19912
|
"onUpdate:focused": $event => isFocused.value = $event,
|
|
19836
19913
|
"validationValue": model.externalValue,
|
|
@@ -19865,7 +19942,6 @@
|
|
|
19865
19942
|
"maxHeight": 310,
|
|
19866
19943
|
"openOnClick": false,
|
|
19867
19944
|
"closeOnContentClick": false,
|
|
19868
|
-
"transition": props.transition,
|
|
19869
19945
|
"onAfterEnter": onAfterEnter,
|
|
19870
19946
|
"onAfterLeave": onAfterLeave
|
|
19871
19947
|
}, props.menuProps), {
|
|
@@ -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
|
}
|
|
@@ -26848,7 +26924,7 @@
|
|
|
26848
26924
|
const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
|
|
26849
26925
|
const _inputText = vue.shallowRef(null);
|
|
26850
26926
|
vue.watchEffect(() => {
|
|
26851
|
-
if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
|
|
26927
|
+
if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, '.')) === model.value) ; else if (model.value == null) {
|
|
26852
26928
|
_inputText.value = null;
|
|
26853
26929
|
} else if (!isNaN(model.value)) {
|
|
26854
26930
|
_inputText.value = correctPrecision(model.value);
|
|
@@ -26943,6 +27019,7 @@
|
|
|
26943
27019
|
if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
|
|
26944
27020
|
e.preventDefault();
|
|
26945
27021
|
inputElement.value = potentialNewNumber;
|
|
27022
|
+
vue.nextTick(() => inputText.value = potentialNewNumber);
|
|
26946
27023
|
}
|
|
26947
27024
|
if (props.precision == null) return;
|
|
26948
27025
|
|
|
@@ -26950,13 +27027,15 @@
|
|
|
26950
27027
|
if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
|
|
26951
27028
|
e.preventDefault();
|
|
26952
27029
|
inputElement.value = potentialNewNumber;
|
|
27030
|
+
vue.nextTick(() => inputText.value = potentialNewNumber);
|
|
26953
27031
|
const cursorPosition = (selectionStart ?? 0) + e.data.length;
|
|
26954
27032
|
inputElement.setSelectionRange(cursorPosition, cursorPosition);
|
|
26955
27033
|
}
|
|
26956
27034
|
// Ignore decimal separator when precision = 0
|
|
26957
|
-
if (props.precision === 0 && potentialNewInputVal.
|
|
27035
|
+
if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
|
|
26958
27036
|
e.preventDefault();
|
|
26959
27037
|
inputElement.value = potentialNewNumber;
|
|
27038
|
+
vue.nextTick(() => inputText.value = potentialNewNumber);
|
|
26960
27039
|
}
|
|
26961
27040
|
}
|
|
26962
27041
|
async function onKeydown(e) {
|
|
@@ -28152,12 +28231,12 @@
|
|
|
28152
28231
|
ariaLabel: t(props.loadingText),
|
|
28153
28232
|
role: 'alert'
|
|
28154
28233
|
};
|
|
28155
|
-
return
|
|
28234
|
+
return isLoading ? vue.createElementVNode("div", vue.mergeProps({
|
|
28156
28235
|
"class": ['v-skeleton-loader', {
|
|
28157
28236
|
'v-skeleton-loader--boilerplate': props.boilerplate
|
|
28158
28237
|
}, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
|
|
28159
28238
|
"style": [backgroundColorStyles.value, dimensionStyles.value]
|
|
28160
|
-
}, loadingProps, attrs), [items.value]) : slots.default?.()]);
|
|
28239
|
+
}, loadingProps, attrs), [items.value]) : vue.createElementVNode(vue.Fragment, null, [slots.default?.()]);
|
|
28161
28240
|
});
|
|
28162
28241
|
return {};
|
|
28163
28242
|
}
|
|
@@ -30022,6 +30101,10 @@
|
|
|
30022
30101
|
const vFieldRef = vue.ref();
|
|
30023
30102
|
const controlHeight = vue.shallowRef('');
|
|
30024
30103
|
const textareaRef = vue.ref();
|
|
30104
|
+
const scrollbarWidth = vue.ref(0);
|
|
30105
|
+
const {
|
|
30106
|
+
platform
|
|
30107
|
+
} = useDisplay();
|
|
30025
30108
|
const autocomplete = useAutocomplete(props);
|
|
30026
30109
|
const isActive = vue.computed(() => props.persistentPlaceholder || isFocused.value || props.active);
|
|
30027
30110
|
function onFocus() {
|
|
@@ -30066,6 +30149,18 @@
|
|
|
30066
30149
|
if (!props.autoGrow) rows.value = Number(props.rows);
|
|
30067
30150
|
});
|
|
30068
30151
|
function calculateInputHeight() {
|
|
30152
|
+
vue.nextTick(() => {
|
|
30153
|
+
if (!textareaRef.value) return;
|
|
30154
|
+
if (platform.value.firefox) {
|
|
30155
|
+
scrollbarWidth.value = 12;
|
|
30156
|
+
return;
|
|
30157
|
+
}
|
|
30158
|
+
const {
|
|
30159
|
+
offsetWidth,
|
|
30160
|
+
clientWidth
|
|
30161
|
+
} = textareaRef.value;
|
|
30162
|
+
scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
|
|
30163
|
+
});
|
|
30069
30164
|
if (!props.autoGrow) return;
|
|
30070
30165
|
vue.nextTick(() => {
|
|
30071
30166
|
if (!sizerRef.value || !vFieldRef.value) return;
|
|
@@ -30126,7 +30221,9 @@
|
|
|
30126
30221
|
'v-textarea--no-resize': props.noResize || props.autoGrow,
|
|
30127
30222
|
'v-input--plain-underlined': isPlainOrUnderlined.value
|
|
30128
30223
|
}, props.class],
|
|
30129
|
-
"style":
|
|
30224
|
+
"style": [{
|
|
30225
|
+
'--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
|
|
30226
|
+
}, props.style]
|
|
30130
30227
|
}, rootAttrs, inputProps, {
|
|
30131
30228
|
"centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
|
|
30132
30229
|
"focused": isFocused.value
|
|
@@ -32281,7 +32378,7 @@
|
|
|
32281
32378
|
};
|
|
32282
32379
|
});
|
|
32283
32380
|
}
|
|
32284
|
-
const version$1 = "3.10.
|
|
32381
|
+
const version$1 = "3.10.6";
|
|
32285
32382
|
createVuetify$1.version = version$1;
|
|
32286
32383
|
|
|
32287
32384
|
// Vue's inject() can only be used in setup
|
|
@@ -32306,7 +32403,7 @@
|
|
|
32306
32403
|
...options
|
|
32307
32404
|
});
|
|
32308
32405
|
};
|
|
32309
|
-
const version = "3.10.
|
|
32406
|
+
const version = "3.10.6";
|
|
32310
32407
|
createVuetify.version = version;
|
|
32311
32408
|
|
|
32312
32409
|
exports.blueprints = index;
|