vuetify 3.8.8 → 3.8.10

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 (130) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/json/attributes.json +3413 -3405
  3. package/dist/json/importMap-labs.json +38 -38
  4. package/dist/json/importMap.json +146 -146
  5. package/dist/json/tags.json +2 -0
  6. package/dist/json/web-types.json +6357 -6339
  7. package/dist/vuetify-labs.cjs +210 -103
  8. package/dist/vuetify-labs.css +3832 -3823
  9. package/dist/vuetify-labs.d.ts +80 -58
  10. package/dist/vuetify-labs.esm.js +211 -104
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +210 -103
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +191 -83
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3244 -3235
  17. package/dist/vuetify.d.ts +70 -58
  18. package/dist/vuetify.esm.js +192 -84
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +191 -83
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1002 -993
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VBtn/VBtn.css +3 -0
  26. package/lib/components/VBtn/VBtn.sass +3 -0
  27. package/lib/components/VBtnGroup/VBtnGroup.css +2 -1
  28. package/lib/components/VBtnGroup/VBtnGroup.sass +2 -1
  29. package/lib/components/VDataTable/VDataTable.css +6 -3
  30. package/lib/components/VDataTable/VDataTable.sass +4 -2
  31. package/lib/components/VDataTable/VDataTableColumn.js +1 -0
  32. package/lib/components/VDataTable/VDataTableColumn.js.map +1 -1
  33. package/lib/components/VDataTable/VDataTableFooter.js +3 -1
  34. package/lib/components/VDataTable/VDataTableFooter.js.map +1 -1
  35. package/lib/components/VDataTable/VDataTableHeaders.js +8 -1
  36. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  37. package/lib/components/VDatePicker/VDatePicker.js +19 -13
  38. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  39. package/lib/components/VDatePicker/VDatePickerMonth.js +2 -2
  40. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  41. package/lib/components/VDatePicker/VDatePickerYears.js +1 -3
  42. package/lib/components/VDatePicker/VDatePickerYears.js.map +1 -1
  43. package/lib/components/VField/VField.js +10 -2
  44. package/lib/components/VField/VField.js.map +1 -1
  45. package/lib/components/VFileInput/VFileInput.js +8 -3
  46. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  47. package/lib/components/VList/VListChildren.js +4 -3
  48. package/lib/components/VList/VListChildren.js.map +1 -1
  49. package/lib/components/VList/VListGroup.d.ts +10 -0
  50. package/lib/components/VList/VListGroup.js +2 -2
  51. package/lib/components/VList/VListGroup.js.map +1 -1
  52. package/lib/components/VList/VListItem.css +2 -0
  53. package/lib/components/VList/VListItem.sass +2 -0
  54. package/lib/components/VList/_variables.scss +1 -0
  55. package/lib/components/VNumberInput/VNumberInput.d.ts +5 -0
  56. package/lib/components/VNumberInput/VNumberInput.js +7 -11
  57. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  58. package/lib/components/VOtpInput/VOtpInput.js +22 -3
  59. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  60. package/lib/components/VSelect/VSelect.js +6 -5
  61. package/lib/components/VSelect/VSelect.js.map +1 -1
  62. package/lib/components/VSlider/VSliderThumb.js +1 -1
  63. package/lib/components/VSlider/VSliderThumb.js.map +1 -1
  64. package/lib/components/VSpeedDial/VSpeedDial.css +1 -1
  65. package/lib/components/VSpeedDial/VSpeedDial.sass +3 -1
  66. package/lib/components/VTextField/VTextField.js +9 -8
  67. package/lib/components/VTextField/VTextField.js.map +1 -1
  68. package/lib/components/VTextarea/VTextarea.js +4 -4
  69. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  70. package/lib/composables/autofocus.d.ts +7 -0
  71. package/lib/composables/autofocus.js +10 -0
  72. package/lib/composables/autofocus.js.map +1 -0
  73. package/lib/composables/date/adapters/vuetify.js +1 -1
  74. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  75. package/lib/composables/date/date.d.ts +1 -4
  76. package/lib/composables/date/date.js +13 -14
  77. package/lib/composables/date/date.js.map +1 -1
  78. package/lib/composables/fileDrop.d.ts +4 -0
  79. package/lib/composables/fileDrop.js +50 -0
  80. package/lib/composables/fileDrop.js.map +1 -0
  81. package/lib/composables/group.js +1 -0
  82. package/lib/composables/group.js.map +1 -1
  83. package/lib/composables/hotkey.d.ts +9 -0
  84. package/lib/composables/hotkey.js +131 -0
  85. package/lib/composables/hotkey.js.map +1 -0
  86. package/lib/composables/icons.d.ts +6 -0
  87. package/lib/composables/icons.js.map +1 -1
  88. package/lib/composables/intersectionObserver.js +2 -2
  89. package/lib/composables/intersectionObserver.js.map +1 -1
  90. package/lib/composables/list-items.js +2 -2
  91. package/lib/composables/list-items.js.map +1 -1
  92. package/lib/composables/selectLink.js +2 -2
  93. package/lib/composables/selectLink.js.map +1 -1
  94. package/lib/composables/transition.js +3 -3
  95. package/lib/composables/transition.js.map +1 -1
  96. package/lib/entry-bundler.d.ts +0 -3
  97. package/lib/entry-bundler.js +1 -1
  98. package/lib/entry-bundler.js.map +1 -1
  99. package/lib/framework.d.ts +60 -58
  100. package/lib/framework.js +1 -1
  101. package/lib/framework.js.map +1 -1
  102. package/lib/iconsets/fa.js +3 -1
  103. package/lib/iconsets/fa.js.map +1 -1
  104. package/lib/iconsets/fa4.js +3 -1
  105. package/lib/iconsets/fa4.js.map +1 -1
  106. package/lib/iconsets/md.js +3 -1
  107. package/lib/iconsets/md.js.map +1 -1
  108. package/lib/iconsets/mdi-svg.js +3 -1
  109. package/lib/iconsets/mdi-svg.js.map +1 -1
  110. package/lib/labs/VColorInput/VColorInput.js +3 -8
  111. package/lib/labs/VColorInput/VColorInput.js.map +1 -1
  112. package/lib/labs/VDateInput/VDateInput.d.ts +5 -0
  113. package/lib/labs/VDateInput/VDateInput.js +7 -10
  114. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  115. package/lib/labs/VFileUpload/VFileUpload.js +7 -3
  116. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  117. package/lib/labs/VFileUpload/VFileUploadItem.js +1 -0
  118. package/lib/labs/VFileUpload/VFileUploadItem.js.map +1 -1
  119. package/lib/labs/VTimePicker/VTimePickerClock.js +3 -1
  120. package/lib/labs/VTimePicker/VTimePickerClock.js.map +1 -1
  121. package/lib/labs/VTreeview/VTreeviewChildren.js +2 -1
  122. package/lib/labs/VTreeview/VTreeviewChildren.js.map +1 -1
  123. package/lib/labs/VTreeview/VTreeviewGroup.d.ts +10 -0
  124. package/lib/labs/VTreeview/VTreeviewItem.js +1 -0
  125. package/lib/labs/VTreeview/VTreeviewItem.js.map +1 -1
  126. package/lib/labs/entry-bundler.d.ts +0 -3
  127. package/lib/util/helpers.d.ts +4 -1
  128. package/lib/util/helpers.js +7 -1
  129. package/lib/util/helpers.js.map +1 -1
  130. package/package.json +8 -8
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.8
2
+ * Vuetify v3.8.10
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -607,13 +607,19 @@
607
607
  return cleanText;
