@vuetify/nightly 3.7.15-master.2025-03-05 → 3.7.15-master.2025-03-07

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 (92) hide show
  1. package/CHANGELOG.md +29 -3
  2. package/dist/json/attributes.json +2581 -2577
  3. package/dist/json/importMap-labs.json +12 -12
  4. package/dist/json/importMap.json +160 -160
  5. package/dist/json/tags.json +3 -2
  6. package/dist/json/web-types.json +4799 -4778
  7. package/dist/vuetify-labs.css +2627 -2627
  8. package/dist/vuetify-labs.d.ts +301 -129
  9. package/dist/vuetify-labs.esm.js +129 -106
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +128 -105
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +2604 -2604
  14. package/dist/vuetify.d.ts +258 -144
  15. package/dist/vuetify.esm.js +80 -51
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +79 -50
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +219 -217
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/components/VAppBar/index.d.mts +15 -6
  23. package/lib/components/VAutocomplete/index.d.mts +2 -2
  24. package/lib/components/VBadge/VBadge.mjs +2 -2
  25. package/lib/components/VBadge/VBadge.mjs.map +1 -1
  26. package/lib/components/VBtn/VBtn.mjs +6 -3
  27. package/lib/components/VBtn/VBtn.mjs.map +1 -1
  28. package/lib/components/VBtn/index.d.mts +15 -6
  29. package/lib/components/VCard/VCard.mjs +12 -3
  30. package/lib/components/VCard/VCard.mjs.map +1 -1
  31. package/lib/components/VCard/VCardItem.mjs +11 -4
  32. package/lib/components/VCard/VCardItem.mjs.map +1 -1
  33. package/lib/components/VCard/index.d.mts +75 -30
  34. package/lib/components/VCarousel/VCarousel.mjs +1 -1
  35. package/lib/components/VCarousel/VCarousel.mjs.map +1 -1
  36. package/lib/components/VChip/VChip.mjs +6 -3
  37. package/lib/components/VChip/VChip.mjs.map +1 -1
  38. package/lib/components/VChip/index.d.mts +15 -6
  39. package/lib/components/VCombobox/index.d.mts +2 -2
  40. package/lib/components/VDataTable/composables/headers.mjs +2 -2
  41. package/lib/components/VDataTable/composables/headers.mjs.map +1 -1
  42. package/lib/components/VDataTable/composables/paginate.mjs +2 -2
  43. package/lib/components/VDataTable/composables/paginate.mjs.map +1 -1
  44. package/lib/components/VFab/index.d.mts +15 -6
  45. package/lib/components/VList/VListItem.mjs +11 -5
  46. package/lib/components/VList/VListItem.mjs.map +1 -1
  47. package/lib/components/VList/index.d.mts +32 -14
  48. package/lib/components/VPagination/VPagination.mjs +3 -3
  49. package/lib/components/VPagination/VPagination.mjs.map +1 -1
  50. package/lib/components/VParallax/VParallax.mjs +1 -1
  51. package/lib/components/VParallax/VParallax.mjs.map +1 -1
  52. package/lib/components/VRating/VRating.mjs +1 -1
  53. package/lib/components/VRating/VRating.mjs.map +1 -1
  54. package/lib/components/VSelect/index.d.mts +2 -2
  55. package/lib/components/VSlider/slider.mjs +1 -1
  56. package/lib/components/VSlider/slider.mjs.map +1 -1
  57. package/lib/components/VSparkline/VBarline.mjs +1 -1
  58. package/lib/components/VSparkline/VBarline.mjs.map +1 -1
  59. package/lib/components/VTabs/index.d.mts +39 -24
  60. package/lib/components/VTextarea/VTextarea.mjs +2 -2
  61. package/lib/components/VTextarea/VTextarea.mjs.map +1 -1
  62. package/lib/components/index.d.mts +206 -92
  63. package/lib/composables/stack.mjs +2 -2
  64. package/lib/composables/stack.mjs.map +1 -1
  65. package/lib/composables/validation.mjs +2 -2
  66. package/lib/composables/validation.mjs.map +1 -1
  67. package/lib/entry-bundler.mjs +1 -1
  68. package/lib/framework.mjs +1 -1
  69. package/lib/index.d.mts +52 -52
  70. package/lib/labs/VFileUpload/VFileUpload.mjs +3 -2
  71. package/lib/labs/VFileUpload/VFileUpload.mjs.map +1 -1
  72. package/lib/labs/VFileUpload/index.d.mts +32 -14
  73. package/lib/labs/VNumberInput/VNumberInput.mjs +5 -5
  74. package/lib/labs/VNumberInput/VNumberInput.mjs.map +1 -1
  75. package/lib/labs/VTimePicker/VTimePicker.mjs +30 -31
  76. package/lib/labs/VTimePicker/VTimePicker.mjs.map +1 -1
  77. package/lib/labs/VTimePicker/VTimePickerControls.mjs +12 -13
  78. package/lib/labs/VTimePicker/VTimePickerControls.mjs.map +1 -1
  79. package/lib/labs/VTimePicker/index.d.mts +35 -13
  80. package/lib/labs/VTimePicker/shared.mjs +2 -0
  81. package/lib/labs/VTimePicker/shared.mjs.map +1 -0
  82. package/lib/labs/VTreeview/index.d.mts +32 -14
  83. package/lib/labs/components.d.mts +97 -39
  84. package/lib/locale/adapters/vuetify.mjs +1 -1
  85. package/lib/locale/adapters/vuetify.mjs.map +1 -1
  86. package/lib/util/animation.mjs +8 -8
  87. package/lib/util/animation.mjs.map +1 -1
  88. package/lib/util/helpers.mjs +6 -4
  89. package/lib/util/helpers.mjs.map +1 -1
  90. package/package.json +1 -1
  91. package/lib/labs/VTimePicker/SelectingTimes.mjs +0 -10
  92. package/lib/labs/VTimePicker/SelectingTimes.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.7.15-master.2025-03-05
