@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
package/dist/vuetify.cjs CHANGED
@@ -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
  */
@@ -9104,7 +9104,7 @@
9104
9104
  selected.set(id, value ? 'on' : 'off');
9105
9105
  return selected;
9106
9106
  },
9107
- in: (v, children, parents) => {
9107
+ in: (v, children, parents, disabled) => {
9108
9108
  const map = new Map();
9109
9109
  for (const id of v || []) {
9110
9110
  strategy.select({
@@ -9112,7 +9112,8 @@
9112
9112
  value: true,
9113
9113
  selected: map,
9114
9114
  children,
9115
- parents
9115
+ parents,
9116
+ disabled
9116
9117
  });
9117
9118
  }
9118
9119
  return map;
@@ -9144,9 +9145,9 @@
9144
9145
  selected: singleSelected
9145
9146
  });
9146
9147
  },
9147
- in: (v, children, parents) => {
9148
+ in: (v, children, parents, disabled) => {
9148
9149
  if (v?.length) {
9149
- return parentStrategy.in(v.slice(0, 1), children, parents);
9150
+ return parentStrategy.in(v.slice(0, 1), children, parents, disabled);
9150
9151
  }
9151
9152
  return new Map();
9152
9153
  },
@@ -9212,23 +9213,32 @@
9212
9213
  value,
9213
9214
  selected,
9214
9215
  children,
9215
- parents
9216
+ parents,
9217
+ disabled
9216
9218
  } = _ref6;
9217
9219
  id = vue.toRaw(id);
9218
9220
  const original = new Map(selected);
9219
9221
  const items = [id];
9220
9222
  while (items.length) {
9221
9223
  const item = items.shift();
9222
- selected.set(vue.toRaw(item), value ? 'on' : 'off');
9224
+ if (!disabled.has(item)) {
9225
+ selected.set(vue.toRaw(item), value ? 'on' : 'off');
9226
+ }
9223
9227
  if (children.has(item)) {
9224
9228
  items.push(...children.get(item));
9225
9229
  }
9226
9230
  }
9227
9231
  let parent = vue.toRaw(parents.get(id));
9228
9232
  while (parent) {
9229
- const childrenIds = children.get(parent);
9230
- const everySelected = childrenIds.every(cid => selected.get(vue.toRaw(cid)) === 'on');
9231
- const noneSelected = childrenIds.every(cid => !selected.has(vue.toRaw(cid)) || selected.get(vue.toRaw(cid)) === 'off');
9233
+ let everySelected = true;
9234
+ let noneSelected = true;
9235
+ for (const child of children.get(parent)) {
9236
+ const cid = vue.toRaw(child);
9237
+ if (disabled.has(cid)) continue;
9238
+ if (selected.get(cid) !== 'on') everySelected = false;
9239
+ if (selected.has(cid) && selected.get(cid) !== 'off') noneSelected = false;
9240
+ if (!everySelected && !noneSelected) break;
9241
+ }
9232
9242
  selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate');
9233
9243
  parent = vue.toRaw(parents.get(parent));
9234
9244
  }
@@ -9245,7 +9255,7 @@
9245
9255
  }
9246
9256
  return selected;
9247
9257
  },
9248
- in: (v, children, parents) => {
9258
+ in: (v, children, parents, disabled) => {
9249
9259
  let map = new Map();
9250
9260
  for (const id of v || []) {
9251
9261
  map = strategy.select({
@@ -9253,7 +9263,8 @@
9253
9263
  value: true,
9254
9264
  selected: map,
9255
9265
  children,
9256
- parents
9266
+ parents,
9267
+ disabled
9257
9268
  });
9258
9269
  }
9259
9270
  return map;
@@ -9300,8 +9311,9 @@
9300
9311
  root: {
9301
9312
  register: () => null,
9302
9313
  unregister: () => null,
9303
- parents: vue.ref(new Map()),
9304
9314
  children: vue.ref(new Map()),
9315
+ parents: vue.ref(new Map()),
9316
+ disabled: vue.ref(new Set()),
9305
9317
  open: () => null,
9306
9318
  openOnSelect: () => null,
9307
9319
  activate: () => null,
@@ -9330,6 +9342,7 @@
9330
9342
  let isUnmounted = false;
9331
9343
  const children = vue.shallowRef(new Map());
9332
9344
  const parents = vue.shallowRef(new Map());
9345
+ const disabled = vue.shallowRef(new Set());
9333
9346
  const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(Array.isArray(v) ? v.map(i => vue.toRaw(i)) : v), v => [...v.values()]);
9334
9347
  const activeStrategy = vue.computed(() => {
9335
9348
  if (typeof props.activeStrategy === 'object') return props.activeStrategy;
@@ -9378,7 +9391,7 @@
9378
9391
  }
9379
9392
  });
9380
9393
  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));
