@vuetify/nightly 3.0.0-beta.6 → 3.0.0-beta.9

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 (174) hide show
  1. package/CHANGELOG.md +14 -39
  2. package/dist/json/attributes.json +98 -14
  3. package/dist/json/importMap.json +64 -64
  4. package/dist/json/tags.json +23 -2
  5. package/dist/json/web-types.json +253 -40
  6. package/dist/vuetify.css +1469 -1640
  7. package/dist/vuetify.d.ts +1701 -7588
  8. package/dist/vuetify.esm.js +694 -443
  9. package/dist/vuetify.esm.js.map +1 -1
  10. package/dist/vuetify.js +693 -441
  11. package/dist/vuetify.js.map +1 -1
  12. package/dist/vuetify.min.css +3 -3
  13. package/dist/vuetify.min.js +766 -742
  14. package/dist/vuetify.min.js.map +1 -1
  15. package/lib/components/VAlert/VAlert.css +0 -3
  16. package/lib/components/VAlert/VAlert.mjs +20 -10
  17. package/lib/components/VAlert/VAlert.mjs.map +1 -1
  18. package/lib/components/VAlert/VAlert.sass +0 -3
  19. package/lib/components/VAutocomplete/VAutocomplete.css +10 -0
  20. package/lib/components/VAutocomplete/VAutocomplete.mjs +2 -3
  21. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  22. package/lib/components/VAutocomplete/VAutocomplete.sass +10 -0
  23. package/lib/components/VAutocomplete/_variables.scss +1 -0
  24. package/lib/components/VAvatar/VAvatar.css +2 -0
  25. package/lib/components/VAvatar/VAvatar.sass +3 -0
  26. package/lib/components/VBtn/VBtn.css +29 -5
  27. package/lib/components/VBtn/VBtn.sass +40 -10
  28. package/lib/components/VBtn/_variables.scss +4 -0
  29. package/lib/components/VBtnGroup/VBtnGroup.css +1 -0
  30. package/lib/components/VCard/VCard.mjs +12 -7
  31. package/lib/components/VCard/VCard.mjs.map +1 -1
  32. package/lib/components/VCombobox/VCombobox.css +10 -0
  33. package/lib/components/VCombobox/VCombobox.mjs +2 -2
  34. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  35. package/lib/components/VCombobox/VCombobox.sass +10 -0
  36. package/lib/components/VCombobox/_variables.scss +1 -0
  37. package/lib/components/VDialog/VDialog.mjs +3 -3
  38. package/lib/components/VDialog/VDialog.mjs.map +1 -1
  39. package/lib/components/VField/VField.css +44 -25
  40. package/lib/components/VField/VField.mjs +1 -1
  41. package/lib/components/VField/VField.mjs.map +1 -1
  42. package/lib/components/VField/VField.sass +33 -19
  43. package/lib/components/VField/_variables.scss +3 -2
  44. package/lib/components/VFileInput/VFileInput.mjs +2 -2
  45. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  46. package/lib/components/VForm/VForm.mjs +2 -2
  47. package/lib/components/VForm/VForm.mjs.map +1 -1
  48. package/lib/components/VGrid/VCol.mjs +2 -1
  49. package/lib/components/VGrid/VCol.mjs.map +1 -1
  50. package/lib/components/VGrid/VRow.mjs +8 -3
  51. package/lib/components/VGrid/VRow.mjs.map +1 -1
  52. package/lib/components/VIcon/VIcon.css +0 -10
  53. package/lib/components/VIcon/VIcon.sass +0 -10
  54. package/lib/components/VIcon/_variables.scss +0 -1
  55. package/lib/components/VImg/VImg.mjs +1 -0
  56. package/lib/components/VImg/VImg.mjs.map +1 -1
  57. package/lib/components/VInput/VInput.css +2 -1
  58. package/lib/components/VInput/VInput.sass +2 -1
  59. package/lib/components/VInput/_variables.scss +0 -1
  60. package/lib/components/VLayout/VLayout.css +0 -2
  61. package/lib/components/VLayout/VLayout.sass +0 -2
  62. package/lib/components/VList/VList.css +4 -1
  63. package/lib/components/VList/VList.sass +5 -1
  64. package/lib/components/VList/VListChildren.mjs +19 -2
  65. package/lib/components/VList/VListChildren.mjs.map +1 -1
  66. package/lib/components/VList/VListItem.mjs +18 -11
  67. package/lib/components/VList/VListItem.mjs.map +1 -1
  68. package/lib/components/VList/_variables.scss +1 -0
  69. package/lib/components/VMain/VMain.css +21 -3
  70. package/lib/components/VMain/VMain.mjs +13 -8
  71. package/lib/components/VMain/VMain.mjs.map +1 -1
  72. package/lib/components/VMain/VMain.sass +18 -3
  73. package/lib/components/VMenu/VMenu.mjs +2 -2
  74. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  75. package/lib/components/VNavigationDrawer/VNavigationDrawer.css +12 -17
  76. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +52 -19
  77. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  78. package/lib/components/VNavigationDrawer/VNavigationDrawer.sass +15 -20
  79. package/lib/components/VNavigationDrawer/_variables.scss +1 -1
  80. package/lib/components/VNavigationDrawer/sticky.mjs +72 -0
  81. package/lib/components/VNavigationDrawer/sticky.mjs.map +1 -0
  82. package/lib/components/VOverlay/VOverlay.mjs +8 -6
  83. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  84. package/lib/components/VOverlay/_variables.scss +1 -1
  85. package/lib/components/VOverlay/useActivator.mjs +1 -1
  86. package/lib/components/VOverlay/useActivator.mjs.map +1 -1
  87. package/lib/components/VPagination/VPagination.mjs +1 -1
  88. package/lib/components/VPagination/VPagination.mjs.map +1 -1
  89. package/lib/components/VRadio/VRadio.mjs +8 -17
  90. package/lib/components/VRadio/VRadio.mjs.map +1 -1
  91. package/lib/components/VRadioGroup/VRadioGroup.mjs +20 -3
  92. package/lib/components/VRadioGroup/VRadioGroup.mjs.map +1 -1
  93. package/lib/components/VSelect/VSelect.css +10 -0
  94. package/lib/components/VSelect/VSelect.mjs +3 -4
  95. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  96. package/lib/components/VSelect/VSelect.sass +10 -0
  97. package/lib/components/VSelect/_variables.scss +1 -0
  98. package/lib/components/VSelectionControl/VSelectionControl.mjs +9 -4
  99. package/lib/components/VSelectionControl/VSelectionControl.mjs.map +1 -1
  100. package/lib/components/VSnackbar/VSnackbar.css +1 -1
  101. package/lib/components/VSnackbar/VSnackbar.mjs +4 -4
  102. package/lib/components/VSnackbar/VSnackbar.mjs.map +1 -1
  103. package/lib/components/VSnackbar/_variables.scss +1 -3
  104. package/lib/components/VTable/VTable.mjs.map +1 -1
  105. package/lib/components/VTabs/VTab.css +0 -1
  106. package/lib/components/VTabs/VTab.sass +0 -1
  107. package/lib/components/VTextField/VTextField.css +2 -1
  108. package/lib/components/VTextField/VTextField.mjs +19 -21
  109. package/lib/components/VTextField/VTextField.mjs.map +1 -1
  110. package/lib/components/VTextField/VTextField.sass +2 -1
  111. package/lib/components/VTextarea/VTextarea.css +6 -2
  112. package/lib/components/VTextarea/VTextarea.mjs +18 -11
  113. package/lib/components/VTextarea/VTextarea.mjs.map +1 -1
  114. package/lib/components/VTextarea/VTextarea.sass +9 -2
  115. package/lib/components/VTextarea/_variables.scss +0 -1
  116. package/lib/components/VTimeline/VTimeline.css +123 -112
  117. package/lib/components/VTimeline/VTimeline.mjs +4 -4
  118. package/lib/components/VTimeline/VTimeline.mjs.map +1 -1
  119. package/lib/components/VTimeline/VTimeline.sass +129 -111
  120. package/lib/components/VTimeline/VTimelineDivider.mjs +5 -2
  121. package/lib/components/VTimeline/VTimelineDivider.mjs.map +1 -1
  122. package/lib/components/VTimeline/VTimelineItem.mjs +3 -1
  123. package/lib/components/VTimeline/VTimelineItem.mjs.map +1 -1
  124. package/lib/components/VToolbar/VToolbar.css +9 -33
  125. package/lib/components/VToolbar/VToolbar.mjs +3 -4
  126. package/lib/components/VToolbar/VToolbar.mjs.map +1 -1
  127. package/lib/components/VToolbar/VToolbar.sass +5 -15
  128. package/lib/components/VToolbar/_variables.scss +3 -7
  129. package/lib/components/VTooltip/VTooltip.mjs +2 -2
  130. package/lib/components/VTooltip/VTooltip.mjs.map +1 -1
  131. package/lib/components/index.d.ts +1696 -7583
  132. package/lib/composables/color.mjs +19 -26
  133. package/lib/composables/color.mjs.map +1 -1
  134. package/lib/composables/defaults.mjs +1 -1
  135. package/lib/composables/defaults.mjs.map +1 -1
  136. package/lib/composables/form.mjs +29 -9
  137. package/lib/composables/form.mjs.map +1 -1
  138. package/lib/composables/{forwardRef.mjs → forwardRefs.mjs} +29 -3
  139. package/lib/composables/forwardRefs.mjs.map +1 -0
  140. package/lib/composables/index.mjs +3 -2
  141. package/lib/composables/index.mjs.map +1 -1
  142. package/lib/composables/layout.mjs +12 -12
  143. package/lib/composables/layout.mjs.map +1 -1
  144. package/lib/composables/rtl.mjs +2 -2
  145. package/lib/composables/rtl.mjs.map +1 -1
  146. package/lib/composables/size.mjs +18 -14
  147. package/lib/composables/size.mjs.map +1 -1
  148. package/lib/composables/stack.mjs +22 -12
  149. package/lib/composables/stack.mjs.map +1 -1
  150. package/lib/composables/theme.mjs +9 -6
  151. package/lib/composables/theme.mjs.map +1 -1
  152. package/lib/composables/validation.mjs +13 -3
  153. package/lib/composables/validation.mjs.map +1 -1
  154. package/lib/entry-bundler.mjs +1 -1
  155. package/lib/index.d.ts +21 -21
  156. package/lib/styles/generic/_colors.scss +17 -9
  157. package/lib/styles/main.css +1135 -1371
  158. package/lib/styles/settings/_utilities.scss +16 -5
  159. package/lib/styles/utilities/_index.sass +0 -1
  160. package/lib/util/anchor.mjs +1 -3
  161. package/lib/util/anchor.mjs.map +1 -1
  162. package/lib/util/colorUtils.mjs +2 -2
  163. package/lib/util/colorUtils.mjs.map +1 -1
  164. package/lib/util/colors.mjs +1 -1
  165. package/lib/util/colors.mjs.map +1 -1
  166. package/lib/util/defineComponent.mjs +6 -3
  167. package/lib/util/defineComponent.mjs.map +1 -1
  168. package/lib/util/helpers.mjs +4 -1
  169. package/lib/util/helpers.mjs.map +1 -1
  170. package/lib/util/injectSelf.mjs +12 -0
  171. package/lib/util/injectSelf.mjs.map +1 -0
  172. package/package.json +3 -1
  173. package/lib/composables/forwardRef.mjs.map +0 -1
  174. package/lib/styles/utilities/_text.sass +0 -9
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.0.0-beta.6
2
+ * Vuetify v3.0.0-beta.9
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -351,7 +351,8 @@
351
351
  clientX: e.clientX,
352
352
  clientY: e.clientY
353
353
  };
354
- }
354
+ } // Only allow a single return type
355
+
355
356
  function destructComputed(getter) {
356
357
  const refs = {};
357
358
  const base = vue.computed(getter);
@@ -369,6 +370,8 @@
369
370
  });
370
371
  return refs;
371
372
  }
373
+ /** Array.includes but value can be any type */
374
+
372
375
  function includes(arr, val) {
373
376
  return arr.includes(val);
374
377
  }
@@ -389,13 +392,11 @@
389
392
  align: toPhysical(align, isRtl)
390
393
  };
391
394
  }
392
-
393
395
  function toPhysical(str, isRtl) {
394
396
  if (str === 'start') return isRtl ? 'right' : 'left';
395
397
  if (str === 'end') return isRtl ? 'left' : 'right';
396
398
  return str;
397
399
  }
