@vuetify/nightly 3.9.2-master.2025-07-29 → 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 (60) hide show
  1. package/CHANGELOG.md +6 -62
  2. package/dist/json/attributes.json +4301 -4281
  3. package/dist/json/importMap-labs.json +26 -26
  4. package/dist/json/importMap.json +188 -188
  5. package/dist/json/tags.json +5 -0
  6. package/dist/json/web-types.json +7597 -7527
  7. package/dist/vuetify-labs.cjs +228 -33
  8. package/dist/vuetify-labs.css +5466 -5464
  9. package/dist/vuetify-labs.d.ts +134 -71
  10. package/dist/vuetify-labs.esm.js +228 -33
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +228 -33
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +190 -24
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +5163 -5161
  17. package/dist/vuetify.d.ts +124 -71
  18. package/dist/vuetify.esm.js +190 -24
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +190 -24
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +731 -708
  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/VFileInput/VFileInput.d.ts +15 -0
  30. package/lib/components/VFileInput/VFileInput.js +38 -9
  31. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  32. package/lib/components/VList/VList.js +2 -1
  33. package/lib/components/VList/VList.js.map +1 -1
  34. package/lib/components/VList/VListItem.js +7 -1
  35. package/lib/components/VList/VListItem.js.map +1 -1
  36. package/lib/components/VProgressLinear/VProgressLinear.css +1 -1
  37. package/lib/components/VProgressLinear/VProgressLinear.d.ts +75 -0
  38. package/lib/components/VProgressLinear/VProgressLinear.js +32 -6
  39. package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
  40. package/lib/components/VProgressLinear/VProgressLinear.sass +1 -1
  41. package/lib/components/VProgressLinear/chunks.d.ts +55 -0
  42. package/lib/components/VProgressLinear/chunks.js +62 -0
  43. package/lib/components/VProgressLinear/chunks.js.map +1 -0
  44. package/lib/components/VSelect/VSelect.js +1 -0
  45. package/lib/components/VSelect/VSelect.js.map +1 -1
  46. package/lib/composables/fileFilter.d.ts +18 -0
  47. package/lib/composables/fileFilter.js +38 -0
  48. package/lib/composables/fileFilter.js.map +1 -0
  49. package/lib/composables/theme.d.ts +1 -0
  50. package/lib/composables/theme.js +3 -1
  51. package/lib/composables/theme.js.map +1 -1
  52. package/lib/entry-bundler.js +1 -1
  53. package/lib/entry-bundler.js.map +1 -1
  54. package/lib/framework.d.ts +72 -71
  55. package/lib/framework.js +1 -1
  56. package/lib/framework.js.map +1 -1
  57. package/lib/labs/VFileUpload/VFileUpload.d.ts +15 -0
  58. package/lib/labs/VFileUpload/VFileUpload.js +39 -9
  59. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  60. package/package.json +1 -1
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.9.2-master.2025-07-29
2
+ * Vuetify v3.9.3-dev.2025-07-30
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -3163,6 +3163,7 @@
3163
3163
  return acc;
3164
3164
  });
3165
3165
  const current = vue.toRef(() => computedThemes.value[name.value]);
3166
+ const isSystem = vue.toRef(() => _name.value === 'system');
3166
3167
  const styles = vue.computed(() => {
3167
3168
  const lines = [];
3168
3169
  const important = parsedOptions.unimportant ? '' : ' !important';
@@ -3250,7 +3251,7 @@
3250
3251
  }
3251
3252
  }
3252
3253
  function change(themeName) {
3253
- if (!themeNames.value.includes(themeName)) {
3254
+ if (themeName !== 'system' && !themeNames.value.includes(themeName)) {
3254
3255
  consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3255
3256
  return;
3256
3257
  }
@@ -3283,6 +3284,7 @@
3283
3284
  cycle,
3284
3285
  toggle,
3285
3286
  isDisabled: parsedOptions.isDisabled,
3287
+ isSystem,
3286
3288
  name,
3287
3289
  themes,
3288
3290
  current,
@@ -5494,6 +5496,69 @@
5494
5496
  };
5495
5497
  }
