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
package/dist/vuetify.js CHANGED
@@ -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
  */
@@ -529,6 +529,13 @@
529
529
  }
530
530
  return cleanText;
531
531
  }
532
+ function camelizeProps(props) {
533
+ const out = {};
534
+ for (const prop in props) {
535
+ out[vue.camelize(prop)] = props[prop];
536
+ }
537
+ return out;
538
+ }
532
539
 
533
540
  // Utilities
534
541
  const block = ['top', 'bottom'];
@@ -4039,9 +4046,9 @@
4039
4046
  if (!normalisedSrc.value.src || state.value === 'idle') return null;
4040
4047
  const img = vue.createElementVNode("img", {
4041
4048
  "class": vue.normalizeClass(['v-img__img', containClasses.value]),
4042
- "style": vue.normalizeStyle({
4049
+ "style": {
4043
4050
  objectPosition: props.position
4044
- }),
4051
+ },
4045
4052
  "crossorigin": props.crossorigin,
4046
4053
  "src": normalisedSrc.value.src,
4047
4054
  "srcset": normalisedSrc.value.srcset,
@@ -4068,9 +4075,9 @@
4068
4075
  }, {
4069
4076
  default: () => [normalisedSrc.value.lazySrc && state.value !== 'loaded' && vue.createElementVNode("img", {
4070
4077
  "class": vue.normalizeClass(['v-img__img', 'v-img__img--preload', containClasses.value]),
4071
- "style": vue.normalizeStyle({
4078
+ "style": {
4072
4079
  objectPosition: props.position
4073
- }),
4080
+ },
4074
4081
  "crossorigin": props.crossorigin,
4075
4082
  "src": normalisedSrc.value.lazySrc,
4076
4083
  "alt": props.alt,
@@ -4104,9 +4111,9 @@
4104
4111
  if (!props.gradient) return null;
4105
4112
  return vue.createElementVNode("div", {
4106
4113
  "class": "v-img__gradient",
4107
- "style": vue.normalizeStyle({
4114
+ "style": {
4108
4115
  backgroundImage: `linear-gradient(${props.gradient})`
4109
- })
4116
+ }
4110
4117
  }, null);
4111
4118
  };
4112
4119
  const isBooted = vue.shallowRef(false);
@@ -4317,9 +4324,9 @@
4317
4324
  }, {
4318
4325
  default: () => [vue.createElementVNode("div", {
4319
4326
  "class": "v-toolbar__content",
4320
- "style": vue.normalizeStyle({
4327
+ "style": {
4321
4328
  height: convertToUnit(contentHeight.value)
4322
- })
4329
+ }
4323
4330
  }, [slots.prepend && vue.createElementVNode("div", {
4324
4331
  "class": "v-toolbar__prepend"
4325
4332
  }, [slots.prepend?.()]), hasTitle && vue.createVNode(VToolbarTitle, {
@@ -4340,9 +4347,9 @@
4340
4347
  default: () => [vue.createVNode(VExpandTransition, null, {
4341
4348
  default: () => [isExtended.value && vue.createElementVNode("div", {
4342
4349
  "class": "v-toolbar__extension",
4343
- "style": vue.normalizeStyle({
4350
+ "style": {
4344
4351
  height: convertToUnit(extensionHeight.value)
4345
- })
4352
+ }
4346
4353
  }, [extension])]
4347
4354
  })]
4348
4355
  })]
@@ -5206,9 +5213,9 @@
5206
5213
  "aria-valuenow": props.indeterminate ? undefined : normalizedValue.value
5207
5214
  }, {
5208
5215
  default: () => [vue.createElementVNode("svg", {
5209
- "style": vue.normalizeStyle({
5216
+ "style": {
5210
5217
  transform: `rotate(calc(-90deg + ${Number(props.rotate)}deg))`
5211
- }),
5218
+ },
5212
5219
  "xmlns": "http://www.w3.org/2000/svg",
5213
5220
  "viewBox": `0 0 ${diameter.value} ${diameter.value}`
5214
5221
  }, [vue.createElementVNode("circle", {
@@ -5429,7 +5436,7 @@
5429
5436
  default: () => [props.stream && vue.createElementVNode("div", {
5430
5437
  "key": "stream",
5431
5438
  "class": vue.normalizeClass(['v-progress-linear__stream', textColorClasses.value]),
5432
- "style": vue.normalizeStyle({
5439
+ "style": {
5433
5440
  ...textColorStyles.value,
5434
5441
  [isReversed.value ? 'left' : 'right']: convertToUnit(-height.value),
5435
5442
  borderTop: `${convertToUnit(height.value / 2)} dotted`,
@@ -5437,7 +5444,7 @@
5437
5444
  top: `calc(50% - ${convertToUnit(height.value / 4)})`,
5438
5445
  width: convertToUnit(100 - normalizedBuffer.value, '%'),
5439
5446
  '--v-progress-linear-stream-to': convertToUnit(height.value * (isReversed.value ? 1 : -1))
5440
- })
5447
+ }
5441
5448
  }, null), vue.createElementVNode("div", {
5442
5449
  "class": vue.normalizeClass(['v-progress-linear__background', !isForcedColorsModeActive ? backgroundColorClasses.value : undefined]),
5443
5450
  "style": vue.normalizeStyle([backgroundColorStyles.value, {
@@ -6745,7 +6752,7 @@
6745
6752
  backgroundColorClasses,
6746
6753
  backgroundColorStyles
6747
6754
  }), vue.withDirectives(vue.createElementVNode("div", {
6748
- "class": ['v-selection-control__input']
6755
+ "class": vue.normalizeClass(['v-selection-control__input'])
6749
6756
  }, [slots.input?.({
6750
6757
  model,
6751
6758
  textColorClasses,
@@ -8378,6 +8385,7 @@
8378
8385
  const isClickable = vue.computed(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value));
8379
8386
  const closeProps = vue.toRef(() => ({
8380
8387
  'aria-label': t(props.closeLabel),
8388
+ disabled: props.disabled,
8381
8389
  onClick(e) {
8382
8390
  e.preventDefault();
8383
8391
  e.stopPropagation();
@@ -12387,10 +12395,12 @@
12387
12395
  const inputRef = vue.ref();
12388
12396
  const isActive = vue.computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value || props.active);
12389
12397
  function onFocus() {
12390
- if (inputRef.value !== document.activeElement) {
12391
- inputRef.value?.focus();
12392
- }
12393
12398
  if (!isFocused.value) focus();
12399
+ vue.nextTick(() => {
12400
+ if (inputRef.value !== document.activeElement) {
12401
+ inputRef.value?.focus();
12402
+ }
12403
+ });
12394
12404
  }
12395
12405
  function onControlMousedown(e) {
12396
12406
  emit('mousedown:control', e);
@@ -12399,7 +12409,6 @@
12399
12409
  e.preventDefault();
12400
12410
  }
12401
12411
  function onControlClick(e) {
12402
- onFocus();
12403
12412
  emit('click:control', e);
12404
12413
  }
12405
12414
  function onClear(e, reset) {
@@ -12892,14 +12901,14 @@
12892
12901
  return props.renderless ? vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("div", {
12893
12902
  "ref": markerRef,
12894
12903
  "class": "v-virtual-scroll__spacer",
12895
- "style": vue.normalizeStyle({
12904
+ "style": {
12896
12905
  paddingTop: convertToUnit(paddingTop.value)
12897
- })
12906
+ }
12898
12907
  }, null), children, vue.createElementVNode("div", {
12899
12908
  "class": "v-virtual-scroll__spacer",
12900
- "style": vue.normalizeStyle({
12909
+ "style": {
12901
12910
  paddingBottom: convertToUnit(paddingBottom.value)
12902
- })
12911
+ }
12903
12912
  }, null)]) : vue.createElementVNode("div", {
12904
12913
  "ref": containerRef,
12905
12914
  "class": vue.normalizeClass(['v-virtual-scroll', props.class]),
@@ -12909,10 +12918,10 @@
12909
12918
  }, [vue.createElementVNode("div", {
12910
12919
  "ref": markerRef,
12911
12920
  "class": "v-virtual-scroll__container",
12912
- "style": vue.normalizeStyle({
12921
+ "style": {
12913
12922
  paddingTop: convertToUnit(paddingTop.value),
12914
12923
  paddingBottom: convertToUnit(paddingBottom.value)
12915
- })
12924
+ }
12916
12925
  }, [children])]);
12917
12926
  });
12918
12927
  return {
@@ -13325,6 +13334,7 @@
13325
13334
  index,
13326
13335
  itemRef
13327
13336
  } = _ref2;
13337
+ const camelizedProps = camelizeProps(item.props);
13328
13338
  const itemProps = vue.mergeProps(item.props, {
13329
13339
  ref: itemRef,
13330
13340
  key: item.value,
@@ -13346,10 +13356,10 @@
13346
13356
  "modelValue": isSelected,
13347
13357
  "ripple": false,
13348
13358
  "tabindex": "-1"
13349
- }, null) : undefined, item.props.prependAvatar && vue.createVNode(VAvatar, {
13350
- "image": item.props.prependAvatar
13351
- }, null), item.props.prependIcon && vue.createVNode(VIcon, {
13352
- "icon": item.props.prependIcon
13359
+ }, null) : undefined, camelizedProps.prependAvatar && vue.createVNode(VAvatar, {
13360
+ "image": camelizedProps.prependAvatar
13361
+ }, null), camelizedProps.prependIcon && vue.createVNode(VIcon, {
13362
+ "icon": camelizedProps.prependIcon
13353
13363
  }, null)]);
13354
13364
  }
13355
13365
  });
@@ -15346,9 +15356,9 @@
15346
15356
  }, {
15347
15357
  default: () => [vue.createElementVNode("div", {
15348
15358
  "class": "v-window__container",
15349
- "style": vue.normalizeStyle({
15359
+ "style": {
15350
15360
  height: transitionHeight.value
15351
- })
15361
+ }
15352
15362
  }, [slots.default?.({
15353
15363
  group
15354
15364
  }), props.showArrows !== false && vue.createElementVNode("div", {
@@ -15443,10 +15453,10 @@
15443
15453
  } = _ref2;
15444
15454
  return vue.createElementVNode(vue.Fragment, null, [!props.hideDelimiters && vue.createElementVNode("div", {
15445
15455
  "class": "v-carousel__controls",
15446
- "style": vue.normalizeStyle({
15456
+ "style": {
15447
15457
  left: props.verticalDelimiters === 'left' && props.verticalDelimiters ? 0 : 'auto',
15448
15458
  right: props.verticalDelimiters === 'right' ? 0 : 'auto'
15449
- })
15459
+ }
15450
15460
  }, [group.items.value.length > 0 && vue.createVNode(VDefaultsProvider, {
15451
15461
  "defaults": {
15452
15462
  VBtn: {
@@ -16166,7 +16176,10 @@
16166
16176
  if (step.value <= 0) return value;
16167
16177
  const clamped = clamp(value, min.value, max.value);
16168
16178
  const offset = min.value % step.value;
16169
- const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
16179
+ let newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
16180
+ if (clamped > newValue && newValue + step.value > max.value) {
16181
+ newValue = max.value;
16182
+ }
16170
16183
  return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
16171
16184
  }
16172
16185
  return {
@@ -16422,6 +16435,8 @@
16422
16435
  } = useRtl();
16423
16436
  if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider');
16424
16437
  const {
16438
+ min,
16439
+ max,
16425
16440
  thumbColor,
16426
16441
  step,
16427
16442
  disabled,
@@ -16462,16 +16477,20 @@
16462
16477
  if (!relevantKeys.includes(e.key)) return;
16463
16478
  e.preventDefault();
16464
16479
  const _step = step.value || 0.1;
16465
- const steps = (props.max - props.min) / _step;
16480
+ const steps = (max.value - min.value) / _step;
16466
16481
  if ([left, right, down, up].includes(e.key)) {
16467
16482
  const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up];
16468
16483
  const direction = increase.includes(e.key) ? 1 : -1;
16469
16484
  const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0;
16470
- value = value + direction * _step * multipliers.value[multiplier];
16485
+ if (direction === -1 && value === max.value && !multiplier && !Number.isInteger(steps)) {
16486
+ value = value - steps % 1 * _step;
16487
+ } else {
16488
+ value = value + direction * _step * multipliers.value[multiplier];
16489
+ }
16471
16490
  } else if (e.key === home) {
16472
- value = props.min;
16491
+ value = min.value;
16473
16492
  } else if (e.key === end) {
16474
- value = props.max;
16493
+ value = max.value;
16475
16494
  } else {
16476
16495
  const direction = e.key === pagedown ? 1 : -1;
16477
16496
  value = value - direction * _step * (steps > 100 ? steps / 10 : 10);
@@ -16496,17 +16515,17 @@
16496
16515
  "role": "slider",
16497
16516
  "tabindex": disabled.value ? -1 : 0,
16498
16517
  "aria-label": props.name,
16499
- "aria-valuemin": props.min,
16500
- "aria-valuemax": props.max,
16518
+ "aria-valuemin": min.value,
16519
+ "aria-valuemax": max.value,
16501
16520
  "aria-valuenow": props.modelValue,
16502
16521
  "aria-readonly": !!readonly.value,
16503
16522
  "aria-orientation": direction.value,
16504
16523
  "onKeydown": !readonly.value ? onKeydown : undefined
16505
16524
  }, [vue.createElementVNode("div", {
16506
16525
  "class": vue.normalizeClass(['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value]),
16507
- "style": vue.normalizeStyle({
16526
+ "style": {
16508
16527
  ...textColorStyles.value
16509
- })
16528
+ }
16510
16529
  }, null), vue.withDirectives(vue.createElementVNode("div", {
16511
16530
  "class": vue.normalizeClass(['v-slider-thumb__ripple', textColorClasses.value]),
16512
16531
  "style": vue.normalizeStyle(textColorStyles.value)
@@ -16519,7 +16538,7 @@
16519
16538
  default: () => [vue.withDirectives(vue.createElementVNode("div", {
16520
16539
  "class": "v-slider-thumb__label-container"
16521
16540
  }, [vue.createElementVNode("div", {
16522
- "class": ['v-slider-thumb__label']
16541
+ "class": vue.normalizeClass(['v-slider-thumb__label', textColorClasses.value])
16523
16542
  }, [vue.createElementVNode("div", null, [slots['thumb-label']?.({
16524
16543
  modelValue: props.modelValue
16525
16544
  }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[vue.vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
@@ -16604,9 +16623,9 @@
16604
16623
  'v-slider-track__tick--first': tick.value === min.value,
16605
16624
  'v-slider-track__tick--last': tick.value === max.value
16606
16625
  }]),
16607
- "style": vue.normalizeStyle({
16626
+ "style": {
16608
16627
  [startDir.value]: directionValue
16609
- })
16628
+ }
16610
16629
  }, [(tick.label || slots['tick-label']) && vue.createElementVNode("div", {
16611
16630
  "class": "v-slider-track__tick-label"
16612
16631
  }, [slots['tick-label']?.({
@@ -16626,16 +16645,16 @@
16626
16645
  "class": vue.normalizeClass(['v-slider-track__background', trackColorClasses.value, {
16627
16646
  'v-slider-track__background--opacity': !!color.value || !trackFillColor.value
16628
16647
  }]),
16629
- "style": vue.normalizeStyle({
16648
+ "style": {
16630
16649
  ...backgroundStyles.value,
16631
16650
  ...trackColorStyles.value
16632
- })
16651
+ }
16633
16652
  }, null), vue.createElementVNode("div", {
16634
16653
  "class": vue.normalizeClass(['v-slider-track__fill', trackFillColorClasses.value]),
16635
- "style": vue.normalizeStyle({
16654
+ "style": {
16636
16655
  ...trackFillStyles.value,
16637
16656
  ...trackFillColorStyles.value
16638
- })
16657
+ }
16639
16658
  }, null), showTicks.value && vue.createElementVNode("div", {
16640
16659
  "class": vue.normalizeClass(['v-slider-track__ticks', {
16641
16660
  'v-slider-track__ticks--always-show': showTicks.value === 'always'
@@ -16837,9 +16856,9 @@
16837
16856
  }, null)]), vue.createElementVNode("div", {
16838
16857
  "class": "v-color-picker-preview__dot"
16839
16858
  }, [vue.createElementVNode("div", {
16840
- "style": vue.normalizeStyle({
16859
+ "style": {
16841
16860
  background: HSVtoCSS(props.color ?? nullColor)
16842
- })
16861
+ }
16843
16862
  }, null)]), vue.createElementVNode("div", {
16844
16863
  "class": "v-color-picker-preview__sliders"
16845
16864
  }, [vue.createVNode(VSlider, {
@@ -17240,9 +17259,9 @@
17240
17259
  "class": "v-color-picker-swatches__color",
17241
17260
  "onClick": () => hsva && emit('update:color', hsva)
17242
17261
  }, [vue.createElementVNode("div", {
17243
- "style": vue.normalizeStyle({
17262
+ "style": {
17244
17263
  background
17245
- })
17264
+ }
17246
17265
  }, [props.color && deepEqual(props.color, hsva) ? vue.createVNode(VIcon, {
17247
17266
  "size": "x-small",
17248
17267
  "icon": "$success",
@@ -17788,7 +17807,7 @@
17788
17807
  const yearStart = new Date(year, 0, 1);
17789
17808
  const size = firstWeekSize(year);
17790
17809
  const d1w1 = size >= minWeekSize ? addDays(yearStart, size - 7) : addDays(yearStart, size);
17791
- return 1 + getDiff(date, d1w1, 'weeks');
17810
+ return 1 + getDiff(endOfDay(date), startOfDay(d1w1), 'weeks');
17792
17811
  }
17793
17812
  function getDate(date) {
17794
17813
  return date.getDate();
@@ -18091,6 +18110,18 @@
18091
18110
  instance: createInstance(_options, locale)
18092
18111
  };
18093
18112
  }
18113
+ function createDateRange(adapter, start, stop) {
18114
+ const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18115
+ const datesInRange = [start];
18116
+ for (let i = 1; i < diff; i++) {
18117
+ const nextDate = adapter.addDays(start, i);
18118
+ datesInRange.push(nextDate);
18119
+ }
18120
+ if (stop) {
18121
+ datesInRange.push(adapter.endOfDay(stop));
18122
+ }
18123
+ return datesInRange;
18124
+ }
18094
18125
  function createInstance(options, locale) {
18095
18126
  const instance = vue.reactive(typeof options.adapter === 'function'
18096
18127
  // eslint-disable-next-line new-cap
@@ -20190,7 +20221,9 @@
20190
20221
  "class": "v-data-table-footer"
20191
20222
  }, [slots.prepend?.(), vue.createElementVNode("div", {
20192
20223
  "class": "v-data-table-footer__items-per-page"
20193
- }, [vue.createElementVNode("span", null, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
20224
+ }, [vue.createElementVNode("span", {
20225
+ "aria-label": t(props.itemsPerPageText)
20226
+ }, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
20194
20227
  "items": itemsPerPageOptions.value,
20195
20228
  "modelValue": itemsPerPage.value,
20196
20229
  "onUpdate:modelValue": v => setItemsPerPage(Number(v)),
@@ -20242,18 +20275,19 @@
20242
20275
  } = _ref;
20243
20276
  const Tag = props.tag ?? 'td';
20244
20277
  return vue.createVNode(Tag, {
20278
+ "tabindex": "0",
20245
20279
  "class": vue.normalizeClass(['v-data-table__td', {
20246
20280
  'v-data-table-column--fixed': props.fixed,
20247
20281
  'v-data-table-column--last-fixed': props.lastFixed,
20248
20282
  'v-data-table-column--no-padding': props.noPadding,
20249
20283
  'v-data-table-column--nowrap': props.nowrap
20250
20284
  }, `v-data-table-column--align-${props.align}`]),
20251
- "style": vue.normalizeStyle({
20285
+ "style": {
20252
20286
  height: convertToUnit(props.height),
20253
20287
  width: convertToUnit(props.width),
20254
20288
  maxWidth: convertToUnit(props.maxWidth),
20255
20289
  left: convertToUnit(props.fixedOffset || null)
20256
- })
20290
+ }
20257
20291
  }, {
20258
20292
  default: () => [slots.default?.()]
20259
20293
  });
@@ -20586,6 +20620,11 @@
20586
20620
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20587
20621
  };
20588
20622
  }
20623
+ function handleEnterKeyPress(event, column) {
20624
+ if (event.key === 'Enter' && !props.disableSort) {
20625
+ toggleSort(column);
20626
+ }
20627
+ }
20589
20628
  function getSortIcon(column) {
20590
20629
  const item = sortBy.value.find(item => item.key === column.key);
20591
20630
  if (!item) return props.sortAscIcon;
@@ -20642,7 +20681,9 @@
20642
20681
  "nowrap": column.nowrap,
20643
20682
  "lastFixed": column.lastFixed,
20644
20683
  "noPadding": noPadding
20645
- }, headerProps), {
20684
+ }, headerProps, {
20685
+ "onKeydown": event => column.sortable && handleEnterKeyPress(event, column)
20686
+ }), {
20646
20687
  default: () => {
20647
20688
  const columnSlotName = `header.${column.key}`;
20648
20689
  const columnSlotProps = {
@@ -20778,9 +20819,9 @@
20778
20819
  });
20779
20820
  return () => vue.createElementVNode("tr", {
20780
20821
  "class": "v-data-table-group-header-row",
20781
- "style": vue.normalizeStyle({
20822
+ "style": {
20782
20823
  '--v-data-table-group-header-row-depth': props.item.depth
20783
- })
20824
+ }
20784
20825
  }, [columns.value.map(column => {
20785
20826
  if (column.key === 'data-table-group') {
20786
20827
  const icon = isGroupOpen(props.item) ? '$expand' : '$next';
@@ -21128,9 +21169,9 @@
21128
21169
  }, {
21129
21170
  default: () => [slots.top?.(), slots.default ? vue.createElementVNode("div", {
21130
21171
  "class": "v-table__wrapper",
21131
- "style": vue.normalizeStyle({
21172
+ "style": {
21132
21173
  height: convertToUnit(props.height)
21133
- })
21174
+ }
21134
21175
  }, [vue.createElementVNode("table", null, [slots.default()])]) : slots.wrapper?.(), slots.bottom?.()]
21135
21176
  }));
21136
21177
  return {};
@@ -21565,19 +21606,19 @@
21565
21606
  "onScrollPassive": handleScroll,
21566
21607
  "onScrollend": handleScrollend,
21567
21608
  "class": "v-table__wrapper",
21568
- "style": vue.normalizeStyle({
21609
+ "style": {
21569
21610
  height: convertToUnit(props.height)
21570
- })
21611
+ }
21571
21612
  }, [vue.createElementVNode("table", null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && vue.createElementVNode("thead", {
21572
21613
  "key": "thead"
21573
21614
  }, [vue.createVNode(VDataTableHeaders, dataTableHeadersProps, slots)]), slots.thead?.(slotProps.value), !props.hideDefaultBody && vue.createElementVNode("tbody", {
21574
21615
  "key": "tbody"
21575
21616
  }, [vue.createElementVNode("tr", {
21576
21617
  "ref": markerRef,
21577
- "style": vue.normalizeStyle({
21618
+ "style": {
21578
21619
  height: convertToUnit(paddingTop.value),
21579
21620
  border: 0
21580
- })
21621
+ }
21581
21622
  }, [vue.createElementVNode("td", {
21582
21623
  "colspan": columns.value.length,
21583
21624
  "style": {
@@ -21608,10 +21649,10 @@
21608
21649
  }
21609
21650
  })
21610
21651
  }), slots['body.append']?.(slotProps.value), vue.createElementVNode("tr", {
21611
- "style": vue.normalizeStyle({
21652
+ "style": {
21612
21653
  height: convertToUnit(paddingBottom.value),
21613
21654
  border: 0
21614
- })
21655
+ }
21615
21656
  }, [vue.createElementVNode("td", {
21616
21657
  "colspan": columns.value.length,
21617
21658
  "style": {
@@ -22149,10 +22190,10 @@
22149
22190
  useRender(() => {
22150
22191
  // TODO: add slot support and scope defaults
22151
22192
  return vue.createElementVNode("div", {
22152
- "class": ['v-date-picker-controls'],
22153
- "style": vue.normalizeStyle({
22193
+ "class": vue.normalizeClass(['v-date-picker-controls']),
22194
+ "style": {
22154
22195
  '--v-date-picker-controls-height': convertToUnit(props.controlHeight)
22155
- })
22196
+ }
22156
22197
  }, [vue.createVNode(VBtn, {
22157
22198
  "class": "v-date-picker-controls__month-btn",
22158
22199
  "data-testid": "month-btn",
@@ -22495,14 +22536,7 @@
22495
22536
  } else {
22496
22537
  rangeStop.value = adapter.endOfDay(_value);
22497
22538
  }
22498
- const diff = adapter.getDiff(rangeStop.value, rangeStart.value, 'days');
22499
- const datesInRange = [rangeStart.value];
22500
- for (let i = 1; i < diff; i++) {
22501
- const nextDate = adapter.addDays(rangeStart.value, i);
22502
- datesInRange.push(nextDate);
22503
- }
22504
- datesInRange.push(rangeStop.value);
22505
- model.value = datesInRange;
22539
+ model.value = createDateRange(adapter, rangeStart.value, rangeStop.value);
22506
22540
  } else {
22507
22541
  rangeStart.value = value;
22508
22542
  rangeStop.value = undefined;
@@ -22537,7 +22571,7 @@
22537
22571
  "key": "hide-week-days",
22538
22572
  "class": "v-date-picker-month__day"
22539
22573
  }, [vue.createTextVNode("\xA0")]), weekNumbers.value.map(week => vue.createElementVNode("div", {
22540
- "class": ['v-date-picker-month__day', 'v-date-picker-month__day--adjacent']
22574
+ "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__day--adjacent'])
22541
22575
  }, [week]))]), vue.createVNode(MaybeTransition, {
22542
22576
  "name": transition.value
22543
22577
  }, {
@@ -22546,7 +22580,7 @@
22546
22580
  "key": daysInMonth.value[0].date?.toString(),
22547
22581
  "class": "v-date-picker-month__days"
22548
22582
  }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
22549
- "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22583
+ "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22550
22584
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22551
22585
  const slotProps = {
22552
22586
  props: {
@@ -22588,7 +22622,8 @@
22588
22622
  min: null,
22589
22623
  max: null,
22590
22624
  modelValue: Number,
22591
- year: Number
22625
+ year: Number,
22626
+ allowedMonths: [Array, Function]
22592
22627
  }, 'VDatePickerMonths');
22593
22628
  const VDatePickerMonths = genericComponent()({
22594
22629
  name: 'VDatePickerMonths',
@@ -22610,7 +22645,7 @@
22610
22645
  }
22611
22646
  return createRange(12).map(i => {
22612
22647
  const text = adapter.format(date, 'monthShort');
22613
- const isDisabled = !!(props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
22648
+ 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))));
22614
22649
  date = adapter.getNextMonth(date);
22615
22650
  return {
22616
22651
  isDisabled,
@@ -22622,11 +22657,20 @@
22622
22657
  vue.watchEffect(() => {
22623
22658
  model.value = model.value ?? adapter.getMonth(adapter.date());
22624
22659
  });
22660
+ function isMonthAllowed(month) {
22661
+ if (Array.isArray(props.allowedMonths) && props.allowedMonths.length) {
22662
+ return props.allowedMonths.includes(month);
22663
+ }
22664
+ if (typeof props.allowedMonths === 'function') {
22665
+ return props.allowedMonths(month);
22666
+ }
22667
+ return true;
22668
+ }
22625
22669
  useRender(() => vue.createElementVNode("div", {
22626
22670
  "class": "v-date-picker-months",
22627
- "style": vue.normalizeStyle({
22671
+ "style": {
22628
22672
  height: convertToUnit(props.height)
22629
- })
22673
+ }
22630
22674
  }, [vue.createElementVNode("div", {
22631
22675
  "class": "v-date-picker-months__content"
22632
22676
  }, [months.value.map((month, i) => {
@@ -22667,7 +22711,8 @@
22667
22711
  height: [String, Number],
22668
22712
  min: null,
22669
22713
  max: null,
22670
- modelValue: Number
22714
+ modelValue: Number,
22715
+ allowedYears: [Array, Function]
22671
22716
  }, 'VDatePickerYears');
22672
22717
  const VDatePickerYears = genericComponent()({
22673
22718
  name: 'VDatePickerYears',
@@ -22699,7 +22744,8 @@
22699
22744
  date = adapter.setYear(date, adapter.getYear(date) + 1);
22700
22745
  return {
22701
22746
  text,
22702
- value: i
22747
+ value: i,
22748
+ isDisabled: !isYearAllowed(i)
22703
22749
  };
22704
22750
  });
22705
22751
  });
@@ -22713,11 +22759,20 @@
22713
22759
  block: 'center'
22714
22760
  });
22715
22761
  });
22762
+ function isYearAllowed(year) {
22763
+ if (Array.isArray(props.allowedYears) && props.allowedYears.length) {
22764
+ return props.allowedYears.includes(year);
22765
+ }
22766
+ if (typeof props.allowedYears === 'function') {
22767
+ return props.allowedYears(year);
22768
+ }
22769
+ return true;
22770
+ }
22716
22771
  useRender(() => vue.createElementVNode("div", {
22717
22772
  "class": "v-date-picker-years",
22718
- "style": vue.normalizeStyle({
22773
+ "style": {
22719
22774
  height: convertToUnit(props.height)
22720
- })
22775
+ }
22721
22776
  }, [vue.createElementVNode("div", {
22722
22777
  "class": "v-date-picker-years__content"
22723
22778
  }, [years.value.map((year, i) => {
@@ -22727,6 +22782,7 @@
22727
22782
  color: model.value === year.value ? props.color : undefined,
22728
22783
  rounded: true,
22729
22784
  text: year.text,
22785
+ disabled: year.isDisabled,
22730
22786
  variant: model.value === year.value ? 'flat' : 'text',
22731
22787
  onClick: () => {
22732
22788
  if (model.value === year.value) {
@@ -22876,6 +22932,41 @@
22876
22932
  }
22877
22933
  return targets;
22878
22934
  });
22935
+ function isAllowedInRange(start, end) {
22936
+ const allowedDates = props.allowedDates;
22937
+ if (typeof allowedDates !== 'function') return true;
22938
+ const days = adapter.getDiff(end, start, 'days');
22939
+ for (let i = 0; i < days; i++) {
22940
+ if (allowedDates(adapter.addDays(start, i))) return true;
22941
+ }
22942
+ return false;
22943
+ }
22944
+ function allowedYears(year) {
22945
+ if (typeof props.allowedDates === 'function') {
22946
+ const startOfYear = adapter.parseISO(`${year}-01-01`);
22947
+ return isAllowedInRange(startOfYear, adapter.endOfYear(startOfYear));
22948
+ }
22949
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22950
+ for (const date of props.allowedDates) {
22951
+ if (adapter.getYear(adapter.date(date)) === year) return true;
22952
+ }
22953
+ return false;
22954
+ }
22955
+ return true;
22956
+ }
22957
+ function allowedMonths(month) {
22958
+ if (typeof props.allowedDates === 'function') {
22959
+ const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
22960
+ return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
22961
+ }
22962
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22963
+ for (const date of props.allowedDates) {
22964
+ if (adapter.getYear(adapter.date(date)) === year.value && adapter.getMonth(adapter.date(date)) === month) return true;
22965
+ }
22966
+ return false;
22967
+ }
22968
+ return true;
22969
+ }
22879
22970
 
22880
22971
  // function onClickAppend () {
22881
22972
  // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar'
@@ -22991,14 +23082,16 @@
22991
23082
  "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth],
22992
23083
  "min": minDate.value,
22993
23084
  "max": maxDate.value,
22994
- "year": year.value
23085
+ "year": year.value,
23086
+ "allowedMonths": allowedMonths
22995
23087
  }), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
22996
23088
  "key": "date-picker-years"
22997
23089
  }, datePickerYearsProps, {
22998
23090
  "modelValue": year.value,
22999
23091
  "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear],
23000
23092
  "min": minDate.value,
23001
- "max": maxDate.value
23093
+ "max": maxDate.value,
23094
+ "allowedYears": allowedYears
23002
23095
  }), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
23003
23096
  "key": "date-picker-month"
23004
23097
  }, datePickerMonthProps, {
@@ -23123,9 +23216,9 @@
23123
23216
  }, [slots.title?.() ?? props.title]), hasText && vue.createElementVNode("div", {
23124
23217
  "key": "text",
23125
23218
  "class": "v-empty-state__text",
23126
- "style": vue.normalizeStyle({
23219
+ "style": {
23127
23220
  maxWidth: convertToUnit(props.textWidth)
23128
- })
23221
+ }
23129
23222
  }, [slots.text?.() ?? props.text]), slots.default && vue.createElementVNode("div", {
23130
23223
  "key": "content",
23131
23224
  "class": "v-empty-state__content"
@@ -23530,6 +23623,56 @@
23530
23623
 
23531
23624
  // Types
23532
23625
 
23626
+ function useFileDrop() {
23627
+ function hasFilesOrFolders(e) {
23628
+ const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
23629
+ return entries.length > 0 || [...(e.dataTransfer?.files ?? [])].length > 0;
23630
+ }
23631
+ async function handleDrop(e) {
23632
+ const result = [];
23633
+ const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
23634
+ if (entries.length) {
23635
+ for (const entry of entries) {
23636
+ const files = await traverseFileTree(entry, appendIfDirectory('.', entry));
23637
+ result.push(...files.map(x => x.file));
23638
+ }
23639
+ } else {
23640
+ result.push(...[...(e.dataTransfer?.files ?? [])]);
23641
+ }
23642
+ return result;
23643
+ }
23644
+ return {
23645
+ handleDrop,
23646
+ hasFilesOrFolders
23647
+ };
23648
+ }
23649
+ function traverseFileTree(item) {
23650
+ let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
23651
+ return new Promise((resolve, reject) => {
23652
+ if (item.isFile) {
23653
+ const fileEntry = item;
23654
+ fileEntry.file(file => resolve([{
23655
+ file,
23656
+ path
23657
+ }]), reject);
23658
+ } else if (item.isDirectory) {
23659
+ const directoryReader = item.createReader();
23660
+ directoryReader.readEntries(async entries => {
23661
+ const files = [];
23662
+ for (const entry of entries) {
23663
+ files.push(...(await traverseFileTree(entry, appendIfDirectory(path, entry))));
23664
+ }
23665
+ resolve(files);
23666
+ });
23667
+ }
23668
+ });
23669
+ }
23670
+ function appendIfDirectory(path, item) {
23671
+ return item.isDirectory ? `${path}/${item.name}` : path;
23672
+ }
23673
+
23674
+ // Types
23675
+
23533
23676
  const makeVFileInputProps = propsFactory({
23534
23677
  chips: Boolean,
23535
23678
  counter: Boolean,
@@ -23614,6 +23757,10 @@
23614
23757
  const isActive = vue.toRef(() => isFocused.value || props.active);
23615
23758
  const isPlainOrUnderlined = vue.computed(() => ['plain', 'underlined'].includes(props.variant));
23616
23759
  const isDragging = vue.shallowRef(false);
23760
+ const {
23761
+ handleDrop,
23762
+ hasFilesOrFolders
23763
+ } = useFileDrop();
23617
23764
  function onFocus() {
23618
23765
  if (inputRef.value !== document.activeElement) {
23619
23766
  inputRef.value?.focus();
@@ -23647,13 +23794,13 @@
23647
23794
  e.preventDefault();
23648
23795
  isDragging.value = false;
23649
23796
  }
23650
- function onDrop(e) {
23797
+ async function onDrop(e) {
23651
23798
  e.preventDefault();
23652
23799
  e.stopImmediatePropagation();
23653
23800
  isDragging.value = false;
23654
- if (!e.dataTransfer?.files?.length || !inputRef.value) return;
23801
+ if (!inputRef.value || !hasFilesOrFolders(e)) return;
23655
23802
  const dataTransfer = new DataTransfer();
23656
- for (const file of e.dataTransfer.files) {
23803
+ for (const file of await handleDrop(e)) {
23657
23804
  dataTransfer.items.add(file);
23658
23805
  }
23659
23806
  inputRef.value.files = dataTransfer.files;
@@ -23990,9 +24137,9 @@
23990
24137
  });
23991
24138
  useRender(() => vue.createElementVNode("div", {
23992
24139
  "class": "v-infinite-scroll-intersect",
23993
- "style": vue.normalizeStyle({
24140
+ "style": {
23994
24141
  '--v-infinite-margin-size': props.rootMargin
23995
- }),
24142
+ },
23996
24143
  "ref": intersectionRef
23997
24144
  }, [vue.createTextVNode("\xA0")]));
23998
24145
  return {};
@@ -25084,6 +25231,7 @@
25084
25231
  ...makeVNumberInputProps()
25085
25232
  },
25086
25233
  emits: {
25234
+ 'update:focused': val => true,
25087
25235
  'update:modelValue': val => true
25088
25236
  },
25089
25237
  setup(props, _ref) {
@@ -25099,11 +25247,7 @@
25099
25247
  });
25100
25248
  const form = useForm(props);
25101
25249
  const controlsDisabled = vue.computed(() => form.isDisabled.value || form.isReadonly.value);
25102
- const {
25103
- isFocused,
25104
- focus,
25105
- blur
25106
- } = useFocus(props);
25250
+ const isFocused = vue.shallowRef(props.focused);
25107
25251
  function correctPrecision(val) {
25108
25252
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25109
25253
  const fixed = precision == null ? String(val) : val.toFixed(precision);
@@ -25148,22 +25292,18 @@
25148
25292
  const controlNodeDefaultHeight = vue.toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
25149
25293
  const incrementSlotProps = {
25150
25294
  props: {
25151
- style: {
25152
- touchAction: 'none'
25153
- },
25154
25295
  onClick: onControlClick,
25155
25296
  onPointerup: onControlMouseup,
25156
- onPointerdown: onUpControlMousedown
25297
+ onPointerdown: onUpControlMousedown,
25298
+ onPointercancel: onControlPointerCancel
25157
25299
  }
25158
25300
  };
25159
25301
  const decrementSlotProps = {
25160
25302
  props: {
25161
- style: {
25162
- touchAction: 'none'
25163
- },
25164
25303
  onClick: onControlClick,
25165
25304
  onPointerup: onControlMouseup,
25166
- onPointerdown: onDownControlMousedown
25305
+ onPointerdown: onDownControlMousedown,
25306
+ onPointercancel: onControlPointerCancel
25167
25307
  }
25168
25308
  };
25169
25309
  vue.watch(() => props.precision, () => formatInputValue());
@@ -25260,6 +25400,11 @@
25260
25400
  e.stopPropagation();
25261
25401
  holdStart('down');
25262
25402
  }
25403
+ function onControlPointerCancel(e) {
25404
+ const el = e.currentTarget;
25405
+ el?.releasePointerCapture(e.pointerId);
25406
+ holdStop();
25407
+ }
25263
25408
  function clampModel() {
25264
25409
  if (controlsDisabled.value) return;
25265
25410
  if (!vTextFieldRef.value) return;
@@ -25287,11 +25432,9 @@
25287
25432
  inputText.value = model.value.toString();
25288
25433
  }
25289
25434
  function onFocus() {
25290
- focus();
25291
25435
  trimDecimalZeros();
25292
25436
  }
25293
25437
  function onBlur() {
25294
- blur();
25295
25438
  clampModel();
25296
25439
  }
25297
25440
  useRender(() => {
@@ -25311,8 +25454,8 @@
25311
25454
  "onClick": onControlClick,
25312
25455
  "onPointerdown": onUpControlMousedown,
25313
25456
  "onPointerup": onControlMouseup,
25457
+ "onPointercancel": onControlPointerCancel,
25314
25458
  "size": controlNodeSize.value,
25315
- "style": "touch-action: none",
25316
25459
  "tabindex": "-1"
25317
25460
  }, null) : vue.createVNode(VDefaultsProvider, {
25318
25461
  "key": "increment-defaults",
@@ -25341,8 +25484,8 @@
25341
25484
  "onClick": onControlClick,
25342
25485
  "onPointerdown": onDownControlMousedown,
25343
25486
  "onPointerup": onControlMouseup,
25487
+ "onPointercancel": onControlPointerCancel,
25344
25488
  "size": controlNodeSize.value,
25345
- "style": "touch-action: none",
25346
25489
  "tabindex": "-1"
25347
25490
  }, null) : vue.createVNode(VDefaultsProvider, {
25348
25491
  "key": "decrement-defaults",
@@ -25384,9 +25527,12 @@
25384
25527
  }, null)]) : props.reverse && controlVariant.value !== 'hidden' ? vue.createElementVNode(vue.Fragment, null, [controlNode(), dividerNode()]) : undefined;
25385
25528
  const hasPrependInner = slots['prepend-inner'] || prependInnerControl;
25386
25529
  return vue.createVNode(VTextField, vue.mergeProps({
25387
- "ref": vTextFieldRef,
25530
+ "ref": vTextFieldRef
25531
+ }, textFieldProps, {
25388
25532
  "modelValue": inputText.value,
25389
25533
  "onUpdate:modelValue": $event => inputText.value = $event,
25534
+ "focused": isFocused.value,
25535
+ "onUpdate:focused": $event => isFocused.value = $event,
25390
25536
  "validationValue": model.value,
25391
25537
  "onBeforeinput": onBeforeinput,
25392
25538
  "onFocus": onFocus,
@@ -25399,8 +25545,7 @@
25399
25545
  'v-number-input--reverse': props.reverse,
25400
25546
  'v-number-input--split': controlVariant.value === 'split',
25401
25547
  'v-number-input--stacked': controlVariant.value === 'stacked'
25402
- }, props.class]
25403
- }, textFieldProps, {
25548
+ }, props.class],
25404
25549
  "style": props.style,
25405
25550
  "inputmode": "decimal"
25406
25551
  }), {
@@ -25535,7 +25680,7 @@
25535
25680
  function onPaste(index, e) {
25536
25681
  e.preventDefault();
25537
25682
  e.stopPropagation();
25538
- const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25683
+ const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25539
25684
  if (isValidNumber(clipboardText)) return;
25540
25685
  model.value = clipboardText.split('');
25541
25686
  inputRef.value?.[index].blur();
@@ -25567,7 +25712,10 @@
25567
25712
  scoped: true
25568
25713
  });
25569
25714
  vue.watch(model, val => {
25570
- if (val.length === length.value) emit('finish', val.join(''));
25715
+ if (val.length === length.value) {
25716
+ focusIndex.value = length.value - 1;
25717
+ emit('finish', val.join(''));
25718
+ }
25571
25719
  }, {
25572
25720
  deep: true
25573
25721
  });
@@ -25602,7 +25750,7 @@
25602
25750
  "aria-label": t(props.label, i + 1),
25603
25751
  "autofocus": i === 0 && props.autofocus,
25604
25752
  "autocomplete": "one-time-code",
25605
- "class": ['v-otp-input__field'],
25753
+ "class": vue.normalizeClass(['v-otp-input__field']),
25606
25754
  "disabled": props.disabled,
25607
25755
  "inputmode": props.type === 'number' ? 'numeric' : 'text',
25608
25756
  "min": props.type === 'number' ? 0 : undefined,
@@ -29320,7 +29468,7 @@
29320
29468
  };
29321
29469
  });
29322
29470
  }
29323
- const version$1 = "3.8.7";
29471
+ const version$1 = "3.8.9";
29324
29472
  createVuetify$1.version = version$1;
29325
29473
 
29326
29474
  // Vue's inject() can only be used in setup
@@ -29345,7 +29493,7 @@
29345
29493
  ...options
29346
29494
  });
29347
29495
  };
29348
- const version = "3.8.7";
29496
+ const version = "3.8.9";
29349
29497
  createVuetify.version = version;
29350
29498
 
29351
29499
  exports.blueprints = index;