398
-
399
400
  function flipSide(anchor) {
400
401
  return {
401
402
  side: {
@@ -671,7 +672,7 @@
671
672
  c = c.split('').map(char => char + char).join('');
672
673
  }
673
674
 
674
- if (c.length !== 6) {
675
+ if (c.length !== 6 && c.length !== 8) {
675
676
  consoleWarn(`'${color}' is not a valid rgb color`);
676
677
  }
677
678
 
@@ -683,7 +684,7 @@
683
684
  if (rgb < 0) {
684
685
  consoleWarn(`Colors cannot be negative: '${color}'`);
685
686
  rgb = 0;
686
- } else if (rgb > 0xffffff || isNaN(rgb)) {
687
+ } else if (rgb > 0xffffffff || isNaN(rgb)) {
687
688
  consoleWarn(`'${color}' is not a valid rgb color`);
688
689
  rgb = 0xffffff;
689
690
  }
@@ -885,6 +886,53 @@
885
886
  return (light + 0.05) / (dark + 0.05);
886
887
  }
887
888
 
889
+ // Utilities
890
+ function getCurrentInstance(name, message) {
891
+ const vm = vue.getCurrentInstance();
892
+
893
+ if (!vm) {
894
+ throw new Error(`[Vuetify] ${name} ${message || 'must be called from inside a setup function'}`);
895
+ }
896
+
897
+ return vm;
898
+ }
899
+ function getCurrentInstanceName() {
900
+ var _getCurrentInstance$t;
901
+
902
+ let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'composables';
903
+ return toKebabCase((_getCurrentInstance$t = getCurrentInstance(name).type) == null ? void 0 : _getCurrentInstance$t.name);
904
+ }
905
+ let _uid = 0;
906
+
907
+ let _map = new WeakMap();
908
+
909
+ function getUid() {
910
+ const vm = getCurrentInstance('getUid');
911
+ if (_map.has(vm)) return _map.get(vm);else {
912
+ const uid = _uid++;
913
+
914
+ _map.set(vm, uid);
915
+
916
+ return uid;
917
+ }
918
+ }
919
+
920
+ getUid.reset = () => {
921
+ _uid = 0;
922
+ _map = new WeakMap();
923
+ };
924
+
925
+ function injectSelf(key) {
926
+ const {
927
+ provides
928
+ } = getCurrentInstance('injectSelf');
929
+
930
+ if (provides && key in provides) {
931
+ // TS doesn't allow symbol as index type
932
+ return provides[key];
933
+ }
934
+ }
935
+
888
936
  // Utilities
889
937
 
890
938
  const DefaultsSymbol = Symbol.for('vuetify:defaults');
@@ -996,7 +1044,9 @@
996
1044
  if (!val && scope) scope.stop();else if (val && !oldVal) {
997
1045
  scope = vue.effectScope();
998
1046
  scope.run(() => {
999
- provideDefaults(val);
1047
+ var _injectSelf$value, _injectSelf;
1048
+
1049
+ provideDefaults(mergeDeep((_injectSelf$value = (_injectSelf = injectSelf(DefaultsSymbol)) == null ? void 0 : _injectSelf.value) != null ? _injectSelf$value : {}, val));
1000
1050
  });
1001
1051
  }
1002
1052
  }, {
@@ -1070,42 +1120,6 @@
1070
1120
 
1071
1121
  const acceleratedEasing = 'cubic-bezier(0.4, 0, 1, 1)'; // Leaving
1072
1122
 
1073
- // Utilities
1074
- function getCurrentInstance(name, message) {
1075
- const vm = vue.getCurrentInstance();
1076
-
1077
- if (!vm) {
1078
- throw new Error(`[Vuetify] ${name} ${message || 'must be called from inside a setup function'}`);
1079
- }
1080
-
1081
- return vm;
1082
- }
1083
- function getCurrentInstanceName() {
1084
- var _getCurrentInstance$t;
1085
-
1086
- let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'composables';
1087
- return toKebabCase((_getCurrentInstance$t = getCurrentInstance(name).type) == null ? void 0 : _getCurrentInstance$t.name);
1088
- }
1089
- let _uid = 0;
1090
-
1091
- let _map = new WeakMap();
1092
-
1093
- function getUid() {
1094
- const vm = getCurrentInstance('getUid');
1095
- if (_map.has(vm)) return _map.get(vm);else {
1096
- const uid = _uid++;
1097
-
1098
- _map.set(vm, uid);
1099
-
1100
- return uid;
1101
- }
1102
- }
1103
-
1104
- getUid.reset = () => {
1105
- _uid = 0;
1106
- _map = new WeakMap();
1107
- };
1108
-
1109
1123
  function getScrollParent(el) {
1110
1124
  while (el) {
1111
1125
  if (hasScrollbar(el)) return el;
@@ -1346,11 +1360,10 @@
1346
1360
  const mainStyles = vue.computed(() => {
1347
1361
  const layer = layers.value[layers.value.length - 1].layer;
1348
1362
  return {
1349
- position: 'relative',
1350
- paddingLeft: convertToUnit(layer.left),
1351
- paddingRight: convertToUnit(layer.right),
1352
- paddingTop: convertToUnit(layer.top),
1353
- paddingBottom: convertToUnit(layer.bottom),
1363
+ '--v-layout-left': convertToUnit(layer.left),
1364
+ '--v-layout-right': convertToUnit(layer.right),
1365
+ '--v-layout-top': convertToUnit(layer.top),
1366
+ '--v-layout-bottom': convertToUnit(layer.bottom),
1354
1367
  ...(transitionsEnabled.value ? undefined : {
1355
1368
  transition: 'none'
1356
1369
  })
@@ -1429,16 +1442,15 @@
1429
1442
 
1430
1443
  return { ...styles,
1431
1444
  height: isHorizontal ? `calc(100% - ${item.top}px - ${item.bottom}px)` : elementSize.value ? `${elementSize.value}px` : undefined,
1432
- marginLeft: isOppositeHorizontal ? undefined : `${item.left}px`,
1433
- marginRight: isOppositeHorizontal ? `${item.right}px` : undefined,
1434
- marginTop: position.value !== 'bottom' ? `${item.top}px` : undefined,
1435
- marginBottom: position.value !== 'top' ? `${item.bottom}px` : undefined,
1445
+ left: isOppositeHorizontal ? undefined : `${item.left}px`,
1446
+ right: isOppositeHorizontal ? `${item.right}px` : undefined,
1447
+ top: position.value !== 'bottom' ? `${item.top}px` : undefined,
1448
+ bottom: position.value !== 'top' ? `${item.bottom}px` : undefined,
1436
1449
  width: !isHorizontal ? `calc(100% - ${item.left}px - ${item.right}px)` : elementSize.value ? `${elementSize.value}px` : undefined
1437
1450
  };
1438
1451
  });
1439
1452
  const layoutItemScrimStyles = vue.computed(() => ({
1440
- zIndex: zIndex.value - 1,
1441
- position: rootZIndex.value === ROOT_ZINDEX ? 'fixed' : 'absolute'
1453
+ zIndex: zIndex.value - 1
1442
1454
  }));
1443
1455
  return {
1444
1456
  layoutItemStyles,
@@ -1464,7 +1476,9 @@
1464
1476
  'v-layout--full-height': props.fullHeight
1465
1477
  }]);
1466
1478
  const layoutStyles = vue.computed(() => ({
1467
- zIndex: rootZIndex.value
1479
+ zIndex: rootZIndex.value,
1480
+ position: parentLayout ? 'relative' : undefined,
1481
+ overflow: parentLayout ? 'hidden' : undefined
1468
1482
  }));
1469
1483
  return {
1470
1484
  layoutClasses,
@@ -1695,7 +1709,7 @@
1695
1709
  }
1696
1710
 
1697
1711
  for (const color of Object.keys(theme.colors)) {
1698
- if (/on-[a-z]/.test(color) || theme.colors[`on-${color}`]) continue;
1712
+ if (/^on-[a-z]/.test(color) || theme.colors[`on-${color}`]) continue;
1699
1713
  const onColor = `on-${color}`;
1700
1714
  const colorVal = colorToInt(theme.colors[color]);
1701
1715
  const blackContrast = Math.abs(APCAcontrast(0, colorVal));
@@ -1736,18 +1750,21 @@
1736
1750
  })]);
1737
1751
  }
1738
1752
 
1753
+ const bgLines = [];
1754
+ const fgLines = [];
1739
1755
  const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
1740
1756
 
1741
1757
  for (const key of colors) {
1742
- if (/on-[a-z]/.test(key)) {
1743
- createCssClass(lines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`]);
1758
+ if (/^on-[a-z]/.test(key)) {
1759
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`]);
1744
1760
  } else {
1745
- createCssClass(lines, `.bg-${key}`, [`--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`, `background: rgb(var(--v-theme-${key})) !important`, `color: rgb(var(--v-theme-on-${key})) !important`]);
1746
- createCssClass(lines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`]);
1747
- createCssClass(lines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`]);
1761
+ createCssClass(bgLines, `.bg-${key}`, [`--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`, `background: rgb(var(--v-theme-${key})) !important`, `color: rgb(var(--v-theme-on-${key})) !important`]);
1762
+ createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`]);
1763
+ createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`]);
1748
1764
  }
1749
1765
  }
1750
1766
 
1767
+ lines.push(...bgLines, ...fgLines);
1751
1768
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
1752
1769
  });
1753
1770
 
@@ -1967,13 +1984,13 @@
1967
1984
 
1968
1985
  const RtlSymbol = Symbol.for('vuetify:rtl');
1969
1986
  function createRtl(localeScope, options) {
1970
- var _options$rtl, _options$defaultRtl;
1987
+ var _options$rtl;
1971
1988
 
1972
1989
  return createRtlScope({
1973
1990
  rtl: { ...rtl,
1974
1991
  ...((_options$rtl = options == null ? void 0 : options.rtl) != null ? _options$rtl : {})
1975
1992
  },
1976
- isRtl: vue.ref((_options$defaultRtl = options == null ? void 0 : options.defaultRtl) != null ? _options$defaultRtl : false),
1993
+ isRtl: vue.ref(false),
1977
1994
  rtlClasses: vue.ref('')
1978
1995
  }, localeScope);
1979
1996
  }
@@ -2755,6 +2772,7 @@
2755
2772
  class: ['v-img__img', containClasses.value],
2756
2773
  src: normalisedSrc.value.src,
2757
2774
  srcset: normalisedSrc.value.srcset,
2775
+ alt: '',
2758
2776
  sizes: props.sizes,
2759
2777
  ref: image,
2760
2778
  onLoad,
@@ -2987,39 +3005,32 @@
2987
3005
 
2988
3006
  // Composables
2989
3007
  function useColor(colors) {
2990
- const backgroundIsCssColor = vue.computed(() => isCssColor(colors.value.background));
2991
- const textIsCssColor = vue.computed(() => isCssColor(colors.value.text));
2992
- const colorClasses = vue.computed(() => {
3008
+ return destructComputed(() => {
2993
3009
  const classes = [];
2994
-
2995
- if (colors.value.background && !backgroundIsCssColor.value) {
2996
- classes.push(`bg-${colors.value.background}`);
2997
- }
2998
-
2999
- if (colors.value.text && !textIsCssColor.value) {
3000
- classes.push(`text-${colors.value.text}`);
3001
- }
3002
-
3003
- return classes;
3004
- });
3005
- const colorStyles = vue.computed(() => {
3006
3010
  const styles = {};
3007
3011
 
3008
- if (colors.value.background && backgroundIsCssColor.value) {
3009
- styles.backgroundColor = colors.value.background;
3012
+ if (colors.value.background) {
3013
+ if (isCssColor(colors.value.background)) {
3014
+ styles.backgroundColor = colors.value.background;
3015
+ } else {
3016
+ classes.push(`bg-${colors.value.background}`);
3017
+ }
3010
3018
  }
3011
3019
 
3012
- if (colors.value.text && textIsCssColor.value) {
3013
- styles.color = colors.value.text;
3014
- styles.caretColor = colors.value.text;
3020
+ if (colors.value.text) {
3021
+ if (isCssColor(colors.value.text)) {
3022
+ styles.color = colors.value.text;
3023
+ styles.caretColor = colors.value.text;
3024
+ } else {
3025
+ classes.push(`text-${colors.value.text}`);
3026
+ }
3015
3027
  }
3016
3028
 
3017
- return styles;
3029
+ return {
3030
+ colorClasses: classes,
3031
+ colorStyles: styles
3032
+ };
3018
3033
  });
3019
- return {
3020
- colorClasses,
3021
- colorStyles
3022
- };
3023
3034
  }
3024
3035
  function useTextColor(props, name) {
3025
3036
  const colors = vue.computed(() => ({
@@ -3048,52 +3059,6 @@
3048
3059
  };
3049
3060
  }
3050
3061
 
3051
- function useForwardRef(target) {
3052
- for (var _len = arguments.length, refs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
3053
- refs[_key - 1] = arguments[_key];
3054
- }
3055
-
3056
- return new Proxy(target, {
3057
- get(target, key) {
3058
- if (Reflect.has(target, key)) {
3059
- return Reflect.get(target, key);
3060
- }
3061
-
3062
- for (const ref of refs) {
3063
- if (ref.value && Reflect.has(ref.value, key)) {
3064
- const val = Reflect.get(ref.value, key);
3065
- return typeof val === 'function' ? val.bind(ref.value) : val;
3066
- }
3067
- }
3068
- },
3069
-
3070
- getOwnPropertyDescriptor(target, key) {
3071
- const descriptor = Reflect.getOwnPropertyDescriptor(target, key);
3072
- if (descriptor) return descriptor; // Check each ref's own properties
3073
-
3074
- for (const ref of refs) {
3075
- if (!ref.value) continue;
3076
- const descriptor = Reflect.getOwnPropertyDescriptor(ref.value, key);
3077
- if (descriptor) return descriptor;
3078
- } // Recursive search up each ref's prototype
3079
-
3080
-
3081
- for (const ref of refs) {
3082
- let obj = ref.value && Object.getPrototypeOf(ref.value);
3083
-
3084
- while (obj) {
3085
- const descriptor = Reflect.getOwnPropertyDescriptor(obj, key);
3086
- if (descriptor) return descriptor;
3087
- obj = Object.getPrototypeOf(obj);
3088
- }
3089
- }
3090
-
3091
- return undefined;
3092
- }
3093
-
3094
- });
3095
- }
3096
-
3097
3062
  const allowedDensities$1 = [null, 'prominent', 'default', 'comfortable', 'compact'];
3098
3063
  const makeVToolbarProps = propsFactory({
3099
3064
  absolute: Boolean,
@@ -3212,10 +3177,10 @@
3212
3177
  })]
3213
3178
  });
3214
3179
  });
3215
- return useForwardRef({
3180
+ return {
3216
3181
  contentHeight,
3217
3182
  extensionHeight
3218
- });
3183
+ };
3219
3184
  }
