@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
@@ -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
  */
@@ -550,6 +550,10 @@
550
550
  return child.type !== vue.Fragment || ensureValidVNode(child.children);
551
551
  }) ? vnodes : null;
552
552
  }
553
+ function renderSlot(slot, props, fallback) {
554
+ // TODO: check if slot returns elements: #18308
555
+ return slot?.(props) ?? fallback?.(props);
556
+ }
553
557
  function defer(timeout, cb) {
554
558
  if (!IN_BROWSER || timeout === 0) {
555
559
  cb();
@@ -1624,6 +1628,40 @@
1624
1628
  return ['scroll', 'auto'].includes(style.overflowY);
1625
1629
  }
1626
1630
 
1631
+ // Types
1632
+
1633
+ function getIndentLines(_ref) {
1634
+ let {
1635
+ depth,
1636
+ isLast,
1637
+ isLastGroup,
1638
+ leafLinks,
1639
+ separateRoots,
1640
+ parentIndentLines,
1641
+ variant
1642
+ } = _ref;
1643
+ if (!parentIndentLines || !depth) {
1644
+ return {
1645
+ leaf: undefined,
1646
+ node: undefined,
1647
+ children: parentIndentLines
1648
+ };
1649
+ }
1650
+ if (variant === 'simple') {
1651
+ return {
1652
+ leaf: [...parentIndentLines, 'line'],
1653
+ node: [...parentIndentLines, 'line'],
1654
+ children: [...parentIndentLines, 'line']
1655
+ };
1656
+ }
1657
+ const isLastLeaf = isLast && (!isLastGroup || separateRoots || depth > 1);
1658
+ return {
1659
+ leaf: [...parentIndentLines, isLastLeaf ? 'last-leaf' : 'leaf', ...(leafLinks ? ['leaf-link'] : [])],
1660
+ node: [...parentIndentLines, isLastLeaf ? 'last-leaf' : 'leaf'],
1661
+ children: [...parentIndentLines, isLastLeaf ? 'none' : 'line']
1662
+ };
1663
+ }
1664
+
1627
1665
  function isFixedPosition(el) {
1628
1666
  while (el) {
1629
1667
  if (window.getComputedStyle(el).position === 'fixed') {
@@ -9870,6 +9908,10 @@
9870
9908
  type: [Boolean, String, Array, Function],
9871
9909
  default: 'props'
9872
9910
  },
9911
+ itemType: {
9912
+ type: [Boolean, String, Array, Function],
9913
+ default: 'type'
9914
+ },
9873
9915
  returnObject: Boolean,
9874
9916
  valueComparator: Function
9875
9917
  }, 'list-items');
@@ -9877,6 +9919,7 @@
9877
9919
  const title = getPropertyFromItem(item, props.itemTitle, item);
9878
9920
  const value = getPropertyFromItem(item, props.itemValue, title);
9879
9921
  const children = getPropertyFromItem(item, props.itemChildren);
9922
+ const type = getPropertyFromItem(item, props.itemType, 'item');
9880
9923
  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);
9881
9924
  const _props = {
9882
9925
  title,
@@ -9884,15 +9927,16 @@
9884
9927
  ...itemProps
9885
9928
  };
9886
9929
  return {
9930
+ type,
9887
9931
  title: String(_props.title ?? ''),
9888
9932
  value: _props.value,
9889
9933
  props: _props,
9890
- children: Array.isArray(children) ? transformItems$3(props, children) : undefined,
9934
+ children: type === 'item' && Array.isArray(children) ? transformItems$3(props, children) : undefined,
9891
9935
  raw: item
9892
9936
  };
9893
9937
  }
9894
9938
  function transformItems$3(props, items) {
9895
- const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'returnObject', 'valueComparator']);
9939
+ const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'itemType', 'returnObject', 'valueComparator']);
9896
9940
  const array = [];
9897
9941
  for (const item of items) {
9898
9942
  array.push(transformItem$3(_props, item));
@@ -9934,7 +9978,7 @@
9934
9978
  const _returnObject = props.returnObject;
9935
9979
  const hasValueComparator = !!props.valueComparator;
9936
9980
  const valueComparator = props.valueComparator || deepEqual;
9937
- const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'returnObject', 'valueComparator']);
9981
+ const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'itemType', 'returnObject', 'valueComparator']);
9938
9982
  const returnValue = [];
