@vuetify/nightly 3.9.0-beta.1-dev.2025-07-05 → 3.9.0-dev.2025-07-08

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 (77) hide show
  1. package/CHANGELOG.md +3 -117
  2. package/dist/json/attributes.json +3156 -3120
  3. package/dist/json/importMap-labs.json +12 -12
  4. package/dist/json/importMap.json +196 -196
  5. package/dist/json/tags.json +9 -0
  6. package/dist/json/web-types.json +6143 -6054
  7. package/dist/vuetify-labs.cjs +124 -32
  8. package/dist/vuetify-labs.css +4807 -4750
  9. package/dist/vuetify-labs.d.ts +281 -186
  10. package/dist/vuetify-labs.esm.js +124 -32
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +124 -32
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +123 -31
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4212 -4155
  17. package/dist/vuetify.d.ts +281 -186
  18. package/dist/vuetify.esm.js +123 -31
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +123 -31
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1083 -1079
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.d.ts +39 -14
  26. package/lib/components/VAutocomplete/VAutocomplete.js +2 -2
  27. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  28. package/lib/components/VCombobox/VCombobox.d.ts +39 -14
  29. package/lib/components/VCombobox/VCombobox.js +2 -2
  30. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  31. package/lib/components/VDataIterator/composables/items.d.ts +2 -1
  32. package/lib/components/VDataIterator/composables/items.js.map +1 -1
  33. package/lib/components/VDataTable/types.d.ts +1 -1
  34. package/lib/components/VDataTable/types.js.map +1 -1
  35. package/lib/components/VDatePicker/VDatePicker.js +2 -1
  36. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  37. package/lib/components/VList/VList.d.ts +24 -27
  38. package/lib/components/VList/VList.js +0 -4
  39. package/lib/components/VList/VList.js.map +1 -1
  40. package/lib/components/VSelect/VSelect.d.ts +58 -22
  41. package/lib/components/VSelect/VSelect.js +2 -2
  42. package/lib/components/VSelect/VSelect.js.map +1 -1
  43. package/lib/components/VTreeview/VTreeview.d.ts +229 -167
  44. package/lib/components/VTreeview/VTreeview.js +7 -3
  45. package/lib/components/VTreeview/VTreeview.js.map +1 -1
  46. package/lib/components/VTreeview/VTreeviewChildren.d.ts +81 -10
  47. package/lib/components/VTreeview/VTreeviewChildren.js +50 -11
  48. package/lib/components/VTreeview/VTreeviewChildren.js.map +1 -1
  49. package/lib/components/VTreeview/VTreeviewItem.css +57 -0
  50. package/lib/components/VTreeview/VTreeviewItem.d.ts +119 -94
  51. package/lib/components/VTreeview/VTreeviewItem.js +13 -3
  52. package/lib/components/VTreeview/VTreeviewItem.js.map +1 -1
  53. package/lib/components/VTreeview/VTreeviewItem.sass +60 -0
  54. package/lib/components/VTreeview/_variables.scss +15 -0
  55. package/lib/composables/filter.d.ts +1 -0
  56. package/lib/composables/filter.js +1 -1
  57. package/lib/composables/filter.js.map +1 -1
  58. package/lib/composables/list-items.d.ts +14 -1
  59. package/lib/composables/list-items.js +9 -3
  60. package/lib/composables/list-items.js.map +1 -1
  61. package/lib/entry-bundler.js +1 -1
  62. package/lib/entry-bundler.js.map +1 -1
  63. package/lib/framework.d.ts +66 -65
  64. package/lib/framework.js +1 -1
  65. package/lib/framework.js.map +1 -1
  66. package/lib/labs/VCalendar/VCalendar.js +1 -1
  67. package/lib/labs/VCalendar/VCalendar.js.map +1 -1
  68. package/lib/util/helpers.d.ts +3 -0
  69. package/lib/util/helpers.js +4 -0
  70. package/lib/util/helpers.js.map +1 -1
  71. package/lib/util/indentLines.d.ts +17 -0
  72. package/lib/util/indentLines.js +34 -0
  73. package/lib/util/indentLines.js.map +1 -0
  74. package/lib/util/index.d.ts +1 -0
  75. package/lib/util/index.js +1 -0
  76. package/lib/util/index.js.map +1 -1
  77. package/package.json +1 -1