9381
- 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));
9394
+ 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));
9382
9395
  vue.onBeforeUnmount(() => {
9383
9396
  isUnmounted = true;
9384
9397
  });
@@ -9408,7 +9421,7 @@
9408
9421
  }
9409
9422
  return arr;
9410
9423
  }),
9411
- register: (id, parentId, isGroup) => {
9424
+ register: (id, parentId, isDisabled, isGroup) => {
9412
9425
  if (nodeIds.has(id)) {
9413
9426
  const path = getPath(id).map(String).join(' -> ');
9414
9427
  const newPath = getPath(parentId).concat(id).map(String).join(' -> ');
@@ -9418,6 +9431,7 @@
9418
9431
  nodeIds.add(id);
9419
9432
  }
9420
9433
  parentId && id !== parentId && parents.value.set(id, parentId);
9434
+ isDisabled && disabled.value.add(id);
9421
9435
  isGroup && children.value.set(id, []);
9422
9436
  if (parentId != null) {
9423
9437
  children.value.set(parentId, [...(children.value.get(parentId) || []), id]);
@@ -9427,6 +9441,7 @@
9427
9441
  if (isUnmounted) return;
9428
9442
  nodeIds.delete(id);
9429
9443
  children.value.delete(id);
9444
+ disabled.value.delete(id);
9430
9445
  const parent = parents.value.get(id);
9431
9446
  if (parent) {
9432
9447
  const list = children.value.get(parent) ?? [];
@@ -9476,6 +9491,7 @@
9476
9491
  selected: new Map(selected.value),
9477
9492
  children: children.value,
9478
9493
  parents: parents.value,
9494
+ disabled: disabled.value,
9479
9495
  event
9480
9496
  });
9481
9497
  newSelected && (selected.value = newSelected);
@@ -9518,13 +9534,14 @@
9518
9534
  },
9519
9535
  children,
9520
9536
  parents,
9537
+ disabled,
9521
9538
  getPath
9522
9539
  }
9523
9540
  };
9524
9541
  vue.provide(VNestedSymbol, nested);
9525
9542
  return nested.root;
9526
9543
  };
9527
- const useNestedItem = (id, isGroup) => {
9544
+ const useNestedItem = (id, isDisabled, isGroup) => {
9528
9545
  const parent = vue.inject(VNestedSymbol, emptyNested);
9529
9546
  const uidSymbol = Symbol('nested item');
9530
9547
  const computedId = vue.computed(() => vue.toRaw(vue.toValue(id)) ?? uidSymbol);
@@ -9544,10 +9561,14 @@
9544
9561
  isGroupActivator: parent.isGroupActivator
9545
9562
  };
9546
9563
  vue.onBeforeMount(() => {
9547
- !parent.isGroupActivator && parent.root.register(computedId.value, parent.id.value, isGroup);
9564
+ if (!parent.isGroupActivator) {
9565
+ parent.root.register(computedId.value, parent.id.value, vue.toValue(isDisabled), isGroup);
9566
+ }
9548
9567
  });
9549
9568
  vue.onBeforeUnmount(() => {
9550
- !parent.isGroupActivator && parent.root.unregister(computedId.value);
9569
+ if (!parent.isGroupActivator) {
9570
+ parent.root.unregister(computedId.value);
9571
+ }
9551
9572
  });
9552
9573
  isGroup && vue.provide(VNestedSymbol, item);
9553
9574
  return item;
@@ -9579,6 +9600,7 @@
9579
9600
  type: IconValue,
9580
9601
  default: '$collapse'
9581
9602
  },
