vuetify 3.3.2 → 3.3.3

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 (86) hide show
  1. package/dist/json/attributes.json +8 -8
  2. package/dist/json/importMap.json +4 -4
  3. package/dist/json/web-types.json +26 -15
  4. package/dist/vuetify-labs.css +53 -61
  5. package/dist/vuetify-labs.d.ts +253 -119
  6. package/dist/vuetify-labs.esm.js +196 -82
  7. package/dist/vuetify-labs.esm.js.map +1 -1
  8. package/dist/vuetify-labs.js +195 -81
  9. package/dist/vuetify-labs.min.css +2 -2
  10. package/dist/vuetify.css +10 -8
  11. package/dist/vuetify.d.ts +254 -120
  12. package/dist/vuetify.esm.js +191 -78
  13. package/dist/vuetify.esm.js.map +1 -1
  14. package/dist/vuetify.js +190 -77
  15. package/dist/vuetify.js.map +1 -1
  16. package/dist/vuetify.min.css +2 -2
  17. package/dist/vuetify.min.js +780 -771
  18. package/dist/vuetify.min.js.map +1 -1
  19. package/lib/blueprints/index.d.mts +2 -2
  20. package/lib/blueprints/md1.d.mts +2 -2
  21. package/lib/blueprints/md2.d.mts +2 -2
  22. package/lib/blueprints/md3.d.mts +2 -2
  23. package/lib/components/VAppBar/index.d.mts +24 -8
  24. package/lib/components/VAutocomplete/VAutocomplete.mjs +16 -11
  25. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  26. package/lib/components/VBtn/VBtn.mjs +1 -1
  27. package/lib/components/VBtn/VBtn.mjs.map +1 -1
  28. package/lib/components/VBtn/index.d.mts +24 -8
  29. package/lib/components/VCard/VCard.mjs +1 -1
  30. package/lib/components/VCard/VCard.mjs.map +1 -1
  31. package/lib/components/VCard/index.d.mts +44 -28
  32. package/lib/components/VCheckbox/VCheckbox.mjs +8 -1
  33. package/lib/components/VCheckbox/VCheckbox.mjs.map +1 -1
  34. package/lib/components/VCheckbox/index.d.mts +7 -1
  35. package/lib/components/VChip/VChip.mjs +2 -2
  36. package/lib/components/VChip/VChip.mjs.map +1 -1
  37. package/lib/components/VChip/index.d.mts +48 -32
  38. package/lib/components/VCombobox/VCombobox.mjs +16 -8
  39. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  40. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs +1 -1
  41. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs.map +1 -1
  42. package/lib/components/VExpansionPanel/index.d.mts +56 -24
  43. package/lib/components/VField/VField.css +1 -0
  44. package/lib/components/VField/VField.sass +1 -0
  45. package/lib/components/VIcon/VIcon.mjs +2 -2
  46. package/lib/components/VIcon/VIcon.mjs.map +1 -1
  47. package/lib/components/VList/VListItem.mjs +1 -1
  48. package/lib/components/VList/VListItem.mjs.map +1 -1
  49. package/lib/components/VList/index.d.mts +24 -8
  50. package/lib/components/VMenu/VMenu.mjs +29 -3
  51. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  52. package/lib/components/VOverlay/VOverlay.mjs +7 -4
  53. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  54. package/lib/components/VOverlay/useActivator.mjs +29 -35
  55. package/lib/components/VOverlay/useActivator.mjs.map +1 -1
  56. package/lib/components/VSelect/VSelect.mjs +15 -10
  57. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  58. package/lib/components/VSlider/VSliderThumb.mjs +2 -2
  59. package/lib/components/VSlider/VSliderThumb.mjs.map +1 -1
  60. package/lib/components/VTabs/VTabs.css +1 -0
  61. package/lib/components/VTabs/VTabs.sass +1 -0
  62. package/lib/components/VTabs/index.d.mts +24 -8
  63. package/lib/components/VTextarea/VTextarea.css +7 -7
  64. package/lib/components/VTextarea/VTextarea.sass +9 -9
  65. package/lib/components/index.d.mts +251 -117
  66. package/lib/composables/icons.mjs.map +1 -1
  67. package/lib/composables/theme.mjs +1 -1
  68. package/lib/composables/theme.mjs.map +1 -1
  69. package/lib/entry-bundler.mjs +1 -1
  70. package/lib/framework.mjs +1 -1
  71. package/lib/iconsets/mdi-svg.mjs +35 -35
  72. package/lib/iconsets/mdi-svg.mjs.map +1 -1
  73. package/lib/index.d.mts +3 -3
  74. package/lib/labs/VDataTable/VDataTable.css +4 -14
  75. package/lib/labs/VDataTable/VDataTable.sass +6 -15
  76. package/lib/labs/VDataTable/VDataTableHeaders.mjs +2 -2
  77. package/lib/labs/VDataTable/VDataTableHeaders.mjs.map +1 -1
  78. package/lib/labs/VDataTable/composables/select.mjs +3 -2
  79. package/lib/labs/VDataTable/composables/select.mjs.map +1 -1
  80. package/lib/util/bindProps.mjs +49 -0
  81. package/lib/util/bindProps.mjs.map +1 -0
  82. package/lib/util/helpers.mjs +3 -0
  83. package/lib/util/helpers.mjs.map +1 -1
  84. package/lib/util/index.mjs +1 -0
  85. package/lib/util/index.mjs.map +1 -1
  86. package/package.json +2 -2
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.3.2
2
+ * Vuetify v3.3.3
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -298,6 +298,15 @@
298
298
  }