608
608
  }
609
609
  function camelizeProps(props) {
610
- if (!props) return;
611
610
  const out = {};
612
611
  for (const prop in props) {
613
612
  out[vue.camelize(prop)] = props[prop];
614
613
  }
615
614
  return out;
616
615
  }
616
+ function onlyDefinedProps(props) {
617
+ const booleanAttributes = ['checked', 'disabled'];
618
+ return Object.fromEntries(Object.entries(props).filter(_ref => {
619
+ let [key, v] = _ref;
620
+ return booleanAttributes.includes(key) ? !!v : v !== undefined;
621
+ }));
622
+ }
617
623
 
618
624
  // Utilities
619
625
  const block = ['top', 'bottom'];
@@ -938,7 +944,7 @@
938
944
  // WoB should always return negative value.
939
945
 
940
946
  const SAPC = (Ybg ** revBG - Ytxt ** revTXT) * scaleWoB;
941
- outputContrast = SAPC > -1e-3 ? 0.0 : SAPC > -0.078 ? SAPC - SAPC * loConFactor * loConOffset : SAPC + loConOffset;
947
+ outputContrast = SAPC > -loClip ? 0.0 : SAPC > -loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC + loConOffset;
942
948
  }
943
949
  return outputContrast * 100;
944
950
  }
@@ -3326,10 +3332,10 @@
3326
3332
  } = isObject(transition) ? transition : {};
3327
3333
  let transitionProps;
