@vuetify/nightly 3.9.2-master.2025-07-28 → 3.9.3-dev.2025-07-30
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/CHANGELOG.md +8 -53
- package/dist/json/attributes.json +3804 -3784
- package/dist/json/importMap-labs.json +28 -28
- package/dist/json/importMap.json +192 -192
- package/dist/json/tags.json +5 -0
- package/dist/json/web-types.json +6986 -6916
- package/dist/vuetify-labs.cjs +272 -44
- package/dist/vuetify-labs.css +5500 -5503
- package/dist/vuetify-labs.d.ts +132 -69
- package/dist/vuetify-labs.esm.js +272 -44
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +272 -44
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +234 -35
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +4797 -4800
- package/dist/vuetify.d.ts +122 -69
- package/dist/vuetify.esm.js +234 -35
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +234 -35
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +792 -768
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VAutocomplete/VAutocomplete.js +1 -0
- package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/lib/components/VCombobox/VCombobox.js +11 -6
- package/lib/components/VCombobox/VCombobox.js.map +1 -1
- package/lib/components/VDatePicker/VDatePickerControls.js +8 -1
- package/lib/components/VDatePicker/VDatePickerControls.js.map +1 -1
- package/lib/components/VDatePicker/VDatePickerMonth.js +11 -0
- package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
- package/lib/components/VDatePicker/VDatePickerMonths.js +3 -0
- package/lib/components/VDatePicker/VDatePickerMonths.js.map +1 -1
- package/lib/components/VFileInput/VFileInput.d.ts +15 -0
- package/lib/components/VFileInput/VFileInput.js +38 -9
- package/lib/components/VFileInput/VFileInput.js.map +1 -1
- package/lib/components/VList/VList.js +2 -1
- package/lib/components/VList/VList.js.map +1 -1
- package/lib/components/VList/VListChildren.js +3 -4
- package/lib/components/VList/VListChildren.js.map +1 -1
- package/lib/components/VList/VListItem.js +7 -1
- package/lib/components/VList/VListItem.js.map +1 -1
- package/lib/components/VProgressLinear/VProgressLinear.css +1 -1
- package/lib/components/VProgressLinear/VProgressLinear.d.ts +75 -0
- package/lib/components/VProgressLinear/VProgressLinear.js +32 -6
- package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
- package/lib/components/VProgressLinear/VProgressLinear.sass +1 -1
- package/lib/components/VProgressLinear/chunks.d.ts +55 -0
- package/lib/components/VProgressLinear/chunks.js +62 -0
- package/lib/components/VProgressLinear/chunks.js.map +1 -0
- package/lib/components/VSelect/VSelect.js +1 -0
- package/lib/components/VSelect/VSelect.js.map +1 -1
- package/lib/components/VSlider/VSliderThumb.css +9 -14
- package/lib/components/VSlider/VSliderThumb.js +13 -7
- package/lib/components/VSlider/VSliderThumb.js.map +1 -1
- package/lib/components/VSlider/VSliderThumb.sass +9 -14
- package/lib/components/VSlider/slider.d.ts +1 -0
- package/lib/components/VSlider/slider.js +2 -0
- package/lib/components/VSlider/slider.js.map +1 -1
- package/lib/composables/fileFilter.d.ts +18 -0
- package/lib/composables/fileFilter.js +38 -0
- package/lib/composables/fileFilter.js.map +1 -0
- package/lib/composables/theme.d.ts +1 -0
- package/lib/composables/theme.js +3 -1
- package/lib/composables/theme.js.map +1 -1
- package/lib/directives/ripple/index.js +2 -2
- package/lib/directives/ripple/index.js.map +1 -1
- package/lib/entry-bundler.js +1 -1
- package/lib/entry-bundler.js.map +1 -1
- package/lib/framework.d.ts +70 -69
- package/lib/framework.js +1 -1
- package/lib/framework.js.map +1 -1
- package/lib/labs/VFileUpload/VFileUpload.d.ts +15 -0
- package/lib/labs/VFileUpload/VFileUpload.js +39 -9
- package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
- package/lib/locale/af.d.ts +7 -0
- package/lib/locale/af.js +7 -0
- package/lib/locale/af.js.map +1 -1
- package/lib/locale/ar.d.ts +7 -0
- package/lib/locale/ar.js +13 -6
- package/lib/locale/ar.js.map +1 -1
- package/lib/locale/az.d.ts +7 -0
- package/lib/locale/az.js +7 -0
- package/lib/locale/az.js.map +1 -1
- package/lib/locale/bg.d.ts +7 -0
- package/lib/locale/bg.js +7 -0
- package/lib/locale/bg.js.map +1 -1
- package/lib/locale/ca.d.ts +7 -0
- package/lib/locale/ca.js +7 -0
- package/lib/locale/ca.js.map +1 -1
- package/lib/locale/ckb.d.ts +7 -0
- package/lib/locale/ckb.js +7 -0
- package/lib/locale/ckb.js.map +1 -1
- package/lib/locale/cs.d.ts +7 -0
- package/lib/locale/cs.js +7 -0
- package/lib/locale/cs.js.map +1 -1
- package/lib/locale/da.d.ts +7 -0
- package/lib/locale/da.js +7 -0
- package/lib/locale/da.js.map +1 -1
- package/lib/locale/de.d.ts +7 -0
- package/lib/locale/de.js +7 -0
- package/lib/locale/de.js.map +1 -1
- package/lib/locale/el.d.ts +7 -0
- package/lib/locale/el.js +7 -0
- package/lib/locale/el.js.map +1 -1
- package/lib/locale/en.d.ts +7 -0
- package/lib/locale/en.js +8 -0
- package/lib/locale/en.js.map +1 -1
- package/lib/locale/es.d.ts +7 -0
- package/lib/locale/es.js +7 -0
- package/lib/locale/es.js.map +1 -1
- package/lib/locale/et.d.ts +7 -0
- package/lib/locale/et.js +7 -0
- package/lib/locale/et.js.map +1 -1
- package/lib/locale/fa.d.ts +7 -0
- package/lib/locale/fa.js +7 -0
- package/lib/locale/fa.js.map +1 -1
- package/lib/locale/fi.d.ts +7 -0
- package/lib/locale/fi.js +7 -0
- package/lib/locale/fi.js.map +1 -1
- package/lib/locale/fr.d.ts +7 -0
- package/lib/locale/fr.js +7 -0
- package/lib/locale/fr.js.map +1 -1
- package/lib/locale/he.d.ts +7 -0
- package/lib/locale/he.js +7 -0
- package/lib/locale/he.js.map +1 -1
- package/lib/locale/hr.d.ts +7 -0
- package/lib/locale/hr.js +7 -0
- package/lib/locale/hr.js.map +1 -1
- package/lib/locale/hu.d.ts +7 -0
- package/lib/locale/hu.js +7 -0
- package/lib/locale/hu.js.map +1 -1
- package/lib/locale/id.d.ts +7 -0
- package/lib/locale/id.js +7 -0
- package/lib/locale/id.js.map +1 -1
- package/lib/locale/it.d.ts +7 -0
- package/lib/locale/it.js +7 -0
- package/lib/locale/it.js.map +1 -1
- package/lib/locale/ja.d.ts +7 -0
- package/lib/locale/ja.js +7 -0
- package/lib/locale/ja.js.map +1 -1
- package/lib/locale/km.d.ts +7 -0
- package/lib/locale/km.js +7 -0
- package/lib/locale/km.js.map +1 -1
- package/lib/locale/ko.d.ts +7 -0
- package/lib/locale/ko.js +7 -0
- package/lib/locale/ko.js.map +1 -1
- package/lib/locale/lt.d.ts +7 -0
- package/lib/locale/lt.js +7 -0
- package/lib/locale/lt.js.map +1 -1
- package/lib/locale/lv.d.ts +7 -0
- package/lib/locale/lv.js +7 -0
- package/lib/locale/lv.js.map +1 -1
- package/lib/locale/nl.d.ts +7 -0
- package/lib/locale/nl.js +7 -0
- package/lib/locale/nl.js.map +1 -1
- package/lib/locale/no.d.ts +7 -0
- package/lib/locale/no.js +7 -0
- package/lib/locale/no.js.map +1 -1
- package/lib/locale/pl.d.ts +7 -0
- package/lib/locale/pl.js +7 -0
- package/lib/locale/pl.js.map +1 -1
- package/lib/locale/pt.d.ts +7 -0
- package/lib/locale/pt.js +7 -0
- package/lib/locale/pt.js.map +1 -1
- package/lib/locale/ro.d.ts +7 -0
- package/lib/locale/ro.js +7 -0
- package/lib/locale/ro.js.map +1 -1
- package/lib/locale/ru.d.ts +7 -0
- package/lib/locale/ru.js +7 -0
- package/lib/locale/ru.js.map +1 -1
- package/lib/locale/sk.d.ts +7 -0
- package/lib/locale/sk.js +7 -0
- package/lib/locale/sk.js.map +1 -1
- package/lib/locale/sl.d.ts +7 -0
- package/lib/locale/sl.js +7 -0
- package/lib/locale/sl.js.map +1 -1
- package/lib/locale/sr-Cyrl.d.ts +7 -0
- package/lib/locale/sr-Cyrl.js +7 -0
- package/lib/locale/sr-Cyrl.js.map +1 -1
- package/lib/locale/sr-Latn.d.ts +7 -0
- package/lib/locale/sr-Latn.js +7 -0
- package/lib/locale/sr-Latn.js.map +1 -1
- package/lib/locale/sv.d.ts +7 -0
- package/lib/locale/sv.js +7 -0
- package/lib/locale/sv.js.map +1 -1
- package/lib/locale/th.d.ts +7 -0
- package/lib/locale/th.js +7 -0
- package/lib/locale/th.js.map +1 -1
- package/lib/locale/tr.d.ts +7 -0
- package/lib/locale/tr.js +7 -0
- package/lib/locale/tr.js.map +1 -1
- package/lib/locale/uk.d.ts +7 -0
- package/lib/locale/uk.js +7 -0
- package/lib/locale/uk.js.map +1 -1
- package/lib/locale/vi.d.ts +7 -0
- package/lib/locale/vi.js +7 -0
- package/lib/locale/vi.js.map +1 -1
- package/lib/locale/zh-Hans.d.ts +7 -0
- package/lib/locale/zh-Hans.js +7 -0
- package/lib/locale/zh-Hans.js.map +1 -1
- package/lib/locale/zh-Hant.d.ts +7 -0
- package/lib/locale/zh-Hant.js +7 -0
- package/lib/locale/zh-Hant.js.map +1 -1
- package/package.json +1 -1
package/dist/vuetify.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Vuetify v3.9.
|
2
|
+
* Vuetify v3.9.3-dev.2025-07-30
|
3
3
|
* Forged by John Leider
|
4
4
|
* Released under the MIT License.
|
5
5
|
*/
|
@@ -2617,6 +2617,14 @@
|
|
2617
2617
|
header: 'Enter date',
|
2618
2618
|
input: {
|
2619
2619
|
placeholder: 'Enter date'
|
2620
|
+
},
|
2621
|
+
ariaLabel: {
|
2622
|
+
previousMonth: 'Previous month',
|
2623
|
+
nextMonth: 'Next month',
|
2624
|
+
selectYear: 'Select year',
|
2625
|
+
selectDate: '{0}',
|
2626
|
+
// Full date format
|
2627
|
+
currentDate: 'Today, {0}'
|
2620
2628
|
}
|
2621
2629
|
},
|
2622
2630
|
noDataText: 'No data available',
|
@@ -3155,6 +3163,7 @@
|
|
3155
3163
|
return acc;
|
3156
3164
|
});
|
3157
3165
|
const current = vue.toRef(() => computedThemes.value[name.value]);
|
3166
|
+
const isSystem = vue.toRef(() => _name.value === 'system');
|
3158
3167
|
const styles = vue.computed(() => {
|
3159
3168
|
const lines = [];
|
3160
3169
|
const important = parsedOptions.unimportant ? '' : ' !important';
|
@@ -3242,7 +3251,7 @@
|
|
3242
3251
|
}
|
3243
3252
|
}
|
3244
3253
|
function change(themeName) {
|
3245
|
-
if (!themeNames.value.includes(themeName)) {
|
3254
|
+
if (themeName !== 'system' && !themeNames.value.includes(themeName)) {
|
3246
3255
|
consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
|
3247
3256
|
return;
|
3248
3257
|
}
|
@@ -3275,6 +3284,7 @@
|
|
3275
3284
|
cycle,
|
3276
3285
|
toggle,
|
3277
3286
|
isDisabled: parsedOptions.isDisabled,
|
3287
|
+
isSystem,
|
3278
3288
|
name,
|
3279
3289
|
themes,
|
3280
3290
|
current,
|
@@ -5486,6 +5496,69 @@
|
|
5486
5496
|
};
|
5487
5497
|
}
|
5488
5498
|
|
5499
|
+
// Utilities
|
5500
|
+
|
5501
|
+
// Types
|
5502
|
+
|
5503
|
+
// Composables
|
5504
|
+
const makeChunksProps = propsFactory({
|
5505
|
+
chunkCount: {
|
5506
|
+
type: [Number, String],
|
5507
|
+
default: null
|
5508
|
+
},
|
5509
|
+
chunkWidth: {
|
5510
|
+
type: [Number, String],
|
5511
|
+
default: null
|
5512
|
+
},
|
5513
|
+
chunkGap: {
|
5514
|
+
type: [Number, String],
|
5515
|
+
default: 4
|
5516
|
+
}
|
5517
|
+
}, 'chunks');
|
5518
|
+
function useChunks(props, containerWidth) {
|
5519
|
+
const hasChunks = vue.toRef(() => !!props.chunkCount || !!props.chunkWidth);
|
5520
|
+
const chunkWidth = vue.computed(() => {
|
5521
|
+
const containerSize = vue.toValue(containerWidth);
|
5522
|
+
if (!containerSize) {
|
5523
|
+
return 0;
|
5524
|
+
}
|
5525
|
+
if (!props.chunkCount) {
|
5526
|
+
return Number(props.chunkWidth);
|
5527
|
+
}
|
5528
|
+
const count = Number(props.chunkCount);
|
5529
|
+
const availableWidth = containerSize - Number(props.chunkGap) * (count - 1);
|
5530
|
+
return availableWidth / count;
|
5531
|
+
});
|
5532
|
+
const chunkGap = vue.toRef(() => Number(props.chunkGap));
|
5533
|
+
const chunksMaskStyles = vue.computed(() => {
|
5534
|
+
if (!hasChunks.value) {
|
5535
|
+
return {};
|
5536
|
+
}
|
5537
|
+
const chunkGapPx = convertToUnit(chunkGap.value);
|
5538
|
+
const chunkWidthPx = convertToUnit(chunkWidth.value);
|
5539
|
+
return {
|
5540
|
+
maskRepeat: 'repeat-x',
|
5541
|
+
maskImage: `linear-gradient(90deg, #000, #000 ${chunkWidthPx}, transparent ${chunkWidthPx}, transparent)`,
|
5542
|
+
maskSize: `calc(${chunkWidthPx} + ${chunkGapPx}) 100%`
|
5543
|
+
};
|
5544
|
+
});
|
5545
|
+
function snapValueToChunk(val) {
|
5546
|
+
const containerSize = vue.toValue(containerWidth);
|
5547
|
+
if (!containerSize) {
|
5548
|
+
return val;
|
5549
|
+
}
|
5550
|
+
const gapRelativeSize = 100 * chunkGap.value / containerSize;
|
5551
|
+
const chunkRelativeSize = 100 * (chunkWidth.value + chunkGap.value) / containerSize;
|
5552
|
+
const filledChunks = Math.floor((val + gapRelativeSize) / chunkRelativeSize);
|
5553
|
+
return clamp(0, filledChunks * chunkRelativeSize - gapRelativeSize / 2, 100);
|
5554
|
+
}
|
5555
|
+
return {
|
5556
|
+
hasChunks,
|
5557
|
+
chunksMaskStyles,
|
5558
|
+
snapValueToChunk
|
5559
|
+
};
|
5560
|
+
}
|
5561
|
+
|
5489
5562
|
const makeVProgressLinearProps = propsFactory({
|
5490
5563
|
absolute: Boolean,
|
5491
5564
|
active: {
|
@@ -5520,6 +5593,7 @@
|
|
5520
5593
|
stream: Boolean,
|
5521
5594
|
striped: Boolean,
|
5522
5595
|
roundedBar: Boolean,
|
5596
|
+
...makeChunksProps(),
|
5523
5597
|
...makeComponentProps(),
|
5524
5598
|
...makeLocationProps({
|
5525
5599
|
location: 'top'
|
@@ -5538,6 +5612,7 @@
|
|
5538
5612
|
let {
|
5539
5613
|
slots
|
5540
5614
|
} = _ref;
|
5615
|
+
const root = vue.ref();
|
5541
5616
|
const progress = useProxiedModel(props, 'modelValue');
|
5542
5617
|
const {
|
5543
5618
|
isRtl,
|
@@ -5579,6 +5654,24 @@
|
|
5579
5654
|
const isReversed = vue.computed(() => isRtl.value !== props.reverse);
|
5580
5655
|
const transition = vue.computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
|
5581
5656
|
const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches;
|
5657
|
+
const containerWidth = vue.shallowRef(0);
|
5658
|
+
const {
|
5659
|
+
hasChunks,
|
5660
|
+
chunksMaskStyles,
|
5661
|
+
snapValueToChunk
|
5662
|
+
} = useChunks(props, containerWidth);
|
5663
|
+
useToggleScope(hasChunks, () => {
|
5664
|
+
const {
|
5665
|
+
resizeRef
|
5666
|
+
} = useResizeObserver(entries => containerWidth.value = entries[0].contentRect.width);
|
5667
|
+
vue.watchEffect(() => resizeRef.value = root.value);
|
5668
|
+
});
|
5669
|
+
const bufferWidth = vue.computed(() => {
|
5670
|
+
return hasChunks.value ? snapValueToChunk(normalizedBuffer.value) : normalizedBuffer.value;
|
5671
|
+
});
|
5672
|
+
const barWidth = vue.computed(() => {
|
5673
|
+
return hasChunks.value ? snapValueToChunk(normalizedValue.value) : normalizedValue.value;
|
5674
|
+
});
|
5582
5675
|
function handleClick(e) {
|
5583
5676
|
if (!intersectionRef.value) return;
|
5584
5677
|
const {
|
@@ -5589,8 +5682,11 @@
|
|
5589
5682
|
const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
|
5590
5683
|
progress.value = Math.round(value / width * max.value);
|
5591
5684
|
}
|
5685
|
+
vue.watchEffect(() => {
|
5686
|
+
intersectionRef.value = root.value;
|
5687
|
+
});
|
5592
5688
|
useRender(() => vue.createVNode(props.tag, {
|
5593
|
-
"ref":
|
5689
|
+
"ref": root,
|
5594
5690
|
"class": vue.normalizeClass(['v-progress-linear', {
|
5595
5691
|
'v-progress-linear--absolute': props.absolute,
|
5596
5692
|
'v-progress-linear--active': props.active && isIntersecting.value,
|
@@ -5606,7 +5702,7 @@
|
|
5606
5702
|
height: props.active ? convertToUnit(height.value) : 0,
|
5607
5703
|
'--v-progress-linear-height': convertToUnit(height.value),
|
5608
5704
|
...(props.absolute ? locationStyles.value : {})
|
5609
|
-
}, props.style]),
|
5705
|
+
}, chunksMaskStyles.value, props.style]),
|
5610
5706
|
"role": "progressbar",
|
5611
5707
|
"aria-hidden": props.active ? 'false' : 'true',
|
5612
5708
|
"aria-valuemin": "0",
|
@@ -5636,7 +5732,7 @@
|
|
5636
5732
|
"class": vue.normalizeClass(['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined]),
|
5637
5733
|
"style": vue.normalizeStyle([bufferColorStyles.value, {
|
5638
5734
|
opacity: parseFloat(props.bufferOpacity),
|
5639
|
-
width: convertToUnit(
|
5735
|
+
width: convertToUnit(bufferWidth.value, '%')
|
5640
5736
|
}])
|
5641
5737
|
}, null), vue.createVNode(vue.Transition, {
|
5642
5738
|
"name": transition.value
|
@@ -5644,7 +5740,7 @@
|
|
5644
5740
|
default: () => [!props.indeterminate ? vue.createElementVNode("div", {
|
5645
5741
|
"class": vue.normalizeClass(['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined]),
|
5646
5742
|
"style": vue.normalizeStyle([barColorStyles.value, {
|
5647
|
-
width: convertToUnit(
|
5743
|
+
width: convertToUnit(barWidth.value, '%')
|
5648
5744
|
}])
|
5649
5745
|
}, null) : vue.createElementVNode("div", {
|
5650
5746
|
"class": "v-progress-linear__indeterminate"
|
@@ -5927,8 +6023,8 @@
|
|
5927
6023
|
if (!el?._ripple?.enabled) return;
|
5928
6024
|
const ripples = el.getElementsByClassName('v-ripple__animation');
|
5929
6025
|
if (ripples.length === 0) return;
|
5930
|
-
const animation = ripples
|
5931
|
-
if (animation
|
6026
|
+
const animation = Array.from(ripples).findLast(ripple => !ripple.dataset.isHiding);
|
6027
|
+
if (!animation) return;else animation.dataset.isHiding = 'true';
|
5932
6028
|
const diff = performance.now() - Number(animation.dataset.activated);
|
5933
6029
|
const delay = Math.max(250 - diff, 0);
|
5934
6030
|
setTimeout(() => {
|
@@ -9848,6 +9944,11 @@
|
|
9848
9944
|
const isLink = vue.toRef(() => props.link !== false && link.isLink.value);
|
9849
9945
|
const isSelectable = vue.computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
|
9850
9946
|
const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
|
9947
|
+
const role = vue.computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
|
9948
|
+
const ariaSelected = vue.computed(() => {
|
9949
|
+
if (!isSelectable.value) return undefined;
|
9950
|
+
return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
|
9951
|
+
});
|
9851
9952
|
const roundedProps = vue.toRef(() => props.rounded || props.nav);
|
9852
9953
|
const color = vue.toRef(() => props.color ?? props.activeColor);
|
9853
9954
|
const variantProps = vue.toRef(() => ({
|
@@ -9951,7 +10052,8 @@
|
|
9951
10052
|
}, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
|
9952
10053
|
"style": [colorStyles.value, dimensionStyles.value, props.style],
|
9953
10054
|
"tabindex": isClickable.value ? list ? -2 : 0 : undefined,
|
9954
|
-
"aria-selected":
|
10055
|
+
"aria-selected": ariaSelected.value,
|
10056
|
+
"role": role.value,
|
9955
10057
|
"onClick": onClick,
|
9956
10058
|
"onKeydown": isClickable.value && !isLink.value && onKeyDown
|
9957
10059
|
}, link.linkProps), {
|
@@ -10146,11 +10248,9 @@
|
|
10146
10248
|
let {
|
10147
10249
|
props: activatorProps
|
10148
10250
|
} = _ref3;
|
10149
|
-
const listItemProps = {
|
10150
|
-
...itemProps,
|
10151
|
-
...activatorProps,
|
10251
|
+
const listItemProps = vue.mergeProps(itemProps, activatorProps, {
|
10152
10252
|
value: props.returnObject ? item : itemProps.value
|
10153
|
-
};
|
10253
|
+
});
|
10154
10254
|
return slots.header ? slots.header({
|
10155
10255
|
props: listItemProps
|
10156
10256
|
}) : vue.createVNode(VListItem, listItemProps, slotsWithItem);
|
@@ -10453,6 +10553,7 @@
|
|
10453
10553
|
const activeColor = vue.toRef(() => props.activeColor);
|
10454
10554
|
const baseColor = vue.toRef(() => props.baseColor);
|
10455
10555
|
const color = vue.toRef(() => props.color);
|
10556
|
+
const isSelectable = vue.toRef(() => props.selectable || props.activatable);
|
10456
10557
|
createList({
|
10457
10558
|
filterable: props.filterable
|
10458
10559
|
});
|
@@ -10524,7 +10625,7 @@
|
|
10524
10625
|
}, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class]),
|
10525
10626
|
"style": vue.normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style]),
|
10526
10627
|
"tabindex": props.disabled ? -1 : 0,
|
10527
|
-
"role":
|
10628
|
+
"role": isSelectable.value ? 'listbox' : 'list',
|
10528
10629
|
"aria-activedescendant": undefined,
|
10529
10630
|
"onFocusin": onFocusin,
|
10530
10631
|
"onFocusout": onFocusout,
|
@@ -13603,6 +13704,7 @@
|
|
13603
13704
|
"onKeydown": onListKeydown,
|
13604
13705
|
"onFocusin": onFocusin,
|
13605
13706
|
"tabindex": "-1",
|
13707
|
+
"selectable": true,
|
13606
13708
|
"aria-live": "polite",
|
13607
13709
|
"aria-label": `${props.label}-list`,
|
13608
13710
|
"color": props.itemColor ?? props.color
|
@@ -14222,6 +14324,7 @@
|
|
14222
14324
|
"onFocusin": onFocusin,
|
14223
14325
|
"onFocusout": onFocusout,
|
14224
14326
|
"tabindex": "-1",
|
14327
|
+
"selectable": true,
|
14225
14328
|
"aria-live": "polite",
|
14226
14329
|
"color": props.itemColor ?? props.color
|
14227
14330
|
}, listEvents, props.listProps), {
|
@@ -16554,6 +16657,7 @@
|
|
16554
16657
|
const numTicks = vue.computed(() => (max.value - min.value) / step.value);
|
16555
16658
|
const disabled = vue.toRef(() => props.disabled);
|
16556
16659
|
const thumbColor = vue.computed(() => props.error || props.disabled ? undefined : props.thumbColor ?? props.color);
|
16660
|
+
const thumbLabelColor = vue.computed(() => props.error || props.disabled ? undefined : props.thumbColor);
|
16557
16661
|
const trackColor = vue.computed(() => props.error || props.disabled ? undefined : props.trackColor ?? props.color);
|
16558
16662
|
const trackFillColor = vue.computed(() => props.error || props.disabled ? undefined : props.trackFillColor ?? props.color);
|
16559
16663
|
const mousePressed = vue.shallowRef(false);
|
@@ -16711,6 +16815,7 @@
|
|
16711
16815
|
step,
|
16712
16816
|
thumbSize,
|
16713
16817
|
thumbColor,
|
16818
|
+
thumbLabelColor,
|
16714
16819
|
thumbLabel: vue.toRef(() => props.thumbLabel),
|
16715
16820
|
ticks: vue.toRef(() => props.ticks),
|
16716
16821
|
tickSize,
|
@@ -16776,6 +16881,7 @@
|
|
16776
16881
|
min,
|
16777
16882
|
max,
|
16778
16883
|
thumbColor,
|
16884
|
+
thumbLabelColor,
|
16779
16885
|
step,
|
16780
16886
|
disabled,
|
16781
16887
|
thumbSize,
|
@@ -16797,6 +16903,10 @@
|
|
16797
16903
|
textColorClasses,
|
16798
16904
|
textColorStyles
|
16799
16905
|
} = useTextColor(thumbColor);
|
16906
|
+
const {
|
16907
|
+
backgroundColorClasses,
|
16908
|
+
backgroundColorStyles
|
16909
|
+
} = useBackgroundColor(thumbLabelColor);
|
16800
16910
|
const {
|
16801
16911
|
pageup,
|
16802
16912
|
pagedown,
|
@@ -16862,9 +16972,7 @@
|
|
16862
16972
|
"onKeydown": !readonly.value ? onKeydown : undefined
|
16863
16973
|
}, [vue.createElementVNode("div", {
|
16864
16974
|
"class": vue.normalizeClass(['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value]),
|
16865
|
-
"style":
|
16866
|
-
...textColorStyles.value
|
16867
|
-
}
|
16975
|
+
"style": vue.normalizeStyle(textColorStyles.value)
|
16868
16976
|
}, null), vue.withDirectives(vue.createElementVNode("div", {
|
16869
16977
|
"class": vue.normalizeClass(['v-slider-thumb__ripple', textColorClasses.value]),
|
16870
16978
|
"style": vue.normalizeStyle(textColorStyles.value)
|
@@ -16877,10 +16985,13 @@
|
|
16877
16985
|
default: () => [vue.withDirectives(vue.createElementVNode("div", {
|
16878
16986
|
"class": "v-slider-thumb__label-container"
|
16879
16987
|
}, [vue.createElementVNode("div", {
|
16880
|
-
"class": vue.normalizeClass(['v-slider-thumb__label',
|
16988
|
+
"class": vue.normalizeClass(['v-slider-thumb__label', backgroundColorClasses.value]),
|
16989
|
+
"style": vue.normalizeStyle(backgroundColorStyles.value)
|
16881
16990
|
}, [vue.createElementVNode("div", null, [slots['thumb-label']?.({
|
16882
16991
|
modelValue: props.modelValue
|
16883
|
-
}) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])
|
16992
|
+
}) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)]), vue.createElementVNode("div", {
|
16993
|
+
"class": "v-slider-thumb__label-wedge"
|
16994
|
+
}, null)])]), [[vue.vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
|
16884
16995
|
})]);
|
16885
16996
|
});
|
16886
16997
|
return {};
|
@@ -19027,19 +19138,23 @@
|
|
19027
19138
|
get: () => {
|
19028
19139
|
return _search.value;
|
19029
19140
|
},
|
19030
|
-
set: val => {
|
19141
|
+
set: async val => {
|
19031
19142
|
_search.value = val ?? '';
|
19032
19143
|
if (!props.multiple && !hasSelectionSlot.value) {
|
19033
19144
|
model.value = [transformItem$3(props, val)];
|
19034
19145
|
vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
|
19035
19146
|
}
|
19036
19147
|
if (val && props.multiple && props.delimiters?.length) {
|
19037
|
-
const
|
19148
|
+
const signsToMatch = props.delimiters.map(escapeForRegex).join('|');
|
19149
|
+
const values = val.split(new RegExp(`(?:${signsToMatch})+`));
|
19038
19150
|
if (values.length > 1) {
|
19039
|
-
|
19151
|
+
for (let v of values) {
|
19040
19152
|
v = v.trim();
|
19041
|
-
if (v)
|
19042
|
-
|
19153
|
+
if (v) {
|
19154
|
+
select(transformItem$3(props, v));
|
19155
|
+
await vue.nextTick();
|
19156
|
+
}
|
19157
|
+
}
|
19043
19158
|
_search.value = '';
|
19044
19159
|
}
|
19045
19160
|
}
|
@@ -19321,6 +19436,7 @@
|
|
19321
19436
|
"selected": selectedValues.value,
|
19322
19437
|
"selectStrategy": props.multiple ? 'independent' : 'single-independent',
|
19323
19438
|
"onMousedown": e => e.preventDefault(),
|
19439
|
+
"selectable": true,
|
19324
19440
|
"onKeydown": onListKeydown,
|
19325
19441
|
"onFocusin": onFocusin,
|
19326
19442
|
"onFocusout": onFocusout,
|
@@ -22894,6 +23010,9 @@
|
|
22894
23010
|
let {
|
22895
23011
|
emit
|
22896
23012
|
} = _ref;
|
23013
|
+
const {
|
23014
|
+
t
|
23015
|
+
} = useLocale();
|
22897
23016
|
const disableMonth = vue.computed(() => {
|
22898
23017
|
return Array.isArray(props.disabled) ? props.disabled.includes('text') : !!props.disabled;
|
22899
23018
|
});
|
@@ -22940,6 +23059,7 @@
|
|
22940
23059
|
"density": "comfortable",
|
22941
23060
|
"icon": props.modeIcon,
|
22942
23061
|
"variant": "text",
|
23062
|
+
"aria-label": t('$vuetify.datePicker.ariaLabel.selectYear'),
|
22943
23063
|
"onClick": onClickYear
|
22944
23064
|
}, null), vue.createVNode(VSpacer, null, null), vue.createElementVNode("div", {
|
22945
23065
|
"class": "v-date-picker-controls__month"
|
@@ -22949,6 +23069,7 @@
|
|
22949
23069
|
"density": "comfortable",
|
22950
23070
|
"icon": props.prevIcon,
|
22951
23071
|
"variant": "text",
|
23072
|
+
"aria-label": t('$vuetify.datePicker.ariaLabel.previousMonth'),
|
22952
23073
|
"onClick": onClickPrev
|
22953
23074
|
}, null), vue.createVNode(VBtn, {
|
22954
23075
|
"data-testid": "next-month",
|
@@ -22956,6 +23077,7 @@
|
|
22956
23077
|
"icon": props.nextIcon,
|
22957
23078
|
"density": "comfortable",
|
22958
23079
|
"variant": "text",
|
23080
|
+
"aria-label": t('$vuetify.datePicker.ariaLabel.nextMonth'),
|
22959
23081
|
"onClick": onClickNext
|
22960
23082
|
}, null)])]);
|
22961
23083
|
});
|
@@ -23220,6 +23342,9 @@
|
|
23220
23342
|
slots
|
23221
23343
|
} = _ref;
|
23222
23344
|
const daysRef = vue.ref();
|
23345
|
+
const {
|
23346
|
+
t
|
23347
|
+
} = useLocale();
|
23223
23348
|
const {
|
23224
23349
|
daysInMonth,
|
23225
23350
|
model,
|
@@ -23276,6 +23401,11 @@
|
|
23276
23401
|
model.value = [rangeStart.value];
|
23277
23402
|
}
|
23278
23403
|
}
|
23404
|
+
function getDateAriaLabel(item) {
|
23405
|
+
const fullDate = adapter.format(item.date, 'fullDateWithWeekday');
|
23406
|
+
const localeKey = item.isToday ? 'currentDate' : 'selectDate';
|
23407
|
+
return t(`$vuetify.datePicker.ariaLabel.${localeKey}`, fullDate);
|
23408
|
+
}
|
23279
23409
|
function onMultipleClick(value) {
|
23280
23410
|
const index = model.value.findIndex(selection => adapter.isSameDay(selection, value));
|
23281
23411
|
if (index === -1) {
|
@@ -23327,6 +23457,8 @@
|
|
23327
23457
|
ripple: false,
|
23328
23458
|
text: item.localized,
|
23329
23459
|
variant: item.isSelected ? 'flat' : item.isToday ? 'outlined' : 'text',
|
23460
|
+
'aria-label': getDateAriaLabel(item),
|
23461
|
+
'aria-current': item.isToday ? 'date' : undefined,
|
23330
23462
|
onClick: () => onClick(item.date)
|
23331
23463
|
},
|
23332
23464
|
item,
|
@@ -23381,11 +23513,13 @@
|
|
23381
23513
|
}
|
23382
23514
|
return createRange(12).map(i => {
|
23383
23515
|
const text = adapter.format(date, 'monthShort');
|
23516
|
+
const label = adapter.format(date, 'month');
|
23384
23517
|
const isDisabled = !!(!isMonthAllowed(i) || props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
|
23385
23518
|
date = adapter.getNextMonth(date);
|
23386
23519
|
return {
|
23387
23520
|
isDisabled,
|
23388
23521
|
text,
|
23522
|
+
label,
|
23389
23523
|
value: i
|
23390
23524
|
};
|
23391
23525
|
});
|
@@ -23412,6 +23546,7 @@
|
|
23412
23546
|
}, [months.value.map((month, i) => {
|
23413
23547
|
const btnProps = {
|
23414
23548
|
active: model.value === i,
|
23549
|
+
ariaLabel: month.label,
|
23415
23550
|
color: model.value === i ? props.color : undefined,
|
23416
23551
|
disabled: month.isDisabled,
|
23417
23552
|
rounded: true,
|
@@ -24418,6 +24553,42 @@
|
|
24418
24553
|
return item.isDirectory ? `${path}/${item.name}` : path;
|
24419
24554
|
}
|
24420
24555
|
|
24556
|
+
// Utilities
|
24557
|
+
// Composables
|
24558
|
+
const makeFileFilterProps = propsFactory({
|
24559
|
+
filterByType: String
|
24560
|
+
}, 'file-accept');
|
24561
|
+
function useFileFilter(props) {
|
24562
|
+
const fileFilter = vue.computed(() => props.filterByType ? createFilter(props.filterByType) : null);
|
24563
|
+
function filterAccepted(files) {
|
24564
|
+
if (fileFilter.value) {
|
24565
|
+
const accepted = files.filter(fileFilter.value);
|
24566
|
+
return {
|
24567
|
+
accepted,
|
24568
|
+
rejected: files.filter(f => !accepted.includes(f))
|
24569
|
+
};
|
24570
|
+
}
|
24571
|
+
return {
|
24572
|
+
accepted: files,
|
24573
|
+
rejected: []
|
24574
|
+
};
|
24575
|
+
}
|
24576
|
+
return {
|
24577
|
+
filterAccepted
|
24578
|
+
};
|
24579
|
+
}
|
24580
|
+
function createFilter(v) {
|
24581
|
+
const types = v.split(',').map(x => x.trim().toLowerCase());
|
24582
|
+
const extensionsToMatch = types.filter(x => x.startsWith('.'));
|
24583
|
+
const wildcards = types.filter(x => x.endsWith('/*'));
|
24584
|
+
const typesToMatch = types.filter(x => !extensionsToMatch.includes(x) && !wildcards.includes(x));
|
24585
|
+
return file => {
|
24586
|
+
const extension = file.name.split('.').at(-1)?.toLowerCase() ?? '';
|
24587
|
+
const typeGroup = file.type.split('/').at(0)?.toLowerCase() ?? '';
|
24588
|
+
return typesToMatch.includes(file.type) || extensionsToMatch.includes(`.${extension}`) || wildcards.includes(`${typeGroup}/*`);
|
24589
|
+
};
|
24590
|
+
}
|
24591
|
+
|
24421
24592
|
// Types
|
24422
24593
|
|
24423
24594
|
const makeVFileInputProps = propsFactory({
|
@@ -24450,6 +24621,7 @@
|
|
24450
24621
|
return wrapInArray(val).every(v => v != null && typeof v === 'object');
|
24451
24622
|
}
|
24452
24623
|
},
|
24624
|
+
...makeFileFilterProps(),
|
24453
24625
|
...makeVFieldProps({
|
24454
24626
|
clearable: true
|
24455
24627
|
})
|
@@ -24462,7 +24634,8 @@
|
|
24462
24634
|
'click:control': e => true,
|
24463
24635
|
'mousedown:control': e => true,
|
24464
24636
|
'update:focused': focused => true,
|
24465
|
-
'update:modelValue': files => true
|
24637
|
+
'update:modelValue': files => true,
|
24638
|
+
rejected: files => true
|
24466
24639
|
},
|
24467
24640
|
setup(props, _ref) {
|
24468
24641
|
let {
|
@@ -24473,6 +24646,9 @@
|
|
24473
24646
|
const {
|
24474
24647
|
t
|
24475
24648
|
} = useLocale();
|
24649
|
+
const {
|
24650
|
+
filterAccepted
|
24651
|
+
} = useFileFilter(props);
|
24476
24652
|
const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val);
|
24477
24653
|
const {
|
24478
24654
|
isFocused,
|
@@ -24546,14 +24722,38 @@
|
|
24546
24722
|
e.stopImmediatePropagation();
|
24547
24723
|
isDragging.value = false;
|
24548
24724
|
if (!inputRef.value || !hasFilesOrFolders(e)) return;
|
24725
|
+
const allDroppedFiles = await handleDrop(e);
|
24726
|
+
selectAccepted(allDroppedFiles);
|
24727
|
+
}
|
24728
|
+
function onFileSelection(e) {
|
24729
|
+
if (!e.target || e.repack) return; // prevent loop
|
24730
|
+
|
24731
|
+
if (!props.filterByType) {
|
24732
|
+
const target = e.target;
|
24733
|
+
model.value = [...(target.files ?? [])];
|
24734
|
+
} else {
|
24735
|
+
selectAccepted([...e.target.files]);
|
24736
|
+
}
|
24737
|
+
}
|
24738
|
+
function selectAccepted(files) {
|
24549
24739
|
const dataTransfer = new DataTransfer();
|
24550
|
-
|
24740
|
+
const {
|
24741
|
+
accepted,
|
24742
|
+
rejected
|
24743
|
+
} = filterAccepted(files);
|
24744
|
+
if (rejected.length) {
|
24745
|
+
emit('rejected', rejected);
|
24746
|
+
}
|
24747
|
+
for (const file of accepted) {
|
24551
24748
|
dataTransfer.items.add(file);
|
24552
24749
|
}
|
24553
24750
|
inputRef.value.files = dataTransfer.files;
|
24554
|
-
|
24751
|
+
model.value = [...dataTransfer.files];
|
24752
|
+
const event = new Event('change', {
|
24555
24753
|
bubbles: true
|
24556
|
-
})
|
24754
|
+
});
|
24755
|
+
event.repack = true;
|
24756
|
+
inputRef.value.dispatchEvent(event);
|
24557
24757
|
}
|
24558
24758
|
vue.watch(model, newValue => {
|
24559
24759
|
const hasModelReset = !Array.isArray(newValue) || !newValue.length;
|
@@ -24570,6 +24770,8 @@
|
|
24570
24770
|
...inputProps
|
24571
24771
|
} = VInput.filterProps(props);
|
24572
24772
|
const fieldProps = VField.filterProps(props);
|
24773
|
+
const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
|
24774
|
+
const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
|
24573
24775
|
return vue.createVNode(VInput, vue.mergeProps({
|
24574
24776
|
"ref": vInputRef,
|
24575
24777
|
"modelValue": props.multiple ? model.value : model.value[0],
|
@@ -24625,6 +24827,7 @@
|
|
24625
24827
|
return vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("input", vue.mergeProps({
|
24626
24828
|
"ref": inputRef,
|
24627
24829
|
"type": "file",
|
24830
|
+
"accept": inputAccept,
|
24628
24831
|
"readonly": isReadonly.value,
|
24629
24832
|
"disabled": isDisabled.value,
|
24630
24833
|
"multiple": props.multiple,
|
@@ -24634,11 +24837,7 @@
|
|
24634
24837
|
if (isReadonly.value) e.preventDefault();
|
24635
24838
|
onFocus();
|
24636
24839
|
},
|
24637
|
-
"onChange":
|
24638
|
-
if (!e.target) return;
|
24639
|
-
const target = e.target;
|
24640
|
-
model.value = [...(target.files ?? [])];
|
24641
|
-
},
|
24840
|
+
"onChange": onFileSelection,
|
24642
24841
|
"onDragleave": onDragleave,
|
24643
24842
|
"onFocus": onFocus,
|
24644
24843
|
"onBlur": blur
|
@@ -31436,7 +31635,7 @@
|
|
31436
31635
|
};
|
31437
31636
|
});
|
31438
31637
|
}
|
31439
|
-
const version$1 = "3.9.
|
31638
|
+
const version$1 = "3.9.3-dev.2025-07-30";
|
31440
31639
|
createVuetify$1.version = version$1;
|
31441
31640
|
|
31442
31641
|
// Vue's inject() can only be used in setup
|
@@ -31461,7 +31660,7 @@
|
|
31461
31660
|
...options
|
31462
31661
|
});
|
31463
31662
|
};
|
31464
|
-
const version = "3.9.
|
31663
|
+
const version = "3.9.3-dev.2025-07-30";
|
31465
31664
|
createVuetify.version = version;
|
31466
31665
|
|
31467
31666
|
exports.blueprints = index;
|