2
+ * Vuetify v3.7.15-master.2025-03-07
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -155,12 +155,14 @@
155
155
  let unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'px';
156
156
  if (str == null || str === '') {
157
157
  return undefined;
158
- } else if (isNaN(+str)) {
158
+ }
159
+ const num = Number(str);
160
+ if (isNaN(num)) {
159
161
  return String(str);
160
- } else if (!isFinite(+str)) {
162
+ } else if (!isFinite(num)) {
161
163
  return undefined;
162
164
  } else {
163
- return `${Number(str)}${unit}`;
165
+ return `${num}${unit}`;
164
166
  }
165
167
  }
166
168
  function isObject(obj) {
@@ -694,16 +696,16 @@
694
696
  let ta, sx, sy, dx, dy;
695
697
  if (tx.startsWith('matrix3d(')) {
696
698
  ta = tx.slice(9, -1).split(/, /);
697
- sx = +ta[0];
698
- sy = +ta[5];
699
- dx = +ta[12];
700
- dy = +ta[13];
699
+ sx = Number(ta[0]);
700
+ sy = Number(ta[5]);
701
+ dx = Number(ta[12]);
702
+ dy = Number(ta[13]);
701
703
  } else if (tx.startsWith('matrix(')) {
702
704
  ta = tx.slice(7, -1).split(/, /);
703
- sx = +ta[0];
704
- sy = +ta[3];
705
- dx = +ta[4];
706
- dy = +ta[5];
705
+ sx = Number(ta[0]);
706
+ sy = Number(ta[3]);
707
+ dx = Number(ta[4]);
708
+ dy = Number(ta[5]);
707
709
  } else {
708
710
  return new Box(rect);
709
711
  }
@@ -2079,7 +2081,7 @@
2079
2081
  const LANG_PREFIX = '$vuetify.';
2080
2082
  const replace = (str, params) => {
2081
2083
  return str.replace(/\{(\d+)\}/g, (match, index) => {
2082
- return String(params[+index]);
2084
+ return String(params[Number(index)]);
2083
2085
  });
2084
2086
  };
2085
2087
  const createTranslateFunction = (current, fallback, messages) => {
@@ -5576,7 +5578,10 @@
5576
5578
  type: [Boolean, Object],
5577
5579
  default: true
5578
5580
  },
5579
- text: String,
5581
+ text: {
5582
+ type: [String, Number, Boolean],
5583
+ default: undefined
5584
+ },
5580
5585
  ...makeBorderProps(),
5581
5586
  ...makeComponentProps(),
5582
5587
  ...makeDensityProps(),
@@ -5732,7 +5737,7 @@
5732
5737
  }
5733
5738
  }
