@vuetify/nightly 3.8.10-dev.2025-06-18 → 3.8.10-master.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 (209) hide show
  1. package/CHANGELOG.md +3 -54
  2. package/dist/json/attributes.json +1259 -1655
  3. package/dist/json/importMap-labs.json +22 -26
  4. package/dist/json/importMap.json +160 -160
  5. package/dist/json/tags.json +2 -106
  6. package/dist/json/web-types.json +2705 -4334
  7. package/dist/vuetify-labs.cjs +180 -750
  8. package/dist/vuetify-labs.css +4655 -4700
  9. package/dist/vuetify-labs.d.ts +3083 -10404
  10. package/dist/vuetify-labs.esm.js +181 -751
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +180 -750
  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 +3324 -3369
  17. package/dist/vuetify.d.ts +2088 -2790
  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 +1232 -1254
  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.d.ts +10 -28
  86. package/lib/components/VList/VListItem.js +3 -7
  87. package/lib/components/VList/VListItem.js.map +1 -1
  88. package/lib/components/VList/list.d.ts +2 -9
  89. package/lib/components/VList/list.js +0 -7
  90. package/lib/components/VList/list.js.map +1 -1
  91. package/lib/components/VMenu/VMenu.d.ts +0 -13
  92. package/lib/components/VMenu/VMenu.js +1 -2
  93. package/lib/components/VMenu/VMenu.js.map +1 -1
  94. package/lib/components/VNumberInput/VNumberInput.d.ts +89 -114
  95. package/lib/components/VNumberInput/VNumberInput.js +20 -43
  96. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  97. package/lib/components/VOtpInput/VOtpInput.js +1 -2
  98. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  99. package/lib/components/VOverlay/VOverlay.css +1 -1
  100. package/lib/components/VOverlay/_variables.scss +1 -1
  101. package/lib/components/VRadio/VRadio.d.ts +10 -20
  102. package/lib/components/VRadioGroup/VRadioGroup.d.ts +13 -23
  103. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  104. package/lib/components/VSelect/VSelect.d.ts +118 -204
  105. package/lib/components/VSelect/VSelect.js +3 -21
  106. package/lib/components/VSelect/VSelect.js.map +1 -1
  107. package/lib/components/VSelectionControl/VSelectionControl.d.ts +10 -20
  108. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +14 -28
  109. package/lib/components/VSlideGroup/VSlideGroup.d.ts +0 -10
  110. package/lib/components/VSlideGroup/VSlideGroup.js +1 -2
  111. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  112. package/lib/components/VSlider/VSlider.d.ts +3 -3
  113. package/lib/components/VSlider/VSliderThumb.d.ts +10 -20
  114. package/lib/components/VSpeedDial/VSpeedDial.d.ts +0 -13
  115. package/lib/components/VStepper/VStepperItem.d.ts +14 -28
  116. package/lib/components/VSwitch/VSwitch.d.ts +13 -23
  117. package/lib/components/VTable/VTable.css +0 -6
  118. package/lib/components/VTable/VTable.d.ts +24 -55
  119. package/lib/components/VTable/VTable.js +2 -9
  120. package/lib/components/VTable/VTable.js.map +1 -1
  121. package/lib/components/VTable/VTable.sass +0 -14
  122. package/lib/components/VTable/_variables.scss +0 -1
  123. package/lib/components/VTabs/VTab.d.ts +28 -56
  124. package/lib/components/VTabs/VTabs.d.ts +0 -10
  125. package/lib/components/VTextField/VTextField.d.ts +27 -27
  126. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  127. package/lib/components/VToolbar/VToolbar.d.ts +3 -15
  128. package/lib/components/VToolbar/VToolbar.js +3 -6
  129. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  130. package/lib/composables/calendar.d.ts +0 -5
  131. package/lib/composables/calendar.js +1 -2
  132. package/lib/composables/calendar.js.map +1 -1
  133. package/lib/composables/date/DateAdapter.d.ts +3 -3
  134. package/lib/composables/date/DateAdapter.js.map +1 -1
  135. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  136. package/lib/composables/date/adapters/vuetify.js +4 -4
  137. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  138. package/lib/composables/date/date.d.ts +3 -3
  139. package/lib/composables/date/index.d.ts +0 -1
  140. package/lib/composables/date/index.js +0 -1
  141. package/lib/composables/date/index.js.map +1 -1
  142. package/lib/composables/filter.js +0 -3
  143. package/lib/composables/filter.js.map +1 -1
  144. package/lib/composables/locale.d.ts +1 -5
  145. package/lib/composables/locale.js.map +1 -1
  146. package/lib/composables/theme.d.ts +1 -6
  147. package/lib/composables/theme.js +29 -97
  148. package/lib/composables/theme.js.map +1 -1
  149. package/lib/composables/virtual.js +1 -6
  150. package/lib/composables/virtual.js.map +1 -1
  151. package/lib/directives/ripple/index.d.ts +1 -2
  152. package/lib/directives/ripple/index.js +7 -12
  153. package/lib/directives/ripple/index.js.map +1 -1
  154. package/lib/entry-bundler.d.ts +3 -4
  155. package/lib/entry-bundler.js +1 -1
  156. package/lib/entry-bundler.js.map +1 -1
  157. package/lib/framework.d.ts +67 -86
  158. package/lib/framework.js +1 -1
  159. package/lib/framework.js.map +1 -1
  160. package/lib/labs/VCalendar/VCalendar.d.ts +0 -10
  161. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  162. package/lib/labs/VDateInput/VDateInput.d.ts +87 -97
  163. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  164. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +10 -20
  165. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  166. package/lib/labs/VIconBtn/VIconBtn.js +11 -7
  167. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  168. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +10 -20
  169. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +10 -20
  170. package/lib/labs/VTreeview/VTreeview.d.ts +38 -51
  171. package/lib/labs/VTreeview/VTreeview.js +1 -1
  172. package/lib/labs/VTreeview/VTreeview.js.map +1 -1
  173. package/lib/labs/VTreeview/VTreeviewChildren.d.ts +0 -35
  174. package/lib/labs/VTreeview/VTreeviewChildren.js +2 -19
  175. package/lib/labs/VTreeview/VTreeviewChildren.js.map +1 -1
  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.10-dev.2025-06-18
2
+ * Vuetify v3.8.10-master.2025-06-18
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
  }
@@ -2191,10 +2185,6 @@
2191
2185
  return numberFormat.format(value);
2192
2186
  };
2193
2187
  }
