@vuetify/nightly 3.8.9-dev.2025-06-13 → 3.8.9-master.2025-06-12

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 (209) hide show
  1. package/CHANGELOG.md +6 -45
  2. package/dist/json/attributes.json +3714 -4110
  3. package/dist/json/importMap-labs.json +24 -28
  4. package/dist/json/importMap.json +154 -154
  5. package/dist/json/tags.json +2 -106
  6. package/dist/json/web-types.json +6783 -8232
  7. package/dist/vuetify-labs.cjs +177 -730
  8. package/dist/vuetify-labs.css +4085 -4128
  9. package/dist/vuetify-labs.d.ts +2938 -10254
  10. package/dist/vuetify-labs.esm.js +178 -731
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +177 -730
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +166 -478
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3607 -3650
  17. package/dist/vuetify.d.ts +2085 -2782
  18. package/dist/vuetify.esm.js +167 -479
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +166 -478
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1229 -1251
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +1 -6
  26. package/lib/components/VAlert/VAlert.d.ts +0 -35
  27. package/lib/components/VAlert/VAlert.js +10 -15
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +1 -7
  30. package/lib/components/VAppBar/VAppBar.d.ts +3 -15
  31. package/lib/components/VAppBar/VAppBarNavIcon.d.ts +10 -20
  32. package/lib/components/VAutocomplete/VAutocomplete.d.ts +110 -175
  33. package/lib/components/VAutocomplete/VAutocomplete.js +3 -21
  34. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  35. package/lib/components/VBadge/VBadge.d.ts +0 -60
  36. package/lib/components/VBadge/VBadge.js +2 -7
  37. package/lib/components/VBadge/VBadge.js.map +1 -1
  38. package/lib/components/VBtn/VBtn.d.ts +10 -20
  39. package/lib/components/VBtnGroup/VBtnGroup.css +7 -30
  40. package/lib/components/VBtnGroup/VBtnGroup.d.ts +32 -58
  41. package/lib/components/VBtnGroup/VBtnGroup.js +3 -7
  42. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  43. package/lib/components/VBtnGroup/VBtnGroup.sass +17 -44
  44. package/lib/components/VBtnToggle/VBtnToggle.d.ts +0 -25
  45. package/lib/components/VCard/VCard.d.ts +10 -20
  46. package/lib/components/VCheckbox/VCheckbox.d.ts +13 -23
  47. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +10 -20
  48. package/lib/components/VChip/VChip.d.ts +10 -20
  49. package/lib/components/VChipGroup/VChipGroup.d.ts +0 -10
  50. package/lib/components/VCombobox/VCombobox.d.ts +110 -175
  51. package/lib/components/VCombobox/VCombobox.js +3 -22
  52. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  53. package/lib/components/VDataTable/VDataTable.d.ts +0 -60
  54. package/lib/components/VDataTable/VDataTableHeaders.d.ts +0 -13
  55. package/lib/components/VDataTable/VDataTableHeaders.js +2 -4
  56. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  57. package/lib/components/VDataTable/VDataTableServer.d.ts +0 -42
  58. package/lib/components/VDataTable/VDataTableVirtual.d.ts +0 -42
  59. package/lib/components/VDatePicker/VDatePicker.d.ts +5 -80
  60. package/lib/components/VDatePicker/VDatePicker.js +4 -10
  61. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  62. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +0 -10
  63. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  64. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  65. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +10 -20
  66. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +10 -20
  67. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +10 -20
  68. package/lib/components/VFab/VFab.d.ts +10 -20
  69. package/lib/components/VField/VField.d.ts +3 -3
  70. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  71. package/lib/components/VInfiniteScroll/VInfiniteScroll.d.ts +3 -9
  72. package/lib/components/VInfiniteScroll/VInfiniteScroll.js +0 -29
  73. package/lib/components/VInfiniteScroll/VInfiniteScroll.js.map +1 -1
  74. package/lib/components/VInput/VInput.d.ts +4 -4
  75. package/lib/components/VKbd/VKbd.css +2 -13
  76. package/lib/components/VKbd/VKbd.sass +1 -2
  77. package/lib/components/VKbd/_variables.scss +1 -12
  78. package/lib/components/VKbd/index.d.ts +95 -1
  79. package/lib/components/VKbd/index.js +4 -1
  80. package/lib/components/VKbd/index.js.map +1 -1
  81. package/lib/components/VList/VList.d.ts +0 -13
  82. package/lib/components/VList/VList.js +1 -4
  83. package/lib/components/VList/VList.js.map +1 -1
  84. package/lib/components/VList/VListChildren.js.map +1 -1
  85. package/lib/components/VList/VListItem.css +2 -0
  86. package/lib/components/VList/VListItem.d.ts +10 -23
  87. package/lib/components/VList/VListItem.js +3 -7
  88. package/lib/components/VList/VListItem.js.map +1 -1
  89. package/lib/components/VList/VListItem.sass +2 -0
  90. package/lib/components/VList/_variables.scss +1 -0
  91. package/lib/components/VList/list.d.ts +2 -9
  92. package/lib/components/VList/list.js +0 -7
  93. package/lib/components/VList/list.js.map +1 -1
  94. package/lib/components/VMenu/VMenu.d.ts +0 -13
  95. package/lib/components/VMenu/VMenu.js +1 -2
  96. package/lib/components/VMenu/VMenu.js.map +1 -1
  97. package/lib/components/VNumberInput/VNumberInput.d.ts +89 -114
  98. package/lib/components/VNumberInput/VNumberInput.js +20 -43
  99. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  100. package/lib/components/VOtpInput/VOtpInput.js +1 -2
  101. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  102. package/lib/components/VOverlay/VOverlay.css +1 -1
  103. package/lib/components/VOverlay/_variables.scss +1 -1
  104. package/lib/components/VRadio/VRadio.d.ts +10 -20
  105. package/lib/components/VRadioGroup/VRadioGroup.d.ts +13 -23
  106. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  107. package/lib/components/VSelect/VSelect.d.ts +118 -204
  108. package/lib/components/VSelect/VSelect.js +3 -21
  109. package/lib/components/VSelect/VSelect.js.map +1 -1
  110. package/lib/components/VSelectionControl/VSelectionControl.d.ts +10 -20
  111. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +14 -28
  112. package/lib/components/VSlideGroup/VSlideGroup.d.ts +0 -10
  113. package/lib/components/VSlideGroup/VSlideGroup.js +1 -2
  114. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  115. package/lib/components/VSlider/VSlider.d.ts +3 -3
  116. package/lib/components/VSlider/VSliderThumb.d.ts +10 -20
  117. package/lib/components/VSpeedDial/VSpeedDial.css +1 -1
  118. package/lib/components/VSpeedDial/VSpeedDial.d.ts +0 -13
  119. package/lib/components/VSpeedDial/VSpeedDial.sass +3 -1
  120. package/lib/components/VStepper/VStepperItem.d.ts +14 -28
  121. package/lib/components/VSwitch/VSwitch.d.ts +13 -23
  122. package/lib/components/VTable/VTable.css +0 -6
  123. package/lib/components/VTable/VTable.d.ts +24 -55
  124. package/lib/components/VTable/VTable.js +2 -9
  125. package/lib/components/VTable/VTable.js.map +1 -1
  126. package/lib/components/VTable/VTable.sass +0 -14
  127. package/lib/components/VTable/_variables.scss +0 -1
  128. package/lib/components/VTabs/VTab.d.ts +28 -56
  129. package/lib/components/VTabs/VTabs.d.ts +0 -10
  130. package/lib/components/VTextField/VTextField.d.ts +27 -27
  131. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  132. package/lib/components/VToolbar/VToolbar.d.ts +3 -15
  133. package/lib/components/VToolbar/VToolbar.js +3 -6
  134. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  135. package/lib/composables/calendar.d.ts +0 -6
  136. package/lib/composables/calendar.js +1 -2
  137. package/lib/composables/calendar.js.map +1 -1
  138. package/lib/composables/date/DateAdapter.d.ts +3 -3
  139. package/lib/composables/date/DateAdapter.js.map +1 -1
  140. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  141. package/lib/composables/date/adapters/vuetify.js +4 -4
  142. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  143. package/lib/composables/date/date.d.ts +3 -3
  144. package/lib/composables/date/index.d.ts +0 -1
  145. package/lib/composables/date/index.js +0 -1
  146. package/lib/composables/date/index.js.map +1 -1
  147. package/lib/composables/filter.js +0 -3
  148. package/lib/composables/filter.js.map +1 -1
  149. package/lib/composables/locale.d.ts +1 -5
  150. package/lib/composables/locale.js.map +1 -1
  151. package/lib/composables/theme.d.ts +1 -6
  152. package/lib/composables/theme.js +29 -97
  153. package/lib/composables/theme.js.map +1 -1
  154. package/lib/composables/virtual.js +1 -6
  155. package/lib/composables/virtual.js.map +1 -1
  156. package/lib/directives/ripple/index.d.ts +1 -2
  157. package/lib/directives/ripple/index.js +7 -12
  158. package/lib/directives/ripple/index.js.map +1 -1
  159. package/lib/entry-bundler.d.ts +3 -4
  160. package/lib/entry-bundler.js +1 -1
  161. package/lib/entry-bundler.js.map +1 -1
  162. package/lib/framework.d.ts +64 -83
  163. package/lib/framework.js +1 -1
  164. package/lib/framework.js.map +1 -1
  165. package/lib/labs/VCalendar/VCalendar.d.ts +0 -10
  166. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  167. package/lib/labs/VDateInput/VDateInput.d.ts +87 -97
  168. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  169. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +10 -20
  170. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  171. package/lib/labs/VIconBtn/VIconBtn.js +11 -7
  172. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  173. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +10 -20
  174. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +10 -20
  175. package/lib/labs/VTreeview/VTreeview.d.ts +0 -13
  176. package/lib/labs/VTreeview/VTreeviewItem.d.ts +10 -20
  177. package/lib/labs/components.d.ts +0 -1
  178. package/lib/labs/components.js +0 -1
  179. package/lib/labs/components.js.map +1 -1
  180. package/lib/labs/entry-bundler.d.ts +3 -4
  181. package/lib/locale/adapters/vue-i18n.js +1 -6
  182. package/lib/locale/adapters/vue-i18n.js.map +1 -1
  183. package/lib/locale/adapters/vuetify.js +1 -7
  184. package/lib/locale/adapters/vuetify.js.map +1 -1
  185. package/lib/util/globals.d.ts +0 -1
  186. package/lib/util/globals.js +0 -1
  187. package/lib/util/globals.js.map +1 -1
  188. package/lib/util/helpers.d.ts +1 -2
  189. package/lib/util/helpers.js +7 -12
  190. package/lib/util/helpers.js.map +1 -1
  191. package/package.json +1 -3
  192. package/lib/components/VKbd/VKbd.d.ts +0 -221
  193. package/lib/components/VKbd/VKbd.js +0 -55
  194. package/lib/components/VKbd/VKbd.js.map +0 -1
  195. package/lib/composables/date/adapters/string.d.ts +0 -54
  196. package/lib/composables/date/adapters/string.js +0 -153
  197. package/lib/composables/date/adapters/string.js.map +0 -1
  198. package/lib/composables/iconSizes.d.ts +0 -28
  199. package/lib/composables/iconSizes.js +0 -23
  200. package/lib/composables/iconSizes.js.map +0 -1
  201. package/lib/composables/mask.d.ts +0 -38
  202. package/lib/composables/mask.js +0 -183
  203. package/lib/composables/mask.js.map +0 -1
  204. package/lib/labs/VMaskInput/VMaskInput.d.ts +0 -6993
  205. package/lib/labs/VMaskInput/VMaskInput.js +0 -67
  206. package/lib/labs/VMaskInput/VMaskInput.js.map +0 -1
  207. package/lib/labs/VMaskInput/index.d.ts +0 -1
  208. package/lib/labs/VMaskInput/index.js +0 -2
  209. package/lib/labs/VMaskInput/index.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.9-dev.2025-06-13
