@vuetify/nightly 3.10.5-dev.2025-10-07 → 3.10.5-dev.2025-10-09

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 (73) hide show
  1. package/CHANGELOG.md +16 -3
  2. package/dist/json/attributes.json +3521 -3521
  3. package/dist/json/importMap-labs.json +14 -14
  4. package/dist/json/importMap.json +180 -180
  5. package/dist/json/tags.json +5 -5
  6. package/dist/json/web-types.json +6459 -6444
  7. package/dist/vuetify-labs.cjs +230 -166
  8. package/dist/vuetify-labs.css +3872 -3872
  9. package/dist/vuetify-labs.d.ts +1520 -1446
  10. package/dist/vuetify-labs.esm.js +230 -166
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +230 -166
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +156 -92
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3682 -3682
  17. package/dist/vuetify.d.ts +2284 -2195
  18. package/dist/vuetify.esm.js +156 -92
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +156 -92
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +959 -955
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.d.ts +0 -61
  26. package/lib/components/VAutocomplete/VAutocomplete.js +13 -11
  27. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  28. package/lib/components/VCombobox/VCombobox.d.ts +6 -67
  29. package/lib/components/VCombobox/VCombobox.js +22 -23
  30. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  31. package/lib/components/VDataTable/VDataTable.d.ts +7 -7
  32. package/lib/components/VDataTable/VDataTableFooter.d.ts +16 -3
  33. package/lib/components/VDataTable/VDataTableFooter.js +4 -2
  34. package/lib/components/VDataTable/VDataTableFooter.js.map +1 -1
  35. package/lib/components/VDataTable/VDataTableHeaders.js +10 -7
  36. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  37. package/lib/components/VDataTable/VDataTableRow.d.ts +10 -0
  38. package/lib/components/VDataTable/VDataTableRow.js +3 -0
  39. package/lib/components/VDataTable/VDataTableRow.js.map +1 -1
  40. package/lib/components/VDataTable/VDataTableRows.d.ts +10 -0
  41. package/lib/components/VDataTable/VDataTableRows.js +2 -0
  42. package/lib/components/VDataTable/VDataTableRows.js.map +1 -1
  43. package/lib/components/VDataTable/VDataTableServer.d.ts +7 -7
  44. package/lib/components/VNumberInput/VNumberInput.js +23 -8
  45. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  46. package/lib/components/VSlideGroup/VSlideGroup.d.ts +1 -1
  47. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  48. package/lib/components/VTabs/VTabs.d.ts +16 -2
  49. package/lib/components/VTabs/VTabs.js +4 -2
  50. package/lib/components/VTabs/VTabs.js.map +1 -1
  51. package/lib/components/VTextarea/VTextarea.css +2 -2
  52. package/lib/components/VTextarea/VTextarea.js +20 -1
  53. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  54. package/lib/components/VTextarea/VTextarea.sass +4 -2
  55. package/lib/components/VTreeview/VTreeview.d.ts +192 -5
  56. package/lib/components/VTreeview/VTreeview.js +16 -3
  57. package/lib/components/VTreeview/VTreeview.js.map +1 -1
  58. package/lib/composables/icons.d.ts +0 -2
  59. package/lib/composables/icons.js +3 -36
  60. package/lib/composables/icons.js.map +1 -1
  61. package/lib/composables/virtual.js +2 -2
  62. package/lib/composables/virtual.js.map +1 -1
  63. package/lib/entry-bundler.js +1 -1
  64. package/lib/framework.d.ts +60 -60
  65. package/lib/framework.js +3 -2
  66. package/lib/framework.js.map +1 -1
  67. package/lib/icons.d.ts +3 -0
  68. package/lib/icons.js +34 -0
  69. package/lib/icons.js.map +1 -0
  70. package/lib/labs/VDateInput/VDateInput.d.ts +0 -30
  71. package/lib/labs/VDateInput/VDateInput.js +2 -2
  72. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  73. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.10.5-dev.2025-10-07
2
+ * Vuetify v3.10.5-dev.2025-10-09
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -4783,83 +4783,7 @@
4783
4783
  }
4784
4784
  });
4785
4785
 
