vuetify 3.3.12 → 3.3.14

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 (218) hide show
  1. package/dist/json/attributes.json +114 -70
  2. package/dist/json/importMap-labs.json +4 -4
  3. package/dist/json/tags.json +15 -4
  4. package/dist/json/web-types.json +336 -149
  5. package/dist/vuetify-labs.css +605 -509
  6. package/dist/vuetify-labs.d.ts +547 -265
  7. package/dist/vuetify-labs.esm.js +504 -352
  8. package/dist/vuetify-labs.esm.js.map +1 -1
  9. package/dist/vuetify-labs.js +503 -351
  10. package/dist/vuetify-labs.min.css +2 -2
  11. package/dist/vuetify.css +439 -343
  12. package/dist/vuetify.d.ts +392 -102
  13. package/dist/vuetify.esm.js +304 -215
  14. package/dist/vuetify.esm.js.map +1 -1
  15. package/dist/vuetify.js +303 -214
  16. package/dist/vuetify.js.map +1 -1
  17. package/dist/vuetify.min.css +2 -2
  18. package/dist/vuetify.min.js +839 -828
  19. package/dist/vuetify.min.js.map +1 -1
  20. package/lib/components/VAppBar/VAppBar.mjs.map +1 -1
  21. package/lib/components/VAppBar/index.d.mts +6 -6
  22. package/lib/components/VAutocomplete/VAutocomplete.mjs +18 -4
  23. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  24. package/lib/components/VAutocomplete/index.d.mts +42 -0
  25. package/lib/components/VBadge/VBadge.css +1 -1
  26. package/lib/components/VBadge/_variables.scss +1 -1
  27. package/lib/components/VBottomNavigation/VBottomNavigation.css +1 -0
  28. package/lib/components/VBottomNavigation/VBottomNavigation.sass +1 -0
  29. package/lib/components/VBtn/VBtn.css +3 -0
  30. package/lib/components/VBtn/VBtn.sass +3 -0
  31. package/lib/components/VCheckbox/VCheckbox.mjs +2 -2
  32. package/lib/components/VCheckbox/VCheckbox.mjs.map +1 -1
  33. package/lib/components/VCheckbox/VCheckboxBtn.mjs +14 -11
  34. package/lib/components/VCheckbox/VCheckboxBtn.mjs.map +1 -1
  35. package/lib/components/VCheckbox/index.d.mts +3 -1
  36. package/lib/components/VColorPicker/VColorPickerEdit.css +4 -2
  37. package/lib/components/VColorPicker/VColorPickerPreview.css +11 -6
  38. package/lib/components/VCombobox/VCombobox.mjs +17 -3
  39. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  40. package/lib/components/VCombobox/index.d.mts +42 -0
  41. package/lib/components/VField/VField.css +23 -7
  42. package/lib/components/VField/VField.mjs +5 -3
  43. package/lib/components/VField/VField.mjs.map +1 -1
  44. package/lib/components/VField/VField.sass +9 -1
  45. package/lib/components/VField/_variables.scss +1 -0
  46. package/lib/components/VFileInput/VFileInput.css +4 -0
  47. package/lib/components/VFileInput/VFileInput.sass +5 -1
  48. package/lib/components/VFileInput/_variables.scss +2 -1
  49. package/lib/components/VGrid/VGrid.css +153 -142
  50. package/lib/components/VList/VList.css +1 -1
  51. package/lib/components/VList/VList.sass +1 -1
  52. package/lib/components/VList/VListItem.css +15 -10
  53. package/lib/components/VList/VListItem.mjs +6 -3
  54. package/lib/components/VList/VListItem.mjs.map +1 -1
  55. package/lib/components/VList/VListItem.sass +17 -10
  56. package/lib/components/VMenu/VMenu.mjs +4 -3
  57. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  58. package/lib/components/VMenu/index.d.mts +5 -5
  59. package/lib/components/VNavigationDrawer/VNavigationDrawer.css +0 -1
  60. package/lib/components/VNavigationDrawer/VNavigationDrawer.sass +0 -1
  61. package/lib/components/VNavigationDrawer/_variables.scss +0 -1
  62. package/lib/components/VProgressLinear/VProgressLinear.css +3 -2
  63. package/lib/components/VRadio/index.d.mts +3 -1
  64. package/lib/components/VRadioGroup/VRadioGroup.css +6 -1
  65. package/lib/components/VRadioGroup/VRadioGroup.mjs +2 -2
  66. package/lib/components/VRadioGroup/VRadioGroup.mjs.map +1 -1
  67. package/lib/components/VRadioGroup/VRadioGroup.sass +5 -0
  68. package/lib/components/VRadioGroup/_variables.scss +3 -1
  69. package/lib/components/VRadioGroup/index.d.mts +3 -1
  70. package/lib/components/VRangeSlider/index.d.mts +114 -33
  71. package/lib/components/VSelect/VSelect.mjs +26 -4
  72. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  73. package/lib/components/VSelect/index.d.mts +42 -0
  74. package/lib/components/VSelectionControl/VSelectionControl.mjs +24 -20
  75. package/lib/components/VSelectionControl/VSelectionControl.mjs.map +1 -1
  76. package/lib/components/VSelectionControl/index.d.mts +27 -25
  77. package/lib/components/VSlider/VSlider.mjs.map +1 -1
  78. package/lib/components/VSlider/VSliderThumb.css +8 -4
  79. package/lib/components/VSlider/VSliderTrack.css +22 -12
  80. package/lib/components/VSlider/index.d.mts +114 -33
  81. package/lib/components/VSwitch/VSwitch.css +24 -17
  82. package/lib/components/VSwitch/VSwitch.mjs +37 -28
  83. package/lib/components/VSwitch/VSwitch.mjs.map +1 -1
  84. package/lib/components/VSwitch/VSwitch.sass +20 -11
  85. package/lib/components/VSwitch/_variables.scss +18 -6
  86. package/lib/components/VSwitch/index.d.mts +3 -1
  87. package/lib/components/VTextField/VTextField.css +9 -2
  88. package/lib/components/VTextField/VTextField.mjs +6 -3
  89. package/lib/components/VTextField/VTextField.mjs.map +1 -1
  90. package/lib/components/VTextField/VTextField.sass +10 -3
  91. package/lib/components/VTextField/index.d.mts +6 -0
  92. package/lib/components/VTextarea/VTextarea.mjs +1 -2
  93. package/lib/components/VTextarea/VTextarea.mjs.map +1 -1
  94. package/lib/components/VTimeline/VTimeline.css +25 -11
  95. package/lib/components/VTimeline/VTimeline.sass +11 -1
  96. package/lib/components/VToolbar/VToolbar.css +4 -2
  97. package/lib/components/index.d.mts +391 -101
  98. package/lib/composables/color.mjs +6 -1
  99. package/lib/composables/color.mjs.map +1 -1
  100. package/lib/composables/defaults.mjs +9 -9
  101. package/lib/composables/defaults.mjs.map +1 -1
  102. package/lib/composables/theme.mjs +2 -5
  103. package/lib/composables/theme.mjs.map +1 -1
  104. package/lib/entry-bundler.mjs +1 -1
  105. package/lib/framework.mjs +1 -1
  106. package/lib/index.d.mts +1 -1
  107. package/lib/labs/VDateInput/index.d.mts +8 -2
  108. package/lib/labs/VDatePicker/VDateCard.mjs +3 -0
  109. package/lib/labs/VDatePicker/VDateCard.mjs.map +1 -1
  110. package/lib/labs/VDatePicker/VDatePicker.mjs +51 -21
  111. package/lib/labs/VDatePicker/VDatePicker.mjs.map +1 -1
  112. package/lib/labs/VDatePicker/VDatePickerControls.css +1 -1
  113. package/lib/labs/VDatePicker/VDatePickerControls.mjs +53 -35
  114. package/lib/labs/VDatePicker/VDatePickerControls.mjs.map +1 -1
  115. package/lib/labs/VDatePicker/VDatePickerMonth.mjs +37 -28
  116. package/lib/labs/VDatePicker/VDatePickerMonth.mjs.map +1 -1
  117. package/lib/labs/VDatePicker/VDatePickerYears.mjs +19 -17
  118. package/lib/labs/VDatePicker/VDatePickerYears.mjs.map +1 -1
  119. package/lib/labs/VDatePicker/index.d.mts +148 -156
  120. package/lib/labs/VDateRangePicker/VDateRangeCard.mjs +3 -0
  121. package/lib/labs/VDateRangePicker/VDateRangeCard.mjs.map +1 -1
  122. package/lib/labs/VDateRangePicker/index.d.mts +59 -52
  123. package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs.map +1 -1
  124. package/lib/labs/VSkeletonLoader/index.d.mts +8 -8
  125. package/lib/labs/components.d.mts +156 -164
  126. package/lib/locale/af.mjs +1 -0
  127. package/lib/locale/af.mjs.map +1 -1
  128. package/lib/locale/ar.mjs +1 -0
  129. package/lib/locale/ar.mjs.map +1 -1
  130. package/lib/locale/az.mjs +1 -0
  131. package/lib/locale/az.mjs.map +1 -1
  132. package/lib/locale/bg.mjs +1 -0
  133. package/lib/locale/bg.mjs.map +1 -1
  134. package/lib/locale/ca.mjs +1 -0
  135. package/lib/locale/ca.mjs.map +1 -1
  136. package/lib/locale/ckb.mjs +1 -0
  137. package/lib/locale/ckb.mjs.map +1 -1
  138. package/lib/locale/cs.mjs +1 -0
  139. package/lib/locale/cs.mjs.map +1 -1
  140. package/lib/locale/da.mjs +1 -0
  141. package/lib/locale/da.mjs.map +1 -1
  142. package/lib/locale/de.mjs +1 -0
  143. package/lib/locale/de.mjs.map +1 -1
  144. package/lib/locale/el.mjs +1 -0
  145. package/lib/locale/el.mjs.map +1 -1
  146. package/lib/locale/en.mjs +1 -0
  147. package/lib/locale/en.mjs.map +1 -1
  148. package/lib/locale/es.mjs +1 -0
  149. package/lib/locale/es.mjs.map +1 -1
  150. package/lib/locale/et.mjs +1 -0
  151. package/lib/locale/et.mjs.map +1 -1
  152. package/lib/locale/fa.mjs +1 -0
  153. package/lib/locale/fa.mjs.map +1 -1
  154. package/lib/locale/fi.mjs +1 -0
  155. package/lib/locale/fi.mjs.map +1 -1
  156. package/lib/locale/fr.mjs +1 -0
  157. package/lib/locale/fr.mjs.map +1 -1
  158. package/lib/locale/he.mjs +1 -0
  159. package/lib/locale/he.mjs.map +1 -1
  160. package/lib/locale/hr.mjs +1 -0
  161. package/lib/locale/hr.mjs.map +1 -1
  162. package/lib/locale/hu.mjs +1 -0
  163. package/lib/locale/hu.mjs.map +1 -1
  164. package/lib/locale/id.mjs +1 -0
  165. package/lib/locale/id.mjs.map +1 -1
  166. package/lib/locale/index.d.mts +42 -0
  167. package/lib/locale/it.mjs +1 -0
  168. package/lib/locale/it.mjs.map +1 -1
  169. package/lib/locale/ja.mjs +1 -0
  170. package/lib/locale/ja.mjs.map +1 -1
  171. package/lib/locale/ko.mjs +1 -0
  172. package/lib/locale/ko.mjs.map +1 -1
  173. package/lib/locale/lt.mjs +1 -0
  174. package/lib/locale/lt.mjs.map +1 -1
  175. package/lib/locale/lv.mjs +1 -0
  176. package/lib/locale/lv.mjs.map +1 -1
  177. package/lib/locale/nl.mjs +1 -0
  178. package/lib/locale/nl.mjs.map +1 -1
  179. package/lib/locale/no.mjs +2 -1
  180. package/lib/locale/no.mjs.map +1 -1
  181. package/lib/locale/pl.mjs +1 -0
  182. package/lib/locale/pl.mjs.map +1 -1
  183. package/lib/locale/pt.mjs +1 -0
  184. package/lib/locale/pt.mjs.map +1 -1
  185. package/lib/locale/ro.mjs +1 -0
  186. package/lib/locale/ro.mjs.map +1 -1
  187. package/lib/locale/ru.mjs +1 -0
  188. package/lib/locale/ru.mjs.map +1 -1
  189. package/lib/locale/sk.mjs +1 -0
  190. package/lib/locale/sk.mjs.map +1 -1
  191. package/lib/locale/sl.mjs +1 -0
  192. package/lib/locale/sl.mjs.map +1 -1
  193. package/lib/locale/sr-Cyrl.mjs +1 -0
  194. package/lib/locale/sr-Cyrl.mjs.map +1 -1
  195. package/lib/locale/sr-Latn.mjs +1 -0
  196. package/lib/locale/sr-Latn.mjs.map +1 -1
  197. package/lib/locale/sv.mjs +1 -0
  198. package/lib/locale/sv.mjs.map +1 -1
  199. package/lib/locale/th.mjs +1 -0
  200. package/lib/locale/th.mjs.map +1 -1
  201. package/lib/locale/tr.mjs +1 -0
  202. package/lib/locale/tr.mjs.map +1 -1
  203. package/lib/locale/uk.mjs +1 -0
  204. package/lib/locale/uk.mjs.map +1 -1
  205. package/lib/locale/vi.mjs +1 -0
  206. package/lib/locale/vi.mjs.map +1 -1
  207. package/lib/locale/zh-Hans.mjs +1 -0
  208. package/lib/locale/zh-Hans.mjs.map +1 -1
  209. package/lib/locale/zh-Hant.mjs +1 -0
  210. package/lib/locale/zh-Hant.mjs.map +1 -1
  211. package/lib/styles/tools/_rtl.sass +4 -2
  212. package/lib/util/colorUtils.mjs +6 -0
  213. package/lib/util/colorUtils.mjs.map +1 -1
  214. package/lib/util/helpers.mjs +10 -4
  215. package/lib/util/helpers.mjs.map +1 -1
  216. package/lib/util/injectSelf.mjs +2 -1
  217. package/lib/util/injectSelf.mjs.map +1 -1
  218. package/package.json +2 -2
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.3.12
2
+ * Vuetify v3.3.14
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { Fragment, reactive, computed, watchEffect, toRefs, capitalize, warn, watch, onScopeDispose, effectScope, ref, unref, provide, shallowRef, inject as inject$1, defineComponent as defineComponent$1, camelize, h, getCurrentInstance as getCurrentInstance$1, onBeforeUnmount, readonly, onDeactivated, onActivated, onMounted, toRaw, createVNode, TransitionGroup, Transition, mergeProps, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, isRef, toRef, Text, resolveDynamicComponent, Teleport, cloneVNode, createTextVNode, onBeforeUpdate, vModelText } from 'vue';
7
+ import { Fragment, reactive, computed, watchEffect, toRefs, capitalize, warn, ref, unref, provide, shallowRef, inject as inject$1, defineComponent as defineComponent$1, camelize, h, getCurrentInstance as getCurrentInstance$1, onBeforeUnmount, watch, readonly, onDeactivated, onActivated, onMounted, onScopeDispose, effectScope, toRaw, createVNode, TransitionGroup, Transition, mergeProps, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, isRef, toRef, Text, resolveDynamicComponent, Teleport, cloneVNode, createTextVNode, onBeforeUpdate, vModelText } from 'vue';
8
8
 
