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
  */
@@ -5297,7 +5297,8 @@
5297
5297
 
5298
5298
  // Composables
5299
5299
  const makeFocusProps = propsFactory({
5300
- focused: Boolean
5300
+ focused: Boolean,
5301
+ 'onUpdate:focused': EventProp()
5301
5302
  }, 'focus');
5302
5303
  function useFocus(props) {
5303
5304
  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
@@ -5886,6 +5887,8 @@
5886
5887
  appendIcon: IconValue,
5887
5888
  prependIcon: IconValue,
5888
5889
  hideDetails: [Boolean, String],
5890
+ hint: String,
5891
+ persistentHint: Boolean,
5889
5892
  messages: {
5890
5893
  type: [Array, String],
5891
5894
  default: () => []
@@ -5949,10 +5952,19 @@
5949
5952
  resetValidation,
5950
5953
  validate
5951
5954
  }));
5955
+ const messages = vue.computed(() => {
5956
+ if (errorMessages.value.length > 0) {
5957
+ return errorMessages.value;
5958
+ } else if (props.hint && (props.persistentHint || props.focused)) {
5959
+ return props.hint;
5960
+ } else {
5961
+ return props.messages;
5962
+ }
5963
+ });
5952
5964
  useRender(() => {
5953
5965
  const hasPrepend = !!(slots.prepend || props.prependIcon);
5954
5966
  const hasAppend = !!(slots.append || props.appendIcon);
5955
- const hasMessages = !!(props.messages?.length || errorMessages.value.length);
5967
+ const hasMessages = messages.value.length > 0;
5956
5968
  const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
5957
5969
  return vue.createVNode("div", {
5958
5970
  "class": ['v-input', `v-input--${props.direction}`, densityClasses.value, validationClasses.value]
@@ -5975,7 +5987,7 @@
5975
5987
  }, [vue.createVNode(VMessages, {
5976
5988
  "id": messagesId.value,
5977
5989
  "active": hasMessages,
5978
- "messages": errorMessages.value.length > 0 ? errorMessages.value : props.messages
5990
+ "messages": messages.value
5979
5991
  }, {
5980
5992
  message: slots.message
5981
5993
  }), slots.details?.(slotProps.value)])]);
@@ -5987,10 +5999,6 @@
5987
5999
  };
5988
6000
  }
5989
6001
  });
5990
- function filterInputProps(props) {
5991
- const keys = Object.keys(VInput.props).filter(k => !isOn(k));
5992
- return pick(props, keys);
5993
- }
5994
6002
 
