@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
package/dist/vuetify.cjs CHANGED
@@ -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
  */
@@ -5447,6 +5447,69 @@
5447
5447
  };
5448
5448
  }
5449
5449
 
5450
+ // Utilities
5451
+
5452
+ // Types
5453
+
5454
+ // Composables
5455
+ const makeChunksProps = propsFactory({
5456
+ chunkCount: {
5457
+ type: [Number, String],
5458
+ default: null
5459
+ },
5460
+ chunkWidth: {
5461
+ type: [Number, String],
5462
+ default: null
5463
+ },
5464
+ chunkGap: {
5465
+ type: [Number, String],
5466
+ default: 4
5467
+ }
5468
+ }, 'chunks');
5469
+ function useChunks(props, containerWidth) {
5470
+ const hasChunks = vue.toRef(() => !!props.chunkCount || !!props.chunkWidth);
5471
+ const chunkWidth = vue.computed(() => {
5472
+ const containerSize = vue.toValue(containerWidth);
5473
+ if (!containerSize) {
5474
+ return 0;
5475
+ }
5476
+ if (!props.chunkCount) {
5477
+ return Number(props.chunkWidth);
5478
+ }
5479
+ const count = Number(props.chunkCount);
5480
+ const availableWidth = containerSize - Number(props.chunkGap) * (count - 1);
5481
+ return availableWidth / count;
5482
+ });
5483
+ const chunkGap = vue.toRef(() => Number(props.chunkGap));
5484
+ const chunksMaskStyles = vue.computed(() => {
5485
+ if (!hasChunks.value) {
5486
+ return {};
5487
+ }
5488
+ const chunkGapPx = convertToUnit(chunkGap.value);
5489
+ const chunkWidthPx = convertToUnit(chunkWidth.value);
5490
+ return {
5491
+ maskRepeat: 'repeat-x',
5492
+ maskImage: `linear-gradient(90deg, #000, #000 ${chunkWidthPx}, transparent ${chunkWidthPx}, transparent)`,
5493
+ maskSize: `calc(${chunkWidthPx} + ${chunkGapPx}) 100%`
5494
+ };
5495
+ });
5496
+ function snapValueToChunk(val) {
5497
+ const containerSize = vue.toValue(containerWidth);
5498
+ if (!containerSize) {
5499
+ return val;
5500
+ }
5501
+ const gapRelativeSize = 100 * chunkGap.value / containerSize;
5502
+ const chunkRelativeSize = 100 * (chunkWidth.value + chunkGap.value) / containerSize;
5503
+ const filledChunks = Math.floor((val + gapRelativeSize) / chunkRelativeSize);
5504
+ return clamp(0, filledChunks * chunkRelativeSize - gapRelativeSize / 2, 100);
5505
+ }
5506
+ return {
5507
+ hasChunks,
5508
+ chunksMaskStyles,
5509
+ snapValueToChunk
5510
+ };
5511
+ }
5512
+
5450
5513
  const makeVProgressLinearProps = propsFactory({
5451
5514
  absolute: Boolean,
5452
5515
  active: {
@@ -5481,6 +5544,7 @@
5481
5544
  stream: Boolean,
5482
5545
  striped: Boolean,
5483
5546
  roundedBar: Boolean,
5547
+ ...makeChunksProps(),
5484
5548
  ...makeComponentProps(),
5485
5549
  ...makeLocationProps({
5486
5550
  location: 'top'
@@ -5499,6 +5563,7 @@
5499
5563
  let {
5500
5564
  slots
5501
5565
  } = _ref;
5566
+ const root = vue.ref();
5502
5567
  const progress = useProxiedModel(props, 'modelValue');
5503
5568
  const {
5504
5569
  isRtl,
@@ -5540,6 +5605,24 @@
5540
5605
  const isReversed = vue.computed(() => isRtl.value !== props.reverse);
5541
5606
  const transition = vue.computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
5542
5607
  const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches;
5608
+ const containerWidth = vue.shallowRef(0);
5609
+ const {
5610
+ hasChunks,
5611
+ chunksMaskStyles,
5612
+ snapValueToChunk
5613
+ } = useChunks(props, containerWidth);
5614
+ useToggleScope(hasChunks, () => {
5615
+ const {
5616
+ resizeRef
5617
+ } = useResizeObserver(entries => containerWidth.value = entries[0].contentRect.width);
5618
+ vue.watchEffect(() => resizeRef.value = root.value);
5619
+ });
5620
+ const bufferWidth = vue.computed(() => {
5621
+ return hasChunks.value ? snapValueToChunk(normalizedBuffer.value) : normalizedBuffer.value;
5622
+ });
5623
+ const barWidth = vue.computed(() => {
5624
+ return hasChunks.value ? snapValueToChunk(normalizedValue.value) : normalizedValue.value;
5625
+ });
5543
5626
  function handleClick(e) {
5544
5627
  if (!intersectionRef.value) return;
5545
5628
  const {
@@ -5550,8 +5633,11 @@
5550
5633
  const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
5551
5634
  progress.value = Math.round(value / width * max.value);
5552
5635
  }
5636
+ vue.watchEffect(() => {
5637
+ intersectionRef.value = root.value;
5638
+ });
5553
5639
  useRender(() => vue.createVNode(props.tag, {
5554
- "ref": intersectionRef,
5640
+ "ref": root,
5555
5641
  "class": vue.normalizeClass(['v-progress-linear', {
5556
5642
  'v-progress-linear--absolute': props.absolute,
5557
5643
  'v-progress-linear--active': props.active && isIntersecting.value,
@@ -5566,7 +5652,7 @@
5566
5652
  height: props.active ? convertToUnit(height.value) : 0,
5567
5653
  '--v-progress-linear-height': convertToUnit(height.value),
5568
5654
  ...(props.absolute ? locationStyles.value : {})
5569
- }, props.style]),
5655
+ }, chunksMaskStyles.value, props.style]),
5570
5656
  "role": "progressbar",
5571
5657
  "aria-hidden": props.active ? 'false' : 'true',
5572
5658
  "aria-valuemin": "0",
@@ -5596,7 +5682,7 @@
5596
5682
  "class": vue.normalizeClass(['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined]),
5597
5683
  "style": vue.normalizeStyle([bufferColorStyles.value, {
5598
5684
  opacity: parseFloat(props.bufferOpacity),
5599
- width: convertToUnit(normalizedBuffer.value, '%')
5685
+ width: convertToUnit(bufferWidth.value, '%')
5600
5686
  }])
5601
5687
  }, null), vue.createVNode(vue.Transition, {
5602
5688
  "name": transition.value
@@ -5604,7 +5690,7 @@
5604
5690
  default: () => [!props.indeterminate ? vue.createElementVNode("div", {
5605
5691
  "class": vue.normalizeClass(['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined]),
5606
5692
  "style": vue.normalizeStyle([barColorStyles.value, {
5607
- width: convertToUnit(normalizedValue.value, '%')
5693
+ width: convertToUnit(barWidth.value, '%')
5608
5694
  }])
5609
5695
  }, null) : vue.createElementVNode("div", {
5610
5696
  "class": "v-progress-linear__indeterminate"
@@ -9822,6 +9908,11 @@
9822
9908
  const isLink = vue.toRef(() => props.link !== false && link.isLink.value);
9823
9909
  const isSelectable = vue.computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
9824
9910
  const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
9911
+ const role = vue.computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
9912
+ const ariaSelected = vue.computed(() => {
9913
+ if (!isSelectable.value) return undefined;
9914
+ return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
9915
+ });
9825
9916
  const roundedProps = vue.toRef(() => props.rounded || props.nav);
9826
9917
  const color = vue.toRef(() => props.color ?? props.activeColor);
9827
9918
  const variantProps = vue.toRef(() => ({
@@ -9925,7 +10016,8 @@
9925
10016
  }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
9926
10017
  "style": [colorStyles.value, dimensionStyles.value, props.style],
9927
10018
  "tabindex": isClickable.value ? list ? -2 : 0 : undefined,
9928
- "aria-selected": isSelectable.value ? root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value : undefined,
10019
+ "aria-selected": ariaSelected.value,
10020
+ "role": role.value,
9929
10021
  "onClick": onClick,
9930
10022
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
9931
10023
  }, link.linkProps), {
@@ -10427,6 +10519,7 @@
10427
10519
  const activeColor = vue.toRef(() => props.activeColor);
10428
10520
  const baseColor = vue.toRef(() => props.baseColor);
10429
10521
  const color = vue.toRef(() => props.color);
10522
+ const isSelectable = vue.toRef(() => props.selectable || props.activatable);
10430
10523
  createList({
10431
10524
  filterable: props.filterable
10432
10525
  });
@@ -10498,7 +10591,7 @@
10498
10591
  }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class]),
10499
10592
  "style": vue.normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style]),
10500
10593
  "tabindex": props.disabled ? -1 : 0,
10501
- "role": "listbox",
10594
+ "role": isSelectable.value ? 'listbox' : 'list',
10502
10595
  "aria-activedescendant": undefined,
10503
10596
  "onFocusin": onFocusin,
10504
10597
  "onFocusout": onFocusout,
@@ -13568,6 +13661,7 @@
13568
13661
  "onKeydown": onListKeydown,
13569
13662
  "onFocusin": onFocusin,
13570
13663
  "tabindex": "-1",
13664
+ "selectable": true,
13571
13665
  "aria-live": "polite",
13572
13666
  "aria-label": `${props.label}-list`,
13573
13667
  "color": props.itemColor ?? props.color
@@ -14187,6 +14281,7 @@
14187
14281
  "onFocusin": onFocusin,
14188
14282
  "onFocusout": onFocusout,
14189
14283
  "tabindex": "-1",
14284
+ "selectable": true,
14190
14285
  "aria-live": "polite",
14191
14286
  "color": props.itemColor ?? props.color
14192
14287
  }, listEvents, props.listProps), {
@@ -19274,6 +19369,7 @@
19274
19369
  "selected": selectedValues.value,
19275
19370
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
19276
19371
  "onMousedown": e => e.preventDefault(),
19372
+ "selectable": true,
19277
19373
  "onKeydown": onListKeydown,
19278
19374
  "onFocusin": onFocusin,
19279
19375
  "onFocusout": onFocusout,
@@ -24372,6 +24468,42 @@
24372
24468
  return item.isDirectory ? `${path}/${item.name}` : path;
24373
24469
  }
24374
24470
 
24471
+ // Utilities
24472
+ // Composables
24473
+ const makeFileFilterProps = propsFactory({
24474
+ filterByType: String
24475
+ }, 'file-accept');
24476
+ function useFileFilter(props) {
24477
+ const fileFilter = vue.computed(() => props.filterByType ? createFilter(props.filterByType) : null);
24478
+ function filterAccepted(files) {
24479
+ if (fileFilter.value) {
24480
+ const accepted = files.filter(fileFilter.value);
24481
+ return {
24482
+ accepted,
24483
+ rejected: files.filter(f => !accepted.includes(f))
24484
+ };
24485
+ }
24486
+ return {
24487
+ accepted: files,
24488
+ rejected: []
24489
+ };
24490
+ }
24491
+ return {
24492
+ filterAccepted
24493
+ };
24494
+ }
24495
+ function createFilter(v) {
24496
+ const types = v.split(',').map(x => x.trim().toLowerCase());
24497
+ const extensionsToMatch = types.filter(x => x.startsWith('.'));
24498
+ const wildcards = types.filter(x => x.endsWith('/*'));
24499
+ const typesToMatch = types.filter(x => !extensionsToMatch.includes(x) && !wildcards.includes(x));
24500
+ return file => {
24501
+ const extension = file.name.split('.').at(-1)?.toLowerCase() ?? '';
24502
+ const typeGroup = file.type.split('/').at(0)?.toLowerCase() ?? '';
24503
+ return typesToMatch.includes(file.type) || extensionsToMatch.includes(`.${extension}`) || wildcards.includes(`${typeGroup}/*`);
24504
+ };
24505
+ }
24506
+
24375
24507
  // Types
24376
24508
 
24377
24509
  const makeVFileInputProps = propsFactory({
@@ -24404,6 +24536,7 @@
24404
24536
  return wrapInArray(val).every(v => v != null && typeof v === 'object');
24405
24537
  }
24406
24538
  },
24539
+ ...makeFileFilterProps(),
24407
24540
  ...makeVFieldProps({
24408
24541
  clearable: true
24409
24542
  })
@@ -24416,7 +24549,8 @@
24416
24549
  'click:control': e => true,
24417
24550
  'mousedown:control': e => true,
24418
24551
  'update:focused': focused => true,
24419
- 'update:modelValue': files => true
24552
+ 'update:modelValue': files => true,
24553
+ rejected: files => true
24420
24554
  },
24421
24555
  setup(props, _ref) {
24422
24556
  let {
@@ -24427,6 +24561,9 @@
24427
24561
  const {
24428
24562
  t
24429
24563
  } = useLocale();
24564
+ const {
24565
+ filterAccepted
24566
+ } = useFileFilter(props);
24430
24567
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val);
24431
24568
  const {
24432
24569
  isFocused,
@@ -24500,14 +24637,38 @@
24500
24637
  e.stopImmediatePropagation();
24501
24638
  isDragging.value = false;
24502
24639
  if (!inputRef.value || !hasFilesOrFolders(e)) return;
24640
+ const allDroppedFiles = await handleDrop(e);
24641
+ selectAccepted(allDroppedFiles);
24642
+ }
24643
+ function onFileSelection(e) {
24644
+ if (!e.target || e.repack) return; // prevent loop
24645
+
24646
+ if (!props.filterByType) {
24647
+ const target = e.target;
24648
+ model.value = [...(target.files ?? [])];
24649
+ } else {
24650
+ selectAccepted([...e.target.files]);
24651
+ }
24652
+ }
24653
+ function selectAccepted(files) {
24503
24654
  const dataTransfer = new DataTransfer();
24504
- for (const file of await handleDrop(e)) {
24655
+ const {
24656
+ accepted,
24657
+ rejected
24658
+ } = filterAccepted(files);
24659
+ if (rejected.length) {
24660
+ emit('rejected', rejected);
24661
+ }
24662
+ for (const file of accepted) {
24505
24663
  dataTransfer.items.add(file);
24506
24664
  }
24507
24665
  inputRef.value.files = dataTransfer.files;
24508
- inputRef.value.dispatchEvent(new Event('change', {
24666
+ model.value = [...dataTransfer.files];
24667
+ const event = new Event('change', {
24509
24668
  bubbles: true
24510
- }));
24669
+ });
24670
+ event.repack = true;
24671
+ inputRef.value.dispatchEvent(event);
24511
24672
  }
24512
24673
  vue.watch(model, newValue => {
24513
24674
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -24524,6 +24685,8 @@
24524
24685
  ...inputProps
24525
24686
  } = VInput.filterProps(props);
24526
24687
  const fieldProps = VField.filterProps(props);
24688
+ const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
24689
+ const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
24527
24690
  return vue.createVNode(VInput, vue.mergeProps({
24528
24691
  "ref": vInputRef,
24529
24692
  "modelValue": props.multiple ? model.value : model.value[0],
@@ -24579,6 +24742,7 @@
24579
24742
  return vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("input", vue.mergeProps({
24580
24743
  "ref": inputRef,
24581
24744
  "type": "file",
24745
+ "accept": inputAccept,
24582
24746
  "readonly": isReadonly.value,
24583
24747
  "disabled": isDisabled.value,
24584
24748
  "multiple": props.multiple,
@@ -24588,11 +24752,7 @@
24588
24752
  if (isReadonly.value) e.preventDefault();
24589
24753
  onFocus();
24590
24754
  },
24591
- "onChange": e => {
24592
- if (!e.target) return;
24593
- const target = e.target;
24594
- model.value = [...(target.files ?? [])];
24595
- },
24755
+ "onChange": onFileSelection,
24596
24756
  "onDragleave": onDragleave,
24597
24757
  "onFocus": onFocus,
24598
24758
  "onBlur": blur
@@ -30627,51 +30787,48 @@
30627
30787
  parentIndentLines: props.parentIndentLines,
30628
30788
  variant: props.indentLinesVariant
30629
30789
  });
30630
- function renderItem(itemProps) {
30631
- return vue.createVNode(VTreeviewItem, itemProps, {
30632
- prepend: slotProps => vue.createElementVNode(vue.Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && vue.createElementVNode("div", null, [vue.createVNode(VCheckboxBtn, {
30633
- "key": item.value,
30634
- "modelValue": slotProps.isSelected,
30635
- "disabled": props.disabled,
30636
- "loading": loading,
30637
- "color": props.selectedColor,
30638
- "density": props.density,
30639
- "indeterminate": slotProps.isIndeterminate,
30640
- "indeterminateIcon": props.indeterminateIcon,
30641
- "falseIcon": props.falseIcon,
30642
- "trueIcon": props.trueIcon,
30643
- "onUpdate:modelValue": v => selectItem(slotProps.select, v),
30644
- "onClick": e => e.stopPropagation(),
30645
- "onKeydown": e => {
30646
- if (!['Enter', 'Space'].includes(e.key)) return;
30647
- e.stopPropagation();
30648
- selectItem(slotProps.select, slotProps.isSelected);
30649
- }
30650
- }, null)]), slots.prepend?.({
30651
- ...slotProps,
30652
- ...treeItemProps,
30653
- item: item.raw,
30654
- internalItem: item
30655
- })]),
30656
- append: slots.append ? slotProps => slots.append?.({
30657
- ...slotProps,
30658
- ...treeItemProps,
30659
- item: item.raw,
30660
- internalItem: item
30661
- }) : undefined,
30662
- title: slots.title ? slotProps => slots.title?.({
30663
- ...slotProps,
30664
- item: item.raw,
30665
- internalItem: item
30666
- }) : undefined,
30667
- subtitle: slots.subtitle ? slotProps => slots.subtitle?.({
30668
- ...slotProps,
30669
- item: item.raw,
30670
- internalItem: item
30671
- }) : undefined,
30672
- $stable: true
30673
- });
30674
- }
30790
+ const slotsWithItem = {
30791
+ prepend: slotProps => vue.createElementVNode(vue.Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && vue.createElementVNode("div", null, [vue.createVNode(VCheckboxBtn, {
30792
+ "key": item.value,
30793
+ "modelValue": slotProps.isSelected,
30794
+ "disabled": props.disabled,
30795
+ "loading": loading,
30796
+ "color": props.selectedColor,
30797
+ "density": props.density,
30798
+ "indeterminate": slotProps.isIndeterminate,
30799
+ "indeterminateIcon": props.indeterminateIcon,
30800
+ "falseIcon": props.falseIcon,
30801
+ "trueIcon": props.trueIcon,
30802
+ "onUpdate:modelValue": v => selectItem(slotProps.select, v),
30803
+ "onClick": e => e.stopPropagation(),
30804
+ "onKeydown": e => {
30805
+ if (!['Enter', 'Space'].includes(e.key)) return;
30806
+ e.stopPropagation();
30807
+ selectItem(slotProps.select, slotProps.isSelected);
30808
+ }
30809
+ }, null)]), slots.prepend?.({
30810
+ ...slotProps,
30811
+ ...treeItemProps,
30812
+ item: item.raw,
30813
+ internalItem: item
30814
+ })]),
30815
+ append: slots.append ? slotProps => slots.append?.({
30816
+ ...slotProps,
30817
+ ...treeItemProps,
30818
+ item: item.raw,
30819
+ internalItem: item
30820
+ }) : undefined,
30821
+ title: slots.title ? slotProps => slots.title?.({
30822
+ ...slotProps,
30823
+ item: item.raw,
30824
+ internalItem: item
30825
+ }) : undefined,
30826
+ subtitle: slots.subtitle ? slotProps => slots.subtitle?.({
30827
+ ...slotProps,
30828
+ item: item.raw,
30829
+ internalItem: item
30830
+ }) : undefined
30831
+ };
30675
30832
  const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
30676
30833
  const treeviewChildrenProps = VTreeviewChildren.filterProps({
30677
30834
  ...props,
@@ -30685,16 +30842,21 @@
30685
30842
  let {
30686
30843
  props: activatorProps
30687
30844
  } = _ref2;
30688
- return renderItem({
30845
+ const listItemProps = {
30689
30846
  ...itemProps,
30690
30847
  ...activatorProps,
30691
- loading,
30692
- hideActions: props.hideActions,
30693
- indentLines: indentLines.node,
30694
- value: props.returnObject ? item.raw : itemProps.value,
30848
+ value: itemProps?.value,
30695
30849
  onToggleExpand: [() => checkChildren(item), activatorProps.onClick],
30696
30850
  onClick: isClickOnOpen.value ? [() => checkChildren(item), activatorProps.onClick] : () => selectItem(activatorItems.value[index]?.select, !activatorItems.value[index]?.isSelected)
30697
- });
30851
+ };
30852
+ return vue.createVNode(VTreeviewItem, vue.mergeProps({
30853
+ "ref": el => activatorItems.value[index] = el
30854
+ }, listItemProps, {
30855
+ "hideActions": props.hideActions,
30856
+ "indentLines": indentLines.node,
30857
+ "value": props.returnObject ? item.raw : itemProps.value,
30858
+ "loading": loading
30859
+ }), slotsWithItem);
30698
30860
  },
30699
30861
  default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30700
30862
  "items": children,
@@ -30702,8 +30864,7 @@
30702
30864
  "parentIndentLines": indentLines.children,
30703
30865
  "isLastGroup": nextItemHasChildren,
30704
30866
  "returnObject": props.returnObject
30705
- }), slots),
30706
- $stable: true
30867
+ }), slots)
30707
30868
  }) : renderSlot(slots.item, {
30708
30869
  props: itemProps,
30709
30870
  item: item.raw,
@@ -30719,12 +30880,11 @@
30719
30880
  props: item.raw
30720
30881
  }, () => vue.createVNode(VListSubheader, item.props, null));
30721
30882
  }
30722
- return renderItem({
30723
- ...itemProps,
30724
- hideActions: props.hideActions,
30725
- indentLines: indentLines.leaf,
30726
- value: props.returnObject ? vue.toRaw(item.raw) : itemProps.value
30727
- });
30883
+ return vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, {
30884
+ "hideActions": props.hideActions,
30885
+ "indentLines": indentLines.leaf,
30886
+ "value": props.returnObject ? vue.toRaw(item.raw) : itemProps.value
30887
+ }), slotsWithItem);
30728
30888
  });