2
+ * Vuetify v3.8.9-master.2025-06-12
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -85,7 +85,6 @@
85
85
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
86
86
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
87
87
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
88
- const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
89
88
 
90
89
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
91
90
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -592,23 +591,18 @@
592
591
  function isPrimitive(value) {
593
592
  return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint';
594
593
  }
595
- function escapeForRegex(sign) {
596
- return '\\^$*+?.()|{}[]'.includes(sign) ? `\\${sign}` : sign;
597
- }
598
- function extractNumber(text, decimalDigitsLimit, decimalSeparator) {
599
- const onlyValidCharacters = new RegExp(`[\\d\\-${escapeForRegex(decimalSeparator)}]`);
600
- const cleanText = text.split('').filter(x => onlyValidCharacters.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
594
+ function extractNumber(text, decimalDigitsLimit) {
595
+ const cleanText = text.split('').filter(x => /[\d\-.]/.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
601
596
  // sign allowed at the start
602
- x === decimalSeparator && i === all.indexOf(x) ||
597
+ x === '.' && i === all.indexOf('.') ||
603
598
  // decimal separator allowed only once
604
599
  /\d/.test(x)).join('');
605
600
  if (decimalDigitsLimit === 0) {
606
- return cleanText.split(decimalSeparator)[0];
601
+ return cleanText.split('.')[0];
607
602
  }
608
- const decimalPart = new RegExp(`${escapeForRegex(decimalSeparator)}\\d`);
609
- if (decimalDigitsLimit !== null && decimalPart.test(cleanText)) {
610
- const parts = cleanText.split(decimalSeparator);
611
- return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join(decimalSeparator);
603
+ if (decimalDigitsLimit !== null && /\.\d/.test(cleanText)) {
604
+ const parts = cleanText.split('.');
605
+ return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join('.');
612
606
  }
613
607
  return cleanText;
614
608
  }
@@ -2184,10 +2178,6 @@
2184
2178
  return numberFormat.format(value);
2185
2179
  };
2186
2180
  }
2187
- function inferDecimalSeparator(current, fallback) {
2188
- const format = createNumberFunction(current, fallback);
2189
- return format(0.1).includes(',') ? ',' : '.';
2190
- }
2191
2181
  function useProvided(props, prop, provided) {
2192
2182
  const internal = useProxiedModel(props, prop, props[prop] ?? provided.value);
2193
2183
 
@@ -2210,7 +2200,6 @@
2210
2200
  current,
2211
2201
  fallback,
2212
2202
  messages,
2213
- decimalSeparator: vue.toRef(() => inferDecimalSeparator(current, fallback)),
2214
2203
  t: createTranslateFunction(current, fallback, messages),
2215
2204
  n: createNumberFunction(current, fallback),
2216
2205
  provide: createProvideFunction({
@@ -2233,7 +2222,6 @@
2233
2222
  current,
2234
2223
  fallback,
2235
2224
  messages,
2236
- decimalSeparator: vue.toRef(() => options?.decimalSeparator ?? inferDecimalSeparator(current, fallback)),
2237
2225
  t: createTranslateFunction(current, fallback, messages),
2238
2226
  n: createNumberFunction(current, fallback),
2239
2227
  provide: createProvideFunction({
@@ -2360,7 +2348,6 @@
2360
2348
  function genDefaults$2() {
2361
2349
  return {
2362
2350
  defaultTheme: 'light',
2363
- prefix: 'v-',
2364
2351
  variations: {
2365
2352
  colors: [],
2366
2353
  lighten: 0,
@@ -2398,8 +2385,8 @@
2398
2385
  'activated-opacity': 0.12,
2399
2386
  'pressed-opacity': 0.12,
2400
2387
  'dragged-opacity': 0.08,
2401
- 'theme-kbd': '#EEEEEE',
2402
- 'theme-on-kbd': '#000000',
2388
+ 'theme-kbd': '#212529',
2389
+ 'theme-on-kbd': '#FFFFFF',
2403
2390
  'theme-code': '#F5F5F5',
2404
2391
  'theme-on-code': '#000000'
2405
2392
  }
@@ -2435,17 +2422,14 @@
2435
2422
  'activated-opacity': 0.12,
2436
2423
  'pressed-opacity': 0.16,
2437
2424
  'dragged-opacity': 0.08,
2438
- 'theme-kbd': '#424242',
2425
+ 'theme-kbd': '#212529',
2439
2426
  'theme-on-kbd': '#FFFFFF',
2440
2427
  'theme-code': '#343434',
2441
2428
  'theme-on-code': '#CCCCCC'
2442
2429
  }
2443
2430
  }
2444
2431
  },
2445
- stylesheetId: 'vuetify-theme-stylesheet',
2446
- scoped: false,
2447
- unimportant: false,
2448
- utilities: true
2432
+ stylesheetId: 'vuetify-theme-stylesheet'
2449
2433
  };
2450
2434
  }
2451
2435
  function parseThemeOptions() {
@@ -2468,21 +2452,21 @@
2468
2452
  function createCssClass(lines, selector, content, scope) {
2469
2453
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2470
2454
  }
2471
- function genCssVariables(theme, prefix) {
2455
+ function genCssVariables(theme) {
2472
2456
  const lightOverlay = theme.dark ? 2 : 1;
2473
2457
  const darkOverlay = theme.dark ? 1 : 2;
2474
2458
  const variables = [];
2475
2459
  for (const [key, value] of Object.entries(theme.colors)) {
2476
2460
  const rgb = parseColor(value);
2477
- variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2461
+ variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2478
2462
  if (!key.startsWith('on-')) {
2479
- variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2463
+ variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2480
2464
  }
2481
2465
  }
2482
2466
  for (const [key, value] of Object.entries(theme.variables)) {
2483
2467
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2484
2468
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2485
- variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2469
+ variables.push(`--v-${key}: ${rgb ?? value}`);
2486
2470
  }
2487
2471
  return variables;
2488
2472
  }
@@ -2526,8 +2510,7 @@
2526
2510
  const scopeSelector = `:where(${scope})`;
2527
2511
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2528
2512
  }
2529
- function upsertStyles(id, cspNonce, styles) {
2530
- const styleEl = getOrCreateStyleElement(id, cspNonce);
2513
+ function upsertStyles(styleEl, styles) {
2531
2514
  if (!styleEl) return;
2532
2515
  styleEl.innerHTML = styles;
2533
2516
  }
@@ -2547,17 +2530,8 @@
2547
2530
  // Composables
2548
2531
  function createTheme(options) {
2549
2532
  const parsedOptions = parseThemeOptions(options);
2550
- const _name = vue.shallowRef(parsedOptions.defaultTheme);
2533
+ const name = vue.shallowRef(parsedOptions.defaultTheme);
2551
2534
  const themes = vue.ref(parsedOptions.themes);
2552
- const systemName = vue.shallowRef('light');
2553
- const name = vue.computed({
2554
- get() {
2555
- return _name.value === 'system' ? systemName.value : _name.value;
2556
- },
2557
- set(val) {
2558
- _name.value = val;
2559
- }
2560
- });
2561
2535
  const computedThemes = vue.computed(() => {
2562
2536
  const acc = {};
2563
2537
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2578,49 +2552,28 @@
2578
2552
  const current = vue.toRef(() => computedThemes.value[name.value]);
2579
2553
  const styles = vue.computed(() => {
2580
2554
  const lines = [];
2581
- const important = parsedOptions.unimportant ? '' : ' !important';
2582
- const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2583
2555
  if (current.value?.dark) {
2584
2556
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2585
2557
  }
2586
- createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2558
+ createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2587
2559
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2588
- createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2589
- }
2590
- if (parsedOptions.utilities) {
2591
- const bgLines = [];
2592
- const fgLines = [];
2593
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2594
- for (const key of colors) {
2595
- if (key.startsWith('on-')) {
2596
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2597
- } else {
2598
- 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);
2599
- createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2600
- createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2601
- }
2560
+ createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2561
+ }
2562
+ const bgLines = [];
2563
+ const fgLines = [];
2564
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2565
+ for (const key of colors) {
2566
+ if (key.startsWith('on-')) {
2567
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2568
+ } else {
2569
+ 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);
2570
+ createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2571
+ createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
2602
2572
  }
2603
- lines.push(...bgLines, ...fgLines);
2604
2573
  }
2574
+ lines.push(...bgLines, ...fgLines);
2605
2575
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2606
2576
  });
2607
- const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2608
- const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
2609
- if (SUPPORTS_MATCH_MEDIA) {
2610
- const media = window.matchMedia('(prefers-color-scheme: dark)');
2611
- function updateSystemName() {
2612
- systemName.value = media.matches ? 'dark' : 'light';
2613
- }
2614
- updateSystemName();
2615
- media.addEventListener('change', updateSystemName, {
2616
- passive: true
2617
- });
2618
- if (vue.getCurrentScope()) {
2619
- vue.onScopeDispose(() => {
2620
- media.removeEventListener('change', updateSystemName);
2621
- });
2622
- }
2623
- }
2624
2577
  function install(app) {
2625
2578
  if (parsedOptions.isDisabled) return;
2626
2579
  const head = app._context.provides.usehead;
@@ -2658,55 +2611,22 @@
2658
2611
  updateStyles();
2659
2612
  }
2660
2613
  function updateStyles() {
2661
- upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2614
+ upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2662
2615
  }
2663
2616
  }
2664
2617
  }
2665
- function change(themeName) {
2666
- if (!themeNames.value.includes(themeName)) {
2667
- consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2668
- return;
2669
- }
2670
- name.value = themeName;
2671
- }
2672
- function cycle() {
2673
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2674
- const currentIndex = themeArray.indexOf(name.value);
2675
- const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2676
- change(themeArray[nextIndex]);
2677
- }
2678
- function toggle() {
2679
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2680
- cycle(themeArray);
2681
- }
2682
- const globalName = new Proxy(name, {
2683
- get(target, prop) {
2684
- return target[prop];
2685
- },
2686
- set(target, prop, val) {
2687
- if (prop === 'value') {
2688
- deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2689
- }
2690
- // @ts-expect-error
2691
- target[prop] = val;
2692
- return true;
2693
- }
2694
- });
2618
+ const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2695
2619
  return {
2696
2620
  install,
2697
- change,
2698
- cycle,
2699
- toggle,
2700
2621
  isDisabled: parsedOptions.isDisabled,
2701
2622
  name,
2702
2623
  themes,
2703
2624
  current,
2704
2625
  computedThemes,
2705
- prefix: parsedOptions.prefix,
2706
2626
  themeClasses,
2707
2627
  styles,
2708
2628
  global: {
2709
- name: globalName,
2629
+ name,
2710
2630
  current
2711
2631
  }
2712
2632
  };
@@ -2717,7 +2637,7 @@
2717
2637
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2718
2638
  const name = vue.toRef(() => props.theme ?? theme.name.value);
2719
2639
  const current = vue.toRef(() => theme.themes.value[name.value]);
2720
- const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2640
+ const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2721
2641
  const newTheme = {
2722
2642
  ...theme,
2723
2643
  name,
@@ -3821,10 +3741,7 @@
3821
3741
  default: 'default',
3822
3742
  validator: v => allowedDensities$1.includes(v)
3823
3743
  },
3824
- extended: {
3825
- type: Boolean,
3826
- default: null
3827
- },
3744
+ extended: Boolean,
3828
3745
  extensionHeight: {
3829
3746
  type: [Number, String],
3830
3747
  default: 48
@@ -3872,7 +3789,7 @@
3872
3789
  const {
3873
3790
  rtlClasses
3874
3791
  } = useRtl();
3875
- const isExtended = vue.shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
3792
+ const isExtended = vue.shallowRef(!!(props.extended || slots.extension?.()));
3876
3793
  const contentHeight = vue.computed(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10));
3877
3794
  const extensionHeight = vue.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);
3878
3795
  provideDefaults({
@@ -3884,7 +3801,7 @@
3884
3801
  const hasTitle = !!(props.title || slots.title);
3885
3802
  const hasImage = !!(slots.image || props.image);
3886
3803
  const extension = slots.extension?.();
3887
- isExtended.value = props.extended === null ? !!extension : props.extended;
3804
+ isExtended.value = !!(props.extended || extension);
3888
3805
  return vue.createVNode(props.tag, {
3889
3806
  "class": vue.normalizeClass(['v-toolbar', {
3890
3807
  'v-toolbar--absolute': props.absolute,
@@ -4267,15 +4184,9 @@
4267
4184
  };
4268
4185
  }
4269
4186
 
4270
- // Types
4271
-
4272
4187
  const makeVBtnGroupProps = propsFactory({
4273
4188
  baseColor: String,
4274
4189
  divided: Boolean,
4275
- direction: {
4276
- type: String,
4277
- default: 'horizontal'
4278
- },
4279
4190
  ...makeBorderProps(),
4280
4191
  ...makeComponentProps(),
4281
4192
  ...makeDensityProps(),
@@ -4309,7 +4220,7 @@
4309
4220
  } = useRounded(props);
4310
4221
  provideDefaults({
4311
4222
  VBtn: {
4312
- height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4223
+ height: 'auto',
4313
4224
  baseColor: vue.toRef(() => props.baseColor),
4314
4225
  color: vue.toRef(() => props.color),
4315
4226
  density: vue.toRef(() => props.density),
@@ -4319,7 +4230,7 @@
4319
4230
  });
4320
4231
  useRender(() => {
4321
4232
  return vue.createVNode(props.tag, {
4322
- "class": vue.normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4233
+ "class": vue.normalizeClass(['v-btn-group', {
4323
4234
  'v-btn-group--divided': props.divided
4324
4235
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4325
4236
  "style": vue.normalizeStyle(props.style)
@@ -5651,8 +5562,8 @@
5651
5562
  window.clearTimeout(element._ripple.showTimer);
5652
5563
  }
5653
5564
  let keyboardRipple = false;
5654
- function keyboardRippleShow(e, keys) {
5655
- if (!keyboardRipple && keys.includes(e.keyCode)) {
5565
+ function keyboardRippleShow(e) {
5566
+ if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5656
5567
  keyboardRipple = true;
5657
5568
  rippleShow(e);
5658
5569
  }
@@ -5680,12 +5591,9 @@
5680
5591
  el._ripple.enabled = enabled;
5681
5592
  el._ripple.centered = modifiers.center;
5682
5593
  el._ripple.circle = modifiers.circle;
5683
- const bindingValue = isObject(value) ? value : {};
5684
- if (bindingValue.class) {
5685
- el._ripple.class = bindingValue.class;
5594
+ if (isObject(value) && value.class) {
5595
+ el._ripple.class = value.class;
5686
5596
  }
5687
- const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5688
- el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5689
5597
  if (enabled && !wasEnabled) {
5690
5598
  if (modifiers.stop) {
5691
5599
  el.addEventListener('touchstart', rippleStop, {
@@ -5707,7 +5615,7 @@
5707
5615
  el.addEventListener('mousedown', rippleShow);
5708
5616
  el.addEventListener('mouseup', rippleHide);
5709
5617
  el.addEventListener('mouseleave', rippleHide);
5710
- el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5618
+ el.addEventListener('keydown', keyboardRippleShow);
5711
5619
  el.addEventListener('keyup', keyboardRippleHide);
5712
5620
  el.addEventListener('blur', focusRippleHide);
5713
5621
 
@@ -5727,9 +5635,7 @@
5727
5635
  el.removeEventListener('touchcancel', rippleHide);
5728
5636
  el.removeEventListener('mouseup', rippleHide);
5729
5637
  el.removeEventListener('mouseleave', rippleHide);
5730
- if (el._ripple?.keyDownHandler) {
5731
- el.removeEventListener('keydown', el._ripple.keyDownHandler);
5732
- }
5638
+ el.removeEventListener('keydown', keyboardRippleShow);
5733
5639
  el.removeEventListener('keyup', keyboardRippleHide);
5734
5640
  el.removeEventListener('dragstart', rippleHide);
5735
5641
  el.removeEventListener('blur', focusRippleHide);
@@ -5738,8 +5644,8 @@
5738
5644
  updateRipple(el, binding, false);
5739
5645
  }
5740
5646
  function unmounted$4(el) {
5741
- removeListeners(el);
5742
5647
  delete el._ripple;
5648
+ removeListeners(el);
5743
5649
  }
5744
5650
  function updated$1(el, binding) {
5745
5651
  if (binding.value === binding.oldValue) {
@@ -6012,31 +5918,6 @@
6012
5918
  // Utilities
6013
5919
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6014
5920
 
6015
- // Utilities
6016
-
6017
- // Types
6018
-
6019
- // Types
6020
-
6021
- // Composables
6022
- const makeIconSizeProps = propsFactory({
6023
- iconSize: [Number, String],
6024
- iconSizes: {
6025
- type: Array,
6026
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6027
- }
6028
- }, 'iconSize');
6029
- function useIconSizes(props, fallback) {
6030
- const iconSize = vue.computed(() => {
6031
- const iconSizeMap = new Map(props.iconSizes);
6032
- const _iconSize = props.iconSize ?? fallback() ?? 'default';
6033
- return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6034
- });
6035
- return {
6036
- iconSize
6037
- };
6038
- }
6039
-
6040
5921
  // Types
6041
5922
 
6042
5923
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6076,7 +5957,6 @@
6076
5957
  ...makeDensityProps(),
6077
5958
  ...makeDimensionProps(),
6078
5959
  ...makeElevationProps(),
6079
- ...makeIconSizeProps(),
6080
5960
  ...makeLocationProps(),
6081
5961
  ...makePositionProps(),
6082
5962
  ...makeRoundedProps(),
@@ -6104,9 +5984,6 @@
6104
5984
  if (!props.type) return props.icon;
6105
5985
  return props.icon ?? `$${props.type}`;
6106
5986
  });
6107
- const {
6108
- iconSize
6109
- } = useIconSizes(props, () => props.prominent ? 44 : 28);
6110
5987
  const {
6111
5988
  themeClasses
6112
5989
  } = provideTheme(props);
@@ -6154,11 +6031,6 @@
6154
6031
  const hasPrepend = !!(slots.prepend || icon.value);
6155
6032
  const hasTitle = !!(slots.title || props.title);
6156
6033
  const hasClose = !!(slots.close || props.closable);
6157
- const iconProps = {
6158
- density: props.density,
6159
- icon: icon.value,
6160
- size: iconSize.value
6161
- };
6162
6034
  return isActive.value && vue.createVNode(props.tag, {
6163
6035
  "class": vue.normalizeClass(['v-alert', props.border && {
6164
6036
  'v-alert--border': !!props.border,
@@ -6176,14 +6048,19 @@
6176
6048
  }, null), hasPrepend && vue.createElementVNode("div", {
6177
6049
  "key": "prepend",
6178
6050
  "class": "v-alert__prepend"
6179
- }, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
6180
- "key": "prepend-icon"
6181
- }, iconProps), null) : vue.createVNode(VDefaultsProvider, {
6051
+ }, [!slots.prepend ? vue.createVNode(VIcon, {
6052
+ "key": "prepend-icon",
6053
+ "density": props.density,
6054
+ "icon": icon.value,
6055
+ "size": props.prominent ? 44 : 28
6056
+ }, null) : vue.createVNode(VDefaultsProvider, {
6182
6057
  "key": "prepend-defaults",
6183
6058
  "disabled": !icon.value,
6184
6059
  "defaults": {
6185
6060
  VIcon: {
6186
- ...iconProps
6061
+ density: props.density,
6062
+ icon: icon.value,
6063
+ size: props.prominent ? 44 : 28
6187
6064
  }
6188
6065
  }
6189
6066
  }, slots.prepend)]), vue.createElementVNode("div", {
@@ -7708,7 +7585,6 @@
7708
7585
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7709
7586
  const makeVSlideGroupProps = propsFactory({
7710
7587
  centerActive: Boolean,
7711
- contentClass: null,
7712
7588
  direction: {
7713
7589
  type: String,
7714
7590
  default: 'horizontal'
@@ -8021,7 +7897,7 @@
8021
7897
  })]), vue.createElementVNode("div", {
8022
7898
  "key": "container",
8023
7899
  "ref": containerRef,
8024
- "class": vue.normalizeClass(['v-slide-group__container', props.contentClass]),
7900
+ "class": "v-slide-group__container",
8025
7901
  "onScroll": onScroll
8026
7902
  }, [vue.createElementVNode("div", {
8027
7903
  "ref": contentRef,
@@ -8384,85 +8260,16 @@
8384
8260
  }
8385
8261
  });
8386
8262
 
8387
- const makeVDividerProps = propsFactory({
8388
- color: String,
8389
- inset: Boolean,
8390
- length: [Number, String],
8391
- opacity: [Number, String],
8392
- thickness: [Number, String],
8393
- vertical: Boolean,
8394
- ...makeComponentProps(),
8395
- ...makeThemeProps()
8396
- }, 'VDivider');
8397
- const VDivider = genericComponent()({
8398
- name: 'VDivider',
8399
- props: makeVDividerProps(),
8400
- setup(props, _ref) {
8401
- let {
8402
- attrs,
8403
- slots
8404
- } = _ref;
8405
- const {
8406
- themeClasses
8407
- } = provideTheme(props);
8408
- const {
8409
- textColorClasses,
8410
- textColorStyles
8411
- } = useTextColor(() => props.color);
8412
- const dividerStyles = vue.computed(() => {
8413
- const styles = {};
8414
- if (props.length) {
8415
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8416
- }
8417
- if (props.thickness) {
8418
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8419
- }
8420
- return styles;
8421
- });
8422
- useRender(() => {
8423
- const divider = vue.createElementVNode("hr", {
8424
- "class": vue.normalizeClass([{
8425
- 'v-divider': true,
8426
- 'v-divider--inset': props.inset,
8427
- 'v-divider--vertical': props.vertical
8428
- }, themeClasses.value, textColorClasses.value, props.class]),
8429
- "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
8430
- '--v-border-opacity': props.opacity
8431
- }, props.style]),
8432
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8433
- "role": `${attrs.role || 'separator'}`
8434
- }, null);
8435
- if (!slots.default) return divider;
8436
- return vue.createElementVNode("div", {
8437
- "class": vue.normalizeClass(['v-divider__wrapper', {
8438
- 'v-divider__wrapper--vertical': props.vertical,
8439
- 'v-divider__wrapper--inset': props.inset
8440
- }])
8441
- }, [divider, vue.createElementVNode("div", {
8442
- "class": "v-divider__content"
8443
- }, [slots.default()]), divider]);
8444
- });
8445
- return {};
8446
- }
8447
- });
8448
-
8449
8263
  // Utilities
8450
8264
 
8451
8265
  // List
8452
8266
  const ListKey = Symbol.for('vuetify:list');
8453
8267
  function createList() {
8454
- let {
8455
- filterable
8456
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8457
- filterable: false
8458
- };
8459
8268
  const parent = vue.inject(ListKey, {
8460
- filterable: false,
8461
8269
  hasPrepend: vue.shallowRef(false),
8462
8270
  updateHasPrepend: () => null
8463
8271
  });
8464
8272
  const data = {
8465
- filterable: parent.filterable || filterable,
8466
8273
  hasPrepend: vue.shallowRef(false),
8467
8274
  updateHasPrepend: value => {
8468
8275
  if (value) data.hasPrepend.value = value;
@@ -9414,9 +9221,6 @@
9414
9221
  roundedClasses
9415
9222
  } = useRounded(roundedProps);
9416
9223
  const lineClasses = vue.toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9417
- const rippleOptions = vue.toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9418
- keys: [keyCodes.enter]
9419
- } : props.ripple);
9420
9224
  const slotProps = vue.computed(() => ({
9421
9225
  isActive: isActive.value,
9422
9226
  select,
@@ -9441,9 +9245,8 @@
9441
9245
  function onKeyDown(e) {
9442
9246
  const target = e.target;
9443
9247
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9444
- if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9248
+ if (e.key === 'Enter' || e.key === ' ') {
9445
9249
  e.preventDefault();
9446
- e.stopPropagation();
9447
9250
  e.target.dispatchEvent(new MouseEvent('click', e));
9448
9251
  }
9449
9252
  }
@@ -9553,7 +9356,7 @@
9553
9356
  }), vue.createElementVNode("div", {
9554
9357
  "class": "v-list-item__spacer"
9555
9358
  }, null)])]
9556
- }), [[Ripple, isClickable.value && rippleOptions.value]]);
9359
+ }), [[Ripple, isClickable.value && props.ripple]]);
9557
9360
  });
9558
9361
  return {
9559
9362
  activate,
@@ -9608,6 +9411,68 @@
9608
9411
  }
9609
9412
  });
9610
9413
 
9414
+ const makeVDividerProps = propsFactory({
9415
+ color: String,
9416
+ inset: Boolean,
9417
+ length: [Number, String],
9418
+ opacity: [Number, String],
9419
+ thickness: [Number, String],
9420
+ vertical: Boolean,
9421
+ ...makeComponentProps(),
9422
+ ...makeThemeProps()
9423
+ }, 'VDivider');
9424
+ const VDivider = genericComponent()({
9425
+ name: 'VDivider',
9426
+ props: makeVDividerProps(),
9427
+ setup(props, _ref) {
9428
+ let {
9429
+ attrs,
9430
+ slots
9431
+ } = _ref;
9432
+ const {
9433
+ themeClasses
9434
+ } = provideTheme(props);
9435
+ const {
9436
+ textColorClasses,
9437
+ textColorStyles
9438
+ } = useTextColor(() => props.color);
9439
+ const dividerStyles = vue.computed(() => {
9440
+ const styles = {};
9441
+ if (props.length) {
9442
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9443
+ }
9444
+ if (props.thickness) {
9445
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9446
+ }
9447
+ return styles;
9448
+ });
9449
+ useRender(() => {
9450
+ const divider = vue.createElementVNode("hr", {
9451
+ "class": vue.normalizeClass([{
9452
+ 'v-divider': true,
9453
+ 'v-divider--inset': props.inset,
9454
+ 'v-divider--vertical': props.vertical
9455
+ }, themeClasses.value, textColorClasses.value, props.class]),
9456
+ "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
9457
+ '--v-border-opacity': props.opacity
9458
+ }, props.style]),
9459
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9460
+ "role": `${attrs.role || 'separator'}`
9461
+ }, null);
9462
+ if (!slots.default) return divider;
9463
+ return vue.createElementVNode("div", {
9464
+ "class": vue.normalizeClass(['v-divider__wrapper', {
9465
+ 'v-divider__wrapper--vertical': props.vertical,
9466
+ 'v-divider__wrapper--inset': props.inset
9467
+ }])
9468
+ }, [divider, vue.createElementVNode("div", {
9469
+ "class": "v-divider__content"
9470
+ }, [slots.default()]), divider]);
9471
+ });
9472
+ return {};
9473
+ }
9474
+ });
9475
+
9611
9476
  // Types
9612
9477
 
9613
9478
  const makeVListChildrenProps = propsFactory({
@@ -9876,7 +9741,6 @@
9876
9741
  activeClass: String,
9877
9742
  bgColor: String,
9878
9743
  disabled: Boolean,
9879
- filterable: Boolean,
9880
9744
  expandIcon: IconValue,
9881
9745
  collapseIcon: IconValue,
9882
9746
  lines: {
@@ -9960,9 +9824,7 @@
9960
9824
  const activeColor = vue.toRef(() => props.activeColor);
9961
9825
  const baseColor = vue.toRef(() => props.baseColor);
9962
9826
  const color = vue.toRef(() => props.color);
9963
- createList({
9964
- filterable: props.filterable
9965
- });
9827
+ createList();
9966
9828
  provideDefaults({
9967
9829
  VListGroup: {
9968
9830
  activeColor,
@@ -11645,7 +11507,6 @@
11645
11507
  // disableKeys: Boolean,
11646
11508
  id: String,
11647
11509
  submenu: Boolean,
11648
- disableInitialFocus: Boolean,
11649
11510
  ...omit(makeVOverlayProps({
11650
11511
  closeDelay: 250,
11651
11512
  closeOnContentClick: true,
@@ -11720,7 +11581,7 @@
11720
11581
  vue.watch(isActive, val => {
11721
11582
  if (val) {
11722
11583
  parent?.register();
11723
- if (IN_BROWSER && !props.disableInitialFocus) {
11584
+ if (IN_BROWSER) {
11724
11585
  document.addEventListener('focusin', onFocusIn, {
11725
11586
  once: true
11726
11587
  });
@@ -12540,12 +12401,7 @@
12540
12401
  }
12541
12402
  function calculateOffset(index) {
12542
12403
  index = clamp(index, 0, items.value.length - 1);
12543
- const whole = Math.floor(index);
12544
- const fraction = index % 1;
12545
- const next = whole + 1;
12546
- const wholeOffset = offsets[whole] || 0;
12547
- const nextOffset = offsets[next] || wholeOffset;
12548
- return wholeOffset + (nextOffset - wholeOffset) * fraction;
12404
+ return offsets[index] || 0;
12549
12405
  }
12550
12406
  function calculateIndex(scrollTop) {
12551
12407
  return binaryClosest(offsets, scrollTop);
@@ -12899,7 +12755,6 @@
12899
12755
  },
12900
12756
  openOnClear: Boolean,
12901
12757
  itemColor: String,
12902
- noAutoScroll: Boolean,
12903
12758
  ...makeItemsProps({
12904
12759
  itemChildren: false
12905
12760
  })
@@ -13114,7 +12969,7 @@
13114
12969
  vue.watch(menu, () => {
13115
12970
  if (!props.hideSelected && menu.value && model.value.length) {
13116
12971
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13117
- IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
12972
+ IN_BROWSER && window.requestAnimationFrame(() => {
13118
12973
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13119
12974
  });
13120
12975
  }
@@ -13207,22 +13062,6 @@
13207
13062
  key: item.value,
13208
13063
  onClick: () => select(item, null)
13209
13064
  });
13210
- if (item.raw.type === 'divider') {
13211
- return slots.divider?.({
13212
- props: item.raw,
13213
- index
13214
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13215
- "key": `divider-${index}`
13216
- }), null);
13217
- }
13218
- if (item.raw.type === 'subheader') {
13219
- return slots.subheader?.({
13220
- props: item.raw,
13221
- index
13222
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13223
- "key": `subheader-${index}`
13224
- }), null);
13225
- }
13226
13065
  return slots.item?.({
13227
13066
  item,
13228
13067
  index,
@@ -13383,9 +13222,6 @@
13383
13222
  let match = -1;
13384
13223
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13385
13224
  if (typeof item === 'object') {
13386
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13387
- continue;
13388
- }
13389
13225
  const filterKeys = keys || Object.keys(transformed);
13390
13226
  for (const key of filterKeys) {
13391
13227
  const value = getPropertyFromItem(transformed, key);
@@ -13588,7 +13424,7 @@
13588
13424
  menu.value = !menu.value;
13589
13425
  }
13590
13426
  function onListKeydown(e) {
13591
- if (checkPrintable(e) || e.key === 'Backspace') {
13427
+ if (e.key !== ' ' && checkPrintable(e)) {
13592
13428
  vTextFieldRef.value?.focus();
13593
13429
  }
13594
13430
  }
@@ -13793,7 +13629,6 @@
13793
13629
  }, props.menuProps), {
13794
13630
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
13795
13631
  "ref": listRef,
13796
- "filterable": true,
13797
13632
  "selected": selectedValues.value,
13798
13633
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13799
13634
  "onMousedown": e => e.preventDefault(),
@@ -13825,22 +13660,6 @@
13825
13660
  active: highlightFirst.value && index === 0 ? true : undefined,
13826
13661
  onClick: () => select(item, null)
13827
13662
  });
13828
- if (item.raw.type === 'divider') {
13829
- return slots.divider?.({
13830
- props: item.raw,
13831
- index
13832
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13833
- "key": `divider-${index}`
13834
- }), null);
13835
- }
13836
- if (item.raw.type === 'subheader') {
13837
- return slots.subheader?.({
13838
- props: item.raw,
13839
- index
13840
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13841
- "key": `subheader-${index}`
13842
- }), null);
13843
- }
13844
13663
  return slots.item?.({
13845
13664
  item,
13846
13665
  index,
@@ -13985,8 +13804,7 @@
13985
13804
  ...makeThemeProps(),
13986
13805
  ...makeTransitionProps({
13987
13806
  transition: 'scale-rotate-transition'
13988
- }),
13989
- ...makeDimensionProps()
13807
+ })
13990
13808
  }, 'VBadge');
13991
13809
  const VBadge = genericComponent()({
13992
13810
  name: 'VBadge',
@@ -14016,9 +13834,6 @@
14016
13834
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
14017
13835
  return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
14018
13836
  });
14019
- const {
14020
- dimensionStyles
14021
- } = useDimension(props);
14022
13837
  useRender(() => {
14023
13838
  const value = Number(props.content);
14024
13839
  const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
@@ -14040,7 +13855,7 @@
14040
13855
  }, {
14041
13856
  default: () => [vue.withDirectives(vue.createElementVNode("span", vue.mergeProps({
14042
13857
  "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
14043
- "style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
13858
+ "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
14044
13859
  "aria-atomic": "true",
14045
13860
  "aria-label": t(props.label, value),
14046
13861
  "aria-live": "polite",
@@ -17449,13 +17264,13 @@
17449
17264
  return null;
17450
17265
  }
17451
17266
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17452
- function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17267
+ function getWeekdays(locale, firstDayOfWeek) {
17453
17268
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17454
17269
  return createRange(7).map(i => {
17455
17270
  const weekday = new Date(sundayJanuarySecond2000);
17456
17271
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17457
17272
  return new Intl.DateTimeFormat(locale, {
17458
- weekday: weekdayFormat ?? 'narrow'
17273
+ weekday: 'narrow'
17459
17274
  }).format(weekday);
17460
17275
  });
17461
17276
  }
@@ -17919,9 +17734,9 @@
17919
17734
  getDiff(date, comparing, unit) {
17920
17735
  return getDiff(date, comparing, unit);
17921
17736
  }
17922
- getWeekdays(firstDayOfWeek, weekdayFormat) {
17737
+ getWeekdays(firstDayOfWeek) {
17923
17738
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17924
- return getWeekdays(this.locale, firstDay, weekdayFormat);
17739
+ return getWeekdays(this.locale, firstDay);
17925
17740
  }
17926
17741
  getYear(date) {
17927
17742
  return getYear(date);
@@ -18276,7 +18091,6 @@
18276
18091
  _search.value = val ?? '';
18277
18092
  if (!props.multiple && !hasSelectionSlot.value) {
18278
18093
  model.value = [transformItem$3(props, val)];
18279
- vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18280
18094
  }
18281
18095
  if (val && props.multiple && props.delimiters?.length) {
18282
18096
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18357,7 +18171,7 @@
18357
18171
  menu.value = !menu.value;
18358
18172
  }
18359
18173
  function onListKeydown(e) {
18360
- if (checkPrintable(e) || e.key === 'Backspace') {
18174
+ if (e.key !== ' ' && checkPrintable(e)) {
18361
18175
  vTextFieldRef.value?.focus();
18362
18176
  }
18363
18177
  }
@@ -18562,7 +18376,6 @@
18562
18376
  }, props.menuProps), {
18563
18377
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
18564
18378
  "ref": listRef,
18565
- "filterable": true,
18566
18379
  "selected": selectedValues.value,
18567
18380
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18568
18381
  "onMousedown": e => e.preventDefault(),
@@ -18594,22 +18407,6 @@
18594
18407
  active: highlightFirst.value && index === 0 ? true : undefined,
18595
18408
  onClick: () => select(item, null)
18596
18409
  });
18597
- if (item.raw.type === 'divider') {
18598
- return slots.divider?.({
18599
- props: item.raw,
18600
- index
18601
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
18602
- "key": `divider-${index}`
18603
- }), null);
18604
- }
18605
- if (item.raw.type === 'subheader') {
18606
- return slots.subheader?.({
18607
- props: item.raw,
18608
- index
18609
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
18610
- "key": `subheader-${index}`
18611
- }), null);
18612
- }
18613
18410
  return slots.item?.({
18614
18411
  item,
18615
18412
  index,
@@ -20492,7 +20289,6 @@
20492
20289
  color: String,
20493
20290
  disableSort: Boolean,
20494
20291
  fixedHeader: Boolean,
20495
- lastFixed: Boolean,
20496
20292
  multiSort: Boolean,
20497
20293
  sortAscIcon: {
20498
20294
  type: IconValue,
@@ -20539,11 +20335,10 @@
20539
20335
  loaderClasses
20540
20336
  } = useLoader(props);
20541
20337
  function getFixedStyles(column, y) {
20542
- if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20338
+ if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20543
20339
  return {
20544
20340
  position: 'sticky',
20545
- left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20546
- right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20341
+ left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20547
20342
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20548
20343
  };
20549
20344
  }
@@ -21059,18 +20854,11 @@
21059
20854
  }
21060
20855
  });
21061
20856
 
21062
- // Types
21063
-
21064
20857
  const makeVTableProps = propsFactory({
21065
20858
  fixedHeader: Boolean,
21066
20859
  fixedFooter: Boolean,
21067
20860
  height: [Number, String],
21068
20861
  hover: Boolean,
21069
- striped: {
21070
- type: String,
21071
- default: null,
21072
- validator: v => ['even', 'odd'].includes(v)
21073
- },
21074
20862
  ...makeComponentProps(),
21075
20863
  ...makeDensityProps(),
21076
20864
  ...makeTagProps(),
@@ -21097,9 +20885,7 @@
21097
20885
  'v-table--fixed-footer': props.fixedFooter,
21098
20886
  'v-table--has-top': !!slots.top,
21099
20887
  'v-table--has-bottom': !!slots.bottom,
21100
- 'v-table--hover': props.hover,
21101
- 'v-table--striped-even': props.striped === 'even',
21102
- 'v-table--striped-odd': props.striped === 'odd'
20888
+ 'v-table--hover': props.hover
21103
20889
  }, themeClasses.value, densityClasses.value, props.class]),
21104
20890
  "style": vue.normalizeStyle(props.style)
21105
20891
  }, {
@@ -22274,8 +22060,7 @@
22274
22060
  firstDayOfWeek: {
22275
22061
  type: [Number, String],
22276
22062
  default: undefined
22277
- },
22278
- weekdayFormat: String
22063
+ }
22279
22064
  }, 'calendar');
22280
22065
  function useCalendar(props) {
22281
22066
  const adapter = useDate();
@@ -22516,7 +22301,7 @@
22516
22301
  "ref": daysRef,
22517
22302
  "key": daysInMonth.value[0].date?.toString(),
22518
22303
  "class": "v-date-picker-month__days"
22519
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createElementVNode("div", {
22304
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
22520
22305
  "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22521
22306
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22522
22307
  const slotProps = {
@@ -23021,9 +22806,7 @@
23021
22806
  "max": maxDate.value,
23022
22807
  "year": year.value,
23023
22808
  "allowedMonths": allowedMonths
23024
- }), {
23025
- ...pick(slots, ['month'])
23026
- }) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
22809
+ }), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
23027
22810
  "key": "date-picker-years"
23028
22811
  }, datePickerYearsProps, {
23029
22812
  "modelValue": year.value,
@@ -23031,9 +22814,7 @@
23031
22814
  "min": minDate.value,
23032
22815
  "max": maxDate.value,
23033
22816
  "allowedYears": allowedYears
23034
- }), {
23035
- ...pick(slots, ['year'])
23036
- }) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
22817
+ }), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
23037
22818
  "key": "date-picker-month"
23038
22819
  }, datePickerMonthProps, {
23039
22820
  "modelValue": model.value,
@@ -23044,9 +22825,7 @@
23044
22825
  "onUpdate:year": [$event => year.value = $event, onUpdateYear],
23045
22826
  "min": minDate.value,
23046
22827
  "max": maxDate.value
23047
- }), {
23048
- ...pick(slots, ['day'])
23049
- })]
22828
+ }), null)]
23050
22829
  })]),