9939
9983
  main: for (const v of value) {
9940
9984
  // When the model value is null, return an InternalItem
@@ -10054,10 +10098,6 @@
10054
10098
  ...makeDensityProps(),
10055
10099
  ...makeDimensionProps(),
10056
10100
  ...makeElevationProps(),
10057
- itemType: {
10058
- type: String,
10059
- default: 'type'
10060
- },
10061
10101
  ...makeItemsProps(),
10062
10102
  ...makeRoundedProps(),
10063
10103
  ...makeTagProps(),
@@ -13276,7 +13316,7 @@
13276
13316
  key: item.value,
13277
13317
  onClick: () => select(item, null)
13278
13318
  });
13279
- if (item.raw.type === 'divider') {
13319
+ if (item.type === 'divider') {
13280
13320
  return slots.divider?.({
13281
13321
  props: item.raw,
13282
13322
  index
@@ -13284,7 +13324,7 @@
13284
13324
  "key": `divider-${index}`
13285
13325
  }), null);
13286
13326
  }
13287
- if (item.raw.type === 'subheader') {
13327
+ if (item.type === 'subheader') {
13288
13328
  return slots.subheader?.({
13289
13329
  props: item.raw,
13290
13330
  index
@@ -13452,7 +13492,7 @@
13452
13492
  let match = -1;
13453
13493
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13454
13494
  if (typeof item === 'object') {
13455
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13495
+ if (item.type === 'divider' || item.type === 'subheader') {
13456
13496
  continue;
13457
13497
  }
13458
13498
  const filterKeys = keys || Object.keys(transformed);
@@ -13894,7 +13934,7 @@
13894
13934
  active: highlightFirst.value && index === 0 ? true : undefined,
13895
13935
  onClick: () => select(item, null)
13896
13936
  });
13897
- if (item.raw.type === 'divider') {
13937
+ if (item.type === 'divider') {
13898
13938
  return slots.divider?.({
13899
13939
  props: item.raw,
13900
13940
  index
@@ -13902,7 +13942,7 @@
13902
13942
  "key": `divider-${index}`
13903
13943
  }), null);
13904
13944
  }
13905
- if (item.raw.type === 'subheader') {
13945
+ if (item.type === 'subheader') {
13906
13946
  return slots.subheader?.({
13907
13947
  props: item.raw,
13908
13948
  index
@@ -18985,7 +19025,7 @@
18985
19025
  active: highlightFirst.value && index === 0 ? true : undefined,
18986
19026
  onClick: () => select(item, null)
18987
19027
  });
18988
- if (item.raw.type === 'divider') {
19028
+ if (item.type === 'divider') {
18989
19029
  return slots.divider?.({
18990
19030
  props: item.raw,
18991
19031
  index
@@ -18993,7 +19033,7 @@
18993
19033
  "key": `divider-${index}`
18994
19034
  }), null);
18995
19035
  }
18996
- if (item.raw.type === 'subheader') {
19036
+ if (item.type === 'subheader') {
18997
19037
  return slots.subheader?.({
18998
19038
  props: item.raw,
18999
19039
  index
@@ -23335,7 +23375,8 @@
23335
23375
  }
23336
23376
  function allowedMonths(month) {
23337
23377
  if (typeof props.allowedDates === 'function') {
23338
- const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
23378
+ const monthTwoDigits = String(month + 1).padStart(2, '0');
23379
+ const startOfMonth = adapter.parseISO(`${year.value}-${monthTwoDigits}-01`);
23339
23380
  return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
23340
23381
  }
23341
23382
  if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
@@ -30131,6 +30172,8 @@
30131
30172
 
30132
30173
  const makeVTreeviewItemProps = propsFactory({
30133
30174
  loading: Boolean,
30175
+ hideActions: Boolean,
30176
+ indentLines: Array,
30134
30177
  toggleIcon: IconValue,
30135
30178
  ...makeVListItemProps({
30136
30179
  slim: true
@@ -30167,7 +30210,7 @@
30167
30210
  }
30168
30211
  useRender(() => {
30169
30212
  const listItemProps = VListItem.filterProps(props);
30170
- const hasPrepend = slots.prepend || props.toggleIcon;
30213
+ const hasPrepend = slots.prepend || props.toggleIcon || props.indentLines;
30171
30214
  return vue.createVNode(VListItem, vue.mergeProps({
30172
30215
  "ref": vListItemRef
30173
30216
  }, listItemProps, {
@@ -30181,7 +30224,15 @@
30181
30224
  }), {
30182
30225
  ...slots,
30183
30226
  prepend: hasPrepend ? slotProps => {
30184
- return vue.createElementVNode(vue.Fragment, null, [vue.createVNode(VListItemAction, {
30227
+ return vue.createElementVNode(vue.Fragment, null, [props.indentLines && props.indentLines.length > 0 ? vue.createElementVNode("div", {
30228
+ "key": "indent-lines",
30229
+ "class": "v-treeview-indent-lines",
30230
+ "style": {
30231
+ '--v-indent-parts': props.indentLines.length
30232
+ }
30233
+ }, [props.indentLines.map(type => vue.createElementVNode("div", {
30234
+ "class": vue.normalizeClass(`v-treeview-indent-line v-treeview-indent-line--${type}`)
30235
+ }, null))]) : '', !props.hideActions && vue.createVNode(VListItemAction, {
30185
30236
  "start": true
30186
30237
  }, {
30187
30238
  default: () => [props.toggleIcon ? vue.createVNode(VBtn, {
@@ -30233,10 +30284,15 @@
30233
30284
  selectedColor: String,
30234
30285
  selectStrategy: [String, Function, Object],
30235
30286
  index: Number,
30287
+ isLastGroup: Boolean,
30288
+ separateRoots: Boolean,
30289
+ parentIndentLines: Array,
30290
+ indentLinesVariant: String,
30236
30291
  path: {
30237
30292
  type: Array,
30238
30293
  default: () => []
30239
30294
  },
30295
+ ...pick(makeVTreeviewItemProps(), ['hideActions']),
30240
30296
  ...makeDensityProps()
30241
30297
  }, 'VTreeviewChildren');
30242
30298
  const VTreeviewChildren = genericComponent()({
@@ -30265,19 +30321,32 @@
30265
30321
  select(isSelected);
30266
30322
  }
30267
30323
  }
30268
- return () => slots.default?.() ?? props.items?.map((item, index) => {
30324
+ return () => slots.default?.() ?? props.items?.map((item, index, items) => {
30269
30325
  const {
30270
30326
  children,
30271
30327
  props: itemProps
30272
30328
  } = item;
30273
30329
  const loading = isLoading.has(item.value);
30330
+ const nextItemHasChildren = !!items.at(index + 1)?.children;
30331
+ const depth = props.path?.length ?? 0;
30332
+ const isLast = items.length - 1 === index;
30274
30333
  const treeItemProps = {
30275
30334
  index,
30276
- depth: props.path?.length ?? 0,
30335
+ depth,
30277
30336
  isFirst: index === 0,
30278
- isLast: props.items ? props.items.length - 1 === index : false,
30279
- path: [...props.path, index]
30337
+ isLast,
30338
+ path: [...props.path, index],
30339
+ hideAction: props.hideActions
30280
30340
  };
30341
+ const indentLines = getIndentLines({
30342
+ depth,
30343
+ isLast,
30344
+ isLastGroup: props.isLastGroup,
30345
+ leafLinks: !props.hideActions,
30346
+ separateRoots: props.separateRoots,
30347
+ parentIndentLines: props.parentIndentLines,
30348
+ variant: props.indentLinesVariant
30349
+ });
30281
30350
  const slotsWithItem = {
30282
30351
  prepend: slotProps => vue.createElementVNode(vue.Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && vue.createElementVNode("div", null, [vue.createVNode(VCheckboxBtn, {
30283
30352
  "key": item.value,
@@ -30343,21 +30412,40 @@
30343
30412
  return vue.createVNode(VTreeviewItem, vue.mergeProps({
30344
30413
  "ref": el => activatorItems.value[index] = el
30345
30414
  }, listItemProps, {
30415
+ "hideActions": props.hideActions,
30416
+ "indentLines": indentLines.node,
30346
30417
  "value": props.returnObject ? item.raw : itemProps.value,
30347
30418
  "loading": loading
30348
30419
  }), slotsWithItem);
30349
30420
  },
30350
30421
  default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30351
30422
  "items": children,
30423
+ "indentLinesVariant": props.indentLinesVariant,
30424
+ "parentIndentLines": indentLines.children,
30425
+ "isLastGroup": nextItemHasChildren,
30352
30426
  "returnObject": props.returnObject
30353
30427
  }), slots)
30354
- }) : slots.item?.({
30428
+ }) : renderSlot(slots.item, {
30355
30429
  props: itemProps,
30356
30430
  item: item.raw,
30357
30431
  internalItem: item
30358
- }) ?? vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, {
30359
- "value": props.returnObject ? vue.toRaw(item.raw) : itemProps.value
30360
- }), slotsWithItem);
30432
+ }, () => {
30433
+ if (item.type === 'divider') {
30434
+ return renderSlot(slots.divider, {
30435
+ props: item.raw
30436
+ }, () => vue.createVNode(VDivider, item.props, null));
30437
+ }
30438
+ if (item.type === 'subheader') {
30439
+ return renderSlot(slots.subheader, {
30440
+ props: item.raw
30441
+ }, () => vue.createVNode(VListSubheader, item.props, null));
30442
+ }
30443
+ return vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, {
30444
+ "hideActions": props.hideActions,
30445
+ "indentLines": indentLines.leaf,
30446
+ "value": props.returnObject ? vue.toRaw(item.raw) : itemProps.value
30447
+ }), slotsWithItem);
30448
+ });
30361
30449
  });
30362
30450
  }
30363
30451
  });
@@ -30373,16 +30461,17 @@
30373
30461
  const makeVTreeviewProps = propsFactory({
30374
30462
  fluid: Boolean,
30375
30463
  openAll: Boolean,
30464
+ indentLines: [Boolean, String],
30376
30465
  search: String,
30377
30466
  ...makeFilterProps({
30378
30467
  filterKeys: ['title']
30379
30468
  }),
30380
- ...omit(makeVTreeviewChildrenProps(), ['index', 'path']),
30469
+ ...omit(makeVTreeviewChildrenProps(), ['index', 'path', 'indentLinesVariant', 'parentIndentLines', 'isLastGroup']),
30381
30470
  ...omit(makeVListProps({
30382
30471
  collapseIcon: '$treeviewCollapse',
30383
30472
  expandIcon: '$treeviewExpand',
30384
30473
  slim: true
30385
- }), ['itemType', 'nav', 'openStrategy']),
30474
+ }), ['nav', 'openStrategy']),
30386
30475
  modelValue: Array
30387
30476
  }, 'VTreeview');
30388
30477
  const VTreeview = genericComponent()({
@@ -30479,6 +30568,7 @@
30479
30568
  useRender(() => {
30480
30569
  const listProps = VList.filterProps(props);
30481
30570
  const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
30571
+ const indentLinesVariant = typeof props.indentLines === 'boolean' ? 'default' : props.indentLines;
30482
30572
  return vue.createVNode(VList, vue.mergeProps({
30483
30573
  "ref": vListRef
30484
30574
  }, listProps, {
@@ -30496,7 +30586,9 @@
30496
30586
  default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30497
30587
  "density": props.density,
30498
30588
  "returnObject": props.returnObject,
30499
- "items": items.value
30589
+ "items": items.value,
30590
+ "parentIndentLines": props.indentLines ? [] : undefined,
30591
+ "indentLinesVariant": indentLinesVariant
30500
30592
  }), slots)]
30501
30593
  });
30502
30594
  });
@@ -31089,7 +31181,7 @@
31089
31181
  weekNumber: weekNumbers.value[wi],
31090
31182
  week
31091
31183
  }))), [weekNumbers.value[wi]]) : '', week.map(day => vue.createVNode(VCalendarMonthDay, vue.mergeProps({
31092
- "key": day.date.getTime()
31184
+ "key": adapter.toJsDate(day.date).getTime()
31093
31185
  }, calendarDayProps, {
31094
31186
  "day": day,
31095
31187
  "title": adapter.format(day.date, 'dayOfMonth'),
@@ -33584,7 +33676,7 @@
33584
33676
  };
33585
33677
  });
33586
33678
  }
33587
- const version$1 = "3.9.0-beta.1-dev.2025-07-05";
33679
+ const version$1 = "3.9.0-dev.2025-07-08";
33588
33680
  createVuetify$1.version = version$1;
33589
33681
 
33590
33682
  // Vue's inject() can only be used in setup
@@ -33882,7 +33974,7 @@
33882
33974
 
33883
33975
  /* eslint-disable local-rules/sort-imports */
33884
33976
 
33885
- const version = "3.9.0-beta.1-dev.2025-07-05";
33977
+ const version = "3.9.0-dev.2025-07-08";
33886
33978
 
33887
33979
  /* eslint-disable local-rules/sort-imports */
33888
33980