2194
- function inferDecimalSeparator(current, fallback) {
2195
- const format = createNumberFunction(current, fallback);
2196
- return format(0.1).includes(',') ? ',' : '.';
2197
- }
2198
2188
  function useProvided(props, prop, provided) {
2199
2189
  const internal = useProxiedModel(props, prop, props[prop] ?? provided.value);
2200
2190
 
@@ -2217,7 +2207,6 @@
2217
2207
  current,
2218
2208
  fallback,
2219
2209
  messages,
2220
- decimalSeparator: vue.toRef(() => inferDecimalSeparator(current, fallback)),
2221
2210
  t: createTranslateFunction(current, fallback, messages),
2222
2211
  n: createNumberFunction(current, fallback),
2223
2212
  provide: createProvideFunction({
@@ -2240,7 +2229,6 @@
2240
2229
  current,
2241
2230
  fallback,
2242
2231
  messages,
2243
- decimalSeparator: vue.toRef(() => options?.decimalSeparator ?? inferDecimalSeparator(current, fallback)),
2244
2232
  t: createTranslateFunction(current, fallback, messages),
2245
2233
  n: createNumberFunction(current, fallback),
2246
2234
  provide: createProvideFunction({
@@ -2367,7 +2355,6 @@
2367
2355
  function genDefaults$2() {
2368
2356
  return {
2369
2357
  defaultTheme: 'light',
2370
- prefix: 'v-',
2371
2358
  variations: {
2372
2359
  colors: [],
2373
2360
  lighten: 0,
@@ -2405,8 +2392,8 @@
2405
2392
  'activated-opacity': 0.12,
2406
2393
  'pressed-opacity': 0.12,
2407
2394
  'dragged-opacity': 0.08,
2408
- 'theme-kbd': '#EEEEEE',
2409
- 'theme-on-kbd': '#000000',
2395
+ 'theme-kbd': '#212529',
2396
+ 'theme-on-kbd': '#FFFFFF',
2410
2397
  'theme-code': '#F5F5F5',
2411
2398
  'theme-on-code': '#000000'
2412
2399
  }
@@ -2442,17 +2429,14 @@
2442
2429
  'activated-opacity': 0.12,
2443
2430
  'pressed-opacity': 0.16,
2444
2431
  'dragged-opacity': 0.08,
2445
- 'theme-kbd': '#424242',
2432
+ 'theme-kbd': '#212529',
2446
2433
  'theme-on-kbd': '#FFFFFF',
2447
2434
  'theme-code': '#343434',
2448
2435
  'theme-on-code': '#CCCCCC'
2449
2436
  }
2450
2437
  }
2451
2438
  },
2452
- stylesheetId: 'vuetify-theme-stylesheet',
2453
- scoped: false,
2454
- unimportant: false,
2455
- utilities: true
2439
+ stylesheetId: 'vuetify-theme-stylesheet'
2456
2440
  };
2457
2441
  }
2458
2442
  function parseThemeOptions() {
@@ -2475,21 +2459,21 @@
2475
2459
  function createCssClass(lines, selector, content, scope) {
2476
2460
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2477
2461
  }
2478
- function genCssVariables(theme, prefix) {
2462
+ function genCssVariables(theme) {
2479
2463
  const lightOverlay = theme.dark ? 2 : 1;
2480
2464
  const darkOverlay = theme.dark ? 1 : 2;
2481
2465
  const variables = [];
2482
2466
  for (const [key, value] of Object.entries(theme.colors)) {
2483
2467
  const rgb = parseColor(value);
2484
- variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2468
+ variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2485
2469
  if (!key.startsWith('on-')) {
2486
- variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2470
+ variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2487
2471
  }
2488
2472
  }
2489
2473
  for (const [key, value] of Object.entries(theme.variables)) {
2490
2474
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2491
2475
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2492
- variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2476
+ variables.push(`--v-${key}: ${rgb ?? value}`);
2493
2477
  }
2494
2478
  return variables;
2495
2479
  }
@@ -2533,8 +2517,7 @@
2533
2517
  const scopeSelector = `:where(${scope})`;
2534
2518
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2535
2519
  }
2536
- function upsertStyles(id, cspNonce, styles) {
2537
- const styleEl = getOrCreateStyleElement(id, cspNonce);
2520
+ function upsertStyles(styleEl, styles) {
2538
2521
  if (!styleEl) return;
2539
2522
  styleEl.innerHTML = styles;
2540
2523
  }
@@ -2554,17 +2537,8 @@
2554
2537
  // Composables
2555
2538
  function createTheme(options) {
2556
2539
  const parsedOptions = parseThemeOptions(options);
2557
- const _name = vue.shallowRef(parsedOptions.defaultTheme);
2540
+ const name = vue.shallowRef(parsedOptions.defaultTheme);
2558
2541
  const themes = vue.ref(parsedOptions.themes);
2559
- const systemName = vue.shallowRef('light');
2560
- const name = vue.computed({
2561
- get() {
2562
- return _name.value === 'system' ? systemName.value : _name.value;
2563
- },
2564
- set(val) {
2565
- _name.value = val;
2566
- }
2567
- });
2568
2542
  const computedThemes = vue.computed(() => {
2569
2543
  const acc = {};
2570
2544
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2585,49 +2559,28 @@
2585
2559
  const current = vue.toRef(() => computedThemes.value[name.value]);
2586
2560
  const styles = vue.computed(() => {
2587
2561
  const lines = [];
2588
- const important = parsedOptions.unimportant ? '' : ' !important';
2589
- const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2590
2562
  if (current.value?.dark) {
2591
2563
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2592
2564
  }
2593
- createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2565
+ createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2594
2566
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2595
- createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2596
- }
2597
- if (parsedOptions.utilities) {
2598
- const bgLines = [];
2599
- const fgLines = [];
2600
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2601
- for (const key of colors) {
2602
- if (key.startsWith('on-')) {
2603
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2604
- } else {
2605
- 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);
2606
- createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2607
- createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2608
- }
2567
+ createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2568
+ }
2569
+ const bgLines = [];
2570
+ const fgLines = [];
2571
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2572
+ for (const key of colors) {
2573
+ if (key.startsWith('on-')) {
2574
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2575
+ } else {
2576
+ 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);
2577
+ createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2578
+ createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
2609
2579
  }
2610
- lines.push(...bgLines, ...fgLines);
2611
2580
  }
2581
+ lines.push(...bgLines, ...fgLines);
2612
2582
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2613
2583
  });
2614
- const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2615
- const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
2616
- if (SUPPORTS_MATCH_MEDIA) {
2617
- const media = window.matchMedia('(prefers-color-scheme: dark)');
2618
- function updateSystemName() {
2619
- systemName.value = media.matches ? 'dark' : 'light';
2620
- }
2621
- updateSystemName();
2622
- media.addEventListener('change', updateSystemName, {
2623
- passive: true
2624
- });
2625
- if (vue.getCurrentScope()) {
2626
- vue.onScopeDispose(() => {
2627
- media.removeEventListener('change', updateSystemName);
2628
- });
2629
- }
2630
- }
2631
2584
  function install(app) {
2632
2585
  if (parsedOptions.isDisabled) return;
2633
2586
  const head = app._context.provides.usehead;
@@ -2665,55 +2618,22 @@
2665
2618
  updateStyles();
2666
2619
  }
2667
2620
  function updateStyles() {
2668
- upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2621
+ upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2669
2622
  }
2670
2623
  }
2671
2624
  }
2672
- function change(themeName) {
2673
- if (!themeNames.value.includes(themeName)) {
2674
- consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2675
- return;
2676
- }
2677
- name.value = themeName;
2678
- }
2679
- function cycle() {
2680
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2681
- const currentIndex = themeArray.indexOf(name.value);
2682
- const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2683
- change(themeArray[nextIndex]);
2684
- }
2685
- function toggle() {
2686
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2687
- cycle(themeArray);
2688
- }
2689
- const globalName = new Proxy(name, {
2690
- get(target, prop) {
2691
- return target[prop];
2692
- },
2693
- set(target, prop, val) {
2694
- if (prop === 'value') {
2695
- deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2696
- }
2697
- // @ts-expect-error
2698
- target[prop] = val;
2699
- return true;
2700
- }
2701
- });
2625
+ const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2702
2626
  return {
2703
2627
  install,
2704
- change,
2705
- cycle,
2706
- toggle,
2707
2628
  isDisabled: parsedOptions.isDisabled,
2708
2629
  name,
2709
2630
  themes,
2710
2631
  current,
2711
2632
  computedThemes,
2712
- prefix: parsedOptions.prefix,
2713
2633
  themeClasses,
2714
2634
  styles,
2715
2635
  global: {
2716
- name: globalName,
2636
+ name,
2717
2637
  current
2718
2638
  }
2719
2639
  };
@@ -2724,7 +2644,7 @@
2724
2644
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2725
2645
  const name = vue.toRef(() => props.theme ?? theme.name.value);
2726
2646
  const current = vue.toRef(() => theme.themes.value[name.value]);
2727
- const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2647
+ const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2728
2648
  const newTheme = {
2729
2649
  ...theme,
2730
2650
  name,
@@ -3828,10 +3748,7 @@
3828
3748
  default: 'default',
3829
3749
  validator: v => allowedDensities$1.includes(v)
3830
3750
  },
3831
- extended: {
3832
- type: Boolean,
3833
- default: null
3834
- },
3751
+ extended: Boolean,
3835
3752
  extensionHeight: {
3836
3753
  type: [Number, String],
3837
3754
  default: 48
@@ -3879,7 +3796,7 @@
3879
3796
  const {
3880
3797
  rtlClasses
3881
3798
  } = useRtl();
3882
- const isExtended = vue.shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
3799
+ const isExtended = vue.shallowRef(!!(props.extended || slots.extension?.()));
3883
3800
  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));
3884
3801
  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);
3885
3802
  provideDefaults({
@@ -3891,7 +3808,7 @@
3891
3808
  const hasTitle = !!(props.title || slots.title);
3892
3809
  const hasImage = !!(slots.image || props.image);
3893
3810
  const extension = slots.extension?.();
3894
- isExtended.value = props.extended === null ? !!extension : props.extended;
3811
+ isExtended.value = !!(props.extended || extension);
3895
3812
  return vue.createVNode(props.tag, {
3896
3813
  "class": vue.normalizeClass(['v-toolbar', {
3897
3814
  'v-toolbar--absolute': props.absolute,
@@ -4274,15 +4191,9 @@
4274
4191
  };
4275
4192
  }
4276
4193
 
4277
- // Types
4278
-
4279
4194
  const makeVBtnGroupProps = propsFactory({
4280
4195
  baseColor: String,
4281
4196
  divided: Boolean,
4282
- direction: {
4283
- type: String,
4284
- default: 'horizontal'
4285
- },
4286
4197
  ...makeBorderProps(),
4287
4198
  ...makeComponentProps(),
4288
4199
  ...makeDensityProps(),
@@ -4316,7 +4227,7 @@
4316
4227
  } = useRounded(props);
4317
4228
  provideDefaults({
4318
4229
  VBtn: {
4319
- height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4230
+ height: 'auto',
4320
4231
  baseColor: vue.toRef(() => props.baseColor),
4321
4232
  color: vue.toRef(() => props.color),
4322
4233
  density: vue.toRef(() => props.density),
@@ -4326,7 +4237,7 @@
4326
4237
  });
4327
4238
  useRender(() => {
4328
4239
  return vue.createVNode(props.tag, {
4329
- "class": vue.normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4240
+ "class": vue.normalizeClass(['v-btn-group', {
4330
4241
  'v-btn-group--divided': props.divided
4331
4242
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4332
4243
  "style": vue.normalizeStyle(props.style)
@@ -5659,8 +5570,8 @@
5659
5570
  window.clearTimeout(element._ripple.showTimer);
5660
5571
  }
5661
5572
  let keyboardRipple = false;
5662
- function keyboardRippleShow(e, keys) {
5663
- if (!keyboardRipple && keys.includes(e.keyCode)) {
5573
+ function keyboardRippleShow(e) {
5574
+ if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5664
5575
  keyboardRipple = true;
5665
5576
  rippleShow(e);
5666
5577
  }
@@ -5688,12 +5599,9 @@
5688
5599
  el._ripple.enabled = enabled;
5689
5600
  el._ripple.centered = modifiers.center;
5690
5601
  el._ripple.circle = modifiers.circle;
5691
- const bindingValue = isObject(value) ? value : {};
5692
- if (bindingValue.class) {
5693
- el._ripple.class = bindingValue.class;
5602
+ if (isObject(value) && value.class) {
5603
+ el._ripple.class = value.class;
5694
5604
  }
5695
- const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5696
- el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5697
5605
  if (enabled && !wasEnabled) {
5698
5606
  if (modifiers.stop) {
5699
5607
  el.addEventListener('touchstart', rippleStop, {
@@ -5715,7 +5623,7 @@
5715
5623
  el.addEventListener('mousedown', rippleShow);
5716
5624
  el.addEventListener('mouseup', rippleHide);
5717
5625
  el.addEventListener('mouseleave', rippleHide);
5718
- el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5626
+ el.addEventListener('keydown', keyboardRippleShow);
5719
5627
  el.addEventListener('keyup', keyboardRippleHide);
5720
5628
  el.addEventListener('blur', focusRippleHide);
5721
5629
 
@@ -5735,9 +5643,7 @@
5735
5643
  el.removeEventListener('touchcancel', rippleHide);
5736
5644
  el.removeEventListener('mouseup', rippleHide);
5737
5645
  el.removeEventListener('mouseleave', rippleHide);
5738
- if (el._ripple?.keyDownHandler) {
5739
- el.removeEventListener('keydown', el._ripple.keyDownHandler);
5740
- }
5646
+ el.removeEventListener('keydown', keyboardRippleShow);
5741
5647
  el.removeEventListener('keyup', keyboardRippleHide);
5742
5648
  el.removeEventListener('dragstart', rippleHide);
5743
5649
  el.removeEventListener('blur', focusRippleHide);
@@ -5746,8 +5652,8 @@
5746
5652
  updateRipple(el, binding, false);
5747
5653
  }
5748
5654
  function unmounted$4(el) {
5749
- removeListeners(el);
5750
5655
  delete el._ripple;
5656
+ removeListeners(el);
5751
5657
  }
5752
5658
  function updated$1(el, binding) {
5753
5659
  if (binding.value === binding.oldValue) {
@@ -6020,31 +5926,6 @@
6020
5926
  // Utilities
6021
5927
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6022
5928
 
6023
- // Utilities
6024
-
6025
- // Types
6026
-
6027
- // Types
6028
-
6029
- // Composables
6030
- const makeIconSizeProps = propsFactory({
6031
- iconSize: [Number, String],
6032
- iconSizes: {
6033
- type: Array,
6034
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6035
- }
6036
- }, 'iconSize');
6037
- function useIconSizes(props, fallback) {
6038
- const iconSize = vue.computed(() => {
6039
- const iconSizeMap = new Map(props.iconSizes);
6040
- const _iconSize = props.iconSize ?? fallback() ?? 'default';
6041
- return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6042
- });
6043
- return {
6044
- iconSize
6045
- };
6046
- }
6047
-
6048
5929
  // Types
6049
5930
 
6050
5931
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6084,7 +5965,6 @@
6084
5965
  ...makeDensityProps(),
6085
5966
  ...makeDimensionProps(),
6086
5967
  ...makeElevationProps(),
6087
- ...makeIconSizeProps(),
6088
5968
  ...makeLocationProps(),
6089
5969
  ...makePositionProps(),
6090
5970
  ...makeRoundedProps(),
@@ -6112,9 +5992,6 @@
6112
5992
  if (!props.type) return props.icon;
6113
5993
  return props.icon ?? `$${props.type}`;
6114
5994
  });
6115
- const {
6116
- iconSize
6117
- } = useIconSizes(props, () => props.prominent ? 44 : 28);
6118
5995
  const {
6119
5996
  themeClasses
6120
5997
  } = provideTheme(props);
@@ -6162,11 +6039,6 @@
6162
6039
  const hasPrepend = !!(slots.prepend || icon.value);
6163
6040
  const hasTitle = !!(slots.title || props.title);
6164
6041
  const hasClose = !!(slots.close || props.closable);
6165
- const iconProps = {
6166
- density: props.density,
6167
- icon: icon.value,
6168
- size: iconSize.value
6169
- };
6170
6042
  return isActive.value && vue.createVNode(props.tag, {
6171
6043
  "class": vue.normalizeClass(['v-alert', props.border && {
6172
6044
  'v-alert--border': !!props.border,
@@ -6184,14 +6056,19 @@
6184
6056
  }, null), hasPrepend && vue.createElementVNode("div", {
6185
6057
  "key": "prepend",
6186
6058
  "class": "v-alert__prepend"
6187
- }, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
6188
- "key": "prepend-icon"
6189
- }, iconProps), null) : vue.createVNode(VDefaultsProvider, {
6059
+ }, [!slots.prepend ? vue.createVNode(VIcon, {
6060
+ "key": "prepend-icon",
6061
+ "density": props.density,
6062
+ "icon": icon.value,
6063
+ "size": props.prominent ? 44 : 28
6064
+ }, null) : vue.createVNode(VDefaultsProvider, {
6190
6065
  "key": "prepend-defaults",
6191
6066
  "disabled": !icon.value,
6192
6067
  "defaults": {
6193
6068
  VIcon: {
6194
- ...iconProps
6069
+ density: props.density,
6070
+ icon: icon.value,
6071
+ size: props.prominent ? 44 : 28
6195
6072
  }
6196
6073
  }
6197
6074
  }, slots.prepend)]), vue.createElementVNode("div", {
@@ -7716,7 +7593,6 @@
7716
7593
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7717
7594
  const makeVSlideGroupProps = propsFactory({
7718
7595
  centerActive: Boolean,
7719
- contentClass: null,
7720
7596
  direction: {
7721
7597
  type: String,
7722
7598
  default: 'horizontal'
@@ -8029,7 +7905,7 @@
8029
7905
  })]), vue.createElementVNode("div", {
8030
7906
  "key": "container",
8031
7907
  "ref": containerRef,
8032
- "class": vue.normalizeClass(['v-slide-group__container', props.contentClass]),
7908
+ "class": "v-slide-group__container",
8033
7909
  "onScroll": onScroll
8034
7910
  }, [vue.createElementVNode("div", {
8035
7911
  "ref": contentRef,
@@ -8392,85 +8268,16 @@
8392
8268
  }
8393
8269
  });
8394
8270
 
8395
- const makeVDividerProps = propsFactory({
8396
- color: String,
8397
- inset: Boolean,
8398
- length: [Number, String],
8399
- opacity: [Number, String],
8400
- thickness: [Number, String],
8401
- vertical: Boolean,
8402
- ...makeComponentProps(),
8403
- ...makeThemeProps()
8404
- }, 'VDivider');
8405
- const VDivider = genericComponent()({
8406
- name: 'VDivider',
8407
- props: makeVDividerProps(),
8408
- setup(props, _ref) {
8409
- let {
8410
- attrs,
8411
- slots
8412
- } = _ref;
8413
- const {
8414
- themeClasses
8415
- } = provideTheme(props);
8416
- const {
8417
- textColorClasses,
8418
- textColorStyles
8419
- } = useTextColor(() => props.color);
8420
- const dividerStyles = vue.computed(() => {
8421
- const styles = {};
8422
- if (props.length) {
8423
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8424
- }
8425
- if (props.thickness) {
8426
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8427
- }
8428
- return styles;
8429
- });
8430
- useRender(() => {
8431
- const divider = vue.createElementVNode("hr", {
8432
- "class": vue.normalizeClass([{
8433
- 'v-divider': true,
8434
- 'v-divider--inset': props.inset,
8435
- 'v-divider--vertical': props.vertical
8436
- }, themeClasses.value, textColorClasses.value, props.class]),
8437
- "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
8438
- '--v-border-opacity': props.opacity
8439
- }, props.style]),
8440
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8441
- "role": `${attrs.role || 'separator'}`
8442
- }, null);
8443
- if (!slots.default) return divider;
8444
- return vue.createElementVNode("div", {
8445
- "class": vue.normalizeClass(['v-divider__wrapper', {
8446
- 'v-divider__wrapper--vertical': props.vertical,
8447
- 'v-divider__wrapper--inset': props.inset
8448
- }])
8449
- }, [divider, vue.createElementVNode("div", {
8450
- "class": "v-divider__content"
8451
- }, [slots.default()]), divider]);
8452
- });
8453
- return {};
8454
- }
8455
- });
8456
-
8457
8271
  // Utilities
8458
8272
 
8459
8273
  // List
8460
8274
  const ListKey = Symbol.for('vuetify:list');
8461
8275
  function createList() {
8462
- let {
8463
- filterable
8464
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8465
- filterable: false
8466
- };
8467
8276
  const parent = vue.inject(ListKey, {
8468
- filterable: false,
8469
8277
  hasPrepend: vue.shallowRef(false),
8470
8278
  updateHasPrepend: () => null
8471
8279
  });
8472
8280
  const data = {
8473
- filterable: parent.filterable || filterable,
8474
8281
  hasPrepend: vue.shallowRef(false),
8475
8282
  updateHasPrepend: value => {
8476
8283
  if (value) data.hasPrepend.value = value;
@@ -9422,9 +9229,6 @@
9422
9229
  roundedClasses
9423
9230
  } = useRounded(roundedProps);
9424
9231
  const lineClasses = vue.toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9425
- const rippleOptions = vue.toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9426
- keys: [keyCodes.enter]
9427
- } : props.ripple);
9428
9232
  const slotProps = vue.computed(() => ({
9429
9233
  isActive: isActive.value,
9430
9234
  select,
@@ -9449,9 +9253,8 @@
9449
9253
  function onKeyDown(e) {
9450
9254
  const target = e.target;
9451
9255
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9452
- if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9256
+ if (e.key === 'Enter' || e.key === ' ') {
9453
9257
  e.preventDefault();
9454
- e.stopPropagation();
9455
9258
  e.target.dispatchEvent(new MouseEvent('click', e));
9456
9259
  }
9457
9260
  }
@@ -9561,7 +9364,7 @@
9561
9364
  }), vue.createElementVNode("div", {
9562
9365
  "class": "v-list-item__spacer"
9563
9366
  }, null)])]
9564
- }), [[Ripple, isClickable.value && rippleOptions.value]]);
9367
+ }), [[Ripple, isClickable.value && props.ripple]]);
9565
9368
  });
9566
9369
  return {
9567
9370
  activate,
@@ -9616,6 +9419,68 @@
9616
9419
  }
9617
9420
  });
9618
9421
 
9422
+ const makeVDividerProps = propsFactory({
9423
+ color: String,
9424
+ inset: Boolean,
9425
+ length: [Number, String],
9426
+ opacity: [Number, String],
9427
+ thickness: [Number, String],
9428
+ vertical: Boolean,
9429
+ ...makeComponentProps(),
9430
+ ...makeThemeProps()
9431
+ }, 'VDivider');
9432
+ const VDivider = genericComponent()({
9433
+ name: 'VDivider',
9434
+ props: makeVDividerProps(),
9435
+ setup(props, _ref) {
9436
+ let {
9437
+ attrs,
9438
+ slots
9439
+ } = _ref;
9440
+ const {
9441
+ themeClasses
9442
+ } = provideTheme(props);
9443
+ const {
9444
+ textColorClasses,
9445
+ textColorStyles
9446
+ } = useTextColor(() => props.color);
9447
+ const dividerStyles = vue.computed(() => {
9448
+ const styles = {};
9449
+ if (props.length) {
9450
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9451
+ }
9452
+ if (props.thickness) {
9453
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9454
+ }
9455
+ return styles;
9456
+ });
9457
+ useRender(() => {
9458
+ const divider = vue.createElementVNode("hr", {
9459
+ "class": vue.normalizeClass([{
9460
+ 'v-divider': true,
9461
+ 'v-divider--inset': props.inset,
9462
+ 'v-divider--vertical': props.vertical
9463
+ }, themeClasses.value, textColorClasses.value, props.class]),
9464
+ "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
9465
+ '--v-border-opacity': props.opacity
9466
+ }, props.style]),
9467
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9468
+ "role": `${attrs.role || 'separator'}`
9469
+ }, null);
9470
+ if (!slots.default) return divider;
9471
+ return vue.createElementVNode("div", {
9472
+ "class": vue.normalizeClass(['v-divider__wrapper', {
9473
+ 'v-divider__wrapper--vertical': props.vertical,
9474
+ 'v-divider__wrapper--inset': props.inset
9475
+ }])
9476
+ }, [divider, vue.createElementVNode("div", {
9477
+ "class": "v-divider__content"
9478
+ }, [slots.default()]), divider]);
9479
+ });
9480
+ return {};
9481
+ }
9482
+ });
9483
+
9619
9484
  // Types
9620
9485
 
9621
9486
  const makeVListChildrenProps = propsFactory({
@@ -9885,7 +9750,6 @@
9885
9750
  activeClass: String,
9886
9751
  bgColor: String,
9887
9752
  disabled: Boolean,
9888
- filterable: Boolean,
9889
9753
  expandIcon: IconValue,
9890
9754
  collapseIcon: IconValue,
9891
9755
  lines: {
@@ -9969,9 +9833,7 @@
9969
9833
  const activeColor = vue.toRef(() => props.activeColor);
9970
9834
  const baseColor = vue.toRef(() => props.baseColor);
9971
9835
  const color = vue.toRef(() => props.color);
9972
- createList({
9973
- filterable: props.filterable
9974
- });
9836
+ createList();
9975
9837
  provideDefaults({
9976
9838
  VListGroup: {
9977
9839
  activeColor,
@@ -11654,7 +11516,6 @@
11654
11516
  // disableKeys: Boolean,
11655
11517
  id: String,
11656
11518
  submenu: Boolean,
11657
- disableInitialFocus: Boolean,
11658
11519
  ...omit(makeVOverlayProps({
11659
11520
  closeDelay: 250,
11660
11521
  closeOnContentClick: true,
@@ -11729,7 +11590,7 @@
11729
11590
  vue.watch(isActive, val => {
11730
11591
  if (val) {
11731
11592
  parent?.register();
11732
- if (IN_BROWSER && !props.disableInitialFocus) {
11593
+ if (IN_BROWSER) {
11733
11594
  document.addEventListener('focusin', onFocusIn, {
11734
11595
  once: true
11735
11596
  });
@@ -12566,12 +12427,7 @@
12566
12427
  }
12567
12428
  function calculateOffset(index) {
12568
12429
  index = clamp(index, 0, items.value.length - 1);
12569
- const whole = Math.floor(index);
12570
- const fraction = index % 1;
12571
- const next = whole + 1;
12572
- const wholeOffset = offsets[whole] || 0;
12573
- const nextOffset = offsets[next] || wholeOffset;
12574
- return wholeOffset + (nextOffset - wholeOffset) * fraction;
12430
+ return offsets[index] || 0;
12575
12431
  }
12576
12432
  function calculateIndex(scrollTop) {
12577
12433
  return binaryClosest(offsets, scrollTop);
@@ -12925,7 +12781,6 @@
12925
12781
  },
12926
12782
  openOnClear: Boolean,
12927
12783
  itemColor: String,
12928
- noAutoScroll: Boolean,
12929
12784
  ...makeItemsProps({
12930
12785
  itemChildren: false
12931
12786
  })
@@ -13140,7 +12995,7 @@
13140
12995
  vue.watch(menu, () => {
13141
12996
  if (!props.hideSelected && menu.value && model.value.length) {
13142
12997
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13143
- IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
12998
+ IN_BROWSER && window.requestAnimationFrame(() => {
13144
12999
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13145
13000
  });
13146
13001
  }
@@ -13233,22 +13088,6 @@
13233
13088
  key: item.value,
13234
13089
  onClick: () => select(item, null)
13235
13090
  });
13236
- if (item.raw.type === 'divider') {
13237
- return slots.divider?.({
13238
- props: item.raw,
13239
- index
13240
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13241
- "key": `divider-${index}`
13242
- }), null);
13243
- }
13244
- if (item.raw.type === 'subheader') {
13245
- return slots.subheader?.({
13246
- props: item.raw,
13247
- index
13248
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13249
- "key": `subheader-${index}`
13250
- }), null);
13251
- }
13252
13091
  return slots.item?.({
13253
13092
  item,
13254
13093
  index,
@@ -13409,9 +13248,6 @@
13409
13248
  let match = -1;
13410
13249
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13411
13250
  if (typeof item === 'object') {
13412
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13413
- continue;
13414
- }
13415
13251
  const filterKeys = keys || Object.keys(transformed);
13416
13252
  for (const key of filterKeys) {
13417
13253
  const value = getPropertyFromItem(transformed, key);
@@ -13614,7 +13450,7 @@
13614
13450
  menu.value = !menu.value;
13615
13451
  }
13616
13452
  function onListKeydown(e) {
13617
- if (checkPrintable(e) || e.key === 'Backspace') {
13453
+ if (e.key !== ' ' && checkPrintable(e)) {
13618
13454
  vTextFieldRef.value?.focus();
13619
13455
  }
13620
13456
  }
@@ -13819,7 +13655,6 @@
13819
13655
  }, props.menuProps), {
13820
13656
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
13821
13657
  "ref": listRef,
13822
- "filterable": true,
13823
13658
  "selected": selectedValues.value,
13824
13659
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13825
13660
  "onMousedown": e => e.preventDefault(),
@@ -13851,22 +13686,6 @@
13851
13686
  active: highlightFirst.value && index === 0 ? true : undefined,
13852
13687
  onClick: () => select(item, null)
13853
13688
  });
13854
- if (item.raw.type === 'divider') {
13855
- return slots.divider?.({
13856
- props: item.raw,
13857
- index
13858
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13859
- "key": `divider-${index}`
13860
- }), null);
13861
- }
13862
- if (item.raw.type === 'subheader') {
13863
- return slots.subheader?.({
13864
- props: item.raw,
13865
- index
13866
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13867
- "key": `subheader-${index}`
13868
- }), null);
13869
- }
13870
13689
  return slots.item?.({
13871
13690
  item,
13872
13691
  index,
@@ -14011,8 +13830,7 @@
14011
13830
  ...makeThemeProps(),
14012
13831
  ...makeTransitionProps({
14013
13832
  transition: 'scale-rotate-transition'
14014
- }),
14015
- ...makeDimensionProps()
13833
+ })
14016
13834
  }, 'VBadge');
14017
13835
  const VBadge = genericComponent()({
14018
13836
  name: 'VBadge',
@@ -14042,9 +13860,6 @@
14042
13860
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
14043
13861
  return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
14044
13862
  });
14045
- const {
14046
- dimensionStyles
14047
- } = useDimension(props);
14048
13863
  useRender(() => {
14049
13864
  const value = Number(props.content);
14050
13865
  const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
@@ -14066,7 +13881,7 @@
14066
13881
  }, {
14067
13882
  default: () => [vue.withDirectives(vue.createElementVNode("span", vue.mergeProps({
14068
13883
  "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
14069
- "style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
13884
+ "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
14070
13885
  "aria-atomic": "true",
14071
13886
  "aria-label": t(props.label, value),
14072
13887
  "aria-live": "polite",
@@ -17475,13 +17290,13 @@
17475
17290
  return null;
17476
17291
  }
17477
17292
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17478
- function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17293
+ function getWeekdays(locale, firstDayOfWeek) {
17479
17294
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17480
17295
  return createRange(7).map(i => {
17481
17296
  const weekday = new Date(sundayJanuarySecond2000);
17482
17297
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17483
17298
  return new Intl.DateTimeFormat(locale, {
17484
- weekday: weekdayFormat ?? 'narrow'
17299
+ weekday: 'narrow'
17485
17300
  }).format(weekday);
17486
17301
  });
17487
17302
  }
@@ -17945,9 +17760,9 @@
17945
17760
  getDiff(date, comparing, unit) {
17946
17761
  return getDiff(date, comparing, unit);
17947
17762
  }
17948
- getWeekdays(firstDayOfWeek, weekdayFormat) {
17763
+ getWeekdays(firstDayOfWeek) {
17949
17764
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17950
- return getWeekdays(this.locale, firstDay, weekdayFormat);
17765
+ return getWeekdays(this.locale, firstDay);
17951
17766
  }
17952
17767
  getYear(date) {
17953
17768
  return getYear(date);
@@ -18302,7 +18117,6 @@
18302
18117
  _search.value = val ?? '';
18303
18118
  if (!props.multiple && !hasSelectionSlot.value) {
18304
18119
  model.value = [transformItem$3(props, val)];
18305
- vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18306
18120
  }
18307
18121
  if (val && props.multiple && props.delimiters?.length) {
18308
18122
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18383,7 +18197,7 @@
18383
18197
  menu.value = !menu.value;
18384
18198
  }
18385
18199
  function onListKeydown(e) {
18386
- if (checkPrintable(e) || e.key === 'Backspace') {
18200
+ if (e.key !== ' ' && checkPrintable(e)) {
18387
18201
  vTextFieldRef.value?.focus();
18388
18202
  }
18389
18203
  }
@@ -18588,7 +18402,6 @@
18588
18402
  }, props.menuProps), {
18589
18403
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
18590
18404
  "ref": listRef,
18591
- "filterable": true,
18592
18405
  "selected": selectedValues.value,
18593
18406
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18594
18407
  "onMousedown": e => e.preventDefault(),
@@ -18620,22 +18433,6 @@
18620
18433
  active: highlightFirst.value && index === 0 ? true : undefined,
18621
18434
  onClick: () => select(item, null)
18622
18435
  });
18623
- if (item.raw.type === 'divider') {
18624
- return slots.divider?.({
18625
- props: item.raw,
18626
- index
18627
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
18628
- "key": `divider-${index}`
18629
- }), null);
18630
- }
18631
- if (item.raw.type === 'subheader') {
18632
- return slots.subheader?.({
18633
- props: item.raw,
18634
- index
18635
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
18636
- "key": `subheader-${index}`
18637
- }), null);
18638
- }
18639
18436
  return slots.item?.({
18640
18437
  item,
18641
18438
  index,
@@ -20518,7 +20315,6 @@
20518
20315
  color: String,
20519
20316
  disableSort: Boolean,
20520
20317
  fixedHeader: Boolean,
20521
- lastFixed: Boolean,
20522
20318
  multiSort: Boolean,
20523
20319
  sortAscIcon: {
20524
20320
  type: IconValue,
@@ -20565,11 +20361,10 @@
20565
20361
  loaderClasses
20566
20362
  } = useLoader(props);
20567
20363
  function getFixedStyles(column, y) {
20568
- if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20364
+ if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20569
20365
  return {
20570
20366
  position: 'sticky',
20571
- left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20572
- right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20367
+ left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20573
20368
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20574
20369
  };
20575
20370
  }
@@ -21085,18 +20880,11 @@
21085
20880
  }
21086
20881
  });
21087
20882
 
21088
- // Types
21089
-
21090
20883
  const makeVTableProps = propsFactory({
21091
20884
  fixedHeader: Boolean,
21092
20885
  fixedFooter: Boolean,
21093
20886
  height: [Number, String],
21094
20887
  hover: Boolean,
21095
- striped: {
21096
- type: String,
21097
- default: null,
21098
- validator: v => ['even', 'odd'].includes(v)
21099
- },
21100
20888
  ...makeComponentProps(),
21101
20889
  ...makeDensityProps(),
21102
20890
  ...makeTagProps(),
@@ -21123,9 +20911,7 @@
21123
20911
  'v-table--fixed-footer': props.fixedFooter,
21124
20912
  'v-table--has-top': !!slots.top,
21125
20913
  'v-table--has-bottom': !!slots.bottom,
21126
- 'v-table--hover': props.hover,
21127
- 'v-table--striped-even': props.striped === 'even',
21128
- 'v-table--striped-odd': props.striped === 'odd'
20914
+ 'v-table--hover': props.hover
21129
20915
  }, themeClasses.value, densityClasses.value, props.class]),
21130
20916
  "style": vue.normalizeStyle(props.style)
21131
20917
  }, {
@@ -22300,8 +22086,7 @@
22300
22086
  firstDayOfWeek: {
22301
22087
  type: [Number, String],
22302
22088
  default: undefined
22303
- },
22304
- weekdayFormat: String
22089
+ }
22305
22090
  }, 'calendar');
22306
22091
  function useCalendar(props) {
22307
22092
  const adapter = useDate();
@@ -22542,7 +22327,7 @@
22542
22327
  "ref": daysRef,
22543
22328
  "key": daysInMonth.value[0].date?.toString(),
22544
22329
  "class": "v-date-picker-month__days"
22545
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createElementVNode("div", {
22330
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
22546
22331
  "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22547
22332
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22548
22333
  const slotProps = {
@@ -23051,9 +22836,7 @@
23051
22836
  "max": maxDate.value,
23052
22837
  "year": year.value,
23053
22838
  "allowedMonths": allowedMonths
23054
- }), {
23055
- ...pick(slots, ['month'])
23056
- }) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
22839
+ }), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
23057
22840
  "key": "date-picker-years"
23058
22841
  }, datePickerYearsProps, {
23059
22842
  "modelValue": year.value,
@@ -23061,9 +22844,7 @@
23061
22844
  "min": minDate.value,
23062
22845
  "max": maxDate.value,
23063
22846
  "allowedYears": allowedYears
23064
- }), {
23065
- ...pick(slots, ['year'])
23066
- }) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
22847
+ }), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
23067
22848
  "key": "date-picker-month"
23068
22849
  }, datePickerMonthProps, {
23069
22850
  "modelValue": model.value,
@@ -23074,9 +22855,7 @@
23074
22855
  "onUpdate:year": [$event => year.value = $event, onUpdateYear],
23075
22856
  "min": minDate.value,
23076
22857
  "max": maxDate.value
23077
- }), {
23078
- ...pick(slots, ['day'])
23079
- })]
22858
+ }), null)]
23080
22859
  })]),