23051
22830
  actions: slots.actions
23052
22831
  });
@@ -24137,9 +23916,6 @@
24137
23916
  startStatus.value = status;
24138
23917
  } else if (side === 'end') {
24139
23918
  endStatus.value = status;
24140
- } else if (side === 'both') {
24141
- startStatus.value = status;
24142
- endStatus.value = status;
24143
23919
  }
24144
23920
  }
24145
23921
  function getStatus(side) {
@@ -24251,32 +24027,6 @@
24251
24027
  }, [renderSide('end', endStatus.value)])]
24252
24028
  });
24253
24029
  });
24254
- function reset(side) {
24255
- const effectiveSide = side ?? props.side;
24256
- setStatus(effectiveSide, 'ok');
24257
- vue.nextTick(() => {
24258
- setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
24259
- if (props.mode !== 'manual') {
24260
- vue.nextTick(() => {
24261
- window.requestAnimationFrame(() => {
24262
- window.requestAnimationFrame(() => {
24263
- window.requestAnimationFrame(() => {
24264
- if (effectiveSide === 'both') {
24265
- intersecting('start');
24266
- intersecting('end');
24267
- } else {
24268
- intersecting(effectiveSide);
24269
- }
24270
- });
24271
- });
24272
- });
24273
- });
24274
- }
24275
- });
24276
- }
24277
- return {
24278
- reset
24279
- };
24280
24030
  }
