@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.
Files changed (206) hide show
  1. package/CHANGELOG.md +8 -53
  2. package/dist/json/attributes.json +3804 -3784
  3. package/dist/json/importMap-labs.json +28 -28
  4. package/dist/json/importMap.json +192 -192
  5. package/dist/json/tags.json +5 -0
  6. package/dist/json/web-types.json +6986 -6916
  7. package/dist/vuetify-labs.cjs +272 -44
  8. package/dist/vuetify-labs.css +5500 -5503
  9. package/dist/vuetify-labs.d.ts +132 -69
  10. package/dist/vuetify-labs.esm.js +272 -44
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +272 -44
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +234 -35
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4797 -4800
  17. package/dist/vuetify.d.ts +122 -69
  18. package/dist/vuetify.esm.js +234 -35
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +234 -35
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +792 -768
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.js +1 -0
  26. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  27. package/lib/components/VCombobox/VCombobox.js +11 -6
  28. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  29. package/lib/components/VDatePicker/VDatePickerControls.js +8 -1
  30. package/lib/components/VDatePicker/VDatePickerControls.js.map +1 -1
  31. package/lib/components/VDatePicker/VDatePickerMonth.js +11 -0
  32. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  33. package/lib/components/VDatePicker/VDatePickerMonths.js +3 -0
  34. package/lib/components/VDatePicker/VDatePickerMonths.js.map +1 -1
  35. package/lib/components/VFileInput/VFileInput.d.ts +15 -0
  36. package/lib/components/VFileInput/VFileInput.js +38 -9
  37. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  38. package/lib/components/VList/VList.js +2 -1
  39. package/lib/components/VList/VList.js.map +1 -1
  40. package/lib/components/VList/VListChildren.js +3 -4
  41. package/lib/components/VList/VListChildren.js.map +1 -1
  42. package/lib/components/VList/VListItem.js +7 -1
  43. package/lib/components/VList/VListItem.js.map +1 -1
  44. package/lib/components/VProgressLinear/VProgressLinear.css +1 -1
  45. package/lib/components/VProgressLinear/VProgressLinear.d.ts +75 -0
  46. package/lib/components/VProgressLinear/VProgressLinear.js +32 -6
  47. package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
  48. package/lib/components/VProgressLinear/VProgressLinear.sass +1 -1
  49. package/lib/components/VProgressLinear/chunks.d.ts +55 -0
  50. package/lib/components/VProgressLinear/chunks.js +62 -0
  51. package/lib/components/VProgressLinear/chunks.js.map +1 -0
  52. package/lib/components/VSelect/VSelect.js +1 -0
  53. package/lib/components/VSelect/VSelect.js.map +1 -1
  54. package/lib/components/VSlider/VSliderThumb.css +9 -14
  55. package/lib/components/VSlider/VSliderThumb.js +13 -7
  56. package/lib/components/VSlider/VSliderThumb.js.map +1 -1
  57. package/lib/components/VSlider/VSliderThumb.sass +9 -14
  58. package/lib/components/VSlider/slider.d.ts +1 -0
  59. package/lib/components/VSlider/slider.js +2 -0
  60. package/lib/components/VSlider/slider.js.map +1 -1
  61. package/lib/composables/fileFilter.d.ts +18 -0
  62. package/lib/composables/fileFilter.js +38 -0
  63. package/lib/composables/fileFilter.js.map +1 -0
  64. package/lib/composables/theme.d.ts +1 -0
  65. package/lib/composables/theme.js +3 -1
  66. package/lib/composables/theme.js.map +1 -1
  67. package/lib/directives/ripple/index.js +2 -2
  68. package/lib/directives/ripple/index.js.map +1 -1
  69. package/lib/entry-bundler.js +1 -1
  70. package/lib/entry-bundler.js.map +1 -1
  71. package/lib/framework.d.ts +70 -69
  72. package/lib/framework.js +1 -1
  73. package/lib/framework.js.map +1 -1
  74. package/lib/labs/VFileUpload/VFileUpload.d.ts +15 -0
  75. package/lib/labs/VFileUpload/VFileUpload.js +39 -9
  76. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  77. package/lib/locale/af.d.ts +7 -0
  78. package/lib/locale/af.js +7 -0
  79. package/lib/locale/af.js.map +1 -1
  80. package/lib/locale/ar.d.ts +7 -0
  81. package/lib/locale/ar.js +13 -6
  82. package/lib/locale/ar.js.map +1 -1
  83. package/lib/locale/az.d.ts +7 -0
  84. package/lib/locale/az.js +7 -0
  85. package/lib/locale/az.js.map +1 -1
  86. package/lib/locale/bg.d.ts +7 -0
  87. package/lib/locale/bg.js +7 -0
  88. package/lib/locale/bg.js.map +1 -1
  89. package/lib/locale/ca.d.ts +7 -0
  90. package/lib/locale/ca.js +7 -0
  91. package/lib/locale/ca.js.map +1 -1
  92. package/lib/locale/ckb.d.ts +7 -0
  93. package/lib/locale/ckb.js +7 -0
  94. package/lib/locale/ckb.js.map +1 -1
  95. package/lib/locale/cs.d.ts +7 -0
  96. package/lib/locale/cs.js +7 -0
  97. package/lib/locale/cs.js.map +1 -1
  98. package/lib/locale/da.d.ts +7 -0
  99. package/lib/locale/da.js +7 -0
  100. package/lib/locale/da.js.map +1 -1
  101. package/lib/locale/de.d.ts +7 -0
  102. package/lib/locale/de.js +7 -0
  103. package/lib/locale/de.js.map +1 -1
  104. package/lib/locale/el.d.ts +7 -0
  105. package/lib/locale/el.js +7 -0
  106. package/lib/locale/el.js.map +1 -1
  107. package/lib/locale/en.d.ts +7 -0
  108. package/lib/locale/en.js +8 -0
  109. package/lib/locale/en.js.map +1 -1
  110. package/lib/locale/es.d.ts +7 -0
  111. package/lib/locale/es.js +7 -0
  112. package/lib/locale/es.js.map +1 -1
  113. package/lib/locale/et.d.ts +7 -0
  114. package/lib/locale/et.js +7 -0
  115. package/lib/locale/et.js.map +1 -1
  116. package/lib/locale/fa.d.ts +7 -0
  117. package/lib/locale/fa.js +7 -0
  118. package/lib/locale/fa.js.map +1 -1
  119. package/lib/locale/fi.d.ts +7 -0
  120. package/lib/locale/fi.js +7 -0
  121. package/lib/locale/fi.js.map +1 -1
  122. package/lib/locale/fr.d.ts +7 -0
  123. package/lib/locale/fr.js +7 -0
  124. package/lib/locale/fr.js.map +1 -1
  125. package/lib/locale/he.d.ts +7 -0
  126. package/lib/locale/he.js +7 -0
  127. package/lib/locale/he.js.map +1 -1
  128. package/lib/locale/hr.d.ts +7 -0
  129. package/lib/locale/hr.js +7 -0
  130. package/lib/locale/hr.js.map +1 -1
  131. package/lib/locale/hu.d.ts +7 -0
  132. package/lib/locale/hu.js +7 -0
  133. package/lib/locale/hu.js.map +1 -1
  134. package/lib/locale/id.d.ts +7 -0
  135. package/lib/locale/id.js +7 -0
  136. package/lib/locale/id.js.map +1 -1
  137. package/lib/locale/it.d.ts +7 -0
  138. package/lib/locale/it.js +7 -0
  139. package/lib/locale/it.js.map +1 -1
  140. package/lib/locale/ja.d.ts +7 -0
  141. package/lib/locale/ja.js +7 -0
  142. package/lib/locale/ja.js.map +1 -1
  143. package/lib/locale/km.d.ts +7 -0
  144. package/lib/locale/km.js +7 -0
  145. package/lib/locale/km.js.map +1 -1
  146. package/lib/locale/ko.d.ts +7 -0
  147. package/lib/locale/ko.js +7 -0
  148. package/lib/locale/ko.js.map +1 -1
  149. package/lib/locale/lt.d.ts +7 -0
  150. package/lib/locale/lt.js +7 -0
  151. package/lib/locale/lt.js.map +1 -1
  152. package/lib/locale/lv.d.ts +7 -0
  153. package/lib/locale/lv.js +7 -0
  154. package/lib/locale/lv.js.map +1 -1
  155. package/lib/locale/nl.d.ts +7 -0
  156. package/lib/locale/nl.js +7 -0
  157. package/lib/locale/nl.js.map +1 -1
  158. package/lib/locale/no.d.ts +7 -0
  159. package/lib/locale/no.js +7 -0
  160. package/lib/locale/no.js.map +1 -1
  161. package/lib/locale/pl.d.ts +7 -0
  162. package/lib/locale/pl.js +7 -0
  163. package/lib/locale/pl.js.map +1 -1
  164. package/lib/locale/pt.d.ts +7 -0
  165. package/lib/locale/pt.js +7 -0
  166. package/lib/locale/pt.js.map +1 -1
  167. package/lib/locale/ro.d.ts +7 -0
  168. package/lib/locale/ro.js +7 -0
  169. package/lib/locale/ro.js.map +1 -1
  170. package/lib/locale/ru.d.ts +7 -0
  171. package/lib/locale/ru.js +7 -0
  172. package/lib/locale/ru.js.map +1 -1
  173. package/lib/locale/sk.d.ts +7 -0
  174. package/lib/locale/sk.js +7 -0
  175. package/lib/locale/sk.js.map +1 -1
  176. package/lib/locale/sl.d.ts +7 -0
  177. package/lib/locale/sl.js +7 -0
  178. package/lib/locale/sl.js.map +1 -1
  179. package/lib/locale/sr-Cyrl.d.ts +7 -0
  180. package/lib/locale/sr-Cyrl.js +7 -0
  181. package/lib/locale/sr-Cyrl.js.map +1 -1
  182. package/lib/locale/sr-Latn.d.ts +7 -0
  183. package/lib/locale/sr-Latn.js +7 -0
  184. package/lib/locale/sr-Latn.js.map +1 -1
  185. package/lib/locale/sv.d.ts +7 -0
  186. package/lib/locale/sv.js +7 -0
  187. package/lib/locale/sv.js.map +1 -1
  188. package/lib/locale/th.d.ts +7 -0
  189. package/lib/locale/th.js +7 -0
  190. package/lib/locale/th.js.map +1 -1
  191. package/lib/locale/tr.d.ts +7 -0
  192. package/lib/locale/tr.js +7 -0
  193. package/lib/locale/tr.js.map +1 -1
  194. package/lib/locale/uk.d.ts +7 -0
  195. package/lib/locale/uk.js +7 -0
  196. package/lib/locale/uk.js.map +1 -1
  197. package/lib/locale/vi.d.ts +7 -0
  198. package/lib/locale/vi.js +7 -0
  199. package/lib/locale/vi.js.map +1 -1
  200. package/lib/locale/zh-Hans.d.ts +7 -0
  201. package/lib/locale/zh-Hans.js +7 -0
  202. package/lib/locale/zh-Hans.js.map +1 -1
  203. package/lib/locale/zh-Hant.d.ts +7 -0
  204. package/lib/locale/zh-Hant.js +7 -0
  205. package/lib/locale/zh-Hant.js.map +1 -1
  206. package/package.json +1 -1
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.9.2-master.2025-07-28
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": intersectionRef,
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(normalizedBuffer.value, '%')
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(normalizedValue.value, '%')
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[ripples.length - 1];
5931
- if (animation.dataset.isHiding) return;else animation.dataset.isHiding = 'true';
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": isSelectable.value ? root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value : undefined,
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": "listbox",
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', textColorClasses.value])
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)])])]), [[vue.vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
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 values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
19148
+ const signsToMatch = props.delimiters.map(escapeForRegex).join('|');
19149
+ const values = val.split(new RegExp(`(?:${signsToMatch})+`));
19038
19150
  if (values.length > 1) {
19039
- values.forEach(v => {
19151
+ for (let v of values) {
19040
19152
  v = v.trim();
19041
- if (v) select(transformItem$3(props, 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
- for (const file of await handleDrop(e)) {
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
- inputRef.value.dispatchEvent(new Event('change', {
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": e => {
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.2-master.2025-07-28";
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.2-master.2025-07-28";
31663
+ const version = "3.9.3-dev.2025-07-30";
31465
31664
  createVuetify.version = version;
31466
31665
 
31467
31666
  exports.blueprints = index;