23081
22860
  actions: slots.actions
23082
22861
  });
@@ -24167,9 +23946,6 @@
24167
23946
  startStatus.value = status;
24168
23947
  } else if (side === 'end') {
24169
23948
  endStatus.value = status;
24170
- } else if (side === 'both') {
24171
- startStatus.value = status;
24172
- endStatus.value = status;
24173
23949
  }
24174
23950
  }
24175
23951
  function getStatus(side) {
@@ -24281,32 +24057,6 @@
24281
24057
  }, [renderSide('end', endStatus.value)])]
24282
24058
  });
24283
24059
  });
24284
- function reset(side) {
24285
- const effectiveSide = side ?? props.side;
24286
- setStatus(effectiveSide, 'ok');
24287
- vue.nextTick(() => {
24288
- setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
24289
- if (props.mode !== 'manual') {
24290
- vue.nextTick(() => {
24291
- window.requestAnimationFrame(() => {
24292
- window.requestAnimationFrame(() => {
24293
- window.requestAnimationFrame(() => {
24294
- if (effectiveSide === 'both') {
24295
- intersecting('start');
24296
- intersecting('end');
24297
- } else {
24298
- intersecting(effectiveSide);
24299
- }
24300
- });
24301
- });
24302
- });
24303
- });
24304
- }
24305
- });
24306
- }
24307
- return {
24308
- reset
24309
- };
24310
24060
  }