5734
5739
  }, {
5735
- default: () => [slots.default?.() ?? props.text]
5740
+ default: () => [slots.default?.() ?? vue.toDisplayString(props.text)]
5736
5741
  })]), !props.icon && hasAppend && vue.createVNode("span", {
5737
5742
  "key": "append",
5738
5743
  "class": "v-btn__append"
@@ -6740,7 +6745,7 @@
6740
6745
  const isPristine = vue.shallowRef(true);
6741
6746
  const isDirty = vue.computed(() => !!(wrapInArray(model.value === '' ? null : model.value).length || wrapInArray(validationModel.value === '' ? null : validationModel.value).length));
6742
6747
  const errorMessages = vue.computed(() => {
6743
- return props.errorMessages?.length ? wrapInArray(props.errorMessages).concat(internalErrorMessages.value).slice(0, Math.max(0, +props.maxErrors)) : internalErrorMessages.value;
6748
+ return props.errorMessages?.length ? wrapInArray(props.errorMessages).concat(internalErrorMessages.value).slice(0, Math.max(0, Number(props.maxErrors))) : internalErrorMessages.value;
6744
6749
  });
6745
6750
  const validateOn = vue.computed(() => {
6746
6751
  let value = (props.validateOn ?? form.validateOn?.value) || 'input';
@@ -6831,7 +6836,7 @@
6831
6836
  const results = [];
6832
6837
  isValidating.value = true;
6833
6838
  for (const rule of props.rules) {
6834
- if (results.length >= +(props.maxErrors ?? 1)) {
6839
+ if (results.length >= Number(props.maxErrors ?? 1)) {
6835
6840
  break;
6836
6841
  }
6837
6842
  const handler = typeof rule === 'function' ? rule : () => rule;
@@ -7892,7 +7897,10 @@
7892
7897
  type: [Boolean, Object],
7893
7898
  default: true
7894
7899
  },
7895
- text: String,
7900
+ text: {
7901
+ type: [String, Number, Boolean],
7902
+ default: undefined
7903
+ },
7896
7904
  modelValue: {
7897
7905
  type: Boolean,
7898
7906
  default: true
@@ -8061,7 +8069,7 @@
8061
8069
  toggle: group?.toggle,
8062
8070
  value: group?.value.value,
8063
8071
  disabled: props.disabled
8064
- }) ?? props.text]), hasAppend && vue.createVNode("div", {
8072
+ }) ?? vue.toDisplayString(props.text)]), hasAppend && vue.createVNode("div", {
8065
8073
  "key": "append",
8066
8074
  "class": "v-chip__append"
8067
8075
  }, [!slots.append ? vue.createVNode(vue.Fragment, null, [props.appendIcon && vue.createVNode(VIcon, {
@@ -8940,8 +8948,14 @@
8940
8948
  default: true
8941
8949
  },
8942
8950
  slim: Boolean,
8943
- subtitle: [String, Number],
8944
- title: [String, Number],
8951
+ subtitle: {
8952
+ type: [String, Number, Boolean],
8953
+ default: undefined
8954
+ },
8955
+ title: {
8956
+ type: [String, Number, Boolean],
8957
+ default: undefined
8958
+ },
8945
8959
  value: null,
8946
8960
  onClick: EventProp(),
8947
8961
  onClickOnce: EventProp(),
@@ -9134,13 +9148,13 @@
9134
9148
  }, {
9135
9149
  default: () => [slots.title?.({
9136
9150
  title: props.title
9137
- }) ?? props.title]
9151
+ }) ?? vue.toDisplayString(props.title)]
9138
9152
  }), hasSubtitle && vue.createVNode(VListItemSubtitle, {
9139
9153
  "key": "subtitle"
9140
9154
  }, {
9141
9155
  default: () => [slots.subtitle?.({
9142
9156
  subtitle: props.subtitle
9143
- }) ?? props.subtitle]
9157
+ }) ?? vue.toDisplayString(props.subtitle)]
9144
9158
  }), slots.default?.(slotProps.value)]), hasAppend && vue.createVNode("div", {
9145
9159
  "key": "append",
9146
9160
  "class": "v-list-item__append"
@@ -10741,10 +10755,10 @@
10741
10755
  activeChildren: new Set()
10742
10756
  });
10743
10757
  vue.provide(StackSymbol, stack);