5496
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
+
5497
5562
  const makeVProgressLinearProps = propsFactory({
5498
5563
  absolute: Boolean,
5499
5564
  active: {
@@ -5528,6 +5593,7 @@
5528
5593
  stream: Boolean,
5529
5594
  striped: Boolean,
5530
5595
  roundedBar: Boolean,
5596
+ ...makeChunksProps(),
5531
5597
  ...makeComponentProps(),
5532
5598
  ...makeLocationProps({
5533
5599
  location: 'top'
@@ -5546,6 +5612,7 @@
5546
5612
  let {
5547
5613
  slots
5548
5614
  } = _ref;
5615
+ const root = vue.ref();
5549
5616
  const progress = useProxiedModel(props, 'modelValue');
5550
5617
  const {
5551
5618
  isRtl,
@@ -5587,6 +5654,24 @@
5587
5654
  const isReversed = vue.computed(() => isRtl.value !== props.reverse);
5588
5655
  const transition = vue.computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
5589
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
+ });
5590
5675
  function handleClick(e) {
5591
5676
  if (!intersectionRef.value) return;
5592
5677
  const {
@@ -5597,8 +5682,11 @@
5597
5682
  const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
5598
5683
  progress.value = Math.round(value / width * max.value);
5599
5684
  }
5685
+ vue.watchEffect(() => {
5686
+ intersectionRef.value = root.value;
5687
+ });
5600
5688
  useRender(() => vue.createVNode(props.tag, {
5601
- "ref": intersectionRef,
5689
+ "ref": root,
5602
5690
  "class": vue.normalizeClass(['v-progress-linear', {
5603
5691
  'v-progress-linear--absolute': props.absolute,
5604
5692
  'v-progress-linear--active': props.active && isIntersecting.value,
@@ -5614,7 +5702,7 @@
5614
5702
  height: props.active ? convertToUnit(height.value) : 0,
5615
5703
  '--v-progress-linear-height': convertToUnit(height.value),
5616
5704
  ...(props.absolute ? locationStyles.value : {})
5617
- }, props.style]),
5705
+ }, chunksMaskStyles.value, props.style]),
5618
5706
  "role": "progressbar",
5619
5707
  "aria-hidden": props.active ? 'false' : 'true',
5620
5708
  "aria-valuemin": "0",
@@ -5644,7 +5732,7 @@
5644
5732
  "class": vue.normalizeClass(['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined]),
5645
5733
  "style": vue.normalizeStyle([bufferColorStyles.value, {
5646
5734
  opacity: parseFloat(props.bufferOpacity),
5647
- width: convertToUnit(normalizedBuffer.value, '%')
5735
+ width: convertToUnit(bufferWidth.value, '%')
5648
5736
  }])
5649
5737
  }, null), vue.createVNode(vue.Transition, {
5650
5738
  "name": transition.value
@@ -5652,7 +5740,7 @@
5652
5740
  default: () => [!props.indeterminate ? vue.createElementVNode("div", {
5653
5741
  "class": vue.normalizeClass(['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined]),
5654
5742
  "style": vue.normalizeStyle([barColorStyles.value, {
5655
- width: convertToUnit(normalizedValue.value, '%')
5743
+ width: convertToUnit(barWidth.value, '%')
5656
5744
  }])
5657
5745
  }, null) : vue.createElementVNode("div", {
5658
5746
  "class": "v-progress-linear__indeterminate"
@@ -9856,6 +9944,11 @@
9856
9944
  const isLink = vue.toRef(() => props.link !== false && link.isLink.value);
9857
9945
  const isSelectable = vue.computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
9858
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
+ });
9859
9952
  const roundedProps = vue.toRef(() => props.rounded || props.nav);
9860
9953
  const color = vue.toRef(() => props.color ?? props.activeColor);
9861
9954
  const variantProps = vue.toRef(() => ({
@@ -9959,7 +10052,8 @@
9959
10052
  }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
9960
10053
  "style": [colorStyles.value, dimensionStyles.value, props.style],
9961
10054
  "tabindex": isClickable.value ? list ? -2 : 0 : undefined,
9962
- "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,
9963
10057
  "onClick": onClick,
9964
10058
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
9965
10059
  }, link.linkProps), {
@@ -10459,6 +10553,7 @@
10459
10553
  const activeColor = vue.toRef(() => props.activeColor);
10460
10554
  const baseColor = vue.toRef(() => props.baseColor);
10461
10555
  const color = vue.toRef(() => props.color);
10556
+ const isSelectable = vue.toRef(() => props.selectable || props.activatable);
10462
10557
  createList({
10463
10558
  filterable: props.filterable
10464
10559
  });
@@ -10530,7 +10625,7 @@
10530
10625
  }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class]),
10531
10626
  "style": vue.normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style]),
10532
10627
  "tabindex": props.disabled ? -1 : 0,
10533
- "role": "listbox",
10628
+ "role": isSelectable.value ? 'listbox' : 'list',
10534
10629
  "aria-activedescendant": undefined,
10535
10630
  "onFocusin": onFocusin,
10536
10631
  "onFocusout": onFocusout,
@@ -13609,6 +13704,7 @@
13609
13704
  "onKeydown": onListKeydown,
13610
13705
  "onFocusin": onFocusin,
13611
13706
  "tabindex": "-1",
13707
+ "selectable": true,
13612
13708
  "aria-live": "polite",
13613
13709
  "aria-label": `${props.label}-list`,
13614
13710
  "color": props.itemColor ?? props.color
@@ -14228,6 +14324,7 @@
14228
14324
  "onFocusin": onFocusin,
14229
14325
  "onFocusout": onFocusout,
14230
14326
  "tabindex": "-1",
14327
+ "selectable": true,
14231
14328
  "aria-live": "polite",
14232
14329
  "color": props.itemColor ?? props.color
14233
14330
  }, listEvents, props.listProps), {
@@ -19041,19 +19138,23 @@
19041
19138
  get: () => {
19042
19139
  return _search.value;
19043
19140
  },
19044
- set: val => {
19141
+ set: async val => {
19045
19142
  _search.value = val ?? '';
19046
19143
  if (!props.multiple && !hasSelectionSlot.value) {
19047
19144
  model.value = [transformItem$3(props, val)];
19048
19145
  vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
19049
19146
  }
19050
19147
  if (val && props.multiple && props.delimiters?.length) {
19051
- 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})+`));
19052
19150
  if (values.length > 1) {
19053
- values.forEach(v => {
19151
+ for (let v of values) {
19054
19152
  v = v.trim();
19055
- if (v) select(transformItem$3(props, v));
19056
- });
19153
+ if (v) {
19154
+ select(transformItem$3(props, v));
19155
+ await vue.nextTick();
19156
+ }
19157
+ }
19057
19158
  _search.value = '';
19058
19159
  }
19059
19160
  }
@@ -19335,6 +19436,7 @@
19335
19436
  "selected": selectedValues.value,
19336
19437
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
19337
19438
  "onMousedown": e => e.preventDefault(),
19439
+ "selectable": true,
19338
19440
  "onKeydown": onListKeydown,
19339
19441
  "onFocusin": onFocusin,
19340
19442
  "onFocusout": onFocusout,
@@ -24451,6 +24553,42 @@
24451
24553
  return item.isDirectory ? `${path}/${item.name}` : path;
24452
24554
  }
24453
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
+
24454
24592
  // Types
24455
24593
 
24456
24594
  const makeVFileInputProps = propsFactory({
@@ -24483,6 +24621,7 @@
24483
24621
  return wrapInArray(val).every(v => v != null && typeof v === 'object');
24484
24622
  }
24485
24623
  },
24624
+ ...makeFileFilterProps(),
24486
24625
  ...makeVFieldProps({
24487
24626
  clearable: true
24488
24627
  })
@@ -24495,7 +24634,8 @@
24495
24634
  'click:control': e => true,
24496
24635
  'mousedown:control': e => true,
24497
24636
  'update:focused': focused => true,
24498
- 'update:modelValue': files => true
24637
+ 'update:modelValue': files => true,
24638
+ rejected: files => true
24499
24639
  },
24500
24640
  setup(props, _ref) {
24501
24641
  let {
@@ -24506,6 +24646,9 @@
24506
24646
  const {
24507
24647
  t
24508
24648
  } = useLocale();
24649
+ const {
24650
+ filterAccepted
24651
+ } = useFileFilter(props);
24509
24652
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val);
24510
24653
  const {
24511
24654
  isFocused,
@@ -24579,14 +24722,38 @@
24579
24722
  e.stopImmediatePropagation();
24580
24723
  isDragging.value = false;
24581
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) {
24582
24739
  const dataTransfer = new DataTransfer();
24583
- 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) {
24584
24748
  dataTransfer.items.add(file);
24585
24749
  }
24586
24750
  inputRef.value.files = dataTransfer.files;
24587
- inputRef.value.dispatchEvent(new Event('change', {
24751
+ model.value = [...dataTransfer.files];
24752
+ const event = new Event('change', {
24588
24753
  bubbles: true
24589
- }));
24754
+ });
24755
+ event.repack = true;
24756
+ inputRef.value.dispatchEvent(event);
24590
24757
  }
24591
24758
  vue.watch(model, newValue => {
24592
24759
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -24603,6 +24770,8 @@
24603
24770
  ...inputProps
24604
24771
  } = VInput.filterProps(props);
24605
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);
24606
24775
  return vue.createVNode(VInput, vue.mergeProps({
24607
24776
  "ref": vInputRef,
24608
24777
  "modelValue": props.multiple ? model.value : model.value[0],
@@ -24658,6 +24827,7 @@
24658
24827
  return vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("input", vue.mergeProps({
24659
24828
  "ref": inputRef,
24660
24829
  "type": "file",
24830
+ "accept": inputAccept,
24661
24831
  "readonly": isReadonly.value,
24662
24832
  "disabled": isDisabled.value,
24663
24833
  "multiple": props.multiple,
@@ -24667,11 +24837,7 @@
24667
24837
  if (isReadonly.value) e.preventDefault();
24668
24838
  onFocus();
24669
24839
  },
24670
- "onChange": e => {
24671
- if (!e.target) return;
24672
- const target = e.target;
24673
- model.value = [...(target.files ?? [])];
24674
- },
24840
+ "onChange": onFileSelection,
24675
24841
  "onDragleave": onDragleave,
24676
24842
  "onFocus": onFocus,
24677
24843
  "onBlur": blur
@@ -31469,7 +31635,7 @@
31469
31635
  };
31470
31636
  });
31471
31637
  }
31472
- const version$1 = "3.9.2-master.2025-07-29";
31638
+ const version$1 = "3.9.3-dev.2025-07-30";
31473
31639
  createVuetify$1.version = version$1;
31474
31640
 
31475
31641
  // Vue's inject() can only be used in setup
@@ -31494,7 +31660,7 @@
31494
31660
  ...options
31495
31661
  });
31496
31662
  };
31497
- const version = "3.9.2-master.2025-07-29";
31663
+ const version = "3.9.3-dev.2025-07-30";
31498
31664
  createVuetify.version = version;
31499
31665
 
31500
31666
  exports.blueprints = index;