@vuetify/nightly 3.9.0-beta.1-dev.2025-06-28 → 3.9.0-beta.1-dev.2025-07-04

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 (99) hide show
  1. package/CHANGELOG.md +112 -3
  2. package/dist/json/attributes.json +3349 -3357
  3. package/dist/json/importMap-labs.json +26 -26
  4. package/dist/json/importMap.json +160 -160
  5. package/dist/json/tags.json +2 -4
  6. package/dist/json/web-types.json +6608 -6629
  7. package/dist/vuetify-labs.cjs +179 -121
  8. package/dist/vuetify-labs.css +3814 -3803
  9. package/dist/vuetify-labs.d.ts +248 -258
  10. package/dist/vuetify-labs.esm.js +179 -121
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +179 -121
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +154 -97
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3909 -3898
  17. package/dist/vuetify.d.ts +105 -115
  18. package/dist/vuetify.esm.js +154 -97
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +154 -97
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +102 -89
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VDataTable/VDataTable.css +12 -1
  26. package/lib/components/VDataTable/VDataTable.d.ts +20 -38
  27. package/lib/components/VDataTable/VDataTable.sass +12 -2
  28. package/lib/components/VDataTable/VDataTableColumn.d.ts +9 -3
  29. package/lib/components/VDataTable/VDataTableColumn.js +12 -4
  30. package/lib/components/VDataTable/VDataTableColumn.js.map +1 -1
  31. package/lib/components/VDataTable/VDataTableHeaders.d.ts +0 -13
  32. package/lib/components/VDataTable/VDataTableHeaders.js +10 -9
  33. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  34. package/lib/components/VDataTable/VDataTableRow.js +2 -0
  35. package/lib/components/VDataTable/VDataTableRow.js.map +1 -1
  36. package/lib/components/VDataTable/VDataTableServer.d.ts +10 -23
  37. package/lib/components/VDataTable/VDataTableVirtual.d.ts +10 -23
  38. package/lib/components/VDataTable/composables/headers.d.ts +22 -14
  39. package/lib/components/VDataTable/composables/headers.js +51 -22
  40. package/lib/components/VDataTable/composables/headers.js.map +1 -1
  41. package/lib/components/VDataTable/composables/sort.js +2 -1
  42. package/lib/components/VDataTable/composables/sort.js.map +1 -1
  43. package/lib/components/VDataTable/types.d.ts +3 -1
  44. package/lib/components/VDataTable/types.js.map +1 -1
  45. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -2
  46. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  47. package/lib/components/VList/VListGroup.d.ts +13 -0
  48. package/lib/components/VList/VListGroup.js +2 -1
  49. package/lib/components/VList/VListGroup.js.map +1 -1
  50. package/lib/components/VList/VListItem.d.ts +6 -3
  51. package/lib/components/VList/VListItem.js +1 -1
  52. package/lib/components/VList/VListItem.js.map +1 -1
  53. package/lib/components/VOtpInput/VOtpInput.js +17 -14
  54. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  55. package/lib/components/VOverlay/locationStrategies.js +1 -1
  56. package/lib/components/VOverlay/locationStrategies.js.map +1 -1
  57. package/lib/components/VTextField/VTextField.js +1 -1
  58. package/lib/components/VTextField/VTextField.js.map +1 -1
  59. package/lib/components/VTreeview/VTreeview.d.ts +6 -21
  60. package/lib/components/VTreeview/VTreeview.js +6 -9
  61. package/lib/components/VTreeview/VTreeview.js.map +1 -1
  62. package/lib/components/VTreeview/VTreeviewGroup.d.ts +13 -0
  63. package/lib/components/VTreeview/VTreeviewItem.d.ts +18 -9
  64. package/lib/components/VTreeview/VTreeviewItem.js +1 -1
  65. package/lib/components/VTreeview/VTreeviewItem.js.map +1 -1
  66. package/lib/composables/calendar.d.ts +0 -1
  67. package/lib/composables/calendar.js +6 -10
  68. package/lib/composables/calendar.js.map +1 -1
  69. package/lib/composables/date/adapters/vuetify.js +1 -1
  70. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  71. package/lib/composables/nested/nested.d.ts +7 -4
  72. package/lib/composables/nested/nested.js +16 -6
  73. package/lib/composables/nested/nested.js.map +1 -1
  74. package/lib/composables/nested/selectStrategies.d.ts +2 -1
  75. package/lib/composables/nested/selectStrategies.js +22 -11
  76. package/lib/composables/nested/selectStrategies.js.map +1 -1
  77. package/lib/composables/virtual.js +1 -1
  78. package/lib/composables/virtual.js.map +1 -1
  79. package/lib/entry-bundler.js +1 -1
  80. package/lib/framework.d.ts +60 -57
  81. package/lib/framework.js +1 -1
  82. package/lib/labs/VCalendar/VCalendar.d.ts +33 -33
  83. package/lib/labs/VCalendar/VCalendar.js +9 -9
  84. package/lib/labs/VCalendar/VCalendar.js.map +1 -1
  85. package/lib/labs/VCalendar/VCalendarDay.d.ts +33 -33
  86. package/lib/labs/VCalendar/VCalendarDay.js +1 -1
  87. package/lib/labs/VCalendar/VCalendarDay.js.map +1 -1
  88. package/lib/labs/VCalendar/VCalendarInterval.d.ts +36 -36
  89. package/lib/labs/VCalendar/VCalendarInterval.js +9 -9
  90. package/lib/labs/VCalendar/VCalendarInterval.js.map +1 -1
  91. package/lib/labs/VCalendar/VCalendarIntervalEvent.d.ts +12 -12
  92. package/lib/labs/VCalendar/VCalendarIntervalEvent.js +1 -1
  93. package/lib/labs/VCalendar/VCalendarIntervalEvent.js.map +1 -1
  94. package/lib/labs/VCalendar/VCalendarMonthDay.d.ts +36 -36
  95. package/lib/labs/VCalendar/VCalendarMonthDay.js +4 -4
  96. package/lib/labs/VCalendar/VCalendarMonthDay.js.map +1 -1
  97. package/lib/labs/VIconBtn/VIconBtn.js +1 -0
  98. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  99. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.9.0-beta.1-dev.2025-06-28