9
9
  // Types
10
10
  // eslint-disable-line vue/prefer-import-from-vue
@@ -224,14 +224,22 @@ function omit(obj, exclude) {
224
224
  exclude.forEach(prop => delete clone[prop]);
225
225
  return clone;
226
226
  }
227
+ const onRE = /^on[^a-z]/;
228
+ const isOn = key => onRE.test(key);
229
+ const bubblingEvents = ['onAfterscriptexecute', 'onAnimationcancel', 'onAnimationend', 'onAnimationiteration', 'onAnimationstart', 'onAuxclick', 'onBeforeinput', 'onBeforescriptexecute', 'onChange', 'onClick', 'onCompositionend', 'onCompositionstart', 'onCompositionupdate', 'onContextmenu', 'onCopy', 'onCut', 'onDblclick', 'onFocusin', 'onFocusout', 'onFullscreenchange', 'onFullscreenerror', 'onGesturechange', 'onGestureend', 'onGesturestart', 'onGotpointercapture', 'onInput', 'onKeydown', 'onKeypress', 'onKeyup', 'onLostpointercapture', 'onMousedown', 'onMousemove', 'onMouseout', 'onMouseover', 'onMouseup', 'onMousewheel', 'onPaste', 'onPointercancel', 'onPointerdown', 'onPointerenter', 'onPointerleave', 'onPointermove', 'onPointerout', 'onPointerover', 'onPointerup', 'onReset', 'onSelect', 'onSubmit', 'onTouchcancel', 'onTouchend', 'onTouchmove', 'onTouchstart', 'onTransitioncancel', 'onTransitionend', 'onTransitionrun', 'onTransitionstart', 'onWheel'];
227
230
 