5995
6003
  const VCounter = genericComponent()({
5996
6004
  name: 'VCounter',
@@ -6116,8 +6124,6 @@
6116
6124
  autofocus: Boolean,
6117
6125
  counter: [Boolean, Number, String],
6118
6126
  counterValue: Function,
6119
- hint: String,
6120
- persistentHint: Boolean,
6121
6127
  prefix: String,
6122
6128
  placeholder: String,
6123
6129
  persistentPlaceholder: Boolean,
@@ -6172,9 +6178,6 @@
6172
6178
  const vFieldRef = vue.ref();
6173
6179
  const inputRef = vue.ref();
6174
6180
  const isActive = vue.computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value);
6175
- const messages = vue.computed(() => {
6176
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
6177
- });
6178
6181
  function onFocus() {
6179
6182
  if (inputRef.value !== document.activeElement) {
6180
6183
  inputRef.value?.focus();
@@ -6217,7 +6220,7 @@
6217
6220
  const [{
6218
6221
  modelValue: _,
6219
6222
  ...inputProps
6220
- }] = filterInputProps(props);
6223
+ }] = VInput.filterProps(props);
6221
6224
  const [fieldProps] = filterFieldProps(props);
6222
6225
  return vue.createVNode(VInput, vue.mergeProps({
6223
6226
  "ref": vInputRef,
@@ -6227,12 +6230,9 @@
6227
6230
  'v-text-field--prefixed': props.prefix,
6228
6231
  'v-text-field--suffixed': props.suffix,
6229
6232
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
6230
- }],
6231
- "onClick:prepend": props['onClick:prepend'],
6232
- "onClick:append": props['onClick:append']
6233
+ }]
6233
6234
  }, rootAttrs, inputProps, {
6234
- "focused": isFocused.value,
6235
- "messages": messages.value
6235
+ "focused": isFocused.value
6236
6236
  }), {
6237
6237
  ...slots,
6238
6238
  default: _ref2 => {
@@ -6641,7 +6641,7 @@
6641
6641
  const id = vue.computed(() => props.id || `checkbox-${uid}`);
6642
6642
  useRender(() => {
6643
6643
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
6644
- const [inputProps, _1] = filterInputProps(props);
6644
+ const [inputProps, _1] = VInput.filterProps(props);
6645
6645
  const [checkboxProps, _2] = VCheckboxBtn.filterProps(props);
6646
6646
  return vue.createVNode(VInput, vue.mergeProps({
6647
6647
  "class": "v-checkbox"
@@ -8053,7 +8053,12 @@
8053
8053
  function useItems(props) {
8054
8054
  const items = vue.computed(() => transformItems$1(props, props.items));
8055
8055
  function transformIn(value) {
8056
- return value.map(item => transformItem$1(props, item));
8056
+ return value.map(v => {
8057
+ const existingItem = items.value.find(item => deepEqual(v, item.value));
8058
+ // Nullish existingItem means value is a custom input value from combobox
8059
+ // In this case, use transformItem to create an InternalItem based on value
8060
+ return existingItem ?? transformItem$1(props, v);
8061
+ });
8057
8062
  }
8058
8063
  function transformOut(value) {
8059
8064
  return value.map(_ref => {
@@ -8731,7 +8736,7 @@
8731
8736
  }
8732
8737
 
8733
8738
  /** Get size of element ignoring max-width/max-height */
8734
- function getIntrinsicSize(el) {
8739
+ function getIntrinsicSize(el, isRtl) {
8735
8740
  // const scrollables = new Map<Element, [number, number]>()
8736
8741
  // el.querySelectorAll('*').forEach(el => {
8737
8742
  // const x = el.scrollLeft
@@ -8748,7 +8753,11 @@
8748
8753
 
8749
8754
  /* eslint-disable-next-line sonarjs/prefer-immediate-return */
8750
8755
  const contentBox = nullifyTransforms(el);
8751
- contentBox.x -= parseFloat(el.style.left || 0);
8756
+ if (isRtl) {
8757
+ contentBox.x += parseFloat(el.style.right || 0);
8758
+ } else {
8759
+ contentBox.x -= parseFloat(el.style.left || 0);
8760
+ }
8752
8761
  contentBox.y -= parseFloat(el.style.top || 0);
8753
8762
 
8754
8763
  // el.style.maxWidth = initialMaxWidth
@@ -8829,7 +8838,7 @@
8829
8838
  });
8830
8839
  if (!data.activatorEl.value || !data.contentEl.value) return;
8831
8840
  const targetBox = data.activatorEl.value.getBoundingClientRect();
8832
- const contentBox = getIntrinsicSize(data.contentEl.value);
8841
+ const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value);
8833
8842
  const scrollParents = getScrollParents(data.contentEl.value);
8834
8843
  const viewportMargin = 12;
8835
8844
  if (!scrollParents.length) {
@@ -9005,7 +9014,8 @@
9005
9014
  transformOrigin: `${placement.origin.side} ${placement.origin.align}`,
9006
9015
  // transform: `translate(${pixelRound(x)}px, ${pixelRound(y)}px)`,
9007
9016
  top: convertToUnit(pixelRound(y)),
9008
- left: convertToUnit(pixelRound(x)),
9017
+ left: data.isRtl.value ? undefined : convertToUnit(pixelRound(x)),
9018
+ right: data.isRtl.value ? convertToUnit(pixelRound(-x)) : undefined,
9009
9019
  minWidth: convertToUnit(axis === 'y' ? Math.min(minWidth.value, targetBox.width) : minWidth.value),
9010
9020
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
9011
9021
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
@@ -9900,6 +9910,7 @@
9900
9910
  })
9901
9911
  },
9902
9912
  emits: {
9913
+ 'update:focused': focused => true,
9903
9914
  'update:modelValue': val => true,
9904
9915
  'update:menu': val => true
9905
9916
  },
@@ -10016,6 +10027,9 @@
10016
10027
  menu.value = false;
10017
10028
  }
10018
10029
  }
10030
+ function onFocusin(e) {
10031
+ isFocused.value = true;
10032
+ }
10019
10033
  function onFocusout(e) {
10020
10034
  if (e.relatedTarget == null) {
10021
10035
  vTextFieldRef.value?.focus();
@@ -10070,6 +10084,7 @@
10070
10084
  "selected": selected.value,
10071
10085
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
10072
10086
  "onMousedown": e => e.preventDefault(),
10087
+ "onFocusin": onFocusin,
10073
10088
  "onFocusout": onFocusout
10074
10089
  }, {
10075
10090
  default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
@@ -10148,6 +10163,7 @@
10148
10163
  });
10149
10164
  });
10150
10165
  return forwardRefs({
10166
+ isFocused,
10151
10167
  menu,
10152
10168
  select
10153
10169
  }, vTextFieldRef);
@@ -10286,6 +10302,7 @@
10286
10302
  })
10287
10303
  },
