@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
package/dist/vuetify.js CHANGED
@@ -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
  */
@@ -1686,6 +1686,8 @@
1686
1686
  vm.render = render;
1687
1687
  }
1688
1688
 
1689
+ // Utilities
1690
+
1689
1691
  // Types
1690
1692
 
1691
1693
  const IconValue = [String, Function, Object, Array];
@@ -1767,37 +1769,6 @@
1767
1769
  };
1768
1770
  }
1769
1771
  });
1770
- function genDefaults$3() {
1771
- return {
1772
- svg: {
1773
- component: VSvgIcon
1774
- },
1775
- class: {
1776
- component: VClassIcon
1777
- }
1778
- };
1779
- }
1780
-
1781
- // Composables
1782
- function createIcons(options) {
1783
- const sets = genDefaults$3();
1784
- const defaultSet = options?.defaultSet ?? 'mdi';
1785
- if (defaultSet === 'mdi' && !sets.mdi) {
1786
- sets.mdi = mdi;
1787
- }
1788
- return mergeDeep({
1789
- defaultSet,
1790
- sets,
1791
- aliases: {
1792
- ...aliases,
1793
- /* eslint-disable max-len */
1794
- 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]],
1795
- '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',
1796
- '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]]
1797
- /* eslint-enable max-len */
1798
- }
1799
- }, options);
1800
- }
1801
1772
  const useIcon = props => {
1802
1773
  const icons = vue.inject(IconSymbol);
1803
1774
  if (!icons) throw new Error('Missing Vuetify Icons provide!');
@@ -2895,7 +2866,7 @@
2895
2866
  vue.provide(LocaleSymbol, data);
2896
2867
  return data;
2897
2868
  }