228
231
  /**
229
232
  * Filter attributes that should be applied to
230
- * the root element of a an input component. Remaining
233
+ * the root element of an input component. Remaining
231
234
  * attributes should be passed to the <input> element inside.
232
235
  */
233
236
  function filterInputAttrs(attrs) {
234
- return pick(attrs, ['class', 'style', 'id', /^data-/]);
237
+ const [events, props] = pick(attrs, [onRE]);
238
+ const inputEvents = omit(events, bubblingEvents);
239
+ const [rootAttrs, inputAttrs] = pick(props, ['class', 'style', 'id', /^data-/]);
240
+ Object.assign(rootAttrs, events);
241
+ Object.assign(inputAttrs, inputEvents);
242
+ return [rootAttrs, inputAttrs];
235
243
  }
236
244
  function wrapInArray(v) {
237
245
  return v == null ? [] : Array.isArray(v) ? v : [v];
@@ -384,8 +392,6 @@ function destructComputed(getter) {
384
392
  function includes(arr, val) {
385
393
  return arr.includes(val);
386
394
  }
387
- const onRE = /^on[^a-z]/;
388
- const isOn = key => onRE.test(key);
389
395
  function eventName(propName) {
390
396
  return propName[2].toLowerCase() + propName.slice(3);
391
397
  }
@@ -652,6 +658,94 @@ function unbindProps(el, props) {
652
658
  });
653
659
  }
654
660
 
661
+ /**
662
+ * WCAG 3.0 APCA perceptual contrast algorithm from https://github.com/Myndex/SAPC-APCA
663
+ * @licence https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
664
+ * @see https://www.w3.org/WAI/GL/task-forces/silver/wiki/Visual_Contrast_of_Text_Subgroup
665
+ */
666
+ // Types
667
+
668
+ // MAGICAL NUMBERS
669
+
670
+ // sRGB Conversion to Relative Luminance (Y)
671
+
672
+ // Transfer Curve (aka "Gamma") for sRGB linearization
673
+ // Simple power curve vs piecewise described in docs
674
+ // Essentially, 2.4 best models actual display
675
+ // characteristics in combination with the total method
676
+ const mainTRC = 2.4;
677
+ const Rco = 0.2126729; // sRGB Red Coefficient (from matrix)
678
+ const Gco = 0.7151522; // sRGB Green Coefficient (from matrix)
679
+ const Bco = 0.0721750; // sRGB Blue Coefficient (from matrix)
680
+
681
+ // For Finding Raw SAPC Contrast from Relative Luminance (Y)
682
+
683
+ // Constants for SAPC Power Curve Exponents
684
+ // One pair for normal text, and one for reverse
685
+ // These are the "beating heart" of SAPC
686
+ const normBG = 0.55;
687
+ const normTXT = 0.58;
688
+ const revTXT = 0.57;
689
+ const revBG = 0.62;
690
+
691
+ // For Clamping and Scaling Values
692
+
693
+ const blkThrs = 0.03; // Level that triggers the soft black clamp
694
+ const blkClmp = 1.45; // Exponent for the soft black clamp curve
695
+ const deltaYmin = 0.0005; // Lint trap
696
+ const scaleBoW = 1.25; // Scaling for dark text on light
697
+ const scaleWoB = 1.25; // Scaling for light text on dark
698
+ const loConThresh = 0.078; // Threshold for new simple offset scale
699
+ const loConFactor = 12.82051282051282; // = 1/0.078,
700
+ const loConOffset = 0.06; // The simple offset
701
+ const loClip = 0.001; // Output clip (lint trap #2)
702
+
703
+ function APCAcontrast(text, background) {
704
+ // Linearize sRGB
705
+ const Rtxt = (text.r / 255) ** mainTRC;
706
+ const Gtxt = (text.g / 255) ** mainTRC;
707
+ const Btxt = (text.b / 255) ** mainTRC;
708
+ const Rbg = (background.r / 255) ** mainTRC;
709
+ const Gbg = (background.g / 255) ** mainTRC;
710
+ const Bbg = (background.b / 255) ** mainTRC;
711
+
712
+ // Apply the standard coefficients and sum to Y
713
+ let Ytxt = Rtxt * Rco + Gtxt * Gco + Btxt * Bco;
714
+ let Ybg = Rbg * Rco + Gbg * Gco + Bbg * Bco;
715
+
716
+ // Soft clamp Y when near black.
717
+ // Now clamping all colors to prevent crossover errors
718
+ if (Ytxt <= blkThrs) Ytxt += (blkThrs - Ytxt) ** blkClmp;
719
+ if (Ybg <= blkThrs) Ybg += (blkThrs - Ybg) ** blkClmp;
720
+
721
+ // Return 0 Early for extremely low ∆Y (lint trap #1)
722
+ if (Math.abs(Ybg - Ytxt) < deltaYmin) return 0.0;
723
+
724
+ // SAPC CONTRAST
725
+
726
+ let outputContrast; // For weighted final values
727
+ if (Ybg > Ytxt) {
728
+ // For normal polarity, black text on white
729
+ // Calculate the SAPC contrast value and scale
730
+
731
+ const SAPC = (Ybg ** normBG - Ytxt ** normTXT) * scaleBoW;
732
+
733
+ // NEW! SAPC SmoothScale™
734
+ // Low Contrast Smooth Scale Rollout to prevent polarity reversal
735
+ // and also a low clip for very low contrasts (lint trap #2)
736
+ // much of this is for very low contrasts, less than 10
737
+ // therefore for most reversing needs, only loConOffset is important
738
+ outputContrast = SAPC < loClip ? 0.0 : SAPC < loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC - loConOffset;
739
+ } else {
740
+ // For reverse polarity, light text on dark
741
+ // WoB should always return negative value.
742
+
743
+ const SAPC = (Ybg ** revBG - Ytxt ** revTXT) * scaleWoB;
744
+ outputContrast = SAPC > -loClip ? 0.0 : SAPC > -loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC + loConOffset;
745
+ }
746
+ return outputContrast * 100;
747
+ }
748
+
655
749
  /* eslint-disable no-console */
656
750
 
