vuetify 3.1.14 → 3.1.15

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 (97) hide show
  1. package/dist/json/attributes.json +149 -97
  2. package/dist/json/importMap.json +70 -70
  3. package/dist/json/tags.json +13 -0
  4. package/dist/json/web-types.json +440 -209
  5. package/dist/vuetify-labs.css +161 -152
  6. package/dist/vuetify-labs.d.ts +518 -160
  7. package/dist/vuetify-labs.esm.js +176 -116
  8. package/dist/vuetify-labs.esm.js.map +1 -1
  9. package/dist/vuetify-labs.js +176 -116
  10. package/dist/vuetify-labs.min.css +2 -2
  11. package/dist/vuetify.css +11 -2
  12. package/dist/vuetify.d.ts +486 -161
  13. package/dist/vuetify.esm.js +118 -68
  14. package/dist/vuetify.esm.js.map +1 -1
  15. package/dist/vuetify.js +118 -68
  16. package/dist/vuetify.js.map +1 -1
  17. package/dist/vuetify.min.css +2 -2
  18. package/dist/vuetify.min.js +728 -717
  19. package/dist/vuetify.min.js.map +1 -1
  20. package/lib/components/VAutocomplete/VAutocomplete.css +9 -0
  21. package/lib/components/VAutocomplete/VAutocomplete.mjs +50 -6
  22. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  23. package/lib/components/VAutocomplete/VAutocomplete.sass +10 -0
  24. package/lib/components/VAutocomplete/index.d.ts +29 -17
  25. package/lib/components/VCard/VCard.mjs.map +1 -1
  26. package/lib/components/VCard/index.d.ts +21 -16
  27. package/lib/components/VCheckbox/VCheckbox.mjs +2 -2
  28. package/lib/components/VCheckbox/VCheckbox.mjs.map +1 -1
  29. package/lib/components/VCheckbox/index.d.ts +22 -1
  30. package/lib/components/VCombobox/VCombobox.css +1 -1
  31. package/lib/components/VCombobox/VCombobox.mjs +6 -4
  32. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  33. package/lib/components/VCombobox/VCombobox.sass +1 -1
  34. package/lib/components/VCombobox/index.d.ts +29 -17
  35. package/lib/components/VField/index.d.ts +6 -0
  36. package/lib/components/VFileInput/VFileInput.mjs +13 -17
  37. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  38. package/lib/components/VFileInput/index.d.ts +68 -23
  39. package/lib/components/VInput/VInput.mjs +14 -7
  40. package/lib/components/VInput/VInput.mjs.map +1 -1
  41. package/lib/components/VInput/index.d.ts +22 -1
  42. package/lib/components/VOverlay/locationStrategies.mjs +9 -4
  43. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  44. package/lib/components/VRadioGroup/VRadioGroup.mjs +2 -2
  45. package/lib/components/VRadioGroup/VRadioGroup.mjs.map +1 -1
  46. package/lib/components/VRadioGroup/index.d.ts +22 -1
  47. package/lib/components/VRangeSlider/VRangeSlider.mjs +2 -2
  48. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  49. package/lib/components/VRangeSlider/index.d.ts +22 -1
  50. package/lib/components/VSelect/VSelect.mjs +6 -0
  51. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  52. package/lib/components/VSelect/index.d.ts +32 -17
  53. package/lib/components/VSlider/VSlider.mjs +2 -2
  54. package/lib/components/VSlider/VSlider.mjs.map +1 -1
  55. package/lib/components/VSlider/index.d.ts +22 -1
  56. package/lib/components/VSwitch/VSwitch.mjs +5 -3
  57. package/lib/components/VSwitch/VSwitch.mjs.map +1 -1
  58. package/lib/components/VSwitch/index.d.ts +43 -1
  59. package/lib/components/VTextField/VTextField.mjs +4 -12
  60. package/lib/components/VTextField/VTextField.mjs.map +1 -1
  61. package/lib/components/VTextField/index.d.ts +70 -22
  62. package/lib/components/VTextarea/VTextarea.mjs +4 -12
  63. package/lib/components/VTextarea/VTextarea.mjs.map +1 -1
  64. package/lib/components/VTextarea/index.d.ts +61 -22
  65. package/lib/components/VTreeview/_mixins.sass +0 -0
  66. package/lib/components/VTreeview/util/filterTreeItems.mjs +0 -0
  67. package/lib/components/VValidation/index.d.ts +10 -1
  68. package/lib/components/index.d.ts +465 -140
  69. package/lib/composables/focus.mjs +3 -2
  70. package/lib/composables/focus.mjs.map +1 -1
  71. package/lib/composables/items.mjs +7 -2
  72. package/lib/composables/items.mjs.map +1 -1
  73. package/lib/entry-bundler.mjs +1 -1
  74. package/lib/framework.mjs +1 -1
  75. package/lib/iconsets/mdi-svg.mjs +2 -2
  76. package/lib/iconsets/mdi-svg.mjs.map +1 -1
  77. package/lib/index.d.ts +21 -21
  78. package/lib/labs/VDataTable/VDataTable.mjs +2 -2
  79. package/lib/labs/VDataTable/VDataTable.mjs.map +1 -1
  80. package/lib/labs/VDataTable/VDataTableFooter.mjs.map +1 -1
  81. package/lib/labs/VDataTable/VDataTableHeaders.mjs.map +1 -1
  82. package/lib/labs/VDataTable/VDataTableRows.mjs +52 -44
  83. package/lib/labs/VDataTable/VDataTableRows.mjs.map +1 -1
  84. package/lib/labs/VDataTable/VDataTableServer.mjs +2 -1
  85. package/lib/labs/VDataTable/VDataTableServer.mjs.map +1 -1
  86. package/lib/labs/VDataTable/VDataTableVirtual.mjs +0 -1
  87. package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
  88. package/lib/labs/VDataTable/composables/options.mjs +2 -1
  89. package/lib/labs/VDataTable/composables/options.mjs.map +1 -1
  90. package/lib/labs/VDataTable/index.d.ts +44 -11
  91. package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs +1 -0
  92. package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs.map +1 -1
  93. package/lib/labs/VSkeletonLoader/index.d.ts +9 -9
  94. package/lib/labs/components.d.ts +53 -20
  95. package/lib/locale/el.mjs +0 -0
  96. package/lib/locale/index.mjs +0 -0
  97. package/package.json +2 -2
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.1.14
2
+ * Vuetify v3.1.15
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -5293,7 +5293,8 @@
5293
5293
 
