vuetify 3.1.14 → 3.1.16

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 (113) hide show
  1. package/dist/json/attributes.json +193 -141
  2. package/dist/json/importMap.json +8 -8
  3. package/dist/json/tags.json +13 -0
  4. package/dist/json/web-types.json +513 -282
  5. package/dist/vuetify-labs.css +465 -457
  6. package/dist/vuetify-labs.d.ts +521 -163
  7. package/dist/vuetify-labs.esm.js +272 -179
  8. package/dist/vuetify-labs.esm.js.map +1 -1
  9. package/dist/vuetify-labs.js +272 -179
  10. package/dist/vuetify-labs.min.css +2 -2
  11. package/dist/vuetify.css +17 -9
  12. package/dist/vuetify.d.ts +470 -145
  13. package/dist/vuetify.esm.js +178 -106
  14. package/dist/vuetify.esm.js.map +1 -1
  15. package/dist/vuetify.js +178 -106
  16. package/dist/vuetify.js.map +1 -1
  17. package/dist/vuetify.min.css +2 -2
  18. package/dist/vuetify.min.js +638 -624
  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/VBreadcrumbs/VBreadcrumbs.mjs +31 -16
  26. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs.map +1 -1
  27. package/lib/components/VBreadcrumbs/index.d.ts +3 -3
  28. package/lib/components/VCard/VCard.mjs.map +1 -1
  29. package/lib/components/VCard/index.d.ts +21 -16
  30. package/lib/components/VCheckbox/VCheckbox.mjs +2 -2
  31. package/lib/components/VCheckbox/VCheckbox.mjs.map +1 -1
  32. package/lib/components/VCheckbox/index.d.ts +22 -1
  33. package/lib/components/VCombobox/VCombobox.css +1 -1
  34. package/lib/components/VCombobox/VCombobox.mjs +6 -4
  35. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  36. package/lib/components/VCombobox/VCombobox.sass +1 -1
  37. package/lib/components/VCombobox/index.d.ts +29 -17
  38. package/lib/components/VDialog/VDialog.mjs +2 -2
  39. package/lib/components/VDialog/VDialog.mjs.map +1 -1
  40. package/lib/components/VField/VField.css +0 -1
  41. package/lib/components/VField/VField.sass +0 -1
  42. package/lib/components/VField/index.d.ts +6 -0
  43. package/lib/components/VFileInput/VFileInput.mjs +13 -17
  44. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  45. package/lib/components/VFileInput/index.d.ts +68 -23
  46. package/lib/components/VInput/VInput.mjs +14 -7
  47. package/lib/components/VInput/VInput.mjs.map +1 -1
  48. package/lib/components/VInput/index.d.ts +22 -1
  49. package/lib/components/VList/VList.mjs +3 -22
  50. package/lib/components/VList/VList.mjs.map +1 -1
  51. package/lib/components/VOverlay/locationStrategies.mjs +9 -4
  52. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  53. package/lib/components/VRadioGroup/VRadioGroup.mjs +2 -2
  54. package/lib/components/VRadioGroup/VRadioGroup.mjs.map +1 -1
  55. package/lib/components/VRadioGroup/index.d.ts +22 -1
  56. package/lib/components/VRangeSlider/VRangeSlider.mjs +2 -2
  57. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  58. package/lib/components/VRangeSlider/index.d.ts +22 -1
  59. package/lib/components/VSelect/VSelect.mjs +6 -0
  60. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  61. package/lib/components/VSelect/index.d.ts +32 -17
  62. package/lib/components/VSlideGroup/VSlideGroup.mjs +2 -2
  63. package/lib/components/VSlideGroup/VSlideGroup.mjs.map +1 -1
  64. package/lib/components/VSlider/VSlider.mjs +2 -2
  65. package/lib/components/VSlider/VSlider.mjs.map +1 -1
  66. package/lib/components/VSlider/index.d.ts +22 -1
  67. package/lib/components/VSwitch/VSwitch.mjs +5 -3
  68. package/lib/components/VSwitch/VSwitch.mjs.map +1 -1
  69. package/lib/components/VSwitch/index.d.ts +43 -1
  70. package/lib/components/VTextField/VTextField.mjs +4 -12
  71. package/lib/components/VTextField/VTextField.mjs.map +1 -1
  72. package/lib/components/VTextField/index.d.ts +70 -22
  73. package/lib/components/VTextarea/VTextarea.mjs +4 -12
  74. package/lib/components/VTextarea/VTextarea.mjs.map +1 -1
  75. package/lib/components/VTextarea/index.d.ts +61 -22
  76. package/lib/components/VTreeview/_mixins.sass +0 -0
  77. package/lib/components/VTreeview/util/filterTreeItems.mjs +0 -0
  78. package/lib/components/VValidation/index.d.ts +10 -1
  79. package/lib/components/index.d.ts +468 -143
  80. package/lib/composables/focus.mjs +3 -2
  81. package/lib/composables/focus.mjs.map +1 -1
  82. package/lib/composables/items.mjs +7 -2
  83. package/lib/composables/items.mjs.map +1 -1
  84. package/lib/entry-bundler.mjs +1 -1
  85. package/lib/framework.mjs +1 -1
  86. package/lib/iconsets/mdi-svg.mjs +2 -2
  87. package/lib/iconsets/mdi-svg.mjs.map +1 -1
  88. package/lib/index.d.ts +2 -2
  89. package/lib/labs/VDataTable/VDataTable.mjs +3 -3
  90. package/lib/labs/VDataTable/VDataTable.mjs.map +1 -1
  91. package/lib/labs/VDataTable/VDataTableFooter.mjs.map +1 -1
  92. package/lib/labs/VDataTable/VDataTableHeaders.mjs +34 -20
  93. package/lib/labs/VDataTable/VDataTableHeaders.mjs.map +1 -1
  94. package/lib/labs/VDataTable/VDataTableRow.mjs +2 -4
  95. package/lib/labs/VDataTable/VDataTableRow.mjs.map +1 -1
  96. package/lib/labs/VDataTable/VDataTableRows.mjs +52 -44
  97. package/lib/labs/VDataTable/VDataTableRows.mjs.map +1 -1
  98. package/lib/labs/VDataTable/VDataTableServer.mjs +3 -2
  99. package/lib/labs/VDataTable/VDataTableServer.mjs.map +1 -1
  100. package/lib/labs/VDataTable/VDataTableVirtual.mjs +0 -1
  101. package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
  102. package/lib/labs/VDataTable/composables/options.mjs +2 -1
  103. package/lib/labs/VDataTable/composables/options.mjs.map +1 -1
  104. package/lib/labs/VDataTable/index.d.ts +44 -11
  105. package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs +1 -0
  106. package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs.map +1 -1
  107. package/lib/labs/VSkeletonLoader/index.d.ts +9 -9
  108. package/lib/labs/components.d.ts +53 -20
  109. package/lib/locale/el.mjs +0 -0
  110. package/lib/locale/index.mjs +0 -0
  111. package/lib/util/helpers.mjs +26 -0
  112. package/lib/util/helpers.mjs.map +1 -1
  113. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.1.14