299
299
  return out;
300
300
  }
301
+ function flattenFragments(nodes) {
302
+ return nodes.map(node => {
303
+ if (node.type === vue.Fragment) {
304
+ return flattenFragments(node.children);
305
+ } else {
306
+ return node;
307
+ }
308
+ }).flat();
309
+ }
301
310
  function toKebabCase() {
302
311
  let str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
303
312
  if (toKebabCase.cache.has(str)) return toKebabCase.cache.get(str);
@@ -377,6 +386,9 @@
377
386
  }
378
387
  const onRE = /^on[^a-z]/;
379
388
  const isOn = key => onRE.test(key);
389
+ function eventName(propName) {
390
+ return propName[2].toLowerCase() + propName.slice(3);
391
+ }
380
392
  const EventProp = () => [Function, Array];
381
393
  function hasEvent(props, name) {
382
394
  name = 'on' + vue.capitalize(name);
@@ -575,6 +587,54 @@
575
587
  return animation;
576
588
  }
577
589
 
590
+ // Utilities
591
+ const handlers = new WeakMap();
592
+ function bindProps(el, props) {
593
+ Object.keys(props).forEach(k => {
594
+ if (isOn(k)) {
595
+ const name = eventName(k);
596
+ const handler = handlers.get(el);
597
+ if (props[k] == null) {
598
+ handler?.forEach(v => {
599
+ const [n, fn] = v;
600
+ if (n === name) {
601
+ el.removeEventListener(name, fn);
602
+ handler.delete(v);
603
+ }
604
+ });
605
+ } else if (!handler || ![...handler]?.some(v => v[0] === name && v[1] === props[k])) {
606
+ el.addEventListener(name, props[k]);
607
+ const _handler = handler || new Set();
608
+ _handler.add([name, props[k]]);
609
+ if (!handlers.has(el)) handlers.set(el, _handler);
610
+ }
611
+ } else {
612
+ if (props[k] == null) {
613
+ el.removeAttribute(k);
614
+ } else {
615
+ el.setAttribute(k, props[k]);
616
+ }
617
+ }
618
+ });
619
+ }
620
+ function unbindProps(el, props) {
621
+ Object.keys(props).forEach(k => {
622
+ if (isOn(k)) {
623
+ const name = eventName(k);
624
+ const handler = handlers.get(el);
625
+ handler?.forEach(v => {
626
+ const [n, fn] = v;
627
+ if (n === name) {
628
+ el.removeEventListener(name, fn);
629
+ handler.delete(v);
630
+ }
631
+ });
632
+ } else {
633
+ el.removeAttribute(k);
634
+ }
635
+ });
636
+ }
637
+
578
638
  /* eslint-disable no-console */
579
639
 
580
640
  function consoleWarn(message) {
@@ -2158,6 +2218,7 @@
2158
2218
  };
2159
2219
  }