9603
+ disabled: Boolean,
9582
9604
  expandIcon: {
9583
9605
  type: IconValue,
9584
9606
  default: '$expand'
@@ -9604,7 +9626,7 @@
9604
9626
  isOpen,
9605
9627
  open,
9606
9628
  id: _id
9607
- } = useNestedItem(() => props.value, true);
9629
+ } = useNestedItem(() => props.value, () => props.disabled, true);
9608
9630
  const id = vue.computed(() => `v-list-group--id-${String(props.rawId ?? _id.value)}`);
9609
9631
  const list = useList();
9610
9632
  const {
@@ -9774,7 +9796,7 @@
9774
9796
  parent,
9775
9797
  openOnSelect,
9776
9798
  id: uid
9777
- } = useNestedItem(id, false);
9799
+ } = useNestedItem(id, () => props.disabled, false);
9778
9800
  const list = useList();
9779
9801
  const isActive = vue.computed(() => props.active !== false && (props.active || link.isActive?.value || (root.activatable.value ? isActivated.value : isSelected.value)));
9780
9802
  const isLink = vue.toRef(() => props.link !== false && link.isLink.value);
@@ -10734,7 +10756,7 @@
10734
10756
  });
10735
10757
  if (flipped.isFull) {
10736
10758
  const values = flipped.values();
10737
- if (deepEqual(values.at(-1), values.at(-3))) {
10759
+ if (deepEqual(values.at(-1), values.at(-3)) && !deepEqual(values.at(-1), values.at(-2))) {
10738
10760
  // Flipping is causing a container resize loop
10739
10761
  return;
10740
10762
  }
@@ -12584,7 +12606,7 @@
12584
12606
  if (!isFocused.value) focus();
12585
12607
  vue.nextTick(() => {
12586
12608
  if (inputRef.value !== document.activeElement) {
12587
- inputRef.value?.focus();
12609
+ vue.nextTick(() => inputRef.value?.focus());
12588
12610
  }
12589
12611
  });
12590
12612
  }
@@ -12923,7 +12945,7 @@
12923
12945
  raf = requestAnimationFrame(_calculateVisibleItems);
12924
12946
  }
12925
12947
  function _calculateVisibleItems() {
12926
- if (!containerRef.value || !viewportHeight.value) return;
12948
+ if (!containerRef.value || !viewportHeight.value || !itemHeight.value) return;
12927
12949
  const scrollTop = lastScrollTop - markerOffset;
12928
12950
  const direction = Math.sign(scrollVelocity);
12929
12951
  const startPx = Math.max(0, scrollTop - BUFFER_PX);
@@ -17806,7 +17828,7 @@
17806
17828
  case 'fullDate':
17807
17829
  options = {
17808
17830
  year: 'numeric',
17809
- month: 'long',
17831
+ month: 'short',
17810
17832
  day: 'numeric'
17811
17833
  };
17812
17834
  break;
@@ -20123,7 +20145,8 @@
20123
20145
 
20124
20146
  // Dates should be compared numerically
20125
20147
  if (sortA instanceof Date && sortB instanceof Date) {
20126
- return sortA.getTime() - sortB.getTime();
20148
+ sortA = sortA.getTime();
20149
+ sortB = sortB.getTime();
20127
20150
  }
20128
20151
  [sortA, sortB] = [sortA, sortB].map(s => s != null ? s.toString().toLocaleLowerCase() : s);
20129
20152
  if (sortA !== sortB) {
@@ -20832,10 +20855,15 @@
20832
20855
  type: String,
20833
20856
  default: 'start'
20834
20857
  },
20835
- fixed: Boolean,
20858
+ fixed: {
20859
+ type: [Boolean, String],
20860
+ default: false
20861
+ },
20836
20862
  fixedOffset: [Number, String],
20863
+ fixedEndOffset: [Number, String],
20837
20864
  height: [Number, String],
20838
20865
  lastFixed: Boolean,
20866
+ firstFixedEnd: Boolean,
20839
20867
  noPadding: Boolean,
20840
20868
  tag: String,
20841
20869
  width: [Number, String],
@@ -20846,11 +20874,13 @@
20846
20874
  slots
20847
20875
  } = _ref;
20848
20876
  const Tag = props.tag ?? 'td';