5294
5294
  // Composables
5295
5295
  const makeFocusProps = propsFactory({
5296
- focused: Boolean
5296
+ focused: Boolean,
5297
+ 'onUpdate:focused': EventProp()
5297
5298
  }, 'focus');
5298
5299
  function useFocus(props) {
5299
5300
  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
@@ -5882,6 +5883,8 @@
5882
5883
  appendIcon: IconValue,
5883
5884
  prependIcon: IconValue,
5884
5885
  hideDetails: [Boolean, String],
5886
+ hint: String,
5887
+ persistentHint: Boolean,
5885
5888
  messages: {
5886
5889
  type: [Array, String],
5887
5890
  default: () => []
@@ -5945,10 +5948,19 @@
5945
5948
  resetValidation,
5946
5949
  validate
5947
5950
  }));
5951
+ const messages = vue.computed(() => {
5952
+ if (errorMessages.value.length > 0) {
5953
+ return errorMessages.value;
5954
+ } else if (props.hint && (props.persistentHint || props.focused)) {
5955
+ return props.hint;
5956
+ } else {
5957
+ return props.messages;
5958
+ }
5959
+ });
5948
5960
  useRender(() => {
5949
5961
  const hasPrepend = !!(slots.prepend || props.prependIcon);
5950
5962
  const hasAppend = !!(slots.append || props.appendIcon);
5951
- const hasMessages = !!(props.messages?.length || errorMessages.value.length);
5963
+ const hasMessages = messages.value.length > 0;
5952
5964
  const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
5953
5965
  return vue.createVNode("div", {
5954
5966
  "class": ['v-input', `v-input--${props.direction}`, densityClasses.value, validationClasses.value]
@@ -5971,7 +5983,7 @@
5971
5983
  }, [vue.createVNode(VMessages, {
5972
5984
  "id": messagesId.value,
5973
5985
  "active": hasMessages,
5974
- "messages": errorMessages.value.length > 0 ? errorMessages.value : props.messages
5986
+ "messages": messages.value
5975
5987
  }, {
5976
5988
  message: slots.message
5977
5989
  }), slots.details?.(slotProps.value)])]);