4786
- // Composables
4787
-
4788
- // Types
4789
-
4790
- const aliases = {
4791
- collapse: 'mdi-chevron-up',
4792
- complete: 'mdi-check',
4793
- cancel: 'mdi-close-circle',
4794
- close: 'mdi-close',
4795
- delete: 'mdi-close-circle',
4796
- // delete (e.g. v-chip close)
4797
- clear: 'mdi-close-circle',
4798
- success: 'mdi-check-circle',
4799
- info: 'mdi-information',
4800
- warning: 'mdi-alert-circle',
4801
- error: 'mdi-close-circle',
4802
- prev: 'mdi-chevron-left',
4803
- next: 'mdi-chevron-right',
4804
- checkboxOn: 'mdi-checkbox-marked',
4805
- checkboxOff: 'mdi-checkbox-blank-outline',
4806
- checkboxIndeterminate: 'mdi-minus-box',
4807
- delimiter: 'mdi-circle',
4808
- // for carousel
4809
- sortAsc: 'mdi-arrow-up',
4810
- sortDesc: 'mdi-arrow-down',
4811
- expand: 'mdi-chevron-down',
4812
- menu: 'mdi-menu',
4813
- subgroup: 'mdi-menu-down',
4814
- dropdown: 'mdi-menu-down',
4815
- radioOn: 'mdi-radiobox-marked',
4816
- radioOff: 'mdi-radiobox-blank',
4817
- edit: 'mdi-pencil',
4818
- ratingEmpty: 'mdi-star-outline',
4819
- ratingFull: 'mdi-star',
4820
- ratingHalf: 'mdi-star-half-full',
4821
- loading: 'mdi-cached',
4822
- first: 'mdi-page-first',
4823
- last: 'mdi-page-last',
4824
- unfold: 'mdi-unfold-more-horizontal',
4825
- file: 'mdi-paperclip',
4826
- plus: 'mdi-plus',
4827
- minus: 'mdi-minus',
4828
- calendar: 'mdi-calendar',
4829
- treeviewCollapse: 'mdi-menu-down',
4830
- treeviewExpand: 'mdi-menu-right',
4831
- tableGroupCollapse: 'mdi-chevron-down',
4832
- tableGroupExpand: 'mdi-chevron-right',
4833
- eyeDropper: 'mdi-eyedropper',
4834
- upload: 'mdi-cloud-upload',
4835
- color: 'mdi-palette',
4836
- command: 'mdi-apple-keyboard-command',
4837
- ctrl: 'mdi-apple-keyboard-control',
4838
- space: 'mdi-keyboard-space',
4839
- shift: 'mdi-apple-keyboard-shift',
4840
- alt: 'mdi-apple-keyboard-option',
4841
- enter: 'mdi-keyboard-return',
4842
- arrowup: 'mdi-arrow-up',
4843
- arrowdown: 'mdi-arrow-down',
4844
- arrowleft: 'mdi-arrow-left',
4845
- arrowright: 'mdi-arrow-right',
4846
- backspace: 'mdi-backspace',
4847
- play: 'mdi-play',
4848
- pause: 'mdi-pause',
4849
- fullscreen: 'mdi-fullscreen',
4850
- fullscreenExit: 'mdi-fullscreen-exit',
4851
- volumeHigh: 'mdi-volume-high',
4852
- volumeMedium: 'mdi-volume-medium',
4853
- volumeLow: 'mdi-volume-low',
4854
- volumeOff: 'mdi-volume-variant-off'
4855
- };
4856
- const mdi = {
4857
- // Not using mergeProps here, functional components merge props by default (?)
4858
- component: props => vue.h(VClassIcon, {
4859
- ...props,
4860
- class: 'mdi'
4861
- })
4862
- };
4786
+ // Utilities
4863
4787
 
4864
4788
  // Types
4865
4789
 
@@ -4942,37 +4866,6 @@
4942
4866
  };
4943
4867
  }
4944
4868
  });