20877
+ const fixedSide = typeof props.fixed === 'string' ? props.fixed : props.fixed ? 'start' : 'none';
20849
20878
  return vue.createVNode(Tag, {
20850
- "tabindex": "0",
20851
20879
  "class": vue.normalizeClass(['v-data-table__td', {
20852
- 'v-data-table-column--fixed': props.fixed,
20880
+ 'v-data-table-column--fixed': fixedSide === 'start',
20881
+ 'v-data-table-column--fixed-end': fixedSide === 'end',
20853
20882
  'v-data-table-column--last-fixed': props.lastFixed,
20883
+ 'v-data-table-column--first-fixed-end': props.firstFixedEnd,
20854
20884
  'v-data-table-column--no-padding': props.noPadding,
20855
20885
  'v-data-table-column--nowrap': props.nowrap
20856
20886
  }, `v-data-table-column--align-${props.align}`]),
@@ -20858,7 +20888,8 @@
20858
20888
  height: convertToUnit(props.height),
20859
20889
  width: convertToUnit(props.width),
20860
20890
  maxWidth: convertToUnit(props.maxWidth),
20861
- left: convertToUnit(props.fixedOffset || null)
20891
+ left: fixedSide === 'start' ? convertToUnit(props.fixedOffset || null) : undefined,
20892
+ right: fixedSide === 'end' ? convertToUnit(props.fixedEndOffset || null) : undefined
20862
20893
  }
20863
20894
  }, {
20864
20895
  default: () => [slots.default?.()]
@@ -20955,20 +20986,28 @@
20955
20986
  }