package/dist/vuetify.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.9.0-beta.1-dev.2025-07-05
2
+ * Vuetify v3.9.0-dev.2025-07-08
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -473,6 +473,10 @@
473
473
  return child.type !== vue.Fragment || ensureValidVNode(child.children);
474
474
  }) ? vnodes : null;
475
475
  }
476
+ function renderSlot(slot, props, fallback) {
477
+ // TODO: check if slot returns elements: #18308
478
+ return slot?.(props) ?? fallback?.(props);
479
+ }
476
480
  function defer(timeout, cb) {
477
481
  if (!IN_BROWSER || timeout === 0) {
478
482
  cb();
@@ -1618,6 +1622,40 @@
1618
1622
  return ['scroll', 'auto'].includes(style.overflowY);
1619
1623
  }
1620
1624
 
1625
+ // Types
1626
+
1627
+ function getIndentLines(_ref) {
1628
+ let {
1629
+ depth,
1630
+ isLast,
1631
+ isLastGroup,
1632
+ leafLinks,
1633
+ separateRoots,
1634
+ parentIndentLines,
1635
+ variant
1636
+ } = _ref;
1637
+ if (!parentIndentLines || !depth) {
1638
+ return {
1639
+ leaf: undefined,
1640
+ node: undefined,
1641
+ children: parentIndentLines
1642
+ };
1643
+ }
1644
+ if (variant === 'simple') {
1645
+ return {
1646
+ leaf: [...parentIndentLines, 'line'],
1647
+ node: [...parentIndentLines, 'line'],
1648
+ children: [...parentIndentLines, 'line']
1649
+ };
1650
+ }
1651
+ const isLastLeaf = isLast && (!isLastGroup || separateRoots || depth > 1);
1652
+ return {
1653
+ leaf: [...parentIndentLines, isLastLeaf ? 'last-leaf' : 'leaf', ...(leafLinks ? ['leaf-link'] : [])],
1654
+ node: [...parentIndentLines, isLastLeaf ? 'last-leaf' : 'leaf'],
1655
+ children: [...parentIndentLines, isLastLeaf ? 'none' : 'line']
1656
+ };
1657
+ }
1658
+
1621
1659
  function isFixedPosition(el) {
1622
1660
  while (el) {
1623
1661
  if (window.getComputedStyle(el).position === 'fixed') {
@@ -10148,6 +10186,10 @@
10148
10186
  type: [Boolean, String, Array, Function],
10149
10187
  default: 'props'
10150
10188
  },
10189
+ itemType: {
10190
+ type: [Boolean, String, Array, Function],
10191
+ default: 'type'
10192
+ },
10151
10193
  returnObject: Boolean,
10152
10194
  valueComparator: Function
10153
10195
  }, 'list-items');
@@ -10155,6 +10197,7 @@
10155
10197
  const title = getPropertyFromItem(item, props.itemTitle, item);
10156
10198
  const value = getPropertyFromItem(item, props.itemValue, title);
10157
10199
  const children = getPropertyFromItem(item, props.itemChildren);
10200
+ const type = getPropertyFromItem(item, props.itemType, 'item');
10158
10201
  const itemProps = props.itemProps === true ? typeof item === 'object' && item != null && !Array.isArray(item) ? 'children' in item ? omit(item, ['children']) : item : undefined : getPropertyFromItem(item, props.itemProps);
10159
10202
  const _props = {
10160
10203
  title,
@@ -10162,15 +10205,16 @@
10162
10205
  ...itemProps
10163
10206
  };
10164
10207
  return {
10208
+ type,
10165
10209
  title: String(_props.title ?? ''),
10166
10210
  value: _props.value,
10167
10211
  props: _props,
10168
- children: Array.isArray(children) ? transformItems$3(props, children) : undefined,
10212
+ children: type === 'item' && Array.isArray(children) ? transformItems$3(props, children) : undefined,
10169
10213
  raw: item
10170
10214
  };
10171
10215
  }
10172
10216
  function transformItems$3(props, items) {
10173
- const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'returnObject', 'valueComparator']);
10217
+ const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'itemType', 'returnObject', 'valueComparator']);
10174
10218
  const array = [];