24311
24061
  });
24312
24062
 
@@ -24386,47 +24136,8 @@
24386
24136
  }
24387
24137
  });
24388
24138
 
24389
- const makeVKbdProps = propsFactory({
24390
- ...makeBorderProps(),
24391
- ...makeComponentProps(),
24392
- ...makeRoundedProps(),
24393
- ...makeTagProps({
24394
- tag: 'kbd'
24395
- }),
24396
- ...makeThemeProps(),
24397
- ...makeElevationProps(),
24398
- color: String
24399
- }, 'VKbd');
24400
- const VKbd = genericComponent()({
24401
- name: 'VKbd',
24402
- props: makeVKbdProps(),
24403
- setup(props, _ref) {
24404
- let {
24405
- slots
24406
- } = _ref;
24407
- const {
24408
- themeClasses
24409
- } = provideTheme(props);
24410
- const {
24411
- borderClasses
24412
- } = useBorder(props);
24413
- const {
24414
- roundedClasses
24415
- } = useRounded(props);
24416
- const {
24417
- backgroundColorClasses,
24418
- backgroundColorStyles
24419
- } = useBackgroundColor(() => props.color);
24420
- const {
24421
- elevationClasses
24422
- } = useElevation(props);
24423
- useRender(() => vue.createVNode(props.tag, {
24424
- "class": vue.normalizeClass(['v-kbd', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
24425
- "style": vue.normalizeStyle([backgroundColorStyles.value, props.style])
24426
- }, slots));
24427
- return {};
24428
- }
24429
- });
24139
+ // Styles
24140
+ const VKbd = createSimpleFunctional('v-kbd', 'kbd');
24430
24141
 
24431
24142
  const makeVLayoutProps = propsFactory({
24432
24143
  ...makeComponentProps(),
@@ -25264,14 +24975,6 @@
25264
24975
  type: Number,
25265
24976
  default: 0
25266
24977
  },
25267
- minFractionDigits: {
25268
- type: Number,
25269
- default: null
25270
- },
25271
- decimalSeparator: {
25272
- type: String,
25273
- validator: v => !v || v.length === 1
25274
- },
25275
24978
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25276
24979
  }, 'VNumberInput');
25277
24980
  const VNumberInput = genericComponent()({
@@ -25297,24 +25000,11 @@
25297
25000
  const form = useForm(props);
25298
25001
  const controlsDisabled = vue.computed(() => form.isDisabled.value || form.isReadonly.value);
25299
25002
  const isFocused = vue.shallowRef(props.focused);
25300
- const {
25301
- decimalSeparator: decimalSeparatorFromLocale
25302
- } = useLocale();
25303
- const decimalSeparator = vue.computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value);
25304
25003
  function correctPrecision(val) {
25305
25004
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25306
- let trim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
25307
25005
  const fixed = precision == null ? String(val) : val.toFixed(precision);
25308
- if (isFocused.value && trim) {
25309
- return Number(fixed).toString() // trim zeros
25310
- .replace('.', decimalSeparator.value);
25311
- }
25312
- if (props.minFractionDigits === null || precision !== null && precision < props.minFractionDigits) {
25313
- return fixed.replace('.', decimalSeparator.value);
25314
- }
25315
- let [baseDigits, fractionDigits] = fixed.split('.');
25316
- fractionDigits = (fractionDigits ?? '').padEnd(props.minFractionDigits, '0').replace(new RegExp(`(?<=\\d{${props.minFractionDigits}})0`, 'g'), '');
25317
- return [baseDigits, fractionDigits].filter(Boolean).join(decimalSeparator.value);
25006
+ return isFocused.value ? Number(fixed).toString() // trim zeros
25007
+ : fixed;
25318
25008
  }
25319
25009
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25320
25010
  const _inputText = vue.shallowRef(null);
@@ -25331,11 +25021,8 @@
25331
25021
  if (val === null || val === '') {
25332
25022
  model.value = null;
25333
25023
  _inputText.value = null;
25334
- return;
25335
- }
25336
- const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
25337
- if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
25338
- model.value = parsedValue;
25024
+ } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {
25025
+ model.value = Number(val);
25339
25026
  _inputText.value = val;
25340
25027
  }
25341
25028
  }