4945
- function genDefaults$1() {
4946
- return {
4947
- svg: {
4948
- component: VSvgIcon
4949
- },
4950
- class: {
4951
- component: VClassIcon
4952
- }
4953
- };
4954
- }
4955
-
4956
- // Composables
4957
- function createIcons(options) {
4958
- const sets = genDefaults$1();
4959
- const defaultSet = options?.defaultSet ?? 'mdi';
4960
- if (defaultSet === 'mdi' && !sets.mdi) {
4961
- sets.mdi = mdi;
4962
- }
4963
- return mergeDeep({
4964
- defaultSet,
4965
- sets,
4966
- aliases: {
4967
- ...aliases,
4968
- /* eslint-disable max-len */
4969
- vuetify: ['M8.2241 14.2009L12 21L22 3H14.4459L8.2241 14.2009Z', ['M7.26303 12.4733L7.00113 12L2 3H12.5261C12.5261 3 12.5261 3 12.5261 3L7.26303 12.4733Z', 0.6]],
4970
- 'vuetify-outline': 'svg:M7.26 12.47 12.53 3H2L7.26 12.47ZM14.45 3 8.22 14.2 12 21 22 3H14.45ZM18.6 5 12 16.88 10.51 14.2 15.62 5ZM7.26 8.35 5.4 5H9.13L7.26 8.35Z',
4971
- 'vuetify-play': ['m6.376 13.184-4.11-7.192C1.505 4.66 2.467 3 4.003 3h8.532l-.953 1.576-.006.01-.396.677c-.429.732-.214 1.507.194 2.015.404.503 1.092.878 1.869.806a3.72 3.72 0 0 1 1.005.022c.276.053.434.143.523.237.138.146.38.635-.25 2.09-.893 1.63-1.553 1.722-1.847 1.677-.213-.033-.468-.158-.756-.406a4.95 4.95 0 0 1-.8-.927c-.39-.564-1.04-.84-1.66-.846-.625-.006-1.316.27-1.693.921l-.478.826-.911 1.506Z', ['M9.093 11.552c.046-.079.144-.15.32-.148a.53.53 0 0 1 .43.207c.285.414.636.847 1.046 1.2.405.35.914.662 1.516.754 1.334.205 2.502-.698 3.48-2.495l.014-.028.013-.03c.687-1.574.774-2.852-.005-3.675-.37-.391-.861-.586-1.333-.676a5.243 5.243 0 0 0-1.447-.044c-.173.016-.393-.073-.54-.257-.145-.18-.127-.316-.082-.392l.393-.672L14.287 3h5.71c1.536 0 2.499 1.659 1.737 2.992l-7.997 13.996c-.768 1.344-2.706 1.344-3.473 0l-3.037-5.314 1.377-2.278.004-.006.004-.007.481-.831Z', 0.6]]
4972
- /* eslint-enable max-len */
4973
- }
4974
- }, options);
4975
- }
4976
4869
  const useIcon = props => {
4977
4870
  const icons = vue.inject(IconSymbol);
4978
4871
  if (!icons) throw new Error('Missing Vuetify Icons provide!');
@@ -7922,7 +7815,7 @@
7922
7815
  // Types
7923
7816
 
7924
7817
  const GoToSymbol = Symbol.for('vuetify:goto');
7925
- function genDefaults() {
7818
+ function genDefaults$1() {
7926
7819
  return {
7927
7820
  container: undefined,
7928
7821
  duration: 300,
@@ -7951,12 +7844,12 @@
7951
7844
  function createGoTo(options, locale) {
7952
7845
  return {
7953
7846
  rtl: locale.isRtl,
7954
- options: mergeDeep(genDefaults(), options)
7847
+ options: mergeDeep(genDefaults$1(), options)
7955
7848
  };
7956
7849
  }
7957
7850
  async function scrollTo(_target, _options, horizontal, goTo) {
7958
7851
  const property = horizontal ? 'scrollLeft' : 'scrollTop';
7959
- const options = mergeDeep(goTo?.options ?? genDefaults(), _options);
7852
+ const options = mergeDeep(goTo?.options ?? genDefaults$1(), _options);
7960
7853
  const rtl = goTo?.rtl.value;
7961
7854
  const target = (typeof _target === 'number' ? _target : getTarget$1(_target)) ?? 0;
7962
7855
  const container = options.container === 'parent' && target instanceof HTMLElement ? target.parentElement : getContainer(options.container);
@@ -12946,7 +12839,7 @@
12946
12839
  const start = performance.now();
12947
12840
  offsets[0] = 0;
12948
12841
  const length = items.value.length;
12949
- for (let i = 1; i <= length - 1; i++) {
12842
+ for (let i = 1; i <= length; i++) {
12950
12843
  offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
12951
12844
  }
12952
12845
  updateTime.value = Math.max(updateTime.value, performance.now() - start);
@@ -12981,7 +12874,7 @@
12981
12874
  }
12982
12875
  }
12983
12876
  function calculateOffset(index) {
12984
- index = clamp(index, 0, items.value.length - 1);
12877
+ index = clamp(index, 0, items.value.length);
12985
12878
  const whole = Math.floor(index);
12986
12879
  const fraction = index % 1;
12987
12880
  const next = whole + 1;
@@ -13986,10 +13879,7 @@
13986
13879
  ...omit(makeVTextFieldProps({
13987
13880
  modelValue: null,
13988
13881
  role: 'combobox'
13989
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
13990
- ...makeTransitionProps({
13991
- transition: false
13992
- })
13882
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
13993
13883
  }, 'VAutocomplete');
13994
13884
  const VAutocomplete = genericComponent()({
13995
13885
  name: 'VAutocomplete',
@@ -14014,6 +13904,7 @@
14014
13904
  const vMenuRef = vue.ref();
14015
13905
  const vVirtualScrollRef = vue.ref();
14016
13906
  const selectionIndex = vue.shallowRef(-1);
13907
+ const _searchLock = vue.shallowRef(null);
14017
13908
  const {
14018
13909
  items,
14019
13910
  transformIn,
@@ -14035,9 +13926,9 @@
14035
13926
  const {
14036
13927
  filteredItems,
14037
13928
  getMatches
14038
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
13929
+ } = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
14039
13930
  const displayItems = vue.computed(() => {
14040
- if (props.hideSelected) {
13931
+ if (props.hideSelected && _searchLock.value === null) {
14041
13932
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14042
13933
  }
14043
13934
  return filteredItems.value;
@@ -14168,6 +14059,7 @@
14168
14059
  isPristine.value = true;
14169
14060
  vTextFieldRef.value?.focus();
14170
14061
  }
14062
+ _searchLock.value = null;
14171
14063
  }
14172
14064
  function onFocusin(e) {
14173
14065
  isFocused.value = true;
@@ -14203,6 +14095,7 @@
14203
14095
  } else {
14204
14096
  const add = set !== false;
14205
14097
  model.value = add ? [item] : [];
14098
+ _searchLock.value = isPristine.value ? '' : search.value ?? '';
14206
14099
  search.value = add && !hasSelectionSlot.value ? item.title : '';
14207
14100
 
14208
14101
  // watch for search watcher to trigger
@@ -14222,6 +14115,9 @@
14222
14115
  } else {
14223
14116
  if (!props.multiple && search.value == null) model.value = [];
14224
14117
  menu.value = false;
14118
+ if (!isPristine.value && search.value) {
14119
+ _searchLock.value = search.value;
14120
+ }
14225
14121
  search.value = '';
14226
14122
  selectionIndex.value = -1;
14227
14123
  }
@@ -14231,13 +14127,14 @@
14231
14127
  if (val) menu.value = true;
14232
14128
  isPristine.value = !val;
14233
14129
  });
14234
- vue.watch(menu, () => {
14235
- if (!props.hideSelected && menu.value && model.value.length) {
14130
+ vue.watch(menu, val => {
14131
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
14236
14132
  const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
14237
14133
  IN_BROWSER && window.requestAnimationFrame(() => {
14238
14134
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
14239
14135
  });
14240
14136
  }
14137
+ if (val) _searchLock.value = null;
14241
14138
  });
14242
14139
  vue.watch(items, (newVal, oldVal) => {
14243
14140
  if (menu.value) return;
@@ -14288,7 +14185,6 @@
14288
14185
  "maxHeight": 310,
14289
14186
  "openOnClick": false,
14290
14187
  "closeOnContentClick": false,
14291
- "transition": props.transition,
14292
14188
  "onAfterEnter": onAfterEnter,
14293
14189
  "onAfterLeave": onAfterLeave
14294
14190
  }, props.menuProps), {
@@ -19316,10 +19212,7 @@
19316
19212
  ...omit(makeVTextFieldProps({
19317
19213
  modelValue: null,
19318
19214
  role: 'combobox'
19319
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
19320
- ...makeTransitionProps({
19321
- transition: false
19322
- })
19215
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
19323
19216
  }, 'VCombobox');
19324
19217
  const VCombobox = genericComponent()({
19325
19218
  name: 'VCombobox',
@@ -19363,6 +19256,7 @@
19363
19256
  const hasChips = vue.computed(() => !!(props.chips || slots.chip));
19364
19257
  const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
19365
19258
  const _search = vue.shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
19259
+ const _searchLock = vue.shallowRef(null);
19366
19260
  const search = vue.computed({
19367
19261
  get: () => {
19368
19262
  return _search.value;
@@ -19397,9 +19291,9 @@
19397
19291
  const {
19398
19292
  filteredItems,
19399
19293
  getMatches
19400
- } = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
19294
+ } = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
19401
19295
  const displayItems = vue.computed(() => {
19402
- if (props.hideSelected) {
19296
+ if (props.hideSelected && _searchLock.value === null) {
19403
19297
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
19404
19298
  }
19405
19299
  return filteredItems.value;
@@ -19480,22 +19374,19 @@
19480
19374
  if (['Escape'].includes(e.key)) {
19481
19375
  menu.value = false;
19482
19376
  }
19483
- if (['Enter', 'Escape', 'Tab'].includes(e.key)) {
19484
- if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19485
- let {
19486
- value
19487
- } = _ref2;
19488
- return value === displayItems.value[0].value;
19489
- })) {
19490
- select(filteredItems.value[0]);
19491
- }
19492
- isPristine.value = true;
19377
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19378
+ let {
19379
+ value
19380
+ } = _ref2;
19381
+ return value === displayItems.value[0].value;
19382
+ })) {
19383
+ select(filteredItems.value[0]);
19493
19384
  }
19494
19385
  if (e.key === 'ArrowDown' && highlightFirst.value) {
19495
19386
  listRef.value?.focus('next');
19496
19387
  }
19497
19388
  if (e.key === 'Enter' && search.value) {
19498
- select(transformItem$3(props, search.value));
19389
+ select(transformItem$3(props, search.value), true, true);
19499
19390
  if (hasSelectionSlot.value) _search.value = '';
19500
19391
  }
19501
19392
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -19543,10 +19434,12 @@
19543
19434
  isPristine.value = true;
19544
19435
  vTextFieldRef.value?.focus();
19545
19436
  }
19437
+ _searchLock.value = null;
19546
19438
  }
19547
19439
  /** @param set - null means toggle */
19548
19440
  function select(item) {
19549
19441
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19442
+ let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19550
19443
  if (!item || item.props.disabled) return;
19551
19444
  if (props.multiple) {
19552
19445
  const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
@@ -19564,11 +19457,14 @@
19564
19457
  } else {
19565
19458
  const add = set !== false;
19566
19459
  model.value = add ? [item] : [];
19460
+ if ((!isPristine.value || props.alwaysFilter) && _search.value) {
19461
+ _searchLock.value = _search.value;
19462
+ }
19567
19463
  _search.value = add && !hasSelectionSlot.value ? item.title : '';
19568
19464
 
19569
19465
  // watch for search watcher to trigger
19570
19466
  vue.nextTick(() => {
19571
- menu.value = false;
19467
+ menu.value = keepMenu;
19572
19468
  isPristine.value = true;
19573
19469
  });
19574
19470
  }
@@ -19607,13 +19503,14 @@
19607
19503
  }
19608
19504
  }
19609
19505
  });
19610
- vue.watch(menu, () => {
19611
- if (!props.hideSelected && menu.value && model.value.length) {
19506
+ vue.watch(menu, val => {
19507
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
19612
19508
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
19613
19509
  IN_BROWSER && window.requestAnimationFrame(() => {
19614
19510
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
19615
19511
  });
19616
19512
  }
19513
+ if (val) _searchLock.value = null;
19617
19514
  });
19618
19515
  vue.watch(items, (newVal, oldVal) => {
19619
19516
  if (menu.value) return;
@@ -19664,7 +19561,6 @@
19664
19561
  "maxHeight": 310,
19665
19562
  "openOnClick": false,
19666
19563
  "closeOnContentClick": false,
19667
- "transition": props.transition,
19668
19564
  "onAfterEnter": onAfterEnter,
19669
19565
  "onAfterLeave": onAfterLeave
19670
19566
  }, props.menuProps), {
@@ -21211,6 +21107,7 @@
21211
21107
  // Types
21212
21108
 
21213
21109
  const makeVDataTableFooterProps = propsFactory({
21110
+ color: String,
21214
21111
  prevIcon: {
21215
21112
  type: IconValue,
21216
21113
  default: '$prev'
@@ -21313,6 +21210,7 @@
21313
21210
  "aria-label": t(props.itemsPerPageText)
21314
21211
  }, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
21315
21212
  "items": itemsPerPageOptions.value,
21213
+ "itemColor": props.color,
21316
21214
  "modelValue": itemsPerPage.value,
21317
21215
  "onUpdate:modelValue": v => setItemsPerPage(Number(v)),
21318
21216
  "density": "compact",
@@ -21335,7 +21233,7 @@
21335
21233
  "showFirstLastPage": true,
21336
21234
  "totalVisible": props.showCurrentPage ? 1 : 0,
21337
21235
  "variant": "plain"
21338
- }, paginationProps), null)])]);
21236
+ }, omit(paginationProps, ['color'])), null)])]);
21339
21237
  });
