vuetify 3.8.7 → 3.8.9

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 (133) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/json/attributes.json +1535 -1511
  3. package/dist/json/importMap-labs.json +20 -20
  4. package/dist/json/importMap.json +138 -138
  5. package/dist/json/tags.json +6 -0
  6. package/dist/json/web-types.json +2800 -2746
  7. package/dist/vuetify-labs.cjs +292 -154
  8. package/dist/vuetify-labs.css +6716 -6710
  9. package/dist/vuetify-labs.d.ts +96 -50
  10. package/dist/vuetify-labs.esm.js +293 -155
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +292 -154
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +272 -124
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3854 -3848
  17. package/dist/vuetify.d.ts +81 -50
  18. package/dist/vuetify.esm.js +273 -125
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +272 -124
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +489 -470
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.css +6 -6
  26. package/lib/components/VAutocomplete/VAutocomplete.sass +3 -9
  27. package/lib/components/VCarousel/VCarousel.js +3 -3
  28. package/lib/components/VCarousel/VCarousel.js.map +1 -1
  29. package/lib/components/VChip/VChip.js +1 -0
  30. package/lib/components/VChip/VChip.js.map +1 -1
  31. package/lib/components/VColorPicker/VColorPickerPreview.js +3 -3
  32. package/lib/components/VColorPicker/VColorPickerPreview.js.map +1 -1
  33. package/lib/components/VColorPicker/VColorPickerSwatches.js +3 -3
  34. package/lib/components/VColorPicker/VColorPickerSwatches.js.map +1 -1
  35. package/lib/components/VCombobox/VCombobox.css +6 -6
  36. package/lib/components/VCombobox/VCombobox.sass +3 -9
  37. package/lib/components/VDataTable/VDataTableColumn.js +4 -3
  38. package/lib/components/VDataTable/VDataTableColumn.js.map +1 -1
  39. package/lib/components/VDataTable/VDataTableFooter.js +3 -1
  40. package/lib/components/VDataTable/VDataTableFooter.js.map +1 -1
  41. package/lib/components/VDataTable/VDataTableGroupHeaderRow.js +3 -3
  42. package/lib/components/VDataTable/VDataTableGroupHeaderRow.js.map +1 -1
  43. package/lib/components/VDataTable/VDataTableHeaders.js +8 -1
  44. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  45. package/lib/components/VDataTable/VDataTableVirtual.js +7 -7
  46. package/lib/components/VDataTable/VDataTableVirtual.js.map +1 -1
  47. package/lib/components/VDatePicker/VDatePicker.d.ts +20 -0
  48. package/lib/components/VDatePicker/VDatePicker.js +39 -2
  49. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  50. package/lib/components/VDatePicker/VDatePickerControls.js +4 -4
  51. package/lib/components/VDatePicker/VDatePickerControls.js.map +1 -1
  52. package/lib/components/VDatePicker/VDatePickerMonth.js +5 -12
  53. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  54. package/lib/components/VDatePicker/VDatePickerMonths.d.ts +10 -0
  55. package/lib/components/VDatePicker/VDatePickerMonths.js +15 -5
  56. package/lib/components/VDatePicker/VDatePickerMonths.js.map +1 -1
  57. package/lib/components/VDatePicker/VDatePickerYears.d.ts +10 -0
  58. package/lib/components/VDatePicker/VDatePickerYears.js +17 -5
  59. package/lib/components/VDatePicker/VDatePickerYears.js.map +1 -1
  60. package/lib/components/VEmptyState/VEmptyState.js +3 -3
  61. package/lib/components/VEmptyState/VEmptyState.js.map +1 -1
  62. package/lib/components/VFileInput/VFileInput.js +8 -3
  63. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  64. package/lib/components/VImg/VImg.js +7 -7
  65. package/lib/components/VImg/VImg.js.map +1 -1
  66. package/lib/components/VInfiniteScroll/VInfiniteScroll.js +3 -3
  67. package/lib/components/VInfiniteScroll/VInfiniteScroll.js.map +1 -1
  68. package/lib/components/VNumberInput/VNumberInput.d.ts +5 -0
  69. package/lib/components/VNumberInput/VNumberInput.js +18 -21
  70. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  71. package/lib/components/VOtpInput/VOtpInput.js +7 -4
  72. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  73. package/lib/components/VProgressCircular/VProgressCircular.js +2 -2
  74. package/lib/components/VProgressCircular/VProgressCircular.js.map +1 -1
  75. package/lib/components/VProgressLinear/VProgressLinear.js +3 -3
  76. package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
  77. package/lib/components/VSelect/VSelect.css +6 -0
  78. package/lib/components/VSelect/VSelect.js +6 -5
  79. package/lib/components/VSelect/VSelect.js.map +1 -1
  80. package/lib/components/VSelect/VSelect.sass +3 -0
  81. package/lib/components/VSelect/_mixins.scss +14 -0
  82. package/lib/components/VSelectionControl/VSelectionControl.js +2 -2
  83. package/lib/components/VSelectionControl/VSelectionControl.js.map +1 -1
  84. package/lib/components/VSlider/VSliderThumb.js +16 -10
  85. package/lib/components/VSlider/VSliderThumb.js.map +1 -1
  86. package/lib/components/VSlider/VSliderTrack.js +6 -6
  87. package/lib/components/VSlider/VSliderTrack.js.map +1 -1
  88. package/lib/components/VSlider/slider.js +4 -1
  89. package/lib/components/VSlider/slider.js.map +1 -1
  90. package/lib/components/VTable/VTable.js +3 -3
  91. package/lib/components/VTable/VTable.js.map +1 -1
  92. package/lib/components/VTextField/VTextField.js +5 -4
  93. package/lib/components/VTextField/VTextField.js.map +1 -1
  94. package/lib/components/VToolbar/VToolbar.js +5 -5
  95. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  96. package/lib/components/VVirtualScroll/VVirtualScroll.js +7 -7
  97. package/lib/components/VVirtualScroll/VVirtualScroll.js.map +1 -1
  98. package/lib/components/VWindow/VWindow.js +3 -3
  99. package/lib/components/VWindow/VWindow.js.map +1 -1
  100. package/lib/composables/date/adapters/vuetify.js +1 -1
  101. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  102. package/lib/composables/date/date.d.ts +1 -0
  103. package/lib/composables/date/date.js +12 -0
  104. package/lib/composables/date/date.js.map +1 -1
  105. package/lib/composables/fileDrop.d.ts +4 -0
  106. package/lib/composables/fileDrop.js +50 -0
  107. package/lib/composables/fileDrop.js.map +1 -0
  108. package/lib/composables/icons.d.ts +6 -0
  109. package/lib/composables/icons.js.map +1 -1
  110. package/lib/entry-bundler.js +1 -1
  111. package/lib/framework.d.ts +56 -50
  112. package/lib/framework.js +1 -1
  113. package/lib/iconsets/fa.js +3 -1
  114. package/lib/iconsets/fa.js.map +1 -1
  115. package/lib/iconsets/fa4.js +3 -1
  116. package/lib/iconsets/fa4.js.map +1 -1
  117. package/lib/iconsets/md.js +3 -1
  118. package/lib/iconsets/md.js.map +1 -1
  119. package/lib/iconsets/mdi-svg.js +3 -1
  120. package/lib/iconsets/mdi-svg.js.map +1 -1
  121. package/lib/labs/VColorInput/VColorInput.js +3 -8
  122. package/lib/labs/VColorInput/VColorInput.js.map +1 -1
  123. package/lib/labs/VDateInput/VDateInput.d.ts +25 -0
  124. package/lib/labs/VDateInput/VDateInput.js +9 -16
  125. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  126. package/lib/labs/VFileUpload/VFileUpload.js +7 -3
  127. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  128. package/lib/labs/VPullToRefresh/VPullToRefresh.js +7 -7
  129. package/lib/labs/VPullToRefresh/VPullToRefresh.js.map +1 -1
  130. package/lib/util/helpers.d.ts +1 -0
  131. package/lib/util/helpers.js +8 -1
  132. package/lib/util/helpers.js.map +1 -1
  133. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.7