@@ -25372,7 +25059,6 @@
25372
25059
  }
25373
25060
  };
25374
25061
  vue.watch(() => props.precision, () => formatInputValue());
25375
- vue.watch(() => props.minFractionDigits, () => formatInputValue());
25376
25062
  vue.onMounted(() => {
25377
25063
  clampModel();
25378
25064
  });
@@ -25406,24 +25092,24 @@
25406
25092
  selectionEnd
25407
25093
  } = inputElement ?? {};
25408
25094
  const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
25409
- const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value);
25095
+ const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision);
25410
25096
 
25411
- // Allow only numbers, "-" and {decimal separator}
25412
- // Allow "-" and {decimal separator} only once
25413
- // Allow "-" only at the start
25414
- if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
25097
+ // Only numbers, "-", "." are allowed
25098
+ // AND "-", "." are allowed only once
25099
+ // AND "-" is only allowed at the start
25100
+ if (!/^-?(\d+(\.\d*)?|(\.\d+)|\d*|\.)$/.test(potentialNewInputVal)) {
25415
25101
  e.preventDefault();
25416
25102
  inputElement.value = potentialNewNumber;
25417
25103
  }
25418
25104
  if (props.precision == null) return;
25419
25105
 
25420
25106
  // Ignore decimal digits above precision limit