2
+ * Vuetify v3.1.16
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -360,6 +360,32 @@
360
360
  handler(...args);
361
361
  }
362
362
  }
363
+ function focusableChildren(el) {
364
+ const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}:not([tabindex="-1"]):not([disabled])`).join(', ');
365
+ return [...el.querySelectorAll(targets)];
366
+ }
367
+ function focusChild(el, location) {
368
+ const focusable = focusableChildren(el);
369
+ const idx = focusable.indexOf(document.activeElement);
370
+ if (!location) {
371
+ if (!el.contains(document.activeElement)) {
372
+ focusable[0]?.focus();
373
+ }
374
+ } else if (location === 'first') {
375
+ focusable[0]?.focus();
376
+ } else if (location === 'last') {
377
+ focusable.at(-1)?.focus();
378
+ } else {
379
+ let _el;
380
+ let idxx = idx;
381
+ const inc = location === 'next' ? 1 : -1;
382
+ do {
383
+ idxx += inc;
384
+ _el = focusable[idxx];
385
+ } while ((!_el || _el.offsetParent == null) && idxx < focusable.length && idxx >= 0);
386
+ if (_el) _el.focus();else focusChild(el, location === 'next' ? 'first' : 'last');
387
+ }
388
+ }
363
389
 
364
390
  const block = ['top', 'bottom'];
365
391
  const inline = ['start', 'end', 'left', 'right'];
@@ -5297,7 +5323,8 @@
5297
5323
 
5298
5324
  // Composables
5299
5325
  const makeFocusProps = propsFactory({
5300
- focused: Boolean
5326
+ focused: Boolean,
5327
+ 'onUpdate:focused': EventProp()
5301
5328
  }, 'focus');
5302
5329
  function useFocus(props) {
5303
5330
  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
@@ -5886,6 +5913,8 @@
5886
5913
  appendIcon: IconValue,
5887
5914
  prependIcon: IconValue,
5888
5915
  hideDetails: [Boolean, String],
5916
+ hint: String,
5917
+ persistentHint: Boolean,
5889
5918
  messages: {
5890
5919
  type: [Array, String],
5891
5920
  default: () => []
@@ -5949,10 +5978,19 @@
5949
5978
  resetValidation,
5950
5979
  validate
5951
5980
  }));
5981
+ const messages = vue.computed(() => {
5982
+ if (errorMessages.value.length > 0) {
5983
+ return errorMessages.value;
5984
+ } else if (props.hint && (props.persistentHint || props.focused)) {
5985
+ return props.hint;
5986
+ } else {
5987
+ return props.messages;
5988
+ }
5989
+ });
5952
5990
  useRender(() => {
5953
5991
  const hasPrepend = !!(slots.prepend || props.prependIcon);
5954
5992
  const hasAppend = !!(slots.append || props.appendIcon);
5955
- const hasMessages = !!(props.messages?.length || errorMessages.value.length);
5993
+ const hasMessages = messages.value.length > 0;
5956
5994
  const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
5957
5995
  return vue.createVNode("div", {
5958
5996
  "class": ['v-input', `v-input--${props.direction}`, densityClasses.value, validationClasses.value]
@@ -5975,7 +6013,7 @@
5975
6013
  }, [vue.createVNode(VMessages, {
5976
6014
  "id": messagesId.value,
5977
6015
  "active": hasMessages,
5978
- "messages": errorMessages.value.length > 0 ? errorMessages.value : props.messages
6016
+ "messages": messages.value
5979
6017
  }, {
5980
6018
  message: slots.message
5981
6019
  }), slots.details?.(slotProps.value)])]);
@@ -5987,10 +6025,6 @@
5987
6025
  };
5988
6026
  }
5989
6027
  });
5990
- function filterInputProps(props) {
5991
- const keys = Object.keys(VInput.props).filter(k => !isOn(k));
5992
- return pick(props, keys);
5993
- }
5994
6028
 
5995
6029
  const VCounter = genericComponent()({
5996
6030
  name: 'VCounter',
@@ -6116,8 +6150,6 @@
6116
6150
  autofocus: Boolean,
6117
6151
  counter: [Boolean, Number, String],
6118
6152
  counterValue: Function,
6119
- hint: String,
6120
- persistentHint: Boolean,
6121
6153
  prefix: String,
6122
6154
  placeholder: String,
6123
6155
  persistentPlaceholder: Boolean,
@@ -6172,9 +6204,6 @@
6172
6204
  const vFieldRef = vue.ref();
6173
6205
  const inputRef = vue.ref();
6174
6206
  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
6207
  function onFocus() {
6179
6208
  if (inputRef.value !== document.activeElement) {
6180
6209
  inputRef.value?.focus();
@@ -6217,7 +6246,7 @@
6217
6246
  const [{
6218
6247
  modelValue: _,
6219
6248
  ...inputProps
6220
- }] = filterInputProps(props);
6249
+ }] = VInput.filterProps(props);
6221
6250
  const [fieldProps] = filterFieldProps(props);
6222
6251
  return vue.createVNode(VInput, vue.mergeProps({
6223
6252
  "ref": vInputRef,
@@ -6227,12 +6256,9 @@
6227
6256
  'v-text-field--prefixed': props.prefix,
6228
6257
  'v-text-field--suffixed': props.suffix,
6229
6258
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
6230
- }],
6231
- "onClick:prepend": props['onClick:prepend'],
6232
- "onClick:append": props['onClick:append']
6259
+ }]
6233
6260
  }, rootAttrs, inputProps, {
6234
- "focused": isFocused.value,
6235
- "messages": messages.value
6261
+ "focused": isFocused.value
6236
6262
  }), {
6237
6263
  ...slots,
6238
6264
  default: _ref2 => {
@@ -6641,7 +6667,7 @@
6641
6667
  const id = vue.computed(() => props.id || `checkbox-${uid}`);
6642
6668
  useRender(() => {
6643
6669
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
6644
- const [inputProps, _1] = filterInputProps(props);
6670
+ const [inputProps, _1] = VInput.filterProps(props);
6645
6671
  const [checkboxProps, _2] = VCheckboxBtn.filterProps(props);
6646
6672
  return vue.createVNode(VInput, vue.mergeProps({
6647
6673
  "class": "v-checkbox"
@@ -8053,7 +8079,12 @@
8053
8079
  function useItems(props) {
8054
8080
  const items = vue.computed(() => transformItems$1(props, props.items));
8055
8081
  function transformIn(value) {
8056
- return value.map(item => transformItem$1(props, item));
8082
+ return value.map(v => {
8083
+ const existingItem = items.value.find(item => deepEqual(v, item.value));
8084
+ // Nullish existingItem means value is a custom input value from combobox
8085
+ // In this case, use transformItem to create an InternalItem based on value
8086
+ return existingItem ?? transformItem$1(props, v);
8087
+ });
8057
8088
  }
8058
8089
  function transformOut(value) {
8059
8090
  return value.map(_ref => {
@@ -8226,27 +8257,8 @@
8226
8257
  e.preventDefault();
8227
8258
  }
8228
8259
  function focus(location) {
8229
- if (!contentRef.value) return;
8230
- const targets = ['button', '[href]', 'input', 'select', 'textarea', '[tabindex]'].map(s => `${s}:not([tabindex="-1"])`).join(', ');
8231
- const focusable = [...contentRef.value.querySelectorAll(targets)].filter(el => !el.hasAttribute('disabled'));
8232
- const idx = focusable.indexOf(document.activeElement);
8233
- if (!location) {
8234
- if (!contentRef.value.contains(document.activeElement)) {
8235
- focusable[0]?.focus();
8236
- }
8237
- } else if (location === 'first') {
8238
- focusable[0]?.focus();
8239
- } else if (location === 'last') {
8240
- focusable.at(-1)?.focus();
8241
- } else {
8242
- let el;
8243
- let idxx = idx;
8244
- const inc = location === 'next' ? 1 : -1;
8245
- do {
8246
- idxx += inc;
8247
- el = focusable[idxx];
8248
- } while ((!el || el.offsetParent == null) && idxx < focusable.length && idxx >= 0);
8249
- if (el) el.focus();else focus(location === 'next' ? 'first' : 'last');
8260
+ if (contentRef.value) {
8261
+ return focusChild(contentRef.value, location);
8250
8262
  }
8251
8263
  }
8252
8264
  useRender(() => {
@@ -8731,7 +8743,7 @@
8731
8743
  }
8732
8744
 
8733
8745
  /** Get size of element ignoring max-width/max-height */
8734
- function getIntrinsicSize(el) {
8746
+ function getIntrinsicSize(el, isRtl) {
8735
8747
  // const scrollables = new Map<Element, [number, number]>()
8736
8748
  // el.querySelectorAll('*').forEach(el => {
8737
8749
  // const x = el.scrollLeft
@@ -8748,7 +8760,11 @@
8748
8760
 
8749
8761
  /* eslint-disable-next-line sonarjs/prefer-immediate-return */
8750
8762
  const contentBox = nullifyTransforms(el);
8751
- contentBox.x -= parseFloat(el.style.left || 0);
8763
+ if (isRtl) {
8764
+ contentBox.x += parseFloat(el.style.right || 0);
8765
+ } else {
8766
+ contentBox.x -= parseFloat(el.style.left || 0);
8767
+ }
8752
8768
  contentBox.y -= parseFloat(el.style.top || 0);
8753
8769
 
8754
8770
  // el.style.maxWidth = initialMaxWidth
@@ -8829,7 +8845,7 @@
8829
8845
  });
8830
8846
  if (!data.activatorEl.value || !data.contentEl.value) return;
8831
8847
  const targetBox = data.activatorEl.value.getBoundingClientRect();
8832
- const contentBox = getIntrinsicSize(data.contentEl.value);
8848
+ const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value);
8833
8849
  const scrollParents = getScrollParents(data.contentEl.value);
8834
8850
  const viewportMargin = 12;
8835
8851
  if (!scrollParents.length) {
@@ -9005,7 +9021,8 @@
9005
9021
  transformOrigin: `${placement.origin.side} ${placement.origin.align}`,
9006
9022
  // transform: `translate(${pixelRound(x)}px, ${pixelRound(y)}px)`,
9007
9023
  top: convertToUnit(pixelRound(y)),
9008
- left: convertToUnit(pixelRound(x)),
9024
+ left: data.isRtl.value ? undefined : convertToUnit(pixelRound(x)),
9025
+ right: data.isRtl.value ? convertToUnit(pixelRound(-x)) : undefined,
9009
9026
  minWidth: convertToUnit(axis === 'y' ? Math.min(minWidth.value, targetBox.width) : minWidth.value),
9010
9027
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
9011
9028
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
@@ -9900,6 +9917,7 @@
9900
9917
  })
9901
9918
  },
9902
9919
  emits: {
9920
+ 'update:focused': focused => true,
9903
9921
  'update:modelValue': val => true,
9904
9922
  'update:menu': val => true
9905
9923
  },
@@ -10016,6 +10034,9 @@
10016
10034
  menu.value = false;
10017
10035
  }
10018
10036
  }
10037
+ function onFocusin(e) {
10038
+ isFocused.value = true;
10039
+ }
10019
10040
  function onFocusout(e) {
10020
10041
  if (e.relatedTarget == null) {
10021
10042
  vTextFieldRef.value?.focus();
@@ -10070,6 +10091,7 @@
10070
10091
  "selected": selected.value,
10071
10092
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
10072
10093
  "onMousedown": e => e.preventDefault(),
10094
+ "onFocusin": onFocusin,
10073
10095
  "onFocusout": onFocusout
10074
10096
  }, {
10075
10097
  default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
@@ -10148,6 +10170,7 @@
10148
10170
  });
10149
10171
  });
10150
10172
  return forwardRefs({
10173
+ isFocused,
10151
10174
  menu,
10152
10175
  select
10153
10176
  }, vTextFieldRef);
@@ -10286,6 +10309,7 @@
10286
10309
  })
10287
10310
  },
10288
10311
  emits: {
10312
+ 'update:focused': focused => true,
10289
10313
  'update:search': val => true,
10290
10314
  'update:modelValue': val => true,
10291
10315
  'update:menu': val => true
@@ -10309,11 +10333,17 @@
10309
10333
  _menu.value = v;
10310
10334
  }
10311
10335
  });
10336
+ const selectionIndex = vue.ref(-1);
10337
+ const color = vue.computed(() => vTextFieldRef.value?.color);
10312
10338
  const {
10313
10339
  items,
10314
10340
  transformIn,
10315
10341
  transformOut
10316
10342
  } = useItems(props);
10343
+ const {
10344
+ textColorClasses,
10345
+ textColorStyles
10346
+ } = useTextColor(color);
10317
10347
  const search = useProxiedModel(props, 'search', '');
10318
10348
  const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => {
10319
10349
  const transformed = transformOut(v);
@@ -10336,6 +10366,7 @@
10336
10366
  return filteredItems.value;
10337
10367
  });
10338
10368
  const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
10369
+ const selection = vue.computed(() => selections.value[selectionIndex.value]);
10339
10370
  const listRef = vue.ref();
10340
10371
  function onClear(e) {
10341
10372
  if (props.openOnClear) {
@@ -10349,7 +10380,9 @@
10349
10380
  }
10350
10381
  function onKeydown(e) {
10351
10382
  if (props.readonly || form?.isReadonly.value) return;
10352
- if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10383
+ const selectionStart = vTextFieldRef.value.selectionStart;
10384
+ const length = selected.value.length;
10385
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10353
10386
  e.preventDefault();
10354
10387
  }
10355
10388
  if (['Enter', 'ArrowDown'].includes(e.key)) {
@@ -10366,6 +10399,38 @@
10366
10399
  } else if (e.key === 'ArrowUp') {
10367
10400
  listRef.value?.focus('prev');
10368
10401
  }
10402
+ if (!props.multiple) return;
10403
+ if (['Backspace', 'Delete'].includes(e.key)) {
10404
+ if (selectionIndex.value < 0) {
10405
+ if (e.key === 'Backspace' && !search.value) {
10406
+ selectionIndex.value = length - 1;
10407
+ }
10408
+ return;
10409
+ }
10410
+ const originalSelectionIndex = selectionIndex.value;
10411
+ if (selection.value) select(selection.value);
10412
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
10413
+ }
10414
+ if (e.key === 'ArrowLeft') {
10415
+ if (selectionIndex.value < 0 && selectionStart > 0) return;
10416
+ const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
10417
+ if (selections.value[prev]) {
10418
+ selectionIndex.value = prev;
10419
+ } else {
10420
+ selectionIndex.value = -1;
10421
+ vTextFieldRef.value.setSelectionRange(search.value?.length, search.value?.length);
10422
+ }
10423
+ }
10424
+ if (e.key === 'ArrowRight') {
10425
+ if (selectionIndex.value < 0) return;
10426
+ const next = selectionIndex.value + 1;
10427
+ if (selections.value[next]) {
10428
+ selectionIndex.value = next;
10429
+ } else {
10430
+ selectionIndex.value = -1;
10431
+ vTextFieldRef.value.setSelectionRange(0, 0);
10432
+ }
10433
+ }
10369
10434
  }
10370
10435
  function onInput(e) {
10371
10436
  search.value = e.target.value;
@@ -10387,7 +10452,6 @@
10387
10452
  const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
10388
10453
  if (index === -1) {
10389
10454
  model.value = [...model.value, item];
10390
- search.value = '';
10391
10455
  } else {
10392
10456
  const value = [...model.value];
10393
10457
  value.splice(index, 1);
@@ -10432,12 +10496,15 @@
10432
10496
  "onUpdate:modelValue": v => {
10433
10497
  if (v == null) model.value = [];
10434
10498
  },
10499
+ "focused": isFocused.value,
10500
+ "onUpdate:focused": $event => isFocused.value = $event,
10435
10501
  "validationValue": model.externalValue,
10436
10502
  "dirty": isDirty,
10437
10503
  "onInput": onInput,
10438
10504
  "class": ['v-autocomplete', {
10439
10505
  'v-autocomplete--active-menu': menu.value,
10440
10506
  'v-autocomplete--chips': !!props.chips,
10507
+ 'v-autocomplete--selecting-index': selectionIndex.value > -1,
10441
10508
  [`v-autocomplete--${props.multiple ? 'multiple' : 'single'}`]: true,
10442
10509
  'v-autocomplete--selection-slot': !!slots.selection
10443
10510
  }],
@@ -10446,8 +10513,6 @@
10446
10513
  "placeholder": isDirty ? undefined : props.placeholder,
10447
10514
  "onClick:clear": onClear,
10448
10515
  "onMousedown:control": onMousedownControl,
10449
- "onFocus": () => isFocused.value = true,
10450
- "onBlur": () => isFocused.value = false,
10451
10516
  "onKeydown": onKeydown
10452
10517
  }), {
10453
10518
  ...slots,
@@ -10512,7 +10577,8 @@
10512
10577
  };
10513
10578
  return vue.createVNode("div", {
10514
10579
  "key": item.value,
10515
- "class": "v-autocomplete__selection"
10580
+ "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
10581
+ "style": index === selectionIndex.value ? textColorStyles.value : {}
10516
10582
  }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
10517
10583
  "key": "chip",
10518
10584
  "closable": props.closableChips,
@@ -11003,6 +11069,17 @@
11003
11069
  disabled: vue.toRef(props, 'disabled')
11004
11070
  }
11005
11071
  });
11072
+ const items = vue.computed(() => props.items.map(item => {
11073
+ return typeof item === 'string' ? {
11074
+ item: {
11075
+ title: item
11076
+ },
11077
+ raw: item
11078
+ } : {
11079
+ item,
11080
+ raw: item
11081
+ };
11082
+ }));
11006
11083
  useRender(() => {
11007
11084
  const hasPrepend = !!(slots.prepend || props.icon);
11008
11085
  return vue.createVNode(props.tag, {
@@ -11025,22 +11102,26 @@
11025
11102
  start: true
11026
11103
  }
11027
11104
  }
11028
- }, slots.prepend)]), props.items.map((item, index, array) => vue.createVNode(vue.Fragment, null, [vue.createVNode(VBreadcrumbsItem, vue.mergeProps({
11029
- "key": index,
11030
- "disabled": index >= array.length - 1
11031
- }, typeof item === 'string' ? {
11032
- title: item
11033
- } : item), {
11034
- default: slots.title ? () => slots.title?.({
11035
- item,
11036
- index
11037
- }) : undefined
11038
- }), index < array.length - 1 && vue.createVNode(VBreadcrumbsDivider, null, {
11039
- default: slots.divider ? () => slots.divider?.({
11105
+ }, slots.prepend)]), items.value.map((_ref2, index, array) => {
11106
+ let {
11040
11107
  item,
11041
- index
11042
- }) : undefined
11043
- })])), slots.default?.()]
11108
+ raw
11109
+ } = _ref2;
11110
+ return vue.createVNode(vue.Fragment, null, [vue.createVNode(VBreadcrumbsItem, vue.mergeProps({
11111
+ "key": item.title,
11112
+ "disabled": index >= array.length - 1
11113
+ }, item), {
11114
+ default: slots.title ? () => slots.title?.({
11115
+ item: raw,
11116
+ index
11117
+ }) : undefined
11118
+ }), index < array.length - 1 && vue.createVNode(VBreadcrumbsDivider, null, {
11119
+ default: slots.divider ? () => slots.divider?.({
11120
+ item: raw,
11121
+ index
11122
+ }) : undefined
11123
+ })]);
11124
+ }), slots.default?.()]
11044
11125
  });
11045
11126
  });
11046
11127
  return {};
@@ -12907,7 +12988,7 @@
12907
12988
  } = useFocus(props);
12908
12989
  const trackStop = vue.computed(() => position(model.value));
12909
12990
  useRender(() => {
12910
- const [inputProps, _] = filterInputProps(props);
12991
+ const [inputProps, _] = VInput.filterProps(props);
12911
12992
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
12912
12993
  return vue.createVNode(VInput, vue.mergeProps({
12913
12994
  "class": ['v-slider', {
@@ -13571,6 +13652,7 @@
13571
13652
  })
13572
13653
  },
13573
13654
  emits: {
13655
+ 'update:focused': focused => true,
13574
13656
  'update:modelValue': val => true,
13575
13657
  'update:search': val => true,
13576
13658
  'update:menu': val => true
@@ -13708,8 +13790,9 @@
13708
13790
  }
13709
13791
  return;
13710
13792
  }
13711
- select(selection.value);
13712
- vue.nextTick(() => !selection.value && (selectionIndex.value = length - 2));
13793
+ const originalSelectionIndex = selectionIndex.value;
13794
+ if (selection.value) select(selection.value);
13795
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
13713
13796
  }
13714
13797
  if (e.key === 'ArrowLeft') {
13715
13798
  if (selectionIndex.value < 0 && selectionStart > 0) return;
@@ -13794,6 +13877,8 @@
13794
13877
  "onUpdate:modelValue": [$event => search.value = $event, v => {
13795
13878
  if (v == null) model.value = [];
13796
13879
  }],
13880
+ "focused": isFocused.value,
13881
+ "onUpdate:focused": $event => isFocused.value = $event,
13797
13882
  "validationValue": model.externalValue,
13798
13883
  "dirty": isDirty,
13799
13884
  "class": ['v-combobox', {
@@ -13807,8 +13892,6 @@
13807
13892
  "placeholder": isDirty ? undefined : props.placeholder,
13808
13893
  "onClick:clear": onClear,
13809
13894
  "onMousedown:control": onMousedownControl,
13810
- "onFocus": () => isFocused.value = true,
13811
- "onBlur": () => isFocused.value = false,
13812
13895
  "onKeydown": onKeydown
13813
13896
  }), {
13814
13897
  ...slots,
@@ -13960,7 +14043,7 @@
13960
14043
  ![document, overlay.value.contentEl].includes(after) &&
13961
14044
  // It isn't inside the dialog body
13962
14045
  !overlay.value.contentEl.contains(after)) {
13963
- const focusable = [...overlay.value.contentEl.querySelectorAll('button, [href], input:not([type="hidden"]), select, textarea, [tabindex]:not([tabindex="-1"])')].filter(el => !el.hasAttribute('disabled') && !el.matches('[tabindex="-1"]'));
14046
+ const focusable = focusableChildren(overlay.value.contentEl);
13964
14047
  if (!focusable.length) return;
13965
14048
  const firstElement = focusable[0];
13966
14049
  const lastElement = focusable[focusable.length - 1];
@@ -14260,8 +14343,6 @@
14260
14343
  default: '$vuetify.fileInput.counter'
14261
14344
  },
14262
14345
  multiple: Boolean,
14263
- hint: String,
14264
- persistentHint: Boolean,
14265
14346
  showSize: {
14266
14347
  type: [Boolean, Number],
14267
14348
  default: false,
@@ -14286,6 +14367,7 @@
14286
14367
  emits: {
14287
14368
  'click:control': e => true,
14288
14369
  'mousedown:control': e => true,
14370
+ 'update:focused': focused => true,
14289
14371
  'update:modelValue': files => true
14290
14372
  },
14291
14373
  setup(props, _ref) {
@@ -14298,6 +14380,11 @@
14298
14380
  t
14299
14381
  } = useLocale();
14300
14382
  const model = useProxiedModel(props, 'modelValue');
14383
+ const {
14384
+ isFocused,
14385
+ focus,
14386
+ blur
14387
+ } = useFocus(props);
14301
14388
  const base = vue.computed(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined);
14302
14389
  const totalBytes = vue.computed(() => (model.value ?? []).reduce((bytes, _ref2) => {
14303
14390
  let {
@@ -14319,21 +14406,14 @@
14319
14406
  });
14320
14407
  const vInputRef = vue.ref();
14321
14408
  const vFieldRef = vue.ref();
14322
- const isFocused = vue.ref(false);
14323
14409
  const inputRef = vue.ref();
14324
- const messages = vue.computed(() => {
14325
- return props.messages.length ? props.messages : props.persistentHint ? props.hint : '';
14326
- });
14327
14410
  function onFocus() {
14328
14411
  if (inputRef.value !== document.activeElement) {
14329
14412
  inputRef.value?.focus();
14330
14413
  }
14331
- if (!isFocused.value) {
14332
- isFocused.value = true;
14333
- }
14414
+ if (!isFocused.value) focus();
14334
14415
  }
14335
14416
  function onClickPrepend(e) {
14336
- callEvent(props['onClick:prepend'], e);
14337
14417
  onControlClick(e);
14338
14418
  }
14339
14419
  function onControlMousedown(e) {
@@ -14364,18 +14444,16 @@
14364
14444
  const [{
14365
14445
  modelValue: _,
14366
14446
  ...inputProps
14367
- }] = filterInputProps(props);
14447
+ }] = VInput.filterProps(props);
14368
14448
  const [fieldProps] = filterFieldProps(props);
14369
14449
  return vue.createVNode(VInput, vue.mergeProps({
14370
14450
  "ref": vInputRef,
14371
14451
  "modelValue": model.value,
14372
14452
  "onUpdate:modelValue": $event => model.value = $event,
14373
14453
  "class": "v-file-input",
14374
- "onClick:prepend": onClickPrepend,
14375
- "onClick:append": props['onClick:append']
14454
+ "onClick:prepend": onClickPrepend
14376
14455
  }, rootAttrs, inputProps, {
14377
- "focused": isFocused.value,
14378
- "messages": messages.value
14456
+ "focused": isFocused.value
14379
14457
  }), {
14380
14458
  ...slots,
14381
14459
  default: _ref3 => {
@@ -14427,7 +14505,7 @@
14427
14505
  model.value = [...(target.files ?? [])];
14428
14506
  },
14429
14507
  "onFocus": onFocus,
14430
- "onBlur": () => isFocused.value = false
14508
+ "onBlur": blur
14431
14509
  }, slotProps, inputAttrs), null), vue.createVNode("div", {
14432
14510
  "class": fieldClass
14433
14511
  }, [!!model.value?.length && (slots.selection ? slots.selection({
@@ -16122,7 +16200,7 @@
16122
16200
  const model = useProxiedModel(props, 'modelValue');
16123
16201
  useRender(() => {
16124
16202
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
16125
- const [inputProps, _1] = filterInputProps(props);
16203
+ const [inputProps, _1] = VInput.filterProps(props);
16126
16204
  const [controlProps, _2] = VSelectionControl.filterProps(props);
16127
16205
  const label = slots.label ? slots.label({
16128
16206
  label: props.label,
@@ -16250,7 +16328,7 @@
16250
16328
  const trackStart = vue.computed(() => position(model.value[0]));
16251
16329
  const trackStop = vue.computed(() => position(model.value[1]));
16252
16330
  useRender(() => {
16253
- const [inputProps, _] = filterInputProps(props);
16331
+ const [inputProps, _] = VInput.filterProps(props);
16254
16332
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
16255
16333
  return vue.createVNode(VInput, vue.mergeProps({
16256
16334
  "class": ['v-slider', 'v-range-slider', {
@@ -16810,7 +16888,7 @@
16810
16888
  function focus(location) {
16811
16889
  if (!contentRef.value) return;
16812
16890
  if (!location) {
16813
- const focusable = [...contentRef.value.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')].filter(el => !el.hasAttribute('disabled'));
16891
+ const focusable = focusableChildren(contentRef.value);
16814
16892
  focusable[0]?.focus();
16815
16893
  } else if (location === 'next') {
16816
16894
  const el = contentRef.value.querySelector(':focus')?.nextElementSibling;
@@ -17124,10 +17202,12 @@
17124
17202
  }
17125
17203
  useRender(() => {
17126
17204
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
17127
- const [inputProps, _1] = filterInputProps(props);
17205
+ const [inputProps, _1] = VInput.filterProps(props);
17128
17206
  const [controlProps, _2] = VSelectionControl.filterProps(props);
17129
17207
  const control = vue.ref();
17130
- function onClick() {
17208
+ function onClick(e) {
17209
+ e.stopPropagation();
17210
+ e.preventDefault();
17131
17211
  control.value?.input?.click();
17132
17212
  }
17133
17213
  return vue.createVNode(VInput, vue.mergeProps({
@@ -17489,8 +17569,6 @@
17489
17569
  autofocus: Boolean,
17490
17570
  counter: [Boolean, Number, String],
17491
17571
  counterValue: Function,
17492
- hint: String,
17493
- persistentHint: Boolean,
17494
17572
  prefix: String,
17495
17573
  placeholder: String,
17496
17574
  persistentPlaceholder: Boolean,
@@ -17545,9 +17623,6 @@
17545
17623
  const controlHeight = vue.ref('');
17546
17624
  const textareaRef = vue.ref();
17547
17625
  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
17626
  function onFocus() {
17552
17627
  if (textareaRef.value !== document.activeElement) {
17553
17628
  textareaRef.value?.focus();
@@ -17619,7 +17694,7 @@
17619
17694
  const [{
17620
17695
  modelValue: _,
17621
17696
  ...inputProps
17622
- }] = filterInputProps(props);
17697
+ }] = VInput.filterProps(props);
17623
17698
  const [fieldProps] = filterFieldProps(props);
17624
17699
  return vue.createVNode(VInput, vue.mergeProps({
17625
17700
  "ref": vInputRef,
@@ -17633,12 +17708,9 @@
17633
17708
  'v-textarea--auto-grow': props.autoGrow,
17634
17709
  'v-textarea--no-resize': props.noResize || props.autoGrow,
17635
17710
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
17636
- }],
17637
- "onClick:prepend": props['onClick:prepend'],
17638
- "onClick:append": props['onClick:append']
17711
+ }]
17639
17712
  }, rootAttrs, inputProps, {
17640
- "focused": isFocused.value,
17641
- "messages": messages.value
17713
+ "focused": isFocused.value
17642
17714
  }), {
17643
17715
  ...slots,
17644
17716
  default: _ref2 => {
@@ -18492,6 +18564,17 @@
18492
18564
  backgroundColorClasses,
18493
18565
  backgroundColorStyles
18494
18566
  } = useBackgroundColor(props, 'color');
18567
+ const slotProps = vue.computed(() => ({
18568
+ headers: headers.value,
18569
+ columns: columns.value,
18570
+ toggleSort,
18571
+ sortBy: sortBy.value,
18572
+ someSelected: someSelected.value,
18573
+ allSelected: allSelected.value,
18574
+ selectAll,
18575
+ getSortIcon,
18576
+ getFixedStyles
18577
+ }));
18495
18578
  const VDataTableHeaderCell = _ref2 => {
18496
18579
  let {
18497
18580
  column,
@@ -18519,14 +18602,14 @@
18519
18602
  "noPadding": noPadding
18520
18603
  }, {
18521
18604
  default: () => {
18522
- const slotName = `column.${column.key}`;
18523
- const slotProps = {
18605
+ const columnSlotName = `column.${column.key}`;
18606
+ const columnSlotProps = {
18524
18607
  column,
18525
18608
  selectAll
18526
18609
  };
18527
- if (slots[slotName]) return slots[slotName](slotProps);
18610
+ if (slots[columnSlotName]) return slots[columnSlotName](columnSlotProps);
18528
18611
  if (column.key === 'data-table-select') {
18529
- return slots['column.data-table-select']?.(slotProps) ?? vue.createVNode(VCheckboxBtn, {
18612
+ return slots['column.data-table-select']?.(columnSlotProps) ?? vue.createVNode(VCheckboxBtn, {
18530
18613
  "modelValue": allSelected.value,
18531
18614
  "indeterminate": someSelected.value && !allSelected.value,
18532
18615
  "onUpdate:modelValue": selectAll
@@ -18546,22 +18629,24 @@
18546
18629
  }
18547
18630
  });
18548
18631
  };
18549
- useRender(() => vue.createVNode(vue.Fragment, null, [headers.value.map((row, y) => vue.createVNode("tr", null, [row.map((column, x) => vue.createVNode(VDataTableHeaderCell, {
18550
- "column": column,
18551
- "x": x,
18552
- "y": y
18553
- }, null))])), props.loading && vue.createVNode("tr", {
18554
- "class": "v-data-table__progress"
18555
- }, [vue.createVNode("th", {
18556
- "colspan": columns.value.length
18557
- }, [vue.createVNode(LoaderSlot, {
18558
- "name": "v-data-table-headers",
18559
- "active": true,
18560
- "color": typeof props.loading === 'boolean' ? undefined : props.loading,
18561
- "indeterminate": true
18562
- }, {
18563
- default: slots.loader
18564
- })])])]));
18632
+ useRender(() => {
18633
+ return vue.createVNode(vue.Fragment, null, [slots.headers ? slots.headers(slotProps.value) : headers.value.map((row, y) => vue.createVNode("tr", null, [row.map((column, x) => vue.createVNode(VDataTableHeaderCell, {
18634
+ "column": column,
18635
+ "x": x,
18636
+ "y": y
18637
+ }, null))])), props.loading && vue.createVNode("tr", {
18638
+ "class": "v-data-table__progress"
18639
+ }, [vue.createVNode("th", {
18640
+ "colspan": columns.value.length
18641
+ }, [vue.createVNode(LoaderSlot, {
18642
+ "name": "v-data-table-headers",
18643
+ "active": true,
18644
+ "color": typeof props.loading === 'boolean' ? undefined : props.loading,
18645
+ "indeterminate": true
18646
+ }, {
18647
+ default: slots.loader
18648
+ })])])]);
18649
+ });
18565
18650
  }
18566
18651
  });
18567
18652
 
@@ -18860,9 +18945,7 @@
18860
18945
  'v-data-table__tr--clickable': !!props.onClick
18861
18946
  }],
18862
18947
  "onClick": props.onClick
18863
- }, [!columns.value.length && vue.createVNode(VDataTableColumn, {
18864
- "key": "no-data"
18865
- }, slots), props.item && columns.value.map((column, i) => vue.createVNode(VDataTableColumn, {
18948
+ }, [props.item && columns.value.map((column, i) => vue.createVNode(VDataTableColumn, {
18866
18949
  "align": column.align,
18867
18950
  "fixed": column.fixed,
18868
18951
  "fixedOffset": column.fixedOffset,
@@ -18949,56 +19032,64 @@
18949
19032
  const {
18950
19033
  t
18951
19034
  } = 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']({
19035
+ useRender(() => {
19036
+ if (props.loading && slots.loading) {
19037
+ return vue.createVNode("tr", {
19038
+ "class": "v-data-table-rows-loading",
19039
+ "key": "loading"
19040
+ }, [vue.createVNode("td", {
19041
+ "colspan": columns.value.length
19042
+ }, [slots.loading()])]);
19043
+ }
19044
+ if (!props.loading && !props.items.length && !props.hideNoData) {
19045
+ return vue.createVNode("tr", {
19046
+ "class": "v-data-table-rows-no-data",
19047
+ "key": "no-data"
19048
+ }, [vue.createVNode("td", {
19049
+ "colspan": columns.value.length
19050
+ }, [slots['no-data']?.() ?? t(props.noDataText)])]);
19051
+ }
19052
+ return vue.createVNode(vue.Fragment, null, [props.items.map((item, index) => {
19053
+ if (item.type === 'group-header') {
19054
+ return slots['group-header'] ? slots['group-header']({
19055
+ index,
19056
+ item,
19057
+ columns: columns.value,
19058
+ isExpanded,
19059
+ toggleExpand,
19060
+ isSelected,
19061
+ toggleSelect,
19062
+ toggleGroup,
19063
+ isGroupOpen
19064
+ }) : vue.createVNode(VDataTableGroupHeaderRow, {
19065
+ "key": `group-header_${item.id}`,
19066
+ "item": item
19067
+ }, slots);
19068
+ }
19069
+ const slotProps = {
18965
19070
  index,
18966
19071
  item,
18967
19072
  columns: columns.value,
18968
19073
  isExpanded,
18969
19074
  toggleExpand,
18970
19075
  isSelected,
18971
- toggleSelect,
18972
- toggleGroup,
18973
- isGroupOpen
18974
- }) : vue.createVNode(VDataTableGroupHeaderRow, {
18975
- "key": `group-header_${item.id}`,
19076
+ toggleSelect
19077
+ };
19078
+ return vue.createVNode(vue.Fragment, null, [slots.item ? slots.item(slotProps) : vue.createVNode(VDataTableRow, {
19079
+ "key": `item_${item.value}`,
19080
+ "onClick": expandOnClick.value || props['onClick:row'] ? event => {
19081
+ if (expandOnClick.value) {
19082
+ toggleExpand(item);
19083
+ }
19084
+ props['onClick:row']?.(event, {
19085
+ item
19086
+ });
19087
+ } : undefined,
19088
+ "index": index,
18976
19089
  "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
- })]));
19090
+ }, slots), isExpanded(item) && slots['expanded-row']?.(slotProps)]);
19091
+ })]);
19092
+ });
19002
19093
  return {};
19003
19094
  }
19004
19095
  });
@@ -19273,7 +19364,8 @@
19273
19364
  page: page.value,
19274
19365
  itemsPerPage: itemsPerPage.value,
19275
19366
  sortBy: sortBy.value,
19276
- groupBy: groupBy.value
19367
+ groupBy: groupBy.value,
19368
+ search: search.value
19277
19369
  }));
19278
19370
 
19279
19371
  // Reset page when searching
@@ -19306,12 +19398,12 @@
19306
19398
  width: [String, Number],
19307
19399
  fixedHeader: Boolean,
19308
19400
  fixedFooter: Boolean,
19309
- 'onClick:row': Function
19401
+ 'onClick:row': Function,
19402
+ search: String
19310
19403
  }, 'v-data-table');
19311
19404
  const VDataTable = genericComponent()({
19312
19405
  name: 'VDataTable',
19313
19406
  props: {
19314
- search: String,
19315
19407
  ...makeVDataTableProps(),
19316
19408
  ...makeDataTableExpandProps(),
19317
19409
  ...makeDataTableGroupProps(),
@@ -19428,7 +19520,7 @@
19428
19520
  top: slots.top,
19429
19521
  default: slots.default ?? (() => vue.createVNode(vue.Fragment, null, [slots.colgroup?.({
19430
19522
  columns
19431
- }), vue.createVNode("thead", null, [slots.headers ? slots.headers() : vue.createVNode(VDataTableHeaders, {
19523
+ }), vue.createVNode("thead", null, [vue.createVNode(VDataTableHeaders, {
19432
19524
  "sticky": props.fixedHeader,
19433
19525
  "multiSort": props.multiSort
19434
19526
  }, slots)]), slots.thead?.(), vue.createVNode("tbody", null, [slots.body ? slots.body() : vue.createVNode(VDataTableRows, {
@@ -19526,7 +19618,6 @@
19526
19618
  const VDataTableVirtual = genericComponent()({
19527
19619
  name: 'VDataTableVirtual',
19528
19620
  props: {
19529
- search: String,
19530
19621
  ...makeVDataTableProps(),
19531
19622
  ...makeVDataTableProps(),
19532
19623
  ...makeDataTableGroupProps(),
@@ -19765,7 +19856,8 @@
19765
19856
  page,
19766
19857
  itemsPerPage,
19767
19858
  sortBy,
19768
- groupBy
19859
+ groupBy,
19860
+ search: vue.toRef(props, 'search')
19769
19861
  });
19770
19862
  vue.provide('v-data-table', {
19771
19863
  toggleSort,
@@ -19794,7 +19886,7 @@
19794
19886
  }), vue.createVNode("thead", {
19795
19887
  "class": "v-data-table__thead",
19796
19888
  "role": "rowgroup"
19797
- }, [slots.headers ? slots.headers() : vue.createVNode(VDataTableHeaders, {
19889
+ }, [vue.createVNode(VDataTableHeaders, {
19798
19890
  "sticky": props.fixedHeader,
19799
19891
  "loading": props.loading,
19800
19892
  "color": props.color
@@ -19825,6 +19917,7 @@
19825
19917
  'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions',
19826
19918
  'date-picker-options': 'text, avatar@2',
19827
19919
  'date-picker-days': 'avatar@28',
19920
+ divider: 'divider',
19828
19921
  heading: 'heading',
19829
19922
  image: 'image',
19830
19923
  'list-item': 'text',
@@ -20466,7 +20559,7 @@
20466
20559
  locale
20467
20560
  };
20468
20561
  }
20469
- const version$1 = "3.1.14";
20562
+ const version$1 = "3.1.16";
20470
20563
  createVuetify$1.version = version$1;
20471
20564
 
20472
20565
  // Vue's inject() can only be used in setup
@@ -20478,7 +20571,7 @@
20478
20571
  }
20479
20572
  }
20480
20573
 
20481
- const version = "3.1.14";
20574
+ const version = "3.1.16";
20482
20575
 
20483
20576
  const createVuetify = function () {
20484
20577
  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};