2898
- function genDefaults$2() {
2869
+ function genDefaults$3() {
2899
2870
  return {
2900
2871
  af: false,
2901
2872
  ar: true,
@@ -2942,7 +2913,7 @@
2942
2913
  };
2943
2914
  }
2944
2915
  function createRtl(i18n, options) {
2945
- const rtl = vue.ref(options?.rtl ?? genDefaults$2());
2916
+ const rtl = vue.ref(options?.rtl ?? genDefaults$3());
2946
2917
  const isRtl = vue.computed(() => rtl.value[i18n.current.value] ?? false);
2947
2918
  return {
2948
2919
  isRtl,
@@ -2975,7 +2946,7 @@
2975
2946
  const makeThemeProps = propsFactory({
2976
2947
  theme: String
2977
2948
  }, 'theme');
2978
- function genDefaults$1() {
2949
+ function genDefaults$2() {
2979
2950
  return {
2980
2951
  defaultTheme: 'light',
2981
2952
  prefix: 'v-',
@@ -3067,8 +3038,8 @@
3067
3038
  };
3068
3039
  }
3069
3040
  function parseThemeOptions() {
3070
- let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : genDefaults$1();
3071
- const defaults = genDefaults$1();
3041
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : genDefaults$2();
3042
+ const defaults = genDefaults$2();
3072
3043
  if (!options) return {
3073
3044
  ...defaults,
3074
3045
  isDisabled: true
@@ -8168,7 +8139,7 @@
8168
8139
  // Types
8169
8140
 
8170
8141
  const GoToSymbol = Symbol.for('vuetify:goto');
8171
- function genDefaults() {
8142
+ function genDefaults$1() {
8172
8143
  return {
8173
8144
  container: undefined,
8174
8145
  duration: 300,
@@ -8197,12 +8168,12 @@
8197
8168
  function createGoTo(options, locale) {
8198
8169
  return {
8199
8170
  rtl: locale.isRtl,
8200
- options: mergeDeep(genDefaults(), options)
8171
+ options: mergeDeep(genDefaults$1(), options)
8201
8172
  };
8202
8173
  }
8203
8174
  async function scrollTo(_target, _options, horizontal, goTo) {
8204
8175
  const property = horizontal ? 'scrollLeft' : 'scrollTop';
8205
- const options = mergeDeep(goTo?.options ?? genDefaults(), _options);
8176
+ const options = mergeDeep(goTo?.options ?? genDefaults$1(), _options);
8206
8177
  const rtl = goTo?.rtl.value;
8207
8178
  const target = (typeof _target === 'number' ? _target : getTarget$1(_target)) ?? 0;
8208
8179
  const container = options.container === 'parent' && target instanceof HTMLElement ? target.parentElement : getContainer(options.container);
@@ -13192,7 +13163,7 @@
13192
13163
  const start = performance.now();
13193
13164
  offsets[0] = 0;
13194
13165
  const length = items.value.length;
13195
- for (let i = 1; i <= length - 1; i++) {
13166
+ for (let i = 1; i <= length; i++) {
13196
13167
  offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
13197
13168
  }
13198
13169
  updateTime.value = Math.max(updateTime.value, performance.now() - start);
@@ -13227,7 +13198,7 @@
13227
13198
  }
13228
13199
  }
13229
13200
  function calculateOffset(index) {
13230
- index = clamp(index, 0, items.value.length - 1);
13201
+ index = clamp(index, 0, items.value.length);
13231
13202
  const whole = Math.floor(index);
13232
13203
  const fraction = index % 1;
13233
13204
  const next = whole + 1;
@@ -14232,10 +14203,7 @@
14232
14203
  ...omit(makeVTextFieldProps({
14233
14204
  modelValue: null,
14234
14205
  role: 'combobox'
14235
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
14236
- ...makeTransitionProps({
14237
- transition: false
14238
- })
14206
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
14239
14207
  }, 'VAutocomplete');
14240
14208
  const VAutocomplete = genericComponent()({
14241
14209
  name: 'VAutocomplete',
@@ -14260,6 +14228,7 @@
14260
14228
  const vMenuRef = vue.ref();
14261
14229
  const vVirtualScrollRef = vue.ref();
14262
14230
  const selectionIndex = vue.shallowRef(-1);
14231
+ const _searchLock = vue.shallowRef(null);
14263
14232
  const {
14264
14233
  items,
14265
14234
  transformIn,
@@ -14281,9 +14250,9 @@
14281
14250
  const {
14282
14251
  filteredItems,
14283
14252
  getMatches
14284
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14253
+ } = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
14285
14254
  const displayItems = vue.computed(() => {
14286
- if (props.hideSelected) {
14255
+ if (props.hideSelected && _searchLock.value === null) {
14287
14256
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14288
14257
  }
14289
14258
  return filteredItems.value;
@@ -14414,6 +14383,7 @@
14414
14383
  isPristine.value = true;
14415
14384
  vTextFieldRef.value?.focus();
14416
14385
  }
14386
+ _searchLock.value = null;
14417
14387
  }
14418
14388
  function onFocusin(e) {
14419
14389
  isFocused.value = true;
@@ -14449,6 +14419,7 @@
14449
14419
  } else {
14450
14420
  const add = set !== false;
14451
14421
  model.value = add ? [item] : [];
14422
+ _searchLock.value = isPristine.value ? '' : search.value ?? '';
14452
14423
  search.value = add && !hasSelectionSlot.value ? item.title : '';
14453
14424
 
14454
14425
  // watch for search watcher to trigger
@@ -14468,6 +14439,9 @@
14468
14439
  } else {
14469
14440
  if (!props.multiple && search.value == null) model.value = [];
14470
14441
  menu.value = false;
14442
+ if (!isPristine.value && search.value) {
14443
+ _searchLock.value = search.value;
14444
+ }
14471
14445
  search.value = '';
14472
14446
  selectionIndex.value = -1;
14473
14447
  }
@@ -14477,13 +14451,14 @@
14477
14451
  if (val) menu.value = true;
14478
14452
  isPristine.value = !val;
14479
14453
  });
14480
- vue.watch(menu, () => {
14481
- if (!props.hideSelected && menu.value && model.value.length) {
14454
+ vue.watch(menu, val => {
14455
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
14482
14456
  const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
14483
14457
  IN_BROWSER && window.requestAnimationFrame(() => {
14484
14458
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
14485
14459
  });
14486
14460
  }
14461
+ if (val) _searchLock.value = null;
14487
14462
  });
14488
14463
  vue.watch(items, (newVal, oldVal) => {
14489
14464
  if (menu.value) return;
@@ -14534,7 +14509,6 @@
14534
14509
  "maxHeight": 310,
14535
14510
  "openOnClick": false,
14536
14511
  "closeOnContentClick": false,
14537
- "transition": props.transition,
14538
14512
  "onAfterEnter": onAfterEnter,
14539
14513
  "onAfterLeave": onAfterLeave
14540
14514
  }, props.menuProps), {
@@ -19553,10 +19527,7 @@
19553
19527
  ...omit(makeVTextFieldProps({
19554
19528
  modelValue: null,
19555
19529
  role: 'combobox'
19556
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
19557
- ...makeTransitionProps({
19558
- transition: false
19559
- })
19530
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
19560
19531
  }, 'VCombobox');
19561
19532
  const VCombobox = genericComponent()({
19562
19533
  name: 'VCombobox',
@@ -19600,6 +19571,7 @@
19600
19571
  const hasChips = vue.computed(() => !!(props.chips || slots.chip));
19601
19572
  const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
19602
19573
  const _search = vue.shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
19574
+ const _searchLock = vue.shallowRef(null);
19603
19575
  const search = vue.computed({
19604
19576
  get: () => {
19605
19577
  return _search.value;
@@ -19634,9 +19606,9 @@
19634
19606
  const {
19635
19607
  filteredItems,
19636
19608
  getMatches
19637
- } = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
19609
+ } = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
19638
19610
  const displayItems = vue.computed(() => {
19639
- if (props.hideSelected) {
19611
+ if (props.hideSelected && _searchLock.value === null) {
19640
19612
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
19641
19613
  }
19642
19614
  return filteredItems.value;
@@ -19717,22 +19689,19 @@
19717
19689
  if (['Escape'].includes(e.key)) {
19718
19690
  menu.value = false;
19719
19691
  }
19720
- if (['Enter', 'Escape', 'Tab'].includes(e.key)) {
19721
- if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19722
- let {
19723
- value
19724
- } = _ref2;
19725
- return value === displayItems.value[0].value;
19726
- })) {
19727
- select(filteredItems.value[0]);
19728
- }
19729
- isPristine.value = true;
19692
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19693
+ let {
19694
+ value
19695
+ } = _ref2;
19696
+ return value === displayItems.value[0].value;
19697
+ })) {
19698
+ select(filteredItems.value[0]);
19730
19699
  }
19731
19700
  if (e.key === 'ArrowDown' && highlightFirst.value) {
19732
19701
  listRef.value?.focus('next');
19733
19702
  }
19734
19703
  if (e.key === 'Enter' && search.value) {
19735
- select(transformItem$3(props, search.value));
19704
+ select(transformItem$3(props, search.value), true, true);
19736
19705
  if (hasSelectionSlot.value) _search.value = '';
19737
19706
  }
19738
19707
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -19780,10 +19749,12 @@
19780
19749
  isPristine.value = true;
19781
19750
  vTextFieldRef.value?.focus();
19782
19751
  }
19752
+ _searchLock.value = null;
19783
19753
  }
19784
19754
  /** @param set - null means toggle */
19785
19755
  function select(item) {
19786
19756
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19757
+ let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19787
19758
  if (!item || item.props.disabled) return;
19788
19759
  if (props.multiple) {
19789
19760
  const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
@@ -19801,11 +19772,14 @@
19801
19772
  } else {
19802
19773
  const add = set !== false;
19803
19774
  model.value = add ? [item] : [];
19775
+ if ((!isPristine.value || props.alwaysFilter) && _search.value) {
19776
+ _searchLock.value = _search.value;
19777
+ }
19804
19778
  _search.value = add && !hasSelectionSlot.value ? item.title : '';
19805
19779
 
19806
19780
  // watch for search watcher to trigger
19807
19781
  vue.nextTick(() => {
19808
- menu.value = false;
19782
+ menu.value = keepMenu;
19809
19783
  isPristine.value = true;
19810
19784
  });
19811
19785
  }
@@ -19844,13 +19818,14 @@
19844
19818
  }
19845
19819
  }
19846
19820
  });
19847
- vue.watch(menu, () => {
19848
- if (!props.hideSelected && menu.value && model.value.length) {
19821
+ vue.watch(menu, val => {
19822
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
19849
19823
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
19850
19824
  IN_BROWSER && window.requestAnimationFrame(() => {
19851
19825
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
19852
19826
  });
19853
19827
  }
19828
+ if (val) _searchLock.value = null;
19854
19829
  });
19855
19830
  vue.watch(items, (newVal, oldVal) => {
19856
19831
  if (menu.value) return;
@@ -19901,7 +19876,6 @@
19901
19876
  "maxHeight": 310,
19902
19877
  "openOnClick": false,
19903
19878
  "closeOnContentClick": false,
19904
- "transition": props.transition,
19905
19879
  "onAfterEnter": onAfterEnter,
19906
19880
  "onAfterLeave": onAfterLeave
19907
19881
  }, props.menuProps), {
@@ -21448,6 +21422,7 @@
21448
21422
  // Types
21449
21423
 
21450
21424
  const makeVDataTableFooterProps = propsFactory({
21425
+ color: String,
21451
21426
  prevIcon: {
21452
21427
  type: IconValue,
21453
21428
  default: '$prev'
@@ -21550,6 +21525,7 @@
21550
21525
  "aria-label": t(props.itemsPerPageText)
21551
21526
  }, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
21552
21527
  "items": itemsPerPageOptions.value,
21528
+ "itemColor": props.color,
21553
21529
  "modelValue": itemsPerPage.value,
21554
21530
  "onUpdate:modelValue": v => setItemsPerPage(Number(v)),
21555
21531
  "density": "compact",
@@ -21572,7 +21548,7 @@
21572
21548
  "showFirstLastPage": true,
21573
21549
  "totalVisible": props.showCurrentPage ? 1 : 0,
21574
21550
  "variant": "plain"
21575
- }, paginationProps), null)])]);
21551
+ }, omit(paginationProps, ['color'])), null)])]);
21576
21552
  });
21577
21553
  return {};
21578
21554
  }
@@ -22083,6 +22059,7 @@
22083
22059
  if (isEmpty) return '';
22084
22060
  if (column.key === 'data-table-select') {
22085
22061
  return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && vue.createVNode(VCheckboxBtn, {
22062
+ "color": props.color,
22086
22063
  "density": props.density,
22087
22064
  "modelValue": allSelected.value,
22088
22065
  "indeterminate": someSelected.value && !allSelected.value,
@@ -22107,11 +22084,6 @@
22107
22084
  const displayItems = vue.computed(() => {
22108
22085
  return columns.value.filter(column => column?.sortable && !props.disableSort);
22109
22086
  });
22110
- const appendIcon = vue.computed(() => {
22111
- const showSelectColumn = columns.value.find(column => column.key === 'data-table-select');
22112
- if (showSelectColumn == null) return;
22113
- return allSelected.value ? '$checkboxOn' : someSelected.value ? '$checkboxIndeterminate' : '$checkboxOff';
22114
- });
22115
22087
  return vue.createVNode(VDataTableColumn, vue.mergeProps({
22116
22088
  "tag": "th",
22117
22089
  "class": [...headerCellClasses.value],
@@ -22121,6 +22093,7 @@
22121
22093
  "class": "v-data-table-header__content"
22122
22094
  }, [vue.createVNode(VSelect, {
22123
22095
  "chips": true,
22096
+ "color": props.color,
22124
22097
  "class": "v-data-table__td-sort-select",
22125
22098
  "clearable": true,
22126
22099
  "density": "default",
@@ -22129,9 +22102,15 @@
22129
22102
  "multiple": props.multiSort,
22130
22103
  "variant": "underlined",
22131
22104
  "onClick:clear": () => sortBy.value = [],
22132
- "appendIcon": appendIcon.value,
22133
22105
  "onClick:append": () => selectAll(!allSelected.value)
22134
22106
  }, {
22107
+ append: () => vue.createVNode(VCheckboxBtn, {
22108
+ "color": props.color,
22109
+ "density": "compact",
22110
+ "modelValue": allSelected.value,
22111
+ "indeterminate": someSelected.value && !allSelected.value,
22112
+ "onUpdate:modelValue": selectAll
22113
+ }, null),
22135
22114
  chip: props => vue.createVNode(VChip, {
22136
22115
  "onClick": props.item.raw?.sortable ? () => toggleSort(props.item.raw) : undefined,
22137
22116
  "onMousedown": e => {
@@ -22161,7 +22140,7 @@
22161
22140
  "name": "v-data-table-progress",
22162
22141
  "absolute": true,
22163
22142
  "active": true,
22164
- "color": typeof props.loading === 'boolean' ? undefined : props.loading,
22143
+ "color": typeof props.loading === 'boolean' || props.loading === 'true' ? props.color : props.loading,
22165
22144
  "indeterminate": true
22166
22145
  }, {
22167
22146
  default: slots.loader
@@ -22268,6 +22247,7 @@
22268
22247
  // Types
22269
22248
 
22270
22249
  const makeVDataTableRowProps = propsFactory({
22250
+ color: String,
22271
22251
  index: Number,
22272
22252
  item: Object,
22273
22253
  cellProps: [Object, Function],
@@ -22385,11 +22365,13 @@
22385
22365
  return slots['item.data-table-select']?.({
22386
22366
  ...slotProps,
22387
22367
  props: {
22368
+ color: props.color,
22388
22369
  disabled: !item.selectable,
22389
22370
  modelValue: isSelected([item]),
22390
22371
  onClick: vue.withModifiers(() => toggleSelect(item), ['stop'])
22391
22372
  }
22392
22373
  }) ?? vue.createVNode(VCheckboxBtn, {
22374
+ "color": props.color,
22393
22375
  "disabled": !item.selectable,
22394
22376
  "density": props.density,
22395
22377
  "modelValue": isSelected([item]),
@@ -22428,6 +22410,7 @@
22428
22410
  // Types
22429
22411
 
22430
22412
  const makeVDataTableRowsProps = propsFactory({
22413
+ color: String,
22431
22414
  loading: [Boolean, String],
22432
22415
  loadingText: {
22433
22416
  type: String,
@@ -22543,6 +22526,7 @@
22543
22526
  } : undefined,
22544
22527
  index,
22545
22528
  item,
22529
+ color: props.color,
22546
22530
  cellProps: props.cellProps,
22547
22531
  collapseIcon: props.collapseIcon,
22548
22532
  expandIcon: props.expandIcon,
@@ -26938,12 +26922,17 @@
26938
26922
  }
26939
26923
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26940
26924
  const _inputText = vue.shallowRef(null);
26941
- vue.watchEffect(() => {
26942
- if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
26925
+ const _lastParsedValue = vue.shallowRef(null);
26926
+ vue.watch(model, val => {
26927
+ if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === val) ; else if (val == null) {
26943
26928
  _inputText.value = null;
26944
- } else if (!isNaN(model.value)) {
26945
- _inputText.value = correctPrecision(model.value);
26929
+ _lastParsedValue.value = null;
26930
+ } else if (!isNaN(val)) {
26931
+ _inputText.value = correctPrecision(val);
26932
+ _lastParsedValue.value = Number(_inputText.value.replace(decimalSeparator.value, '.'));
26946
26933
  }
26934
+ }, {
26935
+ immediate: true
26947
26936
  });
26948
26937
  const inputText = vue.computed({
26949
26938
  get: () => _inputText.value,
@@ -26951,15 +26940,24 @@
26951
26940
  if (val === null || val === '') {
26952
26941
  model.value = null;
26953
26942
  _inputText.value = null;
26943
+ _lastParsedValue.value = null;
26954
26944
  return;
26955
26945
  }
26956
26946
  const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
26957
- if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
26958
- model.value = parsedValue;
26947
+ if (!isNaN(parsedValue)) {
26959
26948
  _inputText.value = val;
26949
+ _lastParsedValue.value = parsedValue;
26950
+ if (parsedValue <= props.max && parsedValue >= props.min) {
26951
+ model.value = parsedValue;
26952
+ }
26960
26953
  }
26961
26954
  }
26962
26955
  });
26956
+ const isOutOfRange = vue.computed(() => {
26957
+ if (_lastParsedValue.value === null) return false;
26958
+ const numberFromText = Number(_inputText.value);
26959
+ return numberFromText !== clamp(numberFromText, props.min, props.max);
26960
+ });
26963
26961
  const canIncrease = vue.computed(() => {
26964
26962
  if (controlsDisabled.value) return false;
26965
26963
  return (model.value ?? 0) + props.step <= props.max;
@@ -27215,6 +27213,7 @@
27215
27213
  "focused": isFocused.value,
27216
27214
  "onUpdate:focused": $event => isFocused.value = $event,
27217
27215
  "validationValue": model.value,
27216
+ "error": isOutOfRange.value || undefined,
27218
27217
  "onBeforeinput": onBeforeinput,
27219
27218
  "onFocus": onFocus,
27220
27219
  "onBlur": onBlur,
@@ -30014,7 +30013,7 @@
30014
30013
  "role": "tablist",
30015
30014
  "symbol": VTabsSymbol
30016
30015
  }, scopeId, attrs), {
30017
- default: () => [slots.default?.() ?? items.value.map(item => slots.tab?.({
30016
+ default: slots.default ?? (() => items.value.map(item => slots.tab?.({
30018
30017
  item
30019
30018
  }) ?? vue.createVNode(VTab, vue.mergeProps(item, {
30020
30019
  "key": item.text,
@@ -30024,7 +30023,9 @@
30024
30023
  default: slots[`tab.${item.value}`] ? () => slots[`tab.${item.value}`]?.({
30025
30024
  item
30026
30025
  }) : undefined
30027
- }))]
30026
+ }))),
30027
+ prev: slots.prev,
30028
+ next: slots.next
30028
30029
  }), hasWindow && vue.createVNode(VTabsWindow, vue.mergeProps({
30029
30030
  "modelValue": model.value,
30030
30031
  "onUpdate:modelValue": $event => model.value = $event,
@@ -30113,6 +30114,10 @@
30113
30114
  const vFieldRef = vue.ref();
30114
30115
  const controlHeight = vue.shallowRef('');
30115
30116
  const textareaRef = vue.ref();
30117
+ const scrollbarWidth = vue.ref(0);
30118
+ const {
30119
+ platform
30120
+ } = useDisplay();
30116
30121
  const autocomplete = useAutocomplete(props);
30117
30122
  const isActive = vue.computed(() => props.persistentPlaceholder || isFocused.value || props.active);
30118
30123
  function onFocus() {
@@ -30157,6 +30162,18 @@
30157
30162
  if (!props.autoGrow) rows.value = Number(props.rows);
30158
30163
  });
30159
30164
  function calculateInputHeight() {
30165
+ vue.nextTick(() => {
30166
+ if (!textareaRef.value) return;
30167
+ if (platform.value.firefox) {
30168
+ scrollbarWidth.value = 12;
30169
+ return;
30170
+ }
30171
+ const {
30172
+ offsetWidth,
30173
+ clientWidth
30174
+ } = textareaRef.value;
30175
+ scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
30176
+ });
30160
30177
  if (!props.autoGrow) return;
30161
30178
  vue.nextTick(() => {
30162
30179
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -30217,7 +30234,9 @@
30217
30234
  'v-textarea--no-resize': props.noResize || props.autoGrow,
30218
30235
  'v-input--plain-underlined': isPlainOrUnderlined.value
30219
30236
  }, props.class],
30220
- "style": props.style
30237
+ "style": [{
30238
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
30239
+ }, props.style]
30221
30240
  }, rootAttrs, inputProps, {
30222
30241
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
30223
30242
  "focused": isFocused.value
@@ -31736,6 +31755,11 @@
31736
31755
  openAll: Boolean,
31737
31756
  indentLines: [Boolean, String],
31738
31757
  search: String,
31758
+ hideNoData: Boolean,
31759
+ noDataText: {
31760
+ type: String,
31761
+ default: '$vuetify.noDataText'
31762
+ },
31739
31763
  ...makeFilterProps({
31740
31764
  filterKeys: ['title']
31741
31765
  }),
@@ -31763,6 +31787,9 @@
31763
31787
  slots,
31764
31788
  emit
31765
31789
  } = _ref;
31790
+ const {
31791
+ t
31792
+ } = useLocale();
31766
31793
  const {
31767
31794
  items
31768
31795
  } = useListItems(props);
@@ -31856,7 +31883,10 @@
31856
31883
  "selected": selected.value,
31857
31884
  "onUpdate:selected": $event => selected.value = $event
31858
31885
  }), {
31859
- default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
31886
+ default: () => [visibleIds.value?.size === 0 && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
31887
+ "key": "no-data",
31888
+ "title": t(props.noDataText)
31889
+ }, null)), vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
31860
31890
  "density": props.density,
31861
31891
  "returnObject": props.returnObject,
31862
31892
  "items": items.value,
@@ -32282,6 +32312,40 @@
32282
32312
  Touch: Touch
32283
32313
  });
32284
32314
 
32315
+ // Composables
32316
+
32317
+ // Types
32318
+
32319
+ function genDefaults() {
32320
+ return {
32321
+ svg: {
32322
+ component: VSvgIcon
32323
+ },
32324
+ class: {
32325
+ component: VClassIcon
32326
+ }
32327
+ };
32328
+ }
32329
+ function createIcons(options) {
32330
+ const sets = genDefaults();
32331
+ const defaultSet = options?.defaultSet ?? 'mdi';
32332
+ if (defaultSet === 'mdi' && !sets.mdi) {
32333
+ sets.mdi = mdi;
32334
+ }
32335
+ return mergeDeep({
32336
+ defaultSet,
32337
+ sets,
32338
+ aliases: {
32339
+ ...aliases,
32340
+ /* eslint-disable max-len */
32341
+ 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]],
32342
+ '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',
32343
+ '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]]
32344
+ /* eslint-enable max-len */
32345
+ }
32346
+ }, options);
32347
+ }
32348
+
32285
32349
  // Composables
32286
32350
  function createVuetify$1() {
32287
32351
  let vuetify = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -32381,7 +32445,7 @@
32381
32445
  };
32382
32446
  });
32383
32447
  }
32384
- const version$1 = "3.10.5-dev.2025-10-07";
32448
+ const version$1 = "3.10.5-dev.2025-10-09";
32385
32449
  createVuetify$1.version = version$1;
32386
32450
 
32387
32451
  // Vue's inject() can only be used in setup
@@ -32406,7 +32470,7 @@
32406
32470
  ...options
32407
32471
  });
32408
32472
  };
32409
- const version = "3.10.5-dev.2025-10-07";
32473
+ const version = "3.10.5-dev.2025-10-09";
32410
32474
  createVuetify.version = version;
32411
32475
 
32412
32476
  exports.blueprints = index;