657
751
  function consoleWarn(message) {
@@ -1008,36 +1102,13 @@ function getContrast(first, second) {
1008
1102
  const dark = Math.min(l1, l2);
1009
1103
  return (light + 0.05) / (dark + 0.05);
1010
1104
  }
1011
-
1012
- // Utilities
1013
-
1014
- // Types
1015
-
1016
- function useToggleScope(source, fn) {
1017
- let scope;
1018
- function start() {
1019
- scope = effectScope();
1020
- scope.run(() => fn.length ? fn(() => {
1021
- scope?.stop();
1022
- start();
1023
- }) : fn());
1024
- }
1025
- watch(source, active => {
1026
- if (active && !scope) {
1027
- start();
1028
- } else if (!active) {
1029
- scope?.stop();
1030
- scope = undefined;
1031
- }
1032
- }, {
1033
- immediate: true
1034
- });
1035
- onScopeDispose(() => {
1036
- scope?.stop();
1037
- });
1105
+ function getForeground(color) {
1106
+ const blackContrast = Math.abs(APCAcontrast(parseColor(0), parseColor(color)));
1107
+ const whiteContrast = Math.abs(APCAcontrast(parseColor(0xffffff), parseColor(color)));
1108
+ return whiteContrast > Math.min(blackContrast, 50) ? '#fff' : '#000';
1038
1109
  }
1039
1110
 
1040
- // Composables
1111
+ // Utilities
1041
1112
 
1042
1113
  // Types
1043
1114
 
@@ -1059,6 +1130,7 @@ function provideDefaults(defaults, options) {
1059
1130
  const scoped = unref(options?.scoped);
1060
1131
  const reset = unref(options?.reset);
1061
1132
  const root = unref(options?.root);
1133
+ if (providedDefaults.value == null && !(scoped || reset || root)) return injectedDefaults.value;
1062
1134
  let properties = mergeDeep(providedDefaults.value, {
1063
1135
  prev: injectedDefaults.value
1064
1136
  });
@@ -1114,16 +1186,16 @@ function internalUseDefaults() {
1114
1186
  let [key] = _ref;
1115
1187
  return key.startsWith(key[0].toUpperCase());
1116
1188
  });
1117
- if (subComponents.length) _subcomponentDefaults.value = Object.fromEntries(subComponents);
1189
+ _subcomponentDefaults.value = subComponents.length ? Object.fromEntries(subComponents) : undefined;
1190
+ } else {
1191
+ _subcomponentDefaults.value = undefined;
1118
1192
  }
1119
1193
  });
1120
1194
  function provideSubDefaults() {
1121
- // If subcomponent defaults are provided, override any
1122
- // subcomponents provided by the component's setup function.
1123
- // This uses injectSelf so must be done after the original setup to work.
1124
- useToggleScope(_subcomponentDefaults, () => {
1125
- provideDefaults(mergeDeep(injectSelf(DefaultsSymbol)?.value ?? {}, _subcomponentDefaults.value));
1126
- });
1195
+ const injected = injectSelf(DefaultsSymbol, vm);
1196
+ provide(DefaultsSymbol, computed(() => {
1197
+ return _subcomponentDefaults.value ? mergeDeep(injected?.value ?? {}, _subcomponentDefaults.value) : injected?.value;
1198
+ }));
1127
1199
  }