10288
10304
  emits: {
10305
+ 'update:focused': focused => true,
10289
10306
  'update:search': val => true,
10290
10307
  'update:modelValue': val => true,
10291
10308
  'update:menu': val => true
@@ -10309,11 +10326,17 @@
10309
10326
  _menu.value = v;
10310
10327
  }
10311
10328
  });
10329
+ const selectionIndex = vue.ref(-1);
10330
+ const color = vue.computed(() => vTextFieldRef.value?.color);
10312
10331
  const {
10313
10332
  items,
10314
10333
  transformIn,
10315
10334
  transformOut
10316
10335
  } = useItems(props);
10336
+ const {
10337
+ textColorClasses,
10338
+ textColorStyles
10339
+ } = useTextColor(color);
10317
10340
  const search = useProxiedModel(props, 'search', '');
10318
10341
  const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => {
10319
10342
  const transformed = transformOut(v);
@@ -10336,6 +10359,7 @@
10336
10359
  return filteredItems.value;
10337
10360
  });
10338
10361
  const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
10362
+ const selection = vue.computed(() => selections.value[selectionIndex.value]);
10339
10363
  const listRef = vue.ref();
10340
10364
  function onClear(e) {
10341
10365
  if (props.openOnClear) {
@@ -10349,7 +10373,9 @@
10349
10373
  }
10350
10374
  function onKeydown(e) {
10351
10375
  if (props.readonly || form?.isReadonly.value) return;
10352
- if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10376
+ const selectionStart = vTextFieldRef.value.selectionStart;
10377
+ const length = selected.value.length;
10378
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10353
10379
  e.preventDefault();
10354
10380
  }
10355
10381
  if (['Enter', 'ArrowDown'].includes(e.key)) {
@@ -10366,6 +10392,38 @@
10366
10392
  } else if (e.key === 'ArrowUp') {
10367
10393
  listRef.value?.focus('prev');
10368
10394
  }
10395
+ if (!props.multiple) return;
10396
+ if (['Backspace', 'Delete'].includes(e.key)) {
10397
+ if (selectionIndex.value < 0) {
10398
+ if (e.key === 'Backspace' && !search.value) {
10399
+ selectionIndex.value = length - 1;
10400
+ }
10401
+ return;
10402
+ }
10403
+ const originalSelectionIndex = selectionIndex.value;
10404
+ if (selection.value) select(selection.value);
10405
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
10406
+ }
10407
+ if (e.key === 'ArrowLeft') {
10408
+ if (selectionIndex.value < 0 && selectionStart > 0) return;
10409
+ const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
10410
+ if (selections.value[prev]) {
10411
+ selectionIndex.value = prev;
10412
+ } else {
10413
+ selectionIndex.value = -1;
10414
+ vTextFieldRef.value.setSelectionRange(search.value?.length, search.value?.length);
10415
+ }
10416
+ }
10417
+ if (e.key === 'ArrowRight') {
10418
+ if (selectionIndex.value < 0) return;
10419
+ const next = selectionIndex.value + 1;
10420
+ if (selections.value[next]) {
10421
+ selectionIndex.value = next;
10422
+ } else {
10423
+ selectionIndex.value = -1;
10424
+ vTextFieldRef.value.setSelectionRange(0, 0);
10425
+ }
10426
+ }
10369
10427
  }