@@ -5983,10 +5995,6 @@
5983
5995
  };
5984
5996
  }
5985
5997
  });
5986
- function filterInputProps(props) {
5987
- const keys = Object.keys(VInput.props).filter(k => !isOn(k));
5988
- return pick(props, keys);
5989
- }
5990
5998
 
5991
5999
  const VCounter = genericComponent()({
5992
6000
  name: 'VCounter',
@@ -6112,8 +6120,6 @@
6112
6120
  autofocus: Boolean,
6113
6121
  counter: [Boolean, Number, String],
6114
6122
  counterValue: Function,
6115
- hint: String,
6116
- persistentHint: Boolean,
6117
6123
  prefix: String,
6118
6124
  placeholder: String,
6119
6125
  persistentPlaceholder: Boolean,
@@ -6168,9 +6174,6 @@
6168
6174
  const vFieldRef = vue.ref();
6169
6175
  const inputRef = vue.ref();
6170
6176
  const isActive = vue.computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value);
6171
- const messages = vue.computed(() => {
6172
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
6173
- });
6174
6177
  function onFocus() {
6175
6178
  if (inputRef.value !== document.activeElement) {
6176
6179
  inputRef.value?.focus();
@@ -6213,7 +6216,7 @@
6213
6216
  const [{
6214
6217
  modelValue: _,
6215
6218
  ...inputProps
6216
- }] = filterInputProps(props);
6219
+ }] = VInput.filterProps(props);
6217
6220
  const [fieldProps] = filterFieldProps(props);
6218
6221
  return vue.createVNode(VInput, vue.mergeProps({
6219
6222
  "ref": vInputRef,
@@ -6223,12 +6226,9 @@
6223
6226
  'v-text-field--prefixed': props.prefix,
6224
6227
  'v-text-field--suffixed': props.suffix,
6225
6228
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
6226
- }],
6227
- "onClick:prepend": props['onClick:prepend'],
6228
- "onClick:append": props['onClick:append']
6229
+ }]
6229
6230
  }, rootAttrs, inputProps, {
6230
- "focused": isFocused.value,
6231
- "messages": messages.value
6231
+ "focused": isFocused.value
6232
6232
  }), {
6233
6233
  ...slots,
6234
6234
  default: _ref2 => {
@@ -6637,7 +6637,7 @@
6637
6637
  const id = vue.computed(() => props.id || `checkbox-${uid}`);
6638
6638
  useRender(() => {
6639
6639
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
6640
- const [inputProps, _1] = filterInputProps(props);
6640
+ const [inputProps, _1] = VInput.filterProps(props);
6641
6641
  const [checkboxProps, _2] = VCheckboxBtn.filterProps(props);
6642
6642
  return vue.createVNode(VInput, vue.mergeProps({
6643
6643
  "class": "v-checkbox"
@@ -8049,7 +8049,12 @@
8049
8049
  function useItems(props) {
8050
8050
  const items = vue.computed(() => transformItems$1(props, props.items));
8051
8051
  function transformIn(value) {
8052
- return value.map(item => transformItem$1(props, item));
8052
+ return value.map(v => {
8053
+ const existingItem = items.value.find(item => deepEqual(v, item.value));
8054
+ // Nullish existingItem means value is a custom input value from combobox
8055
+ // In this case, use transformItem to create an InternalItem based on value
8056
+ return existingItem ?? transformItem$1(props, v);
8057
+ });
8053
8058
  }
8054
8059
  function transformOut(value) {
8055
8060
  return value.map(_ref => {
@@ -8727,7 +8732,7 @@
8727
8732
  }
8728
8733
 
8729
8734
  /** Get size of element ignoring max-width/max-height */
8730
- function getIntrinsicSize(el) {
8735
+ function getIntrinsicSize(el, isRtl) {
8731
8736
  // const scrollables = new Map<Element, [number, number]>()
8732
8737
  // el.querySelectorAll('*').forEach(el => {
8733
8738
  // const x = el.scrollLeft
@@ -8744,7 +8749,11 @@
8744
8749
 
8745
8750
  /* eslint-disable-next-line sonarjs/prefer-immediate-return */
8746
8751
  const contentBox = nullifyTransforms(el);
8747
- contentBox.x -= parseFloat(el.style.left || 0);
8752
+ if (isRtl) {
8753
+ contentBox.x += parseFloat(el.style.right || 0);
8754
+ } else {
8755
+ contentBox.x -= parseFloat(el.style.left || 0);
8756
+ }
8748
8757
  contentBox.y -= parseFloat(el.style.top || 0);
8749
8758
 
8750
8759
  // el.style.maxWidth = initialMaxWidth
@@ -8825,7 +8834,7 @@
8825
8834
  });
8826
8835
  if (!data.activatorEl.value || !data.contentEl.value) return;
8827
8836
  const targetBox = data.activatorEl.value.getBoundingClientRect();
8828
- const contentBox = getIntrinsicSize(data.contentEl.value);
8837
+ const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value);
8829
8838
  const scrollParents = getScrollParents(data.contentEl.value);
8830
8839
  const viewportMargin = 12;
8831
8840
  if (!scrollParents.length) {
@@ -9001,7 +9010,8 @@
9001
9010
  transformOrigin: `${placement.origin.side} ${placement.origin.align}`,
9002
9011
  // transform: `translate(${pixelRound(x)}px, ${pixelRound(y)}px)`,
9003
9012
  top: convertToUnit(pixelRound(y)),
9004
- left: convertToUnit(pixelRound(x)),
9013
+ left: data.isRtl.value ? undefined : convertToUnit(pixelRound(x)),
9014
+ right: data.isRtl.value ? convertToUnit(pixelRound(-x)) : undefined,
9005
9015
  minWidth: convertToUnit(axis === 'y' ? Math.min(minWidth.value, targetBox.width) : minWidth.value),
9006
9016
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
9007
9017
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
@@ -9896,6 +9906,7 @@
9896
9906
  })
9897
9907
  },
9898
9908
  emits: {
9909
+ 'update:focused': focused => true,
9899
9910
  'update:modelValue': val => true,
9900
9911
  'update:menu': val => true
9901
9912
  },
@@ -10012,6 +10023,9 @@
10012
10023
  menu.value = false;
10013
10024
  }
10014
10025
  }
10026
+ function onFocusin(e) {
10027
+ isFocused.value = true;
10028
+ }
10015
10029
  function onFocusout(e) {
10016
10030
  if (e.relatedTarget == null) {
10017
10031
  vTextFieldRef.value?.focus();
@@ -10066,6 +10080,7 @@
10066
10080
  "selected": selected.value,
10067
10081
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
10068
10082
  "onMousedown": e => e.preventDefault(),
10083
+ "onFocusin": onFocusin,
10069
10084
  "onFocusout": onFocusout
10070
10085
  }, {
10071
10086
  default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
@@ -10144,6 +10159,7 @@
10144
10159
  });
10145
10160
  });
10146
10161
  return forwardRefs({
10162
+ isFocused,
10147
10163
  menu,
10148
10164
  select
10149
10165
  }, vTextFieldRef);
@@ -10282,6 +10298,7 @@
10282
10298
  })
10283
10299
  },