24281
24031
  });
24282
24032
 
@@ -24356,47 +24106,8 @@
24356
24106
  }
24357
24107
  });
24358
24108
 
24359
- const makeVKbdProps = propsFactory({
24360
- ...makeBorderProps(),
24361
- ...makeComponentProps(),
24362
- ...makeRoundedProps(),
24363
- ...makeTagProps({
24364
- tag: 'kbd'
24365
- }),
24366
- ...makeThemeProps(),
24367
- ...makeElevationProps(),
24368
- color: String
24369
- }, 'VKbd');
24370
- const VKbd = genericComponent()({
24371
- name: 'VKbd',
24372
- props: makeVKbdProps(),
24373
- setup(props, _ref) {
24374
- let {
24375
- slots
24376
- } = _ref;
24377
- const {
24378
- themeClasses
24379
- } = provideTheme(props);
24380
- const {
24381
- borderClasses
24382
- } = useBorder(props);
24383
- const {
24384
- roundedClasses
24385
- } = useRounded(props);
24386
- const {
24387
- backgroundColorClasses,
24388
- backgroundColorStyles
24389
- } = useBackgroundColor(() => props.color);
24390
- const {
24391
- elevationClasses
24392
- } = useElevation(props);
24393
- useRender(() => vue.createVNode(props.tag, {
24394
- "class": vue.normalizeClass(['v-kbd', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
24395
- "style": vue.normalizeStyle([backgroundColorStyles.value, props.style])
24396
- }, slots));
24397
- return {};
24398
- }
24399
- });
24109
+ // Styles
24110
+ const VKbd = createSimpleFunctional('v-kbd', 'kbd');
24400
24111
 
24401
24112
  const makeVLayoutProps = propsFactory({
24402
24113
  ...makeComponentProps(),
@@ -25234,14 +24945,6 @@
25234
24945
  type: Number,
25235
24946
  default: 0
25236
24947
  },
25237
- minFractionDigits: {
25238
- type: Number,
25239
- default: null
25240
- },
25241
- decimalSeparator: {
25242
- type: String,
25243
- validator: v => !v || v.length === 1
25244
- },
25245
24948
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25246
24949
  }, 'VNumberInput');
25247
24950
  const VNumberInput = genericComponent()({
@@ -25267,24 +24970,11 @@
25267
24970
  const form = useForm(props);
25268
24971
  const controlsDisabled = vue.computed(() => form.isDisabled.value || form.isReadonly.value);
25269
24972
  const isFocused = vue.shallowRef(props.focused);
25270
- const {
25271
- decimalSeparator: decimalSeparatorFromLocale
25272
- } = useLocale();
25273
- const decimalSeparator = vue.computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value);
25274
24973
  function correctPrecision(val) {
25275
24974
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25276
- let trim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
25277
24975
  const fixed = precision == null ? String(val) : val.toFixed(precision);
25278
- if (isFocused.value && trim) {
25279
- return Number(fixed).toString() // trim zeros
25280
- .replace('.', decimalSeparator.value);
25281
- }
25282
- if (props.minFractionDigits === null || precision !== null && precision < props.minFractionDigits) {
25283
- return fixed.replace('.', decimalSeparator.value);
25284
- }
25285
- let [baseDigits, fractionDigits] = fixed.split('.');
25286
- fractionDigits = (fractionDigits ?? '').padEnd(props.minFractionDigits, '0').replace(new RegExp(`(?<=\\d{${props.minFractionDigits}})0`, 'g'), '');
25287
- return [baseDigits, fractionDigits].filter(Boolean).join(decimalSeparator.value);
24976
+ return isFocused.value ? Number(fixed).toString() // trim zeros
24977
+ : fixed;
25288
24978
  }
25289
24979
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25290
24980
  const _inputText = vue.shallowRef(null);
@@ -25301,11 +24991,8 @@
25301
24991
  if (val === null || val === '') {
25302
24992
  model.value = null;
25303
24993
  _inputText.value = null;
25304
- return;
25305
- }
25306
- const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
25307
- if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
25308
- model.value = parsedValue;
24994
+ } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {
24995
+ model.value = Number(val);
25309
24996
  _inputText.value = val;
25310
24997
  }
25311
24998
  }