1128
1200
  return {
1129
1201
  props: _props,
@@ -1301,9 +1373,10 @@ function isPotentiallyScrollable(el) {
1301
1373
  // Types
1302
1374
 
1303
1375
  function injectSelf(key) {
1376
+ let vm = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstance('injectSelf');
1304
1377
  const {
1305
1378
  provides
1306
- } = getCurrentInstance('injectSelf');
1379
+ } = vm;
1307
1380
  if (provides && key in provides) {
1308
1381
  // TS doesn't allow symbol as index type
1309
1382
  return provides[key];
@@ -1641,6 +1714,7 @@ function createLayout(props) {
1641
1714
 
1642
1715
  var en = {
1643
1716
  badge: 'Badge',
1717
+ open: 'Open',
1644
1718
  close: 'Close',
1645
1719
  dataIterator: {
1646
1720
  noResultsText: 'No matching records found',
@@ -1779,6 +1853,34 @@ const defaultRtl = {
1779
1853
  zhHant: false
1780
1854
  };
1781
1855
 
1856
+ // Utilities
1857
+
1858
+ // Types
1859
+
1860
+ function useToggleScope(source, fn) {
1861
+ let scope;
1862
+ function start() {
1863
+ scope = effectScope();
1864
+ scope.run(() => fn.length ? fn(() => {
1865
+ scope?.stop();
1866
+ start();
1867
+ }) : fn());
1868
+ }
1869
+ watch(source, active => {
1870
+ if (active && !scope) {
1871
+ start();
1872
+ } else if (!active) {
1873
+ scope?.stop();
1874
+ scope = undefined;
1875
+ }
1876
+ }, {
1877
+ immediate: true
1878
+ });
1879
+ onScopeDispose(() => {
1880
+ scope?.stop();
1881
+ });
1882
+ }
1883
+
1782
1884
  // Composables
1783
1885
 
1784
1886
  // Types
@@ -1980,94 +2082,6 @@ function useRtl() {
1980
2082
  };
1981
2083
  }
1982
2084
 
1983
- /**
1984
- * WCAG 3.0 APCA perceptual contrast algorithm from https://github.com/Myndex/SAPC-APCA
1985
- * @licence https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
1986
- * @see https://www.w3.org/WAI/GL/task-forces/silver/wiki/Visual_Contrast_of_Text_Subgroup
1987
- */
1988
- // Types
1989
-
1990
- // MAGICAL NUMBERS
1991
-
1992
- // sRGB Conversion to Relative Luminance (Y)
1993
-
1994
- // Transfer Curve (aka "Gamma") for sRGB linearization
1995
- // Simple power curve vs piecewise described in docs
1996
- // Essentially, 2.4 best models actual display
1997
- // characteristics in combination with the total method
1998
- const mainTRC = 2.4;
1999
- const Rco = 0.2126729; // sRGB Red Coefficient (from matrix)
2000
- const Gco = 0.7151522; // sRGB Green Coefficient (from matrix)
2001
- const Bco = 0.0721750; // sRGB Blue Coefficient (from matrix)
2002
-
2003
- // For Finding Raw SAPC Contrast from Relative Luminance (Y)
2004
-
2005
- // Constants for SAPC Power Curve Exponents
2006
- // One pair for normal text, and one for reverse
2007
- // These are the "beating heart" of SAPC
2008
- const normBG = 0.55;
2009
- const normTXT = 0.58;
2010
- const revTXT = 0.57;
2011
- const revBG = 0.62;
2012
-
2013
- // For Clamping and Scaling Values
2014
-
2015
- const blkThrs = 0.03; // Level that triggers the soft black clamp
2016
- const blkClmp = 1.45; // Exponent for the soft black clamp curve
2017
- const deltaYmin = 0.0005; // Lint trap
2018
- const scaleBoW = 1.25; // Scaling for dark text on light
2019
- const scaleWoB = 1.25; // Scaling for light text on dark
2020
- const loConThresh = 0.078; // Threshold for new simple offset scale
2021
- const loConFactor = 12.82051282051282; // = 1/0.078,
2022
- const loConOffset = 0.06; // The simple offset
2023
- const loClip = 0.001; // Output clip (lint trap #2)
2024
-
2025
- function APCAcontrast(text, background) {
2026
- // Linearize sRGB
2027
- const Rtxt = (text.r / 255) ** mainTRC;
2028
- const Gtxt = (text.g / 255) ** mainTRC;
2029
- const Btxt = (text.b / 255) ** mainTRC;
2030
- const Rbg = (background.r / 255) ** mainTRC;
2031
- const Gbg = (background.g / 255) ** mainTRC;
2032
- const Bbg = (background.b / 255) ** mainTRC;
2033
-
2034
- // Apply the standard coefficients and sum to Y
2035
- let Ytxt = Rtxt * Rco + Gtxt * Gco + Btxt * Bco;
2036
- let Ybg = Rbg * Rco + Gbg * Gco + Bbg * Bco;
2037
-
2038
- // Soft clamp Y when near black.
2039
- // Now clamping all colors to prevent crossover errors
2040
- if (Ytxt <= blkThrs) Ytxt += (blkThrs - Ytxt) ** blkClmp;
2041
- if (Ybg <= blkThrs) Ybg += (blkThrs - Ybg) ** blkClmp;
2042
-
2043
- // Return 0 Early for extremely low ∆Y (lint trap #1)
2044
- if (Math.abs(Ybg - Ytxt) < deltaYmin) return 0.0;
2045
-
2046
- // SAPC CONTRAST
2047
-
2048
- let outputContrast; // For weighted final values
2049
- if (Ybg > Ytxt) {
2050
- // For normal polarity, black text on white
2051
- // Calculate the SAPC contrast value and scale
2052
-
2053
- const SAPC = (Ybg ** normBG - Ytxt ** normTXT) * scaleBoW;
2054
-
2055
- // NEW! SAPC SmoothScale™
2056
- // Low Contrast Smooth Scale Rollout to prevent polarity reversal
2057
- // and also a low clip for very low contrasts (lint trap #2)
2058
- // much of this is for very low contrasts, less than 10
2059
- // therefore for most reversing needs, only loConOffset is important
2060
- outputContrast = SAPC < loClip ? 0.0 : SAPC < loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC - loConOffset;
2061
- } else {
2062
- // For reverse polarity, light text on dark
2063
- // WoB should always return negative value.
2064
-
2065
- const SAPC = (Ybg ** revBG - Ytxt ** revTXT) * scaleWoB;
2066
- outputContrast = SAPC > -loClip ? 0.0 : SAPC > -loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC + loConOffset;
2067
- }
2068
- return outputContrast * 100;
2069
- }
2070
-
2071
2085
  // Utilities
2072
2086
 
2073
2087
  // Types
@@ -2203,8 +2217,6 @@ function createTheme(options) {
2203
2217
  if (/^on-[a-z]/.test(color) || theme.colors[`on-${color}`]) continue;
2204
2218
  const onColor = `on-${color}`;
2205
2219
  const colorVal = parseColor(theme.colors[color]);
2206
- const blackContrast = Math.abs(APCAcontrast(parseColor(0), colorVal));
2207
- const whiteContrast = Math.abs(APCAcontrast(parseColor(0xffffff), colorVal));
2208
2220
 
2209
2221
  // TODO: warn about poor color selections
2210
2222
  // const contrastAsText = Math.abs(APCAcontrast(colorVal, colorToInt(theme.colors.background)))
@@ -2216,7 +2228,7 @@ function createTheme(options) {
2216
2228
  // }
2217
2229
 
2218
2230
  // Prefer white text if both have an acceptable contrast ratio
2219
- theme.colors[onColor] = whiteContrast > Math.min(blackContrast, 50) ? '#fff' : '#000';
2231
+ theme.colors[onColor] = getForeground(colorVal);
2220
2232
  }
2221
2233
  }
2222
2234
  return acc;
@@ -3245,6 +3257,11 @@ function useColor(colors) {
3245
3257
  if (colors.value.background) {
3246
3258
  if (isCssColor(colors.value.background)) {
3247
3259
  styles.backgroundColor = colors.value.background;
3260
+ if (!colors.value.text) {
3261
+ const textColor = getForeground(styles.backgroundColor);
3262
+ styles.color = textColor;
3263
+ styles.caretColor = textColor;
3264
+ }
3248
3265
  } else {
3249
3266
  classes.push(`bg-${colors.value.background}`);
3250
3267
  }
@@ -5844,6 +5861,20 @@ const VSelectionControl = genericComponent()({
5844
5861
  }
5845
5862
  }) : props.label;
5846
5863
  const [rootAttrs, inputAttrs] = filterInputAttrs(attrs);
5864
+ const inputNode = createVNode("input", mergeProps({
5865
+ "ref": input,
5866
+ "checked": model.value,
5867
+ "disabled": !!(props.readonly || props.disabled),
5868
+ "id": id.value,
5869
+ "onBlur": onBlur,
5870
+ "onFocus": onFocus,
5871
+ "onInput": onInput,
5872
+ "aria-disabled": !!(props.readonly || props.disabled),
5873
+ "type": props.type,
5874
+ "value": trueValue.value,
5875
+ "name": props.name,
5876
+ "aria-checked": props.type === 'checkbox' ? model.value : undefined
5877
+ }, inputAttrs), null);
5847
5878
  return createVNode("div", mergeProps({
5848
5879
  "class": ['v-selection-control', {
5849
5880
  'v-selection-control--dirty': model.value,
@@ -5860,34 +5891,24 @@ const VSelectionControl = genericComponent()({
5860
5891
  "style": textColorStyles.value
5861
5892
  }, [slots.default?.(), withDirectives(createVNode("div", {
5862
5893
  "class": ['v-selection-control__input']
5863
- }, [icon.value && createVNode(VIcon, {
5864
- "key": "icon",
5865
- "icon": icon.value
5866
- }, null), createVNode("input", mergeProps({
5867
- "ref": input,
5868
- "checked": model.value,
5869
- "disabled": !!(props.readonly || props.disabled),
5870
- "id": id.value,
5871
- "onBlur": onBlur,
5872
- "onFocus": onFocus,
5873
- "onInput": onInput,
5874
- "aria-disabled": !!(props.readonly || props.disabled),
5875
- "type": props.type,
5876
- "value": trueValue.value,
5877
- "name": props.name,
5878
- "aria-checked": props.type === 'checkbox' ? model.value : undefined
5879
- }, inputAttrs), null), slots.input?.({
5894
+ }, [slots.input?.({
5880
5895
  model,
5881
5896
  textColorClasses,
5882
5897
  textColorStyles,
5898
+ inputNode,
5899
+ icon: icon.value,
5883
5900
  props: {
5884
5901
  onFocus,
5885
5902
  onBlur,
5886
5903
  id: id.value
5887
5904
  }
5888
- })]), [[resolveDirective("ripple"), props.ripple && [!props.disabled && !props.readonly, null, ['center', 'circle']]]])]), label && createVNode(VLabel, {
5905
+ }) ?? createVNode(Fragment, null, [icon.value && createVNode(VIcon, {
5906
+ "key": "icon",
5907
+ "icon": icon.value
5908
+ }, null), inputNode])]), [[resolveDirective("ripple"), props.ripple && [!props.disabled && !props.readonly, null, ['center', 'circle']]]])]), label && createVNode(VLabel, {
5889
5909
  "for": id.value,
5890
- "clickable": true
5910
+ "clickable": true,
5911
+ "onClick": e => e.stopPropagation()
5891
5912
  }, {
5892
5913
  default: () => [label]
5893
5914
  })]);
@@ -5936,16 +5957,19 @@ const VCheckboxBtn = genericComponent()({
5936
5957
  const trueIcon = computed(() => {
5937
5958
  return indeterminate.value ? props.indeterminateIcon : props.trueIcon;
5938
5959
  });
5939
- useRender(() => createVNode(VSelectionControl, mergeProps(props, {
5940
- "modelValue": model.value,
5941
- "onUpdate:modelValue": [$event => model.value = $event, onChange],
5942
- "class": ['v-checkbox-btn', props.class],
5943
- "style": props.style,
5944
- "type": "checkbox",
5945
- "falseIcon": falseIcon.value,
5946
- "trueIcon": trueIcon.value,
5947
- "aria-checked": indeterminate.value ? 'mixed' : undefined
5948
- }), slots));
5960
+ useRender(() => {
5961
+ const controlProps = omit(VSelectionControl.filterProps(props)[0], ['modelValue']);
5962
+ return createVNode(VSelectionControl, mergeProps(controlProps, {
5963
+ "modelValue": model.value,
5964
+ "onUpdate:modelValue": [$event => model.value = $event, onChange],
5965
+ "class": ['v-checkbox-btn', props.class],
5966
+ "style": props.style,
5967
+ "type": "checkbox",
5968
+ "falseIcon": falseIcon.value,
5969
+ "trueIcon": trueIcon.value,
5970
+ "aria-checked": indeterminate.value ? 'mixed' : undefined
5971
+ }), slots);
5972
+ });
5949
5973
  return {};
5950
5974
  }
5951
5975
  });
@@ -6509,12 +6533,12 @@ const VCheckbox = genericComponent()({
6509
6533
  const uid = getUid();
6510
6534
  const id = computed(() => props.id || `checkbox-${uid}`);
6511
6535
  useRender(() => {
6512
- const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
6536
+ const [rootAttrs, controlAttrs] = filterInputAttrs(attrs);
6513
6537
  const [inputProps, _1] = VInput.filterProps(props);
6514
6538
  const [checkboxProps, _2] = VCheckboxBtn.filterProps(props);
6515
6539
  return createVNode(VInput, mergeProps({
6516
6540
  "class": ['v-checkbox', props.class]
6517
- }, inputAttrs, inputProps, {
6541
+ }, rootAttrs, inputProps, {
6518
6542
  "modelValue": model.value,
6519
6543
  "onUpdate:modelValue": $event => model.value = $event,
6520
6544
  "id": id.value,
@@ -7654,7 +7678,6 @@ const VListItem = genericComponent()({
7654
7678
  "style": [colorStyles.value, dimensionStyles.value, props.style],
7655
7679
  "href": link.href.value,
7656
7680
  "tabindex": isClickable.value ? list ? -2 : 0 : undefined,
7657
- "title": props.title,
7658
7681
  "onClick": onClick,
7659
7682
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
7660
7683
  }, {
@@ -7687,7 +7710,9 @@ const VListItem = genericComponent()({
7687
7710
  }
7688
7711
  }, {
7689
7712
  default: () => [slots.prepend?.(slotProps.value)]
7690
- })]), createVNode("div", {
7713
+ }), createVNode("div", {
7714
+ "class": "v-list-item__spacer"
7715
+ }, null)]), createVNode("div", {
7691
7716
  "class": "v-list-item__content",
7692
7717
  "data-no-activator": ""
7693
7718
  }, [hasTitle && createVNode(VListItemTitle, {
@@ -7731,7 +7756,9 @@ const VListItem = genericComponent()({
7731
7756
  }
7732
7757
  }, {
7733
7758
  default: () => [slots.append?.(slotProps.value)]
7734
- })])]
7759
+ }), createVNode("div", {
7760
+ "class": "v-list-item__spacer"
7761
+ }, null)])]
7735
7762
  }), [[resolveDirective("ripple"), isClickable.value && props.ripple]]);
7736
7763
  });