10175
10219
  for (const item of items) {
10176
10220
  array.push(transformItem$3(_props, item));
@@ -10212,7 +10256,7 @@
10212
10256
  const _returnObject = props.returnObject;
10213
10257
  const hasValueComparator = !!props.valueComparator;
10214
10258
  const valueComparator = props.valueComparator || deepEqual;
10215
- const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'returnObject', 'valueComparator']);
10259
+ const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'itemType', 'returnObject', 'valueComparator']);
10216
10260
  const returnValue = [];
10217
10261
  main: for (const v of value) {
10218
10262
  // When the model value is null, return an InternalItem
@@ -10332,10 +10376,6 @@
10332
10376
  ...makeDensityProps(),
10333
10377
  ...makeDimensionProps(),
10334
10378
  ...makeElevationProps(),
10335
- itemType: {
10336
- type: String,
10337
- default: 'type'
10338
- },
10339
10379
  ...makeItemsProps(),
10340
10380
  ...makeRoundedProps(),
10341
10381
  ...makeTagProps(),
@@ -13554,7 +13594,7 @@
13554
13594
  key: item.value,
13555
13595
  onClick: () => select(item, null)
13556
13596
  });
13557
- if (item.raw.type === 'divider') {
13597
+ if (item.type === 'divider') {
13558
13598
  return slots.divider?.({
13559
13599
  props: item.raw,
13560
13600
  index
@@ -13562,7 +13602,7 @@
13562
13602
  "key": `divider-${index}`
13563
13603
  }), null);
13564
13604
  }