@@ -25342,7 +25029,6 @@
25342
25029
  }
25343
25030
  };
25344
25031
  vue.watch(() => props.precision, () => formatInputValue());
25345
- vue.watch(() => props.minFractionDigits, () => formatInputValue());
25346
25032
  vue.onMounted(() => {
25347
25033
  clampModel();
25348
25034
  });
@@ -25376,24 +25062,24 @@
25376
25062
  selectionEnd
25377
25063
  } = inputElement ?? {};
25378
25064
  const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
25379
- const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value);
25065
+ const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision);
25380
25066
 
25381
- // Allow only numbers, "-" and {decimal separator}
25382
- // Allow "-" and {decimal separator} only once
25383
- // Allow "-" only at the start
25384
- if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
25067
+ // Only numbers, "-", "." are allowed
25068
+ // AND "-", "." are allowed only once
25069
+ // AND "-" is only allowed at the start
25070
+ if (!/^-?(\d+(\.\d*)?|(\.\d+)|\d*|\.)$/.test(potentialNewInputVal)) {
25385
25071
  e.preventDefault();
25386
25072
  inputElement.value = potentialNewNumber;
25387
25073
  }
25388
25074
  if (props.precision == null) return;
25389
25075
 
25390
25076
  // Ignore decimal digits above precision limit