30729
30889
  });
30730
30890
  }
@@ -30863,14 +31023,13 @@
30863
31023
  "selected": selected.value,
30864
31024
  "onUpdate:selected": $event => selected.value = $event
30865
31025
  }), {
30866
- default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
31026
+ default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30867
31027
  "density": props.density,
30868
31028
  "returnObject": props.returnObject,
30869
31029
  "items": items.value,
30870
31030
  "parentIndentLines": props.indentLines ? [] : undefined,
30871
31031
  "indentLinesVariant": indentLinesVariant
30872
- }), slots),
30873
- $stable: true
31032
+ }), slots)]
30874
31033
  });
30875
31034
  });
30876
31035
  return {};
@@ -31389,7 +31548,7 @@
31389
31548
  };
31390
31549
  });
31391
31550
  }
31392
- const version$1 = "3.9.1-master.2025-07-17";
31551
+ const version$1 = "3.9.2-dev.2025-07-18";
31393
31552
  createVuetify$1.version = version$1;
31394
31553
 
31395
31554
  // Vue's inject() can only be used in setup
@@ -31414,7 +31573,7 @@
31414
31573
  ...options
31415
31574
  });
31416
31575
  };
31417
- const version = "3.9.1-master.2025-07-17";
31576
+ const version = "3.9.2-dev.2025-07-18";
31418
31577
  createVuetify.version = version;
31419
31578
 
31420
31579
  exports.blueprints = index;