vuetify 3.3.7 → 3.3.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 (83) hide show
  1. package/dist/json/attributes.json +3 -3
  2. package/dist/json/importMap.json +76 -76
  3. package/dist/json/web-types.json +153 -153
  4. package/dist/vuetify-labs.css +471 -523
  5. package/dist/vuetify-labs.d.ts +65 -64
  6. package/dist/vuetify-labs.esm.js +149 -82
  7. package/dist/vuetify-labs.esm.js.map +1 -1
  8. package/dist/vuetify-labs.js +148 -81
  9. package/dist/vuetify-labs.min.css +2 -2
  10. package/dist/vuetify.css +49 -107
  11. package/dist/vuetify.d.ts +23 -23
  12. package/dist/vuetify.esm.js +92 -69
  13. package/dist/vuetify.esm.js.map +1 -1
  14. package/dist/vuetify.js +91 -68
  15. package/dist/vuetify.js.map +1 -1
  16. package/dist/vuetify.min.css +2 -2
  17. package/dist/vuetify.min.js +116 -112
  18. package/dist/vuetify.min.js.map +1 -1
  19. package/lib/components/VAutocomplete/VAutocomplete.css +2 -2
  20. package/lib/components/VAutocomplete/VAutocomplete.sass +2 -2
  21. package/lib/components/VCarousel/VCarousel.mjs +58 -57
  22. package/lib/components/VCarousel/VCarousel.mjs.map +1 -1
  23. package/lib/components/VColorPicker/VColorPickerEdit.css +1 -0
  24. package/lib/components/VColorPicker/VColorPickerEdit.sass +1 -0
  25. package/lib/components/VColorPicker/VColorPickerPreview.css +1 -1
  26. package/lib/components/VColorPicker/_variables.scss +2 -1
  27. package/lib/components/VCombobox/VCombobox.css +2 -2
  28. package/lib/components/VCombobox/VCombobox.sass +2 -2
  29. package/lib/components/VField/VField.css +8 -70
  30. package/lib/components/VField/VField.mjs +1 -1
  31. package/lib/components/VField/VField.mjs.map +1 -1
  32. package/lib/components/VField/VField.sass +5 -8
  33. package/lib/components/VField/_variables.scss +3 -3
  34. package/lib/components/VList/VListItem.css +3 -0
  35. package/lib/components/VList/VListItem.sass +10 -3
  36. package/lib/components/VOverlay/VOverlay.mjs +2 -2
  37. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  38. package/lib/components/VOverlay/locationStrategies.mjs +6 -0
  39. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  40. package/lib/components/VRangeSlider/VRangeSlider.mjs +4 -2
  41. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  42. package/lib/components/VTextField/VTextField.css +1 -1
  43. package/lib/composables/filter.mjs +3 -2
  44. package/lib/composables/filter.mjs.map +1 -1
  45. package/lib/composables/theme.mjs +2 -2
  46. package/lib/composables/theme.mjs.map +1 -1
  47. package/lib/entry-bundler.mjs +1 -1
  48. package/lib/framework.mjs +1 -1
  49. package/lib/index.d.mts +23 -23
  50. package/lib/labs/VDataIterator/index.d.mts +1 -0
  51. package/lib/labs/VDataTable/VDataTableRows.mjs +1 -1
  52. package/lib/labs/VDataTable/VDataTableRows.mjs.map +1 -1
  53. package/lib/labs/VDataTable/composables/items.mjs +1 -0
  54. package/lib/labs/VDataTable/composables/items.mjs.map +1 -1
  55. package/lib/labs/VDataTable/index.d.mts +47 -46
  56. package/lib/labs/VDataTable/types.mjs.map +1 -1
  57. package/lib/labs/VDateInput/composables.mjs +1 -1
  58. package/lib/labs/VDateInput/composables.mjs.map +1 -1
  59. package/lib/labs/VDateInput/index.d.mts +16 -16
  60. package/lib/labs/VDatePicker/VDatePicker.mjs +8 -7
  61. package/lib/labs/VDatePicker/VDatePicker.mjs.map +1 -1
  62. package/lib/labs/VDatePicker/VDatePickerControls.css +7 -0
  63. package/lib/labs/VDatePicker/VDatePickerControls.mjs +1 -0
  64. package/lib/labs/VDatePicker/VDatePickerControls.mjs.map +1 -1
  65. package/lib/labs/VDatePicker/VDatePickerControls.sass +8 -0
  66. package/lib/labs/VDatePicker/composables.mjs +15 -2
  67. package/lib/labs/VDatePicker/composables.mjs.map +1 -1
  68. package/lib/labs/VDatePicker/index.d.mts +18 -18
  69. package/lib/labs/VDateRangePicker/VDateRangePicker.mjs +2 -4
  70. package/lib/labs/VDateRangePicker/VDateRangePicker.mjs.map +1 -1
  71. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.mjs +4 -5
  72. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.mjs.map +1 -1
  73. package/lib/labs/VDateRangePicker/index.d.mts +59 -51
  74. package/lib/labs/VPicker/VPicker.css +0 -1
  75. package/lib/labs/VPicker/VPicker.sass +0 -1
  76. package/lib/labs/components.d.mts +65 -64
  77. package/lib/labs/date/adapters/vuetify.mjs +14 -1
  78. package/lib/labs/date/adapters/vuetify.mjs.map +1 -1
  79. package/lib/labs/date/date.mjs +3 -3
  80. package/lib/labs/date/date.mjs.map +1 -1
  81. package/lib/labs/date/index.d.mts +25 -1
  82. package/package.json +2 -2
  83. package/lib/components/VField/_mixins.sass +0 -7
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.3.7
2
+ * Vuetify v3.3.9
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -2165,7 +2165,7 @@
2165
2165
 
