@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
@@ -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
  */
@@ -2613,6 +2613,14 @@ var en = {
2613
2613
  header: 'Enter date',
2614
2614
  input: {
2615
2615
  placeholder: 'Enter date'
2616
+ },
2617
+ ariaLabel: {
2618
+ previousMonth: 'Previous month',
2619
+ nextMonth: 'Next month',
2620
+ selectYear: 'Select year',
2621
+ selectDate: '{0}',
2622
+ // Full date format
2623
+ currentDate: 'Today, {0}'
2616
2624
  }
2617
2625
  },
2618
2626
  noDataText: 'No data available',
@@ -3151,6 +3159,7 @@ function createTheme(options) {
3151
3159
  return acc;
3152
3160
  });
3153
3161
  const current = toRef(() => computedThemes.value[name.value]);
3162
+ const isSystem = toRef(() => _name.value === 'system');
3154
3163
  const styles = computed(() => {
3155
3164
  const lines = [];
3156
3165
  const important = parsedOptions.unimportant ? '' : ' !important';
@@ -3238,7 +3247,7 @@ function createTheme(options) {
3238
3247
  }
3239
3248
  }
3240
3249
  function change(themeName) {
3241
- if (!themeNames.value.includes(themeName)) {
3250
+ if (themeName !== 'system' && !themeNames.value.includes(themeName)) {
3242
3251
  consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3243
3252
  return;
3244
3253
  }
@@ -3271,6 +3280,7 @@ function createTheme(options) {
3271
3280
  cycle,
3272
3281
  toggle,
3273
3282
  isDisabled: parsedOptions.isDisabled,
3283
+ isSystem,
3274
3284
  name,
3275
3285
  themes,
3276
3286
  current,
@@ -5482,6 +5492,69 @@ function useLocation(props) {
5482
5492
  };
5483
5493
  }
5484
5494
 
5495
+ // Utilities
5496
+
5497
+ // Types
5498
+
5499
+ // Composables
5500
+ const makeChunksProps = propsFactory({
5501
+ chunkCount: {
5502
+ type: [Number, String],
5503
+ default: null
5504
+ },
5505
+ chunkWidth: {
5506
+ type: [Number, String],
5507
+ default: null
5508
+ },
5509
+ chunkGap: {
5510
+ type: [Number, String],
5511
+ default: 4
5512
+ }
5513
+ }, 'chunks');
5514
+ function useChunks(props, containerWidth) {
5515
+ const hasChunks = toRef(() => !!props.chunkCount || !!props.chunkWidth);
5516
+ const chunkWidth = computed(() => {
5517
+ const containerSize = toValue(containerWidth);
5518
+ if (!containerSize) {
5519
+ return 0;
5520
+ }
5521
+ if (!props.chunkCount) {
5522
+ return Number(props.chunkWidth);
5523
+ }
5524
+ const count = Number(props.chunkCount);
5525
+ const availableWidth = containerSize - Number(props.chunkGap) * (count - 1);
5526
+ return availableWidth / count;
5527
+ });
5528
+ const chunkGap = toRef(() => Number(props.chunkGap));
5529
+ const chunksMaskStyles = computed(() => {
5530
+ if (!hasChunks.value) {
5531
+ return {};
5532
+ }
5533
+ const chunkGapPx = convertToUnit(chunkGap.value);
5534
+ const chunkWidthPx = convertToUnit(chunkWidth.value);
5535
+ return {
5536
+ maskRepeat: 'repeat-x',
5537
+ maskImage: `linear-gradient(90deg, #000, #000 ${chunkWidthPx}, transparent ${chunkWidthPx}, transparent)`,
5538
+ maskSize: `calc(${chunkWidthPx} + ${chunkGapPx}) 100%`
5539
+ };
5540
+ });
5541
+ function snapValueToChunk(val) {
5542
+ const containerSize = toValue(containerWidth);
5543
+ if (!containerSize) {
5544
+ return val;
5545
+ }
5546
+ const gapRelativeSize = 100 * chunkGap.value / containerSize;
5547
+ const chunkRelativeSize = 100 * (chunkWidth.value + chunkGap.value) / containerSize;
5548
+ const filledChunks = Math.floor((val + gapRelativeSize) / chunkRelativeSize);
5549
+ return clamp(0, filledChunks * chunkRelativeSize - gapRelativeSize / 2, 100);
5550
+ }
5551
+ return {
5552
+ hasChunks,
5553
+ chunksMaskStyles,
5554
+ snapValueToChunk
5555
+ };
5556
+ }
5557
+
5485
5558
  const makeVProgressLinearProps = propsFactory({
5486
5559
  absolute: Boolean,
5487
5560
  active: {
@@ -5516,6 +5589,7 @@ const makeVProgressLinearProps = propsFactory({
5516
5589
  stream: Boolean,
5517
5590
  striped: Boolean,
5518
5591
  roundedBar: Boolean,
5592
+ ...makeChunksProps(),
5519
5593
  ...makeComponentProps(),
5520
5594
  ...makeLocationProps({
5521
5595
  location: 'top'
@@ -5534,6 +5608,7 @@ const VProgressLinear = genericComponent()({
5534
5608
  let {
5535
5609
  slots
5536
5610
  } = _ref;
5611
+ const root = ref();
5537
5612
  const progress = useProxiedModel(props, 'modelValue');
5538
5613
  const {
5539
5614
  isRtl,
@@ -5575,6 +5650,24 @@ const VProgressLinear = genericComponent()({
5575
5650
  const isReversed = computed(() => isRtl.value !== props.reverse);
5576
5651
  const transition = computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
5577
5652
  const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches;
5653
+ const containerWidth = shallowRef(0);
5654
+ const {
5655
+ hasChunks,
5656
+ chunksMaskStyles,
5657
+ snapValueToChunk
5658
+ } = useChunks(props, containerWidth);
5659
+ useToggleScope(hasChunks, () => {
5660
+ const {
5661
+ resizeRef
5662
+ } = useResizeObserver(entries => containerWidth.value = entries[0].contentRect.width);
5663
+ watchEffect(() => resizeRef.value = root.value);
5664
+ });
5665
+ const bufferWidth = computed(() => {
5666
+ return hasChunks.value ? snapValueToChunk(normalizedBuffer.value) : normalizedBuffer.value;
5667
+ });
5668
+ const barWidth = computed(() => {
5669
+ return hasChunks.value ? snapValueToChunk(normalizedValue.value) : normalizedValue.value;
5670
+ });
5578
5671
  function handleClick(e) {
5579
5672
  if (!intersectionRef.value) return;
5580
5673
  const {
@@ -5585,8 +5678,11 @@ const VProgressLinear = genericComponent()({
5585
5678
  const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
5586
5679
  progress.value = Math.round(value / width * max.value);
5587
5680
  }
5681
+ watchEffect(() => {
5682
+ intersectionRef.value = root.value;
5683
+ });
5588
5684
  useRender(() => createVNode(props.tag, {
5589
- "ref": intersectionRef,
5685
+ "ref": root,
5590
5686
  "class": normalizeClass(['v-progress-linear', {
5591
5687
  'v-progress-linear--absolute': props.absolute,
5592
5688
  'v-progress-linear--active': props.active && isIntersecting.value,
@@ -5602,7 +5698,7 @@ const VProgressLinear = genericComponent()({
5602
5698
  height: props.active ? convertToUnit(height.value) : 0,
5603
5699
  '--v-progress-linear-height': convertToUnit(height.value),
5604
5700
  ...(props.absolute ? locationStyles.value : {})
5605
- }, props.style]),
5701
+ }, chunksMaskStyles.value, props.style]),
5606
5702
  "role": "progressbar",
5607
5703
  "aria-hidden": props.active ? 'false' : 'true',
5608
5704
  "aria-valuemin": "0",
@@ -5632,7 +5728,7 @@ const VProgressLinear = genericComponent()({
5632
5728
  "class": normalizeClass(['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined]),
5633
5729
  "style": normalizeStyle([bufferColorStyles.value, {
5634
5730
  opacity: parseFloat(props.bufferOpacity),
5635
- width: convertToUnit(normalizedBuffer.value, '%')
5731
+ width: convertToUnit(bufferWidth.value, '%')
5636
5732
  }])
5637
5733
  }, null), createVNode(Transition, {
5638
5734
  "name": transition.value
@@ -5640,7 +5736,7 @@ const VProgressLinear = genericComponent()({
5640
5736
  default: () => [!props.indeterminate ? createElementVNode("div", {
5641
5737
  "class": normalizeClass(['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined]),
5642
5738
  "style": normalizeStyle([barColorStyles.value, {
5643
- width: convertToUnit(normalizedValue.value, '%')
5739
+ width: convertToUnit(barWidth.value, '%')
5644
5740
  }])
5645
5741
  }, null) : createElementVNode("div", {
5646
5742
  "class": "v-progress-linear__indeterminate"
@@ -5923,8 +6019,8 @@ const ripples = {
5923
6019
  if (!el?._ripple?.enabled) return;
5924
6020
  const ripples = el.getElementsByClassName('v-ripple__animation');
5925
6021
  if (ripples.length === 0) return;
5926
- const animation = ripples[ripples.length - 1];
5927
- if (animation.dataset.isHiding) return;else animation.dataset.isHiding = 'true';
6022
+ const animation = Array.from(ripples).findLast(ripple => !ripple.dataset.isHiding);
6023
+ if (!animation) return;else animation.dataset.isHiding = 'true';
5928
6024
  const diff = performance.now() - Number(animation.dataset.activated);
5929
6025
  const delay = Math.max(250 - diff, 0);
5930
6026
  setTimeout(() => {
@@ -9844,6 +9940,11 @@ const VListItem = genericComponent()({
9844
9940
  const isLink = toRef(() => props.link !== false && link.isLink.value);
9845
9941
  const isSelectable = computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
9846
9942
  const isClickable = computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
9943
+ const role = computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
9944
+ const ariaSelected = computed(() => {
9945
+ if (!isSelectable.value) return undefined;
9946
+ return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
9947
+ });
9847
9948
  const roundedProps = toRef(() => props.rounded || props.nav);
9848
9949
  const color = toRef(() => props.color ?? props.activeColor);
9849
9950
  const variantProps = toRef(() => ({
@@ -9947,7 +10048,8 @@ const VListItem = genericComponent()({
9947
10048
  }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
9948
10049
  "style": [colorStyles.value, dimensionStyles.value, props.style],
9949
10050
  "tabindex": isClickable.value ? list ? -2 : 0 : undefined,
9950
- "aria-selected": isSelectable.value ? root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value : undefined,
10051
+ "aria-selected": ariaSelected.value,
10052
+ "role": role.value,
9951
10053
  "onClick": onClick,
9952
10054
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
9953
10055
  }, link.linkProps), {
@@ -10142,11 +10244,9 @@ const VListChildren = genericComponent()({
10142
10244
  let {
10143
10245
  props: activatorProps
10144
10246
  } = _ref3;
10145
- const listItemProps = {
10146
- ...itemProps,
10147
- ...activatorProps,
10247
+ const listItemProps = mergeProps(itemProps, activatorProps, {
10148
10248
  value: props.returnObject ? item : itemProps.value
10149
- };
10249
+ });
10150
10250
  return slots.header ? slots.header({
10151
10251
  props: listItemProps
10152
10252
  }) : createVNode(VListItem, listItemProps, slotsWithItem);
@@ -10449,6 +10549,7 @@ const VList = genericComponent()({
10449
10549
  const activeColor = toRef(() => props.activeColor);
10450
10550
  const baseColor = toRef(() => props.baseColor);
10451
10551
  const color = toRef(() => props.color);
10552
+ const isSelectable = toRef(() => props.selectable || props.activatable);
10452
10553
  createList({
10453
10554
  filterable: props.filterable
10454
10555
  });
@@ -10520,7 +10621,7 @@ const VList = genericComponent()({
10520
10621
  }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class]),
10521
10622
  "style": normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style]),
10522
10623
  "tabindex": props.disabled ? -1 : 0,
10523
- "role": "listbox",
10624
+ "role": isSelectable.value ? 'listbox' : 'list',
10524
10625
  "aria-activedescendant": undefined,
10525
10626
  "onFocusin": onFocusin,
10526
10627
  "onFocusout": onFocusout,
@@ -13599,6 +13700,7 @@ const VSelect = genericComponent()({
13599
13700
  "onKeydown": onListKeydown,
13600
13701
  "onFocusin": onFocusin,
13601
13702
  "tabindex": "-1",
13703
+ "selectable": true,
13602
13704
  "aria-live": "polite",
13603
13705
  "aria-label": `${props.label}-list`,
13604
13706
  "color": props.itemColor ?? props.color
@@ -14218,6 +14320,7 @@ const VAutocomplete = genericComponent()({
14218
14320
  "onFocusin": onFocusin,
14219
14321
  "onFocusout": onFocusout,
14220
14322
  "tabindex": "-1",
14323
+ "selectable": true,
14221
14324
  "aria-live": "polite",
14222
14325
  "color": props.itemColor ?? props.color
14223
14326
  }, listEvents, props.listProps), {
@@ -16550,6 +16653,7 @@ const useSlider = _ref => {
16550
16653
  const numTicks = computed(() => (max.value - min.value) / step.value);
16551
16654
  const disabled = toRef(() => props.disabled);
16552
16655
  const thumbColor = computed(() => props.error || props.disabled ? undefined : props.thumbColor ?? props.color);
16656
+ const thumbLabelColor = computed(() => props.error || props.disabled ? undefined : props.thumbColor);
16553
16657
  const trackColor = computed(() => props.error || props.disabled ? undefined : props.trackColor ?? props.color);
16554
16658
  const trackFillColor = computed(() => props.error || props.disabled ? undefined : props.trackFillColor ?? props.color);
16555
16659
  const mousePressed = shallowRef(false);
@@ -16707,6 +16811,7 @@ const useSlider = _ref => {
16707
16811
  step,
16708
16812
  thumbSize,
16709
16813
  thumbColor,
16814
+ thumbLabelColor,
16710
16815
  thumbLabel: toRef(() => props.thumbLabel),
16711
16816
  ticks: toRef(() => props.ticks),
16712
16817
  tickSize,
@@ -16772,6 +16877,7 @@ const VSliderThumb = genericComponent()({
16772
16877
  min,
16773
16878
  max,
16774
16879
  thumbColor,
16880
+ thumbLabelColor,
16775
16881
  step,
16776
16882
  disabled,
16777
16883
  thumbSize,
@@ -16793,6 +16899,10 @@ const VSliderThumb = genericComponent()({
16793
16899
  textColorClasses,
16794
16900
  textColorStyles
16795
16901
  } = useTextColor(thumbColor);
16902
+ const {
16903
+ backgroundColorClasses,
16904
+ backgroundColorStyles
16905
+ } = useBackgroundColor(thumbLabelColor);
16796
16906
  const {
16797
16907
  pageup,
16798
16908
  pagedown,
@@ -16858,9 +16968,7 @@ const VSliderThumb = genericComponent()({
16858
16968
  "onKeydown": !readonly.value ? onKeydown : undefined
16859
16969
  }, [createElementVNode("div", {
16860
16970
  "class": normalizeClass(['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value]),
16861
- "style": {
16862
- ...textColorStyles.value
16863
- }
16971
+ "style": normalizeStyle(textColorStyles.value)
16864
16972
  }, null), withDirectives(createElementVNode("div", {
16865
16973
  "class": normalizeClass(['v-slider-thumb__ripple', textColorClasses.value]),
16866
16974
  "style": normalizeStyle(textColorStyles.value)
@@ -16873,10 +16981,13 @@ const VSliderThumb = genericComponent()({
16873
16981
  default: () => [withDirectives(createElementVNode("div", {
16874
16982
  "class": "v-slider-thumb__label-container"
16875
16983
  }, [createElementVNode("div", {
16876
- "class": normalizeClass(['v-slider-thumb__label', textColorClasses.value])
16984
+ "class": normalizeClass(['v-slider-thumb__label', backgroundColorClasses.value]),
16985
+ "style": normalizeStyle(backgroundColorStyles.value)
16877
16986
  }, [createElementVNode("div", null, [slots['thumb-label']?.({
16878
16987
  modelValue: props.modelValue
16879
- }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
16988
+ }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)]), createElementVNode("div", {
16989
+ "class": "v-slider-thumb__label-wedge"
16990
+ }, null)])]), [[vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
16880
16991
  })]);
16881
16992
  });
16882
16993
  return {};
@@ -19023,19 +19134,23 @@ const VCombobox = genericComponent()({
19023
19134
  get: () => {
19024
19135
  return _search.value;
19025
19136
  },
19026
- set: val => {
19137
+ set: async val => {
19027
19138
  _search.value = val ?? '';
19028
19139
  if (!props.multiple && !hasSelectionSlot.value) {
19029
19140
  model.value = [transformItem$3(props, val)];
19030
19141
  nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
19031
19142
  }
19032
19143
  if (val && props.multiple && props.delimiters?.length) {
19033
- const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
19144
+ const signsToMatch = props.delimiters.map(escapeForRegex).join('|');
19145
+ const values = val.split(new RegExp(`(?:${signsToMatch})+`));
19034
19146
  if (values.length > 1) {
19035
- values.forEach(v => {
19147
+ for (let v of values) {
19036
19148
  v = v.trim();
19037
- if (v) select(transformItem$3(props, v));
19038
- });
19149
+ if (v) {
19150
+ select(transformItem$3(props, v));
19151
+ await nextTick();
19152
+ }
19153
+ }
19039
19154
  _search.value = '';
19040
19155
  }
19041
19156
  }
@@ -19317,6 +19432,7 @@ const VCombobox = genericComponent()({
19317
19432
  "selected": selectedValues.value,
19318
19433
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
19319
19434
  "onMousedown": e => e.preventDefault(),
19435
+ "selectable": true,
19320
19436
  "onKeydown": onListKeydown,
19321
19437
  "onFocusin": onFocusin,
19322
19438
  "onFocusout": onFocusout,
@@ -22890,6 +23006,9 @@ const VDatePickerControls = genericComponent()({
22890
23006
  let {
22891
23007
  emit
22892
23008
  } = _ref;
23009
+ const {
23010
+ t
23011
+ } = useLocale();
22893
23012
  const disableMonth = computed(() => {
22894
23013
  return Array.isArray(props.disabled) ? props.disabled.includes('text') : !!props.disabled;
22895
23014
  });
@@ -22936,6 +23055,7 @@ const VDatePickerControls = genericComponent()({
22936
23055
  "density": "comfortable",
22937
23056
  "icon": props.modeIcon,
22938
23057
  "variant": "text",
23058
+ "aria-label": t('$vuetify.datePicker.ariaLabel.selectYear'),
22939
23059
  "onClick": onClickYear
22940
23060
  }, null), createVNode(VSpacer, null, null), createElementVNode("div", {
22941
23061
  "class": "v-date-picker-controls__month"
@@ -22945,6 +23065,7 @@ const VDatePickerControls = genericComponent()({
22945
23065
  "density": "comfortable",
22946
23066
  "icon": props.prevIcon,
22947
23067
  "variant": "text",
23068
+ "aria-label": t('$vuetify.datePicker.ariaLabel.previousMonth'),
22948
23069
  "onClick": onClickPrev
22949
23070
  }, null), createVNode(VBtn, {
22950
23071
  "data-testid": "next-month",
@@ -22952,6 +23073,7 @@ const VDatePickerControls = genericComponent()({
22952
23073
  "icon": props.nextIcon,
22953
23074
  "density": "comfortable",
22954
23075
  "variant": "text",
23076
+ "aria-label": t('$vuetify.datePicker.ariaLabel.nextMonth'),
22955
23077
  "onClick": onClickNext
22956
23078
  }, null)])]);
22957
23079
  });
@@ -23216,6 +23338,9 @@ const VDatePickerMonth = genericComponent()({
23216
23338
  slots
23217
23339
  } = _ref;
23218
23340
  const daysRef = ref();
23341
+ const {
23342
+ t
23343
+ } = useLocale();
23219
23344
  const {
23220
23345
  daysInMonth,
23221
23346
  model,
@@ -23272,6 +23397,11 @@ const VDatePickerMonth = genericComponent()({
23272
23397
  model.value = [rangeStart.value];
23273
23398
  }
23274
23399
  }
23400
+ function getDateAriaLabel(item) {
23401
+ const fullDate = adapter.format(item.date, 'fullDateWithWeekday');
23402
+ const localeKey = item.isToday ? 'currentDate' : 'selectDate';
23403
+ return t(`$vuetify.datePicker.ariaLabel.${localeKey}`, fullDate);
23404
+ }
23275
23405
  function onMultipleClick(value) {
23276
23406
  const index = model.value.findIndex(selection => adapter.isSameDay(selection, value));
23277
23407
  if (index === -1) {
@@ -23323,6 +23453,8 @@ const VDatePickerMonth = genericComponent()({
23323
23453
  ripple: false,
23324
23454
  text: item.localized,
23325
23455
  variant: item.isSelected ? 'flat' : item.isToday ? 'outlined' : 'text',
23456
+ 'aria-label': getDateAriaLabel(item),
23457
+ 'aria-current': item.isToday ? 'date' : undefined,
23326
23458
  onClick: () => onClick(item.date)
23327
23459
  },
23328
23460
  item,
@@ -23377,11 +23509,13 @@ const VDatePickerMonths = genericComponent()({
23377
23509
  }
23378
23510
  return createRange(12).map(i => {
23379
23511
  const text = adapter.format(date, 'monthShort');
23512
+ const label = adapter.format(date, 'month');
23380
23513
  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))));
23381
23514
  date = adapter.getNextMonth(date);
23382
23515
  return {
23383
23516
  isDisabled,
23384
23517
  text,
23518
+ label,
23385
23519
  value: i
23386
23520
  };
23387
23521
  });
@@ -23408,6 +23542,7 @@ const VDatePickerMonths = genericComponent()({
23408
23542
  }, [months.value.map((month, i) => {
23409
23543
  const btnProps = {
23410
23544
  active: model.value === i,
23545
+ ariaLabel: month.label,
23411
23546
  color: model.value === i ? props.color : undefined,
23412
23547
  disabled: month.isDisabled,
23413
23548
  rounded: true,
@@ -24414,6 +24549,42 @@ function appendIfDirectory(path, item) {
24414
24549
  return item.isDirectory ? `${path}/${item.name}` : path;
24415
24550
  }
24416
24551
 
24552
+ // Utilities
24553
+ // Composables
24554
+ const makeFileFilterProps = propsFactory({
24555
+ filterByType: String
24556
+ }, 'file-accept');
24557
+ function useFileFilter(props) {
24558
+ const fileFilter = computed(() => props.filterByType ? createFilter(props.filterByType) : null);
24559
+ function filterAccepted(files) {
24560
+ if (fileFilter.value) {
24561
+ const accepted = files.filter(fileFilter.value);
24562
+ return {
24563
+ accepted,
24564
+ rejected: files.filter(f => !accepted.includes(f))
24565
+ };
24566
+ }
24567
+ return {
24568
+ accepted: files,
24569
+ rejected: []
24570
+ };
24571
+ }
24572
+ return {
24573
+ filterAccepted
24574
+ };
24575
+ }
24576
+ function createFilter(v) {
24577
+ const types = v.split(',').map(x => x.trim().toLowerCase());
24578
+ const extensionsToMatch = types.filter(x => x.startsWith('.'));
24579
+ const wildcards = types.filter(x => x.endsWith('/*'));
24580
+ const typesToMatch = types.filter(x => !extensionsToMatch.includes(x) && !wildcards.includes(x));
24581
+ return file => {
24582
+ const extension = file.name.split('.').at(-1)?.toLowerCase() ?? '';
24583
+ const typeGroup = file.type.split('/').at(0)?.toLowerCase() ?? '';
24584
+ return typesToMatch.includes(file.type) || extensionsToMatch.includes(`.${extension}`) || wildcards.includes(`${typeGroup}/*`);
24585
+ };
24586
+ }
24587
+
24417
24588
  // Types
24418
24589
 
24419
24590
  const makeVFileInputProps = propsFactory({
@@ -24446,6 +24617,7 @@ const makeVFileInputProps = propsFactory({
24446
24617
  return wrapInArray(val).every(v => v != null && typeof v === 'object');
24447
24618
  }
24448
24619
  },
24620
+ ...makeFileFilterProps(),
24449
24621
  ...makeVFieldProps({
24450
24622
  clearable: true
24451
24623
  })
@@ -24458,7 +24630,8 @@ const VFileInput = genericComponent()({
24458
24630
  'click:control': e => true,
24459
24631
  'mousedown:control': e => true,
24460
24632
  'update:focused': focused => true,
24461
- 'update:modelValue': files => true
24633
+ 'update:modelValue': files => true,
24634
+ rejected: files => true
24462
24635
  },
24463
24636
  setup(props, _ref) {
24464
24637
  let {
@@ -24469,6 +24642,9 @@ const VFileInput = genericComponent()({
24469
24642
  const {
24470
24643
  t
24471
24644
  } = useLocale();
24645
+ const {
24646
+ filterAccepted
24647
+ } = useFileFilter(props);
24472
24648
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val);
24473
24649
  const {
24474
24650
  isFocused,
@@ -24542,14 +24718,38 @@ const VFileInput = genericComponent()({
24542
24718
  e.stopImmediatePropagation();
24543
24719
  isDragging.value = false;
24544
24720
  if (!inputRef.value || !hasFilesOrFolders(e)) return;
24721
+ const allDroppedFiles = await handleDrop(e);
24722
+ selectAccepted(allDroppedFiles);
24723
+ }
24724
+ function onFileSelection(e) {
24725
+ if (!e.target || e.repack) return; // prevent loop
24726
+
24727
+ if (!props.filterByType) {
24728
+ const target = e.target;
24729
+ model.value = [...(target.files ?? [])];
24730
+ } else {
24731
+ selectAccepted([...e.target.files]);
24732
+ }
24733
+ }
24734
+ function selectAccepted(files) {
24545
24735
  const dataTransfer = new DataTransfer();
24546
- for (const file of await handleDrop(e)) {
24736
+ const {
24737
+ accepted,
24738
+ rejected
24739
+ } = filterAccepted(files);
24740
+ if (rejected.length) {
24741
+ emit('rejected', rejected);
24742
+ }
24743
+ for (const file of accepted) {
24547
24744
  dataTransfer.items.add(file);
24548
24745
  }
24549
24746
  inputRef.value.files = dataTransfer.files;
24550
- inputRef.value.dispatchEvent(new Event('change', {
24747
+ model.value = [...dataTransfer.files];
24748
+ const event = new Event('change', {
24551
24749
  bubbles: true
24552
- }));
24750
+ });
24751
+ event.repack = true;
24752
+ inputRef.value.dispatchEvent(event);
24553
24753
  }
24554
24754
  watch(model, newValue => {
24555
24755
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -24566,6 +24766,8 @@ const VFileInput = genericComponent()({
24566
24766
  ...inputProps
24567
24767
  } = VInput.filterProps(props);
24568
24768
  const fieldProps = VField.filterProps(props);
24769
+ const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
24770
+ const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
24569
24771
  return createVNode(VInput, mergeProps({
24570
24772
  "ref": vInputRef,
24571
24773
  "modelValue": props.multiple ? model.value : model.value[0],
@@ -24621,6 +24823,7 @@ const VFileInput = genericComponent()({
24621
24823
  return createElementVNode(Fragment, null, [createElementVNode("input", mergeProps({
24622
24824
  "ref": inputRef,
24623
24825
  "type": "file",
24826
+ "accept": inputAccept,
24624
24827
  "readonly": isReadonly.value,
24625
24828
  "disabled": isDisabled.value,
24626
24829
  "multiple": props.multiple,
@@ -24630,11 +24833,7 @@ const VFileInput = genericComponent()({
24630
24833
  if (isReadonly.value) e.preventDefault();
24631
24834
  onFocus();
24632
24835
  },
24633
- "onChange": e => {
24634
- if (!e.target) return;
24635
- const target = e.target;
24636
- model.value = [...(target.files ?? [])];
24637
- },
24836
+ "onChange": onFileSelection,
24638
24837
  "onDragleave": onDragleave,
24639
24838
  "onFocus": onFocus,
24640
24839
  "onBlur": blur
@@ -31432,7 +31631,7 @@ function createVuetify$1() {
31432
31631
  };
31433
31632
  });
31434
31633
  }
31435
- const version$1 = "3.9.2-master.2025-07-28";
31634
+ const version$1 = "3.9.3-dev.2025-07-30";
31436
31635
  createVuetify$1.version = version$1;
31437
31636
 
31438
31637
  // Vue's inject() can only be used in setup
@@ -31457,7 +31656,7 @@ const createVuetify = function () {
31457
31656
  ...options
31458
31657
  });
31459
31658
  };
31460
- const version = "3.9.2-master.2025-07-28";
31659
+ const version = "3.9.3-dev.2025-07-30";
31461
31660
  createVuetify.version = version;
31462
31661
 
31463
31662
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useHotkey, useLayout, useLocale, useRtl, useTheme, version };