vuetify 3.8.3 → 3.8.5

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 (117) hide show
  1. package/dist/_component-variables-labs.sass +1 -0
  2. package/dist/json/attributes.json +4267 -3919
  3. package/dist/json/importMap-labs.json +28 -24
  4. package/dist/json/importMap.json +164 -164
  5. package/dist/json/tags.json +92 -0
  6. package/dist/json/web-types.json +8380 -7153
  7. package/dist/vuetify-labs.cjs +374 -79
  8. package/dist/vuetify-labs.css +3864 -3836
  9. package/dist/vuetify-labs.d.ts +5818 -1810
  10. package/dist/vuetify-labs.esm.js +374 -79
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +374 -79
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +53 -30
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3556 -3531
  17. package/dist/vuetify.d.ts +4121 -1210
  18. package/dist/vuetify.esm.js +53 -30
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +53 -30
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +30 -27
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.d.ts +795 -77
  26. package/lib/components/VBadge/VBadge.d.ts +22 -46
  27. package/lib/components/VBottomNavigation/VBottomNavigation.d.ts +6 -6
  28. package/lib/components/VBottomSheet/VBottomSheet.css +1 -1
  29. package/lib/components/VBottomSheet/VBottomSheet.d.ts +1434 -80
  30. package/lib/components/VBottomSheet/VBottomSheet.sass +1 -1
  31. package/lib/components/VBtn/VBtn.css +25 -0
  32. package/lib/components/VBtn/VBtn.sass +9 -0
  33. package/lib/components/VBtn/_variables.scss +1 -0
  34. package/lib/components/VCombobox/VCombobox.d.ts +795 -77
  35. package/lib/components/VCounter/VCounter.d.ts +22 -46
  36. package/lib/components/VDataIterator/VDataIterator.d.ts +22 -46
  37. package/lib/components/VDataTable/VDataTable.d.ts +110 -110
  38. package/lib/components/VDataTable/VDataTableHeaders.js +1 -2
  39. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  40. package/lib/components/VDataTable/VDataTableServer.d.ts +62 -189
  41. package/lib/components/VDataTable/VDataTableServer.js.map +1 -1
  42. package/lib/components/VDataTable/VDataTableVirtual.d.ts +62 -189
  43. package/lib/components/VDataTable/VDataTableVirtual.js.map +1 -1
  44. package/lib/components/VDataTable/composables/headers.d.ts +75 -75
  45. package/lib/components/VDataTable/composables/select.js +1 -1
  46. package/lib/components/VDataTable/composables/select.js.map +1 -1
  47. package/lib/components/VDatePicker/VDatePicker.d.ts +3 -3
  48. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +6 -6
  49. package/lib/components/VDialog/VDialog.d.ts +1048 -146
  50. package/lib/components/VDialog/VDialog.js +1 -1
  51. package/lib/components/VDialog/VDialog.js.map +1 -1
  52. package/lib/components/VFab/VFab.d.ts +22 -46
  53. package/lib/components/VFileInput/VFileInput.css +4 -0
  54. package/lib/components/VFileInput/VFileInput.js +21 -3
  55. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  56. package/lib/components/VFileInput/VFileInput.sass +4 -0
  57. package/lib/components/VImg/VImg.d.ts +22 -49
  58. package/lib/components/VLazy/VLazy.d.ts +22 -46
  59. package/lib/components/VMenu/VMenu.d.ts +1048 -146
  60. package/lib/components/VMenu/VMenu.js.map +1 -1
  61. package/lib/components/VMessages/VMessages.d.ts +22 -46
  62. package/lib/components/VNumberInput/VNumberInput.d.ts +3 -3
  63. package/lib/components/VOverlay/VOverlay.d.ts +22 -49
  64. package/lib/components/VOverlay/locationStrategies.js +1 -1
  65. package/lib/components/VOverlay/locationStrategies.js.map +1 -1
  66. package/lib/components/VSelect/VSelect.d.ts +1235 -93
  67. package/lib/components/VSnackbar/VSnackbar.d.ts +58 -109
  68. package/lib/components/VSnackbarQueue/VSnackbarQueue.d.ts +25 -47
  69. package/lib/components/VSnackbarQueue/VSnackbarQueue.js.map +1 -1
  70. package/lib/components/VSpeedDial/VSpeedDial.d.ts +1434 -80
  71. package/lib/components/VTable/VTable.css +2 -6
  72. package/lib/components/VTable/VTable.sass +4 -22
  73. package/lib/components/VTabs/VTabs.d.ts +6 -6
  74. package/lib/components/VTextField/VTextField.js +5 -3
  75. package/lib/components/VTextField/VTextField.js.map +1 -1
  76. package/lib/components/VTooltip/VTooltip.d.ts +58 -109
  77. package/lib/components/VTooltip/VTooltip.js +2 -2
  78. package/lib/components/VTooltip/VTooltip.js.map +1 -1
  79. package/lib/components/transitions/dialog-transition.js +3 -3
  80. package/lib/components/transitions/dialog-transition.js.map +1 -1
  81. package/lib/composables/dateFormat.d.ts +24 -0
  82. package/lib/composables/dateFormat.js +112 -0
  83. package/lib/composables/dateFormat.js.map +1 -0
  84. package/lib/composables/transition.d.ts +10 -20
  85. package/lib/composables/transition.js +15 -12
  86. package/lib/composables/transition.js.map +1 -1
  87. package/lib/entry-bundler.d.ts +6 -6
  88. package/lib/entry-bundler.js +1 -1
  89. package/lib/framework.d.ts +113 -149
  90. package/lib/framework.js +1 -1
  91. package/lib/iconsets/mdi.js +2 -1
  92. package/lib/iconsets/mdi.js.map +1 -1
  93. package/lib/labs/VCalendar/VCalendar.d.ts +3 -3
  94. package/lib/labs/VCalendar/VCalendarDay.d.ts +3 -3
  95. package/lib/labs/VCalendar/VCalendarInterval.d.ts +3 -3
  96. package/lib/labs/VCalendar/VCalendarMonthDay.d.ts +3 -3
  97. package/lib/labs/VColorInput/VColorInput.css +4 -0
  98. package/lib/labs/VColorInput/VColorInput.d.ts +1767 -0
  99. package/lib/labs/VColorInput/VColorInput.js +129 -0
  100. package/lib/labs/VColorInput/VColorInput.js.map +1 -0
  101. package/lib/labs/VColorInput/VColorInput.sass +7 -0
  102. package/lib/labs/VColorInput/_variables.scss +2 -0
  103. package/lib/labs/VColorInput/index.d.ts +1 -0
  104. package/lib/labs/VColorInput/index.js +2 -0
  105. package/lib/labs/VColorInput/index.js.map +1 -0
  106. package/lib/labs/VDateInput/VDateInput.d.ts +96 -34
  107. package/lib/labs/VDateInput/VDateInput.js +71 -17
  108. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  109. package/lib/labs/VFileUpload/VFileUpload.js +19 -31
  110. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  111. package/lib/labs/VTimePicker/VTimePickerClock.js +2 -2
  112. package/lib/labs/VTimePicker/VTimePickerClock.js.map +1 -1
  113. package/lib/labs/components.d.ts +1 -0
  114. package/lib/labs/components.js +1 -0
  115. package/lib/labs/components.js.map +1 -1
  116. package/lib/util/helpers.js.map +1 -1
  117. package/package.json +7 -8
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.3
2
+ * Vuetify v3.8.5
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -2923,10 +2923,10 @@ const VDialogTransition = genericComponent()({
2923
2923
  async onLeave(el, done) {
2924
2924
  await new Promise(resolve => requestAnimationFrame(resolve));
2925
2925
  let dimensions;
2926
- if (!Array.isArray(props.target) && !props.target.offsetParent && saved.has(el)) {
2927
- dimensions = saved.get(el);
2928
- } else {
2926
+ if (!saved.has(el) || Array.isArray(props.target) || props.target.offsetParent || props.target.getClientRects().length) {
2929
2927
  dimensions = getDimensions(props.target, el);
2928
+ } else {
2929
+ dimensions = saved.get(el);
2930
2930
  }
2931
2931
  const {
2932
2932
  x,
@@ -3251,7 +3251,7 @@ function useRounded(props) {
3251
3251
 
3252
3252
  const makeTransitionProps = propsFactory({
3253
3253
  transition: {
3254
- type: [Boolean, String, Object],
3254
+ type: null,
3255
3255
  default: 'fade-transition',
3256
3256
  validator: val => val !== true
3257
3257
  }
@@ -3269,16 +3269,19 @@ const MaybeTransition = (props, _ref) => {
3269
3269
  const {
3270
3270
  component = group ? TransitionGroup : Transition,
3271
3271
  ...customProps
3272
- } = typeof transition === 'object' ? transition : {};
3273
- return h(component, mergeProps(typeof transition === 'string' ? {
3274
- name: disabled ? '' : transition
3275
- } : customProps, typeof transition === 'string' ? {} : Object.fromEntries(Object.entries({
3276
- disabled,
3277
- group
3278
- }).filter(_ref2 => {
3279
- let [_, v] = _ref2;
3280
- return v !== undefined;
3281
- })), rest), slots);
3272
+ } = isObject(transition) ? transition : {};
3273
+ let transitionProps;
3274
+ if (isObject(transition)) {
3275
+ transitionProps = mergeProps(customProps, JSON.parse(JSON.stringify({
3276
+ disabled,
3277
+ group
3278
+ })), rest);
3279
+ } else {
3280
+ transitionProps = mergeProps({
3281
+ name: disabled || !transition ? '' : transition
3282
+ }, rest);
3283
+ }
3284
+ return h(component, transitionProps, slots);
3282
3285
  };
3283
3286
 
3284
3287
  // Utilities
@@ -4503,7 +4506,8 @@ const aliases = {
4503
4506
  treeviewCollapse: 'mdi-menu-down',
4504
4507
  treeviewExpand: 'mdi-menu-right',
4505
4508
  eyeDropper: 'mdi-eyedropper',
4506
- upload: 'mdi-cloud-upload'
4509
+ upload: 'mdi-cloud-upload',
4510
+ color: 'mdi-palette'
4507
4511
  };
4508
4512
  const mdi = {
4509
4513
  // Not using mergeProps here, functional components merge props by default (?)
@@ -10161,7 +10165,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
10161
10165
  observe = false;
10162
10166
  requestAnimationFrame(() => observe = true);
10163
10167
  if (!data.target.value || !data.contentEl.value) return;
10164
- if (Array.isArray(data.target.value) || data.target.value.offsetParent) {
10168
+ if (Array.isArray(data.target.value) || data.target.value.offsetParent || data.target.value.getClientRects().length) {
10165
10169
  targetBox = getTargetBox(data.target.value);
10166
10170
  } // Otherwise target element is hidden, use last known value
10167
10171
 
@@ -12081,11 +12085,12 @@ const VTextField = genericComponent()({
12081
12085
  onFocus();
12082
12086
  emit('click:control', e);
12083
12087
  }
12084
- function onClear(e) {
12088
+ function onClear(e, reset) {
12085
12089
  e.stopPropagation();
12086
12090
  onFocus();
12087
12091
  nextTick(() => {
12088
12092
  model.value = null;
12093
+ reset();
12089
12094
  callEvent(props['onClick:clear'], e);
12090
12095
  });
12091
12096
  }
@@ -12130,13 +12135,14 @@ const VTextField = genericComponent()({
12130
12135
  isDisabled,
12131
12136
  isDirty,
12132
12137
  isReadonly,
12133
- isValid
12138
+ isValid,
12139
+ reset
12134
12140
  } = _ref2;
12135
12141
  return createVNode(VField, mergeProps({
12136
12142
  "ref": vFieldRef,
12137
12143
  "onMousedown": onControlMousedown,
12138
12144
  "onClick": onControlClick,
12139
- "onClick:clear": onClear,
12145
+ "onClick:clear": e => onClear(e, reset),
12140
12146
  "onClick:prependInner": props['onClick:prependInner'],
12141
12147
  "onClick:appendInner": props['onClick:appendInner'],
12142
12148
  "role": props.role
@@ -14116,7 +14122,7 @@ const VDialog = genericComponent()({
14116
14122
  }
14117
14123
  function onAfterEnter() {
14118
14124
  emit('afterEnter');
14119
- if (overlay.value?.contentEl && !overlay.value.contentEl.contains(document.activeElement)) {
14125
+ if ((props.scrim || props.retainFocus) && overlay.value?.contentEl && !overlay.value.contentEl.contains(document.activeElement)) {
14120
14126
  overlay.value.contentEl.focus({
14121
14127
  preventScroll: true
14122
14128
  });
@@ -18988,7 +18994,7 @@ function provideSelection(props, _ref9) {
18988
18994
  index = index ?? currentPage.value.findIndex(i => i.value === item.value);
18989
18995
  if (props.selectStrategy !== 'single' && event?.shiftKey && lastSelectedIndex.value !== null) {
18990
18996
  const [start, end] = [lastSelectedIndex.value, index].sort((a, b) => a - b);
18991
- items.push(...currentPage.value.slice(start, end + 1));
18997
+ items.push(...currentPage.value.slice(start, end + 1).filter(item => item.selectable));
18992
18998
  } else {
18993
18999
  items.push(item);
18994
19000
  lastSelectedIndex.value = index;
@@ -20324,7 +20330,6 @@ const VDataTableHeaders = genericComponent()({
20324
20330
  });
20325
20331
  };
20326
20332
  const VDataTableMobileHeaderCell = () => {
20327
- const headerProps = mergeProps(props.headerProps ?? {} ?? {});
20328
20333
  const displayItems = computed(() => {
20329
20334
  return columns.value.filter(column => column?.sortable && !props.disableSort);
20330
20335
  });
@@ -20337,7 +20342,7 @@ const VDataTableHeaders = genericComponent()({
20337
20342
  "tag": "th",
20338
20343
  "class": [...headerCellClasses.value],
20339
20344
  "colspan": headers.value.length + 1
20340
- }, headerProps), {
20345
+ }, props.headerProps), {
20341
20346
  default: () => [createVNode("div", {
20342
20347
  "class": "v-data-table-header__content"
20343
20348
  }, [createVNode(VSelect, {
@@ -23260,6 +23265,7 @@ const VFileInput = genericComponent()({
23260
23265
  const inputRef = ref();
23261
23266
  const isActive = toRef(() => isFocused.value || props.active);
23262
23267
  const isPlainOrUnderlined = computed(() => ['plain', 'underlined'].includes(props.variant));
23268
+ const isDragging = shallowRef(false);
23263
23269
  function onFocus() {
23264
23270
  if (inputRef.value !== document.activeElement) {
23265
23271
  inputRef.value?.focus();
@@ -23286,11 +23292,26 @@ const VFileInput = genericComponent()({
23286
23292
  }
23287
23293
  function onDragover(e) {
23288
23294
  e.preventDefault();
23295
+ e.stopImmediatePropagation();
23296
+ isDragging.value = true;
23297
+ }
23298
+ function onDragleave(e) {
23299
+ e.preventDefault();
23300
+ isDragging.value = false;
23289
23301
  }
23290
23302
  function onDrop(e) {
23291
23303
  e.preventDefault();
23292
- if (!e.dataTransfer) return;
23293
- model.value = [...(e.dataTransfer.files ?? [])];
23304
+ e.stopImmediatePropagation();
23305
+ isDragging.value = false;
23306
+ if (!e.dataTransfer?.files?.length || !inputRef.value) return;
23307
+ const dataTransfer = new DataTransfer();
23308
+ for (const file of e.dataTransfer.files) {
23309
+ dataTransfer.items.add(file);
23310
+ }
23311
+ inputRef.value.files = dataTransfer.files;
23312
+ inputRef.value.dispatchEvent(new Event('change', {
23313
+ bubbles: true
23314
+ }));
23294
23315
  }
23295
23316
  watch(model, newValue => {
23296
23317
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -23312,6 +23333,7 @@ const VFileInput = genericComponent()({
23312
23333
  "modelValue": props.multiple ? model.value : model.value[0],
23313
23334
  "class": ['v-file-input', {
23314
23335
  'v-file-input--chips': !!props.chips,
23336
+ 'v-file-input--dragging': isDragging.value,
23315
23337
  'v-file-input--hide': props.hideInput,
23316
23338
  'v-input--plain-underlined': isPlainOrUnderlined.value
23317
23339
  }, props.class],
@@ -23373,6 +23395,7 @@ const VFileInput = genericComponent()({
23373
23395
  const target = e.target;
23374
23396
  model.value = [...(target.files ?? [])];
23375
23397
  },
23398
+ "onDragleave": onDragleave,
23376
23399
  "onFocus": onFocus,
23377
23400
  "onBlur": blur
23378
23401
  }, slotProps, inputAttrs), null), createVNode("div", {
@@ -28360,7 +28383,7 @@ const makeVTooltipProps = propsFactory({
28360
28383
  origin: 'auto',
28361
28384
  scrim: false,
28362
28385
  scrollStrategy: 'reposition',
28363
- transition: false
28386
+ transition: null
28364
28387
  }), ['absolute', 'persistent'])
28365
28388
  }, 'VTooltip');
28366
28389
  const VTooltip = genericComponent()({
@@ -28387,7 +28410,7 @@ const VTooltip = genericComponent()({
28387
28410
  return props.origin === 'auto' || props.origin === 'overlap' || props.origin.split(' ').length > 1 || props.location.split(' ').length > 1 ? props.origin : props.origin + ' center';
28388
28411
  });
28389
28412
  const transition = toRef(() => {
28390
- if (props.transition) return props.transition;
28413
+ if (props.transition != null) return props.transition;
28391
28414
  return isActive.value ? 'scale-transition' : 'fade-transition';
28392
28415
  });
28393
28416
  const activatorProps = computed(() => mergeProps({
@@ -29050,6 +29073,236 @@ const VCalendar = genericComponent()({
29050
29073
 
29051
29074
  // Types
29052
29075
 
29076
+ const makeVColorInputProps = propsFactory({
29077
+ pip: Boolean,
29078
+ pipIcon: {
29079
+ type: String,
29080
+ default: '$color'
29081
+ },
29082
+ ...makeFocusProps(),
29083
+ ...makeVConfirmEditProps(),
29084
+ ...makeVTextFieldProps(),
29085
+ ...omit(makeVColorPickerProps(), ['width'])
29086
+ }, 'VColorInput');
29087
+ const VColorInput = genericComponent()({
29088
+ name: 'VColorInput',
29089
+ props: makeVColorInputProps(),
29090
+ emits: {
29091
+ 'update:modelValue': val => true
29092
+ },
29093
+ setup(props, _ref) {
29094
+ let {
29095
+ slots
29096
+ } = _ref;
29097
+ const {
29098
+ isFocused,
29099
+ focus,
29100
+ blur
29101
+ } = useFocus(props);
29102
+ const model = useProxiedModel(props, 'modelValue');
29103
+ const menu = shallowRef(false);
29104
+ const isInteractive = computed(() => !props.disabled && !props.readonly);
29105
+ const display = computed(() => model.value || null);
29106
+ function onKeydown(e) {
29107
+ if (e.key !== 'Enter') return;
29108
+ if (!menu.value || !isFocused.value) {
29109
+ menu.value = true;
29110
+ return;
29111
+ }
29112
+ const target = e.target;
29113
+ model.value = target.value;
29114
+ }
29115
+ function onClick(e) {
29116
+ e.preventDefault();
29117
+ e.stopPropagation();
29118
+ menu.value = true;
29119
+ }
29120
+ function onSave() {
29121
+ menu.value = false;
29122
+ }
29123
+ useRender(() => {
29124
+ const confirmEditProps = VConfirmEdit.filterProps(props);
29125
+ const colorPickerProps = VColorPicker.filterProps(omit(props, ['active', 'color']));
29126
+ const textFieldProps = VTextField.filterProps(omit(props, ['prependInnerIcon']));
29127
+ const hasPrepend = !!(slots.prepend || props.pipIcon);
29128
+ return createVNode(VTextField, mergeProps(textFieldProps, {
29129
+ "class": ['v-color-input', props.class],
29130
+ "style": props.style,
29131
+ "modelValue": display.value,
29132
+ "onKeydown": isInteractive.value ? onKeydown : undefined,
29133
+ "focused": menu.value || isFocused.value,
29134
+ "onFocus": focus,
29135
+ "onBlur": blur,
29136
+ "onClick:control": isInteractive.value ? onClick : undefined,
29137
+ "onClick:prependInner": isInteractive.value ? onClick : undefined,
29138
+ "onClick:appendInner": isInteractive.value ? onClick : undefined,
29139
+ "onUpdate:modelValue": val => {
29140
+ model.value = val;
29141
+ }
29142
+ }), {
29143
+ ...slots,
29144
+ prepend: props.pipIcon ? arg => createVNode(Fragment, null, [hasPrepend && createVNode(VIcon, {
29145
+ "color": props.pip ? model.value : undefined,
29146
+ "icon": props.pipIcon
29147
+ }, null), slots.prepend?.(arg)]) : undefined,
29148
+ default: () => createVNode(Fragment, null, [createVNode(VMenu, {
29149
+ "modelValue": menu.value,
29150
+ "onUpdate:modelValue": $event => menu.value = $event,
29151
+ "activator": "parent",
29152
+ "min-width": "0",
29153
+ "closeOnContentClick": false,
29154
+ "openOnClick": false
29155
+ }, {
29156
+ default: () => [createVNode(VConfirmEdit, mergeProps(confirmEditProps, {
29157
+ "modelValue": model.value,
29158
+ "onUpdate:modelValue": $event => model.value = $event,
29159
+ "onSave": onSave
29160
+ }), {
29161
+ default: _ref2 => {
29162
+ let {
29163
+ actions,
29164
+ model: proxyModel,
29165
+ save,
29166
+ cancel,
29167
+ isPristine
29168
+ } = _ref2;
29169
+ return createVNode(VColorPicker, mergeProps(colorPickerProps, {
29170
+ "modelValue": proxyModel.value,
29171
+ "onUpdate:modelValue": val => {
29172
+ proxyModel.value = val;
29173
+ model.value = val;
29174
+ },
29175
+ "onMousedown": e => e.preventDefault()
29176
+ }), {
29177
+ actions: !props.hideActions ? () => slots.actions?.({
29178
+ save,
29179
+ cancel,
29180
+ isPristine
29181
+ }) ?? actions() : undefined
29182
+ });
29183
+ }
29184
+ })]
29185
+ }), slots.default?.()])
29186
+ });
29187
+ });
29188
+ }
29189
+ });
29190
+
29191
+ // Composables
29192
+
29193
+ // Types
29194
+
29195
+ // Types
29196
+
29197
+ class DateFormatSpec {
29198
+ constructor(order,
29199
+ // mdy | dmy | ymd
29200
+ separator // / | - | .
29201
+ ) {
29202
+ this.order = order;
29203
+ this.separator = separator;
29204
+ }
29205
+ get format() {
29206
+ return this.order.split('').map(sign => `${sign}${sign}`).join(this.separator).replace('yy', 'yyyy');
29207
+ }
29208
+ static canBeParsed(v) {
29209
+ if (typeof v !== 'string') return false;
29210
+ const lowercase = v.toLowerCase();
29211
+ return ['y', 'm', 'd'].every(sign => lowercase.includes(sign)) && ['/', '-', '.'].some(sign => v.includes(sign));
29212
+ }
29213
+ static parse(v) {
29214
+ if (!DateFormatSpec.canBeParsed(v)) {
29215
+ throw new Error(`[${v}] cannot be parsed into date format specification`);
29216
+ }
29217
+ const order = v.toLowerCase().split('').filter((c, i, all) => 'dmy'.includes(c) && all.indexOf(c) === i).join('');
29218
+ const separator = ['/', '-', '.'].find(sign => v.includes(sign));
29219
+ return new DateFormatSpec(order, separator);
29220
+ }
29221
+ }
29222
+ const makeDateFormatProps = propsFactory({
29223
+ inputFormat: {
29224
+ type: String,
29225
+ validator: v => !v || DateFormatSpec.canBeParsed(v)
29226
+ }
29227
+ }, 'date-format');
29228
+ function useDateFormat(props, locale) {
29229
+ const adapter = useDate();
29230
+ function inferFromLocale() {
29231
+ const localeForDateFormat = locale.value ?? 'en-US';
29232
+ const formatFromLocale = Intl.DateTimeFormat(localeForDateFormat, {
29233
+ year: 'numeric',
29234
+ month: '2-digit',
29235
+ day: '2-digit'
29236
+ }).format(adapter.toJsDate(adapter.parseISO('1999-12-07'))).replace(/(07)|(٠٧)|(٢٩)|(۱۶)|(০৭)/, 'dd').replace(/(12)|(١٢)|(٠٨)|(۰۹)|(১২)/, 'mm').replace(/(1999)|(2542)|(١٩٩٩)|(١٤٢٠)|(۱۳۷۸)|(১৯৯৯)/, 'yyyy').replace(/[^ymd\-/.]/g, '').replace(/\.$/, '');
29237
+ if (!DateFormatSpec.canBeParsed(formatFromLocale)) {
29238
+ consoleWarn(`Date format inferred from locale [${localeForDateFormat}] is invalid: [${formatFromLocale}]`);
29239
+ return 'mm/dd/yyyy';
29240
+ }
29241
+ return formatFromLocale;
29242
+ }
29243
+ const currentFormat = toRef(() => {
29244
+ return DateFormatSpec.canBeParsed(props.inputFormat) ? DateFormatSpec.parse(props.inputFormat) : DateFormatSpec.parse(inferFromLocale());
29245
+ });
29246
+ function parseDate(dateString) {
29247
+ function parseDateParts(text) {
29248
+ const parts = text.trim().split(currentFormat.value.separator);
29249
+ return {
29250
+ y: Number(parts[currentFormat.value.order.indexOf('y')]),
29251
+ m: Number(parts[currentFormat.value.order.indexOf('m')]),
29252
+ d: Number(parts[currentFormat.value.order.indexOf('d')])
29253
+ };
29254
+ }
29255
+ function validateDateParts(dateParts) {
29256
+ const {
29257
+ y: year,
29258
+ m: month,
29259
+ d: day
29260
+ } = dateParts;
29261
+ if (!year || !month || !day) return null;
29262
+ if (month < 1 || month > 12) return null;
29263
+ if (day < 1 || day > 31) return null;
29264
+ return {
29265
+ year: autoFixYear(year),
29266
+ month,
29267
+ day
29268
+ };
29269
+ }
29270
+ function autoFixYear(year) {
29271
+ const currentYear = adapter.getYear(adapter.date());
29272
+ if (year > 100 || currentYear % 100 >= 50) {
29273
+ return year;
29274
+ }
29275
+ const currentCentury = ~~(currentYear / 100) * 100;
29276
+ return year < 50 ? currentCentury + year : currentCentury - 100 + year;
29277
+ }
29278
+ const dateParts = parseDateParts(dateString);
29279
+ const validatedParts = validateDateParts(dateParts);
29280
+ if (!validatedParts) return null;
29281
+ const {
29282
+ year,
29283
+ month,
29284
+ day
29285
+ } = validatedParts;
29286
+ const pad = v => String(v).padStart(2, '0');
29287
+ return adapter.parseISO(`${year}-${pad(month)}-${pad(day)}`);
29288
+ }
29289
+ function isValid(text) {
29290
+ return !!parseDate(text);
29291
+ }
29292
+ function formatDate(value) {
29293
+ const parts = adapter.toISO(value).split('-');
29294
+ return currentFormat.value.order.split('').map(sign => parts['ymd'.indexOf(sign)]).join(currentFormat.value.separator);
29295
+ }
29296
+ return {
29297
+ isValid,
29298
+ parseDate,
29299
+ formatDate,
29300
+ parserFormat: toRef(() => currentFormat.value.format)
29301
+ };
29302
+ }
29303
+
29304
+ // Types
29305
+
29053
29306
  // Types
29054
29307
 
29055
29308
  const makeVDateInputProps = propsFactory({
@@ -29058,13 +29311,20 @@ const makeVDateInputProps = propsFactory({
29058
29311
  type: String,
29059
29312
  default: 'bottom start'
29060
29313
  },
29061
- ...makeDisplayProps(),
29314
+ menu: Boolean,
29315
+ updateOn: {
29316
+ type: Array,
29317
+ default: () => ['blur', 'enter']
29318
+ },
29319
+ ...makeDateFormatProps(),
29320
+ ...makeDisplayProps({
29321
+ mobile: null
29322
+ }),
29062
29323
  ...makeFocusProps(),
29063
29324
  ...makeVConfirmEditProps({
29064
29325
  hideActions: true
29065
29326
  }),
29066
29327
  ...makeVTextFieldProps({
29067
- placeholder: 'mm/dd/yyyy',
29068
29328
  prependIcon: '$calendar'
29069
29329
  }),
29070
29330
  ...omit(makeVDatePickerProps({
@@ -29078,7 +29338,8 @@ const VDateInput = genericComponent()({
29078
29338
  emits: {
29079
29339
  save: value => true,
29080
29340
  cancel: () => true,
29081
- 'update:modelValue': val => true
29341
+ 'update:modelValue': val => true,
29342
+ 'update:menu': val => true
29082
29343
  },
29083
29344
  setup(props, _ref) {
29084
29345
  let {
@@ -29086,9 +29347,16 @@ const VDateInput = genericComponent()({
29086
29347
  slots
29087
29348
  } = _ref;
29088
29349
  const {
29089
- t
29350
+ t,
29351
+ current: currentLocale
29090
29352
  } = useLocale();
29091
29353
  const adapter = useDate();
29354
+ const {
29355
+ isValid,
29356
+ parseDate,
29357
+ formatDate,
29358
+ parserFormat
29359
+ } = useDateFormat(props, currentLocale);
29092
29360
  const {
29093
29361
  mobile
29094
29362
  } = useDisplay(props);
@@ -29097,8 +29365,9 @@ const VDateInput = genericComponent()({
29097
29365
  focus,
29098
29366
  blur
29099
29367
  } = useFocus(props);
29100
- const model = useProxiedModel(props, 'modelValue', props.multiple ? [] : null, val => Array.isArray(val) ? val.map(item => adapter.toJsDate(item)) : val ? adapter.toJsDate(val) : val, val => Array.isArray(val) ? val.map(item => adapter.date(item)) : val ? adapter.date(val) : val);
29101
- const menu = shallowRef(false);
29368
+ const emptyModelValue = () => props.multiple ? [] : null;
29369
+ const model = useProxiedModel(props, 'modelValue', emptyModelValue(), val => Array.isArray(val) ? val.map(item => adapter.toJsDate(item)) : val ? adapter.toJsDate(val) : val, val => Array.isArray(val) ? val.map(item => adapter.date(item)) : val ? adapter.date(val) : val);
29370
+ const menu = useProxiedModel(props, 'menu');
29102
29371
  const isEditingInput = shallowRef(false);
29103
29372
  const vTextFieldRef = ref();
29104
29373
  const disabledActions = ref(['save']);
@@ -29106,7 +29375,10 @@ const VDateInput = genericComponent()({
29106
29375
  if (typeof props.displayFormat === 'function') {
29107
29376
  return props.displayFormat(date);
29108
29377
  }
29109
- return adapter.format(date, props.displayFormat ?? 'keyboardDate');
29378
+ if (props.displayFormat) {
29379
+ return adapter.format(date, props.displayFormat ?? 'keyboardDate');
29380
+ }
29381
+ return formatDate(date);
29110
29382
  }
29111
29383
  const display = computed(() => {
29112
29384
  const value = wrapInArray(model.value);
@@ -29128,7 +29400,10 @@ const VDateInput = genericComponent()({
29128
29400
  return 'none';
29129
29401
  });
29130
29402
  const isInteractive = computed(() => !props.disabled && !props.readonly);
29131
- const isReadonly = computed(() => !(mobile.value && isEditingInput.value) && props.readonly);
29403
+ const isReadonly = computed(() => {
29404
+ if (!props.updateOn.length) return true;
29405
+ return !(mobile.value && isEditingInput.value) && props.readonly;
29406
+ });
29132
29407
  watch(menu, val => {
29133
29408
  if (val) return;
29134
29409
  isEditingInput.value = false;
@@ -29138,10 +29413,10 @@ const VDateInput = genericComponent()({
29138
29413
  if (e.key !== 'Enter') return;
29139
29414
  if (!menu.value || !isFocused.value) {
29140
29415
  menu.value = true;
29141
- return;
29142
29416
  }
29143
- const target = e.target;
29144
- model.value = adapter.isValid(target.value) ? target.value : null;
29417
+ if (props.updateOn.includes('enter')) {
29418
+ onUserInput(e.target);
29419
+ }
29145
29420
  }
29146
29421
  function onClick(e) {
29147
29422
  e.preventDefault();
@@ -29163,9 +29438,12 @@ const VDateInput = genericComponent()({
29163
29438
  }
29164
29439
  function onUpdateDisplayModel(value) {
29165
29440
  if (value != null) return;
29166
- model.value = null;
29441
+ model.value = emptyModelValue();
29167
29442
  }
29168
- function onBlur() {
29443
+ function onBlur(e) {
29444
+ if (props.updateOn.includes('blur')) {
29445
+ onUserInput(e.target);
29446
+ }
29169
29447
  blur();
29170
29448
 
29171
29449
  // When in mobile mode and editing is done (due to keyboard dismissal), close the menu
@@ -29174,10 +29452,36 @@ const VDateInput = genericComponent()({
29174
29452
  isEditingInput.value = false;
29175
29453
  }
29176
29454
  }
29455
+ function onUserInput(_ref2) {
29456
+ let {
29457
+ value
29458
+ } = _ref2;
29459
+ if (!value.trim()) {
29460
+ model.value = emptyModelValue();
29461
+ } else if (!props.multiple) {
29462
+ if (isValid(value)) {
29463
+ model.value = parseDate(value);
29464
+ }
29465
+ } else {
29466
+ const parts = value.trim().split(/\D+-\D+|[^\d\-/.]+/);
29467
+ if (parts.every(isValid)) {
29468
+ if (props.multiple === 'range') {
29469
+ model.value = getRange(parts);
29470
+ } else {
29471
+ model.value = parts.map(parseDate);
29472
+ }
29473
+ }
29474
+ }
29475
+ }
29476
+ function getRange(inputDates) {
29477
+ const [start, stop] = inputDates.map(parseDate).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
29478
+ const diff = adapter.getDiff(stop ?? start, start, 'days');
29479
+ return [start, ...createRange(diff, 1).map(i => adapter.addDays(start, i))];
29480
+ }
29177
29481
  useRender(() => {
29178
29482
  const confirmEditProps = VConfirmEdit.filterProps(props);
29179
29483
  const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
29180
- const textFieldProps = VTextField.filterProps(props);
29484
+ const textFieldProps = VTextField.filterProps(omit(props, ['placeholder']));
29181
29485
  return createVNode(VTextField, mergeProps({
29182
29486
  "ref": vTextFieldRef
29183
29487
  }, textFieldProps, {
@@ -29185,11 +29489,13 @@ const VDateInput = genericComponent()({
29185
29489
  "style": props.style,
29186
29490
  "modelValue": display.value,
29187
29491
  "inputmode": inputmode.value,
29492
+ "placeholder": props.placeholder ?? parserFormat.value,
29188
29493
  "readonly": isReadonly.value,
29189
29494
  "onKeydown": isInteractive.value ? onKeydown : undefined,
29190
29495
  "focused": menu.value || isFocused.value,
29191
29496
  "onFocus": focus,
29192
29497
  "onBlur": onBlur,
29498
+ "validationValue": model.value,
29193
29499
  "onClick:control": isInteractive.value ? onClick : undefined,
29194
29500
  "onClick:prepend": isInteractive.value ? onClick : undefined,
29195
29501
  "onUpdate:modelValue": onUpdateDisplayModel
@@ -29212,14 +29518,14 @@ const VDateInput = genericComponent()({
29212
29518
  "onSave": onSave,
29213
29519
  "onCancel": onCancel
29214
29520
  }), {
29215
- default: _ref2 => {
29521
+ default: _ref3 => {
29216
29522
  let {
29217
29523
  actions,
29218
29524
  model: proxyModel,
29219
29525
  save,
29220
29526
  cancel,
29221
29527
  isPristine
29222
- } = _ref2;
29528
+ } = _ref3;
29223
29529
  function onUpdateModel(value) {
29224
29530
  if (!props.hideActions) {
29225
29531
  proxyModel.value = value;
@@ -29404,43 +29710,31 @@ const VFileUpload = genericComponent()({
29404
29710
  densityClasses
29405
29711
  } = useDensity(props);
29406
29712
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => props.multiple || Array.isArray(props.modelValue) ? val : val[0]);
29407
- const dragOver = shallowRef(false);
29713
+ const isDragging = shallowRef(false);
29408
29714
  const vSheetRef = ref(null);
29409
29715
  const inputRef = ref(null);
29410
- onMounted(() => {
29411
- vSheetRef.value?.$el.addEventListener('dragover', onDragOver);
29412
- vSheetRef.value?.$el.addEventListener('drop', onDrop);
29413
- });
29414
- onUnmounted(() => {
29415
- vSheetRef.value?.$el.removeEventListener('dragover', onDragOver);
29416
- vSheetRef.value?.$el.removeEventListener('drop', onDrop);
29417
- });
29418
- function onDragOver(e) {
29716
+ function onDragover(e) {
29419
29717
  e.preventDefault();
29420
29718
  e.stopImmediatePropagation();
29421
- dragOver.value = true;
29719
+ isDragging.value = true;
29422
29720
  }
29423
- function onDragLeave(e) {
29721
+ function onDragleave(e) {
29424
29722
  e.preventDefault();
29425
- dragOver.value = false;
29723
+ isDragging.value = false;
29426
29724
  }
29427
29725
  function onDrop(e) {
29428
29726
  e.preventDefault();
29429
29727
  e.stopImmediatePropagation();
29430
- dragOver.value = false;
29431
- const files = Array.from(e.dataTransfer?.files ?? []);
29432
- if (!files.length) return;
29433
- if (!props.multiple) {
29434
- model.value = [files[0]];
29435
- return;
29436
- }
29437
- const array = model.value.slice();
29438
- for (const file of files) {
29439
- if (!array.some(f => f.name === file.name)) {
29440
- array.push(file);
29441
- }
29442
- }
29443
- model.value = array;
29728
+ isDragging.value = false;
29729
+ if (!e.dataTransfer?.files?.length || !inputRef.value) return;
29730
+ const dataTransfer = new DataTransfer();
29731
+ for (const file of e.dataTransfer.files) {
29732
+ dataTransfer.items.add(file);
29733
+ }
29734
+ inputRef.value.files = dataTransfer.files;
29735
+ inputRef.value.dispatchEvent(new Event('change', {
29736
+ bubbles: true
29737
+ }));
29444
29738
  }
29445
29739
  function onClick() {
29446
29740
  inputRef.value?.click();
@@ -29476,11 +29770,11 @@ const VFileUpload = genericComponent()({
29476
29770
  "class": ['v-file-upload', {
29477
29771
  'v-file-upload--clickable': !hasBrowse,
29478
29772
  'v-file-upload--disabled': props.disabled,
29479
- 'v-file-upload--dragging': dragOver.value
29773
+ 'v-file-upload--dragging': isDragging.value
29480
29774
  }, densityClasses.value, props.class],
29481
29775
  "style": [props.style],
29482
- "onDragleave": onDragLeave,
29483
- "onDragover": onDragOver,
29776
+ "onDragleave": onDragleave,
29777
+ "onDragover": onDragover,
29484
29778
  "onDrop": onDrop,
29485
29779
  "onClick": !hasBrowse ? onClick : undefined
29486
29780
  }, rootAttrs), {
@@ -29531,7 +29825,7 @@ const VFileUpload = genericComponent()({
29531
29825
  })]), props.subtitle && createVNode("div", {
29532
29826
  "class": "v-file-upload-subtitle"
29533
29827
  }, [props.subtitle])]), createVNode(VOverlay, {
29534
- "model-value": dragOver.value,
29828
+ "model-value": isDragging.value,
29535
29829
  "contained": true,
29536
29830
  "scrim": props.scrim
29537
29831
  }, null), slots.input?.({
@@ -30229,8 +30523,8 @@ const VTimePickerClock = genericComponent()({
30229
30523
  y
30230
30524
  } = getPosition(i);
30231
30525
  return {
30232
- left: `${50 + x * 50}%`,
30233
- top: `${50 + y * 50}%`
30526
+ left: `${Math.round(50 + x * 50)}%`,
30527
+ top: `${Math.round(50 + y * 50)}%`
30234
30528
  };
30235
30529
  }
30236
30530
  function euclidean(p0, p1) {
@@ -31168,6 +31462,7 @@ var components = /*#__PURE__*/Object.freeze({
31168
31462
  VClassIcon: VClassIcon,
31169
31463
  VCode: VCode,
31170
31464
  VCol: VCol,
31465
+ VColorInput: VColorInput,
31171
31466
  VColorPicker: VColorPicker,
31172
31467
  VCombobox: VCombobox,
31173
31468
  VComponentIcon: VComponentIcon,
@@ -31634,7 +31929,7 @@ function createVuetify$1() {
31634
31929
  };
31635
31930
  });
31636
31931
  }
31637
- const version$1 = "3.8.3";
31932
+ const version$1 = "3.8.5";
31638
31933
  createVuetify$1.version = version$1;
31639
31934
 
31640
31935
  // Vue's inject() can only be used in setup
@@ -31932,7 +32227,7 @@ var index = /*#__PURE__*/Object.freeze({
31932
32227
 
31933
32228
  /* eslint-disable local-rules/sort-imports */
31934
32229
 
31935
- const version = "3.8.3";
32230
+ const version = "3.8.5";
31936
32231
 
31937
32232
  /* eslint-disable local-rules/sort-imports */
31938
32233