@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
  */
@@ -2145,6 +2145,14 @@ var en = {
2145
2145
  header: 'Enter date',
2146
2146
  input: {
2147
2147
  placeholder: 'Enter date'
2148
+ },
2149
+ ariaLabel: {
2150
+ previousMonth: 'Previous month',
2151
+ nextMonth: 'Next month',
2152
+ selectYear: 'Select year',
2153
+ selectDate: '{0}',
2154
+ // Full date format
2155
+ currentDate: 'Today, {0}'
2148
2156
  }
2149
2157
  },
2150
2158
  noDataText: 'No data available',
@@ -2683,6 +2691,7 @@ function createTheme(options) {
2683
2691
  return acc;
2684
2692
  });
2685
2693
  const current = toRef(() => computedThemes.value[name.value]);
2694
+ const isSystem = toRef(() => _name.value === 'system');
2686
2695
  const styles = computed(() => {
2687
2696
  const lines = [];
2688
2697
  const important = parsedOptions.unimportant ? '' : ' !important';
@@ -2770,7 +2779,7 @@ function createTheme(options) {
2770
2779
  }
2771
2780
  }
2772
2781
  function change(themeName) {
2773
- if (!themeNames.value.includes(themeName)) {
2782
+ if (themeName !== 'system' && !themeNames.value.includes(themeName)) {
2774
2783
  consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2775
2784
  return;
2776
2785
  }
@@ -2803,6 +2812,7 @@ function createTheme(options) {
2803
2812
  cycle,
2804
2813
  toggle,
2805
2814
  isDisabled: parsedOptions.isDisabled,
2815
+ isSystem,
2806
2816
  name,
2807
2817
  themes,
2808
2818
  current,
@@ -5242,6 +5252,69 @@ function useLocation(props) {
5242
5252
  };
5243
5253
  }
5244
5254
 
5255
+ // Utilities
5256
+
5257
+ // Types
5258
+
5259
+ // Composables
5260
+ const makeChunksProps = propsFactory({
5261
+ chunkCount: {
5262
+ type: [Number, String],
5263
+ default: null
5264
+ },
5265
+ chunkWidth: {
5266
+ type: [Number, String],
5267
+ default: null
5268
+ },
5269
+ chunkGap: {
5270
+ type: [Number, String],
5271
+ default: 4
5272
+ }
5273
+ }, 'chunks');
5274
+ function useChunks(props, containerWidth) {
5275
+ const hasChunks = toRef(() => !!props.chunkCount || !!props.chunkWidth);
5276
+ const chunkWidth = computed(() => {
5277
+ const containerSize = toValue(containerWidth);
5278
+ if (!containerSize) {
5279
+ return 0;
5280
+ }
5281
+ if (!props.chunkCount) {
5282
+ return Number(props.chunkWidth);
5283
+ }
5284
+ const count = Number(props.chunkCount);
5285
+ const availableWidth = containerSize - Number(props.chunkGap) * (count - 1);
5286
+ return availableWidth / count;
5287
+ });
5288
+ const chunkGap = toRef(() => Number(props.chunkGap));
5289
+ const chunksMaskStyles = computed(() => {
5290
+ if (!hasChunks.value) {
5291
+ return {};
5292
+ }
5293
+ const chunkGapPx = convertToUnit(chunkGap.value);
5294
+ const chunkWidthPx = convertToUnit(chunkWidth.value);
5295
+ return {
5296
+ maskRepeat: 'repeat-x',
5297
+ maskImage: `linear-gradient(90deg, #000, #000 ${chunkWidthPx}, transparent ${chunkWidthPx}, transparent)`,
5298
+ maskSize: `calc(${chunkWidthPx} + ${chunkGapPx}) 100%`
5299
+ };
5300
+ });
5301
+ function snapValueToChunk(val) {
5302
+ const containerSize = toValue(containerWidth);
5303
+ if (!containerSize) {
5304
+ return val;
5305
+ }
5306
+ const gapRelativeSize = 100 * chunkGap.value / containerSize;
5307
+ const chunkRelativeSize = 100 * (chunkWidth.value + chunkGap.value) / containerSize;
5308
+ const filledChunks = Math.floor((val + gapRelativeSize) / chunkRelativeSize);
5309
+ return clamp(0, filledChunks * chunkRelativeSize - gapRelativeSize / 2, 100);
5310
+ }
5311
+ return {
5312
+ hasChunks,
5313
+ chunksMaskStyles,
5314
+ snapValueToChunk
5315
+ };
5316
+ }
5317
+
5245
5318
  const makeVProgressLinearProps = propsFactory({
5246
5319
  absolute: Boolean,
5247
5320
  active: {
@@ -5276,6 +5349,7 @@ const makeVProgressLinearProps = propsFactory({
5276
5349
  stream: Boolean,
5277
5350
  striped: Boolean,
5278
5351
  roundedBar: Boolean,
5352
+ ...makeChunksProps(),
5279
5353
  ...makeComponentProps(),
5280
5354
  ...makeLocationProps({
5281
5355
  location: 'top'
@@ -5294,6 +5368,7 @@ const VProgressLinear = genericComponent()({
5294
5368
  let {
5295
5369
  slots
5296
5370
  } = _ref;
5371
+ const root = ref();
5297
5372
  const progress = useProxiedModel(props, 'modelValue');
5298
5373
  const {
5299
5374
  isRtl,
@@ -5335,6 +5410,24 @@ const VProgressLinear = genericComponent()({
5335
5410
  const isReversed = computed(() => isRtl.value !== props.reverse);
5336
5411
  const transition = computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
5337
5412
  const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches;
5413
+ const containerWidth = shallowRef(0);
5414
+ const {
5415
+ hasChunks,
5416
+ chunksMaskStyles,
5417
+ snapValueToChunk
5418
+ } = useChunks(props, containerWidth);
5419
+ useToggleScope(hasChunks, () => {
5420
+ const {
5421
+ resizeRef
5422
+ } = useResizeObserver(entries => containerWidth.value = entries[0].contentRect.width);
5423
+ watchEffect(() => resizeRef.value = root.value);
5424
+ });
5425
+ const bufferWidth = computed(() => {
5426
+ return hasChunks.value ? snapValueToChunk(normalizedBuffer.value) : normalizedBuffer.value;
5427
+ });
5428
+ const barWidth = computed(() => {
5429
+ return hasChunks.value ? snapValueToChunk(normalizedValue.value) : normalizedValue.value;
5430
+ });
5338
5431
  function handleClick(e) {
5339
5432
  if (!intersectionRef.value) return;
5340
5433
  const {
@@ -5345,8 +5438,11 @@ const VProgressLinear = genericComponent()({
5345
5438
  const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
5346
5439
  progress.value = Math.round(value / width * max.value);
5347
5440
  }
5441
+ watchEffect(() => {
5442
+ intersectionRef.value = root.value;
5443
+ });
5348
5444
  useRender(() => createVNode(props.tag, {
5349
- "ref": intersectionRef,
5445
+ "ref": root,
5350
5446
  "class": normalizeClass(['v-progress-linear', {
5351
5447
  'v-progress-linear--absolute': props.absolute,
5352
5448
  'v-progress-linear--active': props.active && isIntersecting.value,
@@ -5362,7 +5458,7 @@ const VProgressLinear = genericComponent()({
5362
5458
  height: props.active ? convertToUnit(height.value) : 0,
5363
5459
  '--v-progress-linear-height': convertToUnit(height.value),
5364
5460
  ...(props.absolute ? locationStyles.value : {})
5365
- }, props.style]),
5461
+ }, chunksMaskStyles.value, props.style]),
5366
5462
  "role": "progressbar",
5367
5463
  "aria-hidden": props.active ? 'false' : 'true',
5368
5464
  "aria-valuemin": "0",
@@ -5392,7 +5488,7 @@ const VProgressLinear = genericComponent()({
5392
5488
  "class": normalizeClass(['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined]),
5393
5489
  "style": normalizeStyle([bufferColorStyles.value, {
5394
5490
  opacity: parseFloat(props.bufferOpacity),
5395
- width: convertToUnit(normalizedBuffer.value, '%')
5491
+ width: convertToUnit(bufferWidth.value, '%')
5396
5492
  }])
5397
5493
  }, null), createVNode(Transition, {
5398
5494
  "name": transition.value
@@ -5400,7 +5496,7 @@ const VProgressLinear = genericComponent()({
5400
5496
  default: () => [!props.indeterminate ? createElementVNode("div", {
5401
5497
  "class": normalizeClass(['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined]),
5402
5498
  "style": normalizeStyle([barColorStyles.value, {
5403
- width: convertToUnit(normalizedValue.value, '%')
5499
+ width: convertToUnit(barWidth.value, '%')
5404
5500
  }])
5405
5501
  }, null) : createElementVNode("div", {
5406
5502
  "class": "v-progress-linear__indeterminate"
@@ -5683,8 +5779,8 @@ const ripples = {
5683
5779
  if (!el?._ripple?.enabled) return;
5684
5780
  const ripples = el.getElementsByClassName('v-ripple__animation');
5685
5781
  if (ripples.length === 0) return;
5686
- const animation = ripples[ripples.length - 1];
5687
- if (animation.dataset.isHiding) return;else animation.dataset.isHiding = 'true';
5782
+ const animation = Array.from(ripples).findLast(ripple => !ripple.dataset.isHiding);
5783
+ if (!animation) return;else animation.dataset.isHiding = 'true';
5688
5784
  const diff = performance.now() - Number(animation.dataset.activated);
5689
5785
  const delay = Math.max(250 - diff, 0);
5690
5786
  setTimeout(() => {
@@ -9604,6 +9700,11 @@ const VListItem = genericComponent()({
9604
9700
  const isLink = toRef(() => props.link !== false && link.isLink.value);
9605
9701
  const isSelectable = computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
9606
9702
  const isClickable = computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
9703
+ const role = computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
9704
+ const ariaSelected = computed(() => {
9705
+ if (!isSelectable.value) return undefined;
9706
+ return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
9707
+ });
9607
9708
  const roundedProps = toRef(() => props.rounded || props.nav);
9608
9709
  const color = toRef(() => props.color ?? props.activeColor);
9609
9710
  const variantProps = toRef(() => ({
@@ -9707,7 +9808,8 @@ const VListItem = genericComponent()({
9707
9808
  }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
9708
9809
  "style": [colorStyles.value, dimensionStyles.value, props.style],
9709
9810
  "tabindex": isClickable.value ? list ? -2 : 0 : undefined,
9710
- "aria-selected": isSelectable.value ? root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value : undefined,
9811
+ "aria-selected": ariaSelected.value,
9812
+ "role": role.value,
9711
9813
  "onClick": onClick,
9712
9814
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
9713
9815
  }, link.linkProps), {
@@ -9902,11 +10004,9 @@ const VListChildren = genericComponent()({
9902
10004
  let {
9903
10005
  props: activatorProps
9904
10006
  } = _ref3;
9905
- const listItemProps = {
9906
- ...itemProps,
9907
- ...activatorProps,
10007
+ const listItemProps = mergeProps(itemProps, activatorProps, {
9908
10008
  value: props.returnObject ? item : itemProps.value
9909
- };
10009
+ });
9910
10010
  return slots.header ? slots.header({
9911
10011
  props: listItemProps
9912
10012
  }) : createVNode(VListItem, listItemProps, slotsWithItem);
@@ -10209,6 +10309,7 @@ const VList = genericComponent()({
10209
10309
  const activeColor = toRef(() => props.activeColor);
10210
10310
  const baseColor = toRef(() => props.baseColor);
10211
10311
  const color = toRef(() => props.color);
10312
+ const isSelectable = toRef(() => props.selectable || props.activatable);
10212
10313
  createList({
10213
10314
  filterable: props.filterable
10214
10315
  });
@@ -10280,7 +10381,7 @@ const VList = genericComponent()({
10280
10381
  }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class]),
10281
10382
  "style": normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style]),
10282
10383
  "tabindex": props.disabled ? -1 : 0,
10283
- "role": "listbox",
10384
+ "role": isSelectable.value ? 'listbox' : 'list',
10284
10385
  "aria-activedescendant": undefined,
10285
10386
  "onFocusin": onFocusin,
10286
10387
  "onFocusout": onFocusout,
@@ -13359,6 +13460,7 @@ const VSelect = genericComponent()({
13359
13460
  "onKeydown": onListKeydown,
13360
13461
  "onFocusin": onFocusin,
13361
13462
  "tabindex": "-1",
13463
+ "selectable": true,
13362
13464
  "aria-live": "polite",
13363
13465
  "aria-label": `${props.label}-list`,
13364
13466
  "color": props.itemColor ?? props.color
@@ -13978,6 +14080,7 @@ const VAutocomplete = genericComponent()({
13978
14080
  "onFocusin": onFocusin,
13979
14081
  "onFocusout": onFocusout,
13980
14082
  "tabindex": "-1",
14083
+ "selectable": true,
13981
14084
  "aria-live": "polite",
13982
14085
  "color": props.itemColor ?? props.color
13983
14086
  }, listEvents, props.listProps), {
@@ -16310,6 +16413,7 @@ const useSlider = _ref => {
16310
16413
  const numTicks = computed(() => (max.value - min.value) / step.value);
16311
16414
  const disabled = toRef(() => props.disabled);
16312
16415
  const thumbColor = computed(() => props.error || props.disabled ? undefined : props.thumbColor ?? props.color);
16416
+ const thumbLabelColor = computed(() => props.error || props.disabled ? undefined : props.thumbColor);
16313
16417
  const trackColor = computed(() => props.error || props.disabled ? undefined : props.trackColor ?? props.color);
16314
16418
  const trackFillColor = computed(() => props.error || props.disabled ? undefined : props.trackFillColor ?? props.color);
16315
16419
  const mousePressed = shallowRef(false);
@@ -16467,6 +16571,7 @@ const useSlider = _ref => {
16467
16571
  step,
16468
16572
  thumbSize,
16469
16573
  thumbColor,
16574
+ thumbLabelColor,
16470
16575
  thumbLabel: toRef(() => props.thumbLabel),
16471
16576
  ticks: toRef(() => props.ticks),
16472
16577
  tickSize,
@@ -16532,6 +16637,7 @@ const VSliderThumb = genericComponent()({
16532
16637
  min,
16533
16638
  max,
16534
16639
  thumbColor,
16640
+ thumbLabelColor,
16535
16641
  step,
16536
16642
  disabled,
16537
16643
  thumbSize,
@@ -16553,6 +16659,10 @@ const VSliderThumb = genericComponent()({
16553
16659
  textColorClasses,
16554
16660
  textColorStyles
16555
16661
  } = useTextColor(thumbColor);
16662
+ const {
16663
+ backgroundColorClasses,
16664
+ backgroundColorStyles
16665
+ } = useBackgroundColor(thumbLabelColor);
16556
16666
  const {
16557
16667
  pageup,
16558
16668
  pagedown,
@@ -16618,9 +16728,7 @@ const VSliderThumb = genericComponent()({
16618
16728
  "onKeydown": !readonly.value ? onKeydown : undefined
16619
16729
  }, [createElementVNode("div", {
16620
16730
  "class": normalizeClass(['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value]),
16621
- "style": {
16622
- ...textColorStyles.value
16623
- }
16731
+ "style": normalizeStyle(textColorStyles.value)
16624
16732
  }, null), withDirectives(createElementVNode("div", {
16625
16733
  "class": normalizeClass(['v-slider-thumb__ripple', textColorClasses.value]),
16626
16734
  "style": normalizeStyle(textColorStyles.value)
@@ -16633,10 +16741,13 @@ const VSliderThumb = genericComponent()({
16633
16741
  default: () => [withDirectives(createElementVNode("div", {
16634
16742
  "class": "v-slider-thumb__label-container"
16635
16743
  }, [createElementVNode("div", {
16636
- "class": normalizeClass(['v-slider-thumb__label', textColorClasses.value])
16744
+ "class": normalizeClass(['v-slider-thumb__label', backgroundColorClasses.value]),
16745
+ "style": normalizeStyle(backgroundColorStyles.value)
16637
16746
  }, [createElementVNode("div", null, [slots['thumb-label']?.({
16638
16747
  modelValue: props.modelValue
16639
- }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
16748
+ }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)]), createElementVNode("div", {
16749
+ "class": "v-slider-thumb__label-wedge"
16750
+ }, null)])]), [[vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
16640
16751
  })]);
16641
16752
  });
16642
16753
  return {};
@@ -18783,19 +18894,23 @@ const VCombobox = genericComponent()({
18783
18894
  get: () => {
18784
18895
  return _search.value;
18785
18896
  },
18786
- set: val => {
18897
+ set: async val => {
18787
18898
  _search.value = val ?? '';
18788
18899
  if (!props.multiple && !hasSelectionSlot.value) {
18789
18900
  model.value = [transformItem$3(props, val)];
18790
18901
  nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18791
18902
  }
18792
18903
  if (val && props.multiple && props.delimiters?.length) {
18793
- const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
18904
+ const signsToMatch = props.delimiters.map(escapeForRegex).join('|');
18905
+ const values = val.split(new RegExp(`(?:${signsToMatch})+`));
18794
18906
  if (values.length > 1) {
18795
- values.forEach(v => {
18907
+ for (let v of values) {
18796
18908
  v = v.trim();
18797
- if (v) select(transformItem$3(props, v));
18798
- });
18909
+ if (v) {
18910
+ select(transformItem$3(props, v));
18911
+ await nextTick();
18912
+ }
18913
+ }
18799
18914
  _search.value = '';
18800
18915
  }
18801
18916
  }
@@ -19077,6 +19192,7 @@ const VCombobox = genericComponent()({
19077
19192
  "selected": selectedValues.value,
19078
19193
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
19079
19194
  "onMousedown": e => e.preventDefault(),
19195
+ "selectable": true,
19080
19196
  "onKeydown": onListKeydown,
19081
19197
  "onFocusin": onFocusin,
19082
19198
  "onFocusout": onFocusout,
@@ -22650,6 +22766,9 @@ const VDatePickerControls = genericComponent()({
22650
22766
  let {
22651
22767
  emit
22652
22768
  } = _ref;
22769
+ const {
22770
+ t
22771
+ } = useLocale();
22653
22772
  const disableMonth = computed(() => {
22654
22773
  return Array.isArray(props.disabled) ? props.disabled.includes('text') : !!props.disabled;
22655
22774
  });
@@ -22696,6 +22815,7 @@ const VDatePickerControls = genericComponent()({
22696
22815
  "density": "comfortable",
22697
22816
  "icon": props.modeIcon,
22698
22817
  "variant": "text",
22818
+ "aria-label": t('$vuetify.datePicker.ariaLabel.selectYear'),
22699
22819
  "onClick": onClickYear
22700
22820
  }, null), createVNode(VSpacer, null, null), createElementVNode("div", {
22701
22821
  "class": "v-date-picker-controls__month"
@@ -22705,6 +22825,7 @@ const VDatePickerControls = genericComponent()({
22705
22825
  "density": "comfortable",
22706
22826
  "icon": props.prevIcon,
22707
22827
  "variant": "text",
22828
+ "aria-label": t('$vuetify.datePicker.ariaLabel.previousMonth'),
22708
22829
  "onClick": onClickPrev
22709
22830
  }, null), createVNode(VBtn, {
22710
22831
  "data-testid": "next-month",
@@ -22712,6 +22833,7 @@ const VDatePickerControls = genericComponent()({
22712
22833
  "icon": props.nextIcon,
22713
22834
  "density": "comfortable",
22714
22835
  "variant": "text",
22836
+ "aria-label": t('$vuetify.datePicker.ariaLabel.nextMonth'),
22715
22837
  "onClick": onClickNext
22716
22838
  }, null)])]);
22717
22839
  });
@@ -22976,6 +23098,9 @@ const VDatePickerMonth = genericComponent()({
22976
23098
  slots
22977
23099
  } = _ref;
22978
23100
  const daysRef = ref();
23101
+ const {
23102
+ t
23103
+ } = useLocale();
22979
23104
  const {
22980
23105
  daysInMonth,
22981
23106
  model,
@@ -23032,6 +23157,11 @@ const VDatePickerMonth = genericComponent()({
23032
23157
  model.value = [rangeStart.value];
23033
23158
  }
23034
23159
  }
23160
+ function getDateAriaLabel(item) {
23161
+ const fullDate = adapter.format(item.date, 'fullDateWithWeekday');
23162
+ const localeKey = item.isToday ? 'currentDate' : 'selectDate';
23163
+ return t(`$vuetify.datePicker.ariaLabel.${localeKey}`, fullDate);
23164
+ }
23035
23165
  function onMultipleClick(value) {
23036
23166
  const index = model.value.findIndex(selection => adapter.isSameDay(selection, value));
23037
23167
  if (index === -1) {
@@ -23083,6 +23213,8 @@ const VDatePickerMonth = genericComponent()({
23083
23213
  ripple: false,
23084
23214
  text: item.localized,
23085
23215
  variant: item.isSelected ? 'flat' : item.isToday ? 'outlined' : 'text',
23216
+ 'aria-label': getDateAriaLabel(item),
23217
+ 'aria-current': item.isToday ? 'date' : undefined,
23086
23218
  onClick: () => onClick(item.date)
23087
23219
  },
23088
23220
  item,
@@ -23137,11 +23269,13 @@ const VDatePickerMonths = genericComponent()({
23137
23269
  }
23138
23270
  return createRange(12).map(i => {
23139
23271
  const text = adapter.format(date, 'monthShort');
23272
+ const label = adapter.format(date, 'month');
23140
23273
  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))));
23141
23274
  date = adapter.getNextMonth(date);
23142
23275
  return {
23143
23276
  isDisabled,
23144
23277
  text,
23278
+ label,
23145
23279
  value: i
23146
23280
  };
23147
23281
  });
@@ -23168,6 +23302,7 @@ const VDatePickerMonths = genericComponent()({
23168
23302
  }, [months.value.map((month, i) => {
23169
23303
  const btnProps = {
23170
23304
  active: model.value === i,
23305
+ ariaLabel: month.label,
23171
23306
  color: model.value === i ? props.color : undefined,
23172
23307
  disabled: month.isDisabled,
23173
23308
  rounded: true,
@@ -24174,6 +24309,42 @@ function appendIfDirectory(path, item) {
24174
24309
  return item.isDirectory ? `${path}/${item.name}` : path;
24175
24310
  }
24176
24311
 
24312
+ // Utilities
24313
+ // Composables
24314
+ const makeFileFilterProps = propsFactory({
24315
+ filterByType: String
24316
+ }, 'file-accept');
24317
+ function useFileFilter(props) {
24318
+ const fileFilter = computed(() => props.filterByType ? createFilter(props.filterByType) : null);
24319
+ function filterAccepted(files) {
24320
+ if (fileFilter.value) {
24321
+ const accepted = files.filter(fileFilter.value);
24322
+ return {
24323
+ accepted,
24324
+ rejected: files.filter(f => !accepted.includes(f))
24325
+ };
24326
+ }
24327
+ return {
24328
+ accepted: files,
24329
+ rejected: []
24330
+ };
24331
+ }
24332
+ return {
24333
+ filterAccepted
24334
+ };
24335
+ }
24336
+ function createFilter(v) {
24337
+ const types = v.split(',').map(x => x.trim().toLowerCase());
24338
+ const extensionsToMatch = types.filter(x => x.startsWith('.'));
24339
+ const wildcards = types.filter(x => x.endsWith('/*'));
24340
+ const typesToMatch = types.filter(x => !extensionsToMatch.includes(x) && !wildcards.includes(x));
24341
+ return file => {
24342
+ const extension = file.name.split('.').at(-1)?.toLowerCase() ?? '';
24343
+ const typeGroup = file.type.split('/').at(0)?.toLowerCase() ?? '';
24344
+ return typesToMatch.includes(file.type) || extensionsToMatch.includes(`.${extension}`) || wildcards.includes(`${typeGroup}/*`);
24345
+ };
24346
+ }
24347
+
24177
24348
  // Types
24178
24349
 
24179
24350
  const makeVFileInputProps = propsFactory({
@@ -24206,6 +24377,7 @@ const makeVFileInputProps = propsFactory({
24206
24377
  return wrapInArray(val).every(v => v != null && typeof v === 'object');
24207
24378
  }
24208
24379
  },
24380
+ ...makeFileFilterProps(),
24209
24381
  ...makeVFieldProps({
24210
24382
  clearable: true
24211
24383
  })
@@ -24218,7 +24390,8 @@ const VFileInput = genericComponent()({
24218
24390
  'click:control': e => true,
24219
24391
  'mousedown:control': e => true,
24220
24392
  'update:focused': focused => true,
24221
- 'update:modelValue': files => true
24393
+ 'update:modelValue': files => true,
24394
+ rejected: files => true
24222
24395
  },
24223
24396
  setup(props, _ref) {
24224
24397
  let {
@@ -24229,6 +24402,9 @@ const VFileInput = genericComponent()({
24229
24402
  const {
24230
24403
  t
24231
24404
  } = useLocale();
24405
+ const {
24406
+ filterAccepted
24407
+ } = useFileFilter(props);
24232
24408
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val);
24233
24409
  const {
24234
24410
  isFocused,
@@ -24302,14 +24478,38 @@ const VFileInput = genericComponent()({
24302
24478
  e.stopImmediatePropagation();
24303
24479
  isDragging.value = false;
24304
24480
  if (!inputRef.value || !hasFilesOrFolders(e)) return;
24481
+ const allDroppedFiles = await handleDrop(e);
24482
+ selectAccepted(allDroppedFiles);
24483
+ }
24484
+ function onFileSelection(e) {
24485
+ if (!e.target || e.repack) return; // prevent loop
24486
+
24487
+ if (!props.filterByType) {
24488
+ const target = e.target;
24489
+ model.value = [...(target.files ?? [])];
24490
+ } else {
24491
+ selectAccepted([...e.target.files]);
24492
+ }
24493
+ }
24494
+ function selectAccepted(files) {
24305
24495
  const dataTransfer = new DataTransfer();
24306
- for (const file of await handleDrop(e)) {
24496
+ const {
24497
+ accepted,
24498
+ rejected
24499
+ } = filterAccepted(files);
24500
+ if (rejected.length) {
24501
+ emit('rejected', rejected);
24502
+ }
24503
+ for (const file of accepted) {
24307
24504
  dataTransfer.items.add(file);
24308
24505
  }
24309
24506
  inputRef.value.files = dataTransfer.files;
24310
- inputRef.value.dispatchEvent(new Event('change', {
24507
+ model.value = [...dataTransfer.files];
24508
+ const event = new Event('change', {
24311
24509
  bubbles: true
24312
- }));
24510
+ });
24511
+ event.repack = true;
24512
+ inputRef.value.dispatchEvent(event);
24313
24513
  }
24314
24514
  watch(model, newValue => {
24315
24515
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -24326,6 +24526,8 @@ const VFileInput = genericComponent()({
24326
24526
  ...inputProps
24327
24527
  } = VInput.filterProps(props);
24328
24528
  const fieldProps = VField.filterProps(props);
24529
+ const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
24530
+ const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
24329
24531
  return createVNode(VInput, mergeProps({
24330
24532
  "ref": vInputRef,
24331
24533
  "modelValue": props.multiple ? model.value : model.value[0],
@@ -24381,6 +24583,7 @@ const VFileInput = genericComponent()({
24381
24583
  return createElementVNode(Fragment, null, [createElementVNode("input", mergeProps({
24382
24584
  "ref": inputRef,
24383
24585
  "type": "file",
24586
+ "accept": inputAccept,
24384
24587
  "readonly": isReadonly.value,
24385
24588
  "disabled": isDisabled.value,
24386
24589
  "multiple": props.multiple,
@@ -24390,11 +24593,7 @@ const VFileInput = genericComponent()({
24390
24593
  if (isReadonly.value) e.preventDefault();
24391
24594
  onFocus();
24392
24595
  },
24393
- "onChange": e => {
24394
- if (!e.target) return;
24395
- const target = e.target;
24396
- model.value = [...(target.files ?? [])];
24397
- },
24596
+ "onChange": onFileSelection,
24398
24597
  "onDragleave": onDragleave,
24399
24598
  "onFocus": onFocus,
24400
24599
  "onBlur": blur
@@ -31914,6 +32113,7 @@ const makeVFileUploadProps = propsFactory({
31914
32113
  },
31915
32114
  showSize: Boolean,
31916
32115
  name: String,
32116
+ ...makeFileFilterProps(),
31917
32117
  ...makeDelayProps(),
31918
32118
  ...makeDensityProps(),
31919
32119
  ...pick(makeVDividerProps({
@@ -31926,11 +32126,13 @@ const VFileUpload = genericComponent()({
31926
32126
  inheritAttrs: false,
31927
32127
  props: makeVFileUploadProps(),
31928
32128
  emits: {
31929
- 'update:modelValue': files => true
32129
+ 'update:modelValue': files => true,
32130
+ rejected: files => true
31930
32131
  },
31931
32132
  setup(props, _ref) {
31932
32133
  let {
31933
32134
  attrs,
32135
+ emit,
31934
32136
  slots
31935
32137
  } = _ref;
31936
32138
  const {
@@ -31939,6 +32141,9 @@ const VFileUpload = genericComponent()({
31939
32141
  const {
31940
32142
  densityClasses
31941
32143
  } = useDensity(props);
32144
+ const {
32145
+ filterAccepted
32146
+ } = useFileFilter(props);
31942
32147
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => props.multiple || Array.isArray(props.modelValue) ? val : val[0]);
31943
32148
  const isDragging = shallowRef(false);
31944
32149
  const vSheetRef = ref(null);
@@ -31960,14 +32165,38 @@ const VFileUpload = genericComponent()({
31960
32165
  e.stopImmediatePropagation();
31961
32166
  isDragging.value = false;
31962
32167
  if (!inputRef.value) return;
32168
+ const allDroppedFiles = await handleDrop(e);
32169
+ selectAccepted(allDroppedFiles);
32170
+ }
32171
+ function onFileSelection(e) {
32172
+ if (!e.target || e.repack) return; // prevent loop
32173
+
32174
+ if (!props.filterByType) {
32175
+ const target = e.target;
32176
+ model.value = [...(target.files ?? [])];
32177
+ } else {
32178
+ selectAccepted([...e.target.files]);
32179
+ }
32180
+ }
32181
+ function selectAccepted(files) {
31963
32182
  const dataTransfer = new DataTransfer();
31964
- for (const file of await handleDrop(e)) {
32183
+ const {
32184
+ accepted,
32185
+ rejected
32186
+ } = filterAccepted(files);
32187
+ if (rejected.length) {
32188
+ emit('rejected', rejected);
32189
+ }
32190
+ for (const file of accepted) {
31965
32191
  dataTransfer.items.add(file);
31966
32192
  }
31967
32193
  inputRef.value.files = dataTransfer.files;
31968
- inputRef.value.dispatchEvent(new Event('change', {
32194
+ model.value = [...dataTransfer.files];
32195
+ const event = new Event('change', {
31969
32196
  bubbles: true
31970
- }));
32197
+ });
32198
+ event.repack = true;
32199
+ inputRef.value.dispatchEvent(event);
31971
32200
  }
31972
32201
  function onClick() {
31973
32202
  inputRef.value?.click();
@@ -31985,17 +32214,16 @@ const VFileUpload = genericComponent()({
31985
32214
  const cardProps = VSheet.filterProps(props);
31986
32215
  const dividerProps = VDivider.filterProps(props);
31987
32216
  const [rootAttrs, inputAttrs] = filterInputAttrs(attrs);
32217
+ const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
32218
+ const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
31988
32219
  const inputNode = createElementVNode("input", mergeProps({
31989
32220
  "ref": inputRef,
31990
32221
  "type": "file",
32222
+ "accept": inputAccept,
31991
32223
  "disabled": props.disabled,
31992
32224
  "multiple": props.multiple,
31993
32225
  "name": props.name,
31994
- "onChange": e => {
31995
- if (!e.target) return;
31996
- const target = e.target;
31997
- model.value = [...(target.files ?? [])];
31998
- }
32226
+ "onChange": onFileSelection
31999
32227
  }, inputAttrs), null);
32000
32228
  return createElementVNode(Fragment, null, [createVNode(VSheet, mergeProps({
32001
32229
  "ref": vSheetRef
@@ -35100,7 +35328,7 @@ function createVuetify$1() {
35100
35328
  };
35101
35329
  });
35102
35330
  }
35103
- const version$1 = "3.9.2-master.2025-07-28";
35331
+ const version$1 = "3.9.3-dev.2025-07-30";
35104
35332
  createVuetify$1.version = version$1;
35105
35333
 
35106
35334
  // Vue's inject() can only be used in setup
@@ -35398,7 +35626,7 @@ var index = /*#__PURE__*/Object.freeze({
35398
35626
 
35399
35627
  /* eslint-disable local-rules/sort-imports */
35400
35628
 
35401
- const version = "3.9.2-master.2025-07-28";
35629
+ const version = "3.9.3-dev.2025-07-30";
35402
35630
 
35403
35631
  /* eslint-disable local-rules/sort-imports */
35404
35632