10744
- const _zIndex = vue.shallowRef(+zIndex.value);
10758
+ const _zIndex = vue.shallowRef(Number(zIndex.value));
10745
10759
  useToggleScope(isActive, () => {
10746
10760
  const lastZIndex = globalStack.at(-1)?.[1];
10747
- _zIndex.value = lastZIndex ? lastZIndex + 10 : +zIndex.value;
10761
+ _zIndex.value = lastZIndex ? lastZIndex + 10 : Number(zIndex.value);
10748
10762
  if (createStackEntry) {
10749
10763
  globalStack.push([vm.uid, _zIndex.value]);
10750
10764
  }
@@ -13526,11 +13540,11 @@
13526
13540
  locationStyles
13527
13541
  } = useLocation(props, true, side => {
13528
13542
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
13529
- return base + (['top', 'bottom'].includes(side) ? +(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? +(props.offsetX ?? 0) : 0);
13543
+ return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
13530
13544
  });
13531
13545
  useRender(() => {
13532
13546
  const value = Number(props.content);
13533
- const content = !props.max || isNaN(value) ? props.content : value <= +props.max ? value : `${props.max}+`;
13547
+ const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
13534
13548
  const [badgeAttrs, attrs] = pickWithRest(ctx.attrs, ['aria-atomic', 'aria-label', 'aria-live', 'role', 'title']);
13535
13549
  return vue.createVNode(props.tag, vue.mergeProps({
13536
13550
  "class": ['v-badge', {
@@ -14229,8 +14243,14 @@
14229
14243
  appendIcon: IconValue,
14230
14244
  prependAvatar: String,
14231
14245
  prependIcon: IconValue,
14232
- subtitle: [String, Number],
14233
- title: [String, Number],
14246
+ subtitle: {
14247
+ type: [String, Number, Boolean],
14248
+ default: undefined
14249
+ },
14250
+ title: {
14251
+ type: [String, Number, Boolean],
14252
+ default: undefined
14253
+ },
14234
14254
  ...makeComponentProps(),
14235
14255
  ...makeDensityProps()
14236
14256
  }, 'VCardItem');
@@ -14280,11 +14300,11 @@
14280
14300
  }, [hasTitle && vue.createVNode(VCardTitle, {
14281
14301
  "key": "title"
14282
14302
  }, {
14283
- default: () => [slots.title?.() ?? props.title]
14303
+ default: () => [slots.title?.() ?? vue.toDisplayString(props.title)]
14284
14304
  }), hasSubtitle && vue.createVNode(VCardSubtitle, {
14285
14305
  "key": "subtitle"
14286
14306
  }, {
14287
- default: () => [slots.subtitle?.() ?? props.subtitle]
14307
+ default: () => [slots.subtitle?.() ?? vue.toDisplayString(props.subtitle)]
14288
14308
  }), slots.default?.()]), hasAppend && vue.createVNode("div", {
14289
14309
  "key": "append",
14290
14310
  "class": "v-card-item__append"
@@ -14356,9 +14376,18 @@
14356
14376
  type: [Boolean, Object],
14357
14377
  default: true
14358
14378
  },
14359
- subtitle: [String, Number],
14360
- text: [String, Number],
14361
- title: [String, Number],
14379
+ subtitle: {
14380
+ type: [String, Number, Boolean],
14381
+ default: undefined
14382
+ },
14383
+ text: {
14384
+ type: [String, Number, Boolean],
14385
+ default: undefined
14386
+ },
14387
+ title: {
14388
+ type: [String, Number, Boolean],
14389
+ default: undefined
14390
+ },
14362
14391
  ...makeBorderProps(),
14363
14392
  ...makeComponentProps(),
14364
14393
  ...makeDensityProps(),
@@ -14827,7 +14856,7 @@
14827
14856
  vue.onMounted(startTimeout);
14828
14857
  function startTimeout() {
14829
14858
  if (!props.cycle || !windowRef.value) return;
14830
- slideTimeout = window.setTimeout(windowRef.value.group.next, +props.interval > 0 ? +props.interval : 6000);
14859
+ slideTimeout = window.setTimeout(windowRef.value.group.next, Number(props.interval) > 0 ? Number(props.interval) : 6000);
14831
14860
  }
14832
14861
  function restartTimeout() {
14833
14862
  window.clearTimeout(slideTimeout);
@@ -15553,7 +15582,7 @@
15553
15582
  const useSteps = props => {
15554
15583
  const min = vue.computed(() => parseFloat(props.min));
15555
15584
  const max = vue.computed(() => parseFloat(props.max));
15556
- const step = vue.computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
15585
+ const step = vue.computed(() => Number(props.step) > 0 ? parseFloat(props.step) : 0);
15557
15586
  const decimals = vue.computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));
15558
15587
  function roundValue(value) {
15559
15588
  value = parseFloat(value);
@@ -18508,8 +18537,8 @@
18508
18537
  }, 'DataTable-paginate');
18509
18538
  const VDataTablePaginationSymbol = Symbol.for('vuetify:data-table-pagination');
18510
18539
  function createPagination(props) {
18511
- const page = useProxiedModel(props, 'page', undefined, value => +(value ?? 1));
18512
- const itemsPerPage = useProxiedModel(props, 'itemsPerPage', undefined, value => +(value ?? 10));
18540
+ const page = useProxiedModel(props, 'page', undefined, value => Number(value ?? 1));
18541
+ const itemsPerPage = useProxiedModel(props, 'itemsPerPage', undefined, value => Number(value ?? 10));
18513
18542
  return {
18514
18543
  page,
18515
18544
  itemsPerPage
@@ -19298,7 +19327,7 @@
19298
19327
  const minButtons = props.showFirstLastPage ? 5 : 3;
19299
19328
  return Math.max(0, Math.floor(
19300
19329
  // Round to two decimal places to avoid floating point errors
19301
- +((totalWidth - itemWidth * minButtons) / itemWidth).toFixed(2)));
19330
+ Number(((totalWidth - itemWidth * minButtons) / itemWidth).toFixed(2))));
19302
19331
  }
19303
19332
  const range = vue.computed(() => {
19304
19333
  if (length.value <= 0 || isNaN(length.value) || length.value > Number.MAX_SAFE_INTEGER) return [];
@@ -19369,7 +19398,7 @@
19369
19398
  ref,
19370
19399
  ellipsis: false,
19371
19400
  icon: true,
19372
- disabled: !!props.disabled || +props.length < 2,
19401
+ disabled: !!props.disabled || Number(props.length) < 2,
19373
19402
  color: isActive ? props.activeColor : props.color,
19374
19403
  'aria-current': isActive,
19375
19404
  'aria-label': t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, item),
@@ -19418,7 +19447,7 @@
19418
19447
  refs.value[currentIndex]?.$el.focus();
19419
19448
  }
19420
19449
  function onKeydown(e) {
19421
- if (e.key === keyValues.left && !props.disabled && page.value > +props.start) {
19450
+ if (e.key === keyValues.left && !props.disabled && page.value > Number(props.start)) {
19422
19451
  page.value = page.value - 1;
19423
19452
  vue.nextTick(updateFocus);
19424
19453
  } else if (e.key === keyValues.right && !props.disabled && page.value < start.value + length.value - 1) {
@@ -19751,10 +19780,10 @@
19751
19780
  } else {
19752
19781
  if (!seenFixed) {
19753
19782
  item.lastFixed = true;
19754
- } else if (isNaN(+item.width)) {
19783
+ } else if (isNaN(Number(item.width))) {
19755
19784
  consoleError(`Multiple fixed columns should have a static width (key: ${item.key})`);
19756
19785
  } else {
19757
- item.minWidth = Math.max(+item.width || 0, +item.minWidth || 0);
19786
+ item.minWidth = Math.max(Number(item.width) || 0, Number(item.minWidth) || 0);
19758
19787
  }
19759
19788
  seenFixed = true;
19760
19789
  }
@@ -24700,7 +24729,7 @@
24700
24729
  vue.watch(displayHeight, onScroll);
24701
24730
  vue.watch(() => contentRect.value?.height, onScroll);
24702
24731
  const scale = vue.computed(() => {
24703
- return 1 - clamp(+props.scale);
24732
+ return 1 - clamp(Number(props.scale));
24704
24733
  });
24705
24734
  let frame = -1;
24706
24735
  function onScroll() {
@@ -25121,7 +25150,7 @@
25121
25150
  themeClasses
25122
25151
  } = provideTheme(props);
25123
25152
  const rating = useProxiedModel(props, 'modelValue');
25124
- const normalizedValue = vue.computed(() => clamp(parseFloat(rating.value), 0, +props.length));
25153
+ const normalizedValue = vue.computed(() => clamp(parseFloat(rating.value), 0, Number(props.length)));
25125
25154
  const range = vue.computed(() => createRange(Number(props.length), 1));
25126
25155
  const increments = vue.computed(() => range.value.flatMap(v => props.halfIncrements ? [v - 0.5, v] : [v]));
25127
25156
  const hoverIndex = vue.shallowRef(-1);
@@ -25732,7 +25761,7 @@
25732
25761
  const height = Math.abs(gridY * value);
25733
25762
  return {
25734
25763
  x: minX + index * gridX,
25735
- y: horizonY - height + +(value < 0) * height,
25764
+ y: horizonY - height + Number(value < 0) * height,
25736
25765
  height,
25737
25766
  value
25738
25767
  };
@@ -27170,10 +27199,10 @@
27170
27199
  }
27171
27200
  }
27172
27201
  const sizerRef = vue.ref();
27173
- const rows = vue.ref(+props.rows);
27202
+ const rows = vue.ref(Number(props.rows));
27174
27203
  const isPlainOrUnderlined = vue.computed(() => ['plain', 'underlined'].includes(props.variant));
27175
27204
  vue.watchEffect(() => {
27176
- if (!props.autoGrow) rows.value = +props.rows;
27205
+ if (!props.autoGrow) rows.value = Number(props.rows);
27177
27206
  });
27178
27207
  function calculateInputHeight() {
27179
27208
  if (!props.autoGrow) return;
@@ -28544,8 +28573,9 @@
28544
28573
  inputRef.value?.click();
28545
28574
  }
28546
28575
  function onClickRemove(index) {
28547
- model.value = model.value.filter((_, i) => i !== index);
28548
- if (model.value.length > 0 || !inputRef.value) return;
28576
+ const newValue = model.value.filter((_, i) => i !== index);
28577
+ model.value = newValue;
28578
+ if (newValue.length > 0 || !inputRef.value) return;
28549
28579
  inputRef.value.value = '';
28550
28580
  }
28551
28581
  useRender(() => {
@@ -28756,7 +28786,7 @@
28756
28786
  return isFocused.value ? Number(fixed).toString() // trim zeros
28757
28787
  : fixed;
28758
28788
  }
28759
- const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(+val, props.min, props.max));
28789
+ const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
28760
28790
  const _inputText = vue.shallowRef(null);
28761
28791
  vue.watchEffect(() => {
28762
28792
  if (isFocused.value && !controlsDisabled.value) ; else if (model.value == null) {
@@ -28771,8 +28801,8 @@
28771
28801
  if (val === null || val === '') {
28772
28802
  model.value = null;
28773
28803
  _inputText.value = null;
28774
- } else if (!isNaN(+val) && +val <= props.max && +val >= props.min) {
28775
- model.value = +val;
28804
+ } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {
28805
+ model.value = Number(val);
28776
28806
  _inputText.value = val;
28777
28807
  }
28778
28808
  }
@@ -28896,8 +28926,8 @@
28896
28926
  if (controlsDisabled.value) return;
28897
28927
  if (!vTextFieldRef.value) return;
28898
28928
  const actualText = vTextFieldRef.value.value;
28899
- if (actualText && !isNaN(+actualText)) {
28900
- inputText.value = correctPrecision(clamp(+actualText, props.min, props.max));
28929
+ if (actualText && !isNaN(Number(actualText))) {
28930
+ inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max));
28901
28931
  } else {
28902
28932
  inputText.value = null;
28903
28933
  }
@@ -29771,14 +29801,7 @@
29771
29801
  }
29772
29802
  });
29773
29803
 
29774
- // @ts-nocheck
29775
- /* eslint-disable */
29776
- var SelectingTimes = /*#__PURE__*/function (SelectingTimes) {
29777
- SelectingTimes[SelectingTimes["Hour"] = 1] = "Hour";
29778
- SelectingTimes[SelectingTimes["Minute"] = 2] = "Minute";
29779
- SelectingTimes[SelectingTimes["Second"] = 3] = "Second";
29780
- return SelectingTimes;
29781
- }(SelectingTimes || {});
29804
+ // Types
29782
29805
 
29783
29806
  const makeVTimePickerControlsProps = propsFactory({
29784
29807
  ampm: Boolean,
@@ -29792,15 +29815,15 @@
29792
29815
  period: String,
29793
29816
  readonly: Boolean,
29794
29817
  useSeconds: Boolean,
29795
- selecting: Number,
29796
- value: Number
29818
+ value: Number,
29819
+ viewMode: String
29797
29820
  }, 'VTimePickerControls');
29798
29821
  const VTimePickerControls = genericComponent()({
29799
29822
  name: 'VTimePickerControls',
29800
29823
  props: makeVTimePickerControlsProps(),
29801
29824
  emits: {
29802
29825
  'update:period': data => true,
29803
- 'update:selecting': data => true
29826
+ 'update:viewMode': data => true
29804
29827
  },
29805
29828
  setup(props, _ref) {
29806
29829
  let {
@@ -29823,8 +29846,8 @@
29823
29846
  'v-time-picker-controls__time--with-seconds': props.useSeconds
29824
29847
  }
29825
29848
  }, [vue.createVNode(VBtn, {
29826
- "active": props.selecting === 1,
29827
- "color": props.selecting === 1 ? props.color : undefined,
29849
+ "active": props.viewMode === 'hour',
29850
+ "color": props.viewMode === 'hour' ? props.color : undefined,
29828
29851
  "disabled": props.disabled,
29829
29852
  "variant": "tonal",
29830
29853
  "class": {
@@ -29833,24 +29856,24 @@
29833
29856
  'v-time-picker-controls__time--with-seconds__btn': props.useSeconds
29834
29857
  },
29835
29858
  "text": props.hour == null ? '--' : pad(`${hour}`),
29836
- "onClick": () => emit('update:selecting', SelectingTimes.Hour)
29859
+ "onClick": () => emit('update:viewMode', 'hour')
29837
29860
  }, null), vue.createVNode("span", {
29838
29861
  "class": ['v-time-picker-controls__time__separator', {
29839
29862
  'v-time-picker-controls--with-seconds__time__separator': props.useSeconds
29840
29863
  }]
29841
29864
  }, [vue.createTextVNode(":")]), vue.createVNode(VBtn, {
29842
- "active": props.selecting === 2,
29843
- "color": props.selecting === 2 ? props.color : undefined,
29865
+ "active": props.viewMode === 'minute',
29866
+ "color": props.viewMode === 'minute' ? props.color : undefined,
29844
29867
  "class": {
29845
29868
  'v-time-picker-controls__time__btn': true,
29846
- 'v-time-picker-controls__time__btn__active': props.selecting === 2,
29869
+ 'v-time-picker-controls__time__btn__active': props.viewMode === 'minute',
29847
29870
  'v-time-picker-controls__time--with-ampm__btn': props.ampm,
29848
29871
  'v-time-picker-controls__time--with-seconds__btn': props.useSeconds
29849
29872
  },
29850
29873
  "disabled": props.disabled,
29851
29874
  "variant": "tonal",
29852
29875
  "text": props.minute == null ? '--' : pad(props.minute),
29853
- "onClick": () => emit('update:selecting', SelectingTimes.Minute)
29876
+ "onClick": () => emit('update:viewMode', 'minute')
29854
29877
  }, null), props.useSeconds && vue.createVNode("span", {
29855
29878
  "class": ['v-time-picker-controls__time__separator', {
29856
29879
  'v-time-picker-controls--with-seconds__time__separator': props.useSeconds
@@ -29859,10 +29882,10 @@
29859
29882
  }, [vue.createTextVNode(":")]), props.useSeconds && vue.createVNode(VBtn, {
29860
29883
  "key": "secondsVal",
29861
29884
  "variant": "tonal",
29862
- "onClick": () => emit('update:selecting', SelectingTimes.Second),
29885
+ "onClick": () => emit('update:viewMode', 'second'),
29863
29886
  "class": {
29864
29887
  'v-time-picker-controls__time__btn': true,
29865
- 'v-time-picker-controls__time__btn__active': props.selecting === 3,
29888
+ 'v-time-picker-controls__time__btn__active': props.viewMode === 'second',
29866
29889
  'v-time-picker-controls__time--with-seconds__btn': props.useSeconds
29867
29890
  },
29868
29891
  "disabled": props.disabled,
@@ -29907,11 +29930,6 @@
29907
29930
  const rangeHours12am = createRange(12);
29908
29931
  const rangeHours12pm = rangeHours12am.map(v => v + 12);
29909
29932
  createRange(60);
29910
- const selectingNames = {
29911
- 1: 'hour',
29912
- 2: 'minute',
29913
- 3: 'second'
29914
- };
29915
29933
  const makeVTimePickerProps = propsFactory({
29916
29934
  allowedHours: [Function, Array],
29917
29935
  allowedMinutes: [Function, Array],
@@ -29924,6 +29942,10 @@
29924
29942
  },
29925
29943
  max: String,
29926
29944
  min: String,
29945
+ viewMode: {
29946
+ type: String,
29947
+ default: 'hour'
29948
+ },
29927
29949
  modelValue: null,
29928
29950
  readonly: Boolean,
29929
29951
  scrollable: Boolean,
@@ -29940,7 +29962,8 @@
29940
29962
  'update:minute': val => true,
29941
29963
  'update:period': val => true,
29942
29964
  'update:second': val => true,
29943
- 'update:modelValue': val => true
29965
+ 'update:modelValue': val => true,
29966
+ 'update:viewMode': val => true
29944
29967
  },
29945
29968
  setup(props, _ref) {
29946
29969
  let {
@@ -29957,7 +29980,7 @@
29957
29980
  const lazyInputMinute = vue.ref(null);
29958
29981
  const lazyInputSecond = vue.ref(null);
29959
29982
  const period = vue.ref('am');
29960
- const selecting = vue.ref(SelectingTimes.Hour);
29983
+ const viewMode = useProxiedModel(props, 'viewMode', 'hour');
29961
29984
  const controlsRef = vue.ref(null);
29962
29985
  const clockRef = vue.ref(null);
29963
29986
  const isAllowedHourCb = vue.computed(() => {
@@ -29971,7 +29994,7 @@
29971
29994
  const minHour = props.min ? Number(props.min.split(':')[0]) : 0;
29972
29995
  const maxHour = props.max ? Number(props.max.split(':')[0]) : 23;
29973
29996
  return val => {
29974
- return val >= minHour * 1 && val <= maxHour * 1 && (!cb || cb(val));
29997
+ return val >= Number(minHour) && val <= Number(maxHour) && (!cb || cb(val));
29975
29998
  };
29976
29999
  });
29977
30000
  const isAllowedMinuteCb = vue.computed(() => {
@@ -29987,8 +30010,8 @@
29987
30010
  }
29988
30011
  const [minHour, minMinute] = props.min ? props.min.split(':').map(Number) : [0, 0];
29989
30012
  const [maxHour, maxMinute] = props.max ? props.max.split(':').map(Number) : [23, 59];
29990
- const minTime = minHour * 60 + minMinute * 1;
29991
- const maxTime = maxHour * 60 + maxMinute * 1;
30013
+ const minTime = minHour * 60 + Number(minMinute);
30014
+ const maxTime = maxHour * 60 + Number(maxMinute);
29992
30015
  return val => {
29993
30016
  const time = 60 * inputHour.value + val;
29994
30017
  return time >= minTime && time <= maxTime && isHourAllowed && (!cb || cb(val));
@@ -30008,8 +30031,8 @@
30008
30031
  }
30009
30032
  const [minHour, minMinute, minSecond] = props.min ? props.min.split(':').map(Number) : [0, 0, 0];
30010
30033
  const [maxHour, maxMinute, maxSecond] = props.max ? props.max.split(':').map(Number) : [23, 59, 59];
30011
- const minTime = minHour * 3600 + minMinute * 60 + (minSecond || 0) * 1;
30012
- const maxTime = maxHour * 3600 + maxMinute * 60 + (maxSecond || 0) * 1;
30034
+ const minTime = minHour * 3600 + minMinute * 60 + Number(minSecond || 0);
30035
+ const maxTime = maxHour * 3600 + maxMinute * 60 + Number(maxSecond || 0);
30013
30036
  return val => {
30014
30037
  const time = 3600 * inputHour.value + 60 * inputMinute.value + val;
30015
30038
  return time >= minTime && time <= maxTime && isMinuteAllowed && (!cb || cb(val));
@@ -30075,16 +30098,16 @@
30075
30098
  return true;
30076
30099
  }
30077
30100
  function onInput(value) {
30078
- if (selecting.value === SelectingTimes.Hour) {
30101
+ if (viewMode.value === 'hour') {
30079
30102
  inputHour.value = isAmPm.value ? convert12to24(value, period.value) : value;
30080
- } else if (selecting.value === SelectingTimes.Minute) {
30103
+ } else if (viewMode.value === 'minute') {
30081
30104
  inputMinute.value = value;
30082
30105
  } else {
30083
30106
  inputSecond.value = value;
30084
30107
  }
30085
30108
  }
30086
30109
  function onChange(value) {
30087
- switch (selectingNames[selecting.value]) {
30110
+ switch (viewMode.value || 'hour') {
30088
30111
  case 'hour':
30089
30112
  emit('update:hour', value);
30090
30113
  break;
@@ -30096,10 +30119,10 @@
30096
30119
  break;
30097
30120
  }
30098
30121
  const emitChange = inputHour.value !== null && inputMinute.value !== null && (props.useSeconds ? inputSecond.value !== null : true);
30099
- if (selecting.value === SelectingTimes.Hour) {
30100
- selecting.value = SelectingTimes.Minute;
30101
- } else if (props.useSeconds && selecting.value === SelectingTimes.Minute) {
30102
- selecting.value = SelectingTimes.Second;
30122
+ if (viewMode.value === 'hour') {
30123
+ viewMode.value = 'minute';
30124
+ } else if (props.useSeconds && viewMode.value === 'minute') {
30125
+ viewMode.value = 'second';
30103
30126
  }
30104
30127
  if (inputHour.value === lazyInputHour.value && inputMinute.value === lazyInputMinute.value && (!props.useSeconds || inputSecond.value === lazyInputSecond.value)) return;
30105
30128
  const time = genValue();
@@ -30128,20 +30151,20 @@
30128
30151
  "minute": inputMinute.value,
30129
30152
  "period": period.value,
30130
30153
  "second": inputSecond.value,
30131
- "selecting": selecting.value,
30154
+ "viewMode": viewMode.value,
30132
30155
  "onUpdate:period": val => setPeriod(val),
30133
- "onUpdate:selecting": value => selecting.value = value,
30156
+ "onUpdate:viewMode": value => viewMode.value = value,
30134
30157
  "ref": controlsRef
30135
30158
  }), null),
30136
30159
  default: () => vue.createVNode(VTimePickerClock, vue.mergeProps(timePickerClockProps, {
30137
- "allowedValues": selecting.value === SelectingTimes.Hour ? isAllowedHourCb.value : selecting.value === SelectingTimes.Minute ? isAllowedMinuteCb.value : isAllowedSecondCb.value,
30138
- "double": selecting.value === SelectingTimes.Hour && !isAmPm.value,
30139
- "format": selecting.value === SelectingTimes.Hour ? isAmPm.value ? convert24to12 : val => val : val => pad(val, 2),
30140
- "max": selecting.value === SelectingTimes.Hour ? isAmPm.value && period.value === 'am' ? 11 : 23 : 59,
30141
- "min": selecting.value === SelectingTimes.Hour && isAmPm.value && period.value === 'pm' ? 12 : 0,
30160
+ "allowedValues": viewMode.value === 'hour' ? isAllowedHourCb.value : viewMode.value === 'minute' ? isAllowedMinuteCb.value : isAllowedSecondCb.value,
30161
+ "double": viewMode.value === 'hour' && !isAmPm.value,
30162
+ "format": viewMode.value === 'hour' ? isAmPm.value ? convert24to12 : val => val : val => pad(val, 2),
30163
+ "max": viewMode.value === 'hour' ? isAmPm.value && period.value === 'am' ? 11 : 23 : 59,
30164
+ "min": viewMode.value === 'hour' && isAmPm.value && period.value === 'pm' ? 12 : 0,
30142
30165
  "size": 20,
30143
- "step": selecting.value === SelectingTimes.Hour ? 1 : 5,
30144
- "modelValue": selecting.value === SelectingTimes.Hour ? inputHour.value : selecting.value === SelectingTimes.Minute ? inputMinute.value : inputSecond.value,
30166
+ "step": viewMode.value === 'hour' ? 1 : 5,
30167
+ "modelValue": viewMode.value === 'hour' ? inputHour.value : viewMode.value === 'minute' ? inputMinute.value : inputSecond.value,
30145
30168
  "onChange": onChange,
30146
30169
  "onInput": onInput,
30147
30170
  "ref": clockRef
@@ -31054,7 +31077,7 @@
31054
31077
  goTo
31055
31078
  };
31056
31079
  }
31057
- const version$1 = "3.7.15-master.2025-03-05";
31080
+ const version$1 = "3.7.15-master.2025-03-07";
31058
31081
  createVuetify$1.version = version$1;
31059
31082
 
31060
31083
  // Vue's inject() can only be used in setup
@@ -31307,7 +31330,7 @@
31307
31330
 
31308
31331
  /* eslint-disable local-rules/sort-imports */
31309
31332
 
31310
- const version = "3.7.15-master.2025-03-05";
31333
+ const version = "3.7.15-master.2025-03-07";
31311
31334
 
31312
31335
  /* eslint-disable local-rules/sort-imports */
31313
31336