@vuetify/nightly 3.9.1-master.2025-07-17 → 3.9.2-dev.2025-07-18

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 (61) hide show
  1. package/CHANGELOG.md +11 -5
  2. package/dist/json/attributes.json +3550 -3530
  3. package/dist/json/importMap-labs.json +12 -12
  4. package/dist/json/importMap.json +180 -180
  5. package/dist/json/tags.json +5 -0
  6. package/dist/json/web-types.json +20050 -6602
  7. package/dist/vuetify-labs.cjs +277 -89
  8. package/dist/vuetify-labs.css +4411 -4409
  9. package/dist/vuetify-labs.d.ts +124 -62
  10. package/dist/vuetify-labs.esm.js +277 -89
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +277 -89
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +239 -80
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +2666 -2664
  17. package/dist/vuetify.d.ts +114 -62
  18. package/dist/vuetify.esm.js +239 -80
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +239 -80
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +724 -702
  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 +1 -0
  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 +2 -2
  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/components/VTreeview/VTreeview.js +2 -3
  47. package/lib/components/VTreeview/VTreeview.js.map +1 -1
  48. package/lib/components/VTreeview/VTreeviewChildren.js +59 -59
  49. package/lib/components/VTreeview/VTreeviewChildren.js.map +1 -1
  50. package/lib/composables/fileFilter.d.ts +18 -0
  51. package/lib/composables/fileFilter.js +38 -0
  52. package/lib/composables/fileFilter.js.map +1 -0
  53. package/lib/entry-bundler.js +1 -1
  54. package/lib/entry-bundler.js.map +1 -1
  55. package/lib/framework.d.ts +62 -62
  56. package/lib/framework.js +1 -1
  57. package/lib/framework.js.map +1 -1
  58. package/lib/labs/VFileUpload/VFileUpload.d.ts +15 -0
  59. package/lib/labs/VFileUpload/VFileUpload.js +39 -9
  60. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  61. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.9.1-master.2025-07-17
2
+ * Vuetify v3.9.2-dev.2025-07-18
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -5443,6 +5443,69 @@ function useLocation(props) {
5443
5443
  };
5444
5444
  }
5445
5445
 
