vuetify 3.8.7 → 3.8.8

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 (106) hide show
  1. package/dist/json/attributes.json +3165 -3141
  2. package/dist/json/importMap-labs.json +32 -32
  3. package/dist/json/importMap.json +136 -136
  4. package/dist/json/tags.json +6 -0
  5. package/dist/json/web-types.json +5935 -5881
  6. package/dist/vuetify-labs.cjs +192 -112
  7. package/dist/vuetify-labs.css +3773 -3767
  8. package/dist/vuetify-labs.d.ts +89 -55
  9. package/dist/vuetify-labs.esm.js +193 -113
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +192 -112
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.cjs +184 -100
  14. package/dist/vuetify.cjs.map +1 -1
  15. package/dist/vuetify.css +3192 -3186
  16. package/dist/vuetify.d.ts +79 -55
  17. package/dist/vuetify.esm.js +185 -101
  18. package/dist/vuetify.esm.js.map +1 -1
  19. package/dist/vuetify.js +184 -100
  20. package/dist/vuetify.js.map +1 -1
  21. package/dist/vuetify.min.css +2 -2
  22. package/dist/vuetify.min.js +1077 -1064
  23. package/dist/vuetify.min.js.map +1 -1
  24. package/lib/components/VAutocomplete/VAutocomplete.css +6 -6
  25. package/lib/components/VAutocomplete/VAutocomplete.sass +3 -9
  26. package/lib/components/VCarousel/VCarousel.js +3 -3
  27. package/lib/components/VCarousel/VCarousel.js.map +1 -1
  28. package/lib/components/VChip/VChip.js +1 -0
  29. package/lib/components/VChip/VChip.js.map +1 -1
  30. package/lib/components/VColorPicker/VColorPickerPreview.js +3 -3
  31. package/lib/components/VColorPicker/VColorPickerPreview.js.map +1 -1
  32. package/lib/components/VColorPicker/VColorPickerSwatches.js +3 -3
  33. package/lib/components/VColorPicker/VColorPickerSwatches.js.map +1 -1
  34. package/lib/components/VCombobox/VCombobox.css +6 -6
  35. package/lib/components/VCombobox/VCombobox.sass +3 -9
  36. package/lib/components/VDataTable/VDataTableColumn.js +3 -3
  37. package/lib/components/VDataTable/VDataTableColumn.js.map +1 -1
  38. package/lib/components/VDataTable/VDataTableGroupHeaderRow.js +3 -3
  39. package/lib/components/VDataTable/VDataTableGroupHeaderRow.js.map +1 -1
  40. package/lib/components/VDataTable/VDataTableVirtual.js +7 -7
  41. package/lib/components/VDataTable/VDataTableVirtual.js.map +1 -1
  42. package/lib/components/VDatePicker/VDatePicker.d.ts +20 -0
  43. package/lib/components/VDatePicker/VDatePicker.js +39 -2
  44. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  45. package/lib/components/VDatePicker/VDatePickerControls.js +4 -4
  46. package/lib/components/VDatePicker/VDatePickerControls.js.map +1 -1
  47. package/lib/components/VDatePicker/VDatePickerMonth.js +4 -11
  48. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  49. package/lib/components/VDatePicker/VDatePickerMonths.d.ts +10 -0
  50. package/lib/components/VDatePicker/VDatePickerMonths.js +15 -5
  51. package/lib/components/VDatePicker/VDatePickerMonths.js.map +1 -1
  52. package/lib/components/VDatePicker/VDatePickerYears.d.ts +10 -0
  53. package/lib/components/VDatePicker/VDatePickerYears.js +17 -5
  54. package/lib/components/VDatePicker/VDatePickerYears.js.map +1 -1
  55. package/lib/components/VEmptyState/VEmptyState.js +3 -3
  56. package/lib/components/VEmptyState/VEmptyState.js.map +1 -1
  57. package/lib/components/VImg/VImg.js +7 -7
  58. package/lib/components/VImg/VImg.js.map +1 -1
  59. package/lib/components/VInfiniteScroll/VInfiniteScroll.js +3 -3
  60. package/lib/components/VInfiniteScroll/VInfiniteScroll.js.map +1 -1
  61. package/lib/components/VNumberInput/VNumberInput.js +11 -10
  62. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  63. package/lib/components/VOtpInput/VOtpInput.js +2 -2
  64. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  65. package/lib/components/VProgressCircular/VProgressCircular.js +2 -2
  66. package/lib/components/VProgressCircular/VProgressCircular.js.map +1 -1
  67. package/lib/components/VProgressLinear/VProgressLinear.js +3 -3
  68. package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
  69. package/lib/components/VSelect/VSelect.css +6 -0
  70. package/lib/components/VSelect/VSelect.sass +3 -0
  71. package/lib/components/VSelect/_mixins.scss +14 -0
  72. package/lib/components/VSelectionControl/VSelectionControl.js +2 -2
  73. package/lib/components/VSelectionControl/VSelectionControl.js.map +1 -1
  74. package/lib/components/VSlider/VSliderThumb.js +16 -10
  75. package/lib/components/VSlider/VSliderThumb.js.map +1 -1
  76. package/lib/components/VSlider/VSliderTrack.js +6 -6
  77. package/lib/components/VSlider/VSliderTrack.js.map +1 -1
  78. package/lib/components/VSlider/slider.js +4 -1
  79. package/lib/components/VSlider/slider.js.map +1 -1
  80. package/lib/components/VTable/VTable.js +3 -3
  81. package/lib/components/VTable/VTable.js.map +1 -1
  82. package/lib/components/VToolbar/VToolbar.js +5 -5
  83. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  84. package/lib/components/VVirtualScroll/VVirtualScroll.js +7 -7
  85. package/lib/components/VVirtualScroll/VVirtualScroll.js.map +1 -1
  86. package/lib/components/VWindow/VWindow.js +3 -3
  87. package/lib/components/VWindow/VWindow.js.map +1 -1
  88. package/lib/composables/date/date.d.ts +4 -0
  89. package/lib/composables/date/date.js +14 -1
  90. package/lib/composables/date/date.js.map +1 -1
  91. package/lib/composables/list-items.js +2 -2
  92. package/lib/composables/list-items.js.map +1 -1
  93. package/lib/entry-bundler.d.ts +3 -0
  94. package/lib/entry-bundler.js +1 -1
  95. package/lib/framework.d.ts +59 -55
  96. package/lib/framework.js +1 -1
  97. package/lib/labs/VDateInput/VDateInput.d.ts +20 -0
  98. package/lib/labs/VDateInput/VDateInput.js +3 -7
  99. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  100. package/lib/labs/VPullToRefresh/VPullToRefresh.js +7 -7
  101. package/lib/labs/VPullToRefresh/VPullToRefresh.js.map +1 -1
  102. package/lib/labs/entry-bundler.d.ts +3 -0
  103. package/lib/util/helpers.d.ts +1 -0
  104. package/lib/util/helpers.js +9 -1
  105. package/lib/util/helpers.js.map +1 -1
  106. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.7