25391
- if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
25077
+ if (potentialNewInputVal.split('.')[1]?.length > props.precision) {
25392
25078
  e.preventDefault();
25393
25079
  inputElement.value = potentialNewNumber;
25394
25080
  }
25395
25081
  // Ignore decimal separator when precision = 0
25396
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
25082
+ if (props.precision === 0 && potentialNewInputVal.includes('.')) {
25397
25083
  e.preventDefault();
25398
25084
  inputElement.value = potentialNewNumber;
25399
25085
  }
@@ -25445,16 +25131,19 @@
25445
25131
  if (controlsDisabled.value) return;
25446
25132
  if (!vTextFieldRef.value) return;
25447
25133
  const actualText = vTextFieldRef.value.value;
25448
- const parsedValue = Number(actualText.replace(decimalSeparator.value, '.'));
25449
- if (actualText && !isNaN(parsedValue)) {
25450
- inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max));
25134
+ if (actualText && !isNaN(Number(actualText))) {
25135
+ inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max));
25451
25136
  } else {
25452
25137
  inputText.value = null;
25453
25138
  }
25454
25139
  }
25455
25140
  function formatInputValue() {
25456
25141
  if (controlsDisabled.value) return;
25457
- inputText.value = model.value !== null && !isNaN(model.value) ? correctPrecision(model.value, props.precision, false) : null;
25142
+ if (model.value === null || isNaN(model.value)) {
25143
+ inputText.value = null;
25144
+ return;
25145
+ }
25146
+ inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25458
25147
  }