5446
+ // Utilities
5447
+
5448
+ // Types
5449
+
5450
+ // Composables
5451
+ const makeChunksProps = propsFactory({
5452
+ chunkCount: {
5453
+ type: [Number, String],
5454
+ default: null
5455
+ },
5456
+ chunkWidth: {
5457
+ type: [Number, String],
5458
+ default: null
5459
+ },
5460
+ chunkGap: {
5461
+ type: [Number, String],
5462
+ default: 4
5463
+ }
5464
+ }, 'chunks');
5465
+ function useChunks(props, containerWidth) {
5466
+ const hasChunks = toRef(() => !!props.chunkCount || !!props.chunkWidth);
5467
+ const chunkWidth = computed(() => {
5468
+ const containerSize = toValue(containerWidth);
5469
+ if (!containerSize) {
5470
+ return 0;
5471
+ }
5472
+ if (!props.chunkCount) {
5473
+ return Number(props.chunkWidth);
5474
+ }
5475
+ const count = Number(props.chunkCount);
5476
+ const availableWidth = containerSize - Number(props.chunkGap) * (count - 1);
5477
+ return availableWidth / count;
5478
+ });
5479
+ const chunkGap = toRef(() => Number(props.chunkGap));
5480
+ const chunksMaskStyles = computed(() => {
5481
+ if (!hasChunks.value) {
5482
+ return {};
5483
+ }
5484
+ const chunkGapPx = convertToUnit(chunkGap.value);
5485
+ const chunkWidthPx = convertToUnit(chunkWidth.value);
5486
+ return {
5487
+ maskRepeat: 'repeat-x',
5488
+ maskImage: `linear-gradient(90deg, #000, #000 ${chunkWidthPx}, transparent ${chunkWidthPx}, transparent)`,
5489
+ maskSize: `calc(${chunkWidthPx} + ${chunkGapPx}) 100%`
5490
+ };
5491
+ });
5492
+ function snapValueToChunk(val) {
5493
+ const containerSize = toValue(containerWidth);
5494
+ if (!containerSize) {
5495
+ return val;
5496
+ }
5497
+ const gapRelativeSize = 100 * chunkGap.value / containerSize;
5498
+ const chunkRelativeSize = 100 * (chunkWidth.value + chunkGap.value) / containerSize;
5499
+ const filledChunks = Math.floor((val + gapRelativeSize) / chunkRelativeSize);
5500
+ return clamp(0, filledChunks * chunkRelativeSize - gapRelativeSize / 2, 100);
5501
+ }
5502
+ return {
5503
+ hasChunks,
5504
+ chunksMaskStyles,
5505
+ snapValueToChunk
5506
+ };
5507
+ }
5508
+
5446
5509
  const makeVProgressLinearProps = propsFactory({
5447
5510
  absolute: Boolean,
5448
5511
  active: {
@@ -5477,6 +5540,7 @@ const makeVProgressLinearProps = propsFactory({
5477
5540
  stream: Boolean,
5478
5541
  striped: Boolean,
5479
5542
  roundedBar: Boolean,
5543
+ ...makeChunksProps(),
5480
5544
  ...makeComponentProps(),
5481
5545
  ...makeLocationProps({
5482
5546
  location: 'top'
@@ -5495,6 +5559,7 @@ const VProgressLinear = genericComponent()({
5495
5559
  let {
5496
5560
  slots
5497
5561
  } = _ref;
5562
+ const root = ref();
5498
5563
  const progress = useProxiedModel(props, 'modelValue');
5499
5564
  const {
5500
5565
  isRtl,
@@ -5536,6 +5601,24 @@ const VProgressLinear = genericComponent()({
5536
5601
  const isReversed = computed(() => isRtl.value !== props.reverse);
5537
5602
  const transition = computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
5538
5603
  const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches;
5604
+ const containerWidth = shallowRef(0);
5605
+ const {
5606
+ hasChunks,
5607
+ chunksMaskStyles,
5608
+ snapValueToChunk
5609
+ } = useChunks(props, containerWidth);
5610
+ useToggleScope(hasChunks, () => {
5611
+ const {
5612
+ resizeRef
5613
+ } = useResizeObserver(entries => containerWidth.value = entries[0].contentRect.width);
5614
+ watchEffect(() => resizeRef.value = root.value);
5615
+ });
5616
+ const bufferWidth = computed(() => {
5617
+ return hasChunks.value ? snapValueToChunk(normalizedBuffer.value) : normalizedBuffer.value;
5618
+ });
5619
+ const barWidth = computed(() => {
5620
+ return hasChunks.value ? snapValueToChunk(normalizedValue.value) : normalizedValue.value;
5621
+ });
5539
5622
  function handleClick(e) {
5540
5623
  if (!intersectionRef.value) return;
5541
5624
  const {
@@ -5546,8 +5629,11 @@ const VProgressLinear = genericComponent()({
5546
5629
  const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
5547
5630
  progress.value = Math.round(value / width * max.value);
5548
5631
  }
5632
+ watchEffect(() => {
5633
+ intersectionRef.value = root.value;
5634
+ });
5549
5635
  useRender(() => createVNode(props.tag, {
5550
- "ref": intersectionRef,
5636
+ "ref": root,
5551
5637
  "class": normalizeClass(['v-progress-linear', {
5552
5638
  'v-progress-linear--absolute': props.absolute,
5553
5639
  'v-progress-linear--active': props.active && isIntersecting.value,
@@ -5562,7 +5648,7 @@ const VProgressLinear = genericComponent()({
5562
5648
  height: props.active ? convertToUnit(height.value) : 0,
5563
5649
  '--v-progress-linear-height': convertToUnit(height.value),
5564
5650
  ...(props.absolute ? locationStyles.value : {})
5565
- }, props.style]),
5651
+ }, chunksMaskStyles.value, props.style]),
5566
5652
  "role": "progressbar",
5567
5653
  "aria-hidden": props.active ? 'false' : 'true',
5568
5654
  "aria-valuemin": "0",
@@ -5592,7 +5678,7 @@ const VProgressLinear = genericComponent()({
5592
5678
  "class": normalizeClass(['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined]),
5593
5679
  "style": normalizeStyle([bufferColorStyles.value, {
5594
5680
  opacity: parseFloat(props.bufferOpacity),
5595
- width: convertToUnit(normalizedBuffer.value, '%')
5681
+ width: convertToUnit(bufferWidth.value, '%')
5596
5682
  }])
5597
5683
  }, null), createVNode(Transition, {
5598
5684
  "name": transition.value
@@ -5600,7 +5686,7 @@ const VProgressLinear = genericComponent()({
5600
5686
  default: () => [!props.indeterminate ? createElementVNode("div", {
5601
5687
  "class": normalizeClass(['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined]),
5602
5688
  "style": normalizeStyle([barColorStyles.value, {
5603
- width: convertToUnit(normalizedValue.value, '%')
5689
+ width: convertToUnit(barWidth.value, '%')
5604
5690
  }])
5605
5691
  }, null) : createElementVNode("div", {
5606
5692
  "class": "v-progress-linear__indeterminate"
@@ -9818,6 +9904,11 @@ const VListItem = genericComponent()({
9818
9904
  const isLink = toRef(() => props.link !== false && link.isLink.value);
9819
9905
  const isSelectable = computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
9820
9906
  const isClickable = computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
9907
+ const role = computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
9908
+ const ariaSelected = computed(() => {
9909
+ if (!isSelectable.value) return undefined;
9910
+ return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
9911
+ });
9821
9912
  const roundedProps = toRef(() => props.rounded || props.nav);
9822
9913
  const color = toRef(() => props.color ?? props.activeColor);
9823
9914
  const variantProps = toRef(() => ({
@@ -9921,7 +10012,8 @@ const VListItem = genericComponent()({
9921
10012
  }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
9922
10013
  "style": [colorStyles.value, dimensionStyles.value, props.style],
9923
10014
  "tabindex": isClickable.value ? list ? -2 : 0 : undefined,
9924
- "aria-selected": isSelectable.value ? root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value : undefined,
10015
+ "aria-selected": ariaSelected.value,
10016
+ "role": role.value,
9925
10017
  "onClick": onClick,
9926
10018
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
9927
10019
  }, link.linkProps), {
@@ -10423,6 +10515,7 @@ const VList = genericComponent()({
10423
10515
  const activeColor = toRef(() => props.activeColor);
10424
10516
  const baseColor = toRef(() => props.baseColor);
10425
10517
  const color = toRef(() => props.color);
10518
+ const isSelectable = toRef(() => props.selectable || props.activatable);
10426
10519
  createList({
10427
10520
  filterable: props.filterable
10428
10521
  });
@@ -10494,7 +10587,7 @@ const VList = genericComponent()({
10494
10587
  }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class]),
10495
10588
  "style": normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style]),
10496
10589
  "tabindex": props.disabled ? -1 : 0,
10497
- "role": "listbox",
10590
+ "role": isSelectable.value ? 'listbox' : 'list',
10498
10591
  "aria-activedescendant": undefined,
10499
10592
  "onFocusin": onFocusin,
10500
10593
  "onFocusout": onFocusout,
@@ -13564,6 +13657,7 @@ const VSelect = genericComponent()({
13564
13657
  "onKeydown": onListKeydown,
13565
13658
  "onFocusin": onFocusin,
13566
13659
  "tabindex": "-1",
13660
+ "selectable": true,
13567
13661
  "aria-live": "polite",
13568
13662
  "aria-label": `${props.label}-list`,
13569
13663
  "color": props.itemColor ?? props.color
@@ -14183,6 +14277,7 @@ const VAutocomplete = genericComponent()({
14183
14277
  "onFocusin": onFocusin,
14184
14278
  "onFocusout": onFocusout,
14185
14279
  "tabindex": "-1",
14280
+ "selectable": true,
14186
14281
  "aria-live": "polite",
14187
14282
  "color": props.itemColor ?? props.color
14188
14283
  }, listEvents, props.listProps), {
@@ -19270,6 +19365,7 @@ const VCombobox = genericComponent()({
19270
19365
  "selected": selectedValues.value,
19271
19366
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
19272
19367
  "onMousedown": e => e.preventDefault(),
19368
+ "selectable": true,
19273
19369
  "onKeydown": onListKeydown,
19274
19370
  "onFocusin": onFocusin,
19275
19371
  "onFocusout": onFocusout,
@@ -24368,6 +24464,42 @@ function appendIfDirectory(path, item) {
24368
24464
  return item.isDirectory ? `${path}/${item.name}` : path;
24369
24465
  }
24370
24466
 
24467
+ // Utilities
24468
+ // Composables
24469
+ const makeFileFilterProps = propsFactory({
24470
+ filterByType: String
24471
+ }, 'file-accept');
24472
+ function useFileFilter(props) {
24473
+ const fileFilter = computed(() => props.filterByType ? createFilter(props.filterByType) : null);
24474
+ function filterAccepted(files) {
24475
+ if (fileFilter.value) {
24476
+ const accepted = files.filter(fileFilter.value);
24477
+ return {
24478
+ accepted,
24479
+ rejected: files.filter(f => !accepted.includes(f))
24480
+ };
24481
+ }
24482
+ return {
24483
+ accepted: files,
24484
+ rejected: []
24485
+ };
24486
+ }
24487
+ return {
24488
+ filterAccepted
24489
+ };
24490
+ }
24491
+ function createFilter(v) {
24492
+ const types = v.split(',').map(x => x.trim().toLowerCase());
24493
+ const extensionsToMatch = types.filter(x => x.startsWith('.'));
24494
+ const wildcards = types.filter(x => x.endsWith('/*'));
24495
+ const typesToMatch = types.filter(x => !extensionsToMatch.includes(x) && !wildcards.includes(x));
24496
+ return file => {
24497
+ const extension = file.name.split('.').at(-1)?.toLowerCase() ?? '';
24498
+ const typeGroup = file.type.split('/').at(0)?.toLowerCase() ?? '';
24499
+ return typesToMatch.includes(file.type) || extensionsToMatch.includes(`.${extension}`) || wildcards.includes(`${typeGroup}/*`);
24500
+ };
24501
+ }
24502
+
24371
24503
  // Types
24372
24504
 
24373
24505
  const makeVFileInputProps = propsFactory({
@@ -24400,6 +24532,7 @@ const makeVFileInputProps = propsFactory({
24400
24532
  return wrapInArray(val).every(v => v != null && typeof v === 'object');
24401
24533
  }
24402
24534
  },
24535
+ ...makeFileFilterProps(),
24403
24536
  ...makeVFieldProps({
24404
24537
  clearable: true
24405
24538
  })
@@ -24412,7 +24545,8 @@ const VFileInput = genericComponent()({
24412
24545
  'click:control': e => true,
24413
24546
  'mousedown:control': e => true,
24414
24547
  'update:focused': focused => true,
24415
- 'update:modelValue': files => true
24548
+ 'update:modelValue': files => true,
24549
+ rejected: files => true
24416
24550
  },
24417
24551
  setup(props, _ref) {
24418
24552
  let {
@@ -24423,6 +24557,9 @@ const VFileInput = genericComponent()({
24423
24557
  const {
24424
24558
  t
24425
24559
  } = useLocale();
24560
+ const {
24561
+ filterAccepted
24562
+ } = useFileFilter(props);
24426
24563
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val);
24427
24564
  const {
24428
24565
  isFocused,
@@ -24496,14 +24633,38 @@ const VFileInput = genericComponent()({
24496
24633
  e.stopImmediatePropagation();
24497
24634
  isDragging.value = false;
24498
24635
  if (!inputRef.value || !hasFilesOrFolders(e)) return;
24636
+ const allDroppedFiles = await handleDrop(e);
24637
+ selectAccepted(allDroppedFiles);
24638
+ }
24639
+ function onFileSelection(e) {
24640
+ if (!e.target || e.repack) return; // prevent loop
24641
+
24642
+ if (!props.filterByType) {
24643
+ const target = e.target;
24644
+ model.value = [...(target.files ?? [])];
24645
+ } else {
24646
+ selectAccepted([...e.target.files]);
24647
+ }
24648
+ }
24649
+ function selectAccepted(files) {
24499
24650
  const dataTransfer = new DataTransfer();
24500
- for (const file of await handleDrop(e)) {
24651
+ const {
24652
+ accepted,
24653
+ rejected
24654
+ } = filterAccepted(files);
24655
+ if (rejected.length) {
24656
+ emit('rejected', rejected);
24657
+ }
24658
+ for (const file of accepted) {
24501
24659
  dataTransfer.items.add(file);
24502
24660
  }
24503
24661
  inputRef.value.files = dataTransfer.files;
24504
- inputRef.value.dispatchEvent(new Event('change', {
24662
+ model.value = [...dataTransfer.files];
24663
+ const event = new Event('change', {
24505
24664
  bubbles: true
24506
- }));
24665
+ });
24666
+ event.repack = true;
24667
+ inputRef.value.dispatchEvent(event);
24507
24668
  }
24508
24669
  watch(model, newValue => {
24509
24670
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -24520,6 +24681,8 @@ const VFileInput = genericComponent()({
24520
24681
  ...inputProps
24521
24682
  } = VInput.filterProps(props);
24522
24683
  const fieldProps = VField.filterProps(props);
24684
+ const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
24685
+ const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
24523
24686
  return createVNode(VInput, mergeProps({
24524
24687
  "ref": vInputRef,
24525
24688
  "modelValue": props.multiple ? model.value : model.value[0],
@@ -24575,6 +24738,7 @@ const VFileInput = genericComponent()({
24575
24738
  return createElementVNode(Fragment, null, [createElementVNode("input", mergeProps({
24576
24739
  "ref": inputRef,
24577
24740
  "type": "file",
24741
+ "accept": inputAccept,
24578
24742
  "readonly": isReadonly.value,
24579
24743
  "disabled": isDisabled.value,
24580
24744
  "multiple": props.multiple,
@@ -24584,11 +24748,7 @@ const VFileInput = genericComponent()({
24584
24748
  if (isReadonly.value) e.preventDefault();
24585
24749
  onFocus();
24586
24750
  },
24587
- "onChange": e => {
24588
- if (!e.target) return;
24589
- const target = e.target;
24590
- model.value = [...(target.files ?? [])];
24591
- },
24751
+ "onChange": onFileSelection,
24592
24752
  "onDragleave": onDragleave,
24593
24753
  "onFocus": onFocus,
24594
24754
  "onBlur": blur
@@ -30623,51 +30783,48 @@ const VTreeviewChildren = genericComponent()({
30623
30783
  parentIndentLines: props.parentIndentLines,
30624
30784
  variant: props.indentLinesVariant
30625
30785
  });
30626
- function renderItem(itemProps) {
30627
- return createVNode(VTreeviewItem, itemProps, {
30628
- prepend: slotProps => createElementVNode(Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && createElementVNode("div", null, [createVNode(VCheckboxBtn, {
30629
- "key": item.value,
30630
- "modelValue": slotProps.isSelected,
30631
- "disabled": props.disabled,
30632
- "loading": loading,
30633
- "color": props.selectedColor,
30634
- "density": props.density,
30635
- "indeterminate": slotProps.isIndeterminate,
30636
- "indeterminateIcon": props.indeterminateIcon,
30637
- "falseIcon": props.falseIcon,
30638
- "trueIcon": props.trueIcon,
30639
- "onUpdate:modelValue": v => selectItem(slotProps.select, v),
30640
- "onClick": e => e.stopPropagation(),
30641
- "onKeydown": e => {
30642
- if (!['Enter', 'Space'].includes(e.key)) return;
30643
- e.stopPropagation();
30644
- selectItem(slotProps.select, slotProps.isSelected);
30645
- }
30646
- }, null)]), slots.prepend?.({
30647
- ...slotProps,
30648
- ...treeItemProps,
30649
- item: item.raw,
30650
- internalItem: item
30651
- })]),
30652
- append: slots.append ? slotProps => slots.append?.({
30653
- ...slotProps,
30654
- ...treeItemProps,
30655
- item: item.raw,
30656
- internalItem: item
30657
- }) : undefined,
30658
- title: slots.title ? slotProps => slots.title?.({
30659
- ...slotProps,
30660
- item: item.raw,
30661
- internalItem: item
30662
- }) : undefined,
30663
- subtitle: slots.subtitle ? slotProps => slots.subtitle?.({
30664
- ...slotProps,
30665
- item: item.raw,
30666
- internalItem: item
30667
- }) : undefined,
30668
- $stable: true
30669
- });
30670
- }
30786
+ const slotsWithItem = {
30787
+ prepend: slotProps => createElementVNode(Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && createElementVNode("div", null, [createVNode(VCheckboxBtn, {
30788
+ "key": item.value,
30789
+ "modelValue": slotProps.isSelected,
30790
+ "disabled": props.disabled,
30791
+ "loading": loading,
30792
+ "color": props.selectedColor,
30793
+ "density": props.density,
30794
+ "indeterminate": slotProps.isIndeterminate,
30795
+ "indeterminateIcon": props.indeterminateIcon,
30796
+ "falseIcon": props.falseIcon,
30797
+ "trueIcon": props.trueIcon,
30798
+ "onUpdate:modelValue": v => selectItem(slotProps.select, v),
30799
+ "onClick": e => e.stopPropagation(),
30800
+ "onKeydown": e => {
30801
+ if (!['Enter', 'Space'].includes(e.key)) return;
30802
+ e.stopPropagation();
30803
+ selectItem(slotProps.select, slotProps.isSelected);
30804
+ }
30805
+ }, null)]), slots.prepend?.({
30806
+ ...slotProps,
30807
+ ...treeItemProps,
30808
+ item: item.raw,
30809
+ internalItem: item
30810
+ })]),
30811
+ append: slots.append ? slotProps => slots.append?.({
30812
+ ...slotProps,
30813
+ ...treeItemProps,
30814
+ item: item.raw,
30815
+ internalItem: item
30816
+ }) : undefined,
30817
+ title: slots.title ? slotProps => slots.title?.({
30818
+ ...slotProps,
30819
+ item: item.raw,
30820
+ internalItem: item
30821
+ }) : undefined,
30822
+ subtitle: slots.subtitle ? slotProps => slots.subtitle?.({
30823
+ ...slotProps,
30824
+ item: item.raw,
30825
+ internalItem: item
30826
+ }) : undefined
30827
+ };
30671
30828
  const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
30672
30829
  const treeviewChildrenProps = VTreeviewChildren.filterProps({
30673
30830
  ...props,
@@ -30681,16 +30838,21 @@ const VTreeviewChildren = genericComponent()({
30681
30838
  let {
30682
30839
  props: activatorProps
30683
30840
  } = _ref2;
30684
- return renderItem({
30841
+ const listItemProps = {
30685
30842
  ...itemProps,
30686
30843
  ...activatorProps,
30687
- loading,
30688
- hideActions: props.hideActions,
30689
- indentLines: indentLines.node,
30690
- value: props.returnObject ? item.raw : itemProps.value,
30844
+ value: itemProps?.value,
30691
30845
  onToggleExpand: [() => checkChildren(item), activatorProps.onClick],
30692
30846
  onClick: isClickOnOpen.value ? [() => checkChildren(item), activatorProps.onClick] : () => selectItem(activatorItems.value[index]?.select, !activatorItems.value[index]?.isSelected)
30693
- });
30847
+ };
30848
+ return createVNode(VTreeviewItem, mergeProps({
30849
+ "ref": el => activatorItems.value[index] = el
30850
+ }, listItemProps, {
30851
+ "hideActions": props.hideActions,
30852
+ "indentLines": indentLines.node,
30853
+ "value": props.returnObject ? item.raw : itemProps.value,
30854
+ "loading": loading
30855
+ }), slotsWithItem);
30694
30856
  },
30695
30857
  default: () => createVNode(VTreeviewChildren, mergeProps(treeviewChildrenProps, {
30696
30858
  "items": children,
@@ -30698,8 +30860,7 @@ const VTreeviewChildren = genericComponent()({
30698
30860
  "parentIndentLines": indentLines.children,
30699
30861
  "isLastGroup": nextItemHasChildren,
30700
30862
  "returnObject": props.returnObject
30701
- }), slots),
30702
- $stable: true
30863
+ }), slots)
30703
30864
  }) : renderSlot(slots.item, {
30704
30865
  props: itemProps,
30705
30866
  item: item.raw,
@@ -30715,12 +30876,11 @@ const VTreeviewChildren = genericComponent()({
30715
30876
  props: item.raw
30716
30877
  }, () => createVNode(VListSubheader, item.props, null));
30717
30878
  }
30718
- return renderItem({
30719
- ...itemProps,
30720
- hideActions: props.hideActions,
30721
- indentLines: indentLines.leaf,
30722
- value: props.returnObject ? toRaw(item.raw) : itemProps.value
30723
- });
30879
+ return createVNode(VTreeviewItem, mergeProps(itemProps, {
30880
+ "hideActions": props.hideActions,
30881
+ "indentLines": indentLines.leaf,
30882
+ "value": props.returnObject ? toRaw(item.raw) : itemProps.value
30883
+ }), slotsWithItem);
30724
30884
  });
30725
30885
  });
30726
30886
  }
@@ -30859,14 +31019,13 @@ const VTreeview = genericComponent()({
30859
31019
  "selected": selected.value,
30860
31020
  "onUpdate:selected": $event => selected.value = $event
30861
31021
  }), {
30862
- default: () => createVNode(VTreeviewChildren, mergeProps(treeviewChildrenProps, {
31022
+ default: () => [createVNode(VTreeviewChildren, mergeProps(treeviewChildrenProps, {
30863
31023
  "density": props.density,
30864
31024
  "returnObject": props.returnObject,
30865
31025
  "items": items.value,
30866
31026
  "parentIndentLines": props.indentLines ? [] : undefined,
30867
31027
  "indentLinesVariant": indentLinesVariant
30868
- }), slots),
30869
- $stable: true
31028
+ }), slots)]
30870
31029
  });
30871
31030
  });
30872
31031
  return {};
@@ -31385,7 +31544,7 @@ function createVuetify$1() {
31385
31544
  };
31386
31545
  });
31387
31546
  }
31388
- const version$1 = "3.9.1-master.2025-07-17";
31547
+ const version$1 = "3.9.2-dev.2025-07-18";
31389
31548
  createVuetify$1.version = version$1;
31390
31549
 
31391
31550
  // Vue's inject() can only be used in setup
@@ -31410,7 +31569,7 @@ const createVuetify = function () {
31410
31569
  ...options
31411
31570
  });
31412
31571
  };
31413
- const version = "3.9.1-master.2025-07-17";
31572
+ const version = "3.9.2-dev.2025-07-18";
31414
31573
  createVuetify.version = version;
31415
31574
 
31416
31575
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useHotkey, useLayout, useLocale, useRtl, useTheme, version };