3220
3185
 
3221
3186
  });
@@ -3906,19 +3871,24 @@
3906
3871
  }, 'size');
3907
3872
  function useSize(props) {
3908
3873
  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
3909
- const sizeClasses = vue.computed(() => {
3910
- return predefinedSizes.includes(props.size) ? `${name}--size-${props.size}` : undefined;
3911
- });
3912
- const sizeStyles = vue.computed(() => {
3913
- return !predefinedSizes.includes(props.size) && props.size ? {
3914
- width: convertToUnit(props.size),
3915
- height: convertToUnit(props.size)
3916
- } : undefined;
3874
+ return destructComputed(() => {
3875
+ let sizeClasses;
3876
+ let sizeStyles;
3877
+
3878
+ if (includes(predefinedSizes, props.size)) {
3879
+ sizeClasses = `${name}--size-${props.size}`;
3880
+ } else if (props.size) {
3881
+ sizeStyles = {
3882
+ width: convertToUnit(props.size),
3883
+ height: convertToUnit(props.size)
3884
+ };
3885
+ }
3886
+
3887
+ return {
3888
+ sizeClasses,
3889
+ sizeStyles
3890
+ };
3917
3891
  });
3918
- return {
3919
- sizeClasses,
3920
- sizeStyles
3921
- };
3922
3892
  }
3923
3893
 
3924
3894
  const makeVIconProps = propsFactory({
@@ -5087,6 +5057,141 @@
5087
5057
  // Utilities
5088
5058
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5089
5059
 
5060
+ // Locales
5061
+
5062
+ const LocaleAdapterSymbol = Symbol.for('vuetify:locale-adapter');
5063
+ const VuetifyLocaleSymbol = Symbol.for('vuetify:locale');
5064
+ function provideLocale(props) {
5065
+ const adapter = vue.inject(LocaleAdapterSymbol);
5066
+ if (!adapter) throw new Error('[Vuetify] Could not find injected locale adapter');
5067
+ return adapter.createScope(props);
5068
+ }
5069
+ function useLocale() {
5070
+ const adapter = vue.inject(LocaleAdapterSymbol);
5071
+ if (!adapter) throw new Error('[Vuetify] Could not find injected locale adapter');
5072
+ return adapter.getScope();
5073
+ }
5074
+
5075
+ function isLocaleAdapter(x) {
5076
+ return !!x && x.hasOwnProperty('getScope') && x.hasOwnProperty('createScope') && x.hasOwnProperty('createRoot');
5077
+ }
5078
+
5079
+ function createLocale(app, options) {
5080
+ const adapter = isLocaleAdapter(options) ? options : createDefaultLocaleAdapter(options);
5081
+ const instance = adapter.createRoot(app);
5082
+ app == null ? void 0 : app.provide(RtlSymbol, createRtl(instance, options));
5083
+ return adapter;
5084
+ }
5085
+ const LANG_PREFIX = '$vuetify.';
5086
+
5087
+ const replace = (str, params) => {
5088
+ return str.replace(/\{(\d+)\}/g, (match, index) => {
5089
+ /* istanbul ignore next */
5090
+ return String(params[+index]);
5091
+ });
5092
+ };
5093
+
5094
+ const createTranslateFunction = (current, fallback, messages) => {
5095
+ return function (key) {
5096
+ for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
5097
+ params[_key - 1] = arguments[_key];
5098
+ }
5099
+
5100
+ if (!key.startsWith(LANG_PREFIX)) {
5101
+ return replace(key, params);
5102
+ }
5103
+
5104
+ const shortKey = key.replace(LANG_PREFIX, '');
5105
+ const currentLocale = current.value && messages.value[current.value];
5106
+ const fallbackLocale = fallback.value && messages.value[fallback.value];
5107
+ let str = getObjectValueByPath(currentLocale, shortKey, null);
5108
+
5109
+ if (!str) {
5110
+ consoleWarn(`Translation key "${key}" not found in "${current.value}", trying fallback locale`);
5111
+ str = getObjectValueByPath(fallbackLocale, shortKey, null);
5112
+ }
5113
+
5114
+ if (!str) {
5115
+ consoleError(`Translation key "${key}" not found in fallback`);
5116
+ str = key;
5117
+ }
5118
+
5119
+ if (typeof str !== 'string') {
5120
+ consoleError(`Translation key "${key}" has a non-string value`);
5121
+ str = key;
5122
+ }
5123
+
5124
+ return replace(str, params);
5125
+ };
5126
+ };
5127
+
5128
+ function createNumberFunction(current, fallback) {
5129
+ return (value, options) => {
5130
+ const numberFormat = new Intl.NumberFormat([current.value, fallback.value], options);
5131
+ return numberFormat.format(value);
5132
+ };
5133
+ }
5134
+
5135
+ function createDefaultLocaleAdapter(options) {
5136
+ const createScope = options => {
5137
+ const current = vue.ref(options.current);
5138
+ const fallback = vue.ref(options.fallback);
5139
+ const messages = vue.ref(options.messages);
5140
+ return {
5141
+ current,
5142
+ fallback,
5143
+ messages,
5144
+ t: createTranslateFunction(current, fallback, messages),
5145
+ n: createNumberFunction(current, fallback)
5146
+ };
5147
+ };
5148
+
5149
+ return {
5150
+ createRoot: app => {
5151
+ var _options$defaultLocal, _options$fallbackLoca, _options$messages;
5152
+
5153
+ const rootScope = createScope({
5154
+ current: (_options$defaultLocal = options == null ? void 0 : options.defaultLocale) != null ? _options$defaultLocal : 'en',
5155
+ fallback: (_options$fallbackLoca = options == null ? void 0 : options.fallbackLocale) != null ? _options$fallbackLoca : 'en',
5156
+ messages: (_options$messages = options == null ? void 0 : options.messages) != null ? _options$messages : {
5157
+ en
5158
+ }
5159
+ });
5160
+ if (!app) throw new Error('[Vuetify] Could not find default app instance');
5161
+ app.provide(VuetifyLocaleSymbol, rootScope);
5162
+ return rootScope;
5163
+ },
5164
+ getScope: () => {
5165
+ const currentScope = vue.inject(VuetifyLocaleSymbol);
5166
+ if (!currentScope) throw new Error('[Vuetify] Could not find injected locale instance');
5167
+ return currentScope;
5168
+ },
5169
+ createScope: options => {
5170
+ const currentScope = vue.inject(VuetifyLocaleSymbol);
5171
+ if (!currentScope) throw new Error('[Vuetify] Could not find injected locale instance');
5172
+ const newScope = createScope({
5173
+ current: vue.computed(() => {
5174
+ var _options$locale;
5175
+
5176
+ return (_options$locale = options == null ? void 0 : options.locale) != null ? _options$locale : currentScope.current.value;
5177
+ }),
5178
+ fallback: vue.computed(() => {
5179
+ var _options$locale2;
5180
+
5181
+ return (_options$locale2 = options == null ? void 0 : options.locale) != null ? _options$locale2 : currentScope.fallback.value;
5182
+ }),
5183
+ messages: vue.computed(() => {
5184
+ var _options$messages2;
5185
+
5186
+ return (_options$messages2 = options == null ? void 0 : options.messages) != null ? _options$messages2 : currentScope.messages.value;
5187
+ })
5188
+ });
5189
+ vue.provide(VuetifyLocaleSymbol, newScope);
5190
+ return newScope;
5191
+ }
5192
+ };
5193
+ }
5194
+
5090
5195
  const allowedTypes = ['success', 'info', 'warning', 'error'];
5091
5196
  const VAlert = defineComponent({
5092
5197
  name: 'VAlert',
@@ -5188,13 +5293,19 @@
5188
5293
  textColorClasses,
5189
5294
  textColorStyles
5190
5295
  } = useTextColor(vue.toRef(props, 'borderColor'));
5296
+ const {
5297
+ t
5298
+ } = useLocale();
5299
+ const closeProps = vue.computed(() => ({
5300
+ 'aria-label': t(props.closeLabel),
5191
5301
 
5192
- function onCloseClick(e) {
5193
- isActive.value = false;
5194
- }
5302
+ onClick(e) {
5303
+ isActive.value = false;
5304
+ }
5195
5305
 
5306
+ }));
5196
5307
  return () => {
5197
- var _slots$default;
5308
+ var _slots$default, _slots$close, _slots$close2;
5198
5309
 
5199
5310
  const hasPrepend = !!(slots.prepend || icon.value);
5200
5311
  const hasTitle = !!(slots.title || props.title);
@@ -5220,7 +5331,7 @@
5220
5331
  VIcon: {
5221
5332
  density: props.density,
5222
5333
  icon: icon.value,
5223
- size: props.prominent ? 44 : 'default'
5334
+ size: props.prominent ? 44 : 28
5224
5335
  }
5225
5336
  }
5226
5337
  }, {
@@ -5239,16 +5350,18 @@
5239
5350
  }, [slots.append()]), hasClose && vue.createVNode(VDefaultsProvider, {
5240
5351
  "key": "close",
5241
5352
  "defaults": {
5242
- VIcon: {
5353
+ VBtn: {
5243
5354
  icon: props.closeIcon,
5244
- size: 'small'
5355
+ size: 'x-small',
5356
+ variant: 'text'
5245
5357
  }
5246
5358
  }
5247
5359
  }, {
5248
5360
  default: () => [vue.createVNode("div", {
5249
- "class": "v-alert__close",
5250
- "onClick": onCloseClick
5251
- }, [slots.close ? slots.close() : vue.createVNode(VIcon, null, null)])]
5361
+ "class": "v-alert__close"
5362
+ }, [(_slots$close = (_slots$close2 = slots.close) == null ? void 0 : _slots$close2.call(slots, {
5363
+ props: closeProps.value
5364
+ })) != null ? _slots$close : vue.createVNode(VBtn, closeProps.value, null)])]
5252
5365
  })]
5253
5366
  });
5254
5367
  };
@@ -5362,20 +5475,34 @@
5362
5475
  }
5363
5476
 
5364
5477
  vue.watch(items, () => {
5365
- let valid = null;
5478
+ let valid = 0;
5479
+ let invalid = 0;
5480
+ const results = [];
5366
5481
 
5367
- if (items.value.some(item => item.isValid === false)) {
5368
- valid = false;
5369
- } else if (items.value.every(item => item.isValid === true)) {
5370
- valid = true;
5482
+ for (const item of items.value) {
5483
+ if (item.isValid === false) {
5484
+ invalid++;
5485
+ results.push({
5486
+ id: item.id,
5487
+ errorMessages: item.errorMessages
5488
+ });
5489
+ } else if (item.isValid === true) valid++;
5371
5490
  }
5372
5491
 
5373
- model.value = valid;
5492
+ errors.value = results;
5493
+ model.value = invalid > 0 ? false : valid === items.value.length ? true : null;
5374
5494
  }, {
5375
5495
  deep: true
5376
5496
  });
5377
5497
  vue.provide(FormKey, {
5378
- register: (id, validate, reset, resetValidation, isValid) => {
5498
+ register: _ref => {
5499
+ let {
5500
+ id,
5501
+ validate,
5502
+ reset,
5503
+ resetValidation
5504
+ } = _ref;
5505
+
5379
5506
  if (items.value.some(item => item.id === id)) {
5380
5507
  consoleWarn(`Duplicate input name "${id}"`);
5381
5508
  }
@@ -5385,8 +5512,8 @@
5385
5512
  validate,
5386
5513
  reset,
5387
5514
  resetValidation,
5388
- isValid: isValid // TODO: Better way to type this unwrapping?
5389
-
5515
+ isValid: null,
5516
+ errorMessages: []
5390
5517
  });
5391
5518
  },
5392
5519
  unregister: id => {
@@ -5394,6 +5521,12 @@
5394
5521
  return item.id !== id;
5395
5522
  });
5396
5523
  },