2
+ * Vuetify v3.9.0-beta.1-dev.2025-07-04
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -9100,7 +9100,7 @@ const independentSelectStrategy = mandatory => {
9100
9100
  selected.set(id, value ? 'on' : 'off');
9101
9101
  return selected;
9102
9102
  },
9103
- in: (v, children, parents) => {
9103
+ in: (v, children, parents, disabled) => {
9104
9104
  const map = new Map();
9105
9105
  for (const id of v || []) {
9106
9106
  strategy.select({
@@ -9108,7 +9108,8 @@ const independentSelectStrategy = mandatory => {
9108
9108
  value: true,
9109
9109
  selected: map,
9110
9110
  children,
9111
- parents
9111
+ parents,
9112
+ disabled
9112
9113
  });
9113
9114
  }
9114
9115
  return map;
@@ -9140,9 +9141,9 @@ const independentSingleSelectStrategy = mandatory => {
9140
9141
  selected: singleSelected
9141
9142
  });
9142
9143
  },
9143
- in: (v, children, parents) => {
9144
+ in: (v, children, parents, disabled) => {
9144
9145
  if (v?.length) {
9145
- return parentStrategy.in(v.slice(0, 1), children, parents);
9146
+ return parentStrategy.in(v.slice(0, 1), children, parents, disabled);
9146
9147
  }
9147
9148
  return new Map();
9148
9149
  },
@@ -9208,23 +9209,32 @@ const classicSelectStrategy = mandatory => {
9208
9209
  value,
9209
9210
  selected,
9210
9211
  children,
9211
- parents
9212
+ parents,
9213
+ disabled
9212
9214
  } = _ref6;
9213
9215
  id = toRaw(id);
9214
9216
  const original = new Map(selected);
9215
9217
  const items = [id];
9216
9218
  while (items.length) {
9217
9219
  const item = items.shift();
9218
- selected.set(toRaw(item), value ? 'on' : 'off');
9220
+ if (!disabled.has(item)) {
9221
+ selected.set(toRaw(item), value ? 'on' : 'off');
9222
+ }
9219
9223
  if (children.has(item)) {
9220
9224
  items.push(...children.get(item));
9221
9225
  }
9222
9226
  }
9223
9227
  let parent = toRaw(parents.get(id));
9224
9228
  while (parent) {
9225
- const childrenIds = children.get(parent);
9226
- const everySelected = childrenIds.every(cid => selected.get(toRaw(cid)) === 'on');
9227
- const noneSelected = childrenIds.every(cid => !selected.has(toRaw(cid)) || selected.get(toRaw(cid)) === 'off');
9229
+ let everySelected = true;
9230
+ let noneSelected = true;
9231
+ for (const child of children.get(parent)) {
9232
+ const cid = toRaw(child);
9233
+ if (disabled.has(cid)) continue;
9234
+ if (selected.get(cid) !== 'on') everySelected = false;
9235
+ if (selected.has(cid) && selected.get(cid) !== 'off') noneSelected = false;
9236
+ if (!everySelected && !noneSelected) break;
9237
+ }
9228
9238
  selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate');
9229
9239
  parent = toRaw(parents.get(parent));
9230
9240
  }
@@ -9241,7 +9251,7 @@ const classicSelectStrategy = mandatory => {
9241
9251
  }
9242
9252
  return selected;
9243
9253
  },
9244
- in: (v, children, parents) => {
9254
+ in: (v, children, parents, disabled) => {
9245
9255
  let map = new Map();
9246
9256
  for (const id of v || []) {
9247
9257
  map = strategy.select({
@@ -9249,7 +9259,8 @@ const classicSelectStrategy = mandatory => {
9249
9259
  value: true,
9250
9260
  selected: map,
9251
9261
  children,
9252
- parents
9262
+ parents,
9263
+ disabled
9253
9264
  });
9254
9265
  }
9255
9266
  return map;
@@ -9296,8 +9307,9 @@ const emptyNested = {
9296
9307
  root: {
9297
9308
  register: () => null,
9298
9309
  unregister: () => null,
9299
- parents: ref(new Map()),
9300
9310
  children: ref(new Map()),
9311
+ parents: ref(new Map()),
9312
+ disabled: ref(new Set()),
9301
9313
  open: () => null,
9302
9314
  openOnSelect: () => null,
9303
9315
  activate: () => null,
@@ -9326,6 +9338,7 @@ const useNested = props => {
9326
9338
  let isUnmounted = false;
9327
9339
  const children = shallowRef(new Map());
9328
9340
  const parents = shallowRef(new Map());
9341
+ const disabled = shallowRef(new Set());
9329
9342
  const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(Array.isArray(v) ? v.map(i => toRaw(i)) : v), v => [...v.values()]);
9330
9343
  const activeStrategy = computed(() => {
9331
9344
  if (typeof props.activeStrategy === 'object') return props.activeStrategy;
@@ -9374,7 +9387,7 @@ const useNested = props => {
9374
9387
  }
9375
9388
  });
9376
9389
  const activated = useProxiedModel(props, 'activated', props.activated, v => activeStrategy.value.in(v, children.value, parents.value), v => activeStrategy.value.out(v, children.value, parents.value));
9377
- const selected = useProxiedModel(props, 'selected', props.selected, v => selectStrategy.value.in(v, children.value, parents.value), v => selectStrategy.value.out(v, children.value, parents.value));
9390
+ const selected = useProxiedModel(props, 'selected', props.selected, v => selectStrategy.value.in(v, children.value, parents.value, disabled.value), v => selectStrategy.value.out(v, children.value, parents.value));
9378
9391
  onBeforeUnmount(() => {
9379
9392
  isUnmounted = true;
9380
9393
  });
@@ -9404,7 +9417,7 @@ const useNested = props => {
9404
9417
  }
9405
9418
  return arr;
9406
9419
  }),
9407
- register: (id, parentId, isGroup) => {
9420
+ register: (id, parentId, isDisabled, isGroup) => {
9408
9421
  if (nodeIds.has(id)) {
9409
9422
  const path = getPath(id).map(String).join(' -> ');
9410
9423
  const newPath = getPath(parentId).concat(id).map(String).join(' -> ');
@@ -9414,6 +9427,7 @@ const useNested = props => {
9414
9427
  nodeIds.add(id);
9415
9428
  }
9416
9429
  parentId && id !== parentId && parents.value.set(id, parentId);
9430
+ isDisabled && disabled.value.add(id);
9417
9431
  isGroup && children.value.set(id, []);
9418
9432
  if (parentId != null) {
9419
9433
  children.value.set(parentId, [...(children.value.get(parentId) || []), id]);
@@ -9423,6 +9437,7 @@ const useNested = props => {
9423
9437
  if (isUnmounted) return;
9424
9438
  nodeIds.delete(id);
9425
9439
  children.value.delete(id);
9440
+ disabled.value.delete(id);
9426
9441
  const parent = parents.value.get(id);
9427
9442
  if (parent) {
9428
9443
  const list = children.value.get(parent) ?? [];
@@ -9472,6 +9487,7 @@ const useNested = props => {
9472
9487
  selected: new Map(selected.value),
9473
9488
  children: children.value,
9474
9489
  parents: parents.value,
9490
+ disabled: disabled.value,
9475
9491
  event
9476
9492
  });
9477
9493
  newSelected && (selected.value = newSelected);
@@ -9514,13 +9530,14 @@ const useNested = props => {
9514
9530
  },
9515
9531
  children,
9516
9532
  parents,
9533
+ disabled,
9517
9534
  getPath
9518
9535
  }
9519
9536
  };
9520
9537
  provide(VNestedSymbol, nested);
9521
9538
  return nested.root;
9522
9539
  };
9523
- const useNestedItem = (id, isGroup) => {
9540
+ const useNestedItem = (id, isDisabled, isGroup) => {
9524
9541
  const parent = inject$1(VNestedSymbol, emptyNested);
9525
9542
  const uidSymbol = Symbol('nested item');
9526
9543
  const computedId = computed(() => toRaw(toValue(id)) ?? uidSymbol);
@@ -9540,10 +9557,14 @@ const useNestedItem = (id, isGroup) => {
9540
9557
  isGroupActivator: parent.isGroupActivator
9541
9558
  };
9542
9559
  onBeforeMount(() => {
9543
- !parent.isGroupActivator && parent.root.register(computedId.value, parent.id.value, isGroup);
9560
+ if (!parent.isGroupActivator) {
9561
+ parent.root.register(computedId.value, parent.id.value, toValue(isDisabled), isGroup);
9562
+ }
9544
9563
  });
9545
9564
  onBeforeUnmount(() => {
9546
- !parent.isGroupActivator && parent.root.unregister(computedId.value);
9565
+ if (!parent.isGroupActivator) {
9566
+ parent.root.unregister(computedId.value);
9567
+ }
9547
9568
  });
9548
9569
  isGroup && provide(VNestedSymbol, item);
9549
9570
  return item;
@@ -9575,6 +9596,7 @@ const makeVListGroupProps = propsFactory({
9575
9596
  type: IconValue,
9576
9597
  default: '$collapse'
9577
9598
  },
9599
+ disabled: Boolean,
9578
9600
  expandIcon: {
9579
9601
  type: IconValue,
9580
9602
  default: '$expand'
@@ -9600,7 +9622,7 @@ const VListGroup = genericComponent()({
9600
9622
  isOpen,
9601
9623
  open,
9602
9624
  id: _id
9603
- } = useNestedItem(() => props.value, true);
9625
+ } = useNestedItem(() => props.value, () => props.disabled, true);
9604
9626
  const id = computed(() => `v-list-group--id-${String(props.rawId ?? _id.value)}`);
9605
9627
  const list = useList();
9606
9628
  const {
@@ -9770,7 +9792,7 @@ const VListItem = genericComponent()({
9770
9792
  parent,
9771
9793
  openOnSelect,
9772
9794
  id: uid
9773
- } = useNestedItem(id, false);
9795
+ } = useNestedItem(id, () => props.disabled, false);
9774
9796
  const list = useList();
9775
9797
  const isActive = computed(() => props.active !== false && (props.active || link.isActive?.value || (root.activatable.value ? isActivated.value : isSelected.value)));
9776
9798
  const isLink = toRef(() => props.link !== false && link.isLink.value);
@@ -10730,7 +10752,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
10730
10752
  });
10731
10753
  if (flipped.isFull) {
10732
10754
  const values = flipped.values();
10733
- if (deepEqual(values.at(-1), values.at(-3))) {
10755
+ if (deepEqual(values.at(-1), values.at(-3)) && !deepEqual(values.at(-1), values.at(-2))) {
10734
10756
  // Flipping is causing a container resize loop
10735
10757
  return;
10736
10758
  }
@@ -12580,7 +12602,7 @@ const VTextField = genericComponent()({
12580
12602
  if (!isFocused.value) focus();
12581
12603
  nextTick(() => {
12582
12604
  if (inputRef.value !== document.activeElement) {
12583
- inputRef.value?.focus();
12605
+ nextTick(() => inputRef.value?.focus());
12584
12606
  }
12585
12607
  });
12586
12608
  }
@@ -12919,7 +12941,7 @@ function useVirtual(props, items) {
12919
12941
  raf = requestAnimationFrame(_calculateVisibleItems);
12920
12942
  }
12921
12943
  function _calculateVisibleItems() {
12922
- if (!containerRef.value || !viewportHeight.value) return;
12944
+ if (!containerRef.value || !viewportHeight.value || !itemHeight.value) return;
12923
12945
  const scrollTop = lastScrollTop - markerOffset;
12924
12946
  const direction = Math.sign(scrollVelocity);
12925
12947
  const startPx = Math.max(0, scrollTop - BUFFER_PX);
@@ -17802,7 +17824,7 @@ function format(value, formatString, locale, formats) {
17802
17824
  case 'fullDate':
17803
17825
  options = {
17804
17826
  year: 'numeric',
17805
- month: 'long',
17827
+ month: 'short',
17806
17828
  day: 'numeric'
17807
17829
  };
17808
17830
  break;
@@ -20119,7 +20141,8 @@ function sortItems(items, sortByItems, locale, options) {
20119
20141
 
20120
20142
  // Dates should be compared numerically
20121
20143
  if (sortA instanceof Date && sortB instanceof Date) {
20122
- return sortA.getTime() - sortB.getTime();
20144
+ sortA = sortA.getTime();
20145
+ sortB = sortB.getTime();
20123
20146
  }
20124
20147
  [sortA, sortB] = [sortA, sortB].map(s => s != null ? s.toString().toLocaleLowerCase() : s);
20125
20148
  if (sortA !== sortB) {
@@ -20828,10 +20851,15 @@ const VDataTableColumn = defineFunctionalComponent({
20828
20851
  type: String,
20829
20852
  default: 'start'
20830
20853
  },
20831
- fixed: Boolean,
20854
+ fixed: {
20855
+ type: [Boolean, String],
20856
+ default: false
20857
+ },
20832
20858
  fixedOffset: [Number, String],
20859
+ fixedEndOffset: [Number, String],
20833
20860
  height: [Number, String],
20834
20861
  lastFixed: Boolean,
20862
+ firstFixedEnd: Boolean,
20835
20863
  noPadding: Boolean,
20836
20864
  tag: String,
20837
20865
  width: [Number, String],
@@ -20842,11 +20870,13 @@ const VDataTableColumn = defineFunctionalComponent({
20842
20870
  slots
20843
20871
  } = _ref;
20844
20872
  const Tag = props.tag ?? 'td';
20873
+ const fixedSide = typeof props.fixed === 'string' ? props.fixed : props.fixed ? 'start' : 'none';
20845
20874
  return createVNode(Tag, {
20846
- "tabindex": "0",
20847
20875
  "class": normalizeClass(['v-data-table__td', {
20848
- 'v-data-table-column--fixed': props.fixed,
20876
+ 'v-data-table-column--fixed': fixedSide === 'start',
20877
+ 'v-data-table-column--fixed-end': fixedSide === 'end',
20849
20878
  'v-data-table-column--last-fixed': props.lastFixed,
20879
+ 'v-data-table-column--first-fixed-end': props.firstFixedEnd,
20850
20880
  'v-data-table-column--no-padding': props.noPadding,
20851
20881
  'v-data-table-column--nowrap': props.nowrap
20852
20882
  }, `v-data-table-column--align-${props.align}`]),
@@ -20854,7 +20884,8 @@ const VDataTableColumn = defineFunctionalComponent({
20854
20884
  height: convertToUnit(props.height),
20855
20885
  width: convertToUnit(props.width),
20856
20886
  maxWidth: convertToUnit(props.maxWidth),
20857
- left: convertToUnit(props.fixedOffset || null)
20887
+ left: fixedSide === 'start' ? convertToUnit(props.fixedOffset || null) : undefined,
20888
+ right: fixedSide === 'end' ? convertToUnit(props.fixedEndOffset || null) : undefined
20858
20889
  }
20859
20890
  }, {
20860
20891
  default: () => [slots.default?.()]
@@ -20951,20 +20982,28 @@ function getDepth(item) {
20951
20982
  }
20952
20983
  function parseFixedColumns(items) {
20953
20984
  let seenFixed = false;
20954
- function setFixed(item) {
20955
- let parentFixed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
20985
+ function setFixed(item, side) {
20986
+ let parentFixedSide = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'none';
20956
20987
  if (!item) return;
20957
- if (parentFixed) {
20958
- item.fixed = true;
20988
+ if (parentFixedSide !== 'none') {
20989
+ item.fixed = parentFixedSide;
20959
20990
  }
20960
- if (item.fixed) {
20961
- if (item.children) {
20962
- for (let i = item.children.length - 1; i >= 0; i--) {
20963
- setFixed(item.children[i], true);
20991
+
20992
+ // normalize to simplify logic below
20993
+ if (item.fixed === true) {
20994
+ item.fixed = 'start';
20995
+ }
20996
+ const orderedChildren = side === 'start' ? item.children?.toReversed() : item.children;
20997
+ if (item.fixed === side) {
20998
+ if (orderedChildren) {
20999
+ for (const child of orderedChildren) {
21000
+ setFixed(child, side, side);
20964
21001
  }
20965
21002
  } else {
20966
- if (!seenFixed) {
21003
+ if (!seenFixed && side === 'start') {
20967
21004
  item.lastFixed = true;
21005
+ } else if (!seenFixed && side === 'end') {
21006
+ item.firstFixedEnd = true;
20968
21007
  } else if (isNaN(Number(item.width))) {
20969
21008
  consoleError(`Multiple fixed columns should have a static width (key: ${item.key})`);
20970
21009
  } else {
@@ -20973,36 +21012,57 @@ function parseFixedColumns(items) {
20973
21012
  seenFixed = true;
20974
21013
  }
20975
21014
  } else {
20976
- if (item.children) {
20977
- for (let i = item.children.length - 1; i >= 0; i--) {
20978
- setFixed(item.children[i]);
21015
+ if (orderedChildren) {
21016
+ for (const child of orderedChildren) {
21017
+ setFixed(child, side);
20979
21018
  }
20980
21019
  } else {
20981
21020
  seenFixed = false;
20982
21021
  }
20983
21022
  }
20984
21023
  }
20985
- for (let i = items.length - 1; i >= 0; i--) {
20986
- setFixed(items[i]);
21024
+ for (const item of items.toReversed()) {
21025
+ setFixed(item, 'start');
21026
+ }
21027
+ for (const item of items) {
21028
+ setFixed(item, 'end');
20987
21029
  }
20988
21030
  function setFixedOffset(item) {
20989
- let fixedOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
20990
- if (!item) return fixedOffset;
21031
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
21032
+ if (!item) return offset;
20991
21033
  if (item.children) {
20992
- item.fixedOffset = fixedOffset;
21034
+ item.fixedOffset = offset;
20993
21035
  for (const child of item.children) {
20994
- fixedOffset = setFixedOffset(child, fixedOffset);
21036
+ offset = setFixedOffset(child, offset);
20995
21037
  }
20996
- } else if (item.fixed) {
20997
- item.fixedOffset = fixedOffset;
20998
- fixedOffset += parseFloat(item.width || '0') || 0;
21038
+ } else if (item.fixed && item.fixed !== 'end') {
21039
+ item.fixedOffset = offset;
21040
+ offset += parseFloat(item.width || '0') || 0;
20999
21041
  }
21000
- return fixedOffset;
21042
+ return offset;
21001
21043
  }
21002
21044
  let fixedOffset = 0;
21003
21045
  for (const item of items) {
21004
21046
  fixedOffset = setFixedOffset(item, fixedOffset);
21005
21047
  }
21048
+ function setFixedEndOffset(item) {
21049
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
21050
+ if (!item) return offset;
21051
+ if (item.children) {
21052
+ item.fixedEndOffset = offset;
21053
+ for (const child of item.children) {
21054
+ offset = setFixedEndOffset(child, offset);
21055
+ }
21056
+ } else if (item.fixed === 'end') {
21057
+ item.fixedEndOffset = offset;
21058
+ offset += parseFloat(item.width || '0') || 0;
21059
+ }
21060
+ return offset;
21061
+ }
21062
+ let fixedEndOffset = 0;
21063
+ for (const item of items.toReversed()) {
21064
+ fixedEndOffset = setFixedEndOffset(item, fixedEndOffset);
21065
+ }
21006
21066
  }
21007
21067
  function parse(items, maxDepth) {
21008
21068
  const headers = [];
@@ -21135,7 +21195,6 @@ const makeVDataTableHeadersProps = propsFactory({
21135
21195
  color: String,
21136
21196
  disableSort: Boolean,
21137
21197
  fixedHeader: Boolean,
21138
- lastFixed: Boolean,
21139
21198
  multiSort: Boolean,
21140
21199
  sortAscIcon: {
21141
21200
  type: IconValue,
@@ -21182,11 +21241,12 @@ const VDataTableHeaders = genericComponent()({
21182
21241
  loaderClasses
21183
21242
  } = useLoader(props);
21184
21243
  function getFixedStyles(column, y) {
21185
- if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
21244
+ if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
21245
+ const fixedSide = typeof column.fixed === 'string' ? column.fixed : column.fixed ? 'start' : 'none';
21186
21246
  return {
21187
21247
  position: 'sticky',
21188
- left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
21189
- right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
21248
+ left: fixedSide === 'start' ? convertToUnit(column.fixedOffset) : undefined,
21249
+ right: fixedSide === 'end' ? convertToUnit(column.fixedEndOffset) : undefined,
21190
21250
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
21191
21251
  };
21192
21252
  }
@@ -21246,14 +21306,15 @@ const VDataTableHeaders = genericComponent()({
21246
21306
  },
21247
21307
  "colspan": column.colspan,
21248
21308
  "rowspan": column.rowspan,
21249
- "onClick": column.sortable ? () => toggleSort(column) : undefined,
21250
21309
  "fixed": column.fixed,
21251
21310
  "nowrap": column.nowrap,
21252
21311
  "lastFixed": column.lastFixed,
21253
- "noPadding": noPadding
21254
- }, headerProps, {
21255
- "onKeydown": event => column.sortable && handleEnterKeyPress(event, column)
21256
- }), {
21312
+ "firstFixedEnd": column.firstFixedEnd,
21313
+ "noPadding": noPadding,
21314
+ "tabindex": column.sortable ? 0 : undefined,
21315
+ "onClick": column.sortable ? () => toggleSort(column) : undefined,
21316
+ "onKeydown": column.sortable ? event => handleEnterKeyPress(event, column) : undefined
21317
+ }, headerProps), {
21257
21318
  default: () => {
21258
21319
  const columnSlotName = `header.${column.key}`;
21259
21320
  const columnSlotProps = {
@@ -21529,7 +21590,9 @@ const VDataTableRow = genericComponent()({
21529
21590
  },
21530
21591
  "fixed": column.fixed,
21531
21592
  "fixedOffset": column.fixedOffset,
21593
+ "fixedEndOffset": column.fixedEndOffset,
21532
21594
  "lastFixed": column.lastFixed,
21595
+ "firstFixedEnd": column.firstFixedEnd,
21533
21596
  "maxWidth": !mobile.value ? column.maxWidth : undefined,
21534
21597
  "noPadding": column.key === 'data-table-select' || column.key === 'data-table-expand',
21535
21598
  "nowrap": column.nowrap,
@@ -22939,13 +23002,9 @@ function useCalendar(props) {
22939
23002
  const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value));
22940
23003
  return adapter.setMonth(date, value);
22941
23004
  }, v => adapter.getMonth(v));
22942
- const weekDays = computed(() => {
22943
- const firstDayOfWeek = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay();
22944
- return props.weekdays.map(day => (day + firstDayOfWeek) % 7);
22945
- });
22946
23005
  const weekdayLabels = computed(() => {
22947
- const labels = adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat);
22948
- return weekDays.value.map(day => labels[day]);
23006
+ const firstDayOfWeek = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay();
23007
+ return adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).filter((_, i) => props.weekdays.includes((i + firstDayOfWeek) % 7));
22949
23008
  });
22950
23009
  const weeksInMonth = computed(() => {
22951
23010
  const weeks = adapter.getWeekArray(month.value, props.firstDayOfWeek);
@@ -22969,13 +23028,14 @@ function useCalendar(props) {
22969
23028
  });
22970
23029
  function genDays(days, today) {
22971
23030
  return days.filter(date => {
22972
- return weekDays.value.includes(adapter.toJsDate(date).getDay());
23031
+ return props.weekdays.includes(adapter.toJsDate(date).getDay());
22973
23032
  }).map((date, index) => {
22974
23033
  const isoDate = adapter.toISO(date);
22975
23034
  const isAdjacent = !adapter.isSameMonth(date, month.value);
22976
23035
  const isStart = adapter.isSameDay(date, adapter.startOfMonth(month.value));
22977
23036
  const isEnd = adapter.isSameDay(date, adapter.endOfMonth(month.value));
22978
23037
  const isSame = adapter.isSameDay(date, month.value);
23038
+ const weekdaysCount = props.weekdays.length;
22979
23039
  return {
22980
23040
  date,
22981
23041
  formatted: adapter.format(date, 'keyboardDate'),
@@ -22987,8 +23047,8 @@ function useCalendar(props) {
22987
23047
  isSelected: model.value.some(value => adapter.isSameDay(date, value)),
22988
23048
  isStart,
22989
23049
  isToday: adapter.isSameDay(date, today),
22990
- isWeekEnd: index % 7 === 6,
22991
- isWeekStart: index % 7 === 0,
23050
+ isWeekEnd: index % weekdaysCount === weekdaysCount - 1,
23051
+ isWeekStart: index % weekdaysCount === 0,
22992
23052
  isoDate,
22993
23053
  localized: adapter.format(date, 'dayOfMonth'),
22994
23054
  month: adapter.getMonth(date),
@@ -23035,7 +23095,6 @@ function useCalendar(props) {
23035
23095
  genDays,
23036
23096
  model,
23037
23097
  weeksInMonth,
23038
- weekDays,
23039
23098
  weekdayLabels,
23040
23099
  weekNumbers
23041
23100
  };
@@ -23076,7 +23135,6 @@ const VDatePickerMonth = genericComponent()({
23076
23135
  daysInMonth,
23077
23136
  model,
23078
23137
  weekNumbers,
23079
- weekDays,
23080
23138
  weekdayLabels
23081
23139
  } = useCalendar(props);
23082
23140
  const adapter = useDate();
@@ -23151,7 +23209,7 @@ const VDatePickerMonth = genericComponent()({
23151
23209
  useRender(() => createElementVNode("div", {
23152
23210
  "class": "v-date-picker-month",
23153
23211
  "style": {
23154
- '--v-date-picker-days-in-week': weekDays.value.length
23212
+ '--v-date-picker-days-in-week': props.weekdays.length
23155
23213
  }
23156
23214
  }, [props.showWeek && createElementVNode("div", {
23157
23215
  "key": "weeks",
@@ -26322,19 +26380,21 @@ const VOtpInput = genericComponent()({
26322
26380
  const contentRef = ref();
26323
26381
  const inputRef = ref([]);
26324
26382
  const current = computed(() => inputRef.value[focusIndex.value]);
26325
- const intersectScope = effectScope();
26326
- intersectScope.run(() => {
26327
- const {
26328
- intersectionRef,
26329
- isIntersecting
26330
- } = useIntersectionObserver();
26331
- watch(isIntersecting, v => {
26332
- if (!v) return;
26333
- intersectionRef.value?.focus();
26334
- intersectScope.stop();
26335
- });
26336
- watchEffect(() => {
26337
- intersectionRef.value = inputRef.value[0];
26383
+ useToggleScope(() => props.autofocus, () => {
26384
+ const intersectScope = effectScope();
26385
+ intersectScope.run(() => {
26386
+ const {
26387
+ intersectionRef,
26388
+ isIntersecting
26389
+ } = useIntersectionObserver();
26390
+ watchEffect(() => {
26391
+ intersectionRef.value = inputRef.value[0];
26392
+ });
26393
+ watch(isIntersecting, v => {
26394
+ if (!v) return;
26395
+ intersectionRef.value?.focus();
26396
+ intersectScope.stop();
26397
+ });
26338
26398
  });
26339
26399
  });
26340
26400
  function onInput() {
@@ -30385,7 +30445,7 @@ const VTreeviewItem = genericComponent()({
30385
30445
  return createVNode(VListItem, mergeProps({
30386
30446
  "ref": vListItemRef
30387
30447
  }, listItemProps, {
30388
- "active": vListItemRef.value?.isActivated,
30448
+ "active": vListItemRef.value?.isActivated || undefined,
30389
30449
  "class": ['v-treeview-item', {
30390
30450
  'v-treeview-item--activatable-group-activator': isActivatableGroupActivator.value,
30391
30451
  'v-treeview-item--filtered': isFiltered.value
@@ -30597,10 +30657,7 @@ const makeVTreeviewProps = propsFactory({
30597
30657
  expandIcon: '$treeviewExpand',
30598
30658
  slim: true
30599
30659
  }), ['itemType', 'nav', 'openStrategy']),
30600
- modelValue: {
30601
- type: Array,
30602
- default: () => []
30603
- }
30660
+ modelValue: Array
30604
30661
  }, 'VTreeview');
30605
30662
  const VTreeview = genericComponent()({
30606
30663
  name: 'VTreeview',
@@ -30615,7 +30672,8 @@ const VTreeview = genericComponent()({
30615
30672
  },
30616
30673
  setup(props, _ref) {
30617
30674
  let {
30618
- slots
30675
+ slots,
30676
+ emit
30619
30677
  } = _ref;
30620
30678
  const {
30621
30679
  items
@@ -30624,13 +30682,12 @@ const VTreeview = genericComponent()({
30624
30682
  const baseColor = toRef(() => props.baseColor);
30625
30683
  const color = toRef(() => props.color);
30626
30684
  const activated = useProxiedModel(props, 'activated');
30627
- const model = useProxiedModel(props, 'modelValue');
30628
- const _selected = useProxiedModel(props, 'selected', props.modelValue);
30685
+ const _selected = useProxiedModel(props, 'selected');
30629
30686
  const selected = computed({
30630
- get: () => _selected.value,
30687
+ get: () => props.modelValue ?? _selected.value,
30631
30688
  set(val) {
30632
30689
  _selected.value = val;
30633
- model.value = val;
30690
+ emit('update:modelValue', val);
30634
30691
  }
30635
30692
  });
30636
30693
  const vListRef = ref();
@@ -31233,7 +31290,7 @@ function createVuetify$1() {
31233
31290
  };
31234
31291
  });
31235
31292
  }
31236
- const version$1 = "3.9.0-beta.1-dev.2025-06-28";
31293
+ const version$1 = "3.9.0-beta.1-dev.2025-07-04";
31237
31294
  createVuetify$1.version = version$1;
31238
31295
 
31239
31296
  // Vue's inject() can only be used in setup
@@ -31258,7 +31315,7 @@ const createVuetify = function () {
31258
31315
  ...options
31259
31316
  });
31260
31317
  };
31261
- const version = "3.9.0-beta.1-dev.2025-06-28";
31318
+ const version = "3.9.0-beta.1-dev.2025-07-04";
31262
31319
  createVuetify.version = version;
31263
31320
 
31264
31321
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useHotkey, useLayout, useLocale, useRtl, useTheme, version };