vuetify 3.3.4 → 3.3.6

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 (94) hide show
  1. package/dist/json/attributes.json +4 -12
  2. package/dist/json/importMap.json +20 -20
  3. package/dist/json/tags.json +0 -2
  4. package/dist/json/web-types.json +7 -27
  5. package/dist/vuetify-labs.css +49 -27
  6. package/dist/vuetify-labs.d.ts +36 -98
  7. package/dist/vuetify-labs.esm.js +85 -53
  8. package/dist/vuetify-labs.esm.js.map +1 -1
  9. package/dist/vuetify-labs.js +85 -53
  10. package/dist/vuetify-labs.min.css +2 -2
  11. package/dist/vuetify.css +66 -43
  12. package/dist/vuetify.d.ts +5 -5
  13. package/dist/vuetify.esm.js +43 -34
  14. package/dist/vuetify.esm.js.map +1 -1
  15. package/dist/vuetify.js +43 -34
  16. package/dist/vuetify.js.map +1 -1
  17. package/dist/vuetify.min.css +2 -2
  18. package/dist/vuetify.min.js +21 -22
  19. package/dist/vuetify.min.js.map +1 -1
  20. package/lib/components/VAppBar/VAppBar.mjs +12 -9
  21. package/lib/components/VAppBar/VAppBar.mjs.map +1 -1
  22. package/lib/components/VAutocomplete/VAutocomplete.css +12 -4
  23. package/lib/components/VAutocomplete/VAutocomplete.sass +17 -9
  24. package/lib/components/VAutocomplete/_variables.scss +1 -0
  25. package/lib/components/VBreadcrumbs/VBreadcrumbs.css +4 -0
  26. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs +1 -1
  27. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs.map +1 -1
  28. package/lib/components/VBreadcrumbs/VBreadcrumbs.sass +4 -0
  29. package/lib/components/VBreadcrumbs/VBreadcrumbsItem.mjs +8 -7
  30. package/lib/components/VBreadcrumbs/VBreadcrumbsItem.mjs.map +1 -1
  31. package/lib/components/VBtn/VBtn.css +1 -1
  32. package/lib/components/VBtn/VBtn.sass +1 -1
  33. package/lib/components/VCombobox/VCombobox.css +12 -4
  34. package/lib/components/VCombobox/VCombobox.sass +17 -9
  35. package/lib/components/VCombobox/_variables.scss +1 -0
  36. package/lib/components/VFooter/VFooter.mjs +4 -2
  37. package/lib/components/VFooter/VFooter.mjs.map +1 -1
  38. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +1 -1
  39. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  40. package/lib/components/VOverlay/VOverlay.mjs +1 -1
  41. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  42. package/lib/components/VSelect/VSelect.css +4 -3
  43. package/lib/components/VSelect/VSelect.sass +10 -12
  44. package/lib/components/VSlider/VSliderThumb.mjs +6 -2
  45. package/lib/components/VSlider/VSliderThumb.mjs.map +1 -1
  46. package/lib/components/VTextField/VTextField.css +2 -0
  47. package/lib/components/VTextField/VTextField.mjs +2 -4
  48. package/lib/components/VTextField/VTextField.mjs.map +1 -1
  49. package/lib/components/VTextField/VTextField.sass +3 -1
  50. package/lib/composables/validation.mjs +2 -2
  51. package/lib/composables/validation.mjs.map +1 -1
  52. package/lib/composables/virtual.mjs +7 -5
  53. package/lib/composables/virtual.mjs.map +1 -1
  54. package/lib/entry-bundler.mjs +1 -1
  55. package/lib/framework.mjs +1 -1
  56. package/lib/iconsets/fa.mjs +2 -2
  57. package/lib/iconsets/fa.mjs.map +1 -1
  58. package/lib/iconsets/fa4.mjs +2 -2
  59. package/lib/iconsets/fa4.mjs.map +1 -1
  60. package/lib/index.d.mts +5 -5
  61. package/lib/labs/VDataTable/composables/sort.mjs +4 -1
  62. package/lib/labs/VDataTable/composables/sort.mjs.map +1 -1
  63. package/lib/labs/VDatePicker/VDatePicker.css +3 -5
  64. package/lib/labs/VDatePicker/VDatePicker.mjs +12 -10
  65. package/lib/labs/VDatePicker/VDatePicker.mjs.map +1 -1
  66. package/lib/labs/VDatePicker/VDatePicker.sass +3 -5
  67. package/lib/labs/VDatePicker/VDatePickerControls.css +3 -1
  68. package/lib/labs/VDatePicker/VDatePickerControls.mjs +1 -1
  69. package/lib/labs/VDatePicker/VDatePickerControls.mjs.map +1 -1
  70. package/lib/labs/VDatePicker/VDatePickerControls.sass +3 -3
  71. package/lib/labs/VDatePicker/VDatePickerMonth.css +0 -1
  72. package/lib/labs/VDatePicker/VDatePickerMonth.mjs +0 -5
  73. package/lib/labs/VDatePicker/VDatePickerMonth.mjs.map +1 -1
  74. package/lib/labs/VDatePicker/VDatePickerMonth.sass +0 -1
  75. package/lib/labs/VDatePicker/VDatePickerTitle.sass +1 -1
  76. package/lib/labs/VDatePicker/VDatePickerYears.css +1 -1
  77. package/lib/labs/VDatePicker/VDatePickerYears.sass +1 -1
  78. package/lib/labs/VDatePicker/_variables.scss +0 -5
  79. package/lib/labs/VDatePicker/index.d.mts +36 -98
  80. package/lib/labs/VDateRangePicker/index.d.mts +34 -44
  81. package/lib/labs/VInfiniteScroll/VInfiniteScroll.mjs +24 -4
  82. package/lib/labs/VInfiniteScroll/VInfiniteScroll.mjs.map +1 -1
  83. package/lib/labs/VPicker/VPicker.css +1 -1
  84. package/lib/labs/VPicker/VPicker.sass +1 -1
  85. package/lib/labs/VPicker/_variables.scss +2 -2
  86. package/lib/labs/components.d.mts +36 -98
  87. package/lib/util/helpers.mjs +3 -0
  88. package/lib/util/helpers.mjs.map +1 -1
  89. package/lib/util/injectSelf.mjs +1 -0
  90. package/lib/util/injectSelf.mjs.map +1 -1
  91. package/package.json +2 -2
  92. package/lib/labs/VDatePicker/VDatePickerTable.sass +0 -84
  93. package/lib/labs/VDatePicker/mixins/date-picker-table.mjs +0 -210
  94. package/lib/labs/VDatePicker/mixins/date-picker-table.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.3.4
2
+ * Vuetify v3.3.6
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -432,6 +432,9 @@
432
432
  if (_el) _el.focus();else focusChild(el, location === 'next' ? 'first' : 'last');
433
433
  }
434
434
  }
435
+ function isEmpty(val) {
436
+ return val === null || val === undefined || typeof val === 'string' && val.trim() === '';
437
+ }
435
438
  function noop() {}
436
439
 
437
440
  // Utilities
@@ -1294,6 +1297,7 @@
1294
1297
  // TS doesn't allow symbol as index type
1295
1298
  return provides[key];
1296
1299
  }
1300
+ return undefined;
1297
1301
  }
1298
1302
 
1299
1303
  function isFixedPosition(el) {
@@ -3644,16 +3648,18 @@
3644
3648
  const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0;
3645
3649
  return height + extensionHeight;
3646
3650
  });
3647
- vue.watchEffect(() => {
3648
- if (scrollBehavior.value.hide) {
3649
- if (scrollBehavior.value.inverted) {
3650
- isActive.value = currentScroll.value > scrollThreshold.value;
3651
+ useToggleScope(vue.computed(() => !!props.scrollBehavior), () => {
3652
+ vue.watchEffect(() => {
3653
+ if (scrollBehavior.value.hide) {
3654
+ if (scrollBehavior.value.inverted) {
3655
+ isActive.value = currentScroll.value > scrollThreshold.value;
3656
+ } else {
3657
+ isActive.value = isScrollingUp.value || currentScroll.value < scrollThreshold.value;
3658
+ }
3651
3659
  } else {
3652
- isActive.value = isScrollingUp.value || currentScroll.value < scrollThreshold.value;
3660
+ isActive.value = true;
3653
3661
  }
3654
- } else {
3655
- isActive.value = true;
3656
- }
3662
+ });
3657
3663
  });
3658
3664
  const {
3659
3665
  ssrBootStyles
@@ -6285,12 +6291,12 @@
6285
6291
  const handler = typeof rule === 'function' ? rule : () => rule;
6286
6292
  const result = await handler(validationModel.value);
6287
6293
  if (result === true) continue;
6288
- if (typeof result !== 'string') {
6294
+ if (result !== false && typeof result !== 'string') {
6289
6295
  // eslint-disable-next-line no-console
6290
6296
  console.warn(`${result} is not a valid value. Rule functions must return boolean true or a string.`);
6291
6297
  continue;
6292
6298
  }
6293
- results.push(result);
6299
+ results.push(result || '');
6294
6300
  }
6295
6301
  internalErrorMessages.value = results;
6296
6302
  isValidating.value = false;
@@ -9425,7 +9431,7 @@
9425
9431
  modelValue: Boolean,
9426
9432
  persistent: Boolean,
9427
9433
  scrim: {
9428
- type: [String, Boolean],
9434
+ type: [Boolean, String],
9429
9435
  default: true
9430
9436
  },
9431
9437
  zIndex: {
@@ -10359,12 +10365,10 @@
10359
10365
  }]]);
10360
10366
  return vue.createVNode(vue.Fragment, null, [props.prefix && vue.createVNode("span", {
10361
10367
  "class": "v-text-field__prefix"
10362
- }, [props.prefix]), slots.default ? vue.createVNode("div", {
10368
+ }, [props.prefix]), vue.createVNode("div", {
10363
10369
  "class": fieldClass,
10364
10370
  "data-no-activator": ""
10365
- }, [slots.default(), inputNode]) : vue.cloneVNode(inputNode, {
10366
- class: fieldClass
10367
- }), props.suffix && vue.createVNode("span", {
10371
+ }, [slots.default ? vue.createVNode(vue.Fragment, null, [slots.default(), inputNode]) : vue.cloneVNode(inputNode)]), props.suffix && vue.createVNode("span", {
10368
10372
  "class": "v-text-field__suffix"
10369
10373
  }, [props.suffix])]);
10370
10374
  }
@@ -11600,20 +11604,21 @@
11600
11604
  textColorStyles
11601
11605
  } = useTextColor(color);
11602
11606
  useRender(() => {
11603
- const Tag = link.isLink.value ? 'a' : props.tag;
11604
- return vue.createVNode(Tag, {
11607
+ return vue.createVNode(props.tag, {
11605
11608
  "class": ['v-breadcrumbs-item', {
11606
11609
  'v-breadcrumbs-item--active': isActive.value,
11607
11610
  'v-breadcrumbs-item--disabled': props.disabled,
11608
- 'v-breadcrumbs-item--link': link.isLink.value,
11609
11611
  [`${props.activeClass}`]: isActive.value && props.activeClass
11610
11612
  }, textColorClasses.value, props.class],
11611
11613
  "style": [textColorStyles.value, props.style],
11612
- "href": link.href.value,
11613
- "aria-current": isActive.value ? 'page' : undefined,
11614
- "onClick": link.navigate
11614
+ "aria-current": isActive.value ? 'page' : undefined
11615
11615
  }, {
11616
- default: () => [slots.default?.() ?? props.title]
11616
+ default: () => [!link.isLink.value ? slots.default?.() ?? props.title : vue.createVNode("a", {
11617
+ "class": "v-breadcrumbs-item--link",
11618
+ "href": link.href.value,
11619
+ "aria-current": isActive.value ? 'page' : undefined,
11620
+ "onClick": link.navigate
11621
+ }, [slots.default?.() ?? props.title])]
11617
11622
  });
11618
11623
  });
11619
11624
  return {};
@@ -11689,7 +11694,7 @@
11689
11694
  "class": ['v-breadcrumbs', backgroundColorClasses.value, densityClasses.value, roundedClasses.value, props.class],
11690
11695
  "style": [backgroundColorStyles.value, props.style]
11691
11696
  }, {
11692
- default: () => [hasPrepend && vue.createVNode("div", {
11697
+ default: () => [hasPrepend && vue.createVNode("li", {
11693
11698
  "key": "prepend",
11694
11699
  "class": "v-breadcrumbs__prepend"
11695
11700
  }, [!slots.prepend ? vue.createVNode(VIcon, {
@@ -13301,6 +13306,9 @@
13301
13306
  emit
13302
13307
  } = _ref;
13303
13308
  const slider = vue.inject(VSliderSymbol);
13309
+ const {
13310
+ rtlClasses
13311
+ } = useRtl();
13304
13312
  if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider');
13305
13313
  const {
13306
13314
  thumbColor,
@@ -13368,7 +13376,7 @@
13368
13376
  "class": ['v-slider-thumb', {
13369
13377
  'v-slider-thumb--focused': props.focused,
13370
13378
  'v-slider-thumb--pressed': props.focused && mousePressed.value
13371
- }, props.class],
13379
+ }, props.class, rtlClasses.value],
13372
13380
  "style": [{
13373
13381
  '--v-slider-thumb-position': positionPercentage,
13374
13382
  '--v-slider-thumb-size': convertToUnit(thumbSize.value)
@@ -15351,7 +15359,9 @@
15351
15359
  useRender(() => vue.createVNode(props.tag, {
15352
15360
  "ref": resizeRef,
15353
15361
  "class": ['v-footer', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class],
15354
- "style": [backgroundColorStyles.value, props.app ? layoutItemStyles.value : undefined, props.style]
15362
+ "style": [backgroundColorStyles.value, props.app ? layoutItemStyles.value : {
15363
+ height: convertToUnit(props.height)
15364
+ }, props.style]
15355
15365
  }, slots));
15356
15366
  return {};
15357
15367
  }
@@ -16314,7 +16324,7 @@
16314
16324
  default: 56
16315
16325
  },
16316
16326
  scrim: {
16317
- type: [String, Boolean],
16327
+ type: [Boolean, String],
16318
16328
  default: true
16319
16329
  },
16320
16330
  image: String,
@@ -19108,12 +19118,14 @@
19108
19118
  const direction = scrollTop < lastScrollTop ? UP : DOWN;
19109
19119
  const midPointIndex = calculateMidPointIndex(scrollTop + height / 2);
19110
19120
  const buffer = Math.round(visibleItems.value / 3);
19111
- if (direction === UP && midPointIndex <= first.value + buffer * 2 - 1) {
19112
- first.value = clamp(midPointIndex - buffer, 0, items.value.length);
19113
- } else if (direction === DOWN && midPointIndex >= first.value + buffer * 2 - 1) {
19114
- first.value = clamp(midPointIndex - buffer, 0, items.value.length - visibleItems.value);
19121
+ const firstIndex = midPointIndex - buffer;
19122
+ const lastIndex = first.value + buffer * 2 - 1;
19123
+ if (direction === UP && midPointIndex <= lastIndex) {
19124
+ first.value = clamp(firstIndex, 0, items.value.length);
19125
+ } else if (direction === DOWN && midPointIndex >= lastIndex) {
19126
+ first.value = clamp(firstIndex, 0, items.value.length - visibleItems.value);
19115
19127
  }
19116
- lastScrollTop = containerRef.value.scrollTop;
19128
+ lastScrollTop = scrollTop;
19117
19129
  }
19118
19130
  function scrollToIndex(index) {
19119
19131
  if (!containerRef.value) return;
@@ -19899,6 +19911,9 @@
19899
19911
  }
19900
19912
  [sortA, sortB] = [sortA, sortB].map(s => s != null ? s.toString().toLocaleLowerCase() : s);
19901
19913
  if (sortA !== sortB) {
19914
+ if (isEmpty(sortA) && isEmpty(sortB)) return 0;
19915
+ if (isEmpty(sortA)) return -1;
19916
+ if (isEmpty(sortB)) return 1;
19902
19917
  if (!isNaN(sortA) && !isNaN(sortB)) return Number(sortA) - Number(sortB);
19903
19918
  return stringCollator.compare(sortA, sortB);
19904
19919
  }
@@ -21932,7 +21947,7 @@
21932
21947
  },
21933
21948
  range: {
21934
21949
  default: false,
21935
- type: [String, Boolean],
21950
+ type: [Boolean, String],
21936
21951
  validator: v => v === false || ['start', 'end'].includes(v)
21937
21952
  },
21938
21953
  ...omit(makeDateProps(), ['modelValue', 'inputMode'])
@@ -22019,11 +22034,6 @@
22019
22034
  showAdjacentMonths: Boolean,
22020
22035
  hideWeekdays: Boolean,
22021
22036
  showWeek: Boolean,
22022
- range: {
22023
- default: false,
22024
- type: [String, Boolean],
22025
- validator: v => typeof v === 'boolean' || ['start', 'end'].includes(v)
22026
- },
22027
22037
  hoverDate: null,
22028
22038
  multiple: Boolean,
22029
22039
  side: {
@@ -22580,9 +22590,6 @@
22580
22590
  },
22581
22591
  hideActions: Boolean,
22582
22592
  ...makeDateProps(),
22583
- ...makeTransitionProps({
22584
- transition: 'fade'
22585
- }),
22586
22593
  ...makeVDatePickerControlsProps(),
22587
22594
  ...makeVDatePickerMonthProps(),
22588
22595
  ...makeVDatePickerYearsProps(),
@@ -22629,7 +22636,9 @@
22629
22636
  if (props.hideActions) {
22630
22637
  emit('update:modelValue', val);
22631
22638
  }
22632
- isReversing.value = adapter.isBefore(val[0], oldVal[0]);
22639
+ if (val[0] && oldVal[0]) {
22640
+ isReversing.value = adapter.isBefore(val[0], oldVal[0]);
22641
+ }
22633
22642
  });
22634
22643
  function onClickCancel() {
22635
22644
  emit('click:cancel');
@@ -22665,16 +22674,19 @@
22665
22674
  "onUpdate:displayDate": $event => displayDate.value = $event,
22666
22675
  "viewMode": viewMode.value,
22667
22676
  "onUpdate:viewMode": $event => viewMode.value = $event
22668
- }), null), vue.createVNode(MaybeTransition, {
22669
- "transition": props.transition,
22670
- "mode": "out-in"
22677
+ }), null), vue.createVNode(VFadeTransition, {
22678
+ "hideOnLeave": true
22671
22679
  }, {
22672
- default: () => [viewMode.value === 'month' ? vue.createVNode(VDatePickerMonth, vue.mergeProps(datePickerMonthProps, {
22680
+ default: () => [viewMode.value === 'month' ? vue.createVNode(VDatePickerMonth, vue.mergeProps({
22681
+ "key": "date-picker-month"
22682
+ }, datePickerMonthProps, {
22673
22683
  "modelValue": model.value,
22674
22684
  "onUpdate:modelValue": $event => model.value = $event,
22675
22685
  "displayDate": displayDate.value,
22676
22686
  "onUpdate:displayDate": $event => displayDate.value = $event
22677
- }), null) : vue.createVNode(VDatePickerYears, vue.mergeProps(datePickerYearsProps, {
22687
+ }), null) : vue.createVNode(VDatePickerYears, vue.mergeProps({
22688
+ "key": "date-picker-years"
22689
+ }, datePickerYearsProps, {
22678
22690
  "displayDate": displayDate.value,
22679
22691
  "onUpdate:displayDate": $event => displayDate.value = $event,
22680
22692
  "viewMode": viewMode.value,
@@ -22747,7 +22759,7 @@
22747
22759
  rootMargin: String
22748
22760
  },
22749
22761
  emits: {
22750
- intersect: side => true
22762
+ intersect: (side, isIntersecting) => true
22751
22763
  },
22752
22764
  setup(props, _ref) {
22753
22765
  let {
@@ -22761,7 +22773,7 @@
22761
22773
  rootMargin: props.rootMargin
22762
22774
  } : undefined);
22763
22775
  vue.watch(isIntersecting, async val => {
22764
- if (val) emit('intersect', props.side);
22776
+ emit('intersect', props.side, val);
22765
22777
  });
22766
22778
  useRender(() => vue.createVNode("div", {
22767
22779
  "class": "v-infinite-scroll-intersect",
@@ -22785,6 +22797,7 @@
22785
22797
  const startStatus = vue.ref('ok');
22786
22798
  const endStatus = vue.ref('ok');
22787
22799
  const margin = vue.computed(() => convertToUnit(props.margin));
22800
+ const isIntersecting = vue.ref(false);
22788
22801
  function setScrollAmount(amount) {
22789
22802
  if (!rootEl.value) return;
22790
22803
  const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft';
@@ -22824,7 +22837,14 @@
22824
22837
  return side === 'start' ? startStatus.value : endStatus.value;
22825
22838
  }
22826
22839
  let previousScrollSize = 0;
22827
- function handleIntersect(side) {
22840
+ function handleIntersect(side, _isIntersecting) {
22841
+ isIntersecting.value = _isIntersecting;
22842
+ if (isIntersecting.value) {
22843
+ intersecting(side);
22844
+ }
22845
+ }
22846
+ function intersecting(side) {
22847
+ if (props.mode !== 'manual' && !isIntersecting.value) return;
22828
22848
  const status = getStatus(side);
22829
22849
  if (!rootEl.value || status === 'loading') return;
22830
22850
  previousScrollSize = getScrollSize();
@@ -22832,9 +22852,21 @@
22832
22852
  function done(status) {
22833
22853
  setStatus(side, status);
22834
22854
  vue.nextTick(() => {
22855
+ if (status === 'empty' || status === 'error') return;
22835
22856
  if (status === 'ok' && side === 'start') {
22836
22857
  setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
22837
22858
  }
22859
+ if (props.mode !== 'manual') {
22860
+ vue.nextTick(() => {
22861
+ window.requestAnimationFrame(() => {
22862
+ window.requestAnimationFrame(() => {
22863
+ window.requestAnimationFrame(() => {
22864
+ intersecting(side);
22865
+ });
22866
+ });
22867
+ });
22868
+ });
22869
+ }
22838
22870
  });
22839
22871
  }
22840
22872
  emit('load', {
@@ -22847,7 +22879,7 @@
22847
22879
  } = useLocale();
22848
22880
  function renderSide(side, status) {
22849
22881
  if (props.side !== side && props.side !== 'both') return;
22850
- const onClick = () => handleIntersect(side);
22882
+ const onClick = () => intersecting(side);
22851
22883
  const slotProps = {
22852
22884
  side,
22853
22885
  props: {
@@ -23419,7 +23451,7 @@
23419
23451
  date
23420
23452
  };
23421
23453
  }
23422
- const version$1 = "3.3.4";
23454
+ const version$1 = "3.3.6";
23423
23455
  createVuetify$1.version = version$1;
23424
23456
 
23425
23457
  // Vue's inject() can only be used in setup
@@ -23433,7 +23465,7 @@
23433
23465
 
23434
23466
  /* eslint-disable local-rules/sort-imports */
23435
23467
 
23436
- const version = "3.3.4";
23468
+ const version = "3.3.6";
23437
23469
 
23438
23470
  /* eslint-disable local-rules/sort-imports */
23439
23471