5524
+ update: (id, isValid, errorMessages) => {
5525
+ const found = items.value.find(item => item.id === id);
5526
+ if (!found) return;
5527
+ found.isValid = isValid;
5528
+ found.errorMessages = errorMessages;
5529
+ },
5397
5530
  isDisabled,
5398
5531
  isReadonly,
5399
5532
  isValidating,
@@ -5474,14 +5607,24 @@
5474
5607
  return (_props$name = props.name) != null ? _props$name : vue.unref(id);
5475
5608
  });
5476
5609
  vue.onBeforeMount(() => {
5477
- form == null ? void 0 : form.register(uid.value, validate, reset, resetValidation, isValid);
5610
+ form == null ? void 0 : form.register({
5611
+ id: uid.value,
5612
+ validate,
5613
+ reset,
5614
+ resetValidation
5615
+ });
5478
5616
  });
5479
5617
  vue.onBeforeUnmount(() => {
5480
5618
  form == null ? void 0 : form.unregister(uid.value);
5481
- });
5619
+ }); // Set initial valid state, for inputs that might not have rules
5620
+
5621
+ vue.onMounted(() => form == null ? void 0 : form.update(uid.value, isValid.value, errorMessages.value));
5482
5622
  vue.watch(validationModel, () => {
5483
5623
  if (validationModel.value != null) validate();
5484
5624
  });
5625
+ vue.watch(isValid, () => {
5626
+ form == null ? void 0 : form.update(uid.value, isValid.value, errorMessages.value);
5627
+ });
5485
5628
 
5486
5629
  function reset() {
5487
5630
  resetValidation();
@@ -5850,6 +5993,10 @@
5850
5993
  isFocusVisible.value = false;
5851
5994
  }
5852
5995
 
5996
+ function onInput(e) {
5997
+ model.value = e.target.checked;
5998
+ }
5999
+
5853
6000
  useRender(() => {
5854
6001
  var _group$type$value, _slots$default, _group$name$value, _slots$input;
5855
6002
 
@@ -5878,19 +6025,20 @@
5878
6025
  }, [icon.value && vue.createVNode(VIcon, {
5879
6026
  "key": "icon",
5880
6027
  "icon": icon.value
5881
- }, null), vue.withDirectives(vue.createVNode("input", vue.mergeProps({
5882
- "onUpdate:modelValue": $event => model.value = $event,
6028
+ }, null), vue.createVNode("input", vue.mergeProps({
5883
6029
  "ref": input,
6030
+ "checked": model.value,
5884
6031
  "disabled": props.disabled,
5885
6032
  "id": id.value,
5886
6033
  "onBlur": onBlur,
5887
6034
  "onFocus": onFocus,
6035
+ "onInput": onInput,
5888
6036
  "aria-readonly": props.readonly,
5889
6037
  "type": type,
5890
6038
  "value": trueValue.value,
5891
6039
  "name": (_group$name$value = group == null ? void 0 : group.name.value) != null ? _group$name$value : props.name,
5892
6040
  "aria-checked": type === 'checkbox' ? model.value : undefined
5893
- }, inputAttrs), null), [[vue.vModelDynamic, model.value]]), (_slots$input = slots.input) == null ? void 0 : _slots$input.call(slots, {
6041
+ }, inputAttrs), null), (_slots$input = slots.input) == null ? void 0 : _slots$input.call(slots, {
5894
6042
  model,
5895
6043
  textColorClasses,
5896
6044
  props: {
@@ -6995,20 +7143,26 @@
6995
7143
  Ripple
6996
7144
  },
6997
7145
  props: {
6998
- active: Boolean,
6999
- activeColor: String,
7146
+ active: {
7147
+ type: Boolean,
7148
+ default: undefined
7149
+ },
7000
7150
  activeClass: String,
7151
+ activeColor: String,
7001
7152
  appendAvatar: String,
7002
7153
  appendIcon: IconValue,
7003
7154
  disabled: Boolean,
7004
7155
  lines: String,
7156
+ link: {
7157
+ type: Boolean,
7158
+ default: undefined
7159
+ },
7005
7160
  nav: Boolean,
7006
7161
  prependAvatar: String,
7007
7162
  prependIcon: IconValue,
7008
7163
  subtitle: [String, Number, Boolean],
7009
7164
  title: [String, Number, Boolean],
7010
7165
  value: null,
7011
- link: Boolean,
7012
7166
  ...makeBorderProps(),
7013
7167
  ...makeDensityProps(),
7014
7168
  ...makeDimensionProps(),
@@ -7045,8 +7199,10 @@
7045
7199
  const isActive = vue.computed(() => {
7046
7200
  var _link$isExactActive;
7047
7201
 
7048
- return props.active || ((_link$isExactActive = link.isExactActive) == null ? void 0 : _link$isExactActive.value) || isSelected.value;
7202
+ return props.active !== false && (props.active || ((_link$isExactActive = link.isExactActive) == null ? void 0 : _link$isExactActive.value) || isSelected.value);
7049
7203
  });
7204
+ const isLink = vue.computed(() => props.link !== false && link.isLink.value);
7205
+ const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || props.value != null && !!list));
7050
7206
  const roundedProps = vue.computed(() => props.rounded || props.nav);
7051
7207
  const variantProps = vue.computed(() => {
7052
7208
  var _props$activeColor;
@@ -7100,27 +7256,26 @@
7100
7256
  useRender(() => {
7101
7257
  var _slots$prepend, _slots$title, _slots$title2, _slots$subtitle, _slots$subtitle2, _slots$default, _slots$append;
7102
7258
 
7103
- const Tag = link.isLink.value ? 'a' : props.tag;
7259
+ const Tag = isLink.value ? 'a' : props.tag;
7104
7260
  const hasColor = !list || isSelected.value || isActive.value;
7105
7261
  const hasTitle = slots.title || props.title;
7106
7262
  const hasSubtitle = slots.subtitle || props.subtitle;
7107
7263
  const hasAppend = !!(slots.append || props.appendAvatar || props.appendIcon);
7108
7264
  const hasPrepend = !!(slots.prepend || props.prependAvatar || props.prependIcon);
7109
- const isClickable = !props.disabled && (props.link || link.isClickable.value || props.value != null && !!list);
7110
7265
  list == null ? void 0 : list.updateHasPrepend(hasPrepend);
7111
7266
  return vue.withDirectives(vue.createVNode(Tag, {
7112
7267
  "class": ['v-list-item', {
7113
7268
  'v-list-item--active': isActive.value,
7114
7269
  'v-list-item--disabled': props.disabled,
7115
- 'v-list-item--link': isClickable,
7270
+ 'v-list-item--link': isClickable.value,
7116
7271
  'v-list-item--nav': props.nav,
7117
7272
  'v-list-item--prepend': !hasPrepend && (list == null ? void 0 : list.hasPrepend.value),
7118
7273
  [`${props.activeClass}`]: isActive.value
7119
7274
  }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value],
7120
7275
  "style": [hasColor ? colorStyles.value : undefined, dimensionStyles.value],
7121
7276
  "href": link.href.value,
7122
- "tabindex": isClickable ? 0 : undefined,
7123
- "onClick": isClickable && (e => {
7277
+ "tabindex": isClickable.value ? 0 : undefined,
7278
+ "onClick": isClickable.value && (e => {
7124
7279
  var _link$navigate;
7125
7280
 
7126
7281
  if (isGroupActivator) return;
@@ -7128,7 +7283,7 @@
7128
7283
  props.value != null && select(!isSelected.value, e);
7129
7284
  })
7130
7285
  }, {
7131
- default: () => [genOverlays(isClickable || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode(VDefaultsProvider, {
7286
+ default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode(VDefaultsProvider, {
7132
7287
  "key": "prepend",
7133
7288
  "defaults": {
7134
7289
  VAvatar: {
@@ -7189,7 +7344,7 @@
7189
7344
  "key": "append-avatar"
7190
7345
  }, null)])]
7191
7346
  })]
7192
- }), [[vue.resolveDirective("ripple"), isClickable]]);
7347
+ }), [[vue.resolveDirective("ripple"), isClickable.value]]);
7193
7348
  });
7194
7349
  return {};
7195
7350
  }
@@ -7258,8 +7413,25 @@
7258
7413
  type,
7259
7414
  raw: item
7260
7415
  } = _ref2;
7261
- if (type === 'divider') return vue.createVNode(VDivider, itemProps, null);
7262
- if (type === 'subheader') return vue.createVNode(VListSubheader, itemProps, slots);
7416
+
7417
+ if (type === 'divider') {
7418
+ var _slots$divider, _slots$divider2;
7419
+
7420
+ return (_slots$divider = (_slots$divider2 = slots.divider) == null ? void 0 : _slots$divider2.call(slots, {
7421
+ props: itemProps
7422
+ })) != null ? _slots$divider : vue.createVNode(VDivider, itemProps, null);
7423
+ }
7424
+
7425
+ if (type === 'subheader') {
7426
+ var _slots$subheader, _slots$subheader2;
7427
+
7428
+ return (_slots$subheader = (_slots$subheader2 = slots.subheader) == null ? void 0 : _slots$subheader2.call(slots, {
7429
+ props: itemProps
7430
+ })) != null ? _slots$subheader : vue.createVNode(VListSubheader, itemProps, {
7431
+ default: slots.subheader
7432
+ });
7433
+ }
7434
+
7263
7435
  const slotsWithItem = {
7264
7436
  subtitle: slots.subtitle ? slotProps => {
7265
7437
  var _slots$subtitle;
@@ -7749,7 +7921,7 @@
7749
7921
  return events;
7750
7922
  });
7751
7923
  vue.watch(isTop, val => {
7752
- if (val && props.openOnHover && !isHovered) {
7924
+ if (val && (props.openOnHover && !isHovered && (!openOnFocus.value || !isFocused) || openOnFocus.value && !isFocused && (!props.openOnHover || !isHovered))) {
7753
7925
  isActive.value = false;
7754
7926
  }
7755
7927
  });
@@ -8518,33 +8690,43 @@
8518
8690
  });
8519
8691
  }
8520
8692
 
8521
- const stack = vue.reactive([]);
8693
+ const StackSymbol = Symbol.for('vuetify:stack');
8694
+ const globalStack = vue.reactive([]);
8522
8695
  function useStack(isActive, zIndex) {
8523
8696
  const vm = getCurrentInstance('useStack');
8697
+ const parent = vue.inject(StackSymbol, undefined);
8698
+ const stack = vue.reactive({
8699
+ activeChildren: new Set()
8700
+ });
8701
+ vue.provide(StackSymbol, stack);
8524
8702
 
8525
8703
  const _zIndex = vue.ref(+zIndex.value);
8526
8704
 
8527
8705
  useToggleScope(isActive, () => {
8528
- var _stack$at;
8706
+ var _globalStack$at;
8529
8707
 
8530
- const lastZIndex = (_stack$at = stack.at(-1)) == null ? void 0 : _stack$at[1];
8708
+ const lastZIndex = (_globalStack$at = globalStack.at(-1)) == null ? void 0 : _globalStack$at[1];
8531
8709
  _zIndex.value = lastZIndex ? lastZIndex + 10 : +zIndex.value;
8532
- stack.push([vm.uid, _zIndex.value]);
8710
+ globalStack.push([vm.uid, _zIndex.value]);
8711
+ parent == null ? void 0 : parent.activeChildren.add(vm.uid);
8533
8712
  vue.onScopeDispose(() => {
8534
- const idx = stack.findIndex(v => v[0] === vm.uid);
8535
- stack.splice(idx, 1);
8713
+ const idx = globalStack.findIndex(v => v[0] === vm.uid);
8714
+ globalStack.splice(idx, 1);
8715
+ parent == null ? void 0 : parent.activeChildren.delete(vm.uid);
8536
8716
  });
8537
8717
  });
8538
- const isTop = vue.ref(true);
8718
+ const globalTop = vue.ref(true);
8539
8719
  vue.watchEffect(() => {
8540
- var _stack$at2;
8720
+ var _globalStack$at2;
8541
8721
 
8542
- const _isTop = ((_stack$at2 = stack.at(-1)) == null ? void 0 : _stack$at2[0]) === vm.uid;
8722
+ const _isTop = ((_globalStack$at2 = globalStack.at(-1)) == null ? void 0 : _globalStack$at2[0]) === vm.uid;
8543
8723
 
8544
- setTimeout(() => isTop.value = _isTop);
8724
+ setTimeout(() => globalTop.value = _isTop);
8545
8725
  });
8726
+ const localTop = vue.computed(() => !stack.activeChildren.size);
8546
8727
  return {
8547
- isTop: vue.readonly(isTop),
8728
+ globalTop: vue.readonly(globalTop),
8729
+ localTop,
8548
8730
  stackStyles: vue.computed(() => ({
8549
8731
  zIndex: _zIndex.value
8550
8732
  }))
@@ -8767,7 +8949,8 @@
8767
8949
  return typeof props.scrim === 'string' ? props.scrim : null;
8768
8950
  }));