10284
10300
  emits: {
10301
+ 'update:focused': focused => true,
10285
10302
  'update:search': val => true,
10286
10303
  'update:modelValue': val => true,
10287
10304
  'update:menu': val => true
@@ -10305,11 +10322,17 @@
10305
10322
  _menu.value = v;
10306
10323
  }
10307
10324
  });
10325
+ const selectionIndex = vue.ref(-1);
10326
+ const color = vue.computed(() => vTextFieldRef.value?.color);
10308
10327
  const {
10309
10328
  items,
10310
10329
  transformIn,
10311
10330
  transformOut
10312
10331
  } = useItems(props);
10332
+ const {
10333
+ textColorClasses,
10334
+ textColorStyles
10335
+ } = useTextColor(color);
10313
10336
  const search = useProxiedModel(props, 'search', '');
10314
10337
  const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => {
10315
10338
  const transformed = transformOut(v);
@@ -10332,6 +10355,7 @@
10332
10355
  return filteredItems.value;
10333
10356
  });
10334
10357
  const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
10358
+ const selection = vue.computed(() => selections.value[selectionIndex.value]);
10335
10359
  const listRef = vue.ref();
10336
10360
  function onClear(e) {
10337
10361
  if (props.openOnClear) {
@@ -10345,7 +10369,9 @@
10345
10369
  }
10346
10370
  function onKeydown(e) {
10347
10371
  if (props.readonly || form?.isReadonly.value) return;
10348
- if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10372
+ const selectionStart = vTextFieldRef.value.selectionStart;
10373
+ const length = selected.value.length;
10374
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10349
10375
  e.preventDefault();
10350
10376
  }
10351
10377
  if (['Enter', 'ArrowDown'].includes(e.key)) {
@@ -10362,6 +10388,38 @@
10362
10388
  } else if (e.key === 'ArrowUp') {
10363
10389
  listRef.value?.focus('prev');
10364
10390
  }
10391
+ if (!props.multiple) return;
10392
+ if (['Backspace', 'Delete'].includes(e.key)) {
10393
+ if (selectionIndex.value < 0) {
10394
+ if (e.key === 'Backspace' && !search.value) {
10395
+ selectionIndex.value = length - 1;
10396
+ }
10397
+ return;
10398
+ }
10399
+ const originalSelectionIndex = selectionIndex.value;
10400
+ if (selection.value) select(selection.value);
10401
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
10402
+ }
10403
+ if (e.key === 'ArrowLeft') {
10404
+ if (selectionIndex.value < 0 && selectionStart > 0) return;
10405
+ const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
10406
+ if (selections.value[prev]) {
10407
+ selectionIndex.value = prev;
10408
+ } else {
10409
+ selectionIndex.value = -1;
10410
+ vTextFieldRef.value.setSelectionRange(search.value?.length, search.value?.length);
10411
+ }
10412
+ }
10413
+ if (e.key === 'ArrowRight') {
10414
+ if (selectionIndex.value < 0) return;
10415
+ const next = selectionIndex.value + 1;
10416
+ if (selections.value[next]) {
10417
+ selectionIndex.value = next;
10418
+ } else {
10419
+ selectionIndex.value = -1;
10420
+ vTextFieldRef.value.setSelectionRange(0, 0);
10421
+ }
10422
+ }
10365
10423
  }
