@vuetify/nightly 3.8.9-master.2025-06-14 → 3.8.10-dev.2025-06-18

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 (231) hide show
  1. package/CHANGELOG.md +46 -14
  2. package/dist/json/attributes.json +3541 -3137
  3. package/dist/json/importMap-labs.json +30 -26
  4. package/dist/json/importMap.json +174 -174
  5. package/dist/json/tags.json +108 -2
  6. package/dist/json/web-types.json +7295 -5648
  7. package/dist/vuetify-labs.cjs +795 -198
  8. package/dist/vuetify-labs.css +4855 -4806
  9. package/dist/vuetify-labs.d.ts +10430 -3099
  10. package/dist/vuetify-labs.esm.js +796 -199
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +795 -198
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +520 -183
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +2398 -2349
  17. package/dist/vuetify.d.ts +2798 -2091
  18. package/dist/vuetify.esm.js +521 -184
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +520 -183
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1257 -1234
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +6 -1
  26. package/lib/components/VAlert/VAlert.d.ts +35 -0
  27. package/lib/components/VAlert/VAlert.js +15 -10
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +7 -1
  30. package/lib/components/VAppBar/VAppBar.d.ts +15 -3
  31. package/lib/components/VAppBar/VAppBarNavIcon.d.ts +20 -10
  32. package/lib/components/VAutocomplete/VAutocomplete.d.ts +175 -110
  33. package/lib/components/VAutocomplete/VAutocomplete.js +21 -3
  34. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  35. package/lib/components/VBadge/VBadge.d.ts +60 -0
  36. package/lib/components/VBadge/VBadge.js +7 -2
  37. package/lib/components/VBadge/VBadge.js.map +1 -1
  38. package/lib/components/VBtn/VBtn.css +3 -0
  39. package/lib/components/VBtn/VBtn.d.ts +20 -10
  40. package/lib/components/VBtn/VBtn.sass +3 -0
  41. package/lib/components/VBtnGroup/VBtnGroup.css +32 -8
  42. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  43. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  44. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  45. package/lib/components/VBtnGroup/VBtnGroup.sass +46 -18
  46. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  47. package/lib/components/VCard/VCard.d.ts +20 -10
  48. package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
  49. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
  50. package/lib/components/VChip/VChip.d.ts +20 -10
  51. package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
  52. package/lib/components/VCombobox/VCombobox.d.ts +175 -110
  53. package/lib/components/VCombobox/VCombobox.js +22 -3
  54. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  55. package/lib/components/VDataTable/VDataTable.d.ts +60 -0
  56. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  57. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  58. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  59. package/lib/components/VDataTable/VDataTableServer.d.ts +42 -0
  60. package/lib/components/VDataTable/VDataTableVirtual.d.ts +42 -0
  61. package/lib/components/VDatePicker/VDatePicker.d.ts +80 -5
  62. package/lib/components/VDatePicker/VDatePicker.js +10 -4
  63. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  64. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  65. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  66. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  67. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
  68. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
  69. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
  70. package/lib/components/VFab/VFab.d.ts +20 -10
  71. package/lib/components/VField/VField.d.ts +3 -3
  72. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  73. package/lib/components/VInfiniteScroll/VInfiniteScroll.d.ts +9 -3
  74. package/lib/components/VInfiniteScroll/VInfiniteScroll.js +29 -0
  75. package/lib/components/VInfiniteScroll/VInfiniteScroll.js.map +1 -1
  76. package/lib/components/VInput/VInput.d.ts +4 -4
  77. package/lib/components/VKbd/VKbd.css +13 -2
  78. package/lib/components/VKbd/VKbd.d.ts +221 -0
  79. package/lib/components/VKbd/VKbd.js +55 -0
  80. package/lib/components/VKbd/VKbd.js.map +1 -0
  81. package/lib/components/VKbd/VKbd.sass +2 -1
  82. package/lib/components/VKbd/_variables.scss +12 -1
  83. package/lib/components/VKbd/index.d.ts +1 -95
  84. package/lib/components/VKbd/index.js +1 -4
  85. package/lib/components/VKbd/index.js.map +1 -1
  86. package/lib/components/VList/VList.d.ts +13 -0
  87. package/lib/components/VList/VList.js +4 -1
  88. package/lib/components/VList/VList.js.map +1 -1
  89. package/lib/components/VList/VListChildren.js +4 -3
  90. package/lib/components/VList/VListChildren.js.map +1 -1
  91. package/lib/components/VList/VListGroup.d.ts +10 -0
  92. package/lib/components/VList/VListGroup.js +2 -2
  93. package/lib/components/VList/VListGroup.js.map +1 -1
  94. package/lib/components/VList/VListItem.d.ts +28 -10
  95. package/lib/components/VList/VListItem.js +7 -3
  96. package/lib/components/VList/VListItem.js.map +1 -1
  97. package/lib/components/VList/list.d.ts +9 -2
  98. package/lib/components/VList/list.js +7 -0
  99. package/lib/components/VList/list.js.map +1 -1
  100. package/lib/components/VMenu/VMenu.d.ts +13 -0
  101. package/lib/components/VMenu/VMenu.js +2 -1
  102. package/lib/components/VMenu/VMenu.js.map +1 -1
  103. package/lib/components/VNumberInput/VNumberInput.d.ts +114 -89
  104. package/lib/components/VNumberInput/VNumberInput.js +43 -20
  105. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  106. package/lib/components/VOtpInput/VOtpInput.js +19 -2
  107. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  108. package/lib/components/VOverlay/VOverlay.css +1 -1
  109. package/lib/components/VOverlay/_variables.scss +1 -1
  110. package/lib/components/VRadio/VRadio.d.ts +20 -10
  111. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  112. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  113. package/lib/components/VSelect/VSelect.d.ts +204 -118
  114. package/lib/components/VSelect/VSelect.js +21 -3
  115. package/lib/components/VSelect/VSelect.js.map +1 -1
  116. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  117. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  118. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  119. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  120. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  121. package/lib/components/VSlider/VSlider.d.ts +3 -3
  122. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  123. package/lib/components/VSpeedDial/VSpeedDial.d.ts +13 -0
  124. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  125. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  126. package/lib/components/VTable/VTable.css +6 -0
  127. package/lib/components/VTable/VTable.d.ts +55 -24
  128. package/lib/components/VTable/VTable.js +9 -2
  129. package/lib/components/VTable/VTable.js.map +1 -1
  130. package/lib/components/VTable/VTable.sass +14 -0
  131. package/lib/components/VTable/_variables.scss +1 -0
  132. package/lib/components/VTabs/VTab.d.ts +56 -28
  133. package/lib/components/VTabs/VTabs.d.ts +10 -0
  134. package/lib/components/VTextField/VTextField.d.ts +27 -27
  135. package/lib/components/VTextField/VTextField.js +4 -4
  136. package/lib/components/VTextField/VTextField.js.map +1 -1
  137. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  138. package/lib/components/VTextarea/VTextarea.js +4 -4
  139. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  140. package/lib/components/VToolbar/VToolbar.d.ts +15 -3
  141. package/lib/components/VToolbar/VToolbar.js +6 -3
  142. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  143. package/lib/composables/autofocus.d.ts +7 -0
  144. package/lib/composables/autofocus.js +10 -0
  145. package/lib/composables/autofocus.js.map +1 -0
  146. package/lib/composables/calendar.d.ts +5 -0
  147. package/lib/composables/calendar.js +2 -1
  148. package/lib/composables/calendar.js.map +1 -1
  149. package/lib/composables/date/DateAdapter.d.ts +3 -3
  150. package/lib/composables/date/DateAdapter.js.map +1 -1
  151. package/lib/composables/date/adapters/string.d.ts +54 -0
  152. package/lib/composables/date/adapters/string.js +153 -0
  153. package/lib/composables/date/adapters/string.js.map +1 -0
  154. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  155. package/lib/composables/date/adapters/vuetify.js +4 -4
  156. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  157. package/lib/composables/date/date.d.ts +3 -3
  158. package/lib/composables/date/index.d.ts +1 -0
  159. package/lib/composables/date/index.js +1 -0
  160. package/lib/composables/date/index.js.map +1 -1
  161. package/lib/composables/filter.js +3 -0
  162. package/lib/composables/filter.js.map +1 -1
  163. package/lib/composables/group.js +1 -0
  164. package/lib/composables/group.js.map +1 -1
  165. package/lib/composables/iconSizes.d.ts +28 -0
  166. package/lib/composables/iconSizes.js +23 -0
  167. package/lib/composables/iconSizes.js.map +1 -0
  168. package/lib/composables/intersectionObserver.js +2 -2
  169. package/lib/composables/intersectionObserver.js.map +1 -1
  170. package/lib/composables/locale.d.ts +5 -1
  171. package/lib/composables/locale.js.map +1 -1
  172. package/lib/composables/mask.d.ts +38 -0
  173. package/lib/composables/mask.js +183 -0
  174. package/lib/composables/mask.js.map +1 -0
  175. package/lib/composables/selectLink.js +2 -2
  176. package/lib/composables/selectLink.js.map +1 -1
  177. package/lib/composables/theme.d.ts +6 -1
  178. package/lib/composables/theme.js +97 -29
  179. package/lib/composables/theme.js.map +1 -1
  180. package/lib/composables/virtual.js +6 -1
  181. package/lib/composables/virtual.js.map +1 -1
  182. package/lib/directives/ripple/index.d.ts +2 -1
  183. package/lib/directives/ripple/index.js +12 -7
  184. package/lib/directives/ripple/index.js.map +1 -1
  185. package/lib/entry-bundler.d.ts +4 -3
  186. package/lib/entry-bundler.js +1 -1
  187. package/lib/entry-bundler.js.map +1 -1
  188. package/lib/framework.d.ts +92 -73
  189. package/lib/framework.js +1 -1
  190. package/lib/framework.js.map +1 -1
  191. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  192. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  193. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  194. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  195. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  196. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  197. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  198. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  199. package/lib/labs/VMaskInput/VMaskInput.d.ts +6993 -0
  200. package/lib/labs/VMaskInput/VMaskInput.js +67 -0
  201. package/lib/labs/VMaskInput/VMaskInput.js.map +1 -0
  202. package/lib/labs/VMaskInput/index.d.ts +1 -0
  203. package/lib/labs/VMaskInput/index.js +2 -0
  204. package/lib/labs/VMaskInput/index.js.map +1 -0
  205. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  206. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  207. package/lib/labs/VTreeview/VTreeview.d.ts +51 -38
  208. package/lib/labs/VTreeview/VTreeview.js +1 -1
  209. package/lib/labs/VTreeview/VTreeview.js.map +1 -1
  210. package/lib/labs/VTreeview/VTreeviewChildren.d.ts +35 -0
  211. package/lib/labs/VTreeview/VTreeviewChildren.js +21 -3
  212. package/lib/labs/VTreeview/VTreeviewChildren.js.map +1 -1
  213. package/lib/labs/VTreeview/VTreeviewGroup.d.ts +10 -0
  214. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  215. package/lib/labs/VTreeview/VTreeviewItem.js +1 -0
  216. package/lib/labs/VTreeview/VTreeviewItem.js.map +1 -1
  217. package/lib/labs/components.d.ts +1 -0
  218. package/lib/labs/components.js +1 -0
  219. package/lib/labs/components.js.map +1 -1
  220. package/lib/labs/entry-bundler.d.ts +4 -3
  221. package/lib/locale/adapters/vue-i18n.js +6 -1
  222. package/lib/locale/adapters/vue-i18n.js.map +1 -1
  223. package/lib/locale/adapters/vuetify.js +7 -1
  224. package/lib/locale/adapters/vuetify.js.map +1 -1
  225. package/lib/util/globals.d.ts +1 -0
  226. package/lib/util/globals.js +1 -0
  227. package/lib/util/globals.js.map +1 -1
  228. package/lib/util/helpers.d.ts +2 -1
  229. package/lib/util/helpers.js +12 -7
  230. package/lib/util/helpers.js.map +1 -1
  231. package/package.json +9 -7