8769
8951
  const {
8770
- isTop,
8952
+ globalTop,
8953
+ localTop,
8771
8954
  stackStyles
8772
8955
  } = useStack(isActive, vue.toRef(props, 'zIndex'));
8773
8956
  const {
@@ -8777,7 +8960,7 @@
8777
8960
  contentEvents
8778
8961
  } = useActivator(props, {
8779
8962
  isActive,
8780
- isTop
8963
+ isTop: localTop
8781
8964
  });
8782
8965
  const {
8783
8966
  dimensionStyles
@@ -8810,7 +8993,7 @@
8810
8993
  }
8811
8994
 
8812
8995
  function closeConditional() {
8813
- return isActive.value && isTop.value;
8996
+ return isActive.value && globalTop.value;
8814
8997
  }
8815
8998
 
8816
8999
  IN_BROWSER && vue.watch(isActive, val => {
@@ -8824,7 +9007,7 @@
8824
9007
  });
8825
9008
 
8826
9009
  function onKeydown(e) {
8827
- if (e.key === 'Escape' && isTop.value) {
9010
+ if (e.key === 'Escape' && globalTop.value) {
8828
9011
  if (!props.persistent) {
8829
9012
  isActive.value = false;
8830
9013
  } else animateClick();
@@ -8834,7 +9017,7 @@
8834
9017
  const router = useRouter();
8835
9018
  useToggleScope(() => props.closeOnBack, () => {
8836
9019
  useBackButton(router, next => {
8837
- if (isTop.value && isActive.value) {
9020
+ if (globalTop.value && isActive.value) {
8838
9021
  next(false);
8839
9022
  if (!props.persistent) isActive.value = false;else animateClick();
8840
9023
  } else {
@@ -8922,13 +9105,86 @@
8922
9105
  activatorEl,
8923
9106
  animateClick,
8924
9107
  contentEl,
8925
- isTop,
9108
+ globalTop,
9109
+ localTop,
8926
9110
  updateLocation
8927
9111
  };
8928
9112
  }
8929
9113
 
8930
9114
  });
8931
9115
 
9116
+ const Refs = Symbol('Forwarded refs');
9117
+ /** Omit properties starting with P */
9118
+
9119
+ function forwardRefs(target) {
9120
+ for (var _len = arguments.length, refs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
9121
+ refs[_key - 1] = arguments[_key];
9122
+ }
9123
+
9124
+ target[Refs] = refs;
9125
+ return new Proxy(target, {
9126
+ get(target, key) {
9127
+ if (Reflect.has(target, key)) {
9128
+ return Reflect.get(target, key);
9129
+ }
9130
+
9131
+ for (const ref of refs) {
9132
+ if (ref.value && Reflect.has(ref.value, key)) {
9133
+ const val = Reflect.get(ref.value, key);
9134
+ return typeof val === 'function' ? val.bind(ref.value) : val;
9135
+ }
9136
+ }
9137
+ },
9138
+
9139
+ getOwnPropertyDescriptor(target, key) {
9140
+ const descriptor = Reflect.getOwnPropertyDescriptor(target, key);
9141
+ if (descriptor) return descriptor; // Skip internal properties
9142
+
9143
+ if (typeof key === 'symbol' || key.startsWith('__')) return; // Check each ref's own properties
9144
+
9145
+ for (const ref of refs) {
9146
+ if (!ref.value) continue;
9147
+ const descriptor = Reflect.getOwnPropertyDescriptor(ref.value, key);
9148
+ if (descriptor) return descriptor;
9149
+
9150
+ if ('_' in ref.value && 'setupState' in ref.value._) {
9151
+ const descriptor = Reflect.getOwnPropertyDescriptor(ref.value._.setupState, key);
9152
+ if (descriptor) return descriptor;
9153
+ }
9154
+ } // Recursive search up each ref's prototype
9155
+
9156
+
9157
+ for (const ref of refs) {
9158
+ let obj = ref.value && Object.getPrototypeOf(ref.value);
9159
+
9160
+ while (obj) {
9161
+ const descriptor = Reflect.getOwnPropertyDescriptor(obj, key);
9162
+ if (descriptor) return descriptor;
9163
+ obj = Object.getPrototypeOf(obj);
9164
+ }
9165
+ } // Call forwarded refs' proxies
9166
+
9167
+
9168
+ for (const ref of refs) {
9169
+ const childRefs = ref.value && ref.value[Refs];
9170
+ if (!childRefs) continue;
9171
+ const queue = childRefs.slice();
9172
+
9173
+ while (queue.length) {
9174
+ const ref = queue.shift();
9175
+ const descriptor = Reflect.getOwnPropertyDescriptor(ref.value, key);
9176
+ if (descriptor) return descriptor;
9177
+ const childRefs = ref.value && ref.value[Refs];
9178
+ if (childRefs) queue.push(...childRefs);
9179
+ }
9180
+ }
9181
+
9182
+ return undefined;
9183
+ }
9184
+
9185
+ });
9186
+ }
9187
+
8932
9188
  function useScopeId() {
8933
9189
  const vm = getCurrentInstance('useScopeId');
8934
9190
  const scopeId = vm.vnode.scopeId;
@@ -9021,7 +9277,7 @@
9021
9277
  default: slots.default,
9022
9278
  activator: slots.activator
9023
9279
  }));
9024
- return useForwardRef({
9280
+ return forwardRefs({
9025
9281
  id
9026
9282
  }, overlay);
9027
9283
  }
@@ -9169,7 +9425,7 @@
9169
9425
  const width = Math.abs(targetWidth - rect.width) > 1 ? {
9170
9426
  maxWidth: convertToUnit(targetWidth)
9171
9427
  } : undefined;
9172
- const duration = parseFloat(getComputedStyle(el).transitionDuration) * 1000;
9428
+ const duration = parseFloat(getComputedStyle(el).transitionDuration) * 1000 || 150;
9173
9429
  const scale = parseFloat(getComputedStyle(targetEl).getPropertyValue('--v-field-label-scale'));
9174
9430
  el.style.visibility = 'visible';
9175
9431
  targetEl.style.visibility = 'hidden';
@@ -9450,10 +9706,6 @@
9450
9706
  });
9451
9707
  }
9452
9708
 
9453
- function onInput(e) {
9454
- model.value = e.target.value;
9455
- }
9456
-
9457
9709
  useRender(() => {
9458
9710
  const hasCounter = !!(slots.counter || props.counter || props.counterValue);
9459
9711
  const hasDetails = !!(hasCounter || slots.details);
@@ -9504,24 +9756,16 @@
9504
9756
  "error": isValid.value === false
9505
9757
  }), { ...slots,
9506
9758
  default: _ref3 => {
9507
- var _slots$default;
9508
-
9509
9759
  let {
9510
9760
  props: {
9511
9761
  class: fieldClass,
9512
9762
  ...slotProps
9513
9763
  }
9514
9764
  } = _ref3;
9515
- return vue.createVNode(vue.Fragment, null, [props.prefix && vue.createVNode("span", {
9516
- "class": "v-text-field__prefix"
9517
- }, [props.prefix]), vue.createVNode("div", {
9518
- "class": fieldClass,
9519
- "onClick": e => emit('click:input', e),
9520
- "data-no-activator": ""
9521
- }, [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots), vue.withDirectives(vue.createVNode("input", vue.mergeProps({
9765
+
9766
+ const inputNode = vue.withDirectives(vue.createVNode("input", vue.mergeProps({
9522
9767
  "ref": inputRef,
9523
- "value": model.value,
9524
- "onInput": onInput,
9768
+ "onUpdate:modelValue": $event => model.value = $event,
9525
9769
  "autofocus": props.autofocus,
9526
9770
  "readonly": isReadonly.value,
9527
9771
  "disabled": isDisabled.value,
@@ -9531,11 +9775,21 @@
9531
9775
  "type": props.type,
9532
9776
  "onFocus": onFocus,
9533
9777
  "onBlur": () => isFocused.value = false
9534
- }, slotProps, inputAttrs), null), [[vue.resolveDirective("intersect"), {
9778
+ }, slotProps, inputAttrs), null), [[vue.vModelDynamic, model.value], [vue.resolveDirective("intersect"), {
9535
9779
  handler: onIntersect
9536
9780
  }, null, {
9537
9781
  once: true
9538
- }]])]), props.suffix && vue.createVNode("span", {
9782
+ }]]);
9783
+
9784
+ return vue.createVNode(vue.Fragment, null, [props.prefix && vue.createVNode("span", {
9785
+ "class": "v-text-field__prefix"
9786
+ }, [props.prefix]), slots.default ? vue.createVNode("div", {
9787
+ "class": fieldClass,
9788
+ "onClick": e => emit('click:input', e),
9789
+ "data-no-activator": ""
9790
+ }, [slots.default(), inputNode]) : vue.cloneVNode(inputNode, {
9791
+ class: fieldClass
9792
+ }), props.suffix && vue.createVNode("span", {
9539
9793
  "class": "v-text-field__suffix"
9540
9794
  }, [props.suffix])]);
9541
9795
  }
@@ -9552,146 +9806,11 @@
9552
9806
  } : undefined
9553
9807
  });
9554
9808
  });
9555
- return useForwardRef({}, vInputRef, vFieldRef, inputRef);
9809
+ return forwardRefs({}, vInputRef, vFieldRef, inputRef);
9556
9810
  }
9557
9811
 
9558
9812
  });
9559
9813
 
9560
- // Locales
9561
-
9562
- const LocaleAdapterSymbol = Symbol.for('vuetify:locale-adapter');
9563
- const VuetifyLocaleSymbol = Symbol.for('vuetify:locale');
9564
- function provideLocale(props) {
9565
- const adapter = vue.inject(LocaleAdapterSymbol);
9566
- if (!adapter) throw new Error('[Vuetify] Could not find injected locale adapter');
9567
- return adapter.createScope(props);
9568
- }
9569
- function useLocale() {
9570
- const adapter = vue.inject(LocaleAdapterSymbol);
9571
- if (!adapter) throw new Error('[Vuetify] Could not find injected locale adapter');
9572
- return adapter.getScope();
9573
- }
9574
-
9575
- function isLocaleAdapter(x) {
9576
- return !!x && x.hasOwnProperty('getScope') && x.hasOwnProperty('createScope') && x.hasOwnProperty('createRoot');
9577
- }
9578
-
9579
- function createLocale(app, options) {
9580
- const adapter = isLocaleAdapter(options) ? options : createDefaultLocaleAdapter(options);
9581
- const instance = adapter.createRoot(app);
9582
- app == null ? void 0 : app.provide(RtlSymbol, createRtl(instance, options));
9583
- return adapter;
9584
- }
9585
- const LANG_PREFIX = '$vuetify.';
9586
-
9587
- const replace = (str, params) => {
9588
- return str.replace(/\{(\d+)\}/g, (match, index) => {
9589
- /* istanbul ignore next */
9590
- return String(params[+index]);
9591
- });
9592
- };
9593
-
9594
- const createTranslateFunction = (current, fallback, messages) => {
9595
- return function (key) {
9596
- for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
9597
- params[_key - 1] = arguments[_key];
9598
- }
9599
-
9600
- if (!key.startsWith(LANG_PREFIX)) {
9601
- return replace(key, params);
9602
- }
9603
-
9604
- const shortKey = key.replace(LANG_PREFIX, '');
9605
- const currentLocale = current.value && messages.value[current.value];
9606
- const fallbackLocale = fallback.value && messages.value[fallback.value];
9607
- let str = getObjectValueByPath(currentLocale, shortKey, null);
9608
-
9609
- if (!str) {
9610
- consoleWarn(`Translation key "${key}" not found in "${current.value}", trying fallback locale`);
9611
- str = getObjectValueByPath(fallbackLocale, shortKey, null);
9612
- }
9613
-
9614
- if (!str) {
9615
- consoleError(`Translation key "${key}" not found in fallback`);
9616
- str = key;
9617
- }
9618
-
9619
- if (typeof str !== 'string') {
9620
- consoleError(`Translation key "${key}" has a non-string value`);
9621
- str = key;
9622
- }
9623
-
9624
- return replace(str, params);
9625
- };
9626
- };
9627
-
9628
- function createNumberFunction(current, fallback) {
9629
- return (value, options) => {
9630
- const numberFormat = new Intl.NumberFormat([current.value, fallback.value], options);
9631
- return numberFormat.format(value);
9632
- };
9633
- }
9634
-
9635
- function createDefaultLocaleAdapter(options) {
9636
- const createScope = options => {
9637
- const current = vue.ref(options.current);
9638
- const fallback = vue.ref(options.fallback);
9639
- const messages = vue.ref(options.messages);
9640
- return {
9641
- current,
9642
- fallback,
9643
- messages,
9644
- t: createTranslateFunction(current, fallback, messages),
9645
- n: createNumberFunction(current, fallback)
9646
- };
9647
- };
9648
-
9649
- return {
9650
- createRoot: app => {
9651
- var _options$defaultLocal, _options$fallbackLoca, _options$messages;
9652
-
9653
- const rootScope = createScope({
9654
- current: (_options$defaultLocal = options == null ? void 0 : options.defaultLocale) != null ? _options$defaultLocal : 'en',
9655
- fallback: (_options$fallbackLoca = options == null ? void 0 : options.fallbackLocale) != null ? _options$fallbackLoca : 'en',
9656
- messages: (_options$messages = options == null ? void 0 : options.messages) != null ? _options$messages : {
9657
- en
9658
- }
9659
- });
9660
- if (!app) throw new Error('[Vuetify] Could not find default app instance');
9661
- app.provide(VuetifyLocaleSymbol, rootScope);
9662
- return rootScope;
9663
- },
9664
- getScope: () => {
9665
- const currentScope = vue.inject(VuetifyLocaleSymbol);
9666
- if (!currentScope) throw new Error('[Vuetify] Could not find injected locale instance');
9667
- return currentScope;
9668
- },
9669
- createScope: options => {
9670
- const currentScope = vue.inject(VuetifyLocaleSymbol);
9671
- if (!currentScope) throw new Error('[Vuetify] Could not find injected locale instance');
9672
- const newScope = createScope({
9673
- current: vue.computed(() => {
9674
- var _options$locale;
9675
-
9676
- return (_options$locale = options == null ? void 0 : options.locale) != null ? _options$locale : currentScope.current.value;
9677
- }),
9678
- fallback: vue.computed(() => {
9679
- var _options$locale2;
9680
-
9681
- return (_options$locale2 = options == null ? void 0 : options.locale) != null ? _options$locale2 : currentScope.fallback.value;
9682
- }),
9683
- messages: vue.computed(() => {
9684
- var _options$messages2;
9685
-
9686
- return (_options$messages2 = options == null ? void 0 : options.messages) != null ? _options$messages2 : currentScope.messages.value;
9687
- })
9688
- });
9689
- vue.provide(VuetifyLocaleSymbol, newScope);
9690
- return newScope;
9691
- }
9692
- };
9693
- }
9694
-
9695
9814
  const makeSelectProps = propsFactory({
9696
9815
  chips: Boolean,
9697
9816
  closableChips: Boolean,
@@ -9771,7 +9890,7 @@
9771
9890
 
9772
9891
  function onClickControl() {
9773
9892
  if (props.hideNoData && !items.value.length) return;
9774
- menu.value = true;
9893
+ menu.value = !menu.value;
9775
9894
  }
9776
9895
 
9777
9896
  function onKeydown(e) {
@@ -9818,7 +9937,6 @@
9818
9937
  "appendInnerIcon": props.menuIcon,
9819
9938
  "readonly": true,
9820
9939
  "onClick:clear": onClear,
9821
- "onClick:input": onClickControl,
9822
9940
  "onClick:control": onClickControl,
9823
9941
  "onBlur": () => menu.value = false,
9824
9942
  "onKeydown": onKeydown
@@ -9909,7 +10027,7 @@
9909
10027
  }
9910
10028
  });