10366
10424
  function onInput(e) {
10367
10425
  search.value = e.target.value;
@@ -10383,7 +10441,6 @@
10383
10441
  const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
10384
10442
  if (index === -1) {
10385
10443
  model.value = [...model.value, item];
10386
- search.value = '';
10387
10444
  } else {
10388
10445
  const value = [...model.value];
10389
10446
  value.splice(index, 1);
@@ -10428,12 +10485,15 @@
10428
10485
  "onUpdate:modelValue": v => {
10429
10486
  if (v == null) model.value = [];
10430
10487
  },
10488
+ "focused": isFocused.value,
10489
+ "onUpdate:focused": $event => isFocused.value = $event,
10431
10490
  "validationValue": model.externalValue,
10432
10491
  "dirty": isDirty,
10433
10492
  "onInput": onInput,
10434
10493
  "class": ['v-autocomplete', {
10435
10494
  'v-autocomplete--active-menu': menu.value,
10436
10495
  'v-autocomplete--chips': !!props.chips,
10496
+ 'v-autocomplete--selecting-index': selectionIndex.value > -1,
10437
10497
  [`v-autocomplete--${props.multiple ? 'multiple' : 'single'}`]: true,
10438
10498
  'v-autocomplete--selection-slot': !!slots.selection
10439
10499
  }],
@@ -10442,8 +10502,6 @@
10442
10502
  "placeholder": isDirty ? undefined : props.placeholder,
10443
10503
  "onClick:clear": onClear,
10444
10504
  "onMousedown:control": onMousedownControl,
10445
- "onFocus": () => isFocused.value = true,
10446
- "onBlur": () => isFocused.value = false,
10447
10505
  "onKeydown": onKeydown
10448
10506
  }), {
10449
10507
  ...slots,
@@ -10508,7 +10566,8 @@
10508
10566
  };