25459
25148
  function trimDecimalZeros() {
25460
25149
  if (controlsDisabled.value) return;
@@ -25462,7 +25151,7 @@
25462
25151
  inputText.value = null;
25463
25152
  return;
25464
25153
  }
25465
- inputText.value = model.value.toString().replace('.', decimalSeparator.value);
25154
+ inputText.value = model.value.toString();
25466
25155
  }
25467
25156
  function onFocus() {
25468
25157
  trimDecimalZeros();
@@ -25714,10 +25403,9 @@
25714
25403
  e.preventDefault();
25715
25404
  e.stopPropagation();
25716
25405
  const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25717
- const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25718
25406
  if (isValidNumber(clipboardText)) return;
25719
25407
  model.value = clipboardText.split('');
25720
- inputRef.value?.[finalIndex].focus();
25408
+ inputRef.value?.[index].blur();
25721
25409
  }
25722
25410
  function reset() {
25723
25411
  model.value = [];
@@ -30417,6 +30105,11 @@
30417
30105
  hideOverlay: Boolean,
30418
30106
  icon: [String, Function, Object],
30419
30107
  iconColor: String,
30108
+ iconSize: [Number, String],
30109
+ iconSizes: {
30110
+ type: Array,
30111
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
30112
+ },
30420
30113
  loading: Boolean,
30421
30114
  opacity: [Number, String],
30422
30115
  readonly: Boolean,
@@ -30436,7 +30129,6 @@
30436
30129
  ...makeBorderProps(),
30437
30130
  ...makeComponentProps(),
30438
30131
  ...makeElevationProps(),
30439
- ...makeIconSizeProps(),
30440
30132
  ...makeRoundedProps(),
30441
30133
  ...makeTagProps({
30442
30134
  tag: 'button'
@@ -30491,6 +30183,7 @@
30491
30183
  })()
30492
30184
  }));
30493
30185
  const btnSizeMap = new Map(props.sizes);
30186
+ const iconSizeMap = new Map(props.iconSizes);
30494
30187
  function onClick() {
30495
30188
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30496
30189
  isActive.value = !isActive.value;
@@ -30502,12 +30195,12 @@
30502
30195
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30503
30196
  const btnHeight = props.height ?? btnSize;
30504
30197
  const btnWidth = props.width ?? btnSize;
30505
- const {
30506
- iconSize
30507
- } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30198
+ const _iconSize = props.iconSize;
30199
+ const hasNamedIconSize = iconSizeMap.has(_iconSize);
30200
+ const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30508
30201
  const iconProps = {
30509
30202
  icon,
30510
- size: iconSize.value,
30203
+ size: iconSize,
30511
30204
  iconColor: props.iconColor,
30512
30205
  opacity: props.opacity
30513
30206
  };
@@ -30550,7 +30243,7 @@
30550
30243
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30551
30244
  "indeterminate": "disable-shrink",
30552
30245
  "width": "2",
30553
- "size": iconSize.value
30246
+ "size": iconSize
30554
30247
  }, null)])]
30555
30248
  });
30556
30249
  });
@@ -30558,251 +30251,6 @@
30558
30251
  }
30559
30252
  });
30560
30253
 