10370
10428
  function onInput(e) {
10371
10429
  search.value = e.target.value;
@@ -10387,7 +10445,6 @@
10387
10445
  const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
10388
10446
  if (index === -1) {
10389
10447
  model.value = [...model.value, item];
10390
- search.value = '';
10391
10448
  } else {
10392
10449
  const value = [...model.value];
10393
10450
  value.splice(index, 1);
@@ -10432,12 +10489,15 @@
10432
10489
  "onUpdate:modelValue": v => {
10433
10490
  if (v == null) model.value = [];
10434
10491
  },
10492
+ "focused": isFocused.value,
10493
+ "onUpdate:focused": $event => isFocused.value = $event,
10435
10494
  "validationValue": model.externalValue,
10436
10495
  "dirty": isDirty,
10437
10496
  "onInput": onInput,
10438
10497
  "class": ['v-autocomplete', {
10439
10498
  'v-autocomplete--active-menu': menu.value,
10440
10499
  'v-autocomplete--chips': !!props.chips,
10500
+ 'v-autocomplete--selecting-index': selectionIndex.value > -1,
10441
10501
  [`v-autocomplete--${props.multiple ? 'multiple' : 'single'}`]: true,
10442
10502
  'v-autocomplete--selection-slot': !!slots.selection
10443
10503
  }],
@@ -10446,8 +10506,6 @@
10446
10506
  "placeholder": isDirty ? undefined : props.placeholder,
10447
10507
  "onClick:clear": onClear,
10448
10508
  "onMousedown:control": onMousedownControl,
10449
- "onFocus": () => isFocused.value = true,
10450
- "onBlur": () => isFocused.value = false,
10451
10509
  "onKeydown": onKeydown
10452
10510
  }), {
10453
10511
  ...slots,
@@ -10512,7 +10570,8 @@
10512
10570
  };
10513
10571
  return vue.createVNode("div", {
10514
10572
  "key": item.value,
10515
- "class": "v-autocomplete__selection"
10573
+ "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
10574
+ "style": index === selectionIndex.value ? textColorStyles.value : {}
10516
10575
  }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
10517
10576
  "key": "chip",
10518
10577
  "closable": props.closableChips,
@@ -12907,7 +12966,7 @@
12907
12966
  } = useFocus(props);
12908
12967
  const trackStop = vue.computed(() => position(model.value));