20956
20987
  function parseFixedColumns(items) {
20957
20988
  let seenFixed = false;
20958
- function setFixed(item) {
20959
- let parentFixed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
20989
+ function setFixed(item, side) {
20990
+ let parentFixedSide = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'none';
20960
20991
  if (!item) return;
20961
- if (parentFixed) {
20962
- item.fixed = true;
20992
+ if (parentFixedSide !== 'none') {
20993
+ item.fixed = parentFixedSide;
20963
20994
  }
20964
- if (item.fixed) {
20965
- if (item.children) {
20966
- for (let i = item.children.length - 1; i >= 0; i--) {
20967
- setFixed(item.children[i], true);
20995
+
20996
+ // normalize to simplify logic below
20997
+ if (item.fixed === true) {
20998
+ item.fixed = 'start';
20999
+ }
21000
+ const orderedChildren = side === 'start' ? item.children?.toReversed() : item.children;
21001
+ if (item.fixed === side) {
21002
+ if (orderedChildren) {
21003
+ for (const child of orderedChildren) {
21004
+ setFixed(child, side, side);
20968
21005
  }
20969
21006
  } else {
20970
- if (!seenFixed) {
21007
+ if (!seenFixed && side === 'start') {
20971
21008
  item.lastFixed = true;
21009
+ } else if (!seenFixed && side === 'end') {
21010
+ item.firstFixedEnd = true;
20972
21011
  } else if (isNaN(Number(item.width))) {
20973
21012
  consoleError(`Multiple fixed columns should have a static width (key: ${item.key})`);
20974
21013
  } else {
@@ -20977,36 +21016,57 @@
20977
21016
  seenFixed = true;
20978
21017
  }
20979
21018
  } else {
20980
- if (item.children) {
20981
- for (let i = item.children.length - 1; i >= 0; i--) {
20982
- setFixed(item.children[i]);
21019
+ if (orderedChildren) {
21020
+ for (const child of orderedChildren) {
21021
+ setFixed(child, side);
20983
21022
  }
20984
21023
  } else {
20985
21024
  seenFixed = false;
20986
21025
  }
20987
21026
  }
20988
21027
  }
20989
- for (let i = items.length - 1; i >= 0; i--) {
20990
- setFixed(items[i]);
21028
+ for (const item of items.toReversed()) {
21029
+ setFixed(item, 'start');
21030
+ }
21031
+ for (const item of items) {
21032
+ setFixed(item, 'end');
20991
21033
  }
20992
21034
  function setFixedOffset(item) {
20993
- let fixedOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
20994
- if (!item) return fixedOffset;
21035
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
21036
+ if (!item) return offset;
20995
21037
  if (item.children) {
20996
- item.fixedOffset = fixedOffset;
21038
+ item.fixedOffset = offset;
20997
21039
  for (const child of item.children) {
20998
- fixedOffset = setFixedOffset(child, fixedOffset);
21040
+ offset = setFixedOffset(child, offset);
20999
21041
  }
21000
- } else if (item.fixed) {
21001
- item.fixedOffset = fixedOffset;
21002
- fixedOffset += parseFloat(item.width || '0') || 0;
21042
+ } else if (item.fixed && item.fixed !== 'end') {
21043
+ item.fixedOffset = offset;
21044
+ offset += parseFloat(item.width || '0') || 0;
21003
21045
  }
21004
- return fixedOffset;
21046
+ return offset;
21005
21047
  }
21006
21048
  let fixedOffset = 0;
21007
21049
  for (const item of items) {
21008
21050
  fixedOffset = setFixedOffset(item, fixedOffset);
21009
21051
  }
21052
+ function setFixedEndOffset(item) {
21053
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
21054
+ if (!item) return offset;
21055
+ if (item.children) {
21056
+ item.fixedEndOffset = offset;
21057
+ for (const child of item.children) {
21058
+ offset = setFixedEndOffset(child, offset);
21059
+ }
21060
+ } else if (item.fixed === 'end') {
21061
+ item.fixedEndOffset = offset;
21062
+ offset += parseFloat(item.width || '0') || 0;
21063
+ }
21064
+ return offset;
21065
+ }
21066
+ let fixedEndOffset = 0;
21067
+ for (const item of items.toReversed()) {
21068
+ fixedEndOffset = setFixedEndOffset(item, fixedEndOffset);
21069
+ }
21010
21070
  }
21011
21071
  function parse(items, maxDepth) {
21012
21072
  const headers = [];
@@ -21139,7 +21199,6 @@
21139
21199
  color: String,
21140
21200
  disableSort: Boolean,
21141
21201
  fixedHeader: Boolean,
21142
- lastFixed: Boolean,
21143
21202
  multiSort: Boolean,
21144
21203
  sortAscIcon: {
21145
21204
  type: IconValue,
@@ -21186,11 +21245,12 @@
21186
21245
  loaderClasses
21187
21246
  } = useLoader(props);
21188
21247
  function getFixedStyles(column, y) {
21189
- if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
21248
+ if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
21249
+ const fixedSide = typeof column.fixed === 'string' ? column.fixed : column.fixed ? 'start' : 'none';
21190
21250
  return {
21191
21251
  position: 'sticky',
21192
- left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
21193
- right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
21252
+ left: fixedSide === 'start' ? convertToUnit(column.fixedOffset) : undefined,
21253
+ right: fixedSide === 'end' ? convertToUnit(column.fixedEndOffset) : undefined,
21194
21254
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
21195
21255
  };
21196
21256
  }
@@ -21250,14 +21310,15 @@
21250
21310
  },
21251
21311
  "colspan": column.colspan,
21252
21312
  "rowspan": column.rowspan,
21253
- "onClick": column.sortable ? () => toggleSort(column) : undefined,
21254
21313
  "fixed": column.fixed,
21255
21314
  "nowrap": column.nowrap,
21256
21315
  "lastFixed": column.lastFixed,
21257
- "noPadding": noPadding
21258
- }, headerProps, {
21259
- "onKeydown": event => column.sortable && handleEnterKeyPress(event, column)
21260
- }), {
21316
+ "firstFixedEnd": column.firstFixedEnd,
21317
+ "noPadding": noPadding,
21318
+ "tabindex": column.sortable ? 0 : undefined,
21319
+ "onClick": column.sortable ? () => toggleSort(column) : undefined,
21320
+ "onKeydown": column.sortable ? event => handleEnterKeyPress(event, column) : undefined
21321
+ }, headerProps), {
21261
21322
  default: () => {
21262
21323
  const columnSlotName = `header.${column.key}`;
21263
21324
  const columnSlotProps = {
@@ -21533,7 +21594,9 @@
21533
21594
  },
21534
21595
  "fixed": column.fixed,
21535
21596
  "fixedOffset": column.fixedOffset,
21597
+ "fixedEndOffset": column.fixedEndOffset,
21536
21598
  "lastFixed": column.lastFixed,
21599
+ "firstFixedEnd": column.firstFixedEnd,
21537
21600
  "maxWidth": !mobile.value ? column.maxWidth : undefined,
21538
21601
  "noPadding": column.key === 'data-table-select' || column.key === 'data-table-expand',
21539
21602
  "nowrap": column.nowrap,
@@ -22943,13 +23006,9 @@
22943
23006
  const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value));
22944
23007
  return adapter.setMonth(date, value);
22945
23008
  }, v => adapter.getMonth(v));
22946
- const weekDays = vue.computed(() => {
22947
- const firstDayOfWeek = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay();
22948
- return props.weekdays.map(day => (day + firstDayOfWeek) % 7);
22949
- });
22950
23009
  const weekdayLabels = vue.computed(() => {
22951
- const labels = adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat);
22952
- return weekDays.value.map(day => labels[day]);
23010
+ const firstDayOfWeek = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay();
23011
+ return adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).filter((_, i) => props.weekdays.includes((i + firstDayOfWeek) % 7));
22953
23012
  });
22954
23013
  const weeksInMonth = vue.computed(() => {
22955
23014
  const weeks = adapter.getWeekArray(month.value, props.firstDayOfWeek);
@@ -22973,13 +23032,14 @@
22973
23032
  });
22974
23033
  function genDays(days, today) {
22975
23034
  return days.filter(date => {
22976
- return weekDays.value.includes(adapter.toJsDate(date).getDay());
23035
+ return props.weekdays.includes(adapter.toJsDate(date).getDay());
22977
23036
  }).map((date, index) => {
22978
23037
  const isoDate = adapter.toISO(date);
22979
23038
  const isAdjacent = !adapter.isSameMonth(date, month.value);
22980
23039
  const isStart = adapter.isSameDay(date, adapter.startOfMonth(month.value));
22981
23040
  const isEnd = adapter.isSameDay(date, adapter.endOfMonth(month.value));
22982
23041
  const isSame = adapter.isSameDay(date, month.value);
23042
+ const weekdaysCount = props.weekdays.length;
22983
23043
  return {
22984
23044
  date,
22985
23045
  formatted: adapter.format(date, 'keyboardDate'),
@@ -22991,8 +23051,8 @@
22991
23051
  isSelected: model.value.some(value => adapter.isSameDay(date, value)),
22992
23052
  isStart,
22993
23053
  isToday: adapter.isSameDay(date, today),
22994
- isWeekEnd: index % 7 === 6,
22995
- isWeekStart: index % 7 === 0,
23054
+ isWeekEnd: index % weekdaysCount === weekdaysCount - 1,
23055
+ isWeekStart: index % weekdaysCount === 0,
22996
23056
  isoDate,
22997
23057
  localized: adapter.format(date, 'dayOfMonth'),
22998
23058
  month: adapter.getMonth(date),
@@ -23039,7 +23099,6 @@
23039
23099
  genDays,
23040
23100
  model,
23041
23101
  weeksInMonth,
23042
- weekDays,
23043
23102
  weekdayLabels,
23044
23103
  weekNumbers
23045
23104
  };
@@ -23080,7 +23139,6 @@
23080
23139
  daysInMonth,
23081
23140
  model,
23082
23141
  weekNumbers,
23083
- weekDays,
23084
23142
  weekdayLabels
23085
23143
  } = useCalendar(props);
23086
23144
  const adapter = useDate();
@@ -23155,7 +23213,7 @@
23155
23213
  useRender(() => vue.createElementVNode("div", {
23156
23214
  "class": "v-date-picker-month",
23157
23215
  "style": {
23158
- '--v-date-picker-days-in-week': weekDays.value.length
23216
+ '--v-date-picker-days-in-week': props.weekdays.length
23159
23217
  }
23160
23218
  }, [props.showWeek && vue.createElementVNode("div", {
23161
23219
  "key": "weeks",
@@ -26326,19 +26384,21 @@
26326
26384
  const contentRef = vue.ref();
26327
26385
  const inputRef = vue.ref([]);
26328
26386
  const current = vue.computed(() => inputRef.value[focusIndex.value]);
26329
- const intersectScope = vue.effectScope();
26330
- intersectScope.run(() => {
26331
- const {
26332
- intersectionRef,
26333
- isIntersecting
26334
- } = useIntersectionObserver();
26335
- vue.watch(isIntersecting, v => {
26336
- if (!v) return;
26337
- intersectionRef.value?.focus();
26338
- intersectScope.stop();
26339
- });
26340
- vue.watchEffect(() => {
26341
- intersectionRef.value = inputRef.value[0];
26387
+ useToggleScope(() => props.autofocus, () => {
26388
+ const intersectScope = vue.effectScope();
26389
+ intersectScope.run(() => {
26390
+ const {
26391
+ intersectionRef,
26392
+ isIntersecting
26393
+ } = useIntersectionObserver();
26394
+ vue.watchEffect(() => {
26395
+ intersectionRef.value = inputRef.value[0];
26396
+ });
26397
+ vue.watch(isIntersecting, v => {
26398
+ if (!v) return;
26399
+ intersectionRef.value?.focus();
26400
+ intersectScope.stop();
26401
+ });
26342
26402
  });
26343
26403
  });
26344
26404
  function onInput() {
@@ -30389,7 +30449,7 @@
30389
30449
  return vue.createVNode(VListItem, vue.mergeProps({
30390
30450
  "ref": vListItemRef
30391
30451
  }, listItemProps, {
30392
- "active": vListItemRef.value?.isActivated,
30452
+ "active": vListItemRef.value?.isActivated || undefined,
30393
30453
  "class": ['v-treeview-item', {
30394
30454
  'v-treeview-item--activatable-group-activator': isActivatableGroupActivator.value,
30395
30455
  'v-treeview-item--filtered': isFiltered.value
@@ -30601,10 +30661,7 @@
30601
30661
  expandIcon: '$treeviewExpand',
30602
30662
  slim: true
30603
30663
  }), ['itemType', 'nav', 'openStrategy']),
30604
- modelValue: {
30605
- type: Array,
30606
- default: () => []
30607
- }
30664
+ modelValue: Array
30608
30665
  }, 'VTreeview');
30609
30666
  const VTreeview = genericComponent()({
30610
30667
  name: 'VTreeview',
@@ -30619,7 +30676,8 @@
30619
30676
  },
30620
30677
  setup(props, _ref) {
30621
30678
  let {
30622
- slots
30679
+ slots,
30680
+ emit
30623
30681
  } = _ref;
30624
30682
  const {
30625
30683
  items
@@ -30628,13 +30686,12 @@
30628
30686
  const baseColor = vue.toRef(() => props.baseColor);
30629
30687
  const color = vue.toRef(() => props.color);
30630
30688
  const activated = useProxiedModel(props, 'activated');
30631
- const model = useProxiedModel(props, 'modelValue');
30632
- const _selected = useProxiedModel(props, 'selected', props.modelValue);
30689
+ const _selected = useProxiedModel(props, 'selected');
30633
30690
  const selected = vue.computed({
30634
- get: () => _selected.value,
30691
+ get: () => props.modelValue ?? _selected.value,
30635
30692
  set(val) {
30636
30693
  _selected.value = val;
30637
- model.value = val;
30694
+ emit('update:modelValue', val);
30638
30695
  }
30639
30696
  });
30640
30697
  const vListRef = vue.ref();
@@ -31237,7 +31294,7 @@
31237
31294
  };
31238
31295
  });
31239
31296
  }
31240
- const version$1 = "3.9.0-beta.1-dev.2025-06-28";
31297
+ const version$1 = "3.9.0-beta.1-dev.2025-07-04";
31241
31298
  createVuetify$1.version = version$1;
31242
31299
 
31243
31300
  // Vue's inject() can only be used in setup
@@ -31262,7 +31319,7 @@
31262
31319
  ...options
31263
31320
  });
31264
31321
  };
31265
- const version = "3.9.0-beta.1-dev.2025-06-28";
31322
+ const version = "3.9.0-beta.1-dev.2025-07-04";
31266
31323
  createVuetify.version = version;
31267
31324
 
31268
31325
  exports.blueprints = index;