2160
2220
  function install(app) {
2221
+ if (parsedOptions.isDisabled) return;
2161
2222
  const head = app._context.provides.usehead;
2162
2223
  if (head) {
2163
2224
  if (head.push) {
@@ -2179,7 +2240,6 @@
2179
2240
  immediate: true
2180
2241
  });
2181
2242
  function updateStyles() {
2182
- if (parsedOptions.isDisabled) return;
2183
2243
  if (typeof document !== 'undefined' && !styleEl) {
2184
2244
  const el = document.createElement('style');
2185
2245
  el.type = 'text/css';
@@ -4266,7 +4326,7 @@
4266
4326
  useRender(() => {
4267
4327
  const slotValue = slots.default?.();
4268
4328
  if (slotValue) {
4269
- slotIcon.value = slotValue.filter(node => node.type === vue.Text && node.children && typeof node.children === 'string')[0]?.children;
4329
+ slotIcon.value = flattenFragments(slotValue).filter(node => node.type === vue.Text && node.children && typeof node.children === 'string')[0]?.children;
4270
4330
  }
4271
4331
  return vue.createVNode(iconData.value.component, {
4272
4332
  "tag": props.tag,
@@ -5103,7 +5163,7 @@
5103
5163
  block: Boolean,
5104
5164
  stacked: Boolean,
5105
5165
  ripple: {
5106
- type: Boolean,
5166
+ type: [Boolean, Object],
5107
5167
  default: true
5108
5168
  },
5109
5169
  text: String,
@@ -6386,6 +6446,7 @@
6386
6446
  inheritAttrs: false,
6387
6447
  props: makeVCheckboxProps(),
6388
6448
  emits: {
6449
+ 'update:modelValue': value => true,
6389
6450
  'update:focused': focused => true
6390
6451
  },
6391
6452
  setup(props, _ref) {
@@ -6393,6 +6454,7 @@
6393
6454
  attrs,
6394
6455
  slots
6395
6456
  } = _ref;
6457
+ const model = useProxiedModel(props, 'modelValue');
6396
6458
  const {
6397
6459
  isFocused,
6398
6460
  focus,
@@ -6407,6 +6469,8 @@
6407
6469
  return vue.createVNode(VInput, vue.mergeProps({
6408
6470
  "class": ['v-checkbox', props.class]
6409
6471
  }, inputAttrs, inputProps, {
6472
+ "modelValue": model.value,
6473
+ "onUpdate:modelValue": $event => model.value = $event,
6410
6474
  "id": id.value,
6411
6475
  "focused": isFocused.value,
6412
6476
  "style": props.style
@@ -6425,6 +6489,8 @@
6425
6489
  "disabled": isDisabled.value,
6426
6490
  "readonly": isReadonly.value
6427
6491
  }, controlAttrs, {
6492
+ "modelValue": model.value,
6493
+ "onUpdate:modelValue": $event => model.value = $event,
6428
6494
  "onFocus": focus,
6429
6495
  "onBlur": blur
6430
6496
  }), slots);
@@ -6562,6 +6628,8 @@
6562
6628
  }
6563
6629
  });
6564
6630
 
6631
+ // Types
6632
+
6565
6633
  const makeVChipProps = propsFactory({
6566
6634
  activeClass: String,
6567
6635
  appendAvatar: String,
@@ -6590,7 +6658,7 @@
6590
6658
  prependAvatar: String,
6591
6659
  prependIcon: IconValue,
6592
6660
  ripple: {
6593
- type: Boolean,
6661
+ type: [Boolean, Object],
6594
6662
  default: true
6595
6663
  },
6596
6664
  text: String,
@@ -7406,7 +7474,7 @@
7406
7474
  prependAvatar: String,
7407
7475
  prependIcon: IconValue,
7408
7476
  ripple: {
7409
- type: Boolean,
7477
+ type: [Boolean, Object],
7410
7478
  default: true
7411
7479
  },
7412
7480
  subtitle: [String, Number, Boolean],
@@ -8779,29 +8847,29 @@
8779
8847
  }
8780
8848
  });
8781
8849
  const availableEvents = {
8782
- click: e => {
8850
+ onClick: e => {
8783
8851
  e.stopPropagation();
8784
8852
  activatorEl.value = e.currentTarget || e.target;
8785
8853
  isActive.value = !isActive.value;
8786
8854
  },
8787
- mouseenter: e => {
8855
+ onMouseenter: e => {
8788
8856
  if (e.sourceCapabilities?.firesTouchEvents) return;
8789
8857
  isHovered = true;
8790
8858
  activatorEl.value = e.currentTarget || e.target;
8791
8859
  runOpenDelay();
8792
8860
  },
8793
- mouseleave: e => {
8861
+ onMouseleave: e => {
8794
8862
  isHovered = false;
8795
8863
  runCloseDelay();
8796
8864
  },
8797
- focus: e => {
8865
+ onFocus: e => {
8798
8866
  if (SUPPORTS_FOCUS_VISIBLE && !e.target.matches(':focus-visible')) return;
8799
8867
  isFocused = true;
8800
8868
  e.stopPropagation();
8801
8869
  activatorEl.value = e.currentTarget || e.target;
8802
8870
  runOpenDelay();
8803
8871
  },
8804
- blur: e => {
8872
+ onBlur: e => {
8805
8873
  isFocused = false;
8806
8874
  e.stopPropagation();
8807
8875
  runCloseDelay();
@@ -8810,33 +8878,43 @@
8810
8878
  const activatorEvents = vue.computed(() => {
8811
8879
  const events = {};
8812
8880
  if (openOnClick.value) {
8813
- events.click = availableEvents.click;
8881
+ events.onClick = availableEvents.onClick;
8814
8882
  }
8815
8883
  if (props.openOnHover) {
8816
- events.mouseenter = availableEvents.mouseenter;
8817
- events.mouseleave = availableEvents.mouseleave;
8884
+ events.onMouseenter = availableEvents.onMouseenter;
8885
+ events.onMouseleave = availableEvents.onMouseleave;
8818
8886
  }
8819
8887
  if (openOnFocus.value) {
8820
- events.focus = availableEvents.focus;
8821
- events.blur = availableEvents.blur;
8888
+ events.onFocus = availableEvents.onFocus;
8889
+ events.onBlur = availableEvents.onBlur;
8822
8890
  }
8823
8891
  return events;
8824
8892
  });
8825
8893
  const contentEvents = vue.computed(() => {
8826
8894
  const events = {};
8827
8895
  if (props.openOnHover) {
8828
- events.mouseenter = () => {
8896
+ events.onMouseenter = () => {
8829
8897
  isHovered = true;
8830
8898
  runOpenDelay();
8831
8899
  };
8832
- events.mouseleave = () => {
8900
+ events.onMouseleave = () => {
8833
8901
  isHovered = false;
8834
8902
  runCloseDelay();
8835
8903
  };
8836
8904
  }
8905
+ if (openOnFocus.value) {
8906
+ events.onFocusin = () => {
8907
+ isFocused = true;
8908
+ runOpenDelay();
8909
+ };
8910
+ events.onFocusout = () => {
8911
+ isFocused = false;
8912
+ runCloseDelay();
8913
+ };
8914
+ }
8837
8915
  if (props.closeOnContentClick) {
8838
8916
  const menu = vue.inject(VMenuSymbol, null);
8839
- events.click = () => {
8917
+ events.onClick = () => {
8840
8918
  isActive.value = false;
8841
8919
  menu?.closeParents();
8842
8920
  };
@@ -8846,14 +8924,14 @@
8846
8924
  const scrimEvents = vue.computed(() => {
8847
8925
  const events = {};
8848
8926
  if (props.openOnHover) {
8849
- events.mouseenter = () => {
8927
+ events.onMouseenter = () => {
8850
8928
  if (firstEnter) {
8851
8929
  isHovered = true;
8852
8930
  firstEnter = false;
8853
8931
  runOpenDelay();
8854
8932
  }
8855
8933
  };
8856
- events.mouseleave = () => {
8934
+ events.onMouseleave = () => {
8857
8935
  isHovered = false;
8858
8936
  runCloseDelay();
8859
8937
  };
@@ -8927,29 +9005,13 @@
8927
9005
  let el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getActivator();
8928
9006
  let _props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.activatorProps;
8929
9007
  if (!el) return;
8930
- Object.entries(activatorEvents.value).forEach(_ref3 => {
8931
- let [name, cb] = _ref3;
8932
- el.addEventListener(name, cb);
8933
- });
8934
- Object.keys(_props).forEach(k => {
8935
- if (_props[k] == null) {
8936
- el.removeAttribute(k);
8937
- } else {
8938
- el.setAttribute(k, _props[k]);
8939
- }
8940
- });
9008
+ bindProps(el, vue.mergeProps(activatorEvents.value, _props));
8941
9009
  }
8942
9010
  function unbindActivatorProps() {
8943
9011
  let el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getActivator();
8944
9012
  let _props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.activatorProps;
8945
9013
  if (!el) return;
8946
- Object.entries(activatorEvents.value).forEach(_ref4 => {
8947
- let [name, cb] = _ref4;
8948
- el.removeEventListener(name, cb);
8949
- });
8950
- Object.keys(_props).forEach(k => {
8951
- el.removeAttribute(k);
8952
- });
9014
+ unbindProps(el, vue.mergeProps(activatorEvents.value, _props));
8953
9015
  }
8954
9016
  function getActivator() {
8955
9017
  let selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : props.activator;
@@ -9476,6 +9538,9 @@
9476
9538
  if (e.key === 'Escape' && globalTop.value) {
9477
9539
  if (!props.persistent) {
9478
9540
  isActive.value = false;
9541
+ if (contentEl.value?.contains(document.activeElement)) {
9542
+ activatorEl.value?.focus();
9543
+ }
9479
9544
  } else animateClick();
9480
9545
  }
9481
9546
  }
@@ -9518,7 +9583,7 @@
9518
9583
  isActive: isActive.value,
9519
9584
  props: vue.mergeProps({
9520
9585
  ref: activatorRef
9521
- }, vue.toHandlers(activatorEvents.value), props.activatorProps)
9586
+ }, activatorEvents.value, props.activatorProps)
9522
9587
  }), isMounted.value && vue.createVNode(vue.Teleport, {
9523
9588
  "disabled": !teleportTarget.value,
9524
9589
  "to": teleportTarget.value
@@ -9536,7 +9601,7 @@
9536
9601
  }, scopeId, attrs), [vue.createVNode(Scrim, vue.mergeProps({
9537
9602
  "color": scrimColor,
9538
9603
  "modelValue": isActive.value && !!props.scrim
9539
- }, vue.toHandlers(scrimEvents.value)), null), vue.createVNode(MaybeTransition, {
9604
+ }, scrimEvents.value), null), vue.createVNode(MaybeTransition, {
9540
9605
  "appear": true,
9541
9606
  "persisted": true,
9542
9607
  "transition": props.transition,
@@ -9550,7 +9615,7 @@
9550
9615
  "ref": contentEl,
9551
9616
  "class": ['v-overlay__content', props.contentClass],
9552
9617
  "style": [dimensionStyles.value, contentStyles.value]
9553
- }, vue.toHandlers(contentEvents.value), props.contentProps), [slots.default?.({
9618
+ }, contentEvents.value, props.contentProps), [slots.default?.({
9554
9619
  isActive
9555
9620
  })]), [[vue.vShow, isActive.value], [vue.resolveDirective("click-outside"), {
9556
9621
  handler: onClickOutside,
@@ -9710,10 +9775,35 @@
9710
9775
  function onClickOutside() {
9711
9776
  parent?.closeParents();
9712
9777
  }
9778
+ function onKeydown(e) {
9779
+ if (props.disabled) return;
9780
+ if (e.key === 'Tab') {
9781
+ isActive.value = false;
9782
+ overlay.value?.activatorEl?.focus();
9783
+ }
9784
+ }
9785
+ function onActivatorKeydown(e) {
9786
+ if (props.disabled) return;
9787
+ const el = overlay.value?.contentEl;
9788
+ if (el && isActive.value) {
9789
+ if (e.key === 'ArrowDown') {
9790
+ e.preventDefault();
9791
+ focusChild(el, 'next');
9792
+ } else if (e.key === 'ArrowUp') {
9793
+ e.preventDefault();
9794
+ focusChild(el, 'prev');
9795
+ }
9796
+ } else if (['ArrowDown', 'ArrowUp'].includes(e.key)) {
9797
+ isActive.value = true;
9798
+ e.preventDefault();
9799
+ setTimeout(() => setTimeout(() => onActivatorKeydown(e)));
9800
+ }
9801
+ }
9713
9802
  const activatorProps = vue.computed(() => vue.mergeProps({
9714
9803
  'aria-haspopup': 'menu',
9715
9804
  'aria-expanded': String(isActive.value),
9716
- 'aria-owns': id.value
9805
+ 'aria-owns': id.value,
9806
+ onKeydown: onActivatorKeydown
9717
9807
  }, props.activatorProps));
9718
9808
  useRender(() => {
9719
9809
  const [overlayProps] = VOverlay.filterProps(props);
@@ -9726,7 +9816,8 @@
9726
9816
  "onUpdate:modelValue": $event => isActive.value = $event,
9727
9817
  "absolute": true,
9728
9818
  "activatorProps": activatorProps.value,
9729
- "onClick:outside": onClickOutside
9819
+ "onClick:outside": onClickOutside,
9820
+ "onKeydown": onKeydown
9730
9821
  }, scopeId), {
9731
9822
  activator: slots.activator,
9732
9823
  default: function () {
@@ -10370,6 +10461,7 @@
10370
10461
  }
10371
10462
  return items.value;
10372
10463
  });
10464
+ const menuDisabled = vue.computed(() => props.hideNoData && !items.value.length || props.readonly || form?.isReadonly.value);
10373
10465
  const listRef = vue.ref();
10374
10466
  function onClear(e) {
10375
10467
  if (props.openOnClear) {
@@ -10377,7 +10469,7 @@
10377
10469
  }
10378
10470
  }
10379
10471
  function onMousedownControl() {
10380
- if (props.hideNoData && !items.value.length || props.readonly || form?.isReadonly.value) return;
10472
+ if (menuDisabled.value) return;
10381
10473
  menu.value = !menu.value;
10382
10474
  }
10383
10475
  function onKeydown(e) {
@@ -10391,11 +10483,7 @@
10391
10483
  if (['Escape', 'Tab'].includes(e.key)) {
10392
10484
  menu.value = false;
10393
10485
  }
10394
- if (e.key === 'ArrowDown') {
10395
- listRef.value?.focus('next');
10396
- } else if (e.key === 'ArrowUp') {
10397
- listRef.value?.focus('prev');
10398
- } else if (e.key === 'Home') {
10486
+ if (e.key === 'Home') {
10399
10487
  listRef.value?.focus('first');
10400
10488
  } else if (e.key === 'End') {
10401
10489
  listRef.value?.focus('last');
@@ -10421,6 +10509,11 @@
10421
10509
  model.value = [item];
10422
10510
  }
10423
10511
  }
10512
+ function onListKeydown(e) {
10513
+ if (e.key === 'Tab') {
10514
+ vTextFieldRef.value?.focus();
10515
+ }
10516
+ }
10424
10517
  function select(item) {
10425
10518
  if (props.multiple) {
10426
10519
  const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
@@ -10451,7 +10544,7 @@
10451
10544
  }
10452
10545
  useRender(() => {
10453
10546
  const hasChips = !!(props.chips || slots.chip);
10454
- const hasList = !!(!props.hideNoData || displayItems.value.length || slots.prepend || slots.append || slots['no-data']);
10547
+ const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
10455
10548
  const isDirty = model.value.length > 0;
10456
10549
  const [textFieldProps] = VTextField.filterProps(props);
10457
10550
  const placeholder = isDirty || !isFocused.value && props.label && !props.persistentPlaceholder ? undefined : props.placeholder;
@@ -10488,6 +10581,7 @@
10488
10581
  "onUpdate:modelValue": $event => menu.value = $event,
10489
10582
  "activator": "parent",
10490
10583
  "contentClass": "v-select__content",
10584
+ "disabled": menuDisabled.value,
10491
10585
  "eager": props.eager,
10492
10586
  "maxHeight": 310,
10493
10587
  "openOnClick": false,
@@ -10500,11 +10594,13 @@
10500
10594
  "selected": selected.value,
10501
10595
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
10502
10596
  "onMousedown": e => e.preventDefault(),
10503
- "onFocusin": onFocusin
10597
+ "onKeydown": onListKeydown,
10598
+ "onFocusin": onFocusin,
10599
+ "tabindex": "-1"
10504
10600
  }, {
10505
- default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
10601
+ default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
10506
10602
  "title": t(props.noDataText)
10507
- }, null)), slots['prepend-item']?.(), displayItems.value.map((item, index) => {
10603
+ }, null)), displayItems.value.map((item, index) => {
10508
10604
  const itemProps = vue.mergeProps(item.props, {
10509
10605
  key: index,
10510
10606
  onClick: () => select(item)
@@ -10796,6 +10892,7 @@
10796
10892
  const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title;
10797
10893
  return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value;
10798
10894
  });
10895
+ const menuDisabled = vue.computed(() => props.hideNoData && !items.value.length || props.readonly || form?.isReadonly.value);
10799
10896
  const listRef = vue.ref();
10800
10897
  function onClear(e) {
10801
10898
  if (props.openOnClear) {
@@ -10804,10 +10901,11 @@
10804
10901
  search.value = '';
10805
10902
  }
10806
10903
  function onMousedownControl() {
10807
- if (props.hideNoData && !items.value.length || props.readonly || form?.isReadonly.value) return;
10904
+ if (menuDisabled.value) return;
10808
10905
  menu.value = true;
10809
10906
  }
10810
10907
  function onMousedownMenuIcon(e) {
10908
+ if (menuDisabled.value) return;
10811
10909
  if (isFocused.value) {
10812
10910
  e.preventDefault();
10813
10911
  e.stopPropagation();
@@ -10833,13 +10931,8 @@
10833
10931
  }
10834
10932
  isPristine.value = true;
10835
10933
  }
10836
- if (e.key === 'ArrowDown') {
10934
+ if (e.key === 'ArrowDown' && highlightFirst.value) {
10837
10935
  listRef.value?.focus('next');
10838
- if (highlightFirst.value) {
10839
- listRef.value?.focus('next');
10840
- }
10841
- } else if (e.key === 'ArrowUp') {
10842
- listRef.value?.focus('prev');
10843
10936
  }
10844
10937
  if (!props.multiple) return;
10845
10938
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -10874,6 +10967,11 @@
10874
10967
  }
10875
10968
  }
10876
10969
  }
10970
+ function onListKeydown(e) {
10971
+ if (e.key === 'Tab') {
10972
+ vTextFieldRef.value?.focus();
10973
+ }
10974
+ }
10877
10975
  function onInput(e) {
10878
10976
  search.value = e.target.value;
10879
10977
  }
@@ -10943,7 +11041,7 @@
10943
11041
  });
10944
11042
  useRender(() => {
10945
11043
  const hasChips = !!(props.chips || slots.chip);
10946
- const hasList = !!(!props.hideNoData || displayItems.value.length || slots.prepend || slots.append || slots['no-data']);
11044
+ const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
10947
11045
  const isDirty = model.value.length > 0;
10948
11046
  const [textFieldProps] = VTextField.filterProps(props);
10949
11047
  return vue.createVNode(VTextField, vue.mergeProps({
@@ -10976,6 +11074,7 @@
10976
11074
  "onUpdate:modelValue": $event => menu.value = $event,
10977
11075
  "activator": "parent",
10978
11076
  "contentClass": "v-autocomplete__content",
11077
+ "disabled": menuDisabled.value,
10979
11078
  "eager": props.eager,
10980
11079
  "maxHeight": 310,
10981
11080
  "openOnClick": false,
@@ -10988,12 +11087,14 @@
10988
11087
  "selected": selected.value,
10989
11088
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
10990
11089
  "onMousedown": e => e.preventDefault(),
11090
+ "onKeydown": onListKeydown,
10991
11091
  "onFocusin": onFocusin,
10992
- "onFocusout": onFocusout
11092
+ "onFocusout": onFocusout,
11093
+ "tabindex": "-1"
10993
11094
  }, {
10994
- default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
11095
+ default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
10995
11096
  "title": t(props.noDataText)
10996
- }, null)), slots['prepend-item']?.(), displayItems.value.map((item, index) => {
11097
+ }, null)), displayItems.value.map((item, index) => {
10997
11098
  const itemProps = vue.mergeProps(item.props, {
10998
11099
  key: index,
10999
11100
  active: highlightFirst.value && index === 0 ? true : undefined,
@@ -11743,7 +11844,7 @@
11743
11844
  prependAvatar: String,
11744
11845
  prependIcon: IconValue,
11745
11846
  ripple: {
11746
- type: Boolean,
11847
+ type: [Boolean, Object],
11747
11848
  default: true
11748
11849
  },
11749
11850
  subtitle: String,
@@ -13148,6 +13249,8 @@
13148
13249
  return data;
13149
13250
  };
13150
13251
 
13252
+ // Types
13253
+
13151
13254
  const makeVSliderThumbProps = propsFactory({
13152
13255
  focused: Boolean,
13153
13256
  max: {
@@ -13167,7 +13270,7 @@
13167
13270
  required: true
13168
13271
  },
13169
13272
  ripple: {
13170
- type: Boolean,
13273
+ type: [Boolean, Object],
13171
13274
  default: true
13172
13275
  },
13173
13276
  ...makeComponentProps()
@@ -14326,6 +14429,7 @@
14326
14429
  const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title;
14327
14430
  return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value;
14328
14431
  });
14432
+ const menuDisabled = vue.computed(() => props.hideNoData && !items.value.length || props.readonly || form?.isReadonly.value);
14329
14433
  const listRef = vue.ref();
14330
14434
  function onClear(e) {
14331
14435
  cleared = true;
@@ -14334,10 +14438,11 @@
14334
14438
  }
14335
14439
  }
14336
14440
  function onMousedownControl() {
14337
- if (props.hideNoData && !items.value.length || props.readonly || form?.isReadonly.value) return;
14441
+ if (menuDisabled.value) return;
14338
14442
  menu.value = true;
14339
14443
  }
14340
14444
  function onMousedownMenuIcon(e) {
14445
+ if (menuDisabled.value) return;
14341
14446
  if (isFocused.value) {
14342
14447
  e.preventDefault();
14343
14448
  e.stopPropagation();
@@ -14363,10 +14468,8 @@
14363
14468
  }
14364
14469
  isPristine.value = true;
14365
14470
  }
14366
- if (e.key === 'ArrowDown') {
14471
+ if (e.key === 'ArrowDown' && highlightFirst.value) {
14367
14472
  listRef.value?.focus('next');
14368
- } else if (e.key === 'ArrowUp') {
14369
- listRef.value?.focus('prev');
14370
14473
  }
14371
14474
  if (!props.multiple) return;
14372
14475
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -14405,6 +14508,11 @@
14405
14508
  search.value = '';
14406
14509
  }
14407
14510
  }
14511
+ function onListKeydown(e) {
14512
+ if (e.key === 'Tab') {
14513
+ vTextFieldRef.value?.focus();
14514
+ }
14515
+ }
14408
14516
  function onAfterLeave() {
14409
14517
  if (isFocused.value) {
14410
14518
  isPristine.value = true;
@@ -14466,7 +14574,7 @@
14466
14574
  });
14467
14575
  useRender(() => {
14468
14576
  const hasChips = !!(props.chips || slots.chip);
14469
- const hasList = !!(!props.hideNoData || displayItems.value.length || slots.prepend || slots.append || slots['no-data']);
14577
+ const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
14470
14578
  const isDirty = model.value.length > 0;
14471
14579
  const [textFieldProps] = VTextField.filterProps(props);
14472
14580
  return vue.createVNode(VTextField, vue.mergeProps({
@@ -14499,6 +14607,7 @@
14499
14607
  "onUpdate:modelValue": $event => menu.value = $event,
14500
14608
  "activator": "parent",
14501
14609
  "contentClass": "v-combobox__content",
14610
+ "disabled": menuDisabled.value,
14502
14611
  "eager": props.eager,
14503
14612
  "maxHeight": 310,
14504
14613
  "openOnClick": false,
@@ -14511,12 +14620,14 @@
14511
14620
  "selected": selected.value,
14512
14621
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
14513
14622
  "onMousedown": e => e.preventDefault(),
14623
+ "onKeydown": onListKeydown,
14514
14624
  "onFocusin": onFocusin,
14515
- "onFocusout": onFocusout
14625
+ "onFocusout": onFocusout,
14626
+ "tabindex": "-1"
14516
14627
  }, {
14517
- default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
14628
+ default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
14518
14629
  "title": t(props.noDataText)
14519
- }, null)), slots['prepend-item']?.(), displayItems.value.map((item, index) => {
14630
+ }, null)), displayItems.value.map((item, index) => {
14520
14631
  const itemProps = vue.mergeProps(item.props, {
14521
14632
  key: index,
14522
14633
  active: highlightFirst.value && index === 0 ? true : undefined,
@@ -14808,6 +14919,8 @@
14808
14919
  }
14809
14920
  });
14810
14921
 
14922
+ // Types
14923
+
14811
14924
  const makeVExpansionPanelTitleProps = propsFactory({
14812
14925
  color: String,
14813
14926
  expandIcon: {
@@ -19857,7 +19970,7 @@
19857
19970
  date
19858
19971
  };
19859
19972
  }
19860
- const version$1 = "3.3.2";
19973
+ const version$1 = "3.3.3";
19861
19974
  createVuetify$1.version = version$1;
19862
19975
 
19863
19976
  // Vue's inject() can only be used in setup
@@ -19882,7 +19995,7 @@
19882
19995
  ...options
19883
19996
  });
19884
19997
  };
19885
- const version = "3.3.2";
19998
+ const version = "3.3.3";
19886
19999
  createVuetify.version = version;
19887
20000
 
19888
20001
  exports.components = components;