21340
21238
  return {};
21341
21239
  }
@@ -21846,6 +21744,7 @@
21846
21744
  if (isEmpty) return '';
21847
21745
  if (column.key === 'data-table-select') {
21848
21746
  return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && vue.createVNode(VCheckboxBtn, {
21747
+ "color": props.color,
21849
21748
  "density": props.density,
21850
21749
  "modelValue": allSelected.value,
21851
21750
  "indeterminate": someSelected.value && !allSelected.value,
@@ -21870,11 +21769,6 @@
21870
21769
  const displayItems = vue.computed(() => {
21871
21770
  return columns.value.filter(column => column?.sortable && !props.disableSort);
21872
21771
  });
21873
- const appendIcon = vue.computed(() => {
21874
- const showSelectColumn = columns.value.find(column => column.key === 'data-table-select');
21875
- if (showSelectColumn == null) return;
21876
- return allSelected.value ? '$checkboxOn' : someSelected.value ? '$checkboxIndeterminate' : '$checkboxOff';
21877
- });
21878
21772
  return vue.createVNode(VDataTableColumn, vue.mergeProps({
21879
21773
  "tag": "th",
21880
21774
  "class": [...headerCellClasses.value],
@@ -21884,6 +21778,7 @@
21884
21778
  "class": "v-data-table-header__content"
21885
21779
  }, [vue.createVNode(VSelect, {
21886
21780
  "chips": true,
21781
+ "color": props.color,
21887
21782
  "class": "v-data-table__td-sort-select",
21888
21783
  "clearable": true,
21889
21784
  "density": "default",
@@ -21892,9 +21787,15 @@
21892
21787
  "multiple": props.multiSort,
21893
21788
  "variant": "underlined",
21894
21789
  "onClick:clear": () => sortBy.value = [],
21895
- "appendIcon": appendIcon.value,
21896
21790
  "onClick:append": () => selectAll(!allSelected.value)
21897
21791
  }, {
21792
+ append: () => vue.createVNode(VCheckboxBtn, {
21793
+ "color": props.color,
21794
+ "density": "compact",
21795
+ "modelValue": allSelected.value,
21796
+ "indeterminate": someSelected.value && !allSelected.value,
21797
+ "onUpdate:modelValue": selectAll
21798
+ }, null),
21898
21799
  chip: props => vue.createVNode(VChip, {
21899
21800
  "onClick": props.item.raw?.sortable ? () => toggleSort(props.item.raw) : undefined,
21900
21801
  "onMousedown": e => {
@@ -21924,7 +21825,7 @@
21924
21825
  "name": "v-data-table-progress",
21925
21826
  "absolute": true,
21926
21827
  "active": true,
21927
- "color": typeof props.loading === 'boolean' ? undefined : props.loading,
21828
+ "color": typeof props.loading === 'boolean' || props.loading === 'true' ? props.color : props.loading,
21928
21829
  "indeterminate": true
21929
21830
  }, {
21930
21831
  default: slots.loader
@@ -22031,6 +21932,7 @@
22031
21932
  // Types
22032
21933
 
22033
21934
  const makeVDataTableRowProps = propsFactory({
21935
+ color: String,
22034
21936
  index: Number,
22035
21937
  item: Object,
22036
21938
  cellProps: [Object, Function],
@@ -22148,11 +22050,13 @@
22148
22050
  return slots['item.data-table-select']?.({
22149
22051
  ...slotProps,
22150
22052
  props: {
22053
+ color: props.color,
22151
22054
  disabled: !item.selectable,
22152
22055
  modelValue: isSelected([item]),
22153
22056
  onClick: vue.withModifiers(() => toggleSelect(item), ['stop'])
22154
22057
  }
22155
22058
  }) ?? vue.createVNode(VCheckboxBtn, {
22059
+ "color": props.color,
22156
22060
  "disabled": !item.selectable,
22157
22061
  "density": props.density,
22158
22062
  "modelValue": isSelected([item]),
@@ -22191,6 +22095,7 @@
22191
22095
  // Types
22192
22096
 
22193
22097
  const makeVDataTableRowsProps = propsFactory({
22098
+ color: String,
22194
22099
  loading: [Boolean, String],
22195
22100
  loadingText: {
22196
22101
  type: String,
@@ -22306,6 +22211,7 @@
22306
22211
  } : undefined,
22307
22212
  index,
22308
22213
  item,
22214
+ color: props.color,
22309
22215
  cellProps: props.cellProps,
22310
22216
  collapseIcon: props.collapseIcon,
22311
22217
  expandIcon: props.expandIcon,
@@ -26701,12 +26607,17 @@
26701
26607
  }
26702
26608
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26703
26609
  const _inputText = vue.shallowRef(null);
26704
- vue.watchEffect(() => {
26705
- if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
26610
+ const _lastParsedValue = vue.shallowRef(null);
26611
+ vue.watch(model, val => {
26612
+ if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === val) ; else if (val == null) {
26706
26613
  _inputText.value = null;
26707
- } else if (!isNaN(model.value)) {
26708
- _inputText.value = correctPrecision(model.value);
26614
+ _lastParsedValue.value = null;
26615
+ } else if (!isNaN(val)) {
26616
+ _inputText.value = correctPrecision(val);
26617
+ _lastParsedValue.value = Number(_inputText.value.replace(decimalSeparator.value, '.'));
26709
26618
  }
26619
+ }, {
26620
+ immediate: true
26710
26621
  });
26711
26622
  const inputText = vue.computed({
26712
26623
  get: () => _inputText.value,
@@ -26714,15 +26625,24 @@
26714
26625
  if (val === null || val === '') {
26715
26626
  model.value = null;
26716
26627
  _inputText.value = null;
26628
+ _lastParsedValue.value = null;
26717
26629
  return;
26718
26630
  }
26719
26631
  const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
26720
- if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
26721
- model.value = parsedValue;
26632
+ if (!isNaN(parsedValue)) {
26722
26633
  _inputText.value = val;
26634
+ _lastParsedValue.value = parsedValue;
26635
+ if (parsedValue <= props.max && parsedValue >= props.min) {
26636
+ model.value = parsedValue;
26637
+ }
26723
26638
  }
26724
26639
  }
26725
26640
  });
26641
+ const isOutOfRange = vue.computed(() => {
26642
+ if (_lastParsedValue.value === null) return false;
26643
+ const numberFromText = Number(_inputText.value);
26644
+ return numberFromText !== clamp(numberFromText, props.min, props.max);
26645
+ });
26726
26646
  const canIncrease = vue.computed(() => {
26727
26647
  if (controlsDisabled.value) return false;
26728
26648
  return (model.value ?? 0) + props.step <= props.max;
@@ -26978,6 +26898,7 @@
26978
26898
  "focused": isFocused.value,
26979
26899
  "onUpdate:focused": $event => isFocused.value = $event,
26980
26900
  "validationValue": model.value,
26901
+ "error": isOutOfRange.value || undefined,
26981
26902
  "onBeforeinput": onBeforeinput,
26982
26903
  "onFocus": onFocus,
26983
26904
  "onBlur": onBlur,
@@ -29777,7 +29698,7 @@
29777
29698
  "role": "tablist",
29778
29699
  "symbol": VTabsSymbol
29779
29700
  }, scopeId, attrs), {
29780
- default: () => [slots.default?.() ?? items.value.map(item => slots.tab?.({
29701
+ default: slots.default ?? (() => items.value.map(item => slots.tab?.({
29781
29702
  item
29782
29703
  }) ?? vue.createVNode(VTab, vue.mergeProps(item, {
29783
29704
  "key": item.text,
@@ -29787,7 +29708,9 @@
29787
29708
  default: slots[`tab.${item.value}`] ? () => slots[`tab.${item.value}`]?.({
29788
29709
  item
29789
29710
  }) : undefined
29790
- }))]
29711
+ }))),
29712
+ prev: slots.prev,
29713
+ next: slots.next
29791
29714
  }), hasWindow && vue.createVNode(VTabsWindow, vue.mergeProps({
29792
29715
  "modelValue": model.value,
29793
29716
  "onUpdate:modelValue": $event => model.value = $event,
@@ -29876,6 +29799,10 @@
29876
29799
  const vFieldRef = vue.ref();
29877
29800
  const controlHeight = vue.shallowRef('');
29878
29801
  const textareaRef = vue.ref();
29802
+ const scrollbarWidth = vue.ref(0);
29803
+ const {
29804
+ platform
29805
+ } = useDisplay();
29879
29806
  const autocomplete = useAutocomplete(props);
29880
29807
  const isActive = vue.computed(() => props.persistentPlaceholder || isFocused.value || props.active);
29881
29808
  function onFocus() {
@@ -29920,6 +29847,18 @@
29920
29847
  if (!props.autoGrow) rows.value = Number(props.rows);
29921
29848
  });
29922
29849
  function calculateInputHeight() {
29850
+ vue.nextTick(() => {
29851
+ if (!textareaRef.value) return;
29852
+ if (platform.value.firefox) {
29853
+ scrollbarWidth.value = 12;
29854
+ return;
29855
+ }
29856
+ const {
29857
+ offsetWidth,
29858
+ clientWidth
29859
+ } = textareaRef.value;
29860
+ scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
29861
+ });
29923
29862
  if (!props.autoGrow) return;
29924
29863
  vue.nextTick(() => {
29925
29864
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -29980,7 +29919,9 @@
29980
29919
  'v-textarea--no-resize': props.noResize || props.autoGrow,
29981
29920
  'v-input--plain-underlined': isPlainOrUnderlined.value
29982
29921
  }, props.class],
29983
- "style": props.style
29922
+ "style": [{
29923
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
29924
+ }, props.style]
29984
29925
  }, rootAttrs, inputProps, {
29985
29926
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
29986
29927
  "focused": isFocused.value
@@ -31499,6 +31440,11 @@
31499
31440
  openAll: Boolean,
31500
31441
  indentLines: [Boolean, String],
31501
31442
  search: String,
31443
+ hideNoData: Boolean,
31444
+ noDataText: {
31445
+ type: String,
31446
+ default: '$vuetify.noDataText'
31447
+ },
31502
31448
  ...makeFilterProps({
31503
31449
  filterKeys: ['title']
31504
31450
  }),
@@ -31526,6 +31472,9 @@
31526
31472
  slots,
31527
31473
  emit
31528
31474
  } = _ref;
31475
+ const {
31476
+ t
31477
+ } = useLocale();
31529
31478
  const {
31530
31479
  items
31531
31480
  } = useListItems(props);
@@ -31619,7 +31568,10 @@
31619
31568
  "selected": selected.value,
31620
31569
  "onUpdate:selected": $event => selected.value = $event
31621
31570
  }), {
31622
- default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
31571
+ default: () => [visibleIds.value?.size === 0 && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
31572
+ "key": "no-data",
31573
+ "title": t(props.noDataText)
31574
+ }, null)), vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
31623
31575
  "density": props.density,
31624
31576
  "returnObject": props.returnObject,
31625
31577
  "items": items.value,
@@ -34674,7 +34626,7 @@
34674
34626
  ...omit(makeVDatePickerProps({
34675
34627
  hideHeader: true,
34676
34628
  showAdjacentMonths: true
34677
- }), ['active', 'location', 'rounded'])
34629
+ }), ['active', 'location', 'rounded', 'height', 'minHeight', 'maxHeight'])
34678
34630
  }, 'VDateInput');
34679
34631
  const VDateInput = genericComponent()({
34680
34632
  name: 'VDateInput',
@@ -34816,7 +34768,7 @@
34816
34768
  }
34817
34769
  useRender(() => {
34818
34770
  const confirmEditProps = VConfirmEdit.filterProps(props);
34819
- const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
34771
+ const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'bgColor', 'location', 'rounded', 'maxWidth', 'minWidth', 'width']));
34820
34772
  const datePickerSlots = pick(slots, ['title', 'header', 'day', 'month', 'year']);
34821
34773
  const textFieldProps = VTextField.filterProps(omit(props, ['placeholder']));
34822
34774
  return vue.createVNode(VTextField, vue.mergeProps({
@@ -37908,6 +37860,118 @@
37908
37860
  Touch: Touch
37909
37861
  });
37910
37862
 
37863
+ // Composables
37864
+
37865
+ // Types
37866
+
37867
+ const aliases = {
37868
+ collapse: 'mdi-chevron-up',
37869
+ complete: 'mdi-check',
37870
+ cancel: 'mdi-close-circle',
37871
+ close: 'mdi-close',
37872
+ delete: 'mdi-close-circle',
37873
+ // delete (e.g. v-chip close)
37874
+ clear: 'mdi-close-circle',
37875
+ success: 'mdi-check-circle',
37876
+ info: 'mdi-information',
37877
+ warning: 'mdi-alert-circle',
37878
+ error: 'mdi-close-circle',
37879
+ prev: 'mdi-chevron-left',
37880
+ next: 'mdi-chevron-right',
37881
+ checkboxOn: 'mdi-checkbox-marked',
37882
+ checkboxOff: 'mdi-checkbox-blank-outline',
37883
+ checkboxIndeterminate: 'mdi-minus-box',
37884
+ delimiter: 'mdi-circle',
37885
+ // for carousel
37886
+ sortAsc: 'mdi-arrow-up',
37887
+ sortDesc: 'mdi-arrow-down',
37888
+ expand: 'mdi-chevron-down',
37889
+ menu: 'mdi-menu',
37890
+ subgroup: 'mdi-menu-down',
37891
+ dropdown: 'mdi-menu-down',
37892
+ radioOn: 'mdi-radiobox-marked',
37893
+ radioOff: 'mdi-radiobox-blank',
37894
+ edit: 'mdi-pencil',
37895
+ ratingEmpty: 'mdi-star-outline',
37896
+ ratingFull: 'mdi-star',
37897
+ ratingHalf: 'mdi-star-half-full',
37898
+ loading: 'mdi-cached',
37899
+ first: 'mdi-page-first',
37900
+ last: 'mdi-page-last',
37901
+ unfold: 'mdi-unfold-more-horizontal',
37902
+ file: 'mdi-paperclip',
37903
+ plus: 'mdi-plus',
37904
+ minus: 'mdi-minus',
37905
+ calendar: 'mdi-calendar',
37906
+ treeviewCollapse: 'mdi-menu-down',
37907
+ treeviewExpand: 'mdi-menu-right',
37908
+ tableGroupCollapse: 'mdi-chevron-down',
37909
+ tableGroupExpand: 'mdi-chevron-right',
37910
+ eyeDropper: 'mdi-eyedropper',
37911
+ upload: 'mdi-cloud-upload',
37912
+ color: 'mdi-palette',
37913
+ command: 'mdi-apple-keyboard-command',
37914
+ ctrl: 'mdi-apple-keyboard-control',
37915
+ space: 'mdi-keyboard-space',
37916
+ shift: 'mdi-apple-keyboard-shift',
37917
+ alt: 'mdi-apple-keyboard-option',
37918
+ enter: 'mdi-keyboard-return',
37919
+ arrowup: 'mdi-arrow-up',
37920
+ arrowdown: 'mdi-arrow-down',
37921
+ arrowleft: 'mdi-arrow-left',
37922
+ arrowright: 'mdi-arrow-right',
37923
+ backspace: 'mdi-backspace',
37924
+ play: 'mdi-play',
37925
+ pause: 'mdi-pause',
37926
+ fullscreen: 'mdi-fullscreen',
37927
+ fullscreenExit: 'mdi-fullscreen-exit',
37928
+ volumeHigh: 'mdi-volume-high',
37929
+ volumeMedium: 'mdi-volume-medium',
37930
+ volumeLow: 'mdi-volume-low',
37931
+ volumeOff: 'mdi-volume-variant-off'
37932
+ };
37933
+ const mdi = {
37934
+ // Not using mergeProps here, functional components merge props by default (?)
37935
+ component: props => vue.h(VClassIcon, {
37936
+ ...props,
37937
+ class: 'mdi'
37938
+ })
37939
+ };
37940
+
37941
+ // Composables
37942
+
37943
+ // Types
37944
+
37945
+ function genDefaults() {
37946
+ return {
37947
+ svg: {
37948
+ component: VSvgIcon
37949
+ },
37950
+ class: {
37951
+ component: VClassIcon
37952
+ }
37953
+ };
37954
+ }
37955
+ function createIcons(options) {
37956
+ const sets = genDefaults();
37957
+ const defaultSet = options?.defaultSet ?? 'mdi';
37958
+ if (defaultSet === 'mdi' && !sets.mdi) {
37959
+ sets.mdi = mdi;
37960
+ }
37961
+ return mergeDeep({
37962
+ defaultSet,
37963
+ sets,
37964
+ aliases: {
37965
+ ...aliases,
37966
+ /* eslint-disable max-len */
37967
+ vuetify: ['M8.2241 14.2009L12 21L22 3H14.4459L8.2241 14.2009Z', ['M7.26303 12.4733L7.00113 12L2 3H12.5261C12.5261 3 12.5261 3 12.5261 3L7.26303 12.4733Z', 0.6]],
37968
+ 'vuetify-outline': 'svg:M7.26 12.47 12.53 3H2L7.26 12.47ZM14.45 3 8.22 14.2 12 21 22 3H14.45ZM18.6 5 12 16.88 10.51 14.2 15.62 5ZM7.26 8.35 5.4 5H9.13L7.26 8.35Z',
37969
+ 'vuetify-play': ['m6.376 13.184-4.11-7.192C1.505 4.66 2.467 3 4.003 3h8.532l-.953 1.576-.006.01-.396.677c-.429.732-.214 1.507.194 2.015.404.503 1.092.878 1.869.806a3.72 3.72 0 0 1 1.005.022c.276.053.434.143.523.237.138.146.38.635-.25 2.09-.893 1.63-1.553 1.722-1.847 1.677-.213-.033-.468-.158-.756-.406a4.95 4.95 0 0 1-.8-.927c-.39-.564-1.04-.84-1.66-.846-.625-.006-1.316.27-1.693.921l-.478.826-.911 1.506Z', ['M9.093 11.552c.046-.079.144-.15.32-.148a.53.53 0 0 1 .43.207c.285.414.636.847 1.046 1.2.405.35.914.662 1.516.754 1.334.205 2.502-.698 3.48-2.495l.014-.028.013-.03c.687-1.574.774-2.852-.005-3.675-.37-.391-.861-.586-1.333-.676a5.243 5.243 0 0 0-1.447-.044c-.173.016-.393-.073-.54-.257-.145-.18-.127-.316-.082-.392l.393-.672L14.287 3h5.71c1.536 0 2.499 1.659 1.737 2.992l-7.997 13.996c-.768 1.344-2.706 1.344-3.473 0l-3.037-5.314 1.377-2.278.004-.006.004-.007.481-.831Z', 0.6]]
37970
+ /* eslint-enable max-len */
37971
+ }
37972
+ }, options);
37973
+ }
37974
+
37911
37975
  // Composables
37912
37976
  function createVuetify$1() {
37913
37977
  let vuetify = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -38007,7 +38071,7 @@
38007
38071
  };
38008
38072
  });
38009
38073
  }
38010
- const version$1 = "3.10.5-dev.2025-10-07";
38074
+ const version$1 = "3.10.5-dev.2025-10-09";
38011
38075
  createVuetify$1.version = version$1;
38012
38076
 
38013
38077
  // Vue's inject() can only be used in setup
@@ -38305,7 +38369,7 @@
38305
38369
 
38306
38370
  /* eslint-disable local-rules/sort-imports */
38307
38371
 
38308
- const version = "3.10.5-dev.2025-10-07";
38372
+ const version = "3.10.5-dev.2025-10-09";
38309
38373
 
38310
38374
  /* eslint-disable local-rules/sort-imports */
38311
38375