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
@@ -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
  */
@@ -5289,7 +5289,8 @@ const VFieldLabel = genericComponent()({
5289
5289
 
5290
5290
  // Composables
5291
5291
  const makeFocusProps = propsFactory({
5292
- focused: Boolean
5292
+ focused: Boolean,
5293
+ 'onUpdate:focused': EventProp()
5293
5294
  }, 'focus');
5294
5295
  function useFocus(props) {
5295
5296
  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
@@ -5878,6 +5879,8 @@ const makeVInputProps = propsFactory({
5878
5879
  appendIcon: IconValue,
5879
5880
  prependIcon: IconValue,
5880
5881
  hideDetails: [Boolean, String],
5882
+ hint: String,
5883
+ persistentHint: Boolean,
5881
5884
  messages: {
5882
5885
  type: [Array, String],
5883
5886
  default: () => []
@@ -5941,10 +5944,19 @@ const VInput = genericComponent()({
5941
5944
  resetValidation,
5942
5945
  validate
5943
5946
  }));
5947
+ const messages = computed(() => {
5948
+ if (errorMessages.value.length > 0) {
5949
+ return errorMessages.value;
5950
+ } else if (props.hint && (props.persistentHint || props.focused)) {
5951
+ return props.hint;
5952
+ } else {
5953
+ return props.messages;
5954
+ }
5955
+ });
5944
5956
  useRender(() => {
5945
5957
  const hasPrepend = !!(slots.prepend || props.prependIcon);
5946
5958
  const hasAppend = !!(slots.append || props.appendIcon);
5947
- const hasMessages = !!(props.messages?.length || errorMessages.value.length);
5959
+ const hasMessages = messages.value.length > 0;
5948
5960
  const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
5949
5961
  return createVNode("div", {
5950
5962
  "class": ['v-input', `v-input--${props.direction}`, densityClasses.value, validationClasses.value]
@@ -5967,7 +5979,7 @@ const VInput = genericComponent()({
5967
5979
  }, [createVNode(VMessages, {
5968
5980
  "id": messagesId.value,
5969
5981
  "active": hasMessages,
5970
- "messages": errorMessages.value.length > 0 ? errorMessages.value : props.messages
5982
+ "messages": messages.value
5971
5983
  }, {
5972
5984
  message: slots.message
5973
5985
  }), slots.details?.(slotProps.value)])]);
@@ -5979,10 +5991,6 @@ const VInput = genericComponent()({
5979
5991
  };
5980
5992
  }
5981
5993
  });
5982
- function filterInputProps(props) {
5983
- const keys = Object.keys(VInput.props).filter(k => !isOn(k));
5984
- return pick(props, keys);
5985
- }
5986
5994
 
5987
5995
  const VCounter = genericComponent()({
5988
5996
  name: 'VCounter',
@@ -6108,8 +6116,6 @@ const makeVTextFieldProps = propsFactory({
6108
6116
  autofocus: Boolean,
6109
6117
  counter: [Boolean, Number, String],
6110
6118
  counterValue: Function,
6111
- hint: String,
6112
- persistentHint: Boolean,
6113
6119
  prefix: String,
6114
6120
  placeholder: String,
6115
6121
  persistentPlaceholder: Boolean,
@@ -6164,9 +6170,6 @@ const VTextField = genericComponent()({
6164
6170
  const vFieldRef = ref();
6165
6171
  const inputRef = ref();
6166
6172
  const isActive = computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value);
6167
- const messages = computed(() => {
6168
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
6169
- });
6170
6173
  function onFocus() {
6171
6174
  if (inputRef.value !== document.activeElement) {
6172
6175
  inputRef.value?.focus();
@@ -6209,7 +6212,7 @@ const VTextField = genericComponent()({
6209
6212
  const [{
6210
6213
  modelValue: _,
6211
6214
  ...inputProps
6212
- }] = filterInputProps(props);
6215
+ }] = VInput.filterProps(props);
6213
6216
  const [fieldProps] = filterFieldProps(props);
6214
6217
  return createVNode(VInput, mergeProps({
6215
6218
  "ref": vInputRef,
@@ -6219,12 +6222,9 @@ const VTextField = genericComponent()({
6219
6222
  'v-text-field--prefixed': props.prefix,
6220
6223
  'v-text-field--suffixed': props.suffix,
6221
6224
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
6222
- }],
6223
- "onClick:prepend": props['onClick:prepend'],
6224
- "onClick:append": props['onClick:append']
6225
+ }]
6225
6226
  }, rootAttrs, inputProps, {
6226
- "focused": isFocused.value,
6227
- "messages": messages.value
6227
+ "focused": isFocused.value
6228
6228
  }), {
6229
6229
  ...slots,
6230
6230
  default: _ref2 => {
@@ -6633,7 +6633,7 @@ const VCheckbox = genericComponent()({
6633
6633
  const id = computed(() => props.id || `checkbox-${uid}`);
6634
6634
  useRender(() => {
6635
6635
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
6636
- const [inputProps, _1] = filterInputProps(props);
6636
+ const [inputProps, _1] = VInput.filterProps(props);
6637
6637
  const [checkboxProps, _2] = VCheckboxBtn.filterProps(props);
6638
6638
  return createVNode(VInput, mergeProps({
6639
6639
  "class": "v-checkbox"
@@ -8045,7 +8045,12 @@ function transformItems$1(props, items) {
8045
8045
  function useItems(props) {
8046
8046
  const items = computed(() => transformItems$1(props, props.items));
8047
8047
  function transformIn(value) {
8048
- return value.map(item => transformItem$1(props, item));
8048
+ return value.map(v => {
8049
+ const existingItem = items.value.find(item => deepEqual(v, item.value));
8050
+ // Nullish existingItem means value is a custom input value from combobox
8051
+ // In this case, use transformItem to create an InternalItem based on value
8052
+ return existingItem ?? transformItem$1(props, v);
8053
+ });
8049
8054
  }
8050
8055
  function transformOut(value) {
8051
8056
  return value.map(_ref => {
@@ -8723,7 +8728,7 @@ function staticLocationStrategy() {
8723
8728
  }
8724
8729
 
8725
8730
  /** Get size of element ignoring max-width/max-height */
8726
- function getIntrinsicSize(el) {
8731
+ function getIntrinsicSize(el, isRtl) {
8727
8732
  // const scrollables = new Map<Element, [number, number]>()
8728
8733
  // el.querySelectorAll('*').forEach(el => {
8729
8734
  // const x = el.scrollLeft
@@ -8740,7 +8745,11 @@ function getIntrinsicSize(el) {
8740
8745
 
8741
8746
  /* eslint-disable-next-line sonarjs/prefer-immediate-return */
8742
8747
  const contentBox = nullifyTransforms(el);
8743
- contentBox.x -= parseFloat(el.style.left || 0);
8748
+ if (isRtl) {
8749
+ contentBox.x += parseFloat(el.style.right || 0);
8750
+ } else {
8751
+ contentBox.x -= parseFloat(el.style.left || 0);
8752
+ }
8744
8753
  contentBox.y -= parseFloat(el.style.top || 0);
8745
8754
 
8746
8755
  // el.style.maxWidth = initialMaxWidth
@@ -8821,7 +8830,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
8821
8830
  });
8822
8831
  if (!data.activatorEl.value || !data.contentEl.value) return;
8823
8832
  const targetBox = data.activatorEl.value.getBoundingClientRect();
8824
- const contentBox = getIntrinsicSize(data.contentEl.value);
8833
+ const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value);
8825
8834
  const scrollParents = getScrollParents(data.contentEl.value);
8826
8835
  const viewportMargin = 12;
8827
8836
  if (!scrollParents.length) {
@@ -8997,7 +9006,8 @@ function connectedLocationStrategy(data, props, contentStyles) {
8997
9006
  transformOrigin: `${placement.origin.side} ${placement.origin.align}`,
8998
9007
  // transform: `translate(${pixelRound(x)}px, ${pixelRound(y)}px)`,
8999
9008
  top: convertToUnit(pixelRound(y)),
9000
- left: convertToUnit(pixelRound(x)),
9009
+ left: data.isRtl.value ? undefined : convertToUnit(pixelRound(x)),
9010
+ right: data.isRtl.value ? convertToUnit(pixelRound(-x)) : undefined,
9001
9011
  minWidth: convertToUnit(axis === 'y' ? Math.min(minWidth.value, targetBox.width) : minWidth.value),
9002
9012
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
9003
9013
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
@@ -9892,6 +9902,7 @@ const VSelect = genericComponent()({
9892
9902
  })
9893
9903
  },
9894
9904
  emits: {
9905
+ 'update:focused': focused => true,
9895
9906
  'update:modelValue': val => true,
9896
9907
  'update:menu': val => true
9897
9908
  },
@@ -10008,6 +10019,9 @@ const VSelect = genericComponent()({
10008
10019
  menu.value = false;
10009
10020
  }
10010
10021
  }
10022
+ function onFocusin(e) {
10023
+ isFocused.value = true;
10024
+ }
10011
10025
  function onFocusout(e) {
10012
10026
  if (e.relatedTarget == null) {
10013
10027
  vTextFieldRef.value?.focus();
@@ -10062,6 +10076,7 @@ const VSelect = genericComponent()({
10062
10076
  "selected": selected.value,
10063
10077
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
10064
10078
  "onMousedown": e => e.preventDefault(),
10079
+ "onFocusin": onFocusin,
10065
10080
  "onFocusout": onFocusout
10066
10081
  }, {
10067
10082
  default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? createVNode(VListItem, {
@@ -10140,6 +10155,7 @@ const VSelect = genericComponent()({
10140
10155
  });
10141
10156
  });
10142
10157
  return forwardRefs({
10158
+ isFocused,
10143
10159
  menu,
10144
10160
  select
10145
10161
  }, vTextFieldRef);
@@ -10278,6 +10294,7 @@ const VAutocomplete = genericComponent()({
10278
10294
  })
10279
10295
  },
10280
10296
  emits: {
10297
+ 'update:focused': focused => true,
10281
10298
  'update:search': val => true,
10282
10299
  'update:modelValue': val => true,
10283
10300
  'update:menu': val => true
@@ -10301,11 +10318,17 @@ const VAutocomplete = genericComponent()({
10301
10318
  _menu.value = v;
10302
10319
  }
10303
10320
  });
10321
+ const selectionIndex = ref(-1);
10322
+ const color = computed(() => vTextFieldRef.value?.color);
10304
10323
  const {
10305
10324
  items,
10306
10325
  transformIn,
10307
10326
  transformOut
10308
10327
  } = useItems(props);
10328
+ const {
10329
+ textColorClasses,
10330
+ textColorStyles
10331
+ } = useTextColor(color);
10309
10332
  const search = useProxiedModel(props, 'search', '');
10310
10333
  const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => {
10311
10334
  const transformed = transformOut(v);
@@ -10328,6 +10351,7 @@ const VAutocomplete = genericComponent()({
10328
10351
  return filteredItems.value;
10329
10352
  });
10330
10353
  const selected = computed(() => selections.value.map(selection => selection.props.value));
10354
+ const selection = computed(() => selections.value[selectionIndex.value]);
10331
10355
  const listRef = ref();
10332
10356
  function onClear(e) {
10333
10357
  if (props.openOnClear) {
@@ -10341,7 +10365,9 @@ const VAutocomplete = genericComponent()({
10341
10365
  }
10342
10366
  function onKeydown(e) {
10343
10367
  if (props.readonly || form?.isReadonly.value) return;
10344
- if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10368
+ const selectionStart = vTextFieldRef.value.selectionStart;
10369
+ const length = selected.value.length;
10370
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10345
10371
  e.preventDefault();
10346
10372
  }
10347
10373
  if (['Enter', 'ArrowDown'].includes(e.key)) {
@@ -10358,6 +10384,38 @@ const VAutocomplete = genericComponent()({
10358
10384
  } else if (e.key === 'ArrowUp') {
10359
10385
  listRef.value?.focus('prev');
10360
10386
  }
10387
+ if (!props.multiple) return;
10388
+ if (['Backspace', 'Delete'].includes(e.key)) {
10389
+ if (selectionIndex.value < 0) {
10390
+ if (e.key === 'Backspace' && !search.value) {
10391
+ selectionIndex.value = length - 1;
10392
+ }
10393
+ return;
10394
+ }
10395
+ const originalSelectionIndex = selectionIndex.value;
10396
+ if (selection.value) select(selection.value);
10397
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
10398
+ }
10399
+ if (e.key === 'ArrowLeft') {
10400
+ if (selectionIndex.value < 0 && selectionStart > 0) return;
10401
+ const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
10402
+ if (selections.value[prev]) {
10403
+ selectionIndex.value = prev;
10404
+ } else {
10405
+ selectionIndex.value = -1;
10406
+ vTextFieldRef.value.setSelectionRange(search.value?.length, search.value?.length);
10407
+ }
10408
+ }
10409
+ if (e.key === 'ArrowRight') {
10410
+ if (selectionIndex.value < 0) return;
10411
+ const next = selectionIndex.value + 1;
10412
+ if (selections.value[next]) {
10413
+ selectionIndex.value = next;
10414
+ } else {
10415
+ selectionIndex.value = -1;
10416
+ vTextFieldRef.value.setSelectionRange(0, 0);
10417
+ }
10418
+ }
10361
10419
  }
10362
10420
  function onInput(e) {
10363
10421
  search.value = e.target.value;
@@ -10379,7 +10437,6 @@ const VAutocomplete = genericComponent()({
10379
10437
  const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
10380
10438
  if (index === -1) {
10381
10439
  model.value = [...model.value, item];
10382
- search.value = '';
10383
10440
  } else {
10384
10441
  const value = [...model.value];
10385
10442
  value.splice(index, 1);
@@ -10424,12 +10481,15 @@ const VAutocomplete = genericComponent()({
10424
10481
  "onUpdate:modelValue": v => {
10425
10482
  if (v == null) model.value = [];
10426
10483
  },
10484
+ "focused": isFocused.value,
10485
+ "onUpdate:focused": $event => isFocused.value = $event,
10427
10486
  "validationValue": model.externalValue,
10428
10487
  "dirty": isDirty,
10429
10488
  "onInput": onInput,
10430
10489
  "class": ['v-autocomplete', {
10431
10490
  'v-autocomplete--active-menu': menu.value,
10432
10491
  'v-autocomplete--chips': !!props.chips,
10492
+ 'v-autocomplete--selecting-index': selectionIndex.value > -1,
10433
10493
  [`v-autocomplete--${props.multiple ? 'multiple' : 'single'}`]: true,
10434
10494
  'v-autocomplete--selection-slot': !!slots.selection
10435
10495
  }],
@@ -10438,8 +10498,6 @@ const VAutocomplete = genericComponent()({
10438
10498
  "placeholder": isDirty ? undefined : props.placeholder,
10439
10499
  "onClick:clear": onClear,
10440
10500
  "onMousedown:control": onMousedownControl,
10441
- "onFocus": () => isFocused.value = true,
10442
- "onBlur": () => isFocused.value = false,
10443
10501
  "onKeydown": onKeydown
10444
10502
  }), {
10445
10503
  ...slots,
@@ -10504,7 +10562,8 @@ const VAutocomplete = genericComponent()({
10504
10562
  };
10505
10563
  return createVNode("div", {
10506
10564
  "key": item.value,
10507
- "class": "v-autocomplete__selection"
10565
+ "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
10566
+ "style": index === selectionIndex.value ? textColorStyles.value : {}
10508
10567
  }, [hasChips ? !slots.chip ? createVNode(VChip, mergeProps({
10509
10568
  "key": "chip",
10510
10569
  "closable": props.closableChips,
@@ -12899,7 +12958,7 @@ const VSlider = genericComponent()({
12899
12958
  } = useFocus(props);
12900
12959
  const trackStop = computed(() => position(model.value));
12901
12960
  useRender(() => {
12902
- const [inputProps, _] = filterInputProps(props);
12961
+ const [inputProps, _] = VInput.filterProps(props);
12903
12962
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
12904
12963
  return createVNode(VInput, mergeProps({
12905
12964
  "class": ['v-slider', {
@@ -13563,6 +13622,7 @@ const VCombobox = genericComponent()({
13563
13622
  })
13564
13623
  },
13565
13624
  emits: {
13625
+ 'update:focused': focused => true,
13566
13626
  'update:modelValue': val => true,
13567
13627
  'update:search': val => true,
13568
13628
  'update:menu': val => true
@@ -13700,8 +13760,9 @@ const VCombobox = genericComponent()({
13700
13760
  }
13701
13761
  return;
13702
13762
  }
13703
- select(selection.value);
13704
- nextTick(() => !selection.value && (selectionIndex.value = length - 2));
13763
+ const originalSelectionIndex = selectionIndex.value;
13764
+ if (selection.value) select(selection.value);
13765
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
13705
13766
  }
13706
13767
  if (e.key === 'ArrowLeft') {
13707
13768
  if (selectionIndex.value < 0 && selectionStart > 0) return;
@@ -13786,6 +13847,8 @@ const VCombobox = genericComponent()({
13786
13847
  "onUpdate:modelValue": [$event => search.value = $event, v => {
13787
13848
  if (v == null) model.value = [];
13788
13849
  }],
13850
+ "focused": isFocused.value,
13851
+ "onUpdate:focused": $event => isFocused.value = $event,
13789
13852
  "validationValue": model.externalValue,
13790
13853
  "dirty": isDirty,
13791
13854
  "class": ['v-combobox', {
@@ -13799,8 +13862,6 @@ const VCombobox = genericComponent()({
13799
13862
  "placeholder": isDirty ? undefined : props.placeholder,
13800
13863
  "onClick:clear": onClear,
13801
13864
  "onMousedown:control": onMousedownControl,
13802
- "onFocus": () => isFocused.value = true,
13803
- "onBlur": () => isFocused.value = false,
13804
13865
  "onKeydown": onKeydown
13805
13866
  }), {
13806
13867
  ...slots,
@@ -14252,8 +14313,6 @@ const VFileInput = genericComponent()({
14252
14313
  default: '$vuetify.fileInput.counter'
14253
14314
  },
14254
14315
  multiple: Boolean,
14255
- hint: String,
14256
- persistentHint: Boolean,
14257
14316
  showSize: {
14258
14317
  type: [Boolean, Number],
14259
14318
  default: false,
@@ -14278,6 +14337,7 @@ const VFileInput = genericComponent()({
14278
14337
  emits: {
14279
14338
  'click:control': e => true,
14280
14339
  'mousedown:control': e => true,
14340
+ 'update:focused': focused => true,
14281
14341
  'update:modelValue': files => true
14282
14342
  },
14283
14343
  setup(props, _ref) {
@@ -14290,6 +14350,11 @@ const VFileInput = genericComponent()({
14290
14350
  t
14291
14351
  } = useLocale();
14292
14352
  const model = useProxiedModel(props, 'modelValue');
14353
+ const {
14354
+ isFocused,
14355
+ focus,
14356
+ blur
14357
+ } = useFocus(props);
14293
14358
  const base = computed(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined);
14294
14359
  const totalBytes = computed(() => (model.value ?? []).reduce((bytes, _ref2) => {
14295
14360
  let {
@@ -14311,21 +14376,14 @@ const VFileInput = genericComponent()({
14311
14376
  });
14312
14377
  const vInputRef = ref();
14313
14378
  const vFieldRef = ref();
14314
- const isFocused = ref(false);
14315
14379
  const inputRef = ref();
14316
- const messages = computed(() => {
14317
- return props.messages.length ? props.messages : props.persistentHint ? props.hint : '';
14318
- });
14319
14380
  function onFocus() {
14320
14381
  if (inputRef.value !== document.activeElement) {
14321
14382
  inputRef.value?.focus();
14322
14383
  }
14323
- if (!isFocused.value) {
14324
- isFocused.value = true;
14325
- }
14384
+ if (!isFocused.value) focus();
14326
14385
  }
14327
14386
  function onClickPrepend(e) {
14328
- callEvent(props['onClick:prepend'], e);
14329
14387
  onControlClick(e);
14330
14388
  }
14331
14389
  function onControlMousedown(e) {
@@ -14356,18 +14414,16 @@ const VFileInput = genericComponent()({
14356
14414
  const [{
14357
14415
  modelValue: _,
14358
14416
  ...inputProps
14359
- }] = filterInputProps(props);
14417
+ }] = VInput.filterProps(props);
14360
14418
  const [fieldProps] = filterFieldProps(props);
14361
14419
  return createVNode(VInput, mergeProps({
14362
14420
  "ref": vInputRef,
14363
14421
  "modelValue": model.value,
14364
14422
  "onUpdate:modelValue": $event => model.value = $event,
14365
14423
  "class": "v-file-input",
14366
- "onClick:prepend": onClickPrepend,
14367
- "onClick:append": props['onClick:append']
14424
+ "onClick:prepend": onClickPrepend
14368
14425
  }, rootAttrs, inputProps, {
14369
- "focused": isFocused.value,
14370
- "messages": messages.value
14426
+ "focused": isFocused.value
14371
14427
  }), {
14372
14428
  ...slots,
14373
14429
  default: _ref3 => {
@@ -14419,7 +14475,7 @@ const VFileInput = genericComponent()({
14419
14475
  model.value = [...(target.files ?? [])];
14420
14476
  },
14421
14477
  "onFocus": onFocus,
14422
- "onBlur": () => isFocused.value = false
14478
+ "onBlur": blur
14423
14479
  }, slotProps, inputAttrs), null), createVNode("div", {
14424
14480
  "class": fieldClass
14425
14481
  }, [!!model.value?.length && (slots.selection ? slots.selection({
@@ -16114,7 +16170,7 @@ const VRadioGroup = genericComponent()({
16114
16170
  const model = useProxiedModel(props, 'modelValue');
16115
16171
  useRender(() => {
16116
16172
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
16117
- const [inputProps, _1] = filterInputProps(props);
16173
+ const [inputProps, _1] = VInput.filterProps(props);
16118
16174
  const [controlProps, _2] = VSelectionControl.filterProps(props);
16119
16175
  const label = slots.label ? slots.label({
16120
16176
  label: props.label,
@@ -16242,7 +16298,7 @@ const VRangeSlider = genericComponent()({
16242
16298
  const trackStart = computed(() => position(model.value[0]));
16243
16299
  const trackStop = computed(() => position(model.value[1]));
16244
16300
  useRender(() => {
16245
- const [inputProps, _] = filterInputProps(props);
16301
+ const [inputProps, _] = VInput.filterProps(props);
16246
16302
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
16247
16303
  return createVNode(VInput, mergeProps({
16248
16304
  "class": ['v-slider', 'v-range-slider', {
@@ -17116,10 +17172,12 @@ const VSwitch = genericComponent()({
17116
17172
  }
17117
17173
  useRender(() => {
17118
17174
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
17119
- const [inputProps, _1] = filterInputProps(props);
17175
+ const [inputProps, _1] = VInput.filterProps(props);
17120
17176
  const [controlProps, _2] = VSelectionControl.filterProps(props);
17121
17177
  const control = ref();
17122
- function onClick() {
17178
+ function onClick(e) {
17179
+ e.stopPropagation();
17180
+ e.preventDefault();
17123
17181
  control.value?.input?.click();
17124
17182
  }
17125
17183
  return createVNode(VInput, mergeProps({
@@ -17481,8 +17539,6 @@ const VTextarea = genericComponent()({
17481
17539
  autofocus: Boolean,
17482
17540
  counter: [Boolean, Number, String],
17483
17541
  counterValue: Function,
17484
- hint: String,
17485
- persistentHint: Boolean,
17486
17542
  prefix: String,
17487
17543
  placeholder: String,
17488
17544
  persistentPlaceholder: Boolean,
@@ -17537,9 +17593,6 @@ const VTextarea = genericComponent()({
17537
17593
  const controlHeight = ref('');
17538
17594
  const textareaRef = ref();
17539
17595
  const isActive = computed(() => isFocused.value || props.persistentPlaceholder);
17540
- const messages = computed(() => {
17541
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
17542
- });
17543
17596
  function onFocus() {
17544
17597
  if (textareaRef.value !== document.activeElement) {
17545
17598
  textareaRef.value?.focus();
@@ -17611,7 +17664,7 @@ const VTextarea = genericComponent()({
17611
17664
  const [{
17612
17665
  modelValue: _,
17613
17666
  ...inputProps
17614
- }] = filterInputProps(props);
17667
+ }] = VInput.filterProps(props);
17615
17668
  const [fieldProps] = filterFieldProps(props);
17616
17669
  return createVNode(VInput, mergeProps({
17617
17670
  "ref": vInputRef,
@@ -17625,12 +17678,9 @@ const VTextarea = genericComponent()({
17625
17678
  'v-textarea--auto-grow': props.autoGrow,
17626
17679
  'v-textarea--no-resize': props.noResize || props.autoGrow,
17627
17680
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
17628
- }],
17629
- "onClick:prepend": props['onClick:prepend'],
17630
- "onClick:append": props['onClick:append']
17681
+ }]
17631
17682
  }, rootAttrs, inputProps, {
17632
- "focused": isFocused.value,
17633
- "messages": messages.value
17683
+ "focused": isFocused.value
17634
17684
  }), {
17635
17685
  ...slots,
17636
17686
  default: _ref2 => {
@@ -18403,7 +18453,7 @@ function createVuetify$1() {
18403
18453
  locale
18404
18454
  };
18405
18455
  }
18406
- const version$1 = "3.1.14";
18456
+ const version$1 = "3.1.15";
18407
18457
  createVuetify$1.version = version$1;
18408
18458
 
18409
18459
  // Vue's inject() can only be used in setup
@@ -18423,7 +18473,7 @@ const createVuetify = function () {
18423
18473
  ...options
18424
18474
  });
18425
18475
  };
18426
- const version = "3.1.14";
18476
+ const version = "3.1.15";
18427
18477
  createVuetify.version = version;
18428
18478
 
18429
18479
  export { components, createVuetify, directives, useDisplay, useLayout, useLocale, useRtl, useTheme, version };