3328
3334
  if (isObject(transition)) {
3329
- transitionProps = vue.mergeProps(customProps, JSON.parse(JSON.stringify({
3335
+ transitionProps = vue.mergeProps(customProps, onlyDefinedProps({
3330
3336
  disabled,
3331
3337
  group
3332
- })), rest);
3338
+ }), rest);
3333
3339
  } else {
3334
3340
  transitionProps = vue.mergeProps({
3335
3341
  name: disabled || !transition ? '' : transition
@@ -4398,6 +4404,7 @@
4398
4404
  } else {
4399
4405
  const isSelected = selected.value.includes(id);
4400
4406
  if (props.mandatory && isSelected) return;
4407
+ if (!isSelected && !value) return;
4401
4408
  selected.value = value ?? !isSelected ? [id] : [];
4402
4409
  }
4403
4410
  }
@@ -4832,7 +4839,7 @@
4832
4839
  const observer = new IntersectionObserver(entries => {
4833
4840
  isIntersecting.value = !!entries.find(entry => entry.isIntersecting);
4834
4841
  }, options);
4835
- vue.onBeforeUnmount(() => {
4842
+ vue.onScopeDispose(() => {
4836
4843
  observer.disconnect();
4837
4844
  });
4838
4845
  vue.watch(intersectionRef, (newValue, oldValue) => {
@@ -5363,9 +5370,9 @@
5363
5370
 
5364
5371
  function useSelectLink(link, select) {
5365
5372
  vue.watch(() => link.isActive?.value, isActive => {
5366
- if (link.isLink.value && isActive && select) {
5373
+ if (link.isLink.value && isActive != null && select) {
5367
5374
  vue.nextTick(() => {
5368
- select(true);
5375
+ select(isActive);
5369
5376
  });
5370
5377
  }
5371
5378
  }, {
@@ -8979,6 +8986,7 @@
8979
8986
  type: IconValue,
8980
8987
  default: '$expand'
8981
8988
  },
8989
+ rawId: [String, Number],
8982
8990
  prependIcon: IconValue,
8983
8991
  appendIcon: IconValue,
8984
8992
  fluid: Boolean,
@@ -9000,13 +9008,12 @@
9000
9008
  open,
9001
9009
  id: _id
9002
9010
  } = useNestedItem(() => props.value, true);
9003
- const id = vue.computed(() => `v-list-group--id-${String(_id.value)}`);
9011
+ const id = vue.computed(() => `v-list-group--id-${String(props.rawId ?? _id.value)}`);
9004
9012
  const list = useList();
9005
9013
  const {
9006
9014
  isBooted
9007
9015
  } = useSsrBoot();
9008
9016
  function onClick(e) {
9009
- e.stopPropagation();
9010
9017
  if (['INPUT', 'TEXTAREA'].includes(e.target?.tagName)) return;
9011
9018
  open(!isOpen.value, e);
9012
9019
  }
@@ -9524,9 +9531,10 @@
9524
9531
  }) : undefined
9525
9532
  };
9526
9533
  const listGroupProps = VListGroup.filterProps(itemProps);
9527
- return children ? vue.createVNode(VListGroup, vue.mergeProps({
9528
- "value": itemProps?.value
9529
- }, listGroupProps), {
9534
+ return children ? vue.createVNode(VListGroup, vue.mergeProps(listGroupProps, {
9535
+ "value": props.returnObject ? item : itemProps?.value,
9536
+ "rawId": itemProps?.value
9537
+ }), {
9530
9538
  activator: _ref3 => {
9531
9539
  let {
9532
9540
  props: activatorProps
@@ -9590,7 +9598,7 @@
9590
9598
  const _props = {
9591
9599
  title,
9592
9600
  value,
9593
- ...camelizeProps(itemProps)
9601
+ ...itemProps
9594
9602
  };
9595
9603
  return {
9596
9604
  title: String(_props.title ?? ''),
@@ -11950,7 +11958,11 @@
11950
11958
  default: slots.loader
11951
11959
  }), hasPrepend && vue.createElementVNode("div", {
11952
11960
  "key": "prepend",
11953
- "class": "v-field__prepend-inner"
11961
+ "class": "v-field__prepend-inner",
11962
+ "onMousedown": e => {
11963
+ e.preventDefault();
11964
+ e.stopPropagation();
11965
+ }
11954
11966
  }, [props.prependInnerIcon && vue.createVNode(InputIcon, {
11955
11967
  "key": "prepend-icon",
11956
11968
  "name": "prependInner",
@@ -12019,7 +12031,11 @@
12019
12031
  })]), [[vue.vShow, props.dirty]])]
12020
12032
  }), hasAppend && vue.createElementVNode("div", {
12021
12033
  "key": "append",
12022
- "class": "v-field__append-inner"
12034
+ "class": "v-field__append-inner",
12035
+ "onMousedown": e => {
12036
+ e.preventDefault();
12037
+ e.stopPropagation();
12038
+ }
12023
12039
  }, [slots['append-inner']?.(slotProps.value), props.appendInnerIcon && vue.createVNode(InputIcon, {
12024
12040
  "key": "append-icon",
12025
12041
  "name": "appendInner",
@@ -12054,6 +12070,16 @@
12054
12070
  }
12055
12071
  });
12056
12072
 
12073
+ function useAutofocus(props) {
12074
+ function onIntersect(isIntersecting, entries) {
12075
+ if (!props.autofocus || !isIntersecting) return;
12076
+ entries[0].target?.focus?.();
12077
+ }
12078
+ return {
12079
+ onIntersect
12080
+ };
12081
+ }
12082
+
12057
12083
  // Types
12058
12084
 
12059
12085
  const activeTypes = ['color', 'file', 'time', 'date', 'datetime-local', 'week', 'month'];
@@ -12100,6 +12126,9 @@
12100
12126
  focus,
12101
12127
  blur
12102
12128
  } = useFocus(props);
12129
+ const {
12130
+ onIntersect
12131
+ } = useAutofocus(props);
12103
12132
  const counterValue = vue.computed(() => {
12104
12133
  return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : (model.value ?? '').toString().length;
12105
12134
  });
@@ -12109,19 +12138,17 @@
12109
12138
  return props.counter;
12110
12139
  });
12111
12140
  const isPlainOrUnderlined = vue.computed(() => ['plain', 'underlined'].includes(props.variant));
12112
- function onIntersect(isIntersecting, entries) {
12113
- if (!props.autofocus || !isIntersecting) return;
12114
- entries[0].target?.focus?.();
12115
- }
12116
12141
  const vInputRef = vue.ref();
12117
12142
  const vFieldRef = vue.ref();
12118
12143
  const inputRef = vue.ref();
12119
12144
  const isActive = vue.computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value || props.active);
12120
12145
  function onFocus() {
12121
- if (inputRef.value !== document.activeElement) {
12122
- inputRef.value?.focus();
12123
- }
12124
12146
  if (!isFocused.value) focus();
12147
+ vue.nextTick(() => {
12148
+ if (inputRef.value !== document.activeElement) {
12149
+ inputRef.value?.focus();
12150
+ }
12151
+ });
12125
12152
  }
12126
12153
  function onControlMousedown(e) {
12127
12154
  emit('mousedown:control', e);
@@ -12130,7 +12157,6 @@
12130
12157
  e.preventDefault();
12131
12158
  }
12132
12159
  function onControlClick(e) {
12133
- onFocus();
12134
12160
  emit('click:control', e);
12135
12161
  }
12136
12162
  function onClear(e, reset) {
@@ -13056,6 +13082,7 @@
13056
13082
  index,
13057
13083
  itemRef
13058
13084
  } = _ref2;
13085
+ const camelizedProps = camelizeProps(item.props);
13059
13086
  const itemProps = vue.mergeProps(item.props, {
13060
13087
  ref: itemRef,
13061
13088
  key: item.value,
@@ -13077,10 +13104,10 @@
13077
13104
  "modelValue": isSelected,
13078
13105
  "ripple": false,
13079
13106
  "tabindex": "-1"
13080
- }, null) : undefined, item.props.prependAvatar && vue.createVNode(VAvatar, {
13081
- "image": item.props.prependAvatar
13082
- }, null), item.props.prependIcon && vue.createVNode(VIcon, {
13083
- "icon": item.props.prependIcon
13107
+ }, null) : undefined, camelizedProps.prependAvatar && vue.createVNode(VAvatar, {
13108
+ "image": camelizedProps.prependAvatar
13109
+ }, null), camelizedProps.prependIcon && vue.createVNode(VIcon, {
13110
+ "icon": camelizedProps.prependIcon
13084
13111
  }, null)]);