9911
10029
  });
9912
- return useForwardRef({
10030
+ return forwardRefs({
9913
10031
  menu,
9914
10032
  select
9915
10033
  }, vTextFieldRef);
@@ -10045,7 +10163,6 @@
10045
10163
  })
10046
10164
  },
10047
10165
  emits: {
10048
- 'click:clear': e => true,
10049
10166
  'update:search': val => true,
10050
10167
  'update:modelValue': val => true,
10051
10168
  'update:menu': val => true
@@ -10282,7 +10399,7 @@
10282
10399
  }
10283
10400
  });
10284
10401
  });
10285
- return useForwardRef({
10402
+ return forwardRefs({
10286
10403
  isFocused,
10287
10404
  isPristine,
10288
10405
  menu,
@@ -11032,7 +11149,10 @@
11032
11149
  flat: Boolean,
11033
11150
  hover: Boolean,
11034
11151
  image: String,
11035
- link: Boolean,
11152
+ link: {
11153
+ type: Boolean,
11154
+ default: undefined
11155
+ },
11036
11156
  prependAvatar: String,
11037
11157
  prependIcon: IconValue,
11038
11158
  ripple: Boolean,
@@ -11093,10 +11213,12 @@
11093
11213
  roundedClasses
11094
11214
  } = useRounded(props);
11095
11215
  const link = useLink(props, attrs);
11216
+ const isLink = vue.computed(() => props.link !== false && link.isLink.value);
11217
+ const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value));
11096
11218
  useRender(() => {
11097
11219
  var _slots$image, _slots$image2, _slots$text, _slots$text2, _slots$default;
11098
11220
 
11099
- const Tag = link.isLink.value ? 'a' : props.tag;
11221
+ const Tag = isLink.value ? 'a' : props.tag;
11100
11222
  const hasTitle = !!(slots.title || props.title);
11101
11223
  const hasSubtitle = !!(slots.subtitle || props.subtitle);
11102
11224
  const hasHeader = hasTitle || hasSubtitle;
@@ -11105,17 +11227,16 @@
11105
11227
  const hasImage = !!(slots.image || props.image);
11106
11228
  const hasCardItem = hasHeader || hasPrepend || hasAppend;
11107
11229
  const hasText = !!(slots.text || props.text);
11108
- const isClickable = !props.disabled && (link.isClickable.value || props.link);
11109
11230
  return vue.withDirectives(vue.createVNode(Tag, {
11110
11231
  "class": ['v-card', {
11111
11232
  'v-card--disabled': props.disabled,
11112
11233
  'v-card--flat': props.flat,
11113
11234
  'v-card--hover': props.hover && !(props.disabled || props.flat),
11114
- 'v-card--link': isClickable
11235
+ 'v-card--link': isClickable.value
11115
11236
  }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value],
11116
11237
  "style": [colorStyles.value, dimensionStyles.value, locationStyles.value],
11117
11238
  "href": link.href.value,
11118
- "onClick": isClickable && link.navigate
11239
+ "onClick": isClickable.value && link.navigate
11119
11240
  }, {
11120
11241
  default: () => [hasImage && vue.createVNode(VDefaultsProvider, {
11121
11242
  "key": "image",
@@ -11155,8 +11276,8 @@
11155
11276
  default: () => [(_slots$text = (_slots$text2 = slots.text) == null ? void 0 : _slots$text2.call(slots)) != null ? _slots$text : props.text]
11156
11277
  }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots), slots.actions && vue.createVNode(VCardActions, null, {
11157
11278
  default: slots.actions
11158
- }), genOverlays(isClickable, 'v-card')]
11159
- }), [[vue.resolveDirective("ripple"), isClickable]]);
11279
+ }), genOverlays(isClickable.value, 'v-card')]
11280
+ }), [[vue.resolveDirective("ripple"), isClickable.value]]);
11160
11281
  });
11161
11282
  return {};
11162
11283
  }
@@ -13244,7 +13365,7 @@
13244
13365
  const shades = Object.freeze({
13245
13366
  black: '#000000',
13246
13367
  white: '#ffffff',
13247
- transparent: 'transparent'
13368
+ transparent: '#ffffff00'
13248
13369
  });
13249
13370
  var colors = Object.freeze({
13250
13371
  red,
@@ -13853,7 +13974,7 @@
13853
13974
  }
13854
13975
  });
13855
13976
  });
13856
- return useForwardRef({
13977
+ return forwardRefs({
13857
13978
  isFocused,
13858
13979
  isPristine,
13859
13980
  menu,
@@ -13915,7 +14036,7 @@
13915
14036
  const after = e.target;
13916
14037
 
13917
14038
  if (before !== after && (_overlay$value = overlay.value) != null && _overlay$value.contentEl && // We're the topmost dialog
13918
- (_overlay$value2 = overlay.value) != null && _overlay$value2.isTop && // It isn't the document or the dialog body
14039
+ (_overlay$value2 = overlay.value) != null && _overlay$value2.globalTop && // It isn't the document or the dialog body
13919
14040
  ![document, overlay.value.contentEl].includes(after) && // It isn't inside the dialog body
13920
14041
  !overlay.value.contentEl.contains(after)) {
13921
14042
  const focusable = [...overlay.value.contentEl.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')].filter(el => !el.hasAttribute('disabled'));
@@ -13977,7 +14098,7 @@
13977
14098
  default: slots.default,
13978
14099
  activator: slots.activator
13979
14100
  }));
13980
- return useForwardRef({}, overlay);
14101
+ return forwardRefs({}, overlay);
13981
14102
  }
13982
14103
 
13983
14104
  });
@@ -14429,7 +14550,7 @@
14429
14550
  } : undefined
14430
14551
  });
14431
14552
  });
14432
- return useForwardRef({}, vInputRef, vFieldRef, inputRef);
14553
+ return forwardRefs({}, vInputRef, vFieldRef, inputRef);
14433
14554
  }
14434
14555
 
14435
14556
  });
@@ -14560,7 +14681,7 @@
14560
14681
  "onSubmit": onSubmit
14561
14682
  }, [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, form)]);
14562
14683
  });
14563
- return useForwardRef(form, formRef);
14684
+ return forwardRefs(form, formRef);
14564
14685
  }
14565
14686
 
14566
14687
  });
@@ -14658,6 +14779,7 @@
14658
14779
  return className.toLowerCase();
14659
14780
  }
14660
14781
 