25421
- if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
25107
+ if (potentialNewInputVal.split('.')[1]?.length > props.precision) {
25422
25108
  e.preventDefault();
25423
25109
  inputElement.value = potentialNewNumber;
25424
25110
  }
25425
25111
  // Ignore decimal separator when precision = 0
25426
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
25112
+ if (props.precision === 0 && potentialNewInputVal.includes('.')) {
25427
25113
  e.preventDefault();
25428
25114
  inputElement.value = potentialNewNumber;
25429
25115
  }
@@ -25475,16 +25161,19 @@
25475
25161
  if (controlsDisabled.value) return;
25476
25162
  if (!vTextFieldRef.value) return;
25477
25163
  const actualText = vTextFieldRef.value.value;
25478
- const parsedValue = Number(actualText.replace(decimalSeparator.value, '.'));
25479
- if (actualText && !isNaN(parsedValue)) {
25480
- inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max));
25164
+ if (actualText && !isNaN(Number(actualText))) {
25165
+ inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max));
25481
25166
  } else {
25482
25167
  inputText.value = null;
25483
25168
  }
25484
25169
  }
25485
25170
  function formatInputValue() {
25486
25171
  if (controlsDisabled.value) return;
25487
- inputText.value = model.value !== null && !isNaN(model.value) ? correctPrecision(model.value, props.precision, false) : null;
25172
+ if (model.value === null || isNaN(model.value)) {
25173
+ inputText.value = null;
25174
+ return;
25175
+ }
25176
+ inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25488
25177
  }