12909
12968
  useRender(() => {
12910
- const [inputProps, _] = filterInputProps(props);
12969
+ const [inputProps, _] = VInput.filterProps(props);
12911
12970
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
12912
12971
  return vue.createVNode(VInput, vue.mergeProps({
12913
12972
  "class": ['v-slider', {
@@ -13571,6 +13630,7 @@
13571
13630
  })
13572
13631
  },
13573
13632
  emits: {
13633
+ 'update:focused': focused => true,
13574
13634
  'update:modelValue': val => true,
13575
13635
  'update:search': val => true,
13576
13636
  'update:menu': val => true
@@ -13708,8 +13768,9 @@
13708
13768
  }
13709
13769
  return;
13710
13770
  }
13711
- select(selection.value);
13712
- vue.nextTick(() => !selection.value && (selectionIndex.value = length - 2));
13771
+ const originalSelectionIndex = selectionIndex.value;
13772
+ if (selection.value) select(selection.value);
13773
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
13713
13774
  }
13714
13775
  if (e.key === 'ArrowLeft') {
13715
13776
  if (selectionIndex.value < 0 && selectionStart > 0) return;
@@ -13794,6 +13855,8 @@
13794
13855
  "onUpdate:modelValue": [$event => search.value = $event, v => {
13795
13856
  if (v == null) model.value = [];
13796
13857
  }],
13858
+ "focused": isFocused.value,
13859
+ "onUpdate:focused": $event => isFocused.value = $event,
13797
13860
  "validationValue": model.externalValue,
13798
13861
  "dirty": isDirty,
13799
13862
  "class": ['v-combobox', {
@@ -13807,8 +13870,6 @@
13807
13870
  "placeholder": isDirty ? undefined : props.placeholder,
13808
13871
  "onClick:clear": onClear,
13809
13872
  "onMousedown:control": onMousedownControl,
13810
- "onFocus": () => isFocused.value = true,
13811
- "onBlur": () => isFocused.value = false,
13812
13873
  "onKeydown": onKeydown
13813
13874
  }), {
13814
13875
  ...slots,
@@ -14260,8 +14321,6 @@
14260
14321
  default: '$vuetify.fileInput.counter'
14261
14322
  },
14262
14323
  multiple: Boolean,
14263
- hint: String,
14264
- persistentHint: Boolean,
14265
14324
  showSize: {
14266
14325
  type: [Boolean, Number],
14267
14326
  default: false,
@@ -14286,6 +14345,7 @@
14286
14345
  emits: {
14287
14346
  'click:control': e => true,
14288
14347
  'mousedown:control': e => true,
14348
+ 'update:focused': focused => true,
14289
14349
  'update:modelValue': files => true
14290
14350
  },
14291
14351
  setup(props, _ref) {
@@ -14298,6 +14358,11 @@
14298
14358
  t
14299
14359
  } = useLocale();
14300
14360
  const model = useProxiedModel(props, 'modelValue');
14361
+ const {
14362
+ isFocused,
14363
+ focus,
14364
+ blur
14365
+ } = useFocus(props);
14301
14366
  const base = vue.computed(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined);
14302
14367
  const totalBytes = vue.computed(() => (model.value ?? []).reduce((bytes, _ref2) => {
14303
14368
  let {
@@ -14319,21 +14384,14 @@
14319
14384
  });
14320
14385
  const vInputRef = vue.ref();
14321
14386
  const vFieldRef = vue.ref();
14322
- const isFocused = vue.ref(false);
14323
14387
  const inputRef = vue.ref();
14324
- const messages = vue.computed(() => {
14325
- return props.messages.length ? props.messages : props.persistentHint ? props.hint : '';
14326
- });
14327
14388
  function onFocus() {
14328
14389
  if (inputRef.value !== document.activeElement) {
14329
14390
  inputRef.value?.focus();
14330
14391
  }
14331
- if (!isFocused.value) {
14332
- isFocused.value = true;
14333
- }
14392
+ if (!isFocused.value) focus();
14334
14393
  }
14335
14394
  function onClickPrepend(e) {
14336
- callEvent(props['onClick:prepend'], e);
14337
14395
  onControlClick(e);
14338
14396
  }
14339
14397
  function onControlMousedown(e) {
@@ -14364,18 +14422,16 @@
14364
14422
  const [{
14365
14423
  modelValue: _,
14366
14424
  ...inputProps
14367
- }] = filterInputProps(props);
14425
+ }] = VInput.filterProps(props);
14368
14426
  const [fieldProps] = filterFieldProps(props);
14369
14427
  return vue.createVNode(VInput, vue.mergeProps({
14370
14428
  "ref": vInputRef,
14371
14429
  "modelValue": model.value,
14372
14430
  "onUpdate:modelValue": $event => model.value = $event,
14373
14431
  "class": "v-file-input",
14374
- "onClick:prepend": onClickPrepend,
14375
- "onClick:append": props['onClick:append']
14432
+ "onClick:prepend": onClickPrepend
14376
14433
  }, rootAttrs, inputProps, {
14377
- "focused": isFocused.value,
14378
- "messages": messages.value
14434
+ "focused": isFocused.value
14379
14435
  }), {
14380
14436
  ...slots,
14381
14437
  default: _ref3 => {
@@ -14427,7 +14483,7 @@
14427
14483
  model.value = [...(target.files ?? [])];
14428
14484
  },
14429
14485
  "onFocus": onFocus,
14430
- "onBlur": () => isFocused.value = false
14486
+ "onBlur": blur
14431
14487
  }, slotProps, inputAttrs), null), vue.createVNode("div", {
14432
14488
  "class": fieldClass
14433
14489
  }, [!!model.value?.length && (slots.selection ? slots.selection({
@@ -16122,7 +16178,7 @@
16122
16178
  const model = useProxiedModel(props, 'modelValue');
16123
16179
  useRender(() => {
16124
16180
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
16125
- const [inputProps, _1] = filterInputProps(props);
16181
+ const [inputProps, _1] = VInput.filterProps(props);
16126
16182
  const [controlProps, _2] = VSelectionControl.filterProps(props);
16127
16183
  const label = slots.label ? slots.label({
16128
16184
  label: props.label,
@@ -16250,7 +16306,7 @@
16250
16306
  const trackStart = vue.computed(() => position(model.value[0]));
16251
16307
  const trackStop = vue.computed(() => position(model.value[1]));
16252
16308
  useRender(() => {
16253
- const [inputProps, _] = filterInputProps(props);
16309
+ const [inputProps, _] = VInput.filterProps(props);
16254
16310
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
16255
16311
  return vue.createVNode(VInput, vue.mergeProps({
16256
16312
  "class": ['v-slider', 'v-range-slider', {
@@ -17124,10 +17180,12 @@
17124
17180
  }
17125
17181
  useRender(() => {
17126
17182
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
17127
- const [inputProps, _1] = filterInputProps(props);
17183
+ const [inputProps, _1] = VInput.filterProps(props);
17128
17184
  const [controlProps, _2] = VSelectionControl.filterProps(props);
17129
17185
  const control = vue.ref();
17130
- function onClick() {
17186
+ function onClick(e) {
17187
+ e.stopPropagation();
17188
+ e.preventDefault();
17131
17189
  control.value?.input?.click();
17132
17190
  }
17133
17191
  return vue.createVNode(VInput, vue.mergeProps({
@@ -17489,8 +17547,6 @@
17489
17547
  autofocus: Boolean,
17490
17548
  counter: [Boolean, Number, String],
17491
17549
  counterValue: Function,
17492
- hint: String,
17493
- persistentHint: Boolean,
17494
17550
  prefix: String,
17495
17551
  placeholder: String,
17496
17552
  persistentPlaceholder: Boolean,
@@ -17545,9 +17601,6 @@
17545
17601
  const controlHeight = vue.ref('');
17546
17602
  const textareaRef = vue.ref();
17547
17603
  const isActive = vue.computed(() => isFocused.value || props.persistentPlaceholder);
17548
- const messages = vue.computed(() => {
17549
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
17550
- });
17551
17604
  function onFocus() {
17552
17605
  if (textareaRef.value !== document.activeElement) {
17553
17606
  textareaRef.value?.focus();
@@ -17619,7 +17672,7 @@
17619
17672
  const [{
17620
17673
  modelValue: _,
17621
17674
  ...inputProps
17622
- }] = filterInputProps(props);
17675
+ }] = VInput.filterProps(props);
17623
17676
  const [fieldProps] = filterFieldProps(props);
17624
17677
  return vue.createVNode(VInput, vue.mergeProps({
17625
17678
  "ref": vInputRef,
@@ -17633,12 +17686,9 @@
17633
17686
  'v-textarea--auto-grow': props.autoGrow,
17634
17687
  'v-textarea--no-resize': props.noResize || props.autoGrow,
17635
17688
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
17636
- }],
17637
- "onClick:prepend": props['onClick:prepend'],
17638
- "onClick:append": props['onClick:append']
17689
+ }]
17639
17690
  }, rootAttrs, inputProps, {
17640
- "focused": isFocused.value,
17641
- "messages": messages.value
17691
+ "focused": isFocused.value
17642
17692
  }), {
17643
17693
  ...slots,
17644
17694
  default: _ref2 => {
@@ -18949,56 +18999,64 @@
18949
18999
  const {
18950
19000
  t
18951
19001
  } = useLocale();
18952
- useRender(() => vue.createVNode(vue.Fragment, null, [props.loading ? slots.loading?.() ?? vue.createVNode(VDataTableRow, {
18953
- "class": "v-data-table-rows-no-data",
18954
- "key": "loading"
18955
- }, {
18956
- default: () => [t(props.loadingText)]
18957
- }) : undefined, !props.loading && !props.items.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VDataTableRow, {
18958
- "class": "v-data-table-rows-no-data",
18959
- "key": "no-data"
18960
- }, {
18961
- default: () => [t(props.noDataText)]
18962
- })), props.items.map((item, index) => {
18963
- if (item.type === 'group-header') {
18964
- return slots['group-header'] ? slots['group-header']({
19002
+ useRender(() => {
19003
+ if (props.loading && slots.loading) {
19004
+ return vue.createVNode("tr", {
19005
+ "class": "v-data-table-rows-no-data",
19006
+ "key": "loading"
19007
+ }, [vue.createVNode("td", {
19008
+ "colspan": columns.value.length
19009
+ }, [slots.loading()])]);
19010
+ }
19011
+ if (!props.loading && !props.items.length && !props.hideNoData && slots['no-data']) {
19012
+ return vue.createVNode("tr", {
19013
+ "class": "v-data-table-rows-no-data",
19014
+ "key": "no-data"
19015
+ }, [vue.createVNode("td", {
19016
+ "colspan": columns.value.length
19017
+ }, [slots['no-data']?.() ?? t(props.noDataText)])]);
19018
+ }
19019
+ return vue.createVNode(vue.Fragment, null, [props.items.map((item, index) => {
19020
+ if (item.type === 'group-header') {
19021
+ return slots['group-header'] ? slots['group-header']({
19022
+ index,
19023
+ item,
19024
+ columns: columns.value,
19025
+ isExpanded,
19026
+ toggleExpand,
19027
+ isSelected,
19028
+ toggleSelect,
19029
+ toggleGroup,
19030
+ isGroupOpen
19031
+ }) : vue.createVNode(VDataTableGroupHeaderRow, {
19032
+ "key": `group-header_${item.id}`,
19033
+ "item": item
19034
+ }, slots);
19035
+ }
19036
+ const slotProps = {
18965
19037
  index,
18966
19038
  item,
18967
19039
  columns: columns.value,
18968
19040
  isExpanded,
18969
19041
  toggleExpand,
18970
19042
  isSelected,
18971
- toggleSelect,
18972
- toggleGroup,
18973
- isGroupOpen
18974
- }) : vue.createVNode(VDataTableGroupHeaderRow, {
18975
- "key": `group-header_${item.id}`,
19043
+ toggleSelect
19044
+ };
19045
+ return vue.createVNode(vue.Fragment, null, [slots.item ? slots.item(slotProps) : vue.createVNode(VDataTableRow, {
19046
+ "key": `item_${item.value}`,
19047
+ "onClick": expandOnClick.value || props['onClick:row'] ? event => {
19048
+ if (expandOnClick.value) {
19049
+ toggleExpand(item);
19050
+ }
19051
+ props['onClick:row']?.(event, {
19052
+ item
19053
+ });
19054
+ } : undefined,
19055
+ "index": index,
18976
19056
  "item": item
18977
- }, slots);
18978
- }
18979
- const slotProps = {
18980
- index,
18981
- item,
18982
- columns: columns.value,
18983
- isExpanded,
18984
- toggleExpand,
18985
- isSelected,
18986
- toggleSelect
18987
- };
18988
- return vue.createVNode(vue.Fragment, null, [slots.item ? slots.item(slotProps) : vue.createVNode(VDataTableRow, {
18989
- "key": `item_${item.value}`,
18990
- "onClick": expandOnClick.value || props['onClick:row'] ? event => {
18991
- if (expandOnClick.value) {
18992
- toggleExpand(item);
18993
- }
18994
- props['onClick:row']?.(event, {
18995
- item
18996
- });
18997
- } : undefined,
18998
- "index": index,
18999
- "item": item
19000
- }, slots), isExpanded(item) && slots['expanded-row']?.(slotProps)]);
19001
- })]));
19057
+ }, slots), isExpanded(item) && slots['expanded-row']?.(slotProps)]);
19058
+ })]);
19059
+ });
19002
19060
  return {};
19003
19061
  }
19004
19062
  });
@@ -19273,7 +19331,8 @@
19273
19331
  page: page.value,
19274
19332
  itemsPerPage: itemsPerPage.value,
19275
19333
  sortBy: sortBy.value,
19276
- groupBy: groupBy.value
19334
+ groupBy: groupBy.value,
19335
+ search: search.value
19277
19336
  }));
19278
19337
 
19279
19338
  // Reset page when searching
@@ -19306,12 +19365,12 @@
19306
19365
  width: [String, Number],
19307
19366
  fixedHeader: Boolean,
19308
19367
  fixedFooter: Boolean,
19309
- 'onClick:row': Function
19368
+ 'onClick:row': Function,
19369
+ search: String
19310
19370
  }, 'v-data-table');
19311
19371
  const VDataTable = genericComponent()({
19312
19372
  name: 'VDataTable',
19313
19373
  props: {
19314
- search: String,
19315
19374
  ...makeVDataTableProps(),
19316
19375
  ...makeDataTableExpandProps(),
19317
19376
  ...makeDataTableGroupProps(),
@@ -19526,7 +19585,6 @@
19526
19585
  const VDataTableVirtual = genericComponent()({
19527
19586
  name: 'VDataTableVirtual',
19528
19587
  props: {
19529
- search: String,
19530
19588
  ...makeVDataTableProps(),
19531
19589
  ...makeVDataTableProps(),
19532
19590
  ...makeDataTableGroupProps(),
@@ -19765,7 +19823,8 @@
19765
19823
  page,
19766
19824
  itemsPerPage,
19767
19825
  sortBy,
19768
- groupBy
19826
+ groupBy,
19827
+ search: vue.toRef(props, 'search')
19769
19828
  });
19770
19829
  vue.provide('v-data-table', {
19771
19830
  toggleSort,
@@ -19825,6 +19884,7 @@
19825
19884
  'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions',
19826
19885
  'date-picker-options': 'text, avatar@2',
19827
19886
  'date-picker-days': 'avatar@28',
19887
+ divider: 'divider',
19828
19888
  heading: 'heading',
19829
19889
  image: 'image',
19830
19890
  'list-item': 'text',
@@ -20466,7 +20526,7 @@
20466
20526
  locale
20467
20527
  };
20468
20528
  }
20469
- const version$1 = "3.1.14";
20529
+ const version$1 = "3.1.15";
20470
20530
  createVuetify$1.version = version$1;
20471
20531
 
20472
20532
  // Vue's inject() can only be used in setup
@@ -20478,7 +20538,7 @@
20478
20538
  }
20479
20539
  }
20480
20540
 
20481
- const version = "3.1.14";
20541
+ const version = "3.1.15";
20482
20542
 
20483
20543
  const createVuetify = function () {
20484
20544
  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};