14782
+ const ALIGN_SELF_VALUES = ['auto', 'start', 'end', 'center', 'baseline', 'stretch'];
14661
14783
  const VCol = defineComponent({
14662
14784
  name: 'VCol',
14663
14785
  props: {
@@ -14679,7 +14801,7 @@
14679
14801
  alignSelf: {
14680
14802
  type: String,
14681
14803
  default: null,
14682
- validator: str => ['auto', 'start', 'end', 'center', 'baseline', 'stretch'].includes(str)
14804
+ validator: str => ALIGN_SELF_VALUES.includes(str)
14683
14805
  },
14684
14806
  ...makeTagProps()
14685
14807
  },
@@ -14728,6 +14850,7 @@
14728
14850
  const breakpoints = ['sm', 'md', 'lg', 'xl', 'xxl']; // no xs
14729
14851
 
14730
14852
  const ALIGNMENT = ['start', 'end', 'center'];
14853
+ const SPACE = ['space-between', 'space-around', 'space-evenly'];
14731
14854
 
14732
14855
  function makeRowProps(prefix, def) {
14733
14856
  return breakpoints.reduce((props, val) => {
@@ -14736,23 +14859,27 @@
14736
14859
  }, {});
14737
14860
  }
14738
14861
 
14739
- const alignValidator = str => [...ALIGNMENT, 'baseline', 'stretch'].includes(str);
14862
+ const ALIGN_VALUES = [...ALIGNMENT, 'baseline', 'stretch'];
14863
+
14864
+ const alignValidator = str => ALIGN_VALUES.includes(str);
14740
14865
 
14741
14866
  const alignProps = makeRowProps('align', () => ({
14742
14867
  type: String,
14743
14868
  default: null,
14744
14869
  validator: alignValidator
14745
14870
  }));
14871
+ const JUSTIFY_VALUES = [...ALIGNMENT, ...SPACE];
14746
14872
 
14747
- const justifyValidator = str => [...ALIGNMENT, 'space-between', 'space-around'].includes(str);
14873
+ const justifyValidator = str => JUSTIFY_VALUES.includes(str);
14748
14874
 
14749
14875
  const justifyProps = makeRowProps('justify', () => ({
14750
14876
  type: String,
14751
14877
  default: null,
14752
14878
  validator: justifyValidator
14753
14879
  }));
14880
+ const ALIGN_CONTENT_VALUES = [...ALIGNMENT, ...SPACE, 'stretch'];
14754
14881
 
14755
- const alignContentValidator = str => [...ALIGNMENT, 'space-between', 'space-around', 'stretch'].includes(str);
14882
+ const alignContentValidator = str => ALIGN_CONTENT_VALUES.includes(str);
14756
14883
 
14757
14884
  const alignContentProps = makeRowProps('alignContent', () => ({
14758
14885
  type: String,
@@ -15145,9 +15272,12 @@
15145
15272
 
15146
15273
  const VMain = defineComponent({
15147
15274
  name: 'VMain',
15148
- props: makeTagProps({
15149
- tag: 'main'
15150
- }),
15275
+ props: {
15276
+ scrollable: Boolean,
15277
+ ...makeTagProps({
15278
+ tag: 'main'
15279
+ })
15280
+ },
15151
15281
 
15152
15282
  setup(props, _ref) {
15153
15283
  let {
@@ -15160,15 +15290,17 @@
15160
15290
  ssrBootStyles
15161
15291
  } = useSsrBoot();
15162
15292
  useRender(() => {
15163
- var _slots$default;
15293
+ var _slots$default, _slots$default2;
15164
15294
 
15165
15295
  return vue.createVNode(props.tag, {
15166
- "class": "v-main",
15296
+ "class": ['v-main', {
15297
+ 'v-main--scrollable': props.scrollable
15298
+ }],
15167
15299
  "style": [mainStyles.value, ssrBootStyles.value]
15168
15300
  }, {
15169
- default: () => [vue.createVNode("div", {
15170
- "class": "v-main__wrap"
15171
- }, [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots)])]
15301
+ default: () => [props.scrollable ? vue.createVNode("div", {
15302
+ "class": "v-main__scroller"
15303
+ }, [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots)]) : (_slots$default2 = slots.default) == null ? void 0 : _slots$default2.call(slots)]
15172
15304
  });
15173
15305
  });
15174
15306
  return {};
@@ -15176,6 +15308,76 @@
15176
15308
 
15177
15309
  });
15178
15310
 
15311
+ function useSticky(_ref) {
15312
+ let {
15313
+ rootEl,
15314
+ isSticky,
15315
+ layoutItemStyles
15316
+ } = _ref;
15317
+ const isStuck = vue.ref(false);
15318
+ const stuckPosition = vue.ref(0);
15319
+ const stickyStyles = vue.computed(() => {
15320
+ const side = typeof isStuck.value === 'boolean' ? 'top' : isStuck.value;
15321
+ return [isSticky.value ? {
15322
+ top: 'auto',
15323
+ bottom: 'auto',
15324
+ height: undefined
15325
+ } : undefined, isStuck.value ? {
15326
+ [side]: convertToUnit(stuckPosition.value)
15327
+ } : {
15328
+ top: layoutItemStyles.value.top
15329
+ }];
15330
+ });
15331
+ vue.onMounted(() => {
15332
+ vue.watch(isSticky, val => {
15333
+ if (val) {
15334
+ window.addEventListener('scroll', onScroll, {
15335
+ passive: true
15336
+ });
15337
+ } else {
15338
+ window.removeEventListener('scroll', onScroll);
15339
+ }
15340
+ }, {
15341
+ immediate: true
15342
+ });
15343
+ });
15344
+ vue.onBeforeUnmount(() => {
15345
+ document.removeEventListener('scroll', onScroll);
15346
+ });
15347
+ let lastScrollTop = 0;
15348
+
15349
+ function onScroll() {
15350
+ var _layoutItemStyles$val;
15351
+
15352
+ const direction = lastScrollTop > window.scrollY ? 'up' : 'down';
15353
+ const rect = rootEl.value.getBoundingClientRect();
15354
+ const layoutTop = parseFloat((_layoutItemStyles$val = layoutItemStyles.value.top) != null ? _layoutItemStyles$val : 0);
15355
+ const top = window.scrollY - Math.max(0, stuckPosition.value - layoutTop);
15356
+ const bottom = rect.height + Math.max(stuckPosition.value, layoutTop) - window.scrollY - window.innerHeight;
15357
+
15358
+ if (rect.height < window.innerHeight - layoutTop) {
15359
+ isStuck.value = 'top';
15360
+ stuckPosition.value = layoutTop;
15361
+ } else if (direction === 'up' && isStuck.value === 'bottom' || direction === 'down' && isStuck.value === 'top') {
15362
+ stuckPosition.value = window.scrollY + rect.top;
15363
+ isStuck.value = true;
15364
+ } else if (direction === 'down' && bottom <= 0) {
15365
+ stuckPosition.value = 0;
15366
+ isStuck.value = 'bottom';
15367
+ } else if (direction === 'up' && top <= 0) {
15368
+ stuckPosition.value = rect.top + top;
15369
+ isStuck.value = 'top';
15370
+ }
15371
+
15372
+ lastScrollTop = window.scrollY;
15373
+ }
15374
+
15375
+ return {
15376
+ isStuck,
15377
+ stickyStyles
15378
+ };
15379
+ }
15380
+
15179
15381
  const HORIZON = 100; // ms
15180
15382
 
15181
15383
  const HISTORY = 20; // number of samples to keep
@@ -15443,6 +15645,7 @@
15443
15645
  throw new Error();
15444
15646
  }
15445
15647
 
15648
+ const locations = ['start', 'end', 'left', 'right', 'bottom'];
15446
15649
  const VNavigationDrawer = defineComponent({
15447
15650
  name: 'VNavigationDrawer',
15448
15651
  props: {
@@ -15459,7 +15662,11 @@
15459
15662
  rail: Boolean,
15460
15663
  railWidth: {
15461
15664
  type: [Number, String],
15462
- default: 72
15665
+ default: 56
15666
+ },
15667
+ scrim: {
15668
+ type: [String, Boolean],
15669
+ default: true
15463
15670
  },
15464
15671
  image: String,
15465
15672
  temporary: Boolean,
@@ -15470,9 +15677,10 @@
15470
15677
  },
15471
15678
  location: {
15472
15679
  type: String,
15473
- default: 'left',
15474
- validator: value => ['left', 'right', 'bottom'].includes(value)
15680
+ default: 'start',
15681
+ validator: value => locations.includes(value)
15475
15682
  },
15683
+ sticky: Boolean,
15476
15684
  ...makeBorderProps(),
15477
15685
  ...makeElevationProps(),
15478
15686
  ...makeLayoutItemProps(),
@@ -15491,6 +15699,9 @@
15491
15699
  attrs,
15492
15700
  slots
15493
15701
  } = _ref;
15702
+ const {
15703
+ isRtl
15704
+ } = useRtl();
15494
15705
  const {
15495
15706
  themeClasses
15496
15707
  } = provideTheme(props);
@@ -15512,14 +15723,19 @@
15512
15723
  } = useRounded(props);
15513
15724
  const router = useRouter();
15514
15725
  const isActive = useProxiedModel(props, 'modelValue', null, v => !!v);
15515
- const isHovering = vue.ref(false);
15516
15726
  const {
15517
15727
  ssrBootStyles
15518
15728
  } = useSsrBoot();
15729
+ const rootEl = vue.ref();
15730
+ const isHovering = vue.ref(false);
15519
15731
  const width = vue.computed(() => {
15520
15732
  return props.rail && props.expandOnHover && isHovering.value ? Number(props.width) : Number(props.rail ? props.railWidth : props.width);
15521
15733
  });
15734
+ const location = vue.computed(() => {
15735
+ return toPhysical(props.location, isRtl.value);
15736
+ });
15522
15737
  const isTemporary = vue.computed(() => !props.permanent && (mobile.value || props.temporary));
15738
+ const isSticky = vue.computed(() => props.sticky && !isTemporary.value && location.value !== 'bottom');
15523
15739
 
15524
15740
  if (!props.disableResizeWatcher) {
15525
15741
  vue.watch(isTemporary, val => !props.permanent && (isActive.value = !val));
@@ -15536,7 +15752,6 @@
15536
15752
  if (props.modelValue != null || isTemporary.value) return;
15537
15753
  isActive.value = props.permanent || !mobile.value;
15538
15754
  });
15539
- const rootEl = vue.ref();
15540
15755
  const {
15541
15756
  isDragging,
15542
15757
  dragProgress,
@@ -15546,7 +15761,7 @@
15546
15761
  isTemporary,
15547
15762
  width,
15548
15763
  touchless: vue.toRef(props, 'touchless'),
15549
- position: vue.toRef(props, 'location')
15764
+ position: location
15550
15765
  });
15551
15766
  const layoutSize = vue.computed(() => {
15552
15767
  const size = isTemporary.value ? 0 : props.rail && props.expandOnHover ? Number(props.railWidth) : width.value;
@@ -15559,13 +15774,25 @@
15559
15774
  } = useLayoutItem({
15560
15775
  id: props.name,
15561
15776
  order: vue.computed(() => parseInt(props.order, 10)),
15562
- position: vue.toRef(props, 'location'),
15777
+ position: location,
15563
15778
  layoutSize,
15564
15779
  elementSize: width,
15565
15780
  active: vue.computed(() => isActive.value || isDragging.value),
15566
15781
  disableTransitions: vue.computed(() => isDragging.value),
15567
- absolute: vue.toRef(props, 'absolute')
15782
+ absolute: vue.computed(() => // eslint-disable-next-line @typescript-eslint/no-use-before-define
15783
+ props.absolute || isSticky.value && typeof isStuck.value !== 'string')
15784
+ });
15785
+ const {
15786
+ isStuck,
15787
+ stickyStyles
15788
+ } = useSticky({
15789
+ rootEl,
15790
+ isSticky,
15791
+ layoutItemStyles
15568
15792
  });
15793
+ const scrimColor = useBackgroundColor(vue.computed(() => {
15794
+ return typeof props.scrim === 'string' ? props.scrim : null;
15795
+ }));
15569
15796
  const scrimStyles = vue.computed(() => ({ ...(isDragging.value ? {
15570
15797
  opacity: dragProgress.value * 0.2,
15571
15798
  transition: 'none'
@@ -15578,6 +15805,11 @@
15578
15805
  } : undefined),
15579
15806
  ...layoutItemScrimStyles.value
15580
15807
  }));
15808
+ provideDefaults({
15809
+ VList: {
15810
+ bgColor: 'transparent'
15811
+ }
15812
+ });
15581
15813
  useRender(() => {
15582
15814
  var _slots$image, _slots$prepend, _slots$default, _slots$append;
15583
15815
 
@@ -15586,18 +15818,16 @@
15586
15818
  "ref": rootEl,
15587
15819
  "onMouseenter": () => isHovering.value = true,
15588
15820
  "onMouseleave": () => isHovering.value = false,
15589
- "class": ['v-navigation-drawer', {
15590
- 'v-navigation-drawer--bottom': props.location === 'bottom',
15591
- 'v-navigation-drawer--end': props.location === 'right',
15821
+ "class": ['v-navigation-drawer', `v-navigation-drawer--${location.value}`, {
15592
15822
  'v-navigation-drawer--expand-on-hover': props.expandOnHover,
15593
15823
  'v-navigation-drawer--floating': props.floating,
15594
15824
  'v-navigation-drawer--is-hovering': isHovering.value,
15595
15825
  'v-navigation-drawer--rail': props.rail,
15596
- 'v-navigation-drawer--start': props.location === 'left',
15597
15826
  'v-navigation-drawer--temporary': isTemporary.value,
15598
- 'v-navigation-drawer--active': isActive.value
15827
+ 'v-navigation-drawer--active': isActive.value,
15828
+ 'v-navigation-drawer--sticky': isSticky.value
15599
15829
  }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value],
15600
- "style": [backgroundColorStyles.value, layoutItemStyles.value, dragStyles.value, ssrBootStyles.value]
15830
+ "style": [backgroundColorStyles.value, layoutItemStyles.value, dragStyles.value, ssrBootStyles.value, stickyStyles.value]
15601
15831
  }, attrs), {
15602
15832
  default: () => [hasImage && vue.createVNode("div", {
15603
15833
  "key": "image",
@@ -15617,14 +15847,16 @@
15617
15847
  }), vue.createVNode(vue.Transition, {
15618
15848
  "name": "fade-transition"
15619
15849
  }, {
15620
- default: () => [isTemporary.value && (isDragging.value || isActive.value) && vue.createVNode("div", {
15621
- "class": "v-navigation-drawer__scrim",
15622
- "style": scrimStyles.value,
15850
+ default: () => [isTemporary.value && (isDragging.value || isActive.value) && !!props.scrim && vue.createVNode("div", {
15851
+ "class": ['v-navigation-drawer__scrim', scrimColor.backgroundColorClasses.value],
15852
+ "style": [scrimStyles.value, scrimColor.backgroundColorStyles.value],
15623
15853
  "onClick": () => isActive.value = false
15624
15854
  }, null)]
15625
15855
  })]);
15626
15856
  });
15627
- return {};
15857
+ return {
15858
+ isStuck
15859
+ };
15628
15860
  }
15629
15861
 
15630
15862
  });
@@ -15805,7 +16037,7 @@
15805
16037
  return length.value;
15806
16038
  });