13085
13112
  }
13086
13113
  });
@@ -16259,7 +16286,7 @@
16259
16286
  default: () => [vue.withDirectives(vue.createElementVNode("div", {
16260
16287
  "class": "v-slider-thumb__label-container"
16261
16288
  }, [vue.createElementVNode("div", {
16262
- "class": vue.normalizeClass(['v-slider-thumb__label'])
16289
+ "class": vue.normalizeClass(['v-slider-thumb__label', textColorClasses.value])
16263
16290
  }, [vue.createElementVNode("div", null, [slots['thumb-label']?.({
16264
16291
  modelValue: props.modelValue
16265
16292
  }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[vue.vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
@@ -17528,7 +17555,7 @@
17528
17555
  const yearStart = new Date(year, 0, 1);
17529
17556
  const size = firstWeekSize(year);
17530
17557
  const d1w1 = size >= minWeekSize ? addDays(yearStart, size - 7) : addDays(yearStart, size);
17531
- return 1 + getDiff(date, d1w1, 'weeks');
17558
+ return 1 + getDiff(endOfDay(date), startOfDay(d1w1), 'weeks');
17532
17559
  }
17533
17560
  function getDate(date) {
17534
17561
  return date.getDate();
@@ -17831,6 +17858,18 @@
17831
17858
  instance: createInstance(_options, locale)
17832
17859
  };
17833
17860
  }
17861
+ function createDateRange(adapter, start, stop) {
17862
+ const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
17863
+ const datesInRange = [start];
17864
+ for (let i = 1; i < diff; i++) {
17865
+ const nextDate = adapter.addDays(start, i);
17866
+ datesInRange.push(nextDate);
17867
+ }
17868
+ if (stop) {
17869
+ datesInRange.push(adapter.endOfDay(stop));
17870
+ }
17871
+ return datesInRange;
17872
+ }
17834
17873
  function createInstance(options, locale) {
17835
17874
  const instance = vue.reactive(typeof options.adapter === 'function'
17836
17875
  // eslint-disable-next-line new-cap
@@ -17841,20 +17880,7 @@
17841
17880
  vue.watch(locale.current, value => {
17842
17881
  instance.locale = options.locale[value] ?? value ?? instance.locale;
17843
17882
  });
17844
- return Object.assign(instance, {
17845
- createDateRange(start, stop) {
17846
- const diff = instance.getDiff(stop ?? start, start, 'days');
17847
- const datesInRange = [start];
17848
- for (let i = 1; i < diff; i++) {
17849
- const nextDate = instance.addDays(start, i);
17850
- datesInRange.push(nextDate);
17851
- }
17852
- if (stop) {
17853
- datesInRange.push(instance.endOfDay(stop));
17854
- }
17855
- return datesInRange;
17856
- }
17857
- });
17883
+ return instance;
17858
17884
  }
17859
17885
  function useDate() {
17860
17886
  const options = vue.inject(DateOptionsSymbol);
@@ -19943,7 +19969,9 @@
19943
19969
  "class": "v-data-table-footer"
19944
19970
  }, [slots.prepend?.(), vue.createElementVNode("div", {
19945
19971
  "class": "v-data-table-footer__items-per-page"
19946
- }, [vue.createElementVNode("span", null, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
19972
+ }, [vue.createElementVNode("span", {
19973
+ "aria-label": t(props.itemsPerPageText)
19974
+ }, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
19947
19975
  "items": itemsPerPageOptions.value,
19948
19976
  "modelValue": itemsPerPage.value,
19949
19977
  "onUpdate:modelValue": v => setItemsPerPage(Number(v)),
@@ -19995,6 +20023,7 @@
19995
20023
  } = _ref;
19996
20024
  const Tag = props.tag ?? 'td';
19997
20025
  return vue.createVNode(Tag, {
20026
+ "tabindex": "0",
19998
20027
  "class": vue.normalizeClass(['v-data-table__td', {
19999
20028
  'v-data-table-column--fixed': props.fixed,
20000
20029
  'v-data-table-column--last-fixed': props.lastFixed,
@@ -20339,6 +20368,11 @@
20339
20368
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20340
20369
  };
20341
20370
  }
20371
+ function handleEnterKeyPress(event, column) {
20372
+ if (event.key === 'Enter' && !props.disableSort) {
20373
+ toggleSort(column);
20374
+ }
20375
+ }
20342
20376
  function getSortIcon(column) {
20343
20377
  const item = sortBy.value.find(item => item.key === column.key);
20344
20378
  if (!item) return props.sortAscIcon;
@@ -20395,7 +20429,9 @@
20395
20429
  "nowrap": column.nowrap,
20396
20430
  "lastFixed": column.lastFixed,
20397
20431
  "noPadding": noPadding
20398
- }, headerProps), {
20432
+ }, headerProps, {
20433
+ "onKeydown": event => column.sortable && handleEnterKeyPress(event, column)
20434
+ }), {
20399
20435
  default: () => {
20400
20436
  const columnSlotName = `header.${column.key}`;
20401
20437
  const columnSlotProps = {
@@ -22248,7 +22284,7 @@
22248
22284
  } else {
22249
22285
  rangeStop.value = adapter.endOfDay(_value);
22250
22286
  }
22251
- model.value = adapter.createDateRange(rangeStart.value, rangeStop.value);
22287
+ model.value = createDateRange(adapter, rangeStart.value, rangeStop.value);
22252
22288
  } else {
22253
22289
  rangeStart.value = value;
22254
22290
  rangeStop.value = undefined;
@@ -22467,9 +22503,7 @@
22467
22503
  const yearRef = templateRef();
22468
22504
  vue.onMounted(async () => {
22469
22505
  await vue.nextTick();
22470
- yearRef.el?.scrollIntoView({
22471
- block: 'center'
22472
- });
22506
+ yearRef.el?.focus();
22473
22507
  });
22474
22508
  function isYearAllowed(year) {
22475
22509
  if (Array.isArray(props.allowedYears) && props.allowedYears.length) {
@@ -22605,8 +22639,16 @@
22605
22639
  return value && adapter.isValid(value) ? value : today;
22606
22640
  });
22607
22641
  const headerColor = vue.toRef(() => props.headerColor ?? props.color);
22608
- const month = vue.ref(Number(props.month ?? adapter.getMonth(adapter.startOfMonth(internal.value))));
22609
- const year = vue.ref(Number(props.year ?? adapter.getYear(adapter.startOfYear(adapter.setMonth(internal.value, month.value)))));
22642
+ const _month = useProxiedModel(props, 'month');
22643
+ const month = vue.computed({
22644
+ get: () => Number(_month.value ?? adapter.getMonth(adapter.startOfMonth(internal.value))),
22645
+ set: v => _month.value = v
22646
+ });
22647
+ const _year = useProxiedModel(props, 'year');
22648
+ const year = vue.computed({
22649
+ get: () => Number(_year.value ?? adapter.getYear(adapter.startOfYear(adapter.setMonth(internal.value, month.value)))),
22650
+ set: v => _year.value = v
22651
+ });
22610
22652
  const isReversing = vue.shallowRef(false);
22611
22653
  const header = vue.computed(() => {
22612
22654
  if (props.multiple && model.value.length > 1) {
@@ -22690,9 +22732,9 @@
22690
22732
  } else {
22691
22733
  year.value++;
22692
22734
  month.value = 0;
22693
- onUpdateYear(year.value);
22735
+ onUpdateYear();
22694
22736
  }
22695
- onUpdateMonth(month.value);
22737
+ onUpdateMonth();
22696
22738
  }
22697
22739
  function onClickPrev() {
22698
22740
  if (month.value > 0) {
@@ -22700,9 +22742,9 @@
22700
22742
  } else {
22701
22743
  year.value--;
22702
22744
  month.value = 11;
22703
- onUpdateYear(year.value);
22745
+ onUpdateYear();
22704
22746
  }
22705
- onUpdateMonth(month.value);
22747
+ onUpdateMonth();
22706
22748
  }
22707
22749
  function onClickDate() {
22708
22750
  viewMode.value = 'month';
@@ -22713,13 +22755,11 @@
22713
22755
  function onClickYear() {
22714
22756
  viewMode.value = viewMode.value === 'year' ? 'month' : 'year';
22715
22757
  }
22716
- function onUpdateMonth(value) {
22758
+ function onUpdateMonth() {
22717
22759
  if (viewMode.value === 'months') onClickMonth();
22718
- emit('update:month', value);
22719
22760
  }
22720
- function onUpdateYear(value) {
22761
+ function onUpdateYear() {
22721
22762
  if (viewMode.value === 'year') onClickYear();
22722
- emit('update:year', value);
22723
22763
  }
22724
22764
  vue.watch(model, (val, oldVal) => {
22725
22765
  const arrBefore = wrapInArray(oldVal);
@@ -22731,11 +22771,11 @@
22731
22771
  const newYear = adapter.getYear(after);
22732
22772
  if (newMonth !== month.value) {
22733
22773
  month.value = newMonth;
22734
- onUpdateMonth(month.value);
22774
+ onUpdateMonth();
22735
22775
  }
22736
22776
  if (newYear !== year.value) {
22737
22777
  year.value = newYear;
22738
- onUpdateYear(year.value);
22778
+ onUpdateYear();
22739
22779
  }
22740
22780
  isReversing.value = adapter.isBefore(before, after);
22741
22781
  });
@@ -23335,6 +23375,56 @@
23335
23375
 
23336
23376
  // Types
23337
23377
 
23378
+ function useFileDrop() {
23379
+ function hasFilesOrFolders(e) {
23380
+ const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
23381
+ return entries.length > 0 || [...(e.dataTransfer?.files ?? [])].length > 0;
23382
+ }
23383
+ async function handleDrop(e) {
23384
+ const result = [];
23385
+ const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
23386
+ if (entries.length) {
23387
+ for (const entry of entries) {
23388
+ const files = await traverseFileTree(entry, appendIfDirectory('.', entry));
23389
+ result.push(...files.map(x => x.file));
23390
+ }
23391
+ } else {
23392
+ result.push(...[...(e.dataTransfer?.files ?? [])]);
23393
+ }
23394
+ return result;
23395
+ }
23396
+ return {
23397
+ handleDrop,
23398
+ hasFilesOrFolders
23399
+ };
23400
+ }
23401
+ function traverseFileTree(item) {
23402
+ let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
23403
+ return new Promise((resolve, reject) => {
23404
+ if (item.isFile) {
23405
+ const fileEntry = item;
23406
+ fileEntry.file(file => resolve([{
23407
+ file,
23408
+ path
23409
+ }]), reject);
23410
+ } else if (item.isDirectory) {
23411
+ const directoryReader = item.createReader();
23412
+ directoryReader.readEntries(async entries => {
23413
+ const files = [];
23414
+ for (const entry of entries) {
23415
+ files.push(...(await traverseFileTree(entry, appendIfDirectory(path, entry))));
23416
+ }
23417
+ resolve(files);
23418
+ });
23419
+ }
23420
+ });
23421
+ }
23422
+ function appendIfDirectory(path, item) {
23423
+ return item.isDirectory ? `${path}/${item.name}` : path;
23424
+ }
23425
+
23426
+ // Types
23427
+
23338
23428
  const makeVFileInputProps = propsFactory({
23339
23429
  chips: Boolean,
23340
23430
  counter: Boolean,
@@ -23419,6 +23509,10 @@
23419
23509
  const isActive = vue.toRef(() => isFocused.value || props.active);
23420
23510
  const isPlainOrUnderlined = vue.computed(() => ['plain', 'underlined'].includes(props.variant));
23421
23511
  const isDragging = vue.shallowRef(false);
23512
+ const {
23513
+ handleDrop,
23514
+ hasFilesOrFolders
23515
+ } = useFileDrop();
23422
23516
  function onFocus() {
23423
23517
  if (inputRef.value !== document.activeElement) {
23424
23518
  inputRef.value?.focus();
@@ -23452,13 +23546,13 @@
23452
23546
  e.preventDefault();
23453
23547
  isDragging.value = false;
23454
23548
  }
23455
- function onDrop(e) {
23549
+ async function onDrop(e) {
23456
23550
  e.preventDefault();
23457
23551
  e.stopImmediatePropagation();
23458
23552
  isDragging.value = false;
23459
- if (!e.dataTransfer?.files?.length || !inputRef.value) return;
23553
+ if (!inputRef.value || !hasFilesOrFolders(e)) return;
23460
23554
  const dataTransfer = new DataTransfer();
23461
- for (const file of e.dataTransfer.files) {
23555
+ for (const file of await handleDrop(e)) {
23462
23556
  dataTransfer.items.add(file);
23463
23557
  }
23464
23558
  inputRef.value.files = dataTransfer.files;
@@ -24889,6 +24983,7 @@
24889
24983
  ...makeVNumberInputProps()
24890
24984
  },
24891
24985
  emits: {
24986
+ 'update:focused': val => true,
24892
24987
  'update:modelValue': val => true
24893
24988
  },
24894
24989
  setup(props, _ref) {
@@ -24904,11 +24999,7 @@
24904
24999
  });
24905
25000
  const form = useForm(props);
24906
25001
  const controlsDisabled = vue.computed(() => form.isDisabled.value || form.isReadonly.value);
24907
- const {
24908
- isFocused,
24909
- focus,
24910
- blur
24911
- } = useFocus(props);
25002
+ const isFocused = vue.shallowRef(props.focused);
24912
25003
  function correctPrecision(val) {
24913
25004
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24914
25005
  const fixed = precision == null ? String(val) : val.toFixed(precision);
@@ -25093,11 +25184,9 @@
25093
25184
  inputText.value = model.value.toString();
25094
25185
  }
25095
25186
  function onFocus() {
25096
- focus();
25097
25187
  trimDecimalZeros();
25098
25188
  }
25099
25189
  function onBlur() {
25100
- blur();
25101
25190
  clampModel();
25102
25191
  }
25103
25192
  useRender(() => {
@@ -25190,9 +25279,12 @@
25190
25279
  }, null)]) : props.reverse && controlVariant.value !== 'hidden' ? vue.createElementVNode(vue.Fragment, null, [controlNode(), dividerNode()]) : undefined;
25191
25280
  const hasPrependInner = slots['prepend-inner'] || prependInnerControl;
25192
25281
  return vue.createVNode(VTextField, vue.mergeProps({
25193
- "ref": vTextFieldRef,
25282
+ "ref": vTextFieldRef
25283
+ }, textFieldProps, {
25194
25284
  "modelValue": inputText.value,
25195
25285
  "onUpdate:modelValue": $event => inputText.value = $event,
25286
+ "focused": isFocused.value,
25287
+ "onUpdate:focused": $event => isFocused.value = $event,
25196
25288
  "validationValue": model.value,
25197
25289
  "onBeforeinput": onBeforeinput,
25198
25290
  "onFocus": onFocus,
@@ -25205,8 +25297,7 @@
25205
25297
  'v-number-input--reverse': props.reverse,
25206
25298
  'v-number-input--split': controlVariant.value === 'split',
25207
25299
  'v-number-input--stacked': controlVariant.value === 'stacked'
25208
- }, props.class]
25209
- }, textFieldProps, {
25300
+ }, props.class],
25210
25301
  "style": props.style,
25211
25302
  "inputmode": "decimal"
25212
25303
  }), {
@@ -25292,6 +25383,21 @@
25292
25383
  const contentRef = vue.ref();
25293
25384
  const inputRef = vue.ref([]);
25294
25385
  const current = vue.computed(() => inputRef.value[focusIndex.value]);
25386
+ const intersectScope = vue.effectScope();
25387
+ intersectScope.run(() => {
25388
+ const {
25389
+ intersectionRef,
25390
+ isIntersecting
25391
+ } = useIntersectionObserver();
25392
+ vue.watch(isIntersecting, v => {
25393
+ if (!v) return;
25394
+ intersectionRef.value?.focus();
25395
+ intersectScope.stop();
25396
+ });
25397
+ vue.watchEffect(() => {
25398
+ intersectionRef.value = inputRef.value[0];
25399
+ });
25400
+ });
25295
25401
  function onInput() {
25296
25402
  // The maxlength attribute doesn't work for the number type input, so the text type is used.
25297
25403
  // The following logic simulates the behavior of a number input.
@@ -25341,7 +25447,7 @@
25341
25447
  function onPaste(index, e) {
25342
25448
  e.preventDefault();
25343
25449
  e.stopPropagation();
25344
- const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25450
+ const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25345
25451
  if (isValidNumber(clipboardText)) return;
25346
25452
  model.value = clipboardText.split('');
25347
25453
  inputRef.value?.[index].blur();
@@ -25373,7 +25479,10 @@
25373
25479
  scoped: true
25374
25480
  });
25375
25481
  vue.watch(model, val => {
25376
- if (val.length === length.value) emit('finish', val.join(''));
25482
+ if (val.length === length.value) {
25483
+ focusIndex.value = length.value - 1;
25484
+ emit('finish', val.join(''));
25485
+ }
25377
25486
  }, {
25378
25487
  deep: true
25379
25488
  });
@@ -28035,6 +28144,9 @@
28035
28144
  focus,
28036
28145
  blur
28037
28146
  } = useFocus(props);
28147
+ const {
28148
+ onIntersect
28149
+ } = useAutofocus(props);
28038
28150
  const counterValue = vue.computed(() => {
28039
28151
  return typeof props.counterValue === 'function' ? props.counterValue(model.value) : (model.value || '').toString().length;
28040
28152
  });
@@ -28043,10 +28155,6 @@
28043
28155
  if (!props.counter || typeof props.counter !== 'number' && typeof props.counter !== 'string') return undefined;
28044
28156
  return props.counter;
28045
28157
  });
28046
- function onIntersect(isIntersecting, entries) {
28047
- if (!props.autofocus || !isIntersecting) return;
28048
- entries[0].target?.focus?.();
28049
- }
28050
28158
  const vInputRef = vue.ref();
28051
28159
  const vFieldRef = vue.ref();
28052
28160
  const controlHeight = vue.shallowRef('');
@@ -29264,13 +29372,9 @@
29264
29372
  let {
29265
29373
  slots
29266
29374
  } = _ref;
29267
- const {
29268
- isFocused,
29269
- focus,
29270
- blur
29271
- } = useFocus(props);
29272
29375
  const model = useProxiedModel(props, 'modelValue');
29273
29376
  const menu = vue.shallowRef(false);
29377
+ const isFocused = vue.shallowRef(props.focused);
29274
29378
  const isInteractive = vue.computed(() => !props.disabled && !props.readonly);
29275
29379
  const display = vue.computed(() => model.value || null);
29276
29380
  function onKeydown(e) {
@@ -29301,10 +29405,9 @@
29301
29405
  "modelValue": display.value,
29302
29406
  "onKeydown": isInteractive.value ? onKeydown : undefined,
29303
29407
  "focused": menu.value || isFocused.value,
29304
- "onFocus": focus,
29305
- "onBlur": blur,
29306
29408
  "onClick:control": isInteractive.value ? onClick : undefined,
29307
29409
  "onClick:prependInner": isInteractive.value ? onClick : undefined,
29410
+ "onUpdate:focused": event => isFocused.value = event,
29308
29411
  "onClick:appendInner": isInteractive.value ? onClick : undefined,
29309
29412
  "onUpdate:modelValue": val => {
29310
29413
  model.value = val;
@@ -29508,6 +29611,7 @@
29508
29611
  emits: {
29509
29612
  save: value => true,
29510
29613
  cancel: () => true,
29614
+ 'update:focused': val => true,
29511
29615
  'update:modelValue': val => true,
29512
29616
  'update:menu': val => true
29513
29617
  },
@@ -29530,15 +29634,11 @@
29530
29634
  const {
29531
29635
  mobile
29532
29636
  } = useDisplay(props);
29533
- const {
29534
- isFocused,
29535
- focus,
29536
- blur
29537
- } = useFocus(props);
29538
29637
  const emptyModelValue = () => props.multiple ? [] : null;
29539
29638
  const model = useProxiedModel(props, 'modelValue', emptyModelValue(), val => Array.isArray(val) ? val.map(item => adapter.toJsDate(item)) : val ? adapter.toJsDate(val) : val, val => Array.isArray(val) ? val.map(item => adapter.date(item)) : val ? adapter.date(val) : val);
29540
29639
  const menu = useProxiedModel(props, 'menu');
29541
29640
  const isEditingInput = vue.shallowRef(false);
29641
+ const isFocused = vue.shallowRef(props.focused);
29542
29642
  const vTextFieldRef = vue.ref();
29543
29643
  const disabledActions = vue.ref(['save']);
29544
29644
  function format(date) {
@@ -29614,7 +29714,6 @@
29614
29714
  if (props.updateOn.includes('blur')) {
29615
29715
  onUserInput(e.target);
29616
29716
  }
29617
- blur();
29618
29717
 
29619
29718
  // When in mobile mode and editing is done (due to keyboard dismissal), close the menu
29620
29719
  if (mobile.value && isEditingInput.value && !isFocused.value) {
@@ -29637,7 +29736,7 @@
29637
29736
  if (parts.every(isValid)) {
29638
29737
  if (props.multiple === 'range') {
29639
29738
  const [start, stop] = parts.map(parseDate).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
29640
- model.value = adapter.createDateRange(start, stop);
29739
+ model.value = createDateRange(adapter, start, stop);
29641
29740
  } else {
29642
29741
  model.value = parts.map(parseDate);
29643
29742
  }
@@ -29659,12 +29758,12 @@
29659
29758
  "readonly": isReadonly.value,
29660
29759
  "onKeydown": isInteractive.value ? onKeydown : undefined,
29661
29760
  "focused": menu.value || isFocused.value,
29662
- "onFocus": focus,
29663
29761
  "onBlur": onBlur,
29664
29762
  "validationValue": model.value,
29665
29763
  "onClick:control": isInteractive.value ? onClick : undefined,
29666
29764
  "onClick:prepend": isInteractive.value ? onClick : undefined,
29667
- "onUpdate:modelValue": onUpdateDisplayModel
29765
+ "onUpdate:modelValue": onUpdateDisplayModel,
29766
+ "onUpdate:focused": event => isFocused.value = event
29668
29767
  }), {
29669
29768
  ...slots,
29670
29769
  default: () => vue.createElementVNode(vue.Fragment, null, [vue.createVNode(VMenu, {
@@ -29772,6 +29871,7 @@
29772
29871
  "class": "v-file-upload-item"
29773
29872
  }), {
29774
29873
  ...slots,
29874
+ title: () => props?.title ?? props.file?.name,
29775
29875
  prepend: slotProps => vue.createElementVNode(vue.Fragment, null, [!slots.prepend ? vue.createVNode(VAvatar, {
29776
29876
  "icon": props.fileIcon,
29777
29877
  "image": preview.value,
@@ -29879,6 +29979,9 @@
29879
29979
  const isDragging = vue.shallowRef(false);
29880
29980
  const vSheetRef = vue.ref(null);
29881
29981
  const inputRef = vue.ref(null);
29982
+ const {
29983
+ handleDrop
29984
+ } = useFileDrop();
29882
29985
  function onDragover(e) {
29883
29986
  e.preventDefault();
29884
29987
  e.stopImmediatePropagation();
@@ -29888,13 +29991,13 @@
29888
29991
  e.preventDefault();
29889
29992
  isDragging.value = false;
29890
29993
  }
29891
- function onDrop(e) {
29994
+ async function onDrop(e) {
29892
29995
  e.preventDefault();
29893
29996
  e.stopImmediatePropagation();
29894
29997
  isDragging.value = false;
29895
- if (!e.dataTransfer?.files?.length || !inputRef.value) return;
29998
+ if (!inputRef.value) return;
29896
29999
  const dataTransfer = new DataTransfer();
29897
- for (const file of e.dataTransfer.files) {
30000
+ for (const file of await handleDrop(e)) {
29898
30001
  dataTransfer.items.add(file);
29899
30002
  }
29900
30003
  inputRef.value.files = dataTransfer.files;
@@ -30617,6 +30720,7 @@
30617
30720
  const isDragging = vue.ref(false);
30618
30721
  const valueOnMouseDown = vue.ref(null);
30619
30722
  const valueOnMouseUp = vue.ref(null);
30723
+ const emitChangeDebounced = debounce(value => emit('change', value), 750);
30620
30724
  const {
30621
30725
  textColorClasses,
30622
30726
  textColorStyles
@@ -30662,6 +30766,7 @@
30662
30766
  if (value !== props.displayedValue) {
30663
30767
  update(value);
30664
30768
  }
30769
+ emitChangeDebounced(value);
30665
30770
  }
30666
30771
  function isInner(value) {
30667
30772
  return props.double && value - props.min >= roundCount.value;
@@ -31262,6 +31367,7 @@
31262
31367
  }
31263
31368
  function onClickAction(e) {
31264
31369
  e.preventDefault();
31370
+ e.stopPropagation();
31265
31371
  emit('toggleExpand', e);
31266
31372
  }
31267
31373
  useRender(() => {
@@ -31407,7 +31513,8 @@
31407
31513
  const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
31408
31514
  const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
31409
31515
  return children ? vue.createVNode(VTreeviewGroup, vue.mergeProps(treeviewGroupProps, {
31410
- "value": props.returnObject ? item.raw : treeviewGroupProps?.value
31516
+ "value": props.returnObject ? item.raw : treeviewGroupProps?.value,
31517
+ "rawId": treeviewGroupProps?.value
31411
31518
  }), {
31412
31519
  activator: _ref2 => {
31413
31520
  let {
@@ -32095,7 +32202,7 @@
32095
32202
  };
32096
32203
  });
32097
32204
  }
32098
- const version$1 = "3.8.8";
32205
+ const version$1 = "3.8.10";
32099
32206
  createVuetify$1.version = version$1;
32100
32207
 
32101
32208
  // Vue's inject() can only be used in setup
@@ -32393,7 +32500,7 @@
32393
32500
 
32394
32501
  /* eslint-disable local-rules/sort-imports */
32395
32502
 
32396
- const version = "3.8.8";
32503
+ const version = "3.8.10";
32397
32504
 
32398
32505
  /* eslint-disable local-rules/sort-imports */
32399
32506