7737
7764
  return {};
@@ -9842,10 +9869,11 @@ const VMenu = genericComponent()({
9842
9869
  }, 40);
9843
9870
  }
9844
9871
  });
9845
- function onFocusIn(e) {
9872
+ async function onFocusIn(e) {
9846
9873
  const before = e.relatedTarget;
9847
9874
  const after = e.target;
9848
- if (before !== after && overlay.value?.contentEl &&
9875
+ await nextTick();
9876
+ if (isActive.value && before !== after && overlay.value?.contentEl &&
9849
9877
  // We're the topmost menu
9850
9878
  overlay.value?.globalTop &&
9851
9879
  // It isn't the document or the menu body
@@ -10181,7 +10209,7 @@ const VField = genericComponent()({
10181
10209
  'v-field--no-label': !label,
10182
10210
  [`v-field--variant-${props.variant}`]: true
10183
10211
  }, themeClasses.value, backgroundColorClasses.value, focusClasses.value, loaderClasses.value, roundedClasses.value, rtlClasses.value, props.class],
10184
- "style": [backgroundColorStyles.value, textColorStyles.value, props.style],
10212
+ "style": [backgroundColorStyles.value, props.style],
10185
10213
  "onClick": onClick
10186
10214
  }, attrs), [createVNode("div", {
10187
10215
  "class": "v-field__overlay"
@@ -10205,7 +10233,8 @@ const VField = genericComponent()({
10205
10233
  "ref": floatingLabelRef,
10206
10234
  "class": [textColorClasses.value],
10207
10235
  "floating": true,
10208
- "for": id.value
10236
+ "for": id.value,
10237
+ "style": textColorStyles.value
10209
10238
  }, {
10210
10239
  default: () => [label]
10211
10240
  }), createVNode(VFieldLabel, {
@@ -10241,7 +10270,8 @@ const VField = genericComponent()({
10241
10270
  "key": "append-icon",
10242
10271
  "name": "appendInner"
10243
10272
  }, null)]), createVNode("div", {
10244
- "class": ['v-field__outline', textColorClasses.value]
10273
+ "class": ['v-field__outline', textColorClasses.value],
10274
+ "style": textColorStyles.value
10245
10275
  }, [isOutlined && createVNode(Fragment, null, [createVNode("div", {
10246
10276
  "class": "v-field__outline__start"
10247
10277
  }, null), hasLabel.value && createVNode("div", {
@@ -10285,6 +10315,7 @@ const makeVTextFieldProps = propsFactory({
10285
10315
  persistentPlaceholder: Boolean,
10286
10316
  persistentCounter: Boolean,
10287
10317
  suffix: String,
10318
+ role: String,
10288
10319
  type: {
10289
10320
  type: String,
10290
10321
  default: 'text'
@@ -10409,7 +10440,7 @@ const VTextField = genericComponent()({
10409
10440
  "onClick:clear": onClear,
10410
10441
  "onClick:prependInner": props['onClick:prependInner'],
10411
10442
  "onClick:appendInner": props['onClick:appendInner'],
10412
- "role": "textbox"
10443
+ "role": props.role
10413
10444
  }, fieldProps, {
10414
10445
  "id": id.value,
10415
10446
  "active": isActive.value || isDirty.value,
@@ -10448,10 +10479,12 @@ const VTextField = genericComponent()({
10448
10479
  "class": "v-text-field__prefix"
10449
10480
  }, [createVNode("span", {
10450
10481
  "class": "v-text-field__prefix__text"
10451
- }, [props.prefix])]), createVNode("div", {
10482
+ }, [props.prefix])]), slots.default ? createVNode("div", {
10452
10483
  "class": fieldClass,
10453
10484
  "data-no-activator": ""
10454
- }, [slots.default ? createVNode(Fragment, null, [slots.default(), inputNode]) : cloneVNode(inputNode)]), props.suffix && createVNode("span", {
10485
+ }, [slots.default(), inputNode]) : cloneVNode(inputNode, {
10486
+ class: fieldClass
10487
+ }), props.suffix && createVNode("span", {
10455
10488
  "class": "v-text-field__suffix"
10456
10489
  }, [createVNode("span", {
10457
10490
  "class": "v-text-field__suffix__text"
@@ -10770,6 +10803,14 @@ function useScrolling(listRef, textFieldRef) {
10770
10803
  const makeSelectProps = propsFactory({
10771
10804
  chips: Boolean,
10772
10805
  closableChips: Boolean,
10806
+ closeText: {
10807
+ type: String,
10808
+ default: '$vuetify.close'
10809
+ },
10810
+ openText: {
10811
+ type: String,
10812
+ default: '$vuetify.open'
10813
+ },
10773
10814
  eager: Boolean,
10774
10815
  hideNoData: Boolean,
10775
10816
  hideSelected: Boolean,
@@ -10799,7 +10840,8 @@ const makeSelectProps = propsFactory({
10799
10840
  const makeVSelectProps = propsFactory({
10800
10841
  ...makeSelectProps(),
10801
10842
  ...omit(makeVTextFieldProps({
10802
- modelValue: null
10843
+ modelValue: null,
10844
+ role: 'button'
10803
10845
  }), ['validationValue', 'dirty', 'appendInnerIcon']),
10804
10846
  ...makeTransitionProps({
10805
10847
  transition: {
@@ -10824,6 +10866,7 @@ const VSelect = genericComponent()({
10824
10866
  } = useLocale();
10825
10867
  const vTextFieldRef = ref();
10826
10868
  const vMenuRef = ref();
10869
+ const vVirtualScrollRef = ref();
10827
10870
  const _menu = useProxiedModel(props, 'menu');
10828
10871
  const menu = computed({
10829
10872
  get: () => _menu.value,
@@ -10854,6 +10897,7 @@ const VSelect = genericComponent()({
10854
10897
  });
10855
10898
  const selected = computed(() => selections.value.map(selection => selection.props.value));
10856
10899
  const isFocused = shallowRef(false);
10900
+ const label = computed(() => menu.value ? props.closeText : props.openText);
10857
10901
  let keyboardLookupPrefix = '';
10858
10902
  let keyboardLookupLastTime;
10859
10903
  const displayItems = computed(() => {
@@ -10952,6 +10996,14 @@ const VSelect = genericComponent()({
10952
10996
  vTextFieldRef.value.value = '';
10953
10997
  }
10954
10998
  }
10999
+ watch(menu, () => {
11000
+ if (!props.hideSelected && menu.value && selections.value.length) {
11001
+ const index = displayItems.value.findIndex(item => selections.value.some(s => item.value === s.value));
11002
+ IN_BROWSER && window.requestAnimationFrame(() => {
11003
+ index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
11004
+ });
11005
+ }
11006
+ });
10955
11007
  useRender(() => {
10956
11008
  const hasChips = !!(props.chips || slots.chip);
10957
11009
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
@@ -10980,7 +11032,9 @@ const VSelect = genericComponent()({
10980
11032
  "onClick:clear": onClear,
10981
11033
  "onMousedown:control": onMousedownControl,
10982
11034
  "onBlur": onBlur,
10983
- "onKeydown": onKeydown
11035
+ "onKeydown": onKeydown,
11036
+ "aria-label": t(label.value),
11037
+ "title": t(label.value)
10984
11038
  }), {
10985
11039
  ...slots,
10986
11040
  default: () => createVNode(Fragment, null, [createVNode(VMenu, mergeProps({
@@ -11011,6 +11065,7 @@ const VSelect = genericComponent()({
11011
11065
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? createVNode(VListItem, {
11012
11066
  "title": t(props.noDataText)
11013
11067
  }, null)), createVNode(VVirtualScroll, {
11068
+ "ref": vVirtualScrollRef,
11014
11069
  "renderless": true,
11015
11070
  "items": displayItems.value
11016
11071
  }, {
@@ -11243,7 +11298,8 @@ const makeVAutocompleteProps = propsFactory({
11243
11298
  }),
11244
11299
  ...makeSelectProps(),
11245
11300
  ...omit(makeVTextFieldProps({
11246
- modelValue: null
11301
+ modelValue: null,
11302
+ role: 'combobox'
11247
11303
  }), ['validationValue', 'dirty', 'appendInnerIcon']),
11248
11304
  ...makeTransitionProps({
11249
11305
  transition: false
@@ -11270,6 +11326,7 @@ const VAutocomplete = genericComponent()({
11270
11326
  const isPristine = shallowRef(true);
11271
11327
  const listHasFocus = shallowRef(false);
11272
11328
  const vMenuRef = ref();
11329
+ const vVirtualScrollRef = ref();
11273
11330
  const _menu = useProxiedModel(props, 'menu');
11274
11331
  const menu = computed({
11275
11332
  get: () => _menu.value,
@@ -11280,6 +11337,7 @@ const VAutocomplete = genericComponent()({
11280
11337
  });
11281
11338
  const selectionIndex = shallowRef(-1);
11282
11339
  const color = computed(() => vTextFieldRef.value?.color);
11340
+ const label = computed(() => menu.value ? props.closeText : props.openText);
11283
11341
  const {
11284
11342
  items,
11285
11343
  transformIn,
@@ -11359,7 +11417,7 @@ const VAutocomplete = genericComponent()({
11359
11417
  menu.value = false;
11360
11418
  }
11361
11419
  if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key)) {
11362
- select(filteredItems.value[0]);
11420
+ select(displayItems.value[0]);
11363
11421
  }
11364
11422
  if (e.key === 'ArrowDown' && highlightFirst.value) {
11365
11423
  listRef.value?.focus('next');
@@ -11472,6 +11530,14 @@ const VAutocomplete = genericComponent()({
11472
11530
  if (val) menu.value = true;
11473
11531
  isPristine.value = !val;
11474
11532
  });
11533
+ watch(menu, () => {
11534
+ if (!props.hideSelected && menu.value && selections.value.length) {
11535
+ const index = displayItems.value.findIndex(item => selections.value.some(s => item.value === s.value));
11536
+ IN_BROWSER && window.requestAnimationFrame(() => {
11537
+ index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
11538
+ });
11539
+ }
11540
+ });
11475
11541
  useRender(() => {
11476
11542
  const hasChips = !!(props.chips || slots.chip);
11477
11543
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
@@ -11531,6 +11597,7 @@ const VAutocomplete = genericComponent()({
11531
11597
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? createVNode(VListItem, {
11532
11598
  "title": t(props.noDataText)
11533
11599
  }, null)), createVNode(VVirtualScroll, {
11600
+ "ref": vVirtualScrollRef,
11534
11601
  "renderless": true,
11535
11602
  "items": displayItems.value
11536
11603
  }, {
@@ -11627,7 +11694,9 @@ const VAutocomplete = genericComponent()({
11627
11694
  "class": "v-autocomplete__menu-icon",
11628
11695
  "icon": props.menuIcon,
11629
11696
  "onMousedown": onMousedownMenuIcon,
11630
- "onClick": noop
11697
+ "onClick": noop,
11698
+ "aria-label": t(label.value),
11699
+ "title": t(label.value)
11631
11700
  }, null) : undefined]);
11632
11701
  }
11633
11702
  });
@@ -14771,7 +14840,8 @@ const makeVComboboxProps = propsFactory({
14771
14840
  returnObject: true
14772
14841
  }),
14773
14842
  ...omit(makeVTextFieldProps({
14774
- modelValue: null
14843
+ modelValue: null,
14844
+ role: 'combobox'
14775
14845
  }), ['validationValue', 'dirty', 'appendInnerIcon']),
14776
14846
  ...makeTransitionProps({
14777
14847
  transition: false
@@ -14799,6 +14869,7 @@ const VCombobox = genericComponent()({
14799
14869
  const isPristine = shallowRef(true);
14800
14870
  const listHasFocus = shallowRef(false);
14801
14871
  const vMenuRef = ref();
14872
+ const vVirtualScrollRef = ref();
14802
14873
  const _menu = useProxiedModel(props, 'menu');
14803
14874
  const menu = computed({
14804
14875
  get: () => _menu.value,
@@ -14810,6 +14881,7 @@ const VCombobox = genericComponent()({
14810
14881
  const selectionIndex = shallowRef(-1);
14811
14882
  let cleared = false;
14812
14883
  const color = computed(() => vTextFieldRef.value?.color);
14884
+ const label = computed(() => menu.value ? props.closeText : props.openText);
14813
14885
  const {
14814
14886
  items,
14815
14887
  transformIn,
@@ -15031,6 +15103,14 @@ const VCombobox = genericComponent()({
15031
15103
  search.value = '';
15032
15104
  }
15033
15105
  });
15106
+ watch(menu, () => {
15107
+ if (!props.hideSelected && menu.value && selections.value.length) {
15108
+ const index = displayItems.value.findIndex(item => selections.value.some(s => item.value === s.value));
15109
+ IN_BROWSER && window.requestAnimationFrame(() => {
15110
+ index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
15111
+ });
15112
+ }
15113
+ });
15034
15114
  useRender(() => {
15035
15115
  const hasChips = !!(props.chips || slots.chip);
15036
15116
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
@@ -15089,6 +15169,7 @@ const VCombobox = genericComponent()({
15089
15169
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? createVNode(VListItem, {
15090
15170
  "title": t(props.noDataText)
15091
15171
  }, null)), createVNode(VVirtualScroll, {
15172
+ "ref": vVirtualScrollRef,
15092
15173
  "renderless": true,
15093
15174
  "items": displayItems.value
15094
15175
  }, {
@@ -15185,7 +15266,9 @@ const VCombobox = genericComponent()({
15185
15266
  "class": "v-combobox__menu-icon",
15186
15267
  "icon": props.menuIcon,
15187
15268
  "onMousedown": onMousedownMenuIcon,
15188
- "onClick": noop
15269
+ "onClick": noop,
15270
+ "aria-label": t(label.value),
15271
+ "title": t(label.value)
15189
15272
  }, null) : undefined]);
15190
15273
  }
15191
15274
  });
@@ -17478,7 +17561,7 @@ const VRadioGroup = genericComponent()({
17478
17561
  const id = computed(() => props.id || `radio-group-${uid}`);
17479
17562
  const model = useProxiedModel(props, 'modelValue');
17480
17563
  useRender(() => {
17481
- const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
17564
+ const [rootAttrs, controlAttrs] = filterInputAttrs(attrs);
17482
17565
  const [inputProps, _1] = VInput.filterProps(props);
17483
17566
  const [controlProps, _2] = VSelectionControl.filterProps(props);
17484
17567
  const label = slots.label ? slots.label({
@@ -17490,7 +17573,7 @@ const VRadioGroup = genericComponent()({
17490
17573
  return createVNode(VInput, mergeProps({
17491
17574
  "class": ['v-radio-group', props.class],
17492
17575
  "style": props.style
17493
- }, inputAttrs, inputProps, {
17576
+ }, rootAttrs, inputProps, {
17494
17577
  "modelValue": model.value,
17495
17578
  "onUpdate:modelValue": $event => model.value = $event,
17496
17579
  "id": id.value
@@ -18467,6 +18550,7 @@ const VSwitch = genericComponent()({
18467
18550
  focus,
18468
18551
  blur
18469
18552
  } = useFocus(props);
18553
+ const control = ref();
18470
18554
  const loaderColor = computed(() => {
18471
18555
  return typeof props.loading === 'string' && props.loading !== '' ? props.loading : props.color;
18472
18556
  });
@@ -18477,16 +18561,15 @@ const VSwitch = genericComponent()({
18477
18561
  indeterminate.value = false;
18478
18562
  }
18479
18563
  }
18564
+ function onTrackClick(e) {
18565
+ e.stopPropagation();
18566
+ e.preventDefault();
18567
+ control.value?.input?.click();
18568
+ }
18480
18569
  useRender(() => {
18481
- const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
18570
+ const [rootAttrs, controlAttrs] = filterInputAttrs(attrs);
18482
18571
  const [inputProps, _1] = VInput.filterProps(props);
18483
18572
  const [controlProps, _2] = VSelectionControl.filterProps(props);
18484
- const control = ref();
18485
- function onClick(e) {
18486
- e.stopPropagation();
18487
- e.preventDefault();
18488
- control.value?.input?.click();
18489
- }
18490
18573
  return createVNode(VInput, mergeProps({
18491
18574
  "class": ['v-switch', {
18492
18575
  'v-switch--inset': props.inset
@@ -18494,7 +18577,7 @@ const VSwitch = genericComponent()({
18494
18577
  'v-switch--indeterminate': indeterminate.value
18495
18578
  }, loaderClasses.value, props.class],
18496
18579
  "style": props.style
18497
- }, inputAttrs, inputProps, {
18580
+ }, rootAttrs, inputProps, {
18498
18581
  "id": id.value,
18499
18582
  "focused": isFocused.value
18500
18583
  }), {
@@ -18524,29 +18607,36 @@ const VSwitch = genericComponent()({
18524
18607
  ...slots,
18525
18608
  default: () => createVNode("div", {
18526
18609
  "class": "v-switch__track",
18527
- "onClick": onClick
18610
+ "onClick": onTrackClick
18528
18611
  }, null),
18529
18612
  input: _ref3 => {
18530
18613
  let {
18531
- textColorClasses,
18532
- textColorStyles
18614
+ inputNode,
18615
+ icon
18533
18616
  } = _ref3;
18534
- return createVNode("div", {
18535
- "class": ['v-switch__thumb', textColorClasses.value],
18536
- "style": textColorStyles.value
18537
- }, [props.loading && createVNode(LoaderSlot, {
18538
- "name": "v-switch",
18539
- "active": true,
18540
- "color": isValid.value === false ? undefined : loaderColor.value
18541
- }, {
18542
- default: slotProps => slots.loader ? slots.loader(slotProps) : createVNode(VProgressCircular, {
18543
- "active": slotProps.isActive,
18544
- "color": slotProps.color,
18545
- "indeterminate": true,
18546
- "size": "16",
18547
- "width": "2"
18548
- }, null)
18549
- })]);
18617
+ return createVNode(Fragment, null, [inputNode, createVNode("div", {
18618
+ "class": ['v-switch__thumb', {
18619
+ 'v-switch__thumb--filled': icon || props.loading
18620
+ }]
18621
+ }, [createVNode(VScaleTransition, null, {
18622
+ default: () => [!props.loading ? icon && createVNode(VIcon, {
18623
+ "key": icon,
18624
+ "icon": icon,
18625
+ "size": "x-small"
18626
+ }, null) : createVNode(LoaderSlot, {
18627
+ "name": "v-switch",
18628
+ "active": true,
18629
+ "color": isValid.value === false ? undefined : loaderColor.value
18630
+ }, {
18631
+ default: slotProps => slots.loader ? slots.loader(slotProps) : createVNode(VProgressCircular, {
18632
+ "active": slotProps.isActive,
18633
+ "color": slotProps.color,
18634
+ "indeterminate": true,
18635
+ "size": "16",
18636
+ "width": "2"
18637
+ }, null)
18638
+ })]
18639
+ })])]);
18550
18640
  }
18551
18641
  });
18552
18642
  }
@@ -19027,8 +19117,7 @@ const VTextarea = genericComponent()({
19027
19117
  "onMousedown": onControlMousedown,
19028
19118
  "onClick:clear": onClear,
19029
19119
  "onClick:prependInner": props['onClick:prependInner'],
19030
- "onClick:appendInner": props['onClick:appendInner'],
19031
- "role": "textbox"
19120
+ "onClick:appendInner": props['onClick:appendInner']
19032
19121
  }, fieldProps, {
19033
19122
  "active": isActive.value || isDirty.value,
19034
19123
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
@@ -20289,7 +20378,7 @@ function createVuetify$1() {
20289
20378
  date
20290
20379
  };
20291
20380
  }
20292
- const version$1 = "3.3.12";
20381
+ const version$1 = "3.3.14";
20293
20382
  createVuetify$1.version = version$1;
20294
20383
 
20295
20384
  // Vue's inject() can only be used in setup
@@ -20314,7 +20403,7 @@ const createVuetify = function () {
20314
20403
  ...options
20315
20404
  });
20316
20405
  };
20317
- const version = "3.3.12";
20406
+ const version = "3.3.14";
20318
20407
  createVuetify.version = version;
20319
20408
 
20320
20409
  export { components, createVuetify, directives, useDefaults, useDisplay, useLayout, useLocale, useRtl, useTheme, version };