25489
25178
  function trimDecimalZeros() {
25490
25179
  if (controlsDisabled.value) return;
@@ -25492,7 +25181,7 @@
25492
25181
  inputText.value = null;
25493
25182
  return;
25494
25183
  }
25495
- inputText.value = model.value.toString().replace('.', decimalSeparator.value);
25184
+ inputText.value = model.value.toString();
25496
25185
  }
25497
25186
  function onFocus() {
25498
25187
  trimDecimalZeros();
@@ -25759,10 +25448,9 @@
25759
25448
  e.preventDefault();
25760
25449
  e.stopPropagation();
25761
25450
  const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25762
- const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25763
25451
  if (isValidNumber(clipboardText)) return;
25764
25452
  model.value = clipboardText.split('');
25765
- inputRef.value?.[finalIndex].focus();
25453
+ inputRef.value?.[index].blur();
25766
25454
  }
25767
25455
  function reset() {
25768
25456
  model.value = [];
@@ -30462,6 +30150,11 @@
30462
30150
  hideOverlay: Boolean,
30463
30151
  icon: [String, Function, Object],
30464
30152
  iconColor: String,
30153
+ iconSize: [Number, String],
30154
+ iconSizes: {
30155
+ type: Array,
30156
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
30157
+ },
30465
30158
  loading: Boolean,
30466
30159
  opacity: [Number, String],
30467
30160
  readonly: Boolean,
@@ -30481,7 +30174,6 @@
30481
30174
  ...makeBorderProps(),
30482
30175
  ...makeComponentProps(),
30483
30176
  ...makeElevationProps(),
30484
- ...makeIconSizeProps(),
30485
30177
  ...makeRoundedProps(),
30486
30178
  ...makeTagProps({
30487
30179
  tag: 'button'
@@ -30536,6 +30228,7 @@
30536
30228
  })()
30537
30229
  }));
30538
30230
  const btnSizeMap = new Map(props.sizes);
30231
+ const iconSizeMap = new Map(props.iconSizes);
30539
30232
  function onClick() {
30540
30233
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30541
30234
  isActive.value = !isActive.value;
@@ -30547,12 +30240,12 @@
30547
30240
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30548
30241
  const btnHeight = props.height ?? btnSize;
30549
30242
  const btnWidth = props.width ?? btnSize;
30550
- const {
30551
- iconSize
30552
- } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30243
+ const _iconSize = props.iconSize;
30244
+ const hasNamedIconSize = iconSizeMap.has(_iconSize);
30245
+ const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30553
30246
  const iconProps = {
30554
30247
  icon,
30555
- size: iconSize.value,
30248
+ size: iconSize,
30556
30249
  iconColor: props.iconColor,
30557
30250
  opacity: props.opacity
30558
30251
  };
@@ -30595,7 +30288,7 @@
30595
30288
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30596
30289
  "indeterminate": "disable-shrink",
30597
30290
  "width": "2",
30598
- "size": iconSize.value
30291
+ "size": iconSize
30599
30292
  }, null)])]
30600
30293
  });
30601
30294
  });
@@ -30603,251 +30296,6 @@
30603
30296
  }
30604
30297
  });
30605
30298
 