2
+ * Vuetify v3.8.8
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -606,6 +606,14 @@
606
606
  }
607
607
  return cleanText;
608
608
  }
609
+ function camelizeProps(props) {
610
+ if (!props) return;
611
+ const out = {};
612
+ for (const prop in props) {
613
+ out[vue.camelize(prop)] = props[prop];
614
+ }
615
+ return out;
616
+ }
609
617
 
610
618
  // Utilities
611
619
  const block = ['top', 'bottom'];
@@ -3552,9 +3560,9 @@
3552
3560
  if (!normalisedSrc.value.src || state.value === 'idle') return null;
3553
3561
  const img = vue.createElementVNode("img", {
3554
3562
  "class": vue.normalizeClass(['v-img__img', containClasses.value]),
3555
- "style": vue.normalizeStyle({
3563
+ "style": {
3556
3564
  objectPosition: props.position
3557
- }),
3565
+ },
3558
3566
  "crossorigin": props.crossorigin,
3559
3567
  "src": normalisedSrc.value.src,
3560
3568
  "srcset": normalisedSrc.value.srcset,
@@ -3581,9 +3589,9 @@
3581
3589
  }, {
3582
3590
  default: () => [normalisedSrc.value.lazySrc && state.value !== 'loaded' && vue.createElementVNode("img", {
3583
3591
  "class": vue.normalizeClass(['v-img__img', 'v-img__img--preload', containClasses.value]),
3584
- "style": vue.normalizeStyle({
3592
+ "style": {
3585
3593
  objectPosition: props.position
3586
- }),
3594
+ },
3587
3595
  "crossorigin": props.crossorigin,
3588
3596
  "src": normalisedSrc.value.lazySrc,
3589
3597
  "alt": props.alt,
@@ -3617,9 +3625,9 @@
3617
3625
  if (!props.gradient) return null;
3618
3626
  return vue.createElementVNode("div", {
3619
3627
  "class": "v-img__gradient",
3620
- "style": vue.normalizeStyle({
3628
+ "style": {
3621
3629
  backgroundImage: `linear-gradient(${props.gradient})`
3622
- })
3630
+ }
3623
3631
  }, null);
3624
3632
  };
3625
3633
  const isBooted = vue.shallowRef(false);
@@ -3830,9 +3838,9 @@
3830
3838
  }, {
3831
3839
  default: () => [vue.createElementVNode("div", {
3832
3840
  "class": "v-toolbar__content",
3833
- "style": vue.normalizeStyle({
3841
+ "style": {
3834
3842
  height: convertToUnit(contentHeight.value)
3835
- })
3843
+ }
3836
3844
  }, [slots.prepend && vue.createElementVNode("div", {
3837
3845
  "class": "v-toolbar__prepend"
3838
3846
  }, [slots.prepend?.()]), hasTitle && vue.createVNode(VToolbarTitle, {
@@ -3853,9 +3861,9 @@
3853
3861
  default: () => [vue.createVNode(VExpandTransition, null, {
3854
3862
  default: () => [isExtended.value && vue.createElementVNode("div", {
3855
3863
  "class": "v-toolbar__extension",
3856
- "style": vue.normalizeStyle({
3864
+ "style": {
3857
3865
  height: convertToUnit(extensionHeight.value)
3858
- })
3866
+ }
3859
3867
  }, [extension])]
3860
3868
  })]
3861
3869
  })]
@@ -4928,9 +4936,9 @@
4928
4936
  "aria-valuenow": props.indeterminate ? undefined : normalizedValue.value
4929
4937
  }, {
4930
4938
  default: () => [vue.createElementVNode("svg", {
4931
- "style": vue.normalizeStyle({
4939
+ "style": {
4932
4940
  transform: `rotate(calc(-90deg + ${Number(props.rotate)}deg))`
4933
- }),
4941
+ },
4934
4942
  "xmlns": "http://www.w3.org/2000/svg",
4935
4943
  "viewBox": `0 0 ${diameter.value} ${diameter.value}`
4936
4944
  }, [vue.createElementVNode("circle", {
@@ -5151,7 +5159,7 @@
5151
5159
  default: () => [props.stream && vue.createElementVNode("div", {
5152
5160
  "key": "stream",
5153
5161
  "class": vue.normalizeClass(['v-progress-linear__stream', textColorClasses.value]),
5154
- "style": vue.normalizeStyle({
5162
+ "style": {
5155
5163
  ...textColorStyles.value,
5156
5164
  [isReversed.value ? 'left' : 'right']: convertToUnit(-height.value),
5157
5165
  borderTop: `${convertToUnit(height.value / 2)} dotted`,
@@ -5159,7 +5167,7 @@
5159
5167
  top: `calc(50% - ${convertToUnit(height.value / 4)})`,
5160
5168
  width: convertToUnit(100 - normalizedBuffer.value, '%'),
5161
5169
  '--v-progress-linear-stream-to': convertToUnit(height.value * (isReversed.value ? 1 : -1))
5162
- })
5170
+ }
5163
5171
  }, null), vue.createElementVNode("div", {
5164
5172
  "class": vue.normalizeClass(['v-progress-linear__background', !isForcedColorsModeActive ? backgroundColorClasses.value : undefined]),
5165
5173
  "style": vue.normalizeStyle([backgroundColorStyles.value, {
@@ -6467,7 +6475,7 @@
6467
6475
  backgroundColorClasses,
6468
6476
  backgroundColorStyles
6469
6477
  }), vue.withDirectives(vue.createElementVNode("div", {
6470
- "class": ['v-selection-control__input']
6478
+ "class": vue.normalizeClass(['v-selection-control__input'])
6471
6479
  }, [slots.input?.({
6472
6480
  model,
6473
6481
  textColorClasses,
@@ -8100,6 +8108,7 @@
8100
8108
  const isClickable = vue.computed(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value));
8101
8109
  const closeProps = vue.toRef(() => ({
8102
8110
  'aria-label': t(props.closeLabel),
8111
+ disabled: props.disabled,
8103
8112
  onClick(e) {
8104
8113
  e.preventDefault();
8105
8114
  e.stopPropagation();
@@ -9581,7 +9590,7 @@
9581
9590
  const _props = {
9582
9591
  title,
9583
9592
  value,
9584
- ...itemProps
9593
+ ...camelizeProps(itemProps)
9585
9594
  };
9586
9595
  return {
9587
9596
  title: String(_props.title ?? ''),
@@ -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 {
@@ -15068,9 +15077,9 @@
15068
15077
  }, {
15069
15078
  default: () => [vue.createElementVNode("div", {
15070
15079
  "class": "v-window__container",
15071
- "style": vue.normalizeStyle({
15080
+ "style": {
15072
15081
  height: transitionHeight.value
15073
- })
15082
+ }
15074
15083
  }, [slots.default?.({
15075
15084
  group
15076
15085
  }), props.showArrows !== false && vue.createElementVNode("div", {
@@ -15165,10 +15174,10 @@
15165
15174
  } = _ref2;
15166
15175
  return vue.createElementVNode(vue.Fragment, null, [!props.hideDelimiters && vue.createElementVNode("div", {
15167
15176
  "class": "v-carousel__controls",
15168
- "style": vue.normalizeStyle({
15177
+ "style": {
15169
15178
  left: props.verticalDelimiters === 'left' && props.verticalDelimiters ? 0 : 'auto',
15170
15179
  right: props.verticalDelimiters === 'right' ? 0 : 'auto'
15171
- })
15180
+ }
15172
15181
  }, [group.items.value.length > 0 && vue.createVNode(VDefaultsProvider, {
15173
15182
  "defaults": {
15174
15183
  VBtn: {
@@ -15888,7 +15897,10 @@
15888
15897
  if (step.value <= 0) return value;
15889
15898
  const clamped = clamp(value, min.value, max.value);
15890
15899
  const offset = min.value % step.value;
15891
- const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
15900
+ let newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
15901
+ if (clamped > newValue && newValue + step.value > max.value) {
15902
+ newValue = max.value;
15903
+ }
15892
15904
  return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
15893
15905
  }
15894
15906
  return {
@@ -16144,6 +16156,8 @@
16144
16156
  } = useRtl();
16145
16157
  if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider');
16146
16158
  const {
16159
+ min,
16160
+ max,
16147
16161
  thumbColor,
16148
16162
  step,
16149
16163
  disabled,
@@ -16184,16 +16198,20 @@
16184
16198
  if (!relevantKeys.includes(e.key)) return;
16185
16199
  e.preventDefault();
16186
16200
  const _step = step.value || 0.1;
16187
- const steps = (props.max - props.min) / _step;
16201
+ const steps = (max.value - min.value) / _step;
16188
16202
  if ([left, right, down, up].includes(e.key)) {
16189
16203
  const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up];
16190
16204
  const direction = increase.includes(e.key) ? 1 : -1;
16191
16205
  const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0;
16192
- value = value + direction * _step * multipliers.value[multiplier];
16206
+ if (direction === -1 && value === max.value && !multiplier && !Number.isInteger(steps)) {
16207
+ value = value - steps % 1 * _step;
16208
+ } else {
16209
+ value = value + direction * _step * multipliers.value[multiplier];
16210
+ }
16193
16211
  } else if (e.key === home) {
16194
- value = props.min;
16212
+ value = min.value;
16195
16213
  } else if (e.key === end) {
16196
- value = props.max;
16214
+ value = max.value;
16197
16215
  } else {
16198
16216
  const direction = e.key === pagedown ? 1 : -1;
16199
16217
  value = value - direction * _step * (steps > 100 ? steps / 10 : 10);
@@ -16218,17 +16236,17 @@
16218
16236
  "role": "slider",
16219
16237
  "tabindex": disabled.value ? -1 : 0,
16220
16238
  "aria-label": props.name,
16221
- "aria-valuemin": props.min,
16222
- "aria-valuemax": props.max,
16239
+ "aria-valuemin": min.value,
16240
+ "aria-valuemax": max.value,
16223
16241
  "aria-valuenow": props.modelValue,
16224
16242
  "aria-readonly": !!readonly.value,
16225
16243
  "aria-orientation": direction.value,
16226
16244
  "onKeydown": !readonly.value ? onKeydown : undefined
16227
16245
  }, [vue.createElementVNode("div", {
16228
16246
  "class": vue.normalizeClass(['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value]),
16229
- "style": vue.normalizeStyle({
16247
+ "style": {
16230
16248
  ...textColorStyles.value
16231
- })
16249
+ }
16232
16250
  }, null), vue.withDirectives(vue.createElementVNode("div", {
16233
16251
  "class": vue.normalizeClass(['v-slider-thumb__ripple', textColorClasses.value]),
16234
16252
  "style": vue.normalizeStyle(textColorStyles.value)
@@ -16241,7 +16259,7 @@
16241
16259
  default: () => [vue.withDirectives(vue.createElementVNode("div", {
16242
16260
  "class": "v-slider-thumb__label-container"
16243
16261
  }, [vue.createElementVNode("div", {
16244
- "class": ['v-slider-thumb__label']
16262
+ "class": vue.normalizeClass(['v-slider-thumb__label'])
16245
16263
  }, [vue.createElementVNode("div", null, [slots['thumb-label']?.({
16246
16264
  modelValue: props.modelValue
16247
16265
  }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[vue.vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
@@ -16326,9 +16344,9 @@
16326
16344
  'v-slider-track__tick--first': tick.value === min.value,
16327
16345
  'v-slider-track__tick--last': tick.value === max.value
16328
16346
  }]),
16329
- "style": vue.normalizeStyle({
16347
+ "style": {
16330
16348
  [startDir.value]: directionValue
16331
- })
16349
+ }
16332
16350
  }, [(tick.label || slots['tick-label']) && vue.createElementVNode("div", {
16333
16351
  "class": "v-slider-track__tick-label"
16334
16352
  }, [slots['tick-label']?.({
@@ -16348,16 +16366,16 @@
16348
16366
  "class": vue.normalizeClass(['v-slider-track__background', trackColorClasses.value, {
16349
16367
  'v-slider-track__background--opacity': !!color.value || !trackFillColor.value
16350
16368
  }]),
16351
- "style": vue.normalizeStyle({
16369
+ "style": {
16352
16370
  ...backgroundStyles.value,
16353
16371
  ...trackColorStyles.value
16354
- })
16372
+ }
16355
16373
  }, null), vue.createElementVNode("div", {
16356
16374
  "class": vue.normalizeClass(['v-slider-track__fill', trackFillColorClasses.value]),
16357
- "style": vue.normalizeStyle({
16375
+ "style": {
16358
16376
  ...trackFillStyles.value,
16359
16377
  ...trackFillColorStyles.value
16360
- })
16378
+ }
16361
16379
  }, null), showTicks.value && vue.createElementVNode("div", {
16362
16380
  "class": vue.normalizeClass(['v-slider-track__ticks', {
16363
16381
  'v-slider-track__ticks--always-show': showTicks.value === 'always'
@@ -16559,9 +16577,9 @@
16559
16577
  }, null)]), vue.createElementVNode("div", {
16560
16578
  "class": "v-color-picker-preview__dot"
16561
16579
  }, [vue.createElementVNode("div", {
16562
- "style": vue.normalizeStyle({
16580
+ "style": {
16563
16581
  background: HSVtoCSS(props.color ?? nullColor)
16564
- })
16582
+ }
16565
16583
  }, null)]), vue.createElementVNode("div", {
16566
16584
  "class": "v-color-picker-preview__sliders"
16567
16585
  }, [vue.createVNode(VSlider, {
@@ -16962,9 +16980,9 @@
16962
16980
  "class": "v-color-picker-swatches__color",
16963
16981
  "onClick": () => hsva && emit('update:color', hsva)
16964
16982
  }, [vue.createElementVNode("div", {
16965
- "style": vue.normalizeStyle({
16983
+ "style": {
16966
16984
  background
16967
- })
16985
+ }
16968
16986
  }, [props.color && deepEqual(props.color, hsva) ? vue.createVNode(VIcon, {
16969
16987
  "size": "x-small",
16970
16988
  "icon": "$success",
@@ -17823,7 +17841,20 @@
17823
17841
  vue.watch(locale.current, value => {
17824
17842
  instance.locale = options.locale[value] ?? value ?? instance.locale;
17825
17843
  });
17826
- return instance;
17844
+ return Object.assign(instance, {
17845
+ createDateRange(start, stop) {
17846
+ const diff = instance.getDiff(stop ?? start, start, 'days');
17847
+ const datesInRange = [start];
17848
+ for (let i = 1; i < diff; i++) {
17849
+ const nextDate = instance.addDays(start, i);
17850
+ datesInRange.push(nextDate);
17851
+ }
17852
+ if (stop) {
17853
+ datesInRange.push(instance.endOfDay(stop));
17854
+ }
17855
+ return datesInRange;
17856
+ }
17857
+ });
17827
17858
  }
17828
17859
  function useDate() {
17829
17860
  const options = vue.inject(DateOptionsSymbol);
@@ -19970,12 +20001,12 @@
19970
20001
  'v-data-table-column--no-padding': props.noPadding,
19971
20002
  'v-data-table-column--nowrap': props.nowrap
19972
20003
  }, `v-data-table-column--align-${props.align}`]),
19973
- "style": vue.normalizeStyle({
20004
+ "style": {
19974
20005
  height: convertToUnit(props.height),
19975
20006
  width: convertToUnit(props.width),
19976
20007
  maxWidth: convertToUnit(props.maxWidth),
19977
20008
  left: convertToUnit(props.fixedOffset || null)
19978
- })
20009
+ }
19979
20010
  }, {
19980
20011
  default: () => [slots.default?.()]
19981
20012
  });
@@ -20500,9 +20531,9 @@
20500
20531
  });
20501
20532
  return () => vue.createElementVNode("tr", {
20502
20533
  "class": "v-data-table-group-header-row",
20503
- "style": vue.normalizeStyle({
20534
+ "style": {
20504
20535
  '--v-data-table-group-header-row-depth': props.item.depth
20505
- })
20536
+ }
20506
20537
  }, [columns.value.map(column => {
20507
20538
  if (column.key === 'data-table-group') {
20508
20539
  const icon = isGroupOpen(props.item) ? '$expand' : '$next';
@@ -20850,9 +20881,9 @@
20850
20881
  }, {
20851
20882
  default: () => [slots.top?.(), slots.default ? vue.createElementVNode("div", {
20852
20883
  "class": "v-table__wrapper",
20853
- "style": vue.normalizeStyle({
20884
+ "style": {
20854
20885
  height: convertToUnit(props.height)
20855
- })
20886
+ }
20856
20887
  }, [vue.createElementVNode("table", null, [slots.default()])]) : slots.wrapper?.(), slots.bottom?.()]
20857
20888
  }));
20858
20889
  return {};
@@ -21287,19 +21318,19 @@
21287
21318
  "onScrollPassive": handleScroll,
21288
21319
  "onScrollend": handleScrollend,
21289
21320
  "class": "v-table__wrapper",
21290
- "style": vue.normalizeStyle({
21321
+ "style": {
21291
21322
  height: convertToUnit(props.height)
21292
- })
21323
+ }
21293
21324
  }, [vue.createElementVNode("table", null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && vue.createElementVNode("thead", {
21294
21325
  "key": "thead"
21295
21326
  }, [vue.createVNode(VDataTableHeaders, dataTableHeadersProps, slots)]), slots.thead?.(slotProps.value), !props.hideDefaultBody && vue.createElementVNode("tbody", {
21296
21327
  "key": "tbody"
21297
21328
  }, [vue.createElementVNode("tr", {
21298
21329
  "ref": markerRef,
21299
- "style": vue.normalizeStyle({
21330
+ "style": {
21300
21331
  height: convertToUnit(paddingTop.value),
21301
21332
  border: 0
21302
- })
21333
+ }
21303
21334
  }, [vue.createElementVNode("td", {
21304
21335
  "colspan": columns.value.length,
21305
21336
  "style": {
@@ -21330,10 +21361,10 @@
21330
21361
  }
21331
21362
  })
21332
21363
  }), slots['body.append']?.(slotProps.value), vue.createElementVNode("tr", {
21333
- "style": vue.normalizeStyle({
21364
+ "style": {
21334
21365
  height: convertToUnit(paddingBottom.value),
21335
21366
  border: 0
21336
- })
21367
+ }
21337
21368
  }, [vue.createElementVNode("td", {
21338
21369
  "colspan": columns.value.length,
21339
21370
  "style": {
@@ -21871,10 +21902,10 @@
21871
21902
  useRender(() => {
21872
21903
  // TODO: add slot support and scope defaults
21873
21904
  return vue.createElementVNode("div", {
21874
- "class": ['v-date-picker-controls'],
21875
- "style": vue.normalizeStyle({
21905
+ "class": vue.normalizeClass(['v-date-picker-controls']),
21906
+ "style": {
21876
21907
  '--v-date-picker-controls-height': convertToUnit(props.controlHeight)
21877
- })
21908
+ }
21878
21909
  }, [vue.createVNode(VBtn, {
21879
21910
  "class": "v-date-picker-controls__month-btn",
21880
21911
  "data-testid": "month-btn",
@@ -22217,14 +22248,7 @@
22217
22248
  } else {
22218
22249
  rangeStop.value = adapter.endOfDay(_value);
22219
22250
  }
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;
22251
+ model.value = adapter.createDateRange(rangeStart.value, rangeStop.value);
22228
22252
  } else {
22229
22253
  rangeStart.value = value;
22230
22254
  rangeStop.value = undefined;
@@ -22259,7 +22283,7 @@
22259
22283
  "key": "hide-week-days",
22260
22284
  "class": "v-date-picker-month__day"
22261
22285
  }, [vue.createTextVNode("\xA0")]), weekNumbers.value.map(week => vue.createElementVNode("div", {
22262
- "class": ['v-date-picker-month__day', 'v-date-picker-month__day--adjacent']
22286
+ "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__day--adjacent'])
22263
22287
  }, [week]))]), vue.createVNode(MaybeTransition, {
22264
22288
  "name": transition.value
22265
22289
  }, {
@@ -22268,7 +22292,7 @@
22268
22292
  "key": daysInMonth.value[0].date?.toString(),
22269
22293
  "class": "v-date-picker-month__days"
22270
22294
  }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
22271
- "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22295
+ "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22272
22296
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22273
22297
  const slotProps = {
22274
22298
  props: {
@@ -22310,7 +22334,8 @@
22310
22334
  min: null,
22311
22335
  max: null,
22312
22336
  modelValue: Number,
22313
- year: Number
22337
+ year: Number,
22338
+ allowedMonths: [Array, Function]
22314
22339
  }, 'VDatePickerMonths');
22315
22340
  const VDatePickerMonths = genericComponent()({
22316
22341
  name: 'VDatePickerMonths',
@@ -22332,7 +22357,7 @@
22332
22357
  }
22333
22358
  return createRange(12).map(i => {
22334
22359
  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))));
22360
+ 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
22361
  date = adapter.getNextMonth(date);
22337
22362
  return {
22338
22363
  isDisabled,
@@ -22344,11 +22369,20 @@
22344
22369
  vue.watchEffect(() => {
22345
22370
  model.value = model.value ?? adapter.getMonth(adapter.date());
22346
22371
  });
22372
+ function isMonthAllowed(month) {
22373
+ if (Array.isArray(props.allowedMonths) && props.allowedMonths.length) {
22374
+ return props.allowedMonths.includes(month);
22375
+ }
22376
+ if (typeof props.allowedMonths === 'function') {
22377
+ return props.allowedMonths(month);
22378
+ }
22379
+ return true;
22380
+ }
22347
22381
  useRender(() => vue.createElementVNode("div", {
22348
22382
  "class": "v-date-picker-months",
22349
- "style": vue.normalizeStyle({
22383
+ "style": {
22350
22384
  height: convertToUnit(props.height)
22351
- })
22385
+ }
22352
22386
  }, [vue.createElementVNode("div", {
22353
22387
  "class": "v-date-picker-months__content"
22354
22388
  }, [months.value.map((month, i) => {
@@ -22389,7 +22423,8 @@
22389
22423
  height: [String, Number],
22390
22424
  min: null,
22391
22425
  max: null,
22392
- modelValue: Number
22426
+ modelValue: Number,
22427
+ allowedYears: [Array, Function]
22393
22428
  }, 'VDatePickerYears');
22394
22429
  const VDatePickerYears = genericComponent()({
22395
22430
  name: 'VDatePickerYears',
@@ -22421,7 +22456,8 @@
22421
22456
  date = adapter.setYear(date, adapter.getYear(date) + 1);
22422
22457
  return {
22423
22458
  text,
22424
- value: i
22459
+ value: i,
22460
+ isDisabled: !isYearAllowed(i)
22425
22461
  };
22426
22462
  });
22427
22463
  });
@@ -22435,11 +22471,20 @@
22435
22471
  block: 'center'
22436
22472
  });
22437
22473
  });
22474
+ function isYearAllowed(year) {
22475
+ if (Array.isArray(props.allowedYears) && props.allowedYears.length) {
22476
+ return props.allowedYears.includes(year);
22477
+ }
22478
+ if (typeof props.allowedYears === 'function') {
22479
+ return props.allowedYears(year);
22480
+ }
22481
+ return true;
22482
+ }
22438
22483
  useRender(() => vue.createElementVNode("div", {
22439
22484
  "class": "v-date-picker-years",
22440
- "style": vue.normalizeStyle({
22485
+ "style": {
22441
22486
  height: convertToUnit(props.height)
22442
- })
22487
+ }
22443
22488
  }, [vue.createElementVNode("div", {
22444
22489
  "class": "v-date-picker-years__content"
22445
22490
  }, [years.value.map((year, i) => {
@@ -22449,6 +22494,7 @@
22449
22494
  color: model.value === year.value ? props.color : undefined,
22450
22495
  rounded: true,
22451
22496
  text: year.text,
22497
+ disabled: year.isDisabled,
22452
22498
  variant: model.value === year.value ? 'flat' : 'text',
22453
22499
  onClick: () => {
22454
22500
  if (model.value === year.value) {
@@ -22598,6 +22644,41 @@
22598
22644
  }
22599
22645
  return targets;
22600
22646
  });
22647
+ function isAllowedInRange(start, end) {
22648
+ const allowedDates = props.allowedDates;
22649
+ if (typeof allowedDates !== 'function') return true;
22650
+ const days = adapter.getDiff(end, start, 'days');
22651
+ for (let i = 0; i < days; i++) {
22652
+ if (allowedDates(adapter.addDays(start, i))) return true;
22653
+ }
22654
+ return false;
22655
+ }
22656
+ function allowedYears(year) {
22657
+ if (typeof props.allowedDates === 'function') {
22658
+ const startOfYear = adapter.parseISO(`${year}-01-01`);
22659
+ return isAllowedInRange(startOfYear, adapter.endOfYear(startOfYear));
22660
+ }
22661
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22662
+ for (const date of props.allowedDates) {
22663
+ if (adapter.getYear(adapter.date(date)) === year) return true;
22664
+ }
22665
+ return false;
22666
+ }
22667
+ return true;
22668
+ }
22669
+ function allowedMonths(month) {
22670
+ if (typeof props.allowedDates === 'function') {
22671
+ const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
22672
+ return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
22673
+ }
22674
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22675
+ for (const date of props.allowedDates) {
22676
+ if (adapter.getYear(adapter.date(date)) === year.value && adapter.getMonth(adapter.date(date)) === month) return true;
22677
+ }
22678
+ return false;
22679
+ }
22680
+ return true;
22681
+ }
22601
22682
 
22602
22683
  // function onClickAppend () {
22603
22684
  // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar'
@@ -22713,14 +22794,16 @@
22713
22794
  "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth],
22714
22795
  "min": minDate.value,
22715
22796
  "max": maxDate.value,
22716
- "year": year.value
22797
+ "year": year.value,
22798
+ "allowedMonths": allowedMonths
22717
22799
  }), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
22718
22800
  "key": "date-picker-years"
22719
22801
  }, datePickerYearsProps, {
22720
22802
  "modelValue": year.value,
22721
22803
  "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear],
22722
22804
  "min": minDate.value,
22723
- "max": maxDate.value
22805
+ "max": maxDate.value,
22806
+ "allowedYears": allowedYears
22724
22807
  }), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
22725
22808
  "key": "date-picker-month"
22726
22809
  }, datePickerMonthProps, {
@@ -22845,9 +22928,9 @@
22845
22928
  }, [slots.title?.() ?? props.title]), hasText && vue.createElementVNode("div", {
22846
22929
  "key": "text",
22847
22930
  "class": "v-empty-state__text",
22848
- "style": vue.normalizeStyle({
22931
+ "style": {
22849
22932
  maxWidth: convertToUnit(props.textWidth)
22850
- })
22933
+ }
22851
22934
  }, [slots.text?.() ?? props.text]), slots.default && vue.createElementVNode("div", {
22852
22935
  "key": "content",
22853
22936
  "class": "v-empty-state__content"
@@ -23712,9 +23795,9 @@
23712
23795
  });
23713
23796
  useRender(() => vue.createElementVNode("div", {
23714
23797
  "class": "v-infinite-scroll-intersect",
23715
- "style": vue.normalizeStyle({
23798
+ "style": {
23716
23799
  '--v-infinite-margin-size': props.rootMargin
23717
- }),
23800
+ },
23718
23801
  "ref": intersectionRef
23719
23802
  }, [vue.createTextVNode("\xA0")]));
23720
23803
  return {};
@@ -24870,22 +24953,18 @@
24870
24953
  const controlNodeDefaultHeight = vue.toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
24871
24954
  const incrementSlotProps = {
24872
24955
  props: {
24873
- style: {
24874
- touchAction: 'none'
24875
- },
24876
24956
  onClick: onControlClick,
24877
24957
  onPointerup: onControlMouseup,
24878
- onPointerdown: onUpControlMousedown
24958
+ onPointerdown: onUpControlMousedown,
24959
+ onPointercancel: onControlPointerCancel
24879
24960
  }
24880
24961
  };
24881
24962
  const decrementSlotProps = {
24882
24963
  props: {
24883
- style: {
24884
- touchAction: 'none'
24885
- },
24886
24964
  onClick: onControlClick,
24887
24965
  onPointerup: onControlMouseup,
24888
- onPointerdown: onDownControlMousedown
24966
+ onPointerdown: onDownControlMousedown,
24967
+ onPointercancel: onControlPointerCancel
24889
24968
  }
24890
24969
  };
24891
24970
  vue.watch(() => props.precision, () => formatInputValue());
@@ -24982,6 +25061,11 @@
24982
25061
  e.stopPropagation();
24983
25062
  holdStart('down');
24984
25063
  }
25064
+ function onControlPointerCancel(e) {
25065
+ const el = e.currentTarget;
25066
+ el?.releasePointerCapture(e.pointerId);
25067
+ holdStop();
25068
+ }
24985
25069
  function clampModel() {
24986
25070
  if (controlsDisabled.value) return;
24987
25071
  if (!vTextFieldRef.value) return;
@@ -25033,8 +25117,8 @@
25033
25117
  "onClick": onControlClick,
25034
25118
  "onPointerdown": onUpControlMousedown,
25035
25119
  "onPointerup": onControlMouseup,
25120
+ "onPointercancel": onControlPointerCancel,
25036
25121
  "size": controlNodeSize.value,
25037
- "style": "touch-action: none",
25038
25122
  "tabindex": "-1"
25039
25123
  }, null) : vue.createVNode(VDefaultsProvider, {
25040
25124
  "key": "increment-defaults",
@@ -25063,8 +25147,8 @@
25063
25147
  "onClick": onControlClick,
25064
25148
  "onPointerdown": onDownControlMousedown,
25065
25149
  "onPointerup": onControlMouseup,
25150
+ "onPointercancel": onControlPointerCancel,
25066
25151
  "size": controlNodeSize.value,
25067
- "style": "touch-action: none",
25068
25152
  "tabindex": "-1"
25069
25153
  }, null) : vue.createVNode(VDefaultsProvider, {
25070
25154
  "key": "decrement-defaults",
@@ -25324,7 +25408,7 @@
25324
25408
  "aria-label": t(props.label, i + 1),
25325
25409
  "autofocus": i === 0 && props.autofocus,
25326
25410
  "autocomplete": "one-time-code",
25327
- "class": ['v-otp-input__field'],
25411
+ "class": vue.normalizeClass(['v-otp-input__field']),
25328
25412
  "disabled": props.disabled,
25329
25413
  "inputmode": props.type === 'number' ? 'numeric' : 'text',
25330
25414
  "min": props.type === 'number' ? 0 : undefined,
@@ -29552,18 +29636,14 @@
29552
29636
  const parts = value.trim().split(/\D+-\D+|[^\d\-/.]+/);
29553
29637
  if (parts.every(isValid)) {
29554
29638
  if (props.multiple === 'range') {
29555
- model.value = getRange(parts);
29639
+ const [start, stop] = parts.map(parseDate).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
29640
+ model.value = adapter.createDateRange(start, stop);
29556
29641
  } else {
29557
29642
  model.value = parts.map(parseDate);
29558
29643
  }
29559
29644
  }
29560
29645
  }
29561
29646
  }
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
29647
  useRender(() => {
29568
29648
  const confirmEditProps = VConfirmEdit.filterProps(props);
29569
29649
  const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
@@ -30440,7 +30520,7 @@
30440
30520
  });
30441
30521
  useRender(() => {
30442
30522
  return vue.createElementVNode("div", {
30443
- "class": ['v-pull-to-refresh'],
30523
+ "class": vue.normalizeClass(['v-pull-to-refresh']),
30444
30524
  "onTouchstart": onTouchstart,
30445
30525
  "onTouchmove": onTouchmove,
30446
30526
  "onTouchend": onTouchend,
@@ -30453,16 +30533,16 @@
30453
30533
  "class": vue.normalizeClass(['v-pull-to-refresh__pull-down', {
30454
30534
  'v-pull-to-refresh__pull-down--touching': touching.value
30455
30535
  }]),
30456
- "style": vue.normalizeStyle({
30536
+ "style": {
30457
30537
  top: convertToUnit(-1 * props.pullDownThreshold + topOffset.value),
30458
30538
  height: convertToUnit(props.pullDownThreshold)
30459
- })
30539
+ }
30460
30540
  }, [slots.pullDownPanel ? slots.pullDownPanel({
30461
30541
  canRefresh: canRefresh.value,
30462
30542
  goingUp: goingUp.value,
30463
30543
  refreshing: refreshing.value
30464
30544
  }) : vue.createElementVNode("div", {
30465
- "class": ['v-pull-to-refresh__pull-down-default']
30545
+ "class": vue.normalizeClass(['v-pull-to-refresh__pull-down-default'])
30466
30546
  }, [refreshing.value ? vue.createVNode(VProgressCircular, {
30467
30547
  "indeterminate": true,
30468
30548
  "active": false
@@ -30472,9 +30552,9 @@
30472
30552
  "class": vue.normalizeClass(['v-pull-to-refresh__scroll-container', {
30473
30553
  'v-pull-to-refresh__scroll-container--touching': touching.value
30474
30554
  }]),
30475
- "style": vue.normalizeStyle({
30555
+ "style": {
30476
30556
  top: convertToUnit(topOffset.value)
30477
- })
30557
+ }
30478
30558
  }, [slots.default?.()])]);
30479
30559
  });
30480
30560
  }
@@ -32015,7 +32095,7 @@
32015
32095
  };
32016
32096
  });
32017
32097
  }
32018
- const version$1 = "3.8.7";
32098
+ const version$1 = "3.8.8";
32019
32099
  createVuetify$1.version = version$1;
32020
32100
 
32021
32101
  // Vue's inject() can only be used in setup
@@ -32313,7 +32393,7 @@
32313
32393
 
32314
32394
  /* eslint-disable local-rules/sort-imports */
32315
32395
 
32316
- const version = "3.8.7";
32396
+ const version = "3.8.8";
32317
32397
 
32318
32398
  /* eslint-disable local-rules/sort-imports */
32319
32399