30561
- // Utilities
30562
-
30563
- // Types
30564
-
30565
- const makeMaskProps = propsFactory({
30566
- mask: [String, Object],
30567
- returnMaskedValue: Boolean
30568
- }, 'mask');
30569
- const defaultDelimiters = /[-!$%^&*()_+|~=`{}[\]:";'<>?,./\\ ]/;
30570
- const presets = {
30571
- 'credit-card': '#### - #### - #### - ####',
30572
- date: '##/##/####',
30573
- 'date-time': '##/##/#### ##:##',
30574
- 'iso-date': '####-##-##',
30575
- 'iso-date-time': '####-##-## ##:##',
30576
- phone: '(###) ### - ####',
30577
- social: '###-##-####',
30578
- time: '##:##',
30579
- 'time-with-seconds': '##:##:##'
30580
- };
30581
- function isMaskDelimiter(char) {
30582
- return char ? defaultDelimiters.test(char) : false;
30583
- }
30584
- const defaultTokens = {
30585
- '#': {
30586
- pattern: /[0-9]/
30587
- },
30588
- A: {
30589
- pattern: /[A-Z]/i,
30590
- convert: v => v.toUpperCase()
30591
- },
30592
- a: {
30593
- pattern: /[a-z]/i,
30594
- convert: v => v.toLowerCase()
30595
- },
30596
- N: {
30597
- pattern: /[0-9A-Z]/i,
30598
- convert: v => v.toUpperCase()
30599
- },
30600
- n: {
30601
- pattern: /[0-9a-z]/i,
30602
- convert: v => v.toLowerCase()
30603
- },
30604
- X: {
30605
- pattern: defaultDelimiters
30606
- }
30607
- };
30608
- function useMask(props, inputRef) {
30609
- const mask = vue.computed(() => {
30610
- if (typeof props.mask === 'string') {
30611
- if (props.mask in presets) return presets[props.mask];
30612
- return props.mask;
30613
- }
30614
- return props.mask?.mask ?? '';
30615
- });
30616
- const tokens = vue.computed(() => {
30617
- return {
30618
- ...defaultTokens,
30619
- ...(isObject(props.mask) ? props.mask.tokens : null)
30620
- };
30621
- });
30622
- const selection = vue.shallowRef(0);
30623
- const lazySelection = vue.shallowRef(0);
30624
- function isMask(char) {
30625
- return char in tokens.value;
30626
- }
30627
- function maskValidates(mask, char) {
30628
- if (char == null || !isMask(mask)) return false;
30629
- const item = tokens.value[mask];
30630
- if (item.pattern) return item.pattern.test(char);
30631
- return item.test(char);
30632
- }
30633
- function convert(mask, char) {
30634
- const item = tokens.value[mask];
30635
- return item.convert ? item.convert(char) : char;
30636
- }
30637
- function maskText(text) {
30638
- const trimmedText = text?.trim().replace(/\s+/g, ' ');
30639
- if (trimmedText == null) return '';
30640
- if (!mask.value.length || !trimmedText.length) return trimmedText;
30641
- let textIndex = 0;
30642
- let maskIndex = 0;
30643
- let newText = '';
30644
- while (maskIndex < mask.value.length) {
30645
- const mchar = mask.value[maskIndex];
30646
- const tchar = trimmedText[textIndex];
30647
-
30648
- // Escaped character in mask, the next mask character is inserted
30649
- if (mchar === '\\') {
30650
- newText += mask.value[maskIndex + 1];
30651
- maskIndex += 2;
30652
- continue;
30653
- }
30654
- if (!isMask(mchar)) {
30655
- newText += mchar;
30656
- if (tchar === mchar) {
30657
- textIndex++;
30658
- }
30659
- } else if (maskValidates(mchar, tchar)) {
30660
- newText += convert(mchar, tchar);
30661
- textIndex++;
30662
- } else {
30663
- break;
30664
- }
30665
- maskIndex++;
30666
- }
30667
- return newText;
30668
- }
30669
- function unmaskText(text) {
30670
- if (text == null) return null;
30671
- if (!mask.value.length || !text.length) return text;
30672
- let textIndex = 0;
30673
- let maskIndex = 0;
30674
- let newText = '';
30675
- while (true) {
30676
- const mchar = mask.value[maskIndex];
30677
- const tchar = text[textIndex];
30678
- if (tchar == null) break;
30679
- if (mchar == null) {
30680
- newText += tchar;
30681
- textIndex++;
30682
- continue;
30683
- }
30684
-
30685
- // Escaped character in mask, skip the next input character
30686
- if (mchar === '\\') {
30687
- if (tchar === mask.value[maskIndex + 1]) {
30688
- textIndex++;
30689
- }
30690
- maskIndex += 2;
30691
- continue;
30692
- }
30693
- if (maskValidates(mchar, tchar)) {
30694
- // masked char
30695
- newText += tchar;
30696
- textIndex++;
30697
- maskIndex++;
30698
- continue;
30699
- } else if (mchar !== tchar) {
30700
- // input doesn't match mask, skip forward until it does
30701
- while (true) {
30702
- const mchar = mask.value[maskIndex++];
30703
- if (mchar == null || maskValidates(mchar, tchar)) break;
30704
- }
30705
- continue;
30706
- }
30707
- textIndex++;
30708
- maskIndex++;
30709
- }
30710
- return newText;
30711
- }
30712
- function setCaretPosition(newSelection) {
30713
- selection.value = newSelection;
30714
- inputRef.value && inputRef.value.setSelectionRange(selection.value, selection.value);
30715
- }
30716
- function resetSelections() {
30717
- if (!inputRef.value?.selectionEnd) return;
30718
- selection.value = inputRef.value.selectionEnd;
30719
- lazySelection.value = 0;
30720
- for (let index = 0; index < selection.value; index++) {
30721
- isMaskDelimiter(inputRef.value.value[index]) || lazySelection.value++;
30722
- }
30723
- }
30724
- function updateRange() {
30725
- if (!inputRef.value) return;
30726
- resetSelections();
30727
- let selection = 0;
30728
- const newValue = inputRef.value.value;
30729
- if (newValue) {
30730
- for (let index = 0; index < newValue.length; index++) {
30731
- if (lazySelection.value <= 0) break;
30732
- isMaskDelimiter(newValue[index]) || lazySelection.value--;
30733
- selection++;
30734
- }
30735
- }
30736
- setCaretPosition(selection);
30737
- }
30738
- return {
30739
- updateRange,
30740
- maskText,
30741
- unmaskText
30742
- };
30743
- }
30744
-
30745
- // Types
30746
-
30747
- const makeVMaskInputProps = propsFactory({
30748
- ...makeVTextFieldProps(),
30749
- ...makeMaskProps()
30750
- }, 'VMaskInput');
30751
- const VMaskInput = genericComponent()({
30752
- name: 'VMaskInput',
30753
- props: makeVMaskInputProps(),
30754
- emits: {
30755
- 'update:modelValue': val => true
30756
- },
30757
- setup(props, _ref) {
30758
- let {
30759
- slots,
30760
- emit
30761
- } = _ref;
30762
- const vTextFieldRef = vue.ref();
30763
- const {
30764
- maskText,
30765
- updateRange,
30766
- unmaskText
30767
- } = useMask(props, vTextFieldRef);
30768
- const returnMaskedValue = vue.computed(() => props.mask && props.returnMaskedValue);
30769
- const model = useProxiedModel(props, 'modelValue', undefined,
30770
- // Always display masked value in input when mask is applied
30771
- val => props.mask ? maskText(unmaskText(val)) : val, val => {
30772
- if (props.mask) {
30773
- const valueBeforeChange = unmaskText(model.value);
30774
- // E.g. mask is #-# and the input value is '2-23'
30775
- // model-value should be enforced to '2-2'
30776
- const enforcedMaskedValue = maskText(unmaskText(val));
30777
- const newUnmaskedValue = unmaskText(enforcedMaskedValue);
30778
- if (newUnmaskedValue === valueBeforeChange) {
30779
- vTextFieldRef.value.value = enforcedMaskedValue;
30780
- }
30781
- val = newUnmaskedValue;
30782
- updateRange();
30783
- return returnMaskedValue.value ? maskText(val) : val;
30784
- }
30785
- return val;
30786
- });
30787
- vue.onBeforeMount(() => {
30788
- if (props.returnMaskedValue) {
30789
- emit('update:modelValue', model.value);
30790
- }
30791
- });
30792
- useRender(() => {
30793
- const textFieldProps = VTextField.filterProps(props);
30794
- return vue.createVNode(VTextField, vue.mergeProps(textFieldProps, {
30795
- "modelValue": model.value,
30796
- "onUpdate:modelValue": $event => model.value = $event,
30797
- "ref": vTextFieldRef
30798
- }), {
30799
- ...slots
30800
- });
30801
- });
30802
- return forwardRefs({}, vTextFieldRef);
30803
- }
30804
- });
30805
-
30806
30254
  // Types
30807
30255
 
30808
30256
  const makeVStepperVerticalActionsProps = propsFactory({
@@ -32308,7 +31756,6 @@
32308
31756
  VListSubheader: VListSubheader,
32309
31757
  VLocaleProvider: VLocaleProvider,
32310
31758
  VMain: VMain,
32311
- VMaskInput: VMaskInput,
32312
31759
  VMenu: VMenu,
32313
31760
  VMessages: VMessages,
32314
31761
  VNavigationDrawer: VNavigationDrawer,
@@ -32706,7 +32153,7 @@
32706
32153
  };
32707
32154
  });
32708
32155
  }
32709
- const version$1 = "3.8.9-dev.2025-06-13";
32156
+ const version$1 = "3.8.9-master.2025-06-12";
32710
32157
  createVuetify$1.version = version$1;
32711
32158
 
32712
32159
  // Vue's inject() can only be used in setup
@@ -33004,7 +32451,7 @@
33004
32451
 
33005
32452
  /* eslint-disable local-rules/sort-imports */
33006
32453
 
33007
- const version = "3.8.9-dev.2025-06-13";
32454
+ const version = "3.8.9-master.2025-06-12";
33008
32455
 
33009
32456
  /* eslint-disable local-rules/sort-imports */
33010
32457