13565
- if (item.raw.type === 'subheader') {
13605
+ if (item.type === 'subheader') {
13566
13606
  return slots.subheader?.({
13567
13607
  props: item.raw,
13568
13608
  index
@@ -13730,7 +13770,7 @@
13730
13770
  let match = -1;
13731
13771
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13732
13772
  if (typeof item === 'object') {
13733
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13773
+ if (item.type === 'divider' || item.type === 'subheader') {
13734
13774
  continue;
13735
13775
  }
13736
13776
  const filterKeys = keys || Object.keys(transformed);
@@ -14172,7 +14212,7 @@
14172
14212
  active: highlightFirst.value && index === 0 ? true : undefined,
14173
14213
  onClick: () => select(item, null)
14174
14214
  });
14175
- if (item.raw.type === 'divider') {
14215
+ if (item.type === 'divider') {
14176
14216
  return slots.divider?.({
14177
14217
  props: item.raw,
14178
14218
  index
@@ -14180,7 +14220,7 @@
14180
14220
  "key": `divider-${index}`
14181
14221
  }), null);
14182
14222
  }
14183
- if (item.raw.type === 'subheader') {
14223
+ if (item.type === 'subheader') {
14184
14224
  return slots.subheader?.({
14185
14225
  props: item.raw,
14186
14226
  index
@@ -19263,7 +19303,7 @@
19263
19303
  active: highlightFirst.value && index === 0 ? true : undefined,
19264
19304
  onClick: () => select(item, null)
19265
19305
  });
19266
- if (item.raw.type === 'divider') {
19306
+ if (item.type === 'divider') {
19267
19307
  return slots.divider?.({
19268
19308
  props: item.raw,
19269
19309
  index
@@ -19271,7 +19311,7 @@
19271
19311
  "key": `divider-${index}`
19272
19312
  }), null);
19273
19313
  }
19274
- if (item.raw.type === 'subheader') {
19314
+ if (item.type === 'subheader') {
19275
19315
  return slots.subheader?.({
19276
19316
  props: item.raw,
19277
19317
  index
@@ -23613,7 +23653,8 @@
23613
23653
  }
23614
23654
  function allowedMonths(month) {
23615
23655
  if (typeof props.allowedDates === 'function') {
23616
- const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
23656
+ const monthTwoDigits = String(month + 1).padStart(2, '0');
23657
+ const startOfMonth = adapter.parseISO(`${year.value}-${monthTwoDigits}-01`);
23617
23658
  return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
23618
23659
  }
23619
23660
  if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
@@ -30409,6 +30450,8 @@
30409
30450
 
30410
30451
  const makeVTreeviewItemProps = propsFactory({
30411
30452
  loading: Boolean,
30453
+ hideActions: Boolean,
30454
+ indentLines: Array,
30412
30455
  toggleIcon: IconValue,
30413
30456
  ...makeVListItemProps({
30414
30457
  slim: true
@@ -30445,7 +30488,7 @@
30445
30488
  }
30446
30489
  useRender(() => {
30447
30490
  const listItemProps = VListItem.filterProps(props);
30448
- const hasPrepend = slots.prepend || props.toggleIcon;
30491
+ const hasPrepend = slots.prepend || props.toggleIcon || props.indentLines;
30449
30492
  return vue.createVNode(VListItem, vue.mergeProps({
30450
30493
  "ref": vListItemRef
30451
30494
  }, listItemProps, {
@@ -30459,7 +30502,15 @@
30459
30502
  }), {
30460
30503
  ...slots,
30461
30504
  prepend: hasPrepend ? slotProps => {
30462
- return vue.createElementVNode(vue.Fragment, null, [vue.createVNode(VListItemAction, {
30505
+ return vue.createElementVNode(vue.Fragment, null, [props.indentLines && props.indentLines.length > 0 ? vue.createElementVNode("div", {
30506
+ "key": "indent-lines",
30507
+ "class": "v-treeview-indent-lines",
30508
+ "style": {
30509
+ '--v-indent-parts': props.indentLines.length
30510
+ }
30511
+ }, [props.indentLines.map(type => vue.createElementVNode("div", {
30512
+ "class": vue.normalizeClass(`v-treeview-indent-line v-treeview-indent-line--${type}`)
30513
+ }, null))]) : '', !props.hideActions && vue.createVNode(VListItemAction, {
30463
30514
  "start": true
30464
30515
  }, {
30465
30516
  default: () => [props.toggleIcon ? vue.createVNode(VBtn, {
@@ -30511,10 +30562,15 @@
30511
30562
  selectedColor: String,
30512
30563
  selectStrategy: [String, Function, Object],
30513
30564
  index: Number,
30565
+ isLastGroup: Boolean,
30566
+ separateRoots: Boolean,
30567
+ parentIndentLines: Array,
30568
+ indentLinesVariant: String,
30514
30569
  path: {
30515
30570
  type: Array,
30516
30571
  default: () => []
30517
30572
  },
30573
+ ...pick(makeVTreeviewItemProps(), ['hideActions']),
30518
30574
  ...makeDensityProps()
30519
30575
  }, 'VTreeviewChildren');
30520
30576
  const VTreeviewChildren = genericComponent()({
@@ -30543,19 +30599,32 @@
30543
30599
  select(isSelected);
30544
30600
  }
30545
30601
  }
30546
- return () => slots.default?.() ?? props.items?.map((item, index) => {
30602
+ return () => slots.default?.() ?? props.items?.map((item, index, items) => {
30547
30603
  const {
30548
30604
  children,
30549
30605
  props: itemProps
30550
30606
  } = item;
30551
30607
  const loading = isLoading.has(item.value);
30608
+ const nextItemHasChildren = !!items.at(index + 1)?.children;
30609
+ const depth = props.path?.length ?? 0;
30610
+ const isLast = items.length - 1 === index;
30552
30611
  const treeItemProps = {
30553
30612
  index,
30554
- depth: props.path?.length ?? 0,
30613
+ depth,
30555
30614
  isFirst: index === 0,
30556
- isLast: props.items ? props.items.length - 1 === index : false,
30557
- path: [...props.path, index]
30615
+ isLast,
30616
+ path: [...props.path, index],
30617
+ hideAction: props.hideActions
30558
30618
  };
30619
+ const indentLines = getIndentLines({
30620
+ depth,
30621
+ isLast,
30622
+ isLastGroup: props.isLastGroup,
30623
+ leafLinks: !props.hideActions,
30624
+ separateRoots: props.separateRoots,
30625
+ parentIndentLines: props.parentIndentLines,
30626
+ variant: props.indentLinesVariant
30627
+ });
30559
30628
  const slotsWithItem = {
30560
30629
  prepend: slotProps => vue.createElementVNode(vue.Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && vue.createElementVNode("div", null, [vue.createVNode(VCheckboxBtn, {
30561
30630
  "key": item.value,
@@ -30621,21 +30690,40 @@
30621
30690
  return vue.createVNode(VTreeviewItem, vue.mergeProps({
30622
30691
  "ref": el => activatorItems.value[index] = el
30623
30692
  }, listItemProps, {
30693
+ "hideActions": props.hideActions,
30694
+ "indentLines": indentLines.node,
30624
30695
  "value": props.returnObject ? item.raw : itemProps.value,
30625
30696
  "loading": loading
30626
30697
  }), slotsWithItem);
30627
30698
  },
30628
30699
  default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30629
30700
  "items": children,
30701
+ "indentLinesVariant": props.indentLinesVariant,
30702
+ "parentIndentLines": indentLines.children,
30703
+ "isLastGroup": nextItemHasChildren,
30630
30704
  "returnObject": props.returnObject
30631
30705
  }), slots)
30632
- }) : slots.item?.({
30706
+ }) : renderSlot(slots.item, {
30633
30707
  props: itemProps,
30634
30708
  item: item.raw,
30635
30709
  internalItem: item
30636
- }) ?? vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, {
30637
- "value": props.returnObject ? vue.toRaw(item.raw) : itemProps.value
30638
- }), slotsWithItem);
30710
+ }, () => {
30711
+ if (item.type === 'divider') {
30712
+ return renderSlot(slots.divider, {
30713
+ props: item.raw
30714
+ }, () => vue.createVNode(VDivider, item.props, null));
30715
+ }
30716
+ if (item.type === 'subheader') {
30717
+ return renderSlot(slots.subheader, {
30718
+ props: item.raw
30719
+ }, () => vue.createVNode(VListSubheader, item.props, null));
30720
+ }
30721
+ return vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, {
30722
+ "hideActions": props.hideActions,
30723
+ "indentLines": indentLines.leaf,
30724
+ "value": props.returnObject ? vue.toRaw(item.raw) : itemProps.value
30725
+ }), slotsWithItem);
30726
+ });
30639
30727
  });
30640
30728
  }
30641
30729
  });
@@ -30651,16 +30739,17 @@
30651
30739
  const makeVTreeviewProps = propsFactory({
30652
30740
  fluid: Boolean,
30653
30741
  openAll: Boolean,
30742
+ indentLines: [Boolean, String],
30654
30743
  search: String,
30655
30744
  ...makeFilterProps({
30656
30745
  filterKeys: ['title']
30657
30746
  }),
30658
- ...omit(makeVTreeviewChildrenProps(), ['index', 'path']),
30747
+ ...omit(makeVTreeviewChildrenProps(), ['index', 'path', 'indentLinesVariant', 'parentIndentLines', 'isLastGroup']),
30659
30748
  ...omit(makeVListProps({
30660
30749
  collapseIcon: '$treeviewCollapse',
30661
30750
  expandIcon: '$treeviewExpand',
30662
30751
  slim: true
30663
- }), ['itemType', 'nav', 'openStrategy']),
30752
+ }), ['nav', 'openStrategy']),
30664
30753
  modelValue: Array
30665
30754
  }, 'VTreeview');
30666
30755
  const VTreeview = genericComponent()({
@@ -30757,6 +30846,7 @@
30757
30846
  useRender(() => {
30758
30847
  const listProps = VList.filterProps(props);
30759
30848
  const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
30849
+ const indentLinesVariant = typeof props.indentLines === 'boolean' ? 'default' : props.indentLines;
30760
30850
  return vue.createVNode(VList, vue.mergeProps({
30761
30851
  "ref": vListRef
30762
30852
  }, listProps, {
@@ -30774,7 +30864,9 @@
30774
30864
  default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30775
30865
  "density": props.density,
30776
30866
  "returnObject": props.returnObject,
30777
- "items": items.value
30867
+ "items": items.value,
30868
+ "parentIndentLines": props.indentLines ? [] : undefined,
30869
+ "indentLinesVariant": indentLinesVariant
30778
30870
  }), slots)]
30779
30871
  });
30780
30872
  });
@@ -31294,7 +31386,7 @@
31294
31386
  };
31295
31387
  });
31296
31388
  }
31297
- const version$1 = "3.9.0-beta.1-dev.2025-07-05";
31389
+ const version$1 = "3.9.0-dev.2025-07-08";
31298
31390
  createVuetify$1.version = version$1;
31299
31391
 
31300
31392
  // Vue's inject() can only be used in setup
@@ -31319,7 +31411,7 @@
31319
31411
  ...options
31320
31412
  });
31321
31413
  };
31322
- const version = "3.9.0-beta.1-dev.2025-07-05";
31414
+ const version = "3.9.0-dev.2025-07-08";
31323
31415
  createVuetify.version = version;
31324
31416
 
31325
31417
  exports.blueprints = index;