@@ -1,15 +1,16 @@
1
1
  /*!
2
- * Vuetify v3.8.9-master.2025-06-14
2
+ * Vuetify v3.8.10-dev.2025-06-18
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, camelize, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, createVNode, mergeProps, createElementVNode, normalizeClass, toValue, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, normalizeStyle, TransitionGroup, Transition, toRefs, isRef, onBeforeMount, nextTick, withDirectives, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, normalizeProps, guardReactiveProps, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
7
+ import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, camelize, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, createVNode, mergeProps, createElementVNode, normalizeClass, toValue, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, getCurrentScope, normalizeStyle, TransitionGroup, Transition, toRefs, isRef, onBeforeMount, nextTick, withDirectives, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, normalizeProps, guardReactiveProps, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
8
8
 
9
9
  const IN_BROWSER = typeof window !== 'undefined';
10
10
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
11
11
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
12
12
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
13
+ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
13
14
 
14
15
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
15
16
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -510,18 +511,23 @@ function checkPrintable(e) {
510
511
  function isPrimitive(value) {
511
512
  return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint';
512
513
  }
513
- function extractNumber(text, decimalDigitsLimit) {
514
- const cleanText = text.split('').filter(x => /[\d\-.]/.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
514
+ function escapeForRegex(sign) {
515
+ return '\\^$*+?.()|{}[]'.includes(sign) ? `\\${sign}` : sign;
516
+ }
517
+ function extractNumber(text, decimalDigitsLimit, decimalSeparator) {
518
+ const onlyValidCharacters = new RegExp(`[\\d\\-${escapeForRegex(decimalSeparator)}]`);
519
+ const cleanText = text.split('').filter(x => onlyValidCharacters.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
515
520
  // sign allowed at the start
516
- x === '.' && i === all.indexOf('.') ||
521
+ x === decimalSeparator && i === all.indexOf(x) ||
517
522
  // decimal separator allowed only once
518
523
  /\d/.test(x)).join('');
519
524
  if (decimalDigitsLimit === 0) {
520
- return cleanText.split('.')[0];
525
+ return cleanText.split(decimalSeparator)[0];
521
526
  }
522
- if (decimalDigitsLimit !== null && /\.\d/.test(cleanText)) {
523
- const parts = cleanText.split('.');
524
- return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join('.');
527
+ const decimalPart = new RegExp(`${escapeForRegex(decimalSeparator)}\\d`);
528
+ if (decimalDigitsLimit !== null && decimalPart.test(cleanText)) {
529
+ const parts = cleanText.split(decimalSeparator);
530
+ return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join(decimalSeparator);
525
531
  }
526
532
  return cleanText;
527
533
  }
@@ -863,7 +869,7 @@ function APCAcontrast(text, background) {
863
869
  // WoB should always return negative value.
864
870
 
865
871
  const SAPC = (Ybg ** revBG - Ytxt ** revTXT) * scaleWoB;
866
- outputContrast = SAPC > -1e-3 ? 0.0 : SAPC > -0.078 ? SAPC - SAPC * loConFactor * loConOffset : SAPC + loConOffset;
872
+ outputContrast = SAPC > -loClip ? 0.0 : SAPC > -loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC + loConOffset;
867
873
  }
868
874
  return outputContrast * 100;
869
875
  }
@@ -2668,6 +2674,10 @@ function createNumberFunction(current, fallback) {
2668
2674
  return numberFormat.format(value);
2669
2675
  };
2670
2676
  }
2677
+ function inferDecimalSeparator(current, fallback) {
2678
+ const format = createNumberFunction(current, fallback);
2679
+ return format(0.1).includes(',') ? ',' : '.';
2680
+ }
2671
2681
  function useProvided(props, prop, provided) {
2672
2682
  const internal = useProxiedModel(props, prop, props[prop] ?? provided.value);
2673
2683
 
@@ -2690,6 +2700,7 @@ function createProvideFunction(state) {
2690
2700
  current,
2691
2701
  fallback,
2692
2702
  messages,
2703
+ decimalSeparator: toRef(() => inferDecimalSeparator(current, fallback)),
2693
2704
  t: createTranslateFunction(current, fallback, messages),
2694
2705
  n: createNumberFunction(current, fallback),
2695
2706
  provide: createProvideFunction({
@@ -2712,6 +2723,7 @@ function createVuetifyAdapter(options) {
2712
2723
  current,
2713
2724
  fallback,
2714
2725
  messages,
2726
+ decimalSeparator: toRef(() => options?.decimalSeparator ?? inferDecimalSeparator(current, fallback)),
2715
2727
  t: createTranslateFunction(current, fallback, messages),
2716
2728
  n: createNumberFunction(current, fallback),
2717
2729
  provide: createProvideFunction({
@@ -2838,6 +2850,7 @@ const makeThemeProps = propsFactory({
2838
2850
  function genDefaults$1() {
2839
2851
  return {
2840
2852
  defaultTheme: 'light',
2853
+ prefix: 'v-',
2841
2854
  variations: {
2842
2855
  colors: [],
2843
2856
  lighten: 0,
@@ -2875,8 +2888,8 @@ function genDefaults$1() {
2875
2888
  'activated-opacity': 0.12,
2876
2889
  'pressed-opacity': 0.12,
2877
2890
  'dragged-opacity': 0.08,
2878
- 'theme-kbd': '#212529',
2879
- 'theme-on-kbd': '#FFFFFF',
2891
+ 'theme-kbd': '#EEEEEE',
2892
+ 'theme-on-kbd': '#000000',
2880
2893
  'theme-code': '#F5F5F5',
2881
2894
  'theme-on-code': '#000000'
2882
2895
  }
@@ -2912,14 +2925,17 @@ function genDefaults$1() {
2912
2925
  'activated-opacity': 0.12,
2913
2926
  'pressed-opacity': 0.16,
2914
2927
  'dragged-opacity': 0.08,
2915
- 'theme-kbd': '#212529',
2928
+ 'theme-kbd': '#424242',
2916
2929
  'theme-on-kbd': '#FFFFFF',
2917
2930
  'theme-code': '#343434',
2918
2931
  'theme-on-code': '#CCCCCC'
2919
2932
  }
2920
2933
  }
2921
2934
  },
2922
- stylesheetId: 'vuetify-theme-stylesheet'
2935
+ stylesheetId: 'vuetify-theme-stylesheet',
2936
+ scoped: false,
2937
+ unimportant: false,
2938
+ utilities: true
2923
2939
  };
2924
2940
  }
2925
2941
  function parseThemeOptions() {
@@ -2942,21 +2958,21 @@ function parseThemeOptions() {
2942
2958
  function createCssClass(lines, selector, content, scope) {
2943
2959
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2944
2960
  }
2945
- function genCssVariables(theme) {
2961
+ function genCssVariables(theme, prefix) {
2946
2962
  const lightOverlay = theme.dark ? 2 : 1;
2947
2963
  const darkOverlay = theme.dark ? 1 : 2;
2948
2964
  const variables = [];
2949
2965
  for (const [key, value] of Object.entries(theme.colors)) {
2950
2966
  const rgb = parseColor(value);
2951
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2967
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2952
2968
  if (!key.startsWith('on-')) {
2953
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2969
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2954
2970
  }
2955
2971
  }
2956
2972
  for (const [key, value] of Object.entries(theme.variables)) {
2957
2973
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2958
2974
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2959
- variables.push(`--v-${key}: ${rgb ?? value}`);
2975
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2960
2976
  }
2961
2977
  return variables;
2962
2978
  }
@@ -3000,7 +3016,8 @@ function getScopedSelector(selector, scope) {
3000
3016
  const scopeSelector = `:where(${scope})`;
3001
3017
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
3002
3018
  }
3003
- function upsertStyles(styleEl, styles) {
3019
+ function upsertStyles(id, cspNonce, styles) {
3020
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
3004
3021
  if (!styleEl) return;
3005
3022
  styleEl.innerHTML = styles;
3006
3023
  }
@@ -3020,8 +3037,17 @@ function getOrCreateStyleElement(id, cspNonce) {
3020
3037
  // Composables
3021
3038
  function createTheme(options) {
3022
3039
  const parsedOptions = parseThemeOptions(options);
3023
- const name = shallowRef(parsedOptions.defaultTheme);
3040
+ const _name = shallowRef(parsedOptions.defaultTheme);
3024
3041
  const themes = ref(parsedOptions.themes);
3042
+ const systemName = shallowRef('light');
3043
+ const name = computed({
3044
+ get() {
3045
+ return _name.value === 'system' ? systemName.value : _name.value;
3046
+ },
3047
+ set(val) {
3048
+ _name.value = val;
3049
+ }
3050
+ });
3025
3051
  const computedThemes = computed(() => {
3026
3052
  const acc = {};
3027
3053
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3042,28 +3068,49 @@ function createTheme(options) {
3042
3068
  const current = toRef(() => computedThemes.value[name.value]);
3043
3069
  const styles = computed(() => {
3044
3070
  const lines = [];
3071
+ const important = parsedOptions.unimportant ? '' : ' !important';
3072
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3045
3073
  if (current.value?.dark) {
3046
3074
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3047
3075
  }
3048
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3076
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3049
3077
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
3050
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
3051
- }
3052
- const bgLines = [];
3053
- const fgLines = [];
3054
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3055
- for (const key of colors) {
3056
- if (key.startsWith('on-')) {
3057
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3058
- } else {
3059
- createCssClass(bgLines, `.bg-${key}`, [`--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--v-theme-${key})) !important`, `color: rgb(var(--v-theme-on-${key})) !important`], parsedOptions.scope);
3060
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3061
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3078
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3079
+ }
3080
+ if (parsedOptions.utilities) {
3081
+ const bgLines = [];
3082
+ const fgLines = [];
3083
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3084
+ for (const key of colors) {
3085
+ if (key.startsWith('on-')) {
3086
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3087
+ } else {
3088
+ createCssClass(bgLines, `.${scoped}bg-${key}`, [`--${parsedOptions.prefix}theme-overlay-multiplier: var(--${parsedOptions.prefix}theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`, `color: rgb(var(--${parsedOptions.prefix}theme-on-${key}))${important}`], parsedOptions.scope);
3089
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3090
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3091
+ }
3062
3092
  }
3093
+ lines.push(...bgLines, ...fgLines);
3063
3094
  }
3064
- lines.push(...bgLines, ...fgLines);
3065
3095
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3066
3096
  });
3097
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3098
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
3099
+ if (SUPPORTS_MATCH_MEDIA) {
3100
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3101
+ function updateSystemName() {
3102
+ systemName.value = media.matches ? 'dark' : 'light';
3103
+ }
3104
+ updateSystemName();
3105
+ media.addEventListener('change', updateSystemName, {
3106
+ passive: true
3107
+ });
3108
+ if (getCurrentScope()) {
3109
+ onScopeDispose(() => {
3110
+ media.removeEventListener('change', updateSystemName);
3111
+ });
3112
+ }
3113
+ }
3067
3114
  function install(app) {
3068
3115
  if (parsedOptions.isDisabled) return;
3069
3116
  const head = app._context.provides.usehead;
@@ -3101,22 +3148,55 @@ function createTheme(options) {
3101
3148
  updateStyles();
3102
3149
  }
3103
3150
  function updateStyles() {
3104
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3151
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3105
3152
  }
3106
3153
  }
3107
3154
  }
3108
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3155
+ function change(themeName) {
3156
+ if (!themeNames.value.includes(themeName)) {
3157
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3158
+ return;
3159
+ }
3160
+ name.value = themeName;
3161
+ }
3162
+ function cycle() {
3163
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3164
+ const currentIndex = themeArray.indexOf(name.value);
3165
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3166
+ change(themeArray[nextIndex]);
3167
+ }
3168
+ function toggle() {
3169
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3170
+ cycle(themeArray);
3171
+ }
3172
+ const globalName = new Proxy(name, {
3173
+ get(target, prop) {
3174
+ return target[prop];
3175
+ },
3176
+ set(target, prop, val) {
3177
+ if (prop === 'value') {
3178
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3179
+ }
3180
+ // @ts-expect-error
3181
+ target[prop] = val;
3182
+ return true;
3183
+ }
3184
+ });
3109
3185
  return {
3110
3186
  install,
3187
+ change,
3188
+ cycle,
3189
+ toggle,
3111
3190
  isDisabled: parsedOptions.isDisabled,
3112
3191
  name,
3113
3192
  themes,
3114
3193
  current,
3115
3194
  computedThemes,
3195
+ prefix: parsedOptions.prefix,
3116
3196
  themeClasses,
3117
3197
  styles,
3118
3198
  global: {
3119
- name,
3199
+ name: globalName,
3120
3200
  current
3121
3201
  }
3122
3202
  };
@@ -3127,7 +3207,7 @@ function provideTheme(props) {
3127
3207
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3128
3208
  const name = toRef(() => props.theme ?? theme.name.value);
3129
3209
  const current = toRef(() => theme.themes.value[name.value]);
3130
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3210
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3131
3211
  const newTheme = {
3132
3212
  ...theme,
3133
3213
  name,
@@ -4231,7 +4311,10 @@ const makeVToolbarProps = propsFactory({
4231
4311
  default: 'default',
4232
4312
  validator: v => allowedDensities$1.includes(v)
4233
4313
  },
4234
- extended: Boolean,
4314
+ extended: {
4315
+ type: Boolean,
4316
+ default: null
4317
+ },
4235
4318
  extensionHeight: {
4236
4319
  type: [Number, String],
4237
4320
  default: 48
@@ -4279,7 +4362,7 @@ const VToolbar = genericComponent()({
4279
4362
  const {
4280
4363
  rtlClasses
4281
4364
  } = useRtl();
4282
- const isExtended = shallowRef(!!(props.extended || slots.extension?.()));
4365
+ const isExtended = shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
4283
4366
  const contentHeight = computed(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10));
4284
4367
  const extensionHeight = computed(() => isExtended.value ? parseInt(Number(props.extensionHeight) + (props.density === 'prominent' ? Number(props.extensionHeight) : 0) - (props.density === 'comfortable' ? 4 : 0) - (props.density === 'compact' ? 8 : 0), 10) : 0);
4285
4368
  provideDefaults({
@@ -4291,7 +4374,7 @@ const VToolbar = genericComponent()({
4291
4374
  const hasTitle = !!(props.title || slots.title);
4292
4375
  const hasImage = !!(slots.image || props.image);
4293
4376
  const extension = slots.extension?.();
4294
- isExtended.value = !!(props.extended || extension);
4377
+ isExtended.value = props.extended === null ? !!extension : props.extended;
4295
4378
  return createVNode(props.tag, {
4296
4379
  "class": normalizeClass(['v-toolbar', {
4297
4380
  'v-toolbar--absolute': props.absolute,
@@ -4674,9 +4757,15 @@ function useVariant(props) {
4674
4757
  };
4675
4758
  }
4676
4759
 
4760
+ // Types
4761
+
4677
4762
  const makeVBtnGroupProps = propsFactory({
4678
4763
  baseColor: String,
4679
4764
  divided: Boolean,
4765
+ direction: {
4766
+ type: String,
4767
+ default: 'horizontal'
4768
+ },
4680
4769
  ...makeBorderProps(),
4681
4770
  ...makeComponentProps(),
4682
4771
  ...makeDensityProps(),
@@ -4710,7 +4799,7 @@ const VBtnGroup = genericComponent()({
4710
4799
  } = useRounded(props);
4711
4800
  provideDefaults({
4712
4801
  VBtn: {
4713
- height: 'auto',
4802
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4714
4803
  baseColor: toRef(() => props.baseColor),
4715
4804
  color: toRef(() => props.color),
4716
4805
  density: toRef(() => props.density),
@@ -4720,7 +4809,7 @@ const VBtnGroup = genericComponent()({
4720
4809
  });
4721
4810
  useRender(() => {
4722
4811
  return createVNode(props.tag, {
4723
- "class": normalizeClass(['v-btn-group', {
4812
+ "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4724
4813
  'v-btn-group--divided': props.divided
4725
4814
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4726
4815
  "style": normalizeStyle(props.style)
@@ -4887,6 +4976,7 @@ function useGroup(props, injectKey) {
4887
4976
  } else {
4888
4977
  const isSelected = selected.value.includes(id);
4889
4978
  if (props.mandatory && isSelected) return;
4979
+ if (!isSelected && !value) return;
4890
4980
  selected.value = value ?? !isSelected ? [id] : [];
4891
4981
  }
4892
4982
  }
@@ -5112,7 +5202,7 @@ function useIntersectionObserver(callback, options) {
5112
5202
  const observer = new IntersectionObserver(entries => {
5113
5203
  isIntersecting.value = !!entries.find(entry => entry.isIntersecting);
5114
5204
  }, options);
5115
- onBeforeUnmount(() => {
5205
+ onScopeDispose(() => {
5116
5206
  observer.disconnect();
5117
5207
  });
5118
5208
  watch(intersectionRef, (newValue, oldValue) => {
@@ -5643,9 +5733,9 @@ function useBackButton(router, cb) {
5643
5733
 
5644
5734
  function useSelectLink(link, select) {
5645
5735
  watch(() => link.isActive?.value, isActive => {
5646
- if (link.isLink.value && isActive && select) {
5736
+ if (link.isLink.value && isActive != null && select) {
5647
5737
  nextTick(() => {
5648
- select(true);
5738
+ select(isActive);
5649
5739
  });
5650
5740
  }
5651
5741
  }, {
@@ -5843,8 +5933,8 @@ function rippleCancelShow(e) {
5843
5933
  window.clearTimeout(element._ripple.showTimer);
5844
5934
  }
5845
5935
  let keyboardRipple = false;
5846
- function keyboardRippleShow(e) {
5847
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5936
+ function keyboardRippleShow(e, keys) {
5937
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5848
5938
  keyboardRipple = true;
5849
5939
  rippleShow(e);
5850
5940
  }
@@ -5872,9 +5962,12 @@ function updateRipple(el, binding, wasEnabled) {
5872
5962
  el._ripple.enabled = enabled;
5873
5963
  el._ripple.centered = modifiers.center;
5874
5964
  el._ripple.circle = modifiers.circle;
5875
- if (isObject(value) && value.class) {
5876
- el._ripple.class = value.class;
5965
+ const bindingValue = isObject(value) ? value : {};
5966
+ if (bindingValue.class) {
5967
+ el._ripple.class = bindingValue.class;
5877
5968
  }
5969
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5970
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5878
5971
  if (enabled && !wasEnabled) {
5879
5972
  if (modifiers.stop) {
5880
5973
  el.addEventListener('touchstart', rippleStop, {
@@ -5896,7 +5989,7 @@ function updateRipple(el, binding, wasEnabled) {
5896
5989
  el.addEventListener('mousedown', rippleShow);
5897
5990
  el.addEventListener('mouseup', rippleHide);
5898
5991
  el.addEventListener('mouseleave', rippleHide);
5899
- el.addEventListener('keydown', keyboardRippleShow);
5992
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5900
5993
  el.addEventListener('keyup', keyboardRippleHide);
5901
5994
  el.addEventListener('blur', focusRippleHide);
5902
5995
 
@@ -5916,7 +6009,9 @@ function removeListeners(el) {
5916
6009
  el.removeEventListener('touchcancel', rippleHide);
5917
6010
  el.removeEventListener('mouseup', rippleHide);
5918
6011
  el.removeEventListener('mouseleave', rippleHide);
5919
- el.removeEventListener('keydown', keyboardRippleShow);
6012
+ if (el._ripple?.keyDownHandler) {
6013
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
6014
+ }
5920
6015
  el.removeEventListener('keyup', keyboardRippleHide);
5921
6016
  el.removeEventListener('dragstart', rippleHide);
5922
6017
  el.removeEventListener('blur', focusRippleHide);
@@ -5925,8 +6020,8 @@ function mounted$4(el, binding) {
5925
6020
  updateRipple(el, binding, false);
5926
6021
  }
5927
6022
  function unmounted$4(el) {
5928
- delete el._ripple;
5929
6023
  removeListeners(el);
6024
+ delete el._ripple;
5930
6025
  }
5931
6026
  function updated$1(el, binding) {
5932
6027
  if (binding.value === binding.oldValue) {
@@ -6199,6 +6294,31 @@ const VAppBarTitle = genericComponent()({
6199
6294
  // Utilities
6200
6295
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6201
6296
 
6297
+ // Utilities
6298
+
6299
+ // Types
6300
+
6301
+ // Types
6302
+
6303
+ // Composables
6304
+ const makeIconSizeProps = propsFactory({
6305
+ iconSize: [Number, String],
6306
+ iconSizes: {
6307
+ type: Array,
6308
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6309
+ }
6310
+ }, 'iconSize');
6311
+ function useIconSizes(props, fallback) {
6312
+ const iconSize = computed(() => {
6313
+ const iconSizeMap = new Map(props.iconSizes);
6314
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6315
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6316
+ });
6317
+ return {
6318
+ iconSize
6319
+ };
6320
+ }
6321
+
6202
6322
  // Types
6203
6323
 
6204
6324
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6238,6 +6358,7 @@ const makeVAlertProps = propsFactory({
6238
6358
  ...makeDensityProps(),
6239
6359
  ...makeDimensionProps(),
6240
6360
  ...makeElevationProps(),
6361
+ ...makeIconSizeProps(),
6241
6362
  ...makeLocationProps(),
6242
6363
  ...makePositionProps(),
6243
6364
  ...makeRoundedProps(),
@@ -6265,6 +6386,9 @@ const VAlert = genericComponent()({
6265
6386
  if (!props.type) return props.icon;
6266
6387
  return props.icon ?? `$${props.type}`;
6267
6388
  });
6389
+ const {
6390
+ iconSize
6391
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6268
6392
  const {
6269
6393
  themeClasses
6270
6394
  } = provideTheme(props);
@@ -6312,6 +6436,11 @@ const VAlert = genericComponent()({
6312
6436
  const hasPrepend = !!(slots.prepend || icon.value);
6313
6437
  const hasTitle = !!(slots.title || props.title);
6314
6438
  const hasClose = !!(slots.close || props.closable);
6439
+ const iconProps = {
6440
+ density: props.density,
6441
+ icon: icon.value,
6442
+ size: iconSize.value
6443
+ };
6315
6444
  return isActive.value && createVNode(props.tag, {
6316
6445
  "class": normalizeClass(['v-alert', props.border && {
6317
6446
  'v-alert--border': !!props.border,
@@ -6329,19 +6458,14 @@ const VAlert = genericComponent()({
6329
6458
  }, null), hasPrepend && createElementVNode("div", {
6330
6459
  "key": "prepend",
6331
6460
  "class": "v-alert__prepend"
6332
- }, [!slots.prepend ? createVNode(VIcon, {
6333
- "key": "prepend-icon",
6334
- "density": props.density,
6335
- "icon": icon.value,
6336
- "size": props.prominent ? 44 : 28
6337
- }, null) : createVNode(VDefaultsProvider, {
6461
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6462
+ "key": "prepend-icon"
6463
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6338
6464
  "key": "prepend-defaults",
6339
6465
  "disabled": !icon.value,
6340
6466
  "defaults": {
6341
6467
  VIcon: {
6342
- density: props.density,
6343
- icon: icon.value,
6344
- size: props.prominent ? 44 : 28
6468
+ ...iconProps
6345
6469
  }
6346
6470
  }
6347
6471
  }, slots.prepend)]), createElementVNode("div", {
@@ -7866,6 +7990,7 @@ function getOffsetPosition(isHorizontal, element) {
7866
7990
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7867
7991
  const makeVSlideGroupProps = propsFactory({
7868
7992
  centerActive: Boolean,
7993
+ contentClass: null,
7869
7994
  direction: {
7870
7995
  type: String,
7871
7996
  default: 'horizontal'
@@ -8178,7 +8303,7 @@ const VSlideGroup = genericComponent()({
8178
8303
  })]), createElementVNode("div", {
8179
8304
  "key": "container",
8180
8305
  "ref": containerRef,
8181
- "class": "v-slide-group__container",
8306
+ "class": normalizeClass(['v-slide-group__container', props.contentClass]),
8182
8307
  "onScroll": onScroll
8183
8308
  }, [createElementVNode("div", {
8184
8309
  "ref": contentRef,
@@ -8541,16 +8666,85 @@ const VChip = genericComponent()({
8541
8666
  }
8542
8667
  });
8543
8668
 
8669
+ const makeVDividerProps = propsFactory({
8670
+ color: String,
8671
+ inset: Boolean,
8672
+ length: [Number, String],
8673
+ opacity: [Number, String],
8674
+ thickness: [Number, String],
8675
+ vertical: Boolean,
8676
+ ...makeComponentProps(),
8677
+ ...makeThemeProps()
8678
+ }, 'VDivider');
8679
+ const VDivider = genericComponent()({
8680
+ name: 'VDivider',
8681
+ props: makeVDividerProps(),
8682
+ setup(props, _ref) {
8683
+ let {
8684
+ attrs,
8685
+ slots
8686
+ } = _ref;
8687
+ const {
8688
+ themeClasses
8689
+ } = provideTheme(props);
8690
+ const {
8691
+ textColorClasses,
8692
+ textColorStyles
8693
+ } = useTextColor(() => props.color);
8694
+ const dividerStyles = computed(() => {
8695
+ const styles = {};
8696
+ if (props.length) {
8697
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8698
+ }
8699
+ if (props.thickness) {
8700
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8701
+ }
8702
+ return styles;
8703
+ });
8704
+ useRender(() => {
8705
+ const divider = createElementVNode("hr", {
8706
+ "class": normalizeClass([{
8707
+ 'v-divider': true,
8708
+ 'v-divider--inset': props.inset,
8709
+ 'v-divider--vertical': props.vertical
8710
+ }, themeClasses.value, textColorClasses.value, props.class]),
8711
+ "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8712
+ '--v-border-opacity': props.opacity
8713
+ }, props.style]),
8714
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8715
+ "role": `${attrs.role || 'separator'}`
8716
+ }, null);
8717
+ if (!slots.default) return divider;
8718
+ return createElementVNode("div", {
8719
+ "class": normalizeClass(['v-divider__wrapper', {
8720
+ 'v-divider__wrapper--vertical': props.vertical,
8721
+ 'v-divider__wrapper--inset': props.inset
8722
+ }])
8723
+ }, [divider, createElementVNode("div", {
8724
+ "class": "v-divider__content"
8725
+ }, [slots.default()]), divider]);
8726
+ });
8727
+ return {};
8728
+ }
8729
+ });
8730
+
8544
8731
  // Utilities
8545
8732
 
8546
8733
  // List
8547
8734
  const ListKey = Symbol.for('vuetify:list');
8548
8735
  function createList() {
8736
+ let {
8737
+ filterable
8738
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8739
+ filterable: false
8740
+ };
8549
8741
  const parent = inject$1(ListKey, {
8742
+ filterable: false,
8550
8743
  hasPrepend: shallowRef(false),
8551
8744
  updateHasPrepend: () => null
8552
8745
  });
8553
8746
  const data = {
8747
+ filterable: parent.filterable || filterable,
8554
8748
  hasPrepend: shallowRef(false),
8555
8749
  updateHasPrepend: value => {
8556
8750
  if (value) data.hasPrepend.value = value;
@@ -9259,6 +9453,7 @@ const makeVListGroupProps = propsFactory({
9259
9453
  type: IconValue,
9260
9454
  default: '$expand'
9261
9455
  },
9456
+ rawId: [String, Number],
9262
9457
  prependIcon: IconValue,
9263
9458
  appendIcon: IconValue,
9264
9459
  fluid: Boolean,
@@ -9280,13 +9475,12 @@ const VListGroup = genericComponent()({
9280
9475
  open,
9281
9476
  id: _id
9282
9477
  } = useNestedItem(() => props.value, true);
9283
- const id = computed(() => `v-list-group--id-${String(_id.value)}`);
9478
+ const id = computed(() => `v-list-group--id-${String(props.rawId ?? _id.value)}`);
9284
9479
  const list = useList();
9285
9480
  const {
9286
9481
  isBooted
9287
9482
  } = useSsrBoot();
9288
9483
  function onClick(e) {
9289
- e.stopPropagation();
9290
9484
  if (['INPUT', 'TEXTAREA'].includes(e.target?.tagName)) return;
9291
9485
  open(!isOpen.value, e);
9292
9486
  }
@@ -9502,6 +9696,9 @@ const VListItem = genericComponent()({
9502
9696
  roundedClasses
9503
9697
  } = useRounded(roundedProps);
9504
9698
  const lineClasses = toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9699
+ const rippleOptions = toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9700
+ keys: [keyCodes.enter]
9701
+ } : props.ripple);
9505
9702
  const slotProps = computed(() => ({
9506
9703
  isActive: isActive.value,
9507
9704
  select,
@@ -9526,8 +9723,9 @@ const VListItem = genericComponent()({
9526
9723
  function onKeyDown(e) {
9527
9724
  const target = e.target;
9528
9725
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9529
- if (e.key === 'Enter' || e.key === ' ') {
9726
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9530
9727
  e.preventDefault();
9728
+ e.stopPropagation();
9531
9729
  e.target.dispatchEvent(new MouseEvent('click', e));
9532
9730
  }
9533
9731
  }
@@ -9637,7 +9835,7 @@ const VListItem = genericComponent()({
9637
9835
  }), createElementVNode("div", {
9638
9836
  "class": "v-list-item__spacer"
9639
9837
  }, null)])]
9640
- }), [[Ripple, isClickable.value && props.ripple]]);
9838
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9641
9839
  });
9642
9840
  return {
9643
9841
  activate,
@@ -9692,68 +9890,6 @@ const VListSubheader = genericComponent()({
9692
9890
  }
9693
9891
  });
9694
9892
 
9695
- const makeVDividerProps = propsFactory({
9696
- color: String,
9697
- inset: Boolean,
9698
- length: [Number, String],
9699
- opacity: [Number, String],
9700
- thickness: [Number, String],
9701
- vertical: Boolean,
9702
- ...makeComponentProps(),
9703
- ...makeThemeProps()
9704
- }, 'VDivider');
9705
- const VDivider = genericComponent()({
9706
- name: 'VDivider',
9707
- props: makeVDividerProps(),
9708
- setup(props, _ref) {
9709
- let {
9710
- attrs,
9711
- slots
9712
- } = _ref;
9713
- const {
9714
- themeClasses
9715
- } = provideTheme(props);
9716
- const {
9717
- textColorClasses,
9718
- textColorStyles
9719
- } = useTextColor(() => props.color);
9720
- const dividerStyles = computed(() => {
9721
- const styles = {};
9722
- if (props.length) {
9723
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9724
- }
9725
- if (props.thickness) {
9726
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9727
- }
9728
- return styles;
9729
- });
9730
- useRender(() => {
9731
- const divider = createElementVNode("hr", {
9732
- "class": normalizeClass([{
9733
- 'v-divider': true,
9734
- 'v-divider--inset': props.inset,
9735
- 'v-divider--vertical': props.vertical
9736
- }, themeClasses.value, textColorClasses.value, props.class]),
9737
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9738
- '--v-border-opacity': props.opacity
9739
- }, props.style]),
9740
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9741
- "role": `${attrs.role || 'separator'}`
9742
- }, null);
9743
- if (!slots.default) return divider;
9744
- return createElementVNode("div", {
9745
- "class": normalizeClass(['v-divider__wrapper', {
9746
- 'v-divider__wrapper--vertical': props.vertical,
9747
- 'v-divider__wrapper--inset': props.inset
9748
- }])
9749
- }, [divider, createElementVNode("div", {
9750
- "class": "v-divider__content"
9751
- }, [slots.default()]), divider]);
9752
- });
9753
- return {};
9754
- }
9755
- });
9756
-
9757
9893
  // Types
9758
9894
 
9759
9895
  const makeVListChildrenProps = propsFactory({
@@ -9804,9 +9940,10 @@ const VListChildren = genericComponent()({
9804
9940
  }) : undefined
9805
9941
  };
9806
9942
  const listGroupProps = VListGroup.filterProps(itemProps);
9807
- return children ? createVNode(VListGroup, mergeProps({
9808
- "value": itemProps?.value
9809
- }, listGroupProps), {
9943
+ return children ? createVNode(VListGroup, mergeProps(listGroupProps, {
9944
+ "value": props.returnObject ? item : itemProps?.value,
9945
+ "rawId": itemProps?.value
9946
+ }), {
9810
9947
  activator: _ref3 => {
9811
9948
  let {
9812
9949
  props: activatorProps
@@ -10022,6 +10159,7 @@ const makeVListProps = propsFactory({
10022
10159
  activeClass: String,
10023
10160
  bgColor: String,
10024
10161
  disabled: Boolean,
10162
+ filterable: Boolean,
10025
10163
  expandIcon: IconValue,
10026
10164
  collapseIcon: IconValue,
10027
10165
  lines: {
@@ -10105,7 +10243,9 @@ const VList = genericComponent()({
10105
10243
  const activeColor = toRef(() => props.activeColor);
10106
10244
  const baseColor = toRef(() => props.baseColor);
10107
10245
  const color = toRef(() => props.color);
10108
- createList();
10246
+ createList({
10247
+ filterable: props.filterable
10248
+ });
10109
10249
  provideDefaults({
10110
10250
  VListGroup: {
10111
10251
  activeColor,
@@ -11788,6 +11928,7 @@ const makeVMenuProps = propsFactory({
11788
11928
  // disableKeys: Boolean,
11789
11929
  id: String,
11790
11930
  submenu: Boolean,
11931
+ disableInitialFocus: Boolean,
11791
11932
  ...omit(makeVOverlayProps({
11792
11933
  closeDelay: 250,
11793
11934
  closeOnContentClick: true,
@@ -11862,7 +12003,7 @@ const VMenu = genericComponent()({
11862
12003
  watch(isActive, val => {
11863
12004
  if (val) {
11864
12005
  parent?.register();
11865
- if (IN_BROWSER) {
12006
+ if (IN_BROWSER && !props.disableInitialFocus) {
11866
12007
  document.addEventListener('focusin', onFocusIn, {
11867
12008
  once: true
11868
12009
  });
@@ -12342,6 +12483,16 @@ const VField = genericComponent()({
12342
12483
  }
12343
12484
  });
12344
12485
 
12486
+ function useAutofocus(props) {
12487
+ function onIntersect(isIntersecting, entries) {
12488
+ if (!props.autofocus || !isIntersecting) return;
12489
+ entries[0].target?.focus?.();
12490
+ }
12491
+ return {
12492
+ onIntersect
12493
+ };
12494
+ }
12495
+
12345
12496
  // Types
12346
12497
 
12347
12498
  const activeTypes = ['color', 'file', 'time', 'date', 'datetime-local', 'week', 'month'];
@@ -12388,6 +12539,9 @@ const VTextField = genericComponent()({
12388
12539
  focus,
12389
12540
  blur
12390
12541
  } = useFocus(props);
12542
+ const {
12543
+ onIntersect
12544
+ } = useAutofocus(props);
12391
12545
  const counterValue = computed(() => {
12392
12546
  return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : (model.value ?? '').toString().length;
12393
12547
  });
@@ -12397,10 +12551,6 @@ const VTextField = genericComponent()({
12397
12551
  return props.counter;
12398
12552
  });
12399
12553
  const isPlainOrUnderlined = computed(() => ['plain', 'underlined'].includes(props.variant));
12400
- function onIntersect(isIntersecting, entries) {
12401
- if (!props.autofocus || !isIntersecting) return;
12402
- entries[0].target?.focus?.();
12403
- }
12404
12554
  const vInputRef = ref();
12405
12555
  const vFieldRef = ref();
12406
12556
  const inputRef = ref();
@@ -12690,7 +12840,12 @@ function useVirtual(props, items) {
12690
12840
  }
12691
12841
  function calculateOffset(index) {
12692
12842
  index = clamp(index, 0, items.value.length - 1);
12693
- return offsets[index] || 0;
12843
+ const whole = Math.floor(index);
12844
+ const fraction = index % 1;
12845
+ const next = whole + 1;
12846
+ const wholeOffset = offsets[whole] || 0;
12847
+ const nextOffset = offsets[next] || wholeOffset;
12848
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12694
12849
  }
12695
12850
  function calculateIndex(scrollTop) {
12696
12851
  return binaryClosest(offsets, scrollTop);
@@ -13044,6 +13199,7 @@ const makeSelectProps = propsFactory({
13044
13199
  },
13045
13200
  openOnClear: Boolean,
13046
13201
  itemColor: String,
13202
+ noAutoScroll: Boolean,
13047
13203
  ...makeItemsProps({
13048
13204
  itemChildren: false
13049
13205
  })
@@ -13258,7 +13414,7 @@ const VSelect = genericComponent()({
13258
13414
  watch(menu, () => {
13259
13415
  if (!props.hideSelected && menu.value && model.value.length) {
13260
13416
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13261
- IN_BROWSER && window.requestAnimationFrame(() => {
13417
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13262
13418
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13263
13419
  });
13264
13420
  }
@@ -13351,6 +13507,22 @@ const VSelect = genericComponent()({
13351
13507
  key: item.value,
13352
13508
  onClick: () => select(item, null)
13353
13509
  });
13510
+ if (item.raw.type === 'divider') {
13511
+ return slots.divider?.({
13512
+ props: item.raw,
13513
+ index
13514
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13515
+ "key": `divider-${index}`
13516
+ }), null);
13517
+ }
13518
+ if (item.raw.type === 'subheader') {
13519
+ return slots.subheader?.({
13520
+ props: item.raw,
13521
+ index
13522
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13523
+ "key": `subheader-${index}`
13524
+ }), null);
13525
+ }
13354
13526
  return slots.item?.({
13355
13527
  item,
13356
13528
  index,
@@ -13511,6 +13683,9 @@ function filterItems(items, query, options) {
13511
13683
  let match = -1;
13512
13684
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13513
13685
  if (typeof item === 'object') {
13686
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13687
+ continue;
13688
+ }
13514
13689
  const filterKeys = keys || Object.keys(transformed);
13515
13690
  for (const key of filterKeys) {
13516
13691
  const value = getPropertyFromItem(transformed, key);
@@ -13713,7 +13888,7 @@ const VAutocomplete = genericComponent()({
13713
13888
  menu.value = !menu.value;
13714
13889
  }
13715
13890
  function onListKeydown(e) {
13716
- if (e.key !== ' ' && checkPrintable(e)) {
13891
+ if (checkPrintable(e) || e.key === 'Backspace') {
13717
13892
  vTextFieldRef.value?.focus();
13718
13893
  }
13719
13894
  }
@@ -13918,6 +14093,7 @@ const VAutocomplete = genericComponent()({
13918
14093
  }, props.menuProps), {
13919
14094
  default: () => [hasList && createVNode(VList, mergeProps({
13920
14095
  "ref": listRef,
14096
+ "filterable": true,
13921
14097
  "selected": selectedValues.value,
13922
14098
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13923
14099
  "onMousedown": e => e.preventDefault(),
@@ -13949,6 +14125,22 @@ const VAutocomplete = genericComponent()({
13949
14125
  active: highlightFirst.value && index === 0 ? true : undefined,
13950
14126
  onClick: () => select(item, null)
13951
14127
  });
14128
+ if (item.raw.type === 'divider') {
14129
+ return slots.divider?.({
14130
+ props: item.raw,
14131
+ index
14132
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
14133
+ "key": `divider-${index}`
14134
+ }), null);
14135
+ }
14136
+ if (item.raw.type === 'subheader') {
14137
+ return slots.subheader?.({
14138
+ props: item.raw,
14139
+ index
14140
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
14141
+ "key": `subheader-${index}`
14142
+ }), null);
14143
+ }
13952
14144
  return slots.item?.({
13953
14145
  item,
13954
14146
  index,
@@ -14093,7 +14285,8 @@ const makeVBadgeProps = propsFactory({
14093
14285
  ...makeThemeProps(),
14094
14286
  ...makeTransitionProps({
14095
14287
  transition: 'scale-rotate-transition'
14096
- })
14288
+ }),
14289
+ ...makeDimensionProps()
14097
14290
  }, 'VBadge');
14098
14291
  const VBadge = genericComponent()({
14099
14292
  name: 'VBadge',
@@ -14123,6 +14316,9 @@ const VBadge = genericComponent()({
14123
14316
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
14124
14317
  return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
14125
14318
  });
14319
+ const {
14320
+ dimensionStyles
14321
+ } = useDimension(props);
14126
14322
  useRender(() => {
14127
14323
  const value = Number(props.content);
14128
14324
  const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
@@ -14144,7 +14340,7 @@ const VBadge = genericComponent()({
14144
14340
  }, {
14145
14341
  default: () => [withDirectives(createElementVNode("span", mergeProps({
14146
14342
  "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
14147
- "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
14343
+ "style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
14148
14344
  "aria-atomic": "true",
14149
14345
  "aria-label": t(props.label, value),
14150
14346
  "aria-live": "polite",
@@ -17553,13 +17749,13 @@ function date(value) {
17553
17749
  return null;
17554
17750
  }
17555
17751
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17556
- function getWeekdays(locale, firstDayOfWeek) {
17752
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17557
17753
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17558
17754
  return createRange(7).map(i => {
17559
17755
  const weekday = new Date(sundayJanuarySecond2000);
17560
17756
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17561
17757
  return new Intl.DateTimeFormat(locale, {
17562
- weekday: 'narrow'
17758
+ weekday: weekdayFormat ?? 'narrow'
17563
17759
  }).format(weekday);
17564
17760
  });
17565
17761
  }
@@ -18023,9 +18219,9 @@ class VuetifyDateAdapter {
18023
18219
  getDiff(date, comparing, unit) {
18024
18220
  return getDiff(date, comparing, unit);
18025
18221
  }
18026
- getWeekdays(firstDayOfWeek) {
18222
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
18027
18223
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
18028
- return getWeekdays(this.locale, firstDay);
18224
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
18029
18225
  }
18030
18226
  getYear(date) {
18031
18227
  return getYear(date);
@@ -18380,6 +18576,7 @@ const VCombobox = genericComponent()({
18380
18576
  _search.value = val ?? '';
18381
18577
  if (!props.multiple && !hasSelectionSlot.value) {
18382
18578
  model.value = [transformItem$3(props, val)];
18579
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18383
18580
  }
18384
18581
  if (val && props.multiple && props.delimiters?.length) {
18385
18582
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18460,7 +18657,7 @@ const VCombobox = genericComponent()({
18460
18657
  menu.value = !menu.value;
18461
18658
  }
18462
18659
  function onListKeydown(e) {
18463
- if (e.key !== ' ' && checkPrintable(e)) {
18660
+ if (checkPrintable(e) || e.key === 'Backspace') {
18464
18661
  vTextFieldRef.value?.focus();
18465
18662
  }
18466
18663
  }
@@ -18665,6 +18862,7 @@ const VCombobox = genericComponent()({
18665
18862
  }, props.menuProps), {
18666
18863
  default: () => [hasList && createVNode(VList, mergeProps({
18667
18864
  "ref": listRef,
18865
+ "filterable": true,
18668
18866
  "selected": selectedValues.value,
18669
18867
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18670
18868
  "onMousedown": e => e.preventDefault(),
@@ -18696,6 +18894,22 @@ const VCombobox = genericComponent()({
18696
18894
  active: highlightFirst.value && index === 0 ? true : undefined,
18697
18895
  onClick: () => select(item, null)
18698
18896
  });
18897
+ if (item.raw.type === 'divider') {
18898
+ return slots.divider?.({
18899
+ props: item.raw,
18900
+ index
18901
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18902
+ "key": `divider-${index}`
18903
+ }), null);
18904
+ }
18905
+ if (item.raw.type === 'subheader') {
18906
+ return slots.subheader?.({
18907
+ props: item.raw,
18908
+ index
18909
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18910
+ "key": `subheader-${index}`
18911
+ }), null);
18912
+ }
18699
18913
  return slots.item?.({
18700
18914
  item,
18701
18915
  index,
@@ -20578,6 +20792,7 @@ const makeVDataTableHeadersProps = propsFactory({
20578
20792
  color: String,
20579
20793
  disableSort: Boolean,
20580
20794
  fixedHeader: Boolean,
20795
+ lastFixed: Boolean,
20581
20796
  multiSort: Boolean,
20582
20797
  sortAscIcon: {
20583
20798
  type: IconValue,
@@ -20624,10 +20839,11 @@ const VDataTableHeaders = genericComponent()({
20624
20839
  loaderClasses
20625
20840
  } = useLoader(props);
20626
20841
  function getFixedStyles(column, y) {
20627
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20842
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20628
20843
  return {
20629
20844
  position: 'sticky',
20630
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20845
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20846
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20631
20847
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20632
20848
  };
20633
20849
  }
@@ -21143,11 +21359,18 @@ const VDataTableRows = genericComponent()({
21143
21359
  }
21144
21360
  });
21145
21361
 
21362
+ // Types
21363
+
21146
21364
  const makeVTableProps = propsFactory({
21147
21365
  fixedHeader: Boolean,
21148
21366
  fixedFooter: Boolean,
21149
21367
  height: [Number, String],
21150
21368
  hover: Boolean,
21369
+ striped: {
21370
+ type: String,
21371
+ default: null,
21372
+ validator: v => ['even', 'odd'].includes(v)
21373
+ },
21151
21374
  ...makeComponentProps(),
21152
21375
  ...makeDensityProps(),
21153
21376
  ...makeTagProps(),
@@ -21174,7 +21397,9 @@ const VTable = genericComponent()({
21174
21397
  'v-table--fixed-footer': props.fixedFooter,
21175
21398
  'v-table--has-top': !!slots.top,
21176
21399
  'v-table--has-bottom': !!slots.bottom,
21177
- 'v-table--hover': props.hover
21400
+ 'v-table--hover': props.hover,
21401
+ 'v-table--striped-even': props.striped === 'even',
21402
+ 'v-table--striped-odd': props.striped === 'odd'
21178
21403
  }, themeClasses.value, densityClasses.value, props.class]),
21179
21404
  "style": normalizeStyle(props.style)
21180
21405
  }, {
@@ -22349,7 +22574,8 @@ const makeCalendarProps = propsFactory({
22349
22574
  firstDayOfWeek: {
22350
22575
  type: [Number, String],
22351
22576
  default: undefined
22352
- }
22577
+ },
22578
+ weekdayFormat: String
22353
22579
  }, 'calendar');
22354
22580
  function useCalendar(props) {
22355
22581
  const adapter = useDate();
@@ -22590,7 +22816,7 @@ const VDatePickerMonth = genericComponent()({
22590
22816
  "ref": daysRef,
22591
22817
  "key": daysInMonth.value[0].date?.toString(),
22592
22818
  "class": "v-date-picker-month__days"
22593
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22819
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22594
22820
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22595
22821
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22596
22822
  const slotProps = {
@@ -23099,7 +23325,9 @@ const VDatePicker = genericComponent()({
23099
23325
  "max": maxDate.value,
23100
23326
  "year": year.value,
23101
23327
  "allowedMonths": allowedMonths
23102
- }), null) : viewMode.value === 'year' ? createVNode(VDatePickerYears, mergeProps({
23328
+ }), {
23329
+ ...pick(slots, ['month'])
23330
+ }) : viewMode.value === 'year' ? createVNode(VDatePickerYears, mergeProps({
23103
23331
  "key": "date-picker-years"
23104
23332
  }, datePickerYearsProps, {
23105
23333
  "modelValue": year.value,
@@ -23107,7 +23335,9 @@ const VDatePicker = genericComponent()({
23107
23335
  "min": minDate.value,
23108
23336
  "max": maxDate.value,
23109
23337
  "allowedYears": allowedYears
23110
- }), null) : createVNode(VDatePickerMonth, mergeProps({
23338
+ }), {
23339
+ ...pick(slots, ['year'])
23340
+ }) : createVNode(VDatePickerMonth, mergeProps({
23111
23341
  "key": "date-picker-month"
23112
23342
  }, datePickerMonthProps, {
23113
23343
  "modelValue": model.value,
@@ -23118,7 +23348,9 @@ const VDatePicker = genericComponent()({
23118
23348
  "onUpdate:year": [$event => year.value = $event, onUpdateYear],
23119
23349
  "min": minDate.value,
23120
23350
  "max": maxDate.value
23121
- }), null)]
23351
+ }), {
23352
+ ...pick(slots, ['day'])
23353
+ })]
23122
23354
  })]),
23123
23355
  actions: slots.actions
23124
23356
  });
@@ -24209,6 +24441,9 @@ const VInfiniteScroll = genericComponent()({
24209
24441
  startStatus.value = status;
24210
24442
  } else if (side === 'end') {
24211
24443
  endStatus.value = status;
24444
+ } else if (side === 'both') {
24445
+ startStatus.value = status;
24446
+ endStatus.value = status;
24212
24447
  }
24213
24448
  }
24214
24449
  function getStatus(side) {
@@ -24320,6 +24555,32 @@ const VInfiniteScroll = genericComponent()({
24320
24555
  }, [renderSide('end', endStatus.value)])]
24321
24556
  });
24322
24557
  });
24558
+ function reset(side) {
24559
+ const effectiveSide = side ?? props.side;
24560
+ setStatus(effectiveSide, 'ok');
24561
+ nextTick(() => {
24562
+ setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
24563
+ if (props.mode !== 'manual') {
24564
+ nextTick(() => {
24565
+ window.requestAnimationFrame(() => {
24566
+ window.requestAnimationFrame(() => {
24567
+ window.requestAnimationFrame(() => {
24568
+ if (effectiveSide === 'both') {
24569
+ intersecting('start');
24570
+ intersecting('end');
24571
+ } else {
24572
+ intersecting(effectiveSide);
24573
+ }
24574
+ });
24575
+ });
24576
+ });
24577
+ });
24578
+ }
24579
+ });
24580
+ }
24581
+ return {
24582
+ reset
24583
+ };
24323
24584
  }
24324
24585
  });
24325
24586
 
@@ -24399,8 +24660,47 @@ const VItem = genericComponent()({
24399
24660
  }
24400
24661
  });
24401
24662
 
24402
- // Styles
24403
- const VKbd = createSimpleFunctional('v-kbd', 'kbd');
24663
+ const makeVKbdProps = propsFactory({
24664
+ ...makeBorderProps(),
24665
+ ...makeComponentProps(),
24666
+ ...makeRoundedProps(),
24667
+ ...makeTagProps({
24668
+ tag: 'kbd'
24669
+ }),
24670
+ ...makeThemeProps(),
24671
+ ...makeElevationProps(),
24672
+ color: String
24673
+ }, 'VKbd');
24674
+ const VKbd = genericComponent()({
24675
+ name: 'VKbd',
24676
+ props: makeVKbdProps(),
24677
+ setup(props, _ref) {
24678
+ let {
24679
+ slots
24680
+ } = _ref;
24681
+ const {
24682
+ themeClasses
24683
+ } = provideTheme(props);
24684
+ const {
24685
+ borderClasses
24686
+ } = useBorder(props);
24687
+ const {
24688
+ roundedClasses
24689
+ } = useRounded(props);
24690
+ const {
24691
+ backgroundColorClasses,
24692
+ backgroundColorStyles
24693
+ } = useBackgroundColor(() => props.color);
24694
+ const {
24695
+ elevationClasses
24696
+ } = useElevation(props);
24697
+ useRender(() => createVNode(props.tag, {
24698
+ "class": normalizeClass(['v-kbd', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
24699
+ "style": normalizeStyle([backgroundColorStyles.value, props.style])
24700
+ }, slots));
24701
+ return {};
24702
+ }
24703
+ });
24404
24704
 
24405
24705
  const makeVLayoutProps = propsFactory({
24406
24706
  ...makeComponentProps(),
@@ -25238,6 +25538,14 @@ const makeVNumberInputProps = propsFactory({
25238
25538
  type: Number,
25239
25539
  default: 0
25240
25540
  },
25541
+ minFractionDigits: {
25542
+ type: Number,
25543
+ default: null
25544
+ },
25545
+ decimalSeparator: {
25546
+ type: String,
25547
+ validator: v => !v || v.length === 1
25548
+ },
25241
25549
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25242
25550
  }, 'VNumberInput');
25243
25551
  const VNumberInput = genericComponent()({
@@ -25263,11 +25571,24 @@ const VNumberInput = genericComponent()({
25263
25571
  const form = useForm(props);
25264
25572
  const controlsDisabled = computed(() => form.isDisabled.value || form.isReadonly.value);
25265
25573
  const isFocused = shallowRef(props.focused);
25574
+ const {
25575
+ decimalSeparator: decimalSeparatorFromLocale
25576
+ } = useLocale();
25577
+ const decimalSeparator = computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value);
25266
25578
  function correctPrecision(val) {
25267
25579
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25580
+ let trim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
25268
25581
  const fixed = precision == null ? String(val) : val.toFixed(precision);
25269
- return isFocused.value ? Number(fixed).toString() // trim zeros
25270
- : fixed;
25582
+ if (isFocused.value && trim) {
25583
+ return Number(fixed).toString() // trim zeros
25584
+ .replace('.', decimalSeparator.value);
25585
+ }
25586
+ if (props.minFractionDigits === null || precision !== null && precision < props.minFractionDigits) {
25587
+ return fixed.replace('.', decimalSeparator.value);
25588
+ }
25589
+ let [baseDigits, fractionDigits] = fixed.split('.');
25590
+ fractionDigits = (fractionDigits ?? '').padEnd(props.minFractionDigits, '0').replace(new RegExp(`(?<=\\d{${props.minFractionDigits}})0`, 'g'), '');
25591
+ return [baseDigits, fractionDigits].filter(Boolean).join(decimalSeparator.value);
25271
25592
  }
25272
25593
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25273
25594
  const _inputText = shallowRef(null);
@@ -25284,8 +25605,11 @@ const VNumberInput = genericComponent()({
25284
25605
  if (val === null || val === '') {
25285
25606
  model.value = null;
25286
25607
  _inputText.value = null;
25287
- } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {
25288
- model.value = Number(val);
25608
+ return;
25609
+ }
25610
+ const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
25611
+ if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
25612
+ model.value = parsedValue;
25289
25613
  _inputText.value = val;
25290
25614
  }
25291
25615
  }
@@ -25322,6 +25646,7 @@ const VNumberInput = genericComponent()({
25322
25646
  }
25323
25647
  };
25324
25648
  watch(() => props.precision, () => formatInputValue());
25649
+ watch(() => props.minFractionDigits, () => formatInputValue());
25325
25650
  onMounted(() => {
25326
25651
  clampModel();
25327
25652
  });
@@ -25355,24 +25680,24 @@ const VNumberInput = genericComponent()({
25355
25680
  selectionEnd
25356
25681
  } = inputElement ?? {};
25357
25682
  const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
25358
- const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision);
25683
+ const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value);
25359
25684
 
25360
- // Only numbers, "-", "." are allowed
25361
- // AND "-", "." are allowed only once
25362
- // AND "-" is only allowed at the start
25363
- if (!/^-?(\d+(\.\d*)?|(\.\d+)|\d*|\.)$/.test(potentialNewInputVal)) {
25685
+ // Allow only numbers, "-" and {decimal separator}
25686
+ // Allow "-" and {decimal separator} only once
25687
+ // Allow "-" only at the start
25688
+ if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
25364
25689
  e.preventDefault();
25365
25690
  inputElement.value = potentialNewNumber;
25366
25691
  }
25367
25692
  if (props.precision == null) return;
25368
25693
 
25369
25694
  // Ignore decimal digits above precision limit
25370
- if (potentialNewInputVal.split('.')[1]?.length > props.precision) {
25695
+ if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
25371
25696
  e.preventDefault();
25372
25697
  inputElement.value = potentialNewNumber;
25373
25698
  }
25374
25699
  // Ignore decimal separator when precision = 0
25375
- if (props.precision === 0 && potentialNewInputVal.includes('.')) {
25700
+ if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
25376
25701
  e.preventDefault();
25377
25702
  inputElement.value = potentialNewNumber;
25378
25703
  }
@@ -25424,19 +25749,16 @@ const VNumberInput = genericComponent()({
25424
25749
  if (controlsDisabled.value) return;
25425
25750
  if (!vTextFieldRef.value) return;
25426
25751
  const actualText = vTextFieldRef.value.value;
25427
- if (actualText && !isNaN(Number(actualText))) {
25428
- inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max));
25752
+ const parsedValue = Number(actualText.replace(decimalSeparator.value, '.'));
25753
+ if (actualText && !isNaN(parsedValue)) {
25754
+ inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max));
25429
25755
  } else {
25430
25756
  inputText.value = null;
25431
25757
  }
25432
25758
  }
25433
25759
  function formatInputValue() {
25434
25760
  if (controlsDisabled.value) return;
25435
- if (model.value === null || isNaN(model.value)) {
25436
- inputText.value = null;
25437
- return;
25438
- }
25439
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25761
+ inputText.value = model.value !== null && !isNaN(model.value) ? correctPrecision(model.value, props.precision, false) : null;
25440
25762
  }
25441
25763
  function trimDecimalZeros() {
25442
25764
  if (controlsDisabled.value) return;
@@ -25444,7 +25766,7 @@ const VNumberInput = genericComponent()({
25444
25766
  inputText.value = null;
25445
25767
  return;
25446
25768
  }
25447
- inputText.value = model.value.toString();
25769
+ inputText.value = model.value.toString().replace('.', decimalSeparator.value);
25448
25770
  }
25449
25771
  function onFocus() {
25450
25772
  trimDecimalZeros();
@@ -25646,6 +25968,21 @@ const VOtpInput = genericComponent()({
25646
25968
  const contentRef = ref();
25647
25969
  const inputRef = ref([]);
25648
25970
  const current = computed(() => inputRef.value[focusIndex.value]);
25971
+ const intersectScope = effectScope();
25972
+ intersectScope.run(() => {
25973
+ const {
25974
+ intersectionRef,
25975
+ isIntersecting
25976
+ } = useIntersectionObserver();
25977
+ watch(isIntersecting, v => {
25978
+ if (!v) return;
25979
+ intersectionRef.value?.focus();
25980
+ intersectScope.stop();
25981
+ });
25982
+ watchEffect(() => {
25983
+ intersectionRef.value = inputRef.value[0];
25984
+ });
25985
+ });
25649
25986
  function onInput() {
25650
25987
  // The maxlength attribute doesn't work for the number type input, so the text type is used.
25651
25988
  // The following logic simulates the behavior of a number input.
@@ -25696,9 +26033,10 @@ const VOtpInput = genericComponent()({
25696
26033
  e.preventDefault();
25697
26034
  e.stopPropagation();
25698
26035
  const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
26036
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25699
26037
  if (isValidNumber(clipboardText)) return;
25700
26038
  model.value = clipboardText.split('');
25701
- inputRef.value?.[index].blur();
26039
+ inputRef.value?.[finalIndex].focus();
25702
26040
  }
25703
26041
  function reset() {
25704
26042
  model.value = [];
@@ -28392,6 +28730,9 @@ const VTextarea = genericComponent()({
28392
28730
  focus,
28393
28731
  blur
28394
28732
  } = useFocus(props);
28733
+ const {
28734
+ onIntersect
28735
+ } = useAutofocus(props);
28395
28736
  const counterValue = computed(() => {
28396
28737
  return typeof props.counterValue === 'function' ? props.counterValue(model.value) : (model.value || '').toString().length;
28397
28738
  });
@@ -28400,10 +28741,6 @@ const VTextarea = genericComponent()({
28400
28741
  if (!props.counter || typeof props.counter !== 'number' && typeof props.counter !== 'string') return undefined;
28401
28742
  return props.counter;
28402
28743
  });
28403
- function onIntersect(isIntersecting, entries) {
28404
- if (!props.autofocus || !isIntersecting) return;
28405
- entries[0].target?.focus?.();
28406
- }
28407
28744
  const vInputRef = ref();
28408
28745
  const vFieldRef = ref();
28409
28746
  const controlHeight = shallowRef('');
@@ -29483,7 +29820,7 @@ function createVuetify$1() {
29483
29820
  };
29484
29821
  });
29485
29822
  }
29486
- const version$1 = "3.8.9-master.2025-06-14";
29823
+ const version$1 = "3.8.10-dev.2025-06-18";
29487
29824
  createVuetify$1.version = version$1;
29488
29825
 
29489
29826
  // Vue's inject() can only be used in setup
@@ -29508,7 +29845,7 @@ const createVuetify = function () {
29508
29845
  ...options
29509
29846
  });
29510
29847
  };
29511
- const version = "3.8.9-master.2025-06-14";
29848
+ const version = "3.8.10-dev.2025-06-18";
29512
29849
  createVuetify.version = version;
29513
29850
 
29514
29851
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };