vuetify 3.3.15 → 3.4.0-alpha.1

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 (122) hide show
  1. package/dist/json/attributes.json +111 -11
  2. package/dist/json/importMap.json +4 -4
  3. package/dist/json/tags.json +25 -0
  4. package/dist/json/web-types.json +263 -18
  5. package/dist/vuetify-labs.css +1558 -518
  6. package/dist/vuetify-labs.d.ts +499 -179
  7. package/dist/vuetify-labs.esm.js +264 -73
  8. package/dist/vuetify-labs.esm.js.map +1 -1
  9. package/dist/vuetify-labs.js +263 -72
  10. package/dist/vuetify-labs.min.css +2 -2
  11. package/dist/vuetify.css +1080 -40
  12. package/dist/vuetify.d.ts +484 -170
  13. package/dist/vuetify.esm.js +264 -73
  14. package/dist/vuetify.esm.js.map +1 -1
  15. package/dist/vuetify.js +263 -72
  16. package/dist/vuetify.js.map +1 -1
  17. package/dist/vuetify.min.css +2 -2
  18. package/dist/vuetify.min.js +914 -895
  19. package/dist/vuetify.min.js.map +1 -1
  20. package/lib/components/VAutocomplete/index.d.mts +20 -14
  21. package/lib/components/VAvatar/VAvatar.mjs +2 -1
  22. package/lib/components/VAvatar/VAvatar.mjs.map +1 -1
  23. package/lib/components/VAvatar/index.d.mts +6 -0
  24. package/lib/components/VBanner/VBanner.mjs +5 -3
  25. package/lib/components/VBanner/VBanner.mjs.map +1 -1
  26. package/lib/components/VBanner/index.d.mts +10 -0
  27. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs +9 -4
  28. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs.map +1 -1
  29. package/lib/components/VBreadcrumbs/index.d.mts +28 -2
  30. package/lib/components/VCarousel/index.d.mts +26 -0
  31. package/lib/components/VCheckbox/index.d.mts +12 -0
  32. package/lib/components/VColorPicker/VColorPickerPreview.css +5 -0
  33. package/lib/components/VColorPicker/VColorPickerPreview.mjs +28 -2
  34. package/lib/components/VColorPicker/VColorPickerPreview.mjs.map +1 -1
  35. package/lib/components/VColorPicker/VColorPickerPreview.sass +4 -0
  36. package/lib/components/VColorPicker/_variables.scss +1 -0
  37. package/lib/components/VCombobox/index.d.mts +20 -14
  38. package/lib/components/VDialog/index.d.mts +41 -20
  39. package/lib/components/VField/index.d.mts +4 -4
  40. package/lib/components/VFileInput/index.d.mts +4 -4
  41. package/lib/components/VImg/VImg.mjs +13 -1
  42. package/lib/components/VImg/VImg.mjs.map +1 -1
  43. package/lib/components/VImg/index.d.mts +26 -0
  44. package/lib/components/VList/index.d.mts +12 -12
  45. package/lib/components/VMenu/index.d.mts +41 -20
  46. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +5 -3
  47. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  48. package/lib/components/VNavigationDrawer/index.d.mts +10 -0
  49. package/lib/components/VOverlay/VOverlay.mjs +9 -4
  50. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  51. package/lib/components/VOverlay/index.d.mts +17 -8
  52. package/lib/components/VOverlay/locationStrategies.mjs +9 -9
  53. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  54. package/lib/components/VOverlay/scrollStrategies.mjs +3 -3
  55. package/lib/components/VOverlay/scrollStrategies.mjs.map +1 -1
  56. package/lib/components/VOverlay/useActivator.mjs +50 -21
  57. package/lib/components/VOverlay/useActivator.mjs.map +1 -1
  58. package/lib/components/VRadio/index.d.mts +6 -0
  59. package/lib/components/VRangeSlider/VRangeSlider.mjs +4 -2
  60. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  61. package/lib/components/VRangeSlider/index.d.mts +14 -0
  62. package/lib/components/VSelect/index.d.mts +20 -14
  63. package/lib/components/VSelectionControl/VSelectionControl.mjs +3 -1
  64. package/lib/components/VSelectionControl/VSelectionControl.mjs.map +1 -1
  65. package/lib/components/VSelectionControl/index.d.mts +6 -0
  66. package/lib/components/VSlideGroup/VSlideGroup.mjs +5 -3
  67. package/lib/components/VSlideGroup/VSlideGroup.mjs.map +1 -1
  68. package/lib/components/VSlideGroup/index.d.mts +10 -0
  69. package/lib/components/VSlider/VSlider.mjs +2 -1
  70. package/lib/components/VSlider/VSlider.mjs.map +1 -1
  71. package/lib/components/VSlider/index.d.mts +14 -0
  72. package/lib/components/VSlider/slider.mjs +5 -1
  73. package/lib/components/VSlider/slider.mjs.map +1 -1
  74. package/lib/components/VSnackbar/VSnackbar.css +9 -0
  75. package/lib/components/VSnackbar/VSnackbar.mjs +65 -6
  76. package/lib/components/VSnackbar/VSnackbar.mjs.map +1 -1
  77. package/lib/components/VSnackbar/VSnackbar.sass +9 -0
  78. package/lib/components/VSnackbar/index.d.mts +52 -25
  79. package/lib/components/VSwitch/index.d.mts +6 -0
  80. package/lib/components/VTabs/index.d.mts +10 -0
  81. package/lib/components/VTextField/index.d.mts +16 -16
  82. package/lib/components/VTextarea/index.d.mts +4 -4
  83. package/lib/components/VTooltip/index.d.mts +41 -20
  84. package/lib/components/index.d.mts +455 -168
  85. package/lib/components/transitions/dialog-transition.mjs +4 -3
  86. package/lib/components/transitions/dialog-transition.mjs.map +1 -1
  87. package/lib/components/transitions/index.d.mts +6 -6
  88. package/lib/composables/directiveComponent.mjs +69 -0
  89. package/lib/composables/directiveComponent.mjs.map +1 -0
  90. package/lib/composables/display.mjs +23 -3
  91. package/lib/composables/display.mjs.map +1 -1
  92. package/lib/composables/resizeObserver.mjs.map +1 -1
  93. package/lib/composables/theme.mjs +7 -7
  94. package/lib/composables/theme.mjs.map +1 -1
  95. package/lib/entry-bundler.mjs +1 -1
  96. package/lib/entry-bundler.mjs.map +1 -1
  97. package/lib/framework.mjs +1 -1
  98. package/lib/framework.mjs.map +1 -1
  99. package/lib/iconsets/fa.mjs +2 -1
  100. package/lib/iconsets/fa.mjs.map +1 -1
  101. package/lib/iconsets/fa4.mjs +2 -1
  102. package/lib/iconsets/fa4.mjs.map +1 -1
  103. package/lib/iconsets/md.mjs +2 -1
  104. package/lib/iconsets/md.mjs.map +1 -1
  105. package/lib/iconsets/mdi-svg.mjs +2 -1
  106. package/lib/iconsets/mdi-svg.mjs.map +1 -1
  107. package/lib/iconsets/mdi.mjs +2 -1
  108. package/lib/iconsets/mdi.mjs.map +1 -1
  109. package/lib/index.d.mts +33 -2
  110. package/lib/labs/VBottomSheet/index.d.mts +14 -8
  111. package/lib/labs/VDateInput/index.d.mts +4 -4
  112. package/lib/labs/VOtpInput/index.d.mts +4 -4
  113. package/lib/labs/components.d.mts +18 -12
  114. package/lib/styles/main.css +1026 -0
  115. package/lib/styles/settings/_utilities.scss +20 -0
  116. package/lib/util/box.mjs +12 -0
  117. package/lib/util/box.mjs.map +1 -1
  118. package/lib/util/globals.mjs +1 -0
  119. package/lib/util/globals.mjs.map +1 -1
  120. package/lib/util/helpers.mjs +9 -1
  121. package/lib/util/helpers.mjs.map +1 -1
  122. package/package.json +2 -2
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.3.15
2
+ * Vuetify v3.4.0-alpha.1
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -78,6 +78,7 @@
78
78
  const IN_BROWSER = typeof window !== 'undefined';
79
79
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
80
80
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
81
+ const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
81
82
 
82
83
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
83
84
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
@@ -161,7 +162,15 @@
161
162
  return obj !== null && typeof obj === 'object' && !Array.isArray(obj);
162
163
  }
163
164
  function refElement(obj) {
164
- return obj && '$el' in obj ? obj.$el : obj;
165
+ if (obj && '$el' in obj) {
166
+ const el = obj.$el;
167
+ if (el?.nodeType === Node.TEXT_NODE) {
168
+ // Multi-root component, use the first element
169
+ return el.nextElementSibling;
170
+ }
171
+ return el;
172
+ }
173
+ return obj;
165
174
  }
166
175
 
167
176
  // KeyboardEvent.keyCode aliases
@@ -552,6 +561,18 @@
552
561
  }
553
562
  };
554
563
  }
564
+ function getTargetBox(target) {
565
+ if (Array.isArray(target)) {
566
+ return new Box({
567
+ x: target[0],
568
+ y: target[1],
569
+ width: 0,
570
+ height: 0
571
+ });
572
+ } else {
573
+ return target.getBoundingClientRect();
574
+ }
575
+ }
555
576
 
556
577
  // Utilities
557
578
 
@@ -2110,9 +2131,9 @@
2110
2131
  'surface-bright': '#FFFFFF',
2111
2132
  'surface-variant': '#424242',
2112
2133
  'on-surface-variant': '#EEEEEE',
2113
- primary: '#6200EE',
2114
- 'primary-darken-1': '#3700B3',
2115
- secondary: '#03DAC6',
2134
+ primary: '#1867C0',
2135
+ 'primary-darken-1': '#1F5592',
2136
+ secondary: '#48A9A6',
2116
2137
  'secondary-darken-1': '#018786',
2117
2138
  error: '#B00020',
2118
2139
  info: '#2196F3',
@@ -2146,10 +2167,10 @@
2146
2167
  'surface-bright': '#ccbfd6',
2147
2168
  'surface-variant': '#a3a3a3',
2148
2169
  'on-surface-variant': '#424242',
2149
- primary: '#BB86FC',
2150
- 'primary-darken-1': '#3700B3',
2151
- secondary: '#03DAC5',
2152
- 'secondary-darken-1': '#03DAC5',
2170
+ primary: '#2196F3',
2171
+ 'primary-darken-1': '#277CC1',
2172
+ secondary: '#54B6B2',
2173
+ 'secondary-darken-1': '#48A9A6',
2153
2174
  error: '#CF6679',
2154
2175
  info: '#2196F3',
2155
2176
  success: '#4CAF50',
@@ -2634,7 +2655,7 @@
2634
2655
  // Types
2635
2656
 
2636
2657
  const makeVDialogTransitionProps = propsFactory({
2637
- target: Object
2658
+ target: [Object, Array]
2638
2659
  }, 'v-dialog-transition');
2639
2660
  const VDialogTransition = genericComponent()({
2640
2661
  name: 'VDialogTransition',
@@ -2736,7 +2757,7 @@
2736
2757
  return els && [...els];
2737
2758
  }
2738
2759
  function getDimensions(target, el) {
2739
- const targetBox = target.getBoundingClientRect();
2760
+ const targetBox = getTargetBox(target);
2740
2761
  const elBox = nullifyTransforms(el);
2741
2762
  const [originX, originY] = getComputedStyle(el).transformOrigin.split(' ').map(v => parseFloat(v));
2742
2763
  const [anchorSide, anchorOffset] = getComputedStyle(el).getPropertyValue('--v-overlay-anchor-origin').split(' ');
@@ -2982,6 +3003,10 @@
2982
3003
  const makeVImgProps = propsFactory({
2983
3004
  alt: String,
2984
3005
  cover: Boolean,
3006
+ draggable: {
3007
+ type: [Boolean, String],
3008
+ default: undefined
3009
+ },
2985
3010
  eager: Boolean,
2986
3011
  gradient: String,
2987
3012
  lazySrc: String,
@@ -3000,6 +3025,8 @@
3000
3025
  type: [String, Object],
3001
3026
  default: ''
3002
3027
  },
3028
+ crossorigin: String,
3029
+ referrerpolicy: String,
3003
3030
  srcset: String,
3004
3031
  ...makeVResponsiveProps(),
3005
3032
  ...makeComponentProps(),
@@ -3124,6 +3151,9 @@
3124
3151
  "src": normalisedSrc.value.src,
3125
3152
  "srcset": normalisedSrc.value.srcset,
3126
3153
  "alt": props.alt,
3154
+ "crossorigin": props.crossorigin,
3155
+ "referrerpolicy": props.referrerpolicy,
3156
+ "draggable": props.draggable,
3127
3157
  "sizes": props.sizes,
3128
3158
  "ref": image,
3129
3159
  "onLoad": onLoad,
@@ -3145,7 +3175,10 @@
3145
3175
  default: () => [normalisedSrc.value.lazySrc && state.value !== 'loaded' && vue.createVNode("img", {
3146
3176
  "class": ['v-img__img', 'v-img__img--preload', containClasses.value],
3147
3177
  "src": normalisedSrc.value.lazySrc,
3148
- "alt": props.alt
3178
+ "alt": props.alt,
3179
+ "crossorigin": props.crossorigin,
3180
+ "referrerpolicy": props.referrerpolicy,
3181
+ "draggable": props.draggable
3149
3182
  }, null)]
3150
3183
  });
3151
3184
  const __placeholder = () => {
@@ -4169,7 +4202,8 @@
4169
4202
  file: 'mdi-paperclip',
4170
4203
  plus: 'mdi-plus',
4171
4204
  minus: 'mdi-minus',
4172
- calendar: 'mdi-calendar'
4205
+ calendar: 'mdi-calendar',
4206
+ eyeDropper: 'mdi-eyedropper'
4173
4207
  };
4174
4208
  const mdi = {
4175
4209
  // Not using mergeProps here, functional components merge props by default (?)
@@ -5759,6 +5793,7 @@
5759
5793
 
5760
5794
  const makeVSelectionControlProps = propsFactory({
5761
5795
  label: String,
5796
+ baseColor: String,
5762
5797
  trueValue: null,
5763
5798
  falseValue: null,
5764
5799
  value: null,
@@ -5797,7 +5832,8 @@
5797
5832
  textColorClasses,
5798
5833
  textColorStyles
5799
5834
  } = useTextColor(vue.computed(() => {
5800
- return model.value && !props.error && !props.disabled ? props.color : undefined;
5835
+ if (props.error || props.disabled) return undefined;
5836
+ return model.value ? props.color : props.baseColor;
5801
5837
  }));
5802
5838
  const {
5803
5839
  backgroundColorClasses,
@@ -6599,6 +6635,7 @@
6599
6635
  end: Boolean,
6600
6636
  icon: IconValue,
6601
6637
  image: String,
6638
+ text: String,
6602
6639
  ...makeComponentProps(),
6603
6640
  ...makeDensityProps(),
6604
6641
  ...makeRoundedProps(),
@@ -6649,7 +6686,7 @@
6649
6686
  }, null) : props.icon ? vue.createVNode(VIcon, {
6650
6687
  "key": "icon",
6651
6688
  "icon": props.icon
6652
- }, null) : slots.default?.(), genOverlays(false, 'v-avatar')]
6689
+ }, null) : slots.default?.() ?? props.text, genOverlays(false, 'v-avatar')]
6653
6690
  }));
6654
6691
  return {};
6655
6692
  }
@@ -8430,7 +8467,7 @@
8430
8467
  return contentBox;
8431
8468
  }
8432
8469
  function connectedLocationStrategy(data, props, contentStyles) {
8433
- const activatorFixed = isFixedPosition(data.activatorEl.value);
8470
+ const activatorFixed = Array.isArray(data.target.value) || isFixedPosition(data.target.value);
8434
8471
  if (activatorFixed) {
8435
8472
  Object.assign(contentStyles.value, {
8436
8473
  position: 'fixed',
@@ -8479,11 +8516,11 @@
8479
8516
  const observer = new ResizeObserver(() => {
8480
8517
  if (observe) updateLocation();
8481
8518
  });
8482
- vue.watch([data.activatorEl, data.contentEl], (_ref, _ref2) => {
8483
- let [newActivatorEl, newContentEl] = _ref;
8484
- let [oldActivatorEl, oldContentEl] = _ref2;
8485
- if (oldActivatorEl) observer.unobserve(oldActivatorEl);
8486
- if (newActivatorEl) observer.observe(newActivatorEl);
8519
+ vue.watch([data.target, data.contentEl], (_ref, _ref2) => {
8520
+ let [newTarget, newContentEl] = _ref;
8521
+ let [oldTarget, oldContentEl] = _ref2;
8522
+ if (oldTarget && !Array.isArray(oldTarget)) observer.unobserve(oldTarget);
8523
+ if (newTarget && !Array.isArray(newTarget)) observer.observe(newTarget);
8487
8524
  if (oldContentEl) observer.unobserve(oldContentEl);
8488
8525
  if (newContentEl) observer.observe(newContentEl);
8489
8526
  }, {
@@ -8499,8 +8536,8 @@
8499
8536
  requestAnimationFrame(() => {
8500
8537
  requestAnimationFrame(() => observe = true);
8501
8538
  });
8502
- if (!data.activatorEl.value || !data.contentEl.value) return;
8503
- const targetBox = data.activatorEl.value.getBoundingClientRect();
8539
+ if (!data.target.value || !data.contentEl.value) return;
8540
+ const targetBox = getTargetBox(data.target.value);
8504
8541
  const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value);
8505
8542
  const scrollParents = getScrollParents(data.contentEl.value);
8506
8543
  const viewportMargin = 12;
@@ -8787,11 +8824,11 @@
8787
8824
  function onScroll(e) {
8788
8825
  data.isActive.value = false;
8789
8826
  }
8790
- bindScroll(data.activatorEl.value ?? data.contentEl.value, onScroll);
8827
+ bindScroll(data.targetEl.value ?? data.contentEl.value, onScroll);
8791
8828
  }
8792
8829
  function blockScrollStrategy(data, props) {
8793
8830
  const offsetParent = data.root.value?.offsetParent;
8794
- const scrollElements = [...new Set([...getScrollParents(data.activatorEl.value, props.contained ? offsetParent : undefined), ...getScrollParents(data.contentEl.value, props.contained ? offsetParent : undefined)])].filter(el => !el.classList.contains('v-overlay-scroll-blocked'));
8831
+ const scrollElements = [...new Set([...getScrollParents(data.targetEl.value, props.contained ? offsetParent : undefined), ...getScrollParents(data.contentEl.value, props.contained ? offsetParent : undefined)])].filter(el => !el.classList.contains('v-overlay-scroll-blocked'));
8795
8832
  const scrollbarWidth = window.innerWidth - document.documentElement.offsetWidth;
8796
8833
  const scrollableParent = (el => hasScrollbar(el) && el)(offsetParent || document.documentElement);
8797
8834
  if (scrollableParent) {
@@ -8835,7 +8872,7 @@
8835
8872
  }
8836
8873
  ric = (typeof requestIdleCallback === 'undefined' ? cb => cb() : requestIdleCallback)(() => {
8837
8874
  scope.run(() => {
8838
- bindScroll(data.activatorEl.value ?? data.contentEl.value, e => {
8875
+ bindScroll(data.targetEl.value ?? data.contentEl.value, e => {
8839
8876
  if (slow) {
8840
8877
  // If the position calculation is slow,
8841
8878
  // defer updates until scrolling is finished.
@@ -8916,6 +8953,7 @@
8916
8953
  // Types
8917
8954
 
8918
8955
  const makeActivatorProps = propsFactory({
8956
+ target: [String, Object],
8919
8957
  activator: [String, Object],
8920
8958
  activatorProps: {
8921
8959
  type: Object,
@@ -8938,6 +8976,7 @@
8938
8976
  isActive,
8939
8977
  isTop
8940
8978
  } = _ref;
8979
+ const vm = getCurrentInstance('useActivator');
8941
8980
  const activatorEl = vue.ref();
8942
8981
  let isHovered = false;
8943
8982
  let isFocused = false;
@@ -8955,10 +8994,14 @@
8955
8994
  isActive.value = value;
8956
8995
  }
8957
8996
  });
8997
+ const cursorTarget = vue.ref();
8958
8998
  const availableEvents = {
8959
8999
  onClick: e => {
8960
9000
  e.stopPropagation();
8961
9001
  activatorEl.value = e.currentTarget || e.target;
9002
+ if (!isActive.value) {
9003
+ cursorTarget.value = [e.clientX, e.clientY];
9004
+ }
8962
9005
  isActive.value = !isActive.value;
8963
9006
  },
8964
9007
  onMouseenter: e => {
@@ -9052,6 +9095,15 @@
9052
9095
  isActive.value = false;
9053
9096
  }
9054
9097
  });
9098
+ vue.watch(isActive, val => {
9099
+ if (!val) {
9100
+ setTimeout(() => {
9101
+ cursorTarget.value = undefined;
9102
+ });
9103
+ }
9104
+ }, {
9105
+ flush: 'post'
9106
+ });
9055
9107
  const activatorRef = vue.ref();
9056
9108
  vue.watchEffect(() => {
9057
9109
  if (!activatorRef.value) return;
@@ -9059,7 +9111,15 @@
9059
9111
  activatorEl.value = refElement(activatorRef.value);
9060
9112
  });
9061
9113
  });
9062
- const vm = getCurrentInstance('useActivator');
9114
+ const targetRef = vue.ref();
9115
+ const target = vue.computed(() => {
9116
+ if (props.target === 'cursor' && cursorTarget.value) return cursorTarget.value;
9117
+ if (targetRef.value) return refElement(targetRef.value);
9118
+ return getTarget(props.target, vm) || activatorEl.value;
9119
+ });
9120
+ const targetEl = vue.computed(() => {
9121
+ return Array.isArray(target.value) ? undefined : target.value;
9122
+ });
9063
9123
  let scope;
9064
9124
  vue.watch(() => !!props.activator, val => {
9065
9125
  if (val && IN_BROWSER) {
@@ -9083,6 +9143,9 @@
9083
9143
  return {
9084
9144
  activatorEl,
9085
9145
  activatorRef,
9146
+ target,
9147
+ targetEl,
9148
+ targetRef,
9086
9149
  activatorEvents,
9087
9150
  contentEvents,
9088
9151
  scrimEvents
@@ -9124,31 +9187,34 @@
9124
9187
  }
9125
9188
  function getActivator() {
9126
9189
  let selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : props.activator;
9127
- let activator;
9128
- if (selector) {
9129
- if (selector === 'parent') {
9130
- let el = vm?.proxy?.$el?.parentNode;
9131
- while (el?.hasAttribute('data-no-activator')) {
9132
- el = el.parentNode;
9133
- }
9134
- activator = el;
9135
- } else if (typeof selector === 'string') {
9136
- // Selector
9137
- activator = document.querySelector(selector);
9138
- } else if ('$el' in selector) {
9139
- // Component (ref)
9140
- activator = selector.$el;
9141
- } else {
9142
- // HTMLElement | Element
9143
- activator = selector;
9144
- }
9145
- }
9190
+ const activator = getTarget(selector, vm);
9146
9191
 
9147
9192
  // The activator should only be a valid element (Ignore comments and text nodes)
9148
- activatorEl.value = activator?.nodeType === Node.ELEMENT_NODE ? activator : null;
9193
+ activatorEl.value = activator?.nodeType === Node.ELEMENT_NODE ? activator : undefined;
9149
9194
  return activatorEl.value;
9150
9195
  }
9151
9196
  }
9197
+ function getTarget(selector, vm) {
9198
+ if (!selector) return;
9199
+ let target;
9200
+ if (selector === 'parent') {
9201
+ let el = vm?.proxy?.$el?.parentNode;
9202
+ while (el?.hasAttribute('data-no-activator')) {
9203
+ el = el.parentNode;
9204
+ }
9205
+ target = el;
9206
+ } else if (typeof selector === 'string') {
9207
+ // Selector
9208
+ target = document.querySelector(selector);
9209
+ } else if ('$el' in selector) {
9210
+ // Component (ref)
9211
+ target = selector.$el;
9212
+ } else {
9213
+ // HTMLElement | Element | [x, y]
9214
+ target = selector;
9215
+ }
9216
+ return target;
9217
+ }
9152
9218
 
9153
9219
  // Utilities
9154
9220
 
@@ -9272,10 +9338,30 @@
9272
9338
  ssr: !!ssr
9273
9339
  };
9274
9340
  }
9341
+ const makeDisplayProps = propsFactory({
9342
+ mobileBreakpoint: [Number, String]
9343
+ }, 'display');
9275
9344
  function useDisplay() {
9345
+ let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
9346
+ let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
9276
9347
  const display = vue.inject(DisplaySymbol);
9277
9348
  if (!display) throw new Error('Could not find Vuetify display injection');
9278
- return display;
9349
+ const mobile = vue.computed(() => {
9350
+ if (!props.mobileBreakpoint) return display.mobile.value;
9351
+ const breakpointValue = typeof props.mobileBreakpoint === 'number' ? props.mobileBreakpoint : display.thresholds.value[props.mobileBreakpoint];
9352
+ return display.width.value < breakpointValue;
9353
+ });
9354
+ const displayClasses = vue.computed(() => {
9355
+ if (!name) return {};
9356
+ return {
9357
+ [`${name}--mobile`]: mobile.value
9358
+ };
9359
+ });
9360
+ return {
9361
+ ...display,
9362
+ displayClasses,
9363
+ mobile
9364
+ };
9279
9365
  }
9280
9366
 
9281
9367
  // Composables
@@ -9592,6 +9678,9 @@
9592
9678
  const {
9593
9679
  activatorEl,
9594
9680
  activatorRef,
9681
+ target,
9682
+ targetEl,
9683
+ targetRef,
9595
9684
  activatorEvents,
9596
9685
  contentEvents,
9597
9686
  scrimEvents
@@ -9617,13 +9706,13 @@
9617
9706
  } = useLocationStrategies(props, {
9618
9707
  isRtl,
9619
9708
  contentEl,
9620
- activatorEl,
9709
+ target,
9621
9710
  isActive
9622
9711
  });
9623
9712
  useScrollStrategies(props, {
9624
9713
  root,
9625
9714
  contentEl,
9626
- activatorEl,
9715
+ targetEl,
9627
9716
  isActive,
9628
9717
  updateLocation
9629
9718
  });
@@ -9691,7 +9780,8 @@
9691
9780
  useRender(() => vue.createVNode(vue.Fragment, null, [slots.activator?.({
9692
9781
  isActive: isActive.value,
9693
9782
  props: vue.mergeProps({
9694
- ref: activatorRef
9783
+ ref: activatorRef,
9784
+ targetRef
9695
9785
  }, activatorEvents.value, props.activatorProps)
9696
9786
  }), isMounted.value && hasContent.value && vue.createVNode(vue.Teleport, {
9697
9787
  "disabled": !teleportTarget.value,
@@ -9714,7 +9804,7 @@
9714
9804
  "appear": true,
9715
9805
  "persisted": true,
9716
9806
  "transition": props.transition,
9717
- "target": activatorEl.value,
9807
+ "target": target.value,
9718
9808
  "onAfterLeave": () => {
9719
9809
  onAfterLeave();
9720
9810
  emit('afterLeave');
@@ -9735,6 +9825,7 @@
9735
9825
  })]));
9736
9826
  return {
9737
9827
  activatorEl,
9828
+ target,
9738
9829
  animateClick,
9739
9830
  contentEl,
9740
9831
  globalTop,
@@ -11874,6 +11965,7 @@
11874
11965
  ...makeComponentProps(),
11875
11966
  ...makeDensityProps(),
11876
11967
  ...makeDimensionProps(),
11968
+ ...makeDisplayProps(),
11877
11969
  ...makeElevationProps(),
11878
11970
  ...makeLocationProps(),
11879
11971
  ...makePositionProps(),
@@ -11895,8 +11987,9 @@
11895
11987
  densityClasses
11896
11988
  } = useDensity(props);
11897
11989
  const {
11990
+ displayClasses,
11898
11991
  mobile
11899
- } = useDisplay();
11992
+ } = useDisplay(props);
11900
11993
  const {
11901
11994
  dimensionStyles
11902
11995
  } = useDimension(props);
@@ -11932,7 +12025,7 @@
11932
12025
  'v-banner--stacked': props.stacked || mobile.value,
11933
12026
  'v-banner--sticky': props.sticky,
11934
12027
  [`v-banner--${props.lines}-line`]: !!props.lines
11935
- }, borderClasses.value, densityClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, themeClasses.value, props.class],
12028
+ }, borderClasses.value, densityClasses.value, displayClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, themeClasses.value, props.class],
11936
12029
  "style": [dimensionStyles.value, locationStyles.value, props.style],
11937
12030
  "role": "banner"
11938
12031
  }, {
@@ -12239,12 +12332,17 @@
12239
12332
  item,
12240
12333
  raw
12241
12334
  } = _ref2;
12242
- return vue.createVNode(vue.Fragment, null, [vue.createVNode(VBreadcrumbsItem, vue.mergeProps({
12243
- "key": item.title,
12335
+ return vue.createVNode(vue.Fragment, null, [slots.item?.({
12336
+ item,
12337
+ index
12338
+ }) ?? vue.createVNode(VBreadcrumbsItem, vue.mergeProps({
12339
+ "key": index,
12244
12340
  "disabled": index >= array.length - 1
12245
- }, item), {
12341
+ }, typeof item === 'string' ? {
12342
+ title: item
12343
+ } : item), {
12246
12344
  default: slots.title ? () => slots.title?.({
12247
- item: raw,
12345
+ item,
12248
12346
  index
12249
12347
  }) : undefined
12250
12348
  }), index < array.length - 1 && vue.createVNode(VBreadcrumbsDivider, null, {
@@ -13582,7 +13680,11 @@
13582
13680
  ...makeRoundedProps(),
13583
13681
  ...makeElevationProps({
13584
13682
  elevation: 2
13585
- })
13683
+ }),
13684
+ ripple: {
13685
+ type: Boolean,
13686
+ default: true
13687
+ }
13586
13688
  }, 'Slider');
13587
13689
  const useSteps = props => {
13588
13690
  const min = vue.computed(() => parseFloat(props.min));
@@ -14189,7 +14291,8 @@
14189
14291
  "position": trackStop.value,
14190
14292
  "elevation": props.elevation,
14191
14293
  "onFocus": focus,
14192
- "onBlur": blur
14294
+ "onBlur": blur,
14295
+ "ripple": props.ripple
14193
14296
  }, {
14194
14297
  'thumb-label': slots['thumb-label']
14195
14298
  })]);
@@ -14220,12 +14323,36 @@
14220
14323
  let {
14221
14324
  emit
14222
14325
  } = _ref;
14326
+ const abortController = new AbortController();
14327
+ vue.onUnmounted(() => abortController.abort());
14328
+ async function openEyeDropper() {
14329
+ if (!SUPPORTS_EYE_DROPPER) return;
14330
+ const eyeDropper = new window.EyeDropper();
14331
+ try {
14332
+ const result = await eyeDropper.open({
14333
+ signal: abortController.signal
14334
+ });
14335
+ const colorHexValue = HexToHSV(result.sRGBHex);
14336
+ emit('update:color', {
14337
+ ...(props.color ?? nullColor),
14338
+ ...colorHexValue
14339
+ });
14340
+ } catch (e) {}
14341
+ }
14223
14342
  useRender(() => vue.createVNode("div", {
14224
14343
  "class": ['v-color-picker-preview', {
14225
14344
  'v-color-picker-preview--hide-alpha': props.hideAlpha
14226
14345
  }, props.class],
14227
14346
  "style": props.style
14228
- }, [vue.createVNode("div", {
14347
+ }, [SUPPORTS_EYE_DROPPER && vue.createVNode("div", {
14348
+ "class": "v-color-picker-preview__eye-dropper",
14349
+ "key": "eyeDropper"
14350
+ }, [vue.createVNode(VBtn, {
14351
+ "onClick": openEyeDropper,
14352
+ "icon": "$eyeDropper",
14353
+ "variant": "plain",
14354
+ "density": "comfortable"
14355
+ }, null)]), vue.createVNode("div", {
14229
14356
  "class": "v-color-picker-preview__dot"
14230
14357
  }, [vue.createVNode("div", {
14231
14358
  "style": {
@@ -16906,6 +17033,7 @@
16906
17033
  sticky: Boolean,
16907
17034
  ...makeBorderProps(),
16908
17035
  ...makeComponentProps(),
17036
+ ...makeDisplayProps(),
16909
17037
  ...makeElevationProps(),
16910
17038
  ...makeLayoutItemProps(),
16911
17039
  ...makeRoundedProps(),
@@ -16944,8 +17072,9 @@
16944
17072
  elevationClasses
16945
17073
  } = useElevation(props);
16946
17074
  const {
17075
+ displayClasses,
16947
17076
  mobile
16948
- } = useDisplay();
17077
+ } = useDisplay(props);
16949
17078
  const {
16950
17079
  roundedClasses
16951
17080
  } = useRounded(props);
@@ -17056,7 +17185,7 @@
17056
17185
  'v-navigation-drawer--temporary': isTemporary.value,
17057
17186
  'v-navigation-drawer--active': isActive.value,
17058
17187
  'v-navigation-drawer--sticky': isSticky.value
17059
- }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class],
17188
+ }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, displayClasses.value, elevationClasses.value, roundedClasses.value, props.class],
17060
17189
  "style": [backgroundColorStyles.value, layoutItemStyles.value, dragStyles.value, ssrBootStyles.value, stickyStyles.value, props.style]
17061
17190
  }, scopeId, attrs), {
17062
17191
  default: () => [hasImage && vue.createVNode("div", {
@@ -17804,7 +17933,8 @@
17804
17933
  },
17805
17934
  "min": min.value,
17806
17935
  "max": model.value[1],
17807
- "position": trackStart.value
17936
+ "position": trackStart.value,
17937
+ "ripple": props.ripple
17808
17938
  }, {
17809
17939
  'thumb-label': slots['thumb-label']
17810
17940
  }), vue.createVNode(VSliderThumb, {
@@ -17832,7 +17962,8 @@
17832
17962
  },
17833
17963
  "min": model.value[0],
17834
17964
  "max": max.value,
17835
- "position": trackStop.value
17965
+ "position": trackStop.value,
17966
+ "ripple": props.ripple
17836
17967
  }, {
17837
17968
  'thumb-label': slots['thumb-label']
17838
17969
  })]);
@@ -18106,6 +18237,7 @@
18106
18237
  validator: v => typeof v === 'boolean' || ['always', 'desktop', 'mobile'].includes(v)
18107
18238
  },
18108
18239
  ...makeComponentProps(),
18240
+ ...makeDisplayProps(),
18109
18241
  ...makeTagProps(),
18110
18242
  ...makeGroupProps({
18111
18243
  selectedClass: 'v-slide-group-item--active'
@@ -18125,8 +18257,9 @@
18125
18257
  isRtl
18126
18258
  } = useRtl();
18127
18259
  const {
18260
+ displayClasses,
18128
18261
  mobile
18129
- } = useDisplay();
18262
+ } = useDisplay(props);
18130
18263
  const group = useGroup(props, props.symbol);
18131
18264
  const isOverflowing = vue.shallowRef(false);
18132
18265
  const scrollOffset = vue.shallowRef(0);
@@ -18346,7 +18479,7 @@
18346
18479
  'v-slide-group--vertical': !isHorizontal.value,
18347
18480
  'v-slide-group--has-affixes': hasAffixes.value,
18348
18481
  'v-slide-group--is-overflowing': isOverflowing.value
18349
- }, props.class],
18482
+ }, displayClasses.value, props.class],
18350
18483
  "style": props.style,
18351
18484
  "tabindex": isFocused.value || group.selected.value.length ? -1 : 0,
18352
18485
  "onFocus": onFocus
@@ -18421,8 +18554,41 @@
18421
18554
  }
18422
18555
  });
18423
18556
 
18557
+ function useCountdown(milliseconds) {
18558
+ const time = vue.shallowRef(milliseconds);
18559
+ let timer = -1;
18560
+ function clear() {
18561
+ clearInterval(timer);
18562
+ }
18563
+ function reset() {
18564
+ clear();
18565
+ vue.nextTick(() => time.value = milliseconds);
18566
+ }
18567
+ function start(el) {
18568
+ const style = el ? getComputedStyle(el) : {
18569
+ transitionDuration: 0.2
18570
+ };
18571
+ const interval = parseFloat(style.transitionDuration) * 1000 || 200;
18572
+ clear();
18573
+ if (time.value <= 0) return;
18574
+ const startTime = performance.now();
18575
+ timer = window.setInterval(() => {
18576
+ const elapsed = performance.now() - startTime + interval;
18577
+ time.value = Math.max(milliseconds - elapsed, 0);
18578
+ if (time.value <= 0) clear();
18579
+ }, interval);
18580
+ }
18581
+ vue.onScopeDispose(clear);
18582
+ return {
18583
+ clear,
18584
+ time,
18585
+ start,
18586
+ reset
18587
+ };
18588
+ }
18424
18589
  const makeVSnackbarProps = propsFactory({
18425
18590
  multiLine: Boolean,
18591
+ timer: [Boolean, String],
18426
18592
  timeout: {
18427
18593
  type: [Number, String],
18428
18594
  default: 5000
@@ -18470,7 +18636,10 @@
18470
18636
  const {
18471
18637
  roundedClasses
18472
18638
  } = useRounded(props);
18639
+ const countdown = useCountdown(Number(props.timeout));
18473
18640
  const overlay = vue.ref();
18641
+ const timerRef = vue.ref();
18642
+ const isHovering = vue.shallowRef(false);
18474
18643
  vue.watch(isActive, startTimeout);
18475
18644
  vue.watch(() => props.timeout, startTimeout);
18476
18645
  vue.onMounted(() => {
@@ -18478,16 +18647,28 @@
18478
18647
  });
18479
18648
  let activeTimeout = -1;
18480
18649
  function startTimeout() {
18650
+ countdown.reset();
18481
18651
  window.clearTimeout(activeTimeout);
18482
18652
  const timeout = Number(props.timeout);
18483
18653
  if (!isActive.value || timeout === -1) return;
18654
+ const element = refElement(timerRef.value);
18655
+ countdown.start(element);
18484
18656
  activeTimeout = window.setTimeout(() => {
18485
18657
  isActive.value = false;
18486
18658
  }, timeout);
18487
18659
  }
18488
- function onPointerenter() {
18660
+ function clearTimeout() {
18661
+ countdown.reset();
18489
18662
  window.clearTimeout(activeTimeout);
18490
18663
  }
18664
+ function onPointerenter() {
18665
+ isHovering.value = true;
18666
+ clearTimeout();
18667
+ }
18668
+ function onPointerleave() {
18669
+ isHovering.value = false;
18670
+ startTimeout();
18671
+ }
18491
18672
  useRender(() => {
18492
18673
  const [overlayProps] = VOverlay.filterProps(props);
18493
18674
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -18495,6 +18676,7 @@
18495
18676
  "class": ['v-snackbar', {
18496
18677
  'v-snackbar--active': isActive.value,
18497
18678
  'v-snackbar--multi-line': props.multiLine && !props.vertical,
18679
+ 'v-snackbar--timer': !!props.timer,
18498
18680
  'v-snackbar--vertical': props.vertical
18499
18681
  }, positionClasses.value, props.class],
18500
18682
  "style": props.style
@@ -18505,7 +18687,7 @@
18505
18687
  class: ['v-snackbar__wrapper', themeClasses.value, colorClasses.value, roundedClasses.value, variantClasses.value],
18506
18688
  style: [locationStyles.value, colorStyles.value],
18507
18689
  onPointerenter,
18508
- onPointerleave: startTimeout
18690
+ onPointerleave
18509
18691
  }, overlayProps.contentProps),
18510
18692
  "persistent": true,
18511
18693
  "noClickAnimation": true,
@@ -18513,7 +18695,16 @@
18513
18695
  "scrollStrategy": "none",
18514
18696
  "_disableGlobalStack": true
18515
18697
  }, scopeId), {
18516
- default: () => [genOverlays(false, 'v-snackbar'), slots.default && vue.createVNode("div", {
18698
+ default: () => [genOverlays(false, 'v-snackbar'), props.timer && vue.createVNode("div", {
18699
+ "key": "timer",
18700
+ "class": "v-snackbar__timer"
18701
+ }, [vue.createVNode(VProgressLinear, {
18702
+ "ref": timerRef,
18703
+ "active": !isHovering.value,
18704
+ "color": typeof props.timer === 'string' ? props.timer : 'info',
18705
+ "max": props.timeout,
18706
+ "model-value": countdown.time.value
18707
+ }, null)]), slots.default && vue.createVNode("div", {
18517
18708
  "class": "v-snackbar__content",
18518
18709
  "role": "status",
18519
18710
  "aria-live": "polite"
@@ -20412,7 +20603,7 @@
20412
20603
  date
20413
20604
  };
20414
20605
  }
20415
- const version$1 = "3.3.15";
20606
+ const version$1 = "3.4.0-alpha.1";
20416
20607
  createVuetify$1.version = version$1;
20417
20608
 
20418
20609
  // Vue's inject() can only be used in setup
@@ -20437,7 +20628,7 @@
20437
20628
  ...options
20438
20629
  });
20439
20630
  };
20440
- const version = "3.3.15";
20631
+ const version = "3.4.0-alpha.1";
20441
20632
  createVuetify.version = version;
20442
20633
 
20443
20634
  exports.components = components;