15807
16039
  const range = vue.computed(() => {
15808
- if (length.value <= 0) return [];
16040
+ if (length.value <= 0 || isNaN(length.value) || length.value > Number.MAX_SAFE_INTEGER) return [];
15809
16041
  if (totalVisible.value <= 2) return [page.value];
15810
16042
 
15811
16043
  if (length.value <= totalVisible.value) {
@@ -16069,27 +16301,20 @@
16069
16301
 
16070
16302
  const VRadio = defineComponent({
16071
16303
  name: 'VRadio',
16072
- props: {
16073
- falseIcon: {
16074
- type: IconValue,
16075
- default: '$radioOff'
16076
- },
16077
- trueIcon: {
16078
- type: IconValue,
16079
- default: '$radioOn'
16080
- }
16304
+ props: { ...makeSelectionControlProps({
16305
+ falseIcon: '$radioOff',
16306
+ trueIcon: '$radioOn'
16307
+ })
16081
16308
  },
16082
16309
 
16083
16310
  setup(props, _ref) {
16084
16311
  let {
16085
16312
  slots
16086
16313
  } = _ref;
16087
- useRender(() => vue.createVNode(VSelectionControl, {
16314
+ useRender(() => vue.createVNode(VSelectionControl, vue.mergeProps(props, {
16088
16315
  "class": "v-radio",
16089
- "trueIcon": props.trueIcon,
16090
- "falseIcon": props.falseIcon,
16091
16316
  "type": "radio"
16092
- }, slots));
16317
+ }), slots));
16093
16318
  return {};
16094
16319
  }
16095
16320
 
@@ -16118,6 +16343,9 @@
16118
16343
  default: 'radio'
16119
16344
  }
16120
16345
  },
16346
+ emits: {
16347
+ 'update:modelValue': val => true
16348
+ },
16121
16349
 
16122
16350
  setup(props, _ref) {
16123
16351
  let {
@@ -16126,6 +16354,13 @@
16126
16354
  } = _ref;
16127
16355
  const uid = getUid();
16128
16356
  const id = vue.computed(() => props.id || `radio-group-${uid}`);
16357
+ const model = useProxiedModel(props, 'modelValue');
16358
+ provideDefaults({
16359
+ VRadio: {
16360
+ color: vue.toRef(props, 'color'),
16361
+ density: vue.toRef(props, 'density')
16362
+ }
16363
+ });
16129
16364
  useRender(() => {
16130
16365
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
16131
16366
  const [inputProps, _1] = filterInputProps(props);
@@ -16139,6 +16374,8 @@
16139
16374
  return vue.createVNode(VInput, vue.mergeProps({
16140
16375
  "class": "v-radio-group"
16141
16376
  }, inputAttrs, inputProps, {
16377
+ "modelValue": model.value,
16378
+ "onUpdate:modelValue": $event => model.value = $event,
16142
16379
  "id": id.value
16143
16380
  }), { ...slots,
16144
16381
  default: _ref2 => {
@@ -16158,7 +16395,10 @@
16158
16395
  "type": props.type,
16159
16396
  "disabled": isDisabled.value,
16160
16397
  "readonly": isReadonly.value
16161
- }, controlAttrs), slots)]);
16398
+ }, controlAttrs, {
16399
+ "modelValue": model.value,
16400
+ "onUpdate:modelValue": $event => model.value = $event
16401
+ }), slots)]);
16162
16402
  }
16163
16403
  });
16164
16404
  });
@@ -17035,7 +17275,6 @@
17035
17275
  const VSnackbar = defineComponent({
17036
17276
  name: 'VSnackbar',
17037
17277
  props: {
17038
- app: Boolean,
17039
17278
  contentClass: {
17040
17279
  type: String,
17041
17280
  default: ''
@@ -17117,6 +17356,7 @@
17117
17356
  "contentProps": {
17118
17357
  style: locationStyles.value
17119
17358
  },
17359
+ "contentClass": props.contentClass,
17120
17360
  "persistent": true,
17121
17361
  "noClickAnimation": true,
17122
17362
  "scrim": false,
@@ -17128,7 +17368,7 @@
17128
17368
  "onPointerenter": onPointerenter,
17129
17369
  "onPointerleave": startTimeout
17130
17370
  }, [genOverlays(false, 'v-snackbar'), slots.default && vue.createVNode("div", {
17131
- "class": ['v-snackbar__content', props.contentClass],
17371
+ "class": "v-snackbar__content",
17132
17372
  "role": "status",
17133
17373
  "aria-live": "polite"
17134
17374
  }, [slots.default()]), slots.actions && vue.createVNode(VDefaultsProvider, {
@@ -17145,7 +17385,7 @@
17145
17385
  })])],
17146
17386
  activator: slots.activator
17147
17387
  }));
17148
- return useForwardRef({}, overlay);
17388
+ return forwardRefs({}, overlay);
17149
17389
  }
17150
17390
 
17151
17391
  });
@@ -17631,7 +17871,7 @@
17631
17871
  const vInputRef = vue.ref();
17632
17872
  const vFieldRef = vue.ref();
17633
17873
  const isFocused = vue.ref(false);
17634
- const controlHeight = vue.ref('auto');
17874
+ const controlHeight = vue.ref('');
17635
17875
  const textareaRef = vue.ref();
17636
17876
  const isActive = vue.computed(() => isFocused.value || props.persistentPlaceholder);
17637
17877
  const messages = vue.computed(() => {
@@ -17671,14 +17911,15 @@
17671
17911
  function calculateInputHeight() {
17672
17912
  if (!props.autoGrow) return;
17673
17913
  vue.nextTick(() => {
17674
- if (!sizerRef.value) return;
17914
+ if (!sizerRef.value || !vFieldRef.value) return;
17675
17915
  const style = getComputedStyle(sizerRef.value);
17676
- const padding = parseFloat(style.getPropertyValue('--v-field-padding-top')) + parseFloat(style.getPropertyValue('--v-field-padding-bottom'));
17916
+ const fieldStyle = getComputedStyle(vFieldRef.value.$el);
17917
+ const padding = parseFloat(style.getPropertyValue('--v-field-padding-top')) + parseFloat(style.getPropertyValue('--v-input-padding-top')) + parseFloat(style.getPropertyValue('--v-field-padding-bottom'));
17677
17918
  const height = sizerRef.value.scrollHeight;
17678
17919
  const lineHeight = parseFloat(style.lineHeight);
17679
- const minHeight = parseFloat(props.rows) * lineHeight + padding;
17920
+ const minHeight = Math.max(parseFloat(props.rows) * lineHeight + padding, parseFloat(fieldStyle.getPropertyValue('--v-input-control-height')));
17680
17921
  const maxHeight = parseFloat(props.maxRows) * lineHeight + padding || Infinity;
17681
- controlHeight.value = convertToUnit(Math.min(maxHeight, Math.max(minHeight, height != null ? height : 0)));
17922
+ controlHeight.value = convertToUnit(clamp(height != null ? height : 0, minHeight, maxHeight));
17682
17923
  });
17683
17924
  }
17684
17925
 
@@ -17686,6 +17927,7 @@
17686
17927
  vue.watch(model, calculateInputHeight);
17687
17928
  vue.watch(() => props.rows, calculateInputHeight);
17688
17929
  vue.watch(() => props.maxRows, calculateInputHeight);
17930
+ vue.watch(() => props.density, calculateInputHeight);
17689
17931
  let observer;
17690
17932
  vue.watch(sizerRef, val => {
17691
17933
  if (val) {
@@ -17712,11 +17954,14 @@
17712
17954
  }] = filterInputProps(props);
17713
17955
  const [fieldProps] = filterFieldProps(props);
17714
17956
  return vue.createVNode(VInput, vue.mergeProps({
17957
+ "ref": vInputRef,
17715
17958
  "modelValue": model.value,
17716
17959
  "onUpdate:modelValue": $event => model.value = $event,
17717
- "class": ['v-textarea', {
17960
+ "class": ['v-textarea v-text-field', {
17718
17961
  'v-textarea--prefixed': props.prefix,
17719
17962
  'v-textarea--suffixed': props.suffix,
17963
+ 'v-text-field--prefixed': props.prefix,
17964
+ 'v-text-field--suffixed': props.suffix,
17720
17965
  'v-textarea--auto-grow': props.autoGrow,
17721
17966
  'v-textarea--no-resize': props.noResize || props.autoGrow
17722
17967
  }]
@@ -17731,8 +17976,9 @@
17731
17976
  isValid
17732
17977
  } = _ref2;
17733
17978
  return vue.createVNode(VField, vue.mergeProps({
17979
+ "ref": vFieldRef,
17734
17980
  "style": {
17735
- '--v-input-control-height': controlHeight.value
17981
+ '--v-textarea-control-height': controlHeight.value
17736
17982
  },
17737
17983
  "onClick:control": onControlClick,
17738
17984
  "onClick:clear": onClear,
@@ -17792,7 +18038,7 @@
17792
18038
  } : undefined
17793
18039
  });
17794
18040
  });
17795
- return useForwardRef({}, vInputRef, vFieldRef, textareaRef);
18041
+ return forwardRefs({}, vInputRef, vFieldRef, textareaRef);
17796
18042
  }
17797
18043
 
17798
18044
  });
@@ -17876,7 +18122,8 @@
17876
18122
  lineColor: vue.toRef(props, 'lineColor')
17877
18123
  },
17878
18124
  VTimelineItem: {
17879
- density: vue.toRef(props, 'density')
18125
+ density: vue.toRef(props, 'density'),
18126
+ lineInset: vue.toRef(props, 'lineInset')
17880
18127
  }
17881
18128
  });
17882
18129
  const sideClasses = vue.computed(() => {
@@ -17901,12 +18148,11 @@
17901
18148
  }
17902
18149
  });
17903
18150
  useRender(() => vue.createVNode(props.tag, {
17904
- "class": ['v-timeline', `v-timeline--${props.direction}`, `v-timeline--align-${props.align}`, !props.lineInset && truncateClasses.value, {
18151
+ "class": ['v-timeline', `v-timeline--${props.direction}`, `v-timeline--align-${props.align}`, truncateClasses.value, {
17905
18152
  'v-timeline--inset-line': !!props.lineInset
17906
18153
  }, themeClasses.value, densityClasses.value, sideClasses.value],
17907
18154
  "style": {
17908
- '--v-timeline-line-thickness': convertToUnit(props.lineThickness),
17909
- '--v-timeline-line-inset': convertToUnit(props.lineInset)
18155
+ '--v-timeline-line-thickness': convertToUnit(props.lineThickness)
17910
18156
  }
17911
18157
  }, slots));
17912
18158
  return {};
@@ -17964,7 +18210,10 @@
17964
18210
  "class": ['v-timeline-divider', {
17965
18211
  'v-timeline-divider--fill-dot': props.fillDot
17966
18212
  }]
17967
- }, [!props.hideDot && vue.createVNode("div", {
18213
+ }, [vue.createVNode("div", {
18214
+ "class": ['v-timeline-divider__before', lineColorClasses.value],
18215
+ "style": lineColorStyles.value
18216
+ }, null), !props.hideDot && vue.createVNode("div", {
17968
18217
  "key": "dot",
17969
18218
  "class": ['v-timeline-divider__dot', elevationClasses.value, roundedClasses.value, sizeClasses.value],
17970
18219
  "style": sizeStyles.value
@@ -17972,7 +18221,7 @@
17972
18221
  "class": ['v-timeline-divider__inner-dot', backgroundColorClasses.value, roundedClasses.value],
17973
18222
  "style": backgroundColorStyles.value
17974
18223
  }, [(_slots$default = (_slots$default2 = slots.default) == null ? void 0 : _slots$default2.call(slots)) != null ? _slots$default : props.icon ? vue.createVNode(VIcon, null, null) : undefined])]), vue.createVNode("div", {
17975
- "class": ['v-timeline-divider__line', lineColorClasses.value],
18224
+ "class": ['v-timeline-divider__after', lineColorClasses.value],
17976
18225
  "style": lineColorStyles.value
17977
18226
  }, null)]);
17978
18227
  });
@@ -17994,6 +18243,7 @@
17994
18243
  },
17995
18244
  icon: IconValue,
17996
18245
  iconColor: String,
18246
+ lineInset: [Number, String],
17997
18247
  ...makeRoundedProps(),
17998
18248
  ...makeElevationProps(),
17999
18249
  ...makeSizeProps(),
@@ -18026,7 +18276,8 @@
18026
18276
  'v-timeline-item--fill-dot': props.fillDot
18027
18277
  }],
18028
18278
  "style": {
18029
- '--v-timeline-dot-size': convertToUnit(dotSize.value)
18279
+ '--v-timeline-dot-size': convertToUnit(dotSize.value),
18280
+ '--v-timeline-line-inset': props.lineInset ? `calc(var(--v-timeline-dot-size) / 2 + ${convertToUnit(props.lineInset)})` : convertToUnit(0)
18030
18281
  }
18031
18282
  }, [vue.createVNode("div", {
18032
18283
  "class": "v-timeline-item__body",
@@ -18133,7 +18384,7 @@
18133
18384
  return (_slots$default = (_slots$default2 = slots.default) == null ? void 0 : _slots$default2.call(slots, ...args)) != null ? _slots$default : props.text;
18134
18385
  }
18135
18386
  }));
18136
- return useForwardRef({}, overlay);
18387
+ return forwardRefs({}, overlay);
18137
18388
  }
18138
18389
 
18139
18390
  });
@@ -18539,7 +18790,7 @@
18539
18790
  ...options
18540
18791
  });
18541
18792
  };
18542
- const version = "3.0.0-beta.6";
18793
+ const version = "3.0.0-beta.9";
18543
18794
 
18544
18795
  exports.components = components;
18545
18796
  exports.createVuetify = createVuetify;
@@ -18547,6 +18798,7 @@
18547
18798
  exports.provideRtl = provideRtl;
18548
18799
  exports.useDisplay = useDisplay;
18549
18800
  exports.useLayout = useLayout;
18801
+ exports.useLocale = useLocale;
18550
18802
  exports.useRtl = useRtl;
18551
18803
  exports.useTheme = useTheme;
18552
18804
  exports.version = version;