30606
- // Utilities
30607
-
30608
- // Types
30609
-
30610
- const makeMaskProps = propsFactory({
30611
- mask: [String, Object],
30612
- returnMaskedValue: Boolean
30613
- }, 'mask');
30614
- const defaultDelimiters = /[-!$%^&*()_+|~=`{}[\]:";'<>?,./\\ ]/;
30615
- const presets = {
30616
- 'credit-card': '#### - #### - #### - ####',
30617
- date: '##/##/####',
30618
- 'date-time': '##/##/#### ##:##',
30619
- 'iso-date': '####-##-##',
30620
- 'iso-date-time': '####-##-## ##:##',
30621
- phone: '(###) ### - ####',
30622
- social: '###-##-####',
30623
- time: '##:##',
30624
- 'time-with-seconds': '##:##:##'
30625
- };
30626
- function isMaskDelimiter(char) {
30627
- return char ? defaultDelimiters.test(char) : false;
30628
- }
30629
- const defaultTokens = {
30630
- '#': {
30631
- pattern: /[0-9]/
30632
- },
30633
- A: {
30634
- pattern: /[A-Z]/i,
30635
- convert: v => v.toUpperCase()
30636
- },
30637
- a: {
30638
- pattern: /[a-z]/i,
30639
- convert: v => v.toLowerCase()
30640
- },
30641
- N: {
30642
- pattern: /[0-9A-Z]/i,
30643
- convert: v => v.toUpperCase()
30644
- },
30645
- n: {
30646
- pattern: /[0-9a-z]/i,
30647
- convert: v => v.toLowerCase()
30648
- },
30649
- X: {
30650
- pattern: defaultDelimiters
30651
- }
30652
- };
30653
- function useMask(props, inputRef) {
30654
- const mask = vue.computed(() => {
30655
- if (typeof props.mask === 'string') {
30656
- if (props.mask in presets) return presets[props.mask];
30657
- return props.mask;
30658
- }
30659
- return props.mask?.mask ?? '';
30660
- });
30661
- const tokens = vue.computed(() => {
30662
- return {
30663
- ...defaultTokens,
30664
- ...(isObject(props.mask) ? props.mask.tokens : null)
30665
- };
30666
- });
30667
- const selection = vue.shallowRef(0);
30668
- const lazySelection = vue.shallowRef(0);
30669
- function isMask(char) {
30670
- return char in tokens.value;
30671
- }
30672
- function maskValidates(mask, char) {
30673
- if (char == null || !isMask(mask)) return false;
30674
- const item = tokens.value[mask];
30675
- if (item.pattern) return item.pattern.test(char);
30676
- return item.test(char);
30677
- }
30678
- function convert(mask, char) {
30679
- const item = tokens.value[mask];
30680
- return item.convert ? item.convert(char) : char;
30681
- }
30682
- function maskText(text) {
30683
- const trimmedText = text?.trim().replace(/\s+/g, ' ');
30684
- if (trimmedText == null) return '';
30685
- if (!mask.value.length || !trimmedText.length) return trimmedText;
30686
- let textIndex = 0;
30687
- let maskIndex = 0;
30688
- let newText = '';
30689
- while (maskIndex < mask.value.length) {
30690
- const mchar = mask.value[maskIndex];
30691
- const tchar = trimmedText[textIndex];
30692
-
30693
- // Escaped character in mask, the next mask character is inserted
30694
- if (mchar === '\\') {
30695
- newText += mask.value[maskIndex + 1];
30696
- maskIndex += 2;
30697
- continue;
30698
- }
30699
- if (!isMask(mchar)) {
30700
- newText += mchar;
30701
- if (tchar === mchar) {
30702
- textIndex++;
30703
- }
30704
- } else if (maskValidates(mchar, tchar)) {
30705
- newText += convert(mchar, tchar);
30706
- textIndex++;
30707
- } else {
30708
- break;
30709
- }
30710
- maskIndex++;
30711
- }
30712
- return newText;
30713
- }
30714
- function unmaskText(text) {
30715
- if (text == null) return null;
30716
- if (!mask.value.length || !text.length) return text;
30717
- let textIndex = 0;
30718
- let maskIndex = 0;
30719
- let newText = '';
30720
- while (true) {
30721
- const mchar = mask.value[maskIndex];
30722
- const tchar = text[textIndex];
30723
- if (tchar == null) break;
30724
- if (mchar == null) {
30725
- newText += tchar;
30726
- textIndex++;
30727
- continue;
30728
- }
30729
-
30730
- // Escaped character in mask, skip the next input character
30731
- if (mchar === '\\') {
30732
- if (tchar === mask.value[maskIndex + 1]) {
30733
- textIndex++;
30734
- }
30735
- maskIndex += 2;
30736
- continue;
30737
- }
30738
- if (maskValidates(mchar, tchar)) {
30739
- // masked char
30740
- newText += tchar;
30741
- textIndex++;
30742
- maskIndex++;
30743
- continue;
30744
- } else if (mchar !== tchar) {
30745
- // input doesn't match mask, skip forward until it does
30746
- while (true) {
30747
- const mchar = mask.value[maskIndex++];
30748
- if (mchar == null || maskValidates(mchar, tchar)) break;
30749
- }
30750
- continue;
30751
- }
30752
- textIndex++;
30753
- maskIndex++;
30754
- }
30755
- return newText;
30756
- }
30757
- function setCaretPosition(newSelection) {
30758
- selection.value = newSelection;
30759
- inputRef.value && inputRef.value.setSelectionRange(selection.value, selection.value);
30760
- }
30761
- function resetSelections() {
30762
- if (!inputRef.value?.selectionEnd) return;
30763
- selection.value = inputRef.value.selectionEnd;
30764
- lazySelection.value = 0;
30765
- for (let index = 0; index < selection.value; index++) {
30766
- isMaskDelimiter(inputRef.value.value[index]) || lazySelection.value++;
30767
- }
30768
- }
30769
- function updateRange() {
30770
- if (!inputRef.value) return;
30771
- resetSelections();
30772
- let selection = 0;
30773
- const newValue = inputRef.value.value;
30774
- if (newValue) {
30775
- for (let index = 0; index < newValue.length; index++) {
30776
- if (lazySelection.value <= 0) break;
30777
- isMaskDelimiter(newValue[index]) || lazySelection.value--;
30778
- selection++;
30779
- }
30780
- }
30781
- setCaretPosition(selection);
30782
- }
30783
- return {
30784
- updateRange,
30785
- maskText,
30786
- unmaskText
30787
- };
30788
- }
30789
-
30790
- // Types
30791
-
30792
- const makeVMaskInputProps = propsFactory({
30793
- ...makeVTextFieldProps(),
30794
- ...makeMaskProps()
30795
- }, 'VMaskInput');
30796
- const VMaskInput = genericComponent()({
30797
- name: 'VMaskInput',
30798
- props: makeVMaskInputProps(),
30799
- emits: {
30800
- 'update:modelValue': val => true
30801
- },
30802
- setup(props, _ref) {
30803
- let {
30804
- slots,
30805
- emit
30806
- } = _ref;
30807
- const vTextFieldRef = vue.ref();
30808
- const {
30809
- maskText,
30810
- updateRange,
30811
- unmaskText
30812
- } = useMask(props, vTextFieldRef);
30813
- const returnMaskedValue = vue.computed(() => props.mask && props.returnMaskedValue);
30814
- const model = useProxiedModel(props, 'modelValue', undefined,
30815
- // Always display masked value in input when mask is applied
30816
- val => props.mask ? maskText(unmaskText(val)) : val, val => {
30817
- if (props.mask) {
30818
- const valueBeforeChange = unmaskText(model.value);
30819
- // E.g. mask is #-# and the input value is '2-23'
30820
- // model-value should be enforced to '2-2'
30821
- const enforcedMaskedValue = maskText(unmaskText(val));
30822
- const newUnmaskedValue = unmaskText(enforcedMaskedValue);
30823
- if (newUnmaskedValue === valueBeforeChange) {
30824
- vTextFieldRef.value.value = enforcedMaskedValue;
30825
- }
30826
- val = newUnmaskedValue;
30827
- updateRange();
30828
- return returnMaskedValue.value ? maskText(val) : val;
30829
- }
30830
- return val;
30831
- });
30832
- vue.onBeforeMount(() => {
30833
- if (props.returnMaskedValue) {
30834
- emit('update:modelValue', model.value);
30835
- }
30836
- });
30837
- useRender(() => {
30838
- const textFieldProps = VTextField.filterProps(props);
30839
- return vue.createVNode(VTextField, vue.mergeProps(textFieldProps, {
30840
- "modelValue": model.value,
30841
- "onUpdate:modelValue": $event => model.value = $event,
30842
- "ref": vTextFieldRef
30843
- }), {
30844
- ...slots
30845
- });
30846
- });
30847
- return forwardRefs({}, vTextFieldRef);
30848
- }
30849
- });
30850
-
30851
30299
  // Types
30852
30300
 
30853
30301
  const makeVStepperVerticalActionsProps = propsFactory({
@@ -31990,11 +31438,6 @@
31990
31438
  selectable: Boolean,
31991
31439
  selectedColor: String,
31992
31440
  selectStrategy: [String, Function, Object],
31993
- index: Number,
31994
- path: {
31995
- type: Array,
31996
- default: () => []
31997
- },
31998
31441
  ...makeDensityProps()
31999
31442
  }, 'VTreeviewChildren');
32000
31443
  const VTreeviewChildren = genericComponent()({
@@ -32022,19 +31465,12 @@
32022
31465
  select(!isSelected);
32023
31466
  }
32024
31467
  }
32025
- return () => slots.default?.() ?? props.items?.map((item, index) => {
31468
+ return () => slots.default?.() ?? props.items?.map(item => {
32026
31469
  const {
32027
31470
  children,
32028
31471
  props: itemProps
32029
31472
  } = item;
32030
31473
  const loading = isLoading.has(item.value);
32031
- const treeItemProps = {
32032
- index,
32033
- depth: props.path?.length ?? 0,
32034
- isFirst: index === 0,
32035
- isLast: props.items ? props.items.length - 1 === index : false,
32036
- path: [...props.path, index]
32037
- };
32038
31474
  const slotsWithItem = {
32039
31475
  prepend: slotProps => vue.createElementVNode(vue.Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && vue.createElementVNode("div", null, [vue.createVNode(VCheckboxBtn, {
32040
31476
  "key": item.value,
@@ -32055,13 +31491,11 @@
32055
31491
  }
32056
31492
  }, null)]), slots.prepend?.({
32057
31493
  ...slotProps,
32058
- ...treeItemProps,
32059
31494
  item: item.raw,
32060
31495
  internalItem: item
32061
31496
  })]),
32062
31497
  append: slots.append ? slotProps => slots.append?.({
32063
31498
  ...slotProps,
32064
- ...treeItemProps,
32065
31499
  item: item.raw,
32066
31500
  internalItem: item
32067
31501
  }) : undefined,
@@ -32077,10 +31511,7 @@
32077
31511
  }) : undefined
32078
31512
  };
32079
31513
  const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
32080
- const treeviewChildrenProps = VTreeviewChildren.filterProps({
32081
- ...props,
32082
- ...treeItemProps
32083
- });
31514
+ const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
32084
31515
  return children ? vue.createVNode(VTreeviewGroup, vue.mergeProps(treeviewGroupProps, {
32085
31516
  "value": props.returnObject ? item.raw : treeviewGroupProps?.value,
32086
31517
  "rawId": treeviewGroupProps?.value
@@ -32131,7 +31562,7 @@
32131
31562
  ...makeFilterProps({
32132
31563
  filterKeys: ['title']
32133
31564
  }),
32134
- ...omit(makeVTreeviewChildrenProps(), ['index', 'path']),
31565
+ ...makeVTreeviewChildrenProps(),
32135
31566
  ...omit(makeVListProps({
32136
31567
  collapseIcon: '$treeviewCollapse',
32137
31568
  expandIcon: '$treeviewExpand',
@@ -32374,7 +31805,6 @@
32374
31805
  VListSubheader: VListSubheader,
32375
31806
  VLocaleProvider: VLocaleProvider,
32376
31807
  VMain: VMain,
32377
- VMaskInput: VMaskInput,
32378
31808
  VMenu: VMenu,
32379
31809
  VMessages: VMessages,
32380
31810
  VNavigationDrawer: VNavigationDrawer,
@@ -32772,7 +32202,7 @@
32772
32202
  };
32773
32203
  });
32774
32204
  }
32775
- const version$1 = "3.8.10-dev.2025-06-18";
32205
+ const version$1 = "3.8.10-master.2025-06-18";
32776
32206
  createVuetify$1.version = version$1;
32777
32207
 
32778
32208
  // Vue's inject() can only be used in setup
@@ -33070,7 +32500,7 @@
33070
32500
 
33071
32501
  /* eslint-disable local-rules/sort-imports */
33072
32502
 
33073
- const version = "3.8.10-dev.2025-06-18";
32503
+ const version = "3.8.10-master.2025-06-18";
33074
32504
 
33075
32505
  /* eslint-disable local-rules/sort-imports */
33076
32506