2166
2166
  // Composables
2167
2167
  function createTheme(options) {
2168
- const parsedOptions = vue.reactive(parseThemeOptions(options));
2168
+ const parsedOptions = parseThemeOptions(options);
2169
2169
  const name = vue.ref(parsedOptions.defaultTheme);
2170
2170
  const themes = vue.ref(parsedOptions.themes);
2171
2171
  const computedThemes = vue.computed(() => {
@@ -8338,6 +8338,12 @@
8338
8338
  // el.style.removeProperty('max-width')
8339
8339
  // el.style.removeProperty('max-height')
8340
8340
 
8341
+ if (isRtl) {
8342
+ el.style.removeProperty('left');
8343
+ } else {
8344
+ el.style.removeProperty('right');
8345
+ }
8346
+
8341
8347
  /* eslint-disable-next-line sonarjs/prefer-immediate-return */
8342
8348
  const contentBox = nullifyTransforms(el);
8343
8349
  if (isRtl) {
@@ -9619,11 +9625,11 @@
9619
9625
  props: vue.mergeProps({
9620
9626
  ref: activatorRef
9621
9627
  }, activatorEvents.value, props.activatorProps)
9622
- }), isMounted.value && vue.createVNode(vue.Teleport, {
9628
+ }), isMounted.value && hasContent.value && vue.createVNode(vue.Teleport, {
9623
9629
  "disabled": !teleportTarget.value,
9624
9630
  "to": teleportTarget.value
9625
9631
  }, {
9626
- default: () => [hasContent.value && vue.createVNode("div", vue.mergeProps({
9632
+ default: () => [vue.createVNode("div", vue.mergeProps({
9627
9633
  "class": ['v-overlay', {
9628
9634
  'v-overlay--absolute': props.absolute || props.contained,
9629
9635
  'v-overlay--active': isActive.value,
@@ -10125,7 +10131,7 @@
10125
10131
  }, null), vue.createVNode(LoaderSlot, {
10126
10132
  "name": "v-field",
10127
10133
  "active": !!props.loading,
10128
- "color": props.error ? 'error' : props.color
10134
+ "color": props.error ? 'error' : typeof props.loading === 'string' ? props.loading : props.color
10129
10135
  }, {
10130
10136
  default: slots.loader
10131
10137
  }), hasPrepend && vue.createVNode("div", {
@@ -11108,7 +11114,8 @@
11108
11114
  const filteredMatches = vue.ref(new Map());
11109
11115
  const transformedItems = vue.computed(() => options?.transform ? vue.unref(items).map(options?.transform) : vue.unref(items));
11110
11116
  vue.watchEffect(() => {
11111
- const strQuery = typeof vue.toValue(query) !== 'string' && typeof vue.toValue(query) !== 'number' ? '' : String(vue.toValue(query));
11117
+ const _query = typeof query === 'function' ? query() : vue.unref(query);
11118
+ const strQuery = typeof _query !== 'string' && typeof _query !== 'number' ? '' : String(_query);
11112
11119
  const results = filterItems(transformedItems.value, strQuery, {
11113
11120
  customKeyFilter: props.customKeyFilter,
11114
11121
  default: props.customFilter,
@@ -12681,64 +12688,65 @@
12681
12688
  window.clearTimeout(slideTimeout);
12682
12689
  window.requestAnimationFrame(startTimeout);
12683
12690
  }
12684
- useRender(() => vue.createVNode(VWindow, {
12685
- "ref": windowRef,
12686
- "modelValue": model.value,
12687
- "onUpdate:modelValue": $event => model.value = $event,
12688
- "class": ['v-carousel', {
12689
- 'v-carousel--hide-delimiter-background': props.hideDelimiterBackground,
12690
- 'v-carousel--vertical-delimiters': props.verticalDelimiters
12691
- }, props.class],
12692
- "style": [{
12693
- height: convertToUnit(props.height)
12694
- }, props.style],
12695
- "continuous": true,
12696
- "mandatory": "force",
12697
- "showArrows": props.showArrows
12698
- }, {
12699
- default: slots.default,
12700
- additional: _ref2 => {
12701
- let {
12702
- group
12703
- } = _ref2;
12704
- return vue.createVNode(vue.Fragment, null, [!props.hideDelimiters && vue.createVNode("div", {
12705
- "class": "v-carousel__controls",
12706
- "style": {
12707
- left: props.verticalDelimiters === 'left' && props.verticalDelimiters ? 0 : 'auto',
12708
- right: props.verticalDelimiters === 'right' ? 0 : 'auto'
12709
- }
12710
- }, [group.items.value.length > 0 && vue.createVNode(VDefaultsProvider, {
12711
- "defaults": {
12712
- VBtn: {
12713
- color: props.color,
12714
- icon: props.delimiterIcon,
12715
- size: 'x-small',
12716
- variant: 'text'
12691
+ useRender(() => {
12692
+ const [windowProps] = VWindow.filterProps(props);
12693
+ return vue.createVNode(VWindow, vue.mergeProps({
12694
+ "ref": windowRef
12695
+ }, windowProps, {
12696
+ "modelValue": model.value,
12697
+ "onUpdate:modelValue": $event => model.value = $event,
12698
+ "class": ['v-carousel', {
12699
+ 'v-carousel--hide-delimiter-background': props.hideDelimiterBackground,
12700
+ 'v-carousel--vertical-delimiters': props.verticalDelimiters
12701
+ }, props.class],
12702
+ "style": [{
12703
+ height: convertToUnit(props.height)
12704
+ }, props.style]
12705
+ }), {
12706
+ default: slots.default,
12707
+ additional: _ref2 => {
12708
+ let {
12709
+ group
12710
+ } = _ref2;
12711
+ return vue.createVNode(vue.Fragment, null, [!props.hideDelimiters && vue.createVNode("div", {
12712
+ "class": "v-carousel__controls",
12713
+ "style": {
12714
+ left: props.verticalDelimiters === 'left' && props.verticalDelimiters ? 0 : 'auto',
12715
+ right: props.verticalDelimiters === 'right' ? 0 : 'auto'
12717
12716
  }
12718
- },
12719
- "scoped": true
12720
- }, {
12721
- default: () => [group.items.value.map((item, index) => {
12722
- const props = {
12723
- id: `carousel-item-${item.id}`,
12724
- 'aria-label': t('$vuetify.carousel.ariaLabel.delimiter', index + 1, group.items.value.length),
12725
- class: [group.isSelected(item.id) && 'v-btn--active'],
12726
- onClick: () => group.select(item.id, true)
12727
- };
12728
- return slots.item ? slots.item({
12729
- props,
12730
- item
12731
- }) : vue.createVNode(VBtn, vue.mergeProps(item, props), null);
12732
- })]
12733
- })]), props.progress && vue.createVNode(VProgressLinear, {
12734
- "class": "v-carousel__progress",
12735
- "color": typeof props.progress === 'string' ? props.progress : undefined,
12736
- "modelValue": (group.getItemIndex(model.value) + 1) / group.items.value.length * 100
12737
- }, null)]);
12738
- },
12739
- prev: slots.prev,
12740
- next: slots.next
12741
- }));
12717
+ }, [group.items.value.length > 0 && vue.createVNode(VDefaultsProvider, {
12718
+ "defaults": {
12719
+ VBtn: {
12720
+ color: props.color,
12721
+ icon: props.delimiterIcon,
12722
+ size: 'x-small',
12723
+ variant: 'text'
12724
+ }
12725
+ },
12726
+ "scoped": true
12727
+ }, {
12728
+ default: () => [group.items.value.map((item, index) => {
12729
+ const props = {
12730
+ id: `carousel-item-${item.id}`,
12731
+ 'aria-label': t('$vuetify.carousel.ariaLabel.delimiter', index + 1, group.items.value.length),
12732
+ class: [group.isSelected(item.id) && 'v-btn--active'],
12733
+ onClick: () => group.select(item.id, true)
12734
+ };
12735
+ return slots.item ? slots.item({
12736
+ props,
12737
+ item
12738
+ }) : vue.createVNode(VBtn, vue.mergeProps(item, props), null);
12739
+ })]
12740
+ })]), props.progress && vue.createVNode(VProgressLinear, {
12741
+ "class": "v-carousel__progress",
12742
+ "color": typeof props.progress === 'string' ? props.progress : undefined,
12743
+ "modelValue": (group.getItemIndex(model.value) + 1) / group.items.value.length * 100
12744
+ }, null)]);
12745
+ },
12746
+ prev: slots.prev,
12747
+ next: slots.next
12748
+ });
12749
+ });
12742
12750
  return {};
12743
12751
  }
12744
12752
  });
@@ -17489,8 +17497,10 @@
17489
17497
  value
17490
17498
  } = _ref2;
17491
17499
  const newValue = activeThumbRef.value === startThumbRef.value?.$el ? [value, model.value[1]] : [model.value[0], value];
17492
- model.value = newValue;
17493
- emit('end', newValue);
17500
+ if (!props.strict && newValue[0] < newValue[1]) {
17501
+ model.value = newValue;
17502
+ }
17503
+ emit('end', model.value);
17494
17504
  },
17495
17505
  onSliderMove: _ref3 => {
17496
17506
  let {
@@ -20934,7 +20944,7 @@
20934
20944
  const itemSlotProps = {
20935
20945
  ...slotProps,
20936
20946
  props: {
20937
- key: `item_${item.value}`,
20947
+ key: `item_${item.key ?? item.index}`,
20938
20948
  onClick: expandOnClick.value || props['onClick:row'] ? event => {
20939
20949
  if (expandOnClick.value) {
20940
20950
  toggleExpand(item);
@@ -20983,6 +20993,7 @@
20983
20993
  }, {});
20984
20994
  return {
20985
20995
  type: 'item',
20996
+ key: props.returnObject ? getPropertyFromItem(item, props.itemValue) : value,
20986
20997
  index,
20987
20998
  value,
20988
20999
  selectable,
@@ -21754,11 +21765,24 @@
21754
21765
  function endOfMonth(date) {
21755
21766
  return new Date(date.getFullYear(), date.getMonth() + 1, 0);
21756
21767
  }
21768
+ function formatYyyyMmDd(value) {
21769
+ const formattedValue = value.split('-').map(d => d.padStart(2, '0')).join('-');
21770
+ const offsetMin = new Date().getTimezoneOffset() / -60;
21771
+ const offsetSign = offsetMin < 0 ? '-' : '+';
21772
+ const offsetValue = Math.abs(offsetMin).toString().padStart(2, '0');
21773
+ return `${formattedValue}T00:00:00.000${offsetSign}${offsetValue}:00`;
21774
+ }
21775
+ const _YYYMMDD = /([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))/;
21757
21776
  function date(value) {
21758
21777
  if (value == null) return new Date();
21759
21778
  if (value instanceof Date) return value;
21760
21779
  if (typeof value === 'string') {
21761
- const parsed = Date.parse(value);
21780
+ let parsed;
21781
+ if (_YYYMMDD.test(value)) {
21782
+ parsed = Date.parse(formatYyyyMmDd(value));
21783
+ } else {
21784
+ parsed = Date.parse(value);
21785
+ }
21762
21786
  if (!isNaN(parsed)) return new Date(parsed);
21763
21787
  }
21764
21788
  return null;
@@ -22007,11 +22031,11 @@
22007
22031
  const date = vue.inject(DateAdapterSymbol);
22008
22032
  const locale = useLocale();
22009
22033
  if (!date) throw new Error('[Vuetify] Could not find injected date');
22010
- const instance = typeof date.adapter === 'function'
22034
+ const instance = vue.reactive(typeof date.adapter === 'function'
22011
22035
  // eslint-disable-next-line new-cap
22012
22036
  ? new date.adapter({
22013
22037
  locale: date.locale?.[locale.current.value] ?? locale.current.value
22014
- }) : date.adapter;
22038
+ }) : date.adapter);
22015
22039
  vue.watch(locale.current, value => {
22016
22040
  const newLocale = date.locale ? date.locale[value] : value;
22017
22041
  instance.locale = newLocale ?? instance.locale;
@@ -22057,7 +22081,7 @@
22057
22081
  },
22058
22082
  displayDate: {
22059
22083
  type: null,
22060
- default: new Date()
22084
+ default: null
22061
22085
  },
22062
22086
  inputMode: {
22063
22087
  type: String,
@@ -22076,6 +22100,34 @@
22076
22100
  'update:inputMode': inputMode => true,
22077
22101
  'update:viewMode': viewMode => true
22078
22102
  };
22103
+ function createDateInput(props, isRange) {
22104
+ const adapter = useDate();
22105
+ const model = useProxiedModel(props, 'modelValue', [], v => {
22106
+ if (v == null) return [];
22107
+ const arr = wrapInArray(v).filter(v => !!v);
22108
+ return arr.map(adapter.date);
22109
+ }, v => {
22110
+ const arr = wrapInArray(v);
22111
+ const formatted = props.format ? arr.map(d => adapter.format(d, props.format)) : arr;
22112
+ if (isRange) return formatted;
22113
+ return formatted[0];
22114
+ });
22115
+ const inputMode = useProxiedModel(props, 'inputMode');
22116
+ const viewMode = useProxiedModel(props, 'viewMode');
22117
+ const displayDate = useProxiedModel(props, 'displayDate', model.value.length ? model.value[0] : adapter.date());
22118
+ function parseKeyboardDate(input, fallback) {
22119
+ const date = adapter.date(input);
22120
+ return adapter.isValid(date) ? date : fallback;
22121
+ }
22122
+ return {
22123
+ model,
22124
+ adapter,
22125
+ inputMode,
22126
+ viewMode,
22127
+ displayDate,
22128
+ parseKeyboardDate
22129
+ };
22130
+ }
22079
22131
 
22080
22132
  const makeVDatePickerControlsProps = propsFactory({
22081
22133
  nextIcon: {
@@ -22139,6 +22191,7 @@
22139
22191
  "icon": props.viewMode === 'month' ? props.expandIcon : props.collapseIcon,
22140
22192
  "onClick": () => emit('update:viewMode', props.viewMode === 'month' ? 'year' : 'month')
22141
22193
  }, null), vue.createVNode(VSpacer, null, null), props.viewMode === 'month' && !props.range && vue.createVNode("div", {
22194
+ "class": "v-date-picker-controls__month",
22142
22195
  "key": "month-buttons"
22143
22196
  }, [prevBtn, nextBtn]), props.viewMode === 'month' && props.range === 'end' && nextBtn]);
22144
22197
  });
@@ -22146,7 +22199,7 @@
22146
22199
  }
22147
22200
  });
22148
22201
 
22149
- // Utilities
22202
+ // Composables
22150
22203
 
22151
22204
  // Types
22152
22205
 
@@ -22164,12 +22217,24 @@
22164
22217
  dragHandle,
22165
22218
  hasScrolled
22166
22219
  });
22220
+
22221
+ // TODO: This composable should probably not live in DateInput
22222
+ const {
22223
+ model,
22224
+ displayDate,
22225
+ viewMode,
22226
+ inputMode
22227
+ } = createDateInput(props, !!props.multiple);
22167
22228
  return {
22168
22229
  hoverDate,
22169
22230
  hoverMonth,
22170
22231
  isDragging,
22171
22232
  dragHandle,
22172
- hasScrolled
22233
+ hasScrolled,
22234
+ model,
22235
+ displayDate,
22236
+ viewMode,
22237
+ inputMode
22173
22238
  };
22174
22239
  }
22175
22240
  function useDatePicker() {
@@ -22547,7 +22612,7 @@
22547
22612
  const {
22548
22613
  t
22549
22614
  } = useLocale();
22550
- createDatePicker();
22615
+ createDatePicker(props);
22551
22616
  function onDisplayUpdate(val) {
22552
22617
  emit('update:displayDate', val);
22553
22618
  }
@@ -22763,12 +22828,13 @@
22763
22828
  const {
22764
22829
  t
22765
22830
  } = useLocale();
22766
- createDatePicker();
22767
- const model = vue.ref(props.modelValue ?? []);
22831
+ const {
22832
+ model,
22833
+ displayDate,
22834
+ viewMode,
22835
+ inputMode
22836
+ } = createDatePicker(props);
22768
22837
  const isReversing = vue.ref(false);
22769
- const displayDate = useProxiedModel(props, 'displayDate', props.displayDate);
22770
- const inputMode = useProxiedModel(props, 'inputMode', props.inputMode);
22771
- const viewMode = useProxiedModel(props, 'viewMode', props.viewMode);
22772
22838
  const inputModel = vue.computed(() => model.value.length ? adapter.format(model.value[0], 'keyboardDate') : '');
22773
22839
  const title = vue.computed(() => t(props.title));
22774
22840
  const header = vue.computed(() => model.value.length ? adapter.format(model.value[0], 'normalDateWithWeekday') : t(props.header));
@@ -22813,7 +22879,8 @@
22813
22879
  return vue.createVNode(VPicker, vue.mergeProps(pickerProps, {
22814
22880
  "class": ['v-date-picker', props.class],
22815
22881
  "style": props.style,
22816
- "title": title.value
22882
+ "title": title.value,
22883
+ "width": props.showWeek ? 408 : 360
22817
22884
  }), {
22818
22885
  header: () => slots.header?.(headerSlotProps.value) ?? vue.createVNode(VDatePickerHeader, vue.mergeProps({
22819
22886
  "key": "header"
@@ -23600,7 +23667,7 @@
23600
23667
  date
23601
23668
  };
23602
23669
  }
23603
- const version$1 = "3.3.7";
23670
+ const version$1 = "3.3.9";
23604
23671
  createVuetify$1.version = version$1;
23605
23672
 
23606
23673
  // Vue's inject() can only be used in setup
@@ -23614,7 +23681,7 @@
23614
23681
 
23615
23682
  /* eslint-disable local-rules/sort-imports */
23616
23683
 
23617
- const version = "3.3.7";
23684
+ const version = "3.3.9";
23618
23685
 
23619
23686
  /* eslint-disable local-rules/sort-imports */
23620
23687