2
+ * Vuetify v3.8.9
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -606,6 +606,13 @@
606
606
  }
607
607
  return cleanText;
608
608
  }
609
+ function camelizeProps(props) {
610
+ const out = {};
611
+ for (const prop in props) {
612
+ out[vue.camelize(prop)] = props[prop];
613
+ }
614
+ return out;
615
+ }
609
616
 
610
617
  // Utilities
611
618
  const block = ['top', 'bottom'];
@@ -3552,9 +3559,9 @@
3552
3559
  if (!normalisedSrc.value.src || state.value === 'idle') return null;
3553
3560
  const img = vue.createElementVNode("img", {
3554
3561
  "class": vue.normalizeClass(['v-img__img', containClasses.value]),
3555
- "style": vue.normalizeStyle({
3562
+ "style": {
3556
3563
  objectPosition: props.position
3557
- }),
3564
+ },
3558
3565
  "crossorigin": props.crossorigin,
3559
3566
  "src": normalisedSrc.value.src,
3560
3567
  "srcset": normalisedSrc.value.srcset,
@@ -3581,9 +3588,9 @@
3581
3588
  }, {
3582
3589
  default: () => [normalisedSrc.value.lazySrc && state.value !== 'loaded' && vue.createElementVNode("img", {
3583
3590
  "class": vue.normalizeClass(['v-img__img', 'v-img__img--preload', containClasses.value]),
3584
- "style": vue.normalizeStyle({
3591
+ "style": {
3585
3592
  objectPosition: props.position
3586
- }),
3593
+ },
3587
3594
  "crossorigin": props.crossorigin,
3588
3595
  "src": normalisedSrc.value.lazySrc,
3589
3596
  "alt": props.alt,
@@ -3617,9 +3624,9 @@
3617
3624
  if (!props.gradient) return null;
3618
3625
  return vue.createElementVNode("div", {
3619
3626
  "class": "v-img__gradient",
3620
- "style": vue.normalizeStyle({
3627
+ "style": {
3621
3628
  backgroundImage: `linear-gradient(${props.gradient})`
3622
- })
3629
+ }
3623
3630
  }, null);
3624
3631
  };
3625
3632
  const isBooted = vue.shallowRef(false);
@@ -3830,9 +3837,9 @@
3830
3837
  }, {
3831
3838
  default: () => [vue.createElementVNode("div", {
3832
3839
  "class": "v-toolbar__content",
3833
- "style": vue.normalizeStyle({
3840
+ "style": {
3834
3841
  height: convertToUnit(contentHeight.value)
3835
- })
3842
+ }
3836
3843
  }, [slots.prepend && vue.createElementVNode("div", {
3837
3844
  "class": "v-toolbar__prepend"
3838
3845
  }, [slots.prepend?.()]), hasTitle && vue.createVNode(VToolbarTitle, {
@@ -3853,9 +3860,9 @@
3853
3860
  default: () => [vue.createVNode(VExpandTransition, null, {
3854
3861
  default: () => [isExtended.value && vue.createElementVNode("div", {
3855
3862
  "class": "v-toolbar__extension",
3856
- "style": vue.normalizeStyle({
3863
+ "style": {
3857
3864
  height: convertToUnit(extensionHeight.value)
3858
- })
3865
+ }
3859
3866
  }, [extension])]
3860
3867
  })]
3861
3868
  })]
@@ -4928,9 +4935,9 @@
4928
4935
  "aria-valuenow": props.indeterminate ? undefined : normalizedValue.value
4929
4936
  }, {
4930
4937
  default: () => [vue.createElementVNode("svg", {
4931
- "style": vue.normalizeStyle({
4938
+ "style": {
4932
4939
  transform: `rotate(calc(-90deg + ${Number(props.rotate)}deg))`
4933
- }),
4940
+ },
4934
4941
  "xmlns": "http://www.w3.org/2000/svg",
4935
4942
  "viewBox": `0 0 ${diameter.value} ${diameter.value}`
4936
4943
  }, [vue.createElementVNode("circle", {
@@ -5151,7 +5158,7 @@
5151
5158
  default: () => [props.stream && vue.createElementVNode("div", {
5152
5159
  "key": "stream",
5153
5160
  "class": vue.normalizeClass(['v-progress-linear__stream', textColorClasses.value]),
5154
- "style": vue.normalizeStyle({
5161
+ "style": {
5155
5162
  ...textColorStyles.value,
5156
5163
  [isReversed.value ? 'left' : 'right']: convertToUnit(-height.value),
5157
5164
  borderTop: `${convertToUnit(height.value / 2)} dotted`,
@@ -5159,7 +5166,7 @@
5159
5166
  top: `calc(50% - ${convertToUnit(height.value / 4)})`,
5160
5167
  width: convertToUnit(100 - normalizedBuffer.value, '%'),
5161
5168
  '--v-progress-linear-stream-to': convertToUnit(height.value * (isReversed.value ? 1 : -1))
5162
- })
5169
+ }
5163
5170
  }, null), vue.createElementVNode("div", {
5164
5171
  "class": vue.normalizeClass(['v-progress-linear__background', !isForcedColorsModeActive ? backgroundColorClasses.value : undefined]),
5165
5172
  "style": vue.normalizeStyle([backgroundColorStyles.value, {
@@ -6467,7 +6474,7 @@
6467
6474
  backgroundColorClasses,
6468
6475
  backgroundColorStyles
6469
6476
  }), vue.withDirectives(vue.createElementVNode("div", {
6470
- "class": ['v-selection-control__input']
6477
+ "class": vue.normalizeClass(['v-selection-control__input'])
6471
6478
  }, [slots.input?.({
6472
6479
  model,
6473
6480
  textColorClasses,
@@ -8100,6 +8107,7 @@
8100
8107
  const isClickable = vue.computed(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value));
8101
8108
  const closeProps = vue.toRef(() => ({
8102
8109
  'aria-label': t(props.closeLabel),
8110
+ disabled: props.disabled,
8103
8111
  onClick(e) {
8104
8112
  e.preventDefault();
8105
8113
  e.stopPropagation();
@@ -12109,10 +12117,12 @@
12109
12117
  const inputRef = vue.ref();
12110
12118
  const isActive = vue.computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value || props.active);
12111
12119
  function onFocus() {
12112
- if (inputRef.value !== document.activeElement) {
12113
- inputRef.value?.focus();
12114
- }
12115
12120
  if (!isFocused.value) focus();
12121
+ vue.nextTick(() => {
12122
+ if (inputRef.value !== document.activeElement) {
12123
+ inputRef.value?.focus();
12124
+ }
12125
+ });
12116
12126
  }
12117
12127
  function onControlMousedown(e) {
12118
12128
  emit('mousedown:control', e);
@@ -12121,7 +12131,6 @@
12121
12131
  e.preventDefault();
12122
12132
  }
12123
12133
  function onControlClick(e) {
12124
- onFocus();
12125
12134
  emit('click:control', e);
12126
12135
  }
12127
12136
  function onClear(e, reset) {
@@ -12614,14 +12623,14 @@
12614
12623
  return props.renderless ? vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("div", {
12615
12624
  "ref": markerRef,
12616
12625
  "class": "v-virtual-scroll__spacer",
12617
- "style": vue.normalizeStyle({
12626
+ "style": {
12618
12627
  paddingTop: convertToUnit(paddingTop.value)
12619
- })
12628
+ }
12620
12629
  }, null), children, vue.createElementVNode("div", {
12621
12630
  "class": "v-virtual-scroll__spacer",
12622
- "style": vue.normalizeStyle({
12631
+ "style": {
12623
12632
  paddingBottom: convertToUnit(paddingBottom.value)
12624
- })
12633
+ }
12625
12634
  }, null)]) : vue.createElementVNode("div", {
12626
12635
  "ref": containerRef,
12627
12636
  "class": vue.normalizeClass(['v-virtual-scroll', props.class]),
@@ -12631,10 +12640,10 @@
12631
12640
  }, [vue.createElementVNode("div", {
12632
12641
  "ref": markerRef,
12633
12642
  "class": "v-virtual-scroll__container",
12634
- "style": vue.normalizeStyle({
12643
+ "style": {
12635
12644
  paddingTop: convertToUnit(paddingTop.value),
12636
12645
  paddingBottom: convertToUnit(paddingBottom.value)
12637
- })
12646
+ }
12638
12647
  }, [children])]);
12639
12648
  });
12640
12649
  return {
@@ -13047,6 +13056,7 @@
13047
13056
  index,
13048
13057
  itemRef
13049
13058
  } = _ref2;
13059
+ const camelizedProps = camelizeProps(item.props);
13050
13060
  const itemProps = vue.mergeProps(item.props, {
13051
13061
  ref: itemRef,
13052
13062
  key: item.value,
@@ -13068,10 +13078,10 @@
13068
13078
  "modelValue": isSelected,
13069
13079
  "ripple": false,
13070
13080
  "tabindex": "-1"
13071
- }, null) : undefined, item.props.prependAvatar && vue.createVNode(VAvatar, {
13072
- "image": item.props.prependAvatar
13073
- }, null), item.props.prependIcon && vue.createVNode(VIcon, {
13074
- "icon": item.props.prependIcon
13081
+ }, null) : undefined, camelizedProps.prependAvatar && vue.createVNode(VAvatar, {
13082
+ "image": camelizedProps.prependAvatar
13083
+ }, null), camelizedProps.prependIcon && vue.createVNode(VIcon, {
13084
+ "icon": camelizedProps.prependIcon
13075
13085
  }, null)]);
13076
13086
  }
13077
13087
  });
@@ -15068,9 +15078,9 @@
15068
15078
  }, {
15069
15079
  default: () => [vue.createElementVNode("div", {
15070
15080
  "class": "v-window__container",
15071
- "style": vue.normalizeStyle({
15081
+ "style": {
15072
15082
  height: transitionHeight.value
15073
- })
15083
+ }
15074
15084
  }, [slots.default?.({
15075
15085
  group
15076
15086
  }), props.showArrows !== false && vue.createElementVNode("div", {
@@ -15165,10 +15175,10 @@
15165
15175
  } = _ref2;
15166
15176
  return vue.createElementVNode(vue.Fragment, null, [!props.hideDelimiters && vue.createElementVNode("div", {
15167
15177
  "class": "v-carousel__controls",
15168
- "style": vue.normalizeStyle({
15178
+ "style": {
15169
15179
  left: props.verticalDelimiters === 'left' && props.verticalDelimiters ? 0 : 'auto',
15170
15180
  right: props.verticalDelimiters === 'right' ? 0 : 'auto'
15171
- })
15181
+ }
15172
15182
  }, [group.items.value.length > 0 && vue.createVNode(VDefaultsProvider, {
15173
15183
  "defaults": {
15174
15184
  VBtn: {
@@ -15888,7 +15898,10 @@
15888
15898
  if (step.value <= 0) return value;
15889
15899
  const clamped = clamp(value, min.value, max.value);
15890
15900
  const offset = min.value % step.value;
15891
- const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
15901
+ let newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
15902
+ if (clamped > newValue && newValue + step.value > max.value) {
15903
+ newValue = max.value;
15904
+ }
15892
15905
  return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
15893
15906
  }
15894
15907
  return {
@@ -16144,6 +16157,8 @@
16144
16157
  } = useRtl();
16145
16158
  if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider');
16146
16159
  const {
16160
+ min,
16161
+ max,
16147
16162
  thumbColor,
16148
16163
  step,
16149
16164
  disabled,
@@ -16184,16 +16199,20 @@
16184
16199
  if (!relevantKeys.includes(e.key)) return;
16185
16200
  e.preventDefault();
16186
16201
  const _step = step.value || 0.1;
16187
- const steps = (props.max - props.min) / _step;
16202
+ const steps = (max.value - min.value) / _step;
16188
16203
  if ([left, right, down, up].includes(e.key)) {
16189
16204
  const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up];
16190
16205
  const direction = increase.includes(e.key) ? 1 : -1;
16191
16206
  const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0;
16192
- value = value + direction * _step * multipliers.value[multiplier];
16207
+ if (direction === -1 && value === max.value && !multiplier && !Number.isInteger(steps)) {
16208
+ value = value - steps % 1 * _step;
16209
+ } else {
16210
+ value = value + direction * _step * multipliers.value[multiplier];
16211
+ }
16193
16212
  } else if (e.key === home) {
16194
- value = props.min;
16213
+ value = min.value;
16195
16214
  } else if (e.key === end) {
16196
- value = props.max;
16215
+ value = max.value;
16197
16216
  } else {
16198
16217
  const direction = e.key === pagedown ? 1 : -1;
16199
16218
  value = value - direction * _step * (steps > 100 ? steps / 10 : 10);
@@ -16218,17 +16237,17 @@
16218
16237
  "role": "slider",
16219
16238
  "tabindex": disabled.value ? -1 : 0,
16220
16239
  "aria-label": props.name,
16221
- "aria-valuemin": props.min,
16222
- "aria-valuemax": props.max,
16240
+ "aria-valuemin": min.value,
16241
+ "aria-valuemax": max.value,
16223
16242
  "aria-valuenow": props.modelValue,
16224
16243
  "aria-readonly": !!readonly.value,
16225
16244
  "aria-orientation": direction.value,
16226
16245
  "onKeydown": !readonly.value ? onKeydown : undefined
16227
16246
  }, [vue.createElementVNode("div", {
16228
16247
  "class": vue.normalizeClass(['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value]),
16229
- "style": vue.normalizeStyle({
16248
+ "style": {
16230
16249
  ...textColorStyles.value
16231
- })
16250
+ }
16232
16251
  }, null), vue.withDirectives(vue.createElementVNode("div", {
16233
16252
  "class": vue.normalizeClass(['v-slider-thumb__ripple', textColorClasses.value]),
16234
16253
  "style": vue.normalizeStyle(textColorStyles.value)
@@ -16241,7 +16260,7 @@
16241
16260
  default: () => [vue.withDirectives(vue.createElementVNode("div", {
16242
16261
  "class": "v-slider-thumb__label-container"
16243
16262
  }, [vue.createElementVNode("div", {
16244
- "class": ['v-slider-thumb__label']
16263
+ "class": vue.normalizeClass(['v-slider-thumb__label', textColorClasses.value])
16245
16264
  }, [vue.createElementVNode("div", null, [slots['thumb-label']?.({
16246
16265
  modelValue: props.modelValue
16247
16266
  }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[vue.vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
@@ -16326,9 +16345,9 @@
16326
16345
  'v-slider-track__tick--first': tick.value === min.value,
16327
16346
  'v-slider-track__tick--last': tick.value === max.value
16328
16347
  }]),
16329
- "style": vue.normalizeStyle({
16348
+ "style": {
16330
16349
  [startDir.value]: directionValue
16331
- })
16350
+ }
16332
16351
  }, [(tick.label || slots['tick-label']) && vue.createElementVNode("div", {
16333
16352
  "class": "v-slider-track__tick-label"
16334
16353
  }, [slots['tick-label']?.({
@@ -16348,16 +16367,16 @@
16348
16367
  "class": vue.normalizeClass(['v-slider-track__background', trackColorClasses.value, {
16349
16368
  'v-slider-track__background--opacity': !!color.value || !trackFillColor.value
16350
16369
  }]),
16351
- "style": vue.normalizeStyle({
16370
+ "style": {
16352
16371
  ...backgroundStyles.value,
16353
16372
  ...trackColorStyles.value
16354
- })
16373
+ }
16355
16374
  }, null), vue.createElementVNode("div", {
16356
16375
  "class": vue.normalizeClass(['v-slider-track__fill', trackFillColorClasses.value]),
16357
- "style": vue.normalizeStyle({
16376
+ "style": {
16358
16377
  ...trackFillStyles.value,
16359
16378
  ...trackFillColorStyles.value
16360
- })
16379
+ }
16361
16380
  }, null), showTicks.value && vue.createElementVNode("div", {
16362
16381
  "class": vue.normalizeClass(['v-slider-track__ticks', {
16363
16382
  'v-slider-track__ticks--always-show': showTicks.value === 'always'
@@ -16559,9 +16578,9 @@
16559
16578
  }, null)]), vue.createElementVNode("div", {
16560
16579
  "class": "v-color-picker-preview__dot"
16561
16580
  }, [vue.createElementVNode("div", {
16562
- "style": vue.normalizeStyle({
16581
+ "style": {
16563
16582
  background: HSVtoCSS(props.color ?? nullColor)
16564
- })
16583
+ }
16565
16584
  }, null)]), vue.createElementVNode("div", {
16566
16585
  "class": "v-color-picker-preview__sliders"
16567
16586
  }, [vue.createVNode(VSlider, {
@@ -16962,9 +16981,9 @@
16962
16981
  "class": "v-color-picker-swatches__color",
16963
16982
  "onClick": () => hsva && emit('update:color', hsva)
16964
16983
  }, [vue.createElementVNode("div", {
16965
- "style": vue.normalizeStyle({
16984
+ "style": {
16966
16985
  background
16967
- })
16986
+ }
16968
16987
  }, [props.color && deepEqual(props.color, hsva) ? vue.createVNode(VIcon, {
16969
16988
  "size": "x-small",
16970
16989
  "icon": "$success",
@@ -17510,7 +17529,7 @@
17510
17529
  const yearStart = new Date(year, 0, 1);
17511
17530
  const size = firstWeekSize(year);
17512
17531
  const d1w1 = size >= minWeekSize ? addDays(yearStart, size - 7) : addDays(yearStart, size);
17513
- return 1 + getDiff(date, d1w1, 'weeks');
17532
+ return 1 + getDiff(endOfDay(date), startOfDay(d1w1), 'weeks');
17514
17533
  }
17515
17534
  function getDate(date) {
17516
17535
  return date.getDate();
@@ -17813,6 +17832,18 @@
17813
17832
  instance: createInstance(_options, locale)
17814
17833
  };
17815
17834
  }
17835
+ function createDateRange(adapter, start, stop) {
17836
+ const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
17837
+ const datesInRange = [start];
17838
+ for (let i = 1; i < diff; i++) {
17839
+ const nextDate = adapter.addDays(start, i);
17840
+ datesInRange.push(nextDate);
17841
+ }
17842
+ if (stop) {
17843
+ datesInRange.push(adapter.endOfDay(stop));
17844
+ }
17845
+ return datesInRange;
17846
+ }
17816
17847
  function createInstance(options, locale) {
17817
17848
  const instance = vue.reactive(typeof options.adapter === 'function'
17818
17849
  // eslint-disable-next-line new-cap
@@ -19912,7 +19943,9 @@
19912
19943
  "class": "v-data-table-footer"
19913
19944
  }, [slots.prepend?.(), vue.createElementVNode("div", {
19914
19945
  "class": "v-data-table-footer__items-per-page"
19915
- }, [vue.createElementVNode("span", null, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
19946
+ }, [vue.createElementVNode("span", {
19947
+ "aria-label": t(props.itemsPerPageText)
19948
+ }, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
19916
19949
  "items": itemsPerPageOptions.value,
19917
19950
  "modelValue": itemsPerPage.value,
19918
19951
  "onUpdate:modelValue": v => setItemsPerPage(Number(v)),
@@ -19964,18 +19997,19 @@
19964
19997
  } = _ref;
19965
19998
  const Tag = props.tag ?? 'td';
19966
19999
  return vue.createVNode(Tag, {
20000
+ "tabindex": "0",
19967
20001
  "class": vue.normalizeClass(['v-data-table__td', {
19968
20002
  'v-data-table-column--fixed': props.fixed,
19969
20003
  'v-data-table-column--last-fixed': props.lastFixed,
19970
20004
  'v-data-table-column--no-padding': props.noPadding,
19971
20005
  'v-data-table-column--nowrap': props.nowrap
19972
20006
  }, `v-data-table-column--align-${props.align}`]),
19973
- "style": vue.normalizeStyle({
20007
+ "style": {
19974
20008
  height: convertToUnit(props.height),
19975
20009
  width: convertToUnit(props.width),
19976
20010
  maxWidth: convertToUnit(props.maxWidth),
19977
20011
  left: convertToUnit(props.fixedOffset || null)
19978
- })
20012
+ }
19979
20013
  }, {
19980
20014
  default: () => [slots.default?.()]
19981
20015
  });
@@ -20308,6 +20342,11 @@
20308
20342
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20309
20343
  };
20310
20344
  }
20345
+ function handleEnterKeyPress(event, column) {
20346
+ if (event.key === 'Enter' && !props.disableSort) {
20347
+ toggleSort(column);
20348
+ }
20349
+ }
20311
20350
  function getSortIcon(column) {
20312
20351
  const item = sortBy.value.find(item => item.key === column.key);
20313
20352
  if (!item) return props.sortAscIcon;
@@ -20364,7 +20403,9 @@
20364
20403
  "nowrap": column.nowrap,
20365
20404
  "lastFixed": column.lastFixed,
20366
20405
  "noPadding": noPadding
20367
- }, headerProps), {
20406
+ }, headerProps, {
20407
+ "onKeydown": event => column.sortable && handleEnterKeyPress(event, column)
20408
+ }), {
20368
20409
  default: () => {
20369
20410
  const columnSlotName = `header.${column.key}`;
20370
20411
  const columnSlotProps = {
@@ -20500,9 +20541,9 @@
20500
20541
  });
20501
20542
  return () => vue.createElementVNode("tr", {
20502
20543
  "class": "v-data-table-group-header-row",
20503
- "style": vue.normalizeStyle({
20544
+ "style": {
20504
20545
  '--v-data-table-group-header-row-depth': props.item.depth
20505
- })
20546
+ }
20506
20547
  }, [columns.value.map(column => {
20507
20548
  if (column.key === 'data-table-group') {
20508
20549
  const icon = isGroupOpen(props.item) ? '$expand' : '$next';
@@ -20850,9 +20891,9 @@
20850
20891
  }, {
20851
20892
  default: () => [slots.top?.(), slots.default ? vue.createElementVNode("div", {
20852
20893
  "class": "v-table__wrapper",
20853
- "style": vue.normalizeStyle({
20894
+ "style": {
20854
20895
  height: convertToUnit(props.height)
20855
- })
20896
+ }
20856
20897
  }, [vue.createElementVNode("table", null, [slots.default()])]) : slots.wrapper?.(), slots.bottom?.()]
20857
20898
  }));
20858
20899
  return {};
@@ -21287,19 +21328,19 @@
21287
21328
  "onScrollPassive": handleScroll,
21288
21329
  "onScrollend": handleScrollend,
21289
21330
  "class": "v-table__wrapper",
21290
- "style": vue.normalizeStyle({
21331
+ "style": {
21291
21332
  height: convertToUnit(props.height)
21292
- })
21333
+ }
21293
21334
  }, [vue.createElementVNode("table", null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && vue.createElementVNode("thead", {
21294
21335
  "key": "thead"
21295
21336
  }, [vue.createVNode(VDataTableHeaders, dataTableHeadersProps, slots)]), slots.thead?.(slotProps.value), !props.hideDefaultBody && vue.createElementVNode("tbody", {
21296
21337
  "key": "tbody"
21297
21338
  }, [vue.createElementVNode("tr", {
21298
21339
  "ref": markerRef,
21299
- "style": vue.normalizeStyle({
21340
+ "style": {
21300
21341
  height: convertToUnit(paddingTop.value),
21301
21342
  border: 0
21302
- })
21343
+ }
21303
21344
  }, [vue.createElementVNode("td", {
21304
21345
  "colspan": columns.value.length,
21305
21346
  "style": {
@@ -21330,10 +21371,10 @@
21330
21371
  }
21331
21372
  })
21332
21373
  }), slots['body.append']?.(slotProps.value), vue.createElementVNode("tr", {
21333
- "style": vue.normalizeStyle({
21374
+ "style": {
21334
21375
  height: convertToUnit(paddingBottom.value),
21335
21376
  border: 0
21336
- })
21377
+ }
21337
21378
  }, [vue.createElementVNode("td", {
21338
21379
  "colspan": columns.value.length,
21339
21380
  "style": {
@@ -21871,10 +21912,10 @@
21871
21912
  useRender(() => {
21872
21913
  // TODO: add slot support and scope defaults
21873
21914
  return vue.createElementVNode("div", {
21874
- "class": ['v-date-picker-controls'],
21875
- "style": vue.normalizeStyle({
21915
+ "class": vue.normalizeClass(['v-date-picker-controls']),
21916
+ "style": {
21876
21917
  '--v-date-picker-controls-height': convertToUnit(props.controlHeight)
21877
- })
21918
+ }
21878
21919
  }, [vue.createVNode(VBtn, {
21879
21920
  "class": "v-date-picker-controls__month-btn",
21880
21921
  "data-testid": "month-btn",
@@ -22217,14 +22258,7 @@
22217
22258
  } else {
22218
22259
  rangeStop.value = adapter.endOfDay(_value);
22219
22260
  }
22220
- const diff = adapter.getDiff(rangeStop.value, rangeStart.value, 'days');
22221
- const datesInRange = [rangeStart.value];
22222
- for (let i = 1; i < diff; i++) {
22223
- const nextDate = adapter.addDays(rangeStart.value, i);
22224
- datesInRange.push(nextDate);
22225
- }
22226
- datesInRange.push(rangeStop.value);
22227
- model.value = datesInRange;
22261
+ model.value = createDateRange(adapter, rangeStart.value, rangeStop.value);
22228
22262
  } else {
22229
22263
  rangeStart.value = value;
22230
22264
  rangeStop.value = undefined;
@@ -22259,7 +22293,7 @@
22259
22293
  "key": "hide-week-days",
22260
22294
  "class": "v-date-picker-month__day"
22261
22295
  }, [vue.createTextVNode("\xA0")]), weekNumbers.value.map(week => vue.createElementVNode("div", {
22262
- "class": ['v-date-picker-month__day', 'v-date-picker-month__day--adjacent']
22296
+ "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__day--adjacent'])
22263
22297
  }, [week]))]), vue.createVNode(MaybeTransition, {
22264
22298
  "name": transition.value
22265
22299
  }, {
@@ -22268,7 +22302,7 @@
22268
22302
  "key": daysInMonth.value[0].date?.toString(),
22269
22303
  "class": "v-date-picker-month__days"
22270
22304
  }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
22271
- "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22305
+ "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22272
22306
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22273
22307
  const slotProps = {
22274
22308
  props: {
@@ -22310,7 +22344,8 @@
22310
22344
  min: null,
22311
22345
  max: null,
22312
22346
  modelValue: Number,
22313
- year: Number
22347
+ year: Number,
22348
+ allowedMonths: [Array, Function]
22314
22349
  }, 'VDatePickerMonths');
22315
22350
  const VDatePickerMonths = genericComponent()({
22316
22351
  name: 'VDatePickerMonths',
@@ -22332,7 +22367,7 @@
22332
22367
  }
22333
22368
  return createRange(12).map(i => {
22334
22369
  const text = adapter.format(date, 'monthShort');
22335
- const isDisabled = !!(props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
22370
+ const isDisabled = !!(!isMonthAllowed(i) || props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
22336
22371
  date = adapter.getNextMonth(date);
22337
22372
  return {
22338
22373
  isDisabled,
@@ -22344,11 +22379,20 @@
22344
22379
  vue.watchEffect(() => {
22345
22380
  model.value = model.value ?? adapter.getMonth(adapter.date());
22346
22381
  });
22382
+ function isMonthAllowed(month) {
22383
+ if (Array.isArray(props.allowedMonths) && props.allowedMonths.length) {
22384
+ return props.allowedMonths.includes(month);
22385
+ }
22386
+ if (typeof props.allowedMonths === 'function') {
22387
+ return props.allowedMonths(month);
22388
+ }
22389
+ return true;
22390
+ }
22347
22391
  useRender(() => vue.createElementVNode("div", {
22348
22392
  "class": "v-date-picker-months",
22349
- "style": vue.normalizeStyle({
22393
+ "style": {
22350
22394
  height: convertToUnit(props.height)
22351
- })
22395
+ }
22352
22396
  }, [vue.createElementVNode("div", {
22353
22397
  "class": "v-date-picker-months__content"
22354
22398
  }, [months.value.map((month, i) => {
@@ -22389,7 +22433,8 @@
22389
22433
  height: [String, Number],
22390
22434
  min: null,
22391
22435
  max: null,
22392
- modelValue: Number
22436
+ modelValue: Number,
22437
+ allowedYears: [Array, Function]
22393
22438
  }, 'VDatePickerYears');
22394
22439
  const VDatePickerYears = genericComponent()({
22395
22440
  name: 'VDatePickerYears',
@@ -22421,7 +22466,8 @@
22421
22466
  date = adapter.setYear(date, adapter.getYear(date) + 1);
22422
22467
  return {
22423
22468
  text,
22424
- value: i
22469
+ value: i,
22470
+ isDisabled: !isYearAllowed(i)
22425
22471
  };
22426
22472
  });
22427
22473
  });
@@ -22435,11 +22481,20 @@
22435
22481
  block: 'center'
22436
22482
  });
22437
22483
  });
22484
+ function isYearAllowed(year) {
22485
+ if (Array.isArray(props.allowedYears) && props.allowedYears.length) {
22486
+ return props.allowedYears.includes(year);
22487
+ }
22488
+ if (typeof props.allowedYears === 'function') {
22489
+ return props.allowedYears(year);
22490
+ }
22491
+ return true;
22492
+ }
22438
22493
  useRender(() => vue.createElementVNode("div", {
22439
22494
  "class": "v-date-picker-years",
22440
- "style": vue.normalizeStyle({
22495
+ "style": {
22441
22496
  height: convertToUnit(props.height)
22442
- })
22497
+ }
22443
22498
  }, [vue.createElementVNode("div", {
22444
22499
  "class": "v-date-picker-years__content"
22445
22500
  }, [years.value.map((year, i) => {
@@ -22449,6 +22504,7 @@
22449
22504
  color: model.value === year.value ? props.color : undefined,
22450
22505
  rounded: true,
22451
22506
  text: year.text,
22507
+ disabled: year.isDisabled,
22452
22508
  variant: model.value === year.value ? 'flat' : 'text',
22453
22509
  onClick: () => {
22454
22510
  if (model.value === year.value) {
@@ -22598,6 +22654,41 @@
22598
22654
  }
22599
22655
  return targets;
22600
22656
  });
22657
+ function isAllowedInRange(start, end) {
22658
+ const allowedDates = props.allowedDates;
22659
+ if (typeof allowedDates !== 'function') return true;
22660
+ const days = adapter.getDiff(end, start, 'days');
22661
+ for (let i = 0; i < days; i++) {
22662
+ if (allowedDates(adapter.addDays(start, i))) return true;
22663
+ }
22664
+ return false;
22665
+ }
22666
+ function allowedYears(year) {
22667
+ if (typeof props.allowedDates === 'function') {
22668
+ const startOfYear = adapter.parseISO(`${year}-01-01`);
22669
+ return isAllowedInRange(startOfYear, adapter.endOfYear(startOfYear));
22670
+ }
22671
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22672
+ for (const date of props.allowedDates) {
22673
+ if (adapter.getYear(adapter.date(date)) === year) return true;
22674
+ }
22675
+ return false;
22676
+ }
22677
+ return true;
22678
+ }
22679
+ function allowedMonths(month) {
22680
+ if (typeof props.allowedDates === 'function') {
22681
+ const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
22682
+ return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
22683
+ }
22684
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22685
+ for (const date of props.allowedDates) {
22686
+ if (adapter.getYear(adapter.date(date)) === year.value && adapter.getMonth(adapter.date(date)) === month) return true;
22687
+ }
22688
+ return false;
22689
+ }
22690
+ return true;
22691
+ }
22601
22692
 
22602
22693
  // function onClickAppend () {
22603
22694
  // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar'
@@ -22713,14 +22804,16 @@
22713
22804
  "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth],
22714
22805
  "min": minDate.value,
22715
22806
  "max": maxDate.value,
22716
- "year": year.value
22807
+ "year": year.value,
22808
+ "allowedMonths": allowedMonths
22717
22809
  }), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
22718
22810
  "key": "date-picker-years"
22719
22811
  }, datePickerYearsProps, {
22720
22812
  "modelValue": year.value,
22721
22813
  "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear],
22722
22814
  "min": minDate.value,
22723
- "max": maxDate.value
22815
+ "max": maxDate.value,
22816
+ "allowedYears": allowedYears
22724
22817
  }), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
22725
22818
  "key": "date-picker-month"
22726
22819
  }, datePickerMonthProps, {
@@ -22845,9 +22938,9 @@
22845
22938
  }, [slots.title?.() ?? props.title]), hasText && vue.createElementVNode("div", {
22846
22939
  "key": "text",
22847
22940
  "class": "v-empty-state__text",
22848
- "style": vue.normalizeStyle({
22941
+ "style": {
22849
22942
  maxWidth: convertToUnit(props.textWidth)
22850
- })
22943
+ }
22851
22944
  }, [slots.text?.() ?? props.text]), slots.default && vue.createElementVNode("div", {
22852
22945
  "key": "content",
22853
22946
  "class": "v-empty-state__content"
@@ -23252,6 +23345,56 @@
23252
23345
 
23253
23346
  // Types
23254
23347
 
23348
+ function useFileDrop() {
23349
+ function hasFilesOrFolders(e) {
23350
+ const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
23351
+ return entries.length > 0 || [...(e.dataTransfer?.files ?? [])].length > 0;
23352
+ }
23353
+ async function handleDrop(e) {
23354
+ const result = [];
23355
+ const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
23356
+ if (entries.length) {
23357
+ for (const entry of entries) {
23358
+ const files = await traverseFileTree(entry, appendIfDirectory('.', entry));
23359
+ result.push(...files.map(x => x.file));
23360
+ }
23361
+ } else {
23362
+ result.push(...[...(e.dataTransfer?.files ?? [])]);
23363
+ }
23364
+ return result;
23365
+ }
23366
+ return {
23367
+ handleDrop,
23368
+ hasFilesOrFolders
23369
+ };
23370
+ }
23371
+ function traverseFileTree(item) {
23372
+ let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
23373
+ return new Promise((resolve, reject) => {
23374
+ if (item.isFile) {
23375
+ const fileEntry = item;
23376
+ fileEntry.file(file => resolve([{
23377
+ file,
23378
+ path
23379
+ }]), reject);
23380
+ } else if (item.isDirectory) {
23381
+ const directoryReader = item.createReader();
23382
+ directoryReader.readEntries(async entries => {
23383
+ const files = [];
23384
+ for (const entry of entries) {
23385
+ files.push(...(await traverseFileTree(entry, appendIfDirectory(path, entry))));
23386
+ }
23387
+ resolve(files);
23388
+ });
23389
+ }
23390
+ });
23391
+ }
23392
+ function appendIfDirectory(path, item) {
23393
+ return item.isDirectory ? `${path}/${item.name}` : path;
23394
+ }
23395
+
23396
+ // Types
23397
+
23255
23398
  const makeVFileInputProps = propsFactory({
23256
23399
  chips: Boolean,
23257
23400
  counter: Boolean,
@@ -23336,6 +23479,10 @@
23336
23479
  const isActive = vue.toRef(() => isFocused.value || props.active);
23337
23480
  const isPlainOrUnderlined = vue.computed(() => ['plain', 'underlined'].includes(props.variant));
23338
23481
  const isDragging = vue.shallowRef(false);
23482
+ const {
23483
+ handleDrop,
23484
+ hasFilesOrFolders
23485
+ } = useFileDrop();
23339
23486
  function onFocus() {
23340
23487
  if (inputRef.value !== document.activeElement) {
23341
23488
  inputRef.value?.focus();
@@ -23369,13 +23516,13 @@
23369
23516
  e.preventDefault();
23370
23517
  isDragging.value = false;
23371
23518
  }
23372
- function onDrop(e) {
23519
+ async function onDrop(e) {
23373
23520
  e.preventDefault();
23374
23521
  e.stopImmediatePropagation();
23375
23522
  isDragging.value = false;
23376
- if (!e.dataTransfer?.files?.length || !inputRef.value) return;
23523
+ if (!inputRef.value || !hasFilesOrFolders(e)) return;
23377
23524
  const dataTransfer = new DataTransfer();
23378
- for (const file of e.dataTransfer.files) {
23525
+ for (const file of await handleDrop(e)) {
23379
23526
  dataTransfer.items.add(file);
23380
23527
  }
23381
23528
  inputRef.value.files = dataTransfer.files;
@@ -23712,9 +23859,9 @@
23712
23859
  });
23713
23860
  useRender(() => vue.createElementVNode("div", {
23714
23861
  "class": "v-infinite-scroll-intersect",
23715
- "style": vue.normalizeStyle({
23862
+ "style": {
23716
23863
  '--v-infinite-margin-size': props.rootMargin
23717
- }),
23864
+ },
23718
23865
  "ref": intersectionRef
23719
23866
  }, [vue.createTextVNode("\xA0")]));
23720
23867
  return {};
@@ -24806,6 +24953,7 @@
24806
24953
  ...makeVNumberInputProps()
24807
24954
  },
24808
24955
  emits: {
24956
+ 'update:focused': val => true,
24809
24957
  'update:modelValue': val => true
24810
24958
  },
24811
24959
  setup(props, _ref) {
@@ -24821,11 +24969,7 @@
24821
24969
  });
24822
24970
  const form = useForm(props);
24823
24971
  const controlsDisabled = vue.computed(() => form.isDisabled.value || form.isReadonly.value);
24824
- const {
24825
- isFocused,
24826
- focus,
24827
- blur
24828
- } = useFocus(props);
24972
+ const isFocused = vue.shallowRef(props.focused);
24829
24973
  function correctPrecision(val) {
24830
24974
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24831
24975
  const fixed = precision == null ? String(val) : val.toFixed(precision);
@@ -24870,22 +25014,18 @@
24870
25014
  const controlNodeDefaultHeight = vue.toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
24871
25015
  const incrementSlotProps = {
24872
25016
  props: {
24873
- style: {
24874
- touchAction: 'none'
24875
- },
24876
25017
  onClick: onControlClick,
24877
25018
  onPointerup: onControlMouseup,
24878
- onPointerdown: onUpControlMousedown
25019
+ onPointerdown: onUpControlMousedown,
25020
+ onPointercancel: onControlPointerCancel
24879
25021
  }
24880
25022
  };
24881
25023
  const decrementSlotProps = {
24882
25024
  props: {
24883
- style: {
24884
- touchAction: 'none'
24885
- },
24886
25025
  onClick: onControlClick,
24887
25026
  onPointerup: onControlMouseup,
24888
- onPointerdown: onDownControlMousedown
25027
+ onPointerdown: onDownControlMousedown,
25028
+ onPointercancel: onControlPointerCancel
24889
25029
  }
24890
25030
  };
24891
25031
  vue.watch(() => props.precision, () => formatInputValue());
@@ -24982,6 +25122,11 @@
24982
25122
  e.stopPropagation();
24983
25123
  holdStart('down');
24984
25124
  }
25125
+ function onControlPointerCancel(e) {
25126
+ const el = e.currentTarget;
25127
+ el?.releasePointerCapture(e.pointerId);
25128
+ holdStop();
25129
+ }
24985
25130
  function clampModel() {
24986
25131
  if (controlsDisabled.value) return;
24987
25132
  if (!vTextFieldRef.value) return;
@@ -25009,11 +25154,9 @@
25009
25154
  inputText.value = model.value.toString();
25010
25155
  }
25011
25156
  function onFocus() {
25012
- focus();
25013
25157
  trimDecimalZeros();
25014
25158
  }
25015
25159
  function onBlur() {
25016
- blur();
25017
25160
  clampModel();
25018
25161
  }
25019
25162
  useRender(() => {
@@ -25033,8 +25176,8 @@
25033
25176
  "onClick": onControlClick,
25034
25177
  "onPointerdown": onUpControlMousedown,
25035
25178
  "onPointerup": onControlMouseup,
25179
+ "onPointercancel": onControlPointerCancel,
25036
25180
  "size": controlNodeSize.value,
25037
- "style": "touch-action: none",
25038
25181
  "tabindex": "-1"
25039
25182
  }, null) : vue.createVNode(VDefaultsProvider, {
25040
25183
  "key": "increment-defaults",
@@ -25063,8 +25206,8 @@
25063
25206
  "onClick": onControlClick,
25064
25207
  "onPointerdown": onDownControlMousedown,
25065
25208
  "onPointerup": onControlMouseup,
25209
+ "onPointercancel": onControlPointerCancel,
25066
25210
  "size": controlNodeSize.value,
25067
- "style": "touch-action: none",
25068
25211
  "tabindex": "-1"
25069
25212
  }, null) : vue.createVNode(VDefaultsProvider, {
25070
25213
  "key": "decrement-defaults",
@@ -25106,9 +25249,12 @@
25106
25249
  }, null)]) : props.reverse && controlVariant.value !== 'hidden' ? vue.createElementVNode(vue.Fragment, null, [controlNode(), dividerNode()]) : undefined;
25107
25250
  const hasPrependInner = slots['prepend-inner'] || prependInnerControl;
25108
25251
  return vue.createVNode(VTextField, vue.mergeProps({
25109
- "ref": vTextFieldRef,
25252
+ "ref": vTextFieldRef
25253
+ }, textFieldProps, {
25110
25254
  "modelValue": inputText.value,
25111
25255
  "onUpdate:modelValue": $event => inputText.value = $event,
25256
+ "focused": isFocused.value,
25257
+ "onUpdate:focused": $event => isFocused.value = $event,
25112
25258
  "validationValue": model.value,
25113
25259
  "onBeforeinput": onBeforeinput,
25114
25260
  "onFocus": onFocus,
@@ -25121,8 +25267,7 @@
25121
25267
  'v-number-input--reverse': props.reverse,
25122
25268
  'v-number-input--split': controlVariant.value === 'split',
25123
25269
  'v-number-input--stacked': controlVariant.value === 'stacked'
25124
- }, props.class]
25125
- }, textFieldProps, {
25270
+ }, props.class],
25126
25271
  "style": props.style,
25127
25272
  "inputmode": "decimal"
25128
25273
  }), {
@@ -25257,7 +25402,7 @@
25257
25402
  function onPaste(index, e) {
25258
25403
  e.preventDefault();
25259
25404
  e.stopPropagation();
25260
- const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25405
+ const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25261
25406
  if (isValidNumber(clipboardText)) return;
25262
25407
  model.value = clipboardText.split('');
25263
25408
  inputRef.value?.[index].blur();
@@ -25289,7 +25434,10 @@
25289
25434
  scoped: true
25290
25435
  });
25291
25436
  vue.watch(model, val => {
25292
- if (val.length === length.value) emit('finish', val.join(''));
25437
+ if (val.length === length.value) {
25438
+ focusIndex.value = length.value - 1;
25439
+ emit('finish', val.join(''));
25440
+ }
25293
25441
  }, {
25294
25442
  deep: true
25295
25443
  });
@@ -25324,7 +25472,7 @@
25324
25472
  "aria-label": t(props.label, i + 1),
25325
25473
  "autofocus": i === 0 && props.autofocus,
25326
25474
  "autocomplete": "one-time-code",
25327
- "class": ['v-otp-input__field'],
25475
+ "class": vue.normalizeClass(['v-otp-input__field']),
25328
25476
  "disabled": props.disabled,
25329
25477
  "inputmode": props.type === 'number' ? 'numeric' : 'text',
25330
25478
  "min": props.type === 'number' ? 0 : undefined,
@@ -29180,13 +29328,9 @@
29180
29328
  let {
29181
29329
  slots
29182
29330
  } = _ref;
29183
- const {
29184
- isFocused,
29185
- focus,
29186
- blur
29187
- } = useFocus(props);
29188
29331
  const model = useProxiedModel(props, 'modelValue');
29189
29332
  const menu = vue.shallowRef(false);
29333
+ const isFocused = vue.shallowRef(props.focused);
29190
29334
  const isInteractive = vue.computed(() => !props.disabled && !props.readonly);
29191
29335
  const display = vue.computed(() => model.value || null);
29192
29336
  function onKeydown(e) {
@@ -29217,10 +29361,9 @@
29217
29361
  "modelValue": display.value,
29218
29362
  "onKeydown": isInteractive.value ? onKeydown : undefined,
29219
29363
  "focused": menu.value || isFocused.value,
29220
- "onFocus": focus,
29221
- "onBlur": blur,
29222
29364
  "onClick:control": isInteractive.value ? onClick : undefined,
29223
29365
  "onClick:prependInner": isInteractive.value ? onClick : undefined,
29366
+ "onUpdate:focused": event => isFocused.value = event,
29224
29367
  "onClick:appendInner": isInteractive.value ? onClick : undefined,
29225
29368
  "onUpdate:modelValue": val => {
29226
29369
  model.value = val;
@@ -29424,6 +29567,7 @@
29424
29567
  emits: {
29425
29568
  save: value => true,
29426
29569
  cancel: () => true,
29570
+ 'update:focused': val => true,
29427
29571
  'update:modelValue': val => true,
29428
29572
  'update:menu': val => true
29429
29573
  },
@@ -29446,15 +29590,11 @@
29446
29590
  const {
29447
29591
  mobile
29448
29592
  } = useDisplay(props);
29449
- const {
29450
- isFocused,
29451
- focus,
29452
- blur
29453
- } = useFocus(props);
29454
29593
  const emptyModelValue = () => props.multiple ? [] : null;
29455
29594
  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);
29456
29595
  const menu = useProxiedModel(props, 'menu');
29457
29596
  const isEditingInput = vue.shallowRef(false);
29597
+ const isFocused = vue.shallowRef(props.focused);
29458
29598
  const vTextFieldRef = vue.ref();
29459
29599
  const disabledActions = vue.ref(['save']);
29460
29600
  function format(date) {
@@ -29530,7 +29670,6 @@
29530
29670
  if (props.updateOn.includes('blur')) {
29531
29671
  onUserInput(e.target);
29532
29672
  }
29533
- blur();
29534
29673
 
29535
29674
  // When in mobile mode and editing is done (due to keyboard dismissal), close the menu
29536
29675
  if (mobile.value && isEditingInput.value && !isFocused.value) {
@@ -29552,18 +29691,14 @@
29552
29691
  const parts = value.trim().split(/\D+-\D+|[^\d\-/.]+/);
29553
29692
  if (parts.every(isValid)) {
29554
29693
  if (props.multiple === 'range') {
29555
- model.value = getRange(parts);
29694
+ const [start, stop] = parts.map(parseDate).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
29695
+ model.value = createDateRange(adapter, start, stop);
29556
29696
  } else {
29557
29697
  model.value = parts.map(parseDate);
29558
29698
  }
29559
29699
  }
29560
29700
  }
29561
29701
  }
29562
- function getRange(inputDates) {
29563
- const [start, stop] = inputDates.map(parseDate).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
29564
- const diff = adapter.getDiff(stop ?? start, start, 'days');
29565
- return [start, ...createRange(diff, 1).map(i => adapter.addDays(start, i))];
29566
- }
29567
29702
  useRender(() => {
29568
29703
  const confirmEditProps = VConfirmEdit.filterProps(props);
29569
29704
  const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
@@ -29579,12 +29714,12 @@
29579
29714
  "readonly": isReadonly.value,
29580
29715
  "onKeydown": isInteractive.value ? onKeydown : undefined,
29581
29716
  "focused": menu.value || isFocused.value,
29582
- "onFocus": focus,
29583
29717
  "onBlur": onBlur,
29584
29718
  "validationValue": model.value,
29585
29719
  "onClick:control": isInteractive.value ? onClick : undefined,
29586
29720
  "onClick:prepend": isInteractive.value ? onClick : undefined,
29587
- "onUpdate:modelValue": onUpdateDisplayModel
29721
+ "onUpdate:modelValue": onUpdateDisplayModel,
29722
+ "onUpdate:focused": event => isFocused.value = event
29588
29723
  }), {
29589
29724
  ...slots,
29590
29725
  default: () => vue.createElementVNode(vue.Fragment, null, [vue.createVNode(VMenu, {
@@ -29799,6 +29934,9 @@
29799
29934
  const isDragging = vue.shallowRef(false);
29800
29935
  const vSheetRef = vue.ref(null);
29801
29936
  const inputRef = vue.ref(null);
29937
+ const {
29938
+ handleDrop
29939
+ } = useFileDrop();
29802
29940
  function onDragover(e) {
29803
29941
  e.preventDefault();
29804
29942
  e.stopImmediatePropagation();
@@ -29808,13 +29946,13 @@
29808
29946
  e.preventDefault();
29809
29947
  isDragging.value = false;
29810
29948
  }
29811
- function onDrop(e) {
29949
+ async function onDrop(e) {
29812
29950
  e.preventDefault();
29813
29951
  e.stopImmediatePropagation();
29814
29952
  isDragging.value = false;
29815
- if (!e.dataTransfer?.files?.length || !inputRef.value) return;
29953
+ if (!inputRef.value) return;
29816
29954
  const dataTransfer = new DataTransfer();
29817
- for (const file of e.dataTransfer.files) {
29955
+ for (const file of await handleDrop(e)) {
29818
29956
  dataTransfer.items.add(file);
29819
29957
  }
29820
29958
  inputRef.value.files = dataTransfer.files;
@@ -30440,7 +30578,7 @@
30440
30578
  });
30441
30579
  useRender(() => {
30442
30580
  return vue.createElementVNode("div", {
30443
- "class": ['v-pull-to-refresh'],
30581
+ "class": vue.normalizeClass(['v-pull-to-refresh']),
30444
30582
  "onTouchstart": onTouchstart,
30445
30583
  "onTouchmove": onTouchmove,
30446
30584
  "onTouchend": onTouchend,
@@ -30453,16 +30591,16 @@
30453
30591
  "class": vue.normalizeClass(['v-pull-to-refresh__pull-down', {
30454
30592
  'v-pull-to-refresh__pull-down--touching': touching.value
30455
30593
  }]),
30456
- "style": vue.normalizeStyle({
30594
+ "style": {
30457
30595
  top: convertToUnit(-1 * props.pullDownThreshold + topOffset.value),
30458
30596
  height: convertToUnit(props.pullDownThreshold)
30459
- })
30597
+ }
30460
30598
  }, [slots.pullDownPanel ? slots.pullDownPanel({
30461
30599
  canRefresh: canRefresh.value,
30462
30600
  goingUp: goingUp.value,
30463
30601
  refreshing: refreshing.value
30464
30602
  }) : vue.createElementVNode("div", {
30465
- "class": ['v-pull-to-refresh__pull-down-default']
30603
+ "class": vue.normalizeClass(['v-pull-to-refresh__pull-down-default'])
30466
30604
  }, [refreshing.value ? vue.createVNode(VProgressCircular, {
30467
30605
  "indeterminate": true,
30468
30606
  "active": false
@@ -30472,9 +30610,9 @@
30472
30610
  "class": vue.normalizeClass(['v-pull-to-refresh__scroll-container', {
30473
30611
  'v-pull-to-refresh__scroll-container--touching': touching.value
30474
30612
  }]),
30475
- "style": vue.normalizeStyle({
30613
+ "style": {
30476
30614
  top: convertToUnit(topOffset.value)
30477
- })
30615
+ }
30478
30616
  }, [slots.default?.()])]);
30479
30617
  });
30480
30618
  }
@@ -32015,7 +32153,7 @@
32015
32153
  };
32016
32154
  });
32017
32155
  }
32018
- const version$1 = "3.8.7";
32156
+ const version$1 = "3.8.9";
32019
32157
  createVuetify$1.version = version$1;
32020
32158
 
32021
32159
  // Vue's inject() can only be used in setup
@@ -32313,7 +32451,7 @@
32313
32451
 
32314
32452
  /* eslint-disable local-rules/sort-imports */
32315
32453
 
32316
- const version = "3.8.7";
32454
+ const version = "3.8.9";
32317
32455
 
32318
32456
  /* eslint-disable local-rules/sort-imports */
32319
32457