10509
10567
  return vue.createVNode("div", {
10510
10568
  "key": item.value,
10511
- "class": "v-autocomplete__selection"
10569
+ "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
10570
+ "style": index === selectionIndex.value ? textColorStyles.value : {}
10512
10571
  }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
10513
10572
  "key": "chip",
10514
10573
  "closable": props.closableChips,
@@ -12903,7 +12962,7 @@
12903
12962
  } = useFocus(props);
12904
12963
  const trackStop = vue.computed(() => position(model.value));
12905
12964
  useRender(() => {
12906
- const [inputProps, _] = filterInputProps(props);
12965
+ const [inputProps, _] = VInput.filterProps(props);
12907
12966
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
12908
12967
  return vue.createVNode(VInput, vue.mergeProps({
12909
12968
  "class": ['v-slider', {
@@ -13567,6 +13626,7 @@
13567
13626
  })
13568
13627
  },
13569
13628
  emits: {
13629
+ 'update:focused': focused => true,
13570
13630
  'update:modelValue': val => true,
13571
13631
  'update:search': val => true,
13572
13632
  'update:menu': val => true
@@ -13704,8 +13764,9 @@
13704
13764
  }
13705
13765
  return;
13706
13766
  }
13707
- select(selection.value);
13708
- vue.nextTick(() => !selection.value && (selectionIndex.value = length - 2));
13767
+ const originalSelectionIndex = selectionIndex.value;
13768
+ if (selection.value) select(selection.value);
13769
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
13709
13770
  }
13710
13771
  if (e.key === 'ArrowLeft') {
13711
13772
  if (selectionIndex.value < 0 && selectionStart > 0) return;
@@ -13790,6 +13851,8 @@
13790
13851
  "onUpdate:modelValue": [$event => search.value = $event, v => {
13791
13852
  if (v == null) model.value = [];
13792
13853
  }],
13854
+ "focused": isFocused.value,
13855
+ "onUpdate:focused": $event => isFocused.value = $event,
13793
13856
  "validationValue": model.externalValue,
13794
13857
  "dirty": isDirty,
13795
13858
  "class": ['v-combobox', {
@@ -13803,8 +13866,6 @@
13803
13866
  "placeholder": isDirty ? undefined : props.placeholder,
13804
13867
  "onClick:clear": onClear,
13805
13868
  "onMousedown:control": onMousedownControl,
13806
- "onFocus": () => isFocused.value = true,
13807
- "onBlur": () => isFocused.value = false,
13808
13869
  "onKeydown": onKeydown
13809
13870
  }), {
13810
13871
  ...slots,
@@ -14256,8 +14317,6 @@
14256
14317
  default: '$vuetify.fileInput.counter'
14257
14318
  },
14258
14319
  multiple: Boolean,
14259
- hint: String,
14260
- persistentHint: Boolean,
14261
14320
  showSize: {
14262
14321
  type: [Boolean, Number],
14263
14322
  default: false,
@@ -14282,6 +14341,7 @@
14282
14341
  emits: {
14283
14342
  'click:control': e => true,
14284
14343
  'mousedown:control': e => true,
14344
+ 'update:focused': focused => true,
14285
14345
  'update:modelValue': files => true
14286
14346
  },
14287
14347
  setup(props, _ref) {
@@ -14294,6 +14354,11 @@
14294
14354
  t
14295
14355
  } = useLocale();
14296
14356
  const model = useProxiedModel(props, 'modelValue');
14357
+ const {
14358
+ isFocused,
14359
+ focus,
14360
+ blur
14361
+ } = useFocus(props);
14297
14362
  const base = vue.computed(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined);
14298
14363
  const totalBytes = vue.computed(() => (model.value ?? []).reduce((bytes, _ref2) => {
14299
14364
  let {
@@ -14315,21 +14380,14 @@
14315
14380
  });
14316
14381
  const vInputRef = vue.ref();
14317
14382
  const vFieldRef = vue.ref();
14318
- const isFocused = vue.ref(false);
14319
14383
  const inputRef = vue.ref();
14320
- const messages = vue.computed(() => {
14321
- return props.messages.length ? props.messages : props.persistentHint ? props.hint : '';
14322
- });
14323
14384
  function onFocus() {
14324
14385
  if (inputRef.value !== document.activeElement) {
14325
14386
  inputRef.value?.focus();
14326
14387
  }
14327
- if (!isFocused.value) {
14328
- isFocused.value = true;
14329
- }
14388
+ if (!isFocused.value) focus();
14330
14389
  }
14331
14390
  function onClickPrepend(e) {
14332
- callEvent(props['onClick:prepend'], e);
14333
14391
  onControlClick(e);
14334
14392
  }
14335
14393
  function onControlMousedown(e) {
@@ -14360,18 +14418,16 @@
14360
14418
  const [{
14361
14419
  modelValue: _,
14362
14420
  ...inputProps
14363
- }] = filterInputProps(props);
14421
+ }] = VInput.filterProps(props);
14364
14422
  const [fieldProps] = filterFieldProps(props);
14365
14423
  return vue.createVNode(VInput, vue.mergeProps({
14366
14424
  "ref": vInputRef,
14367
14425
  "modelValue": model.value,
14368
14426
  "onUpdate:modelValue": $event => model.value = $event,
14369
14427
  "class": "v-file-input",
14370
- "onClick:prepend": onClickPrepend,
14371
- "onClick:append": props['onClick:append']
14428
+ "onClick:prepend": onClickPrepend
14372
14429
  }, rootAttrs, inputProps, {
14373
- "focused": isFocused.value,
14374
- "messages": messages.value
14430
+ "focused": isFocused.value
14375
14431
  }), {
14376
14432
  ...slots,
14377
14433
  default: _ref3 => {
@@ -14423,7 +14479,7 @@
14423
14479
  model.value = [...(target.files ?? [])];
14424
14480
  },
14425
14481
  "onFocus": onFocus,
14426
- "onBlur": () => isFocused.value = false
14482
+ "onBlur": blur
14427
14483
  }, slotProps, inputAttrs), null), vue.createVNode("div", {
14428
14484
  "class": fieldClass
14429
14485
  }, [!!model.value?.length && (slots.selection ? slots.selection({
@@ -16118,7 +16174,7 @@
16118
16174
  const model = useProxiedModel(props, 'modelValue');
16119
16175
  useRender(() => {
16120
16176
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
16121
- const [inputProps, _1] = filterInputProps(props);
16177
+ const [inputProps, _1] = VInput.filterProps(props);
16122
16178
  const [controlProps, _2] = VSelectionControl.filterProps(props);
16123
16179
  const label = slots.label ? slots.label({
16124
16180
  label: props.label,
@@ -16246,7 +16302,7 @@
16246
16302
  const trackStart = vue.computed(() => position(model.value[0]));
16247
16303
  const trackStop = vue.computed(() => position(model.value[1]));
16248
16304
  useRender(() => {
16249
- const [inputProps, _] = filterInputProps(props);
16305
+ const [inputProps, _] = VInput.filterProps(props);
16250
16306
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
16251
16307
  return vue.createVNode(VInput, vue.mergeProps({
16252
16308
  "class": ['v-slider', 'v-range-slider', {
@@ -17120,10 +17176,12 @@
17120
17176
  }
17121
17177
  useRender(() => {
17122
17178
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
17123
- const [inputProps, _1] = filterInputProps(props);
17179
+ const [inputProps, _1] = VInput.filterProps(props);
17124
17180
  const [controlProps, _2] = VSelectionControl.filterProps(props);
17125
17181
  const control = vue.ref();
17126
- function onClick() {
17182
+ function onClick(e) {
17183
+ e.stopPropagation();
17184
+ e.preventDefault();
17127
17185
  control.value?.input?.click();
17128
17186
  }
17129
17187
  return vue.createVNode(VInput, vue.mergeProps({
@@ -17485,8 +17543,6 @@
17485
17543
  autofocus: Boolean,
17486
17544
  counter: [Boolean, Number, String],
17487
17545
  counterValue: Function,
17488
- hint: String,
17489
- persistentHint: Boolean,
17490
17546
  prefix: String,
17491
17547
  placeholder: String,
17492
17548
  persistentPlaceholder: Boolean,
@@ -17541,9 +17597,6 @@
17541
17597
  const controlHeight = vue.ref('');
17542
17598
  const textareaRef = vue.ref();
17543
17599
  const isActive = vue.computed(() => isFocused.value || props.persistentPlaceholder);
17544
- const messages = vue.computed(() => {
17545
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
17546
- });
17547
17600
  function onFocus() {
17548
17601
  if (textareaRef.value !== document.activeElement) {
17549
17602
  textareaRef.value?.focus();
@@ -17615,7 +17668,7 @@
17615
17668
  const [{
17616
17669
  modelValue: _,
17617
17670
  ...inputProps
17618
- }] = filterInputProps(props);
17671
+ }] = VInput.filterProps(props);
17619
17672
  const [fieldProps] = filterFieldProps(props);
17620
17673
  return vue.createVNode(VInput, vue.mergeProps({
17621
17674
  "ref": vInputRef,
@@ -17629,12 +17682,9 @@
17629
17682
  'v-textarea--auto-grow': props.autoGrow,
17630
17683
  'v-textarea--no-resize': props.noResize || props.autoGrow,
17631
17684
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
17632
- }],
17633
- "onClick:prepend": props['onClick:prepend'],
17634
- "onClick:append": props['onClick:append']
17685
+ }]
17635
17686
  }, rootAttrs, inputProps, {
17636
- "focused": isFocused.value,
17637
- "messages": messages.value
17687
+ "focused": isFocused.value
17638
17688
  }), {
17639
17689
  ...slots,
17640
17690
  default: _ref2 => {
@@ -18407,7 +18457,7 @@
18407
18457
  locale
18408
18458
  };
18409
18459
  }
18410
- const version$1 = "3.1.14";
18460
+ const version$1 = "3.1.15";
18411
18461
  createVuetify$1.version = version$1;
18412
18462
 
18413
18463
  // Vue's inject() can only be used in setup
@@ -18427,7 +18477,7 @@
18427
18477
  ...options
18428
18478
  });
18429
18479
  };
18430
- const version = "3.1.14";
18480
+ const version = "3.1.15";
18431
18481
  createVuetify.version = version;
18432
18482
 
18433
18483
  exports.components = components;