@vuetify/nightly 3.8.0-beta.0-dev.2025-03-25 → 3.8.0-beta.0-dev.2025-03-29

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 (53) hide show
  1. package/CHANGELOG.md +80 -33
  2. package/dist/_component-variables-labs.sass +1 -0
  3. package/dist/json/attributes.json +4178 -4054
  4. package/dist/json/importMap-labs.json +12 -8
  5. package/dist/json/importMap.json +178 -178
  6. package/dist/json/tags.json +36 -0
  7. package/dist/json/web-types.json +7764 -7427
  8. package/dist/vuetify-labs.cjs +242 -16
  9. package/dist/vuetify-labs.css +2467 -2290
  10. package/dist/vuetify-labs.d.ts +546 -230
  11. package/dist/vuetify-labs.esm.js +242 -16
  12. package/dist/vuetify-labs.esm.js.map +1 -1
  13. package/dist/vuetify-labs.js +242 -16
  14. package/dist/vuetify-labs.min.css +2 -2
  15. package/dist/vuetify.cjs +31 -13
  16. package/dist/vuetify.cjs.map +1 -1
  17. package/dist/vuetify.css +4498 -4498
  18. package/dist/vuetify.d.ts +118 -143
  19. package/dist/vuetify.esm.js +31 -13
  20. package/dist/vuetify.esm.js.map +1 -1
  21. package/dist/vuetify.js +31 -13
  22. package/dist/vuetify.js.map +1 -1
  23. package/dist/vuetify.min.css +2 -2
  24. package/dist/vuetify.min.js +18 -17
  25. package/dist/vuetify.min.js.map +1 -1
  26. package/lib/components/VConfirmEdit/VConfirmEdit.d.ts +31 -6
  27. package/lib/components/VConfirmEdit/VConfirmEdit.js +17 -2
  28. package/lib/components/VConfirmEdit/VConfirmEdit.js.map +1 -1
  29. package/lib/components/VDatePicker/VDatePicker.d.ts +33 -78
  30. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +33 -78
  31. package/lib/composables/calendar.d.ts +12 -35
  32. package/lib/composables/calendar.js +11 -8
  33. package/lib/composables/calendar.js.map +1 -1
  34. package/lib/entry-bundler.js +1 -1
  35. package/lib/framework.d.ts +58 -57
  36. package/lib/framework.js +1 -1
  37. package/lib/labs/VCalendar/VCalendar.d.ts +33 -78
  38. package/lib/labs/VDateInput/VDateInput.d.ts +68 -78
  39. package/lib/labs/VDateInput/VDateInput.js +44 -4
  40. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  41. package/lib/labs/VIconBtn/VIconBtn.css +178 -0
  42. package/lib/labs/VIconBtn/VIconBtn.d.ts +608 -0
  43. package/lib/labs/VIconBtn/VIconBtn.js +184 -0
  44. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -0
  45. package/lib/labs/VIconBtn/VIconBtn.scss +110 -0
  46. package/lib/labs/VIconBtn/_variables.scss +36 -0
  47. package/lib/labs/VIconBtn/index.d.ts +1 -0
  48. package/lib/labs/VIconBtn/index.js +2 -0
  49. package/lib/labs/VIconBtn/index.js.map +1 -0
  50. package/lib/labs/components.d.ts +1 -0
  51. package/lib/labs/components.js +1 -0
  52. package/lib/labs/components.js.map +1 -1
  53. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.0-beta.0-dev.2025-03-25
2
+ * Vuetify v3.8.0-beta.0-dev.2025-03-29
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -18443,6 +18443,10 @@
18443
18443
  type: String,
18444
18444
  default: '$vuetify.confirmEdit.ok'
18445
18445
  },
18446
+ disabled: {
18447
+ type: [Boolean, Array],
18448
+ default: undefined
18449
+ },
18446
18450
  hideActions: Boolean
18447
18451
  }, 'VConfirmEdit');
18448
18452
  const VConfirmEdit = genericComponent()({
@@ -18469,6 +18473,17 @@
18469
18473
  const isPristine = vue.computed(() => {
18470
18474
  return deepEqual(model.value, internalModel.value);
18471
18475
  });
18476
+ function isActionDisabled(action) {
18477
+ if (typeof props.disabled === 'boolean') {
18478
+ return props.disabled;
18479
+ }
18480
+ if (Array.isArray(props.disabled)) {
18481
+ return props.disabled.includes(action);
18482
+ }
18483
+ return isPristine.value;
18484
+ }
18485
+ const isSaveDisabled = vue.computed(() => isActionDisabled('save'));
18486
+ const isCancelDisabled = vue.computed(() => isActionDisabled('cancel'));
18472
18487
  function save() {
18473
18488
  model.value = internalModel.value;
18474
18489
  emit('save', internalModel.value);
@@ -18479,13 +18494,13 @@
18479
18494
  }
18480
18495
  function actions(actionsProps) {
18481
18496
  return vue.createVNode(vue.Fragment, null, [vue.createVNode(VBtn, vue.mergeProps({
18482
- "disabled": isPristine.value,
18497
+ "disabled": isCancelDisabled.value,
18483
18498
  "variant": "text",
18484
18499
  "color": props.color,
18485
18500
  "onClick": cancel,
18486
18501
  "text": t(props.cancelText)
18487
18502
  }, actionsProps), null), vue.createVNode(VBtn, vue.mergeProps({
18488
- "disabled": isPristine.value,
18503
+ "disabled": isSaveDisabled.value,
18489
18504
  "variant": "text",
18490
18505
  "color": props.color,
18491
18506
  "onClick": save,
@@ -21940,7 +21955,10 @@
21940
21955
  type: String,
21941
21956
  default: 'dynamic'
21942
21957
  },
21943
- firstDayOfWeek: [Number, String]
21958
+ firstDayOfWeek: {
21959
+ type: [Number, String],
21960
+ default: 0
21961
+ }
21944
21962
  }, 'calendar');
21945
21963
  function useCalendar(props) {
21946
21964
  const adapter = useDate();
@@ -21961,15 +21979,15 @@
21961
21979
  const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value));
21962
21980
  return adapter.setMonth(date, value);
21963
21981
  }, v => adapter.getMonth(v));
21964
- const defaultFirstDayOfWeek = vue.computed(() => {
21965
- return props.firstDayOfWeek ?? props.weekdays[0];
21966
- });
21967
21982
  const weekDays = vue.computed(() => {
21968
- const firstDayOfWeek = Number(props.firstDayOfWeek ?? 0);
21969
- return props.weekdays.map(day => (day + firstDayOfWeek) % 7);
21983
+ const firstDayOfWeek = Number(props.firstDayOfWeek);
21984
+
21985
+ // Always generate all days, regardless of props.weekdays
21986
+ return [0, 1, 2, 3, 4, 5, 6].map(day => (day + firstDayOfWeek) % 7);
21970
21987
  });
21971
21988
  const weeksInMonth = vue.computed(() => {
21972
- const weeks = adapter.getWeekArray(month.value, defaultFirstDayOfWeek.value);
21989
+ const firstDayOfWeek = Number(props.firstDayOfWeek);
21990
+ const weeks = adapter.getWeekArray(month.value, firstDayOfWeek);
21973
21991
  const days = weeks.flat();
21974
21992
 
21975
21993
  // Make sure there's always 6 weeks in month (6 * 7 days)
@@ -22047,7 +22065,7 @@
22047
22065
  if (typeof props.allowedDates === 'function') {
22048
22066
  return !props.allowedDates(date);
22049
22067
  }
22050
- return false;
22068
+ return !props.weekdays.includes(adapter.toJsDate(date).getDay());
22051
22069
  }
22052
22070
  return {
22053
22071
  displayValue,
@@ -28940,6 +28958,7 @@
28940
28958
  type: String,
28941
28959
  default: 'bottom start'
28942
28960
  },
28961
+ ...makeDisplayProps(),
28943
28962
  ...makeFocusProps(),
28944
28963
  ...makeVConfirmEditProps({
28945
28964
  hideActions: true
@@ -28970,6 +28989,9 @@
28970
28989
  t
28971
28990
  } = useLocale();
28972
28991
  const adapter = useDate();
28992
+ const {
28993
+ mobile
28994
+ } = useDisplay();
28973
28995
  const {
28974
28996
  isFocused,
28975
28997
  focus,
@@ -28977,7 +28999,9 @@
28977
28999
  } = useFocus(props);
28978
29000
  const model = useProxiedModel(props, 'modelValue', props.multiple ? [] : null, val => Array.isArray(val) ? val.map(item => adapter.toJsDate(item)) : val ? adapter.toJsDate(val) : val, val => Array.isArray(val) ? val.map(item => adapter.date(item)) : val ? adapter.date(val) : val);
28979
29001
  const menu = vue.shallowRef(false);
29002
+ const isEditingInput = vue.shallowRef(false);
28980
29003
  const vDateInputRef = vue.ref();
29004
+ const disabledActions = vue.ref(['save']);
28981
29005
  function format(date) {
28982
29006
  if (typeof props.displayFormat === 'function') {
28983
29007
  return props.displayFormat(date);
@@ -28998,7 +29022,18 @@
28998
29022
  }
28999
29023
  return adapter.isValid(model.value) ? format(adapter.date(model.value)) : '';
29000
29024
  });
29025
+ const inputmode = vue.computed(() => {
29026
+ if (!mobile.value) return undefined;
29027
+ if (isEditingInput.value) return 'text';
29028
+ return 'none';
29029
+ });
29001
29030
  const isInteractive = vue.computed(() => !props.disabled && !props.readonly);
29031
+ const isReadonly = vue.computed(() => !(mobile.value && isEditingInput.value) && props.readonly);
29032
+ vue.watch(menu, val => {
29033
+ if (val) return;
29034
+ isEditingInput.value = false;
29035
+ disabledActions.value = ['save'];
29036
+ });
29002
29037
  function onKeydown(e) {
29003
29038
  if (e.key !== 'Enter') return;
29004
29039
  if (!menu.value || !isFocused.value) {
@@ -29011,11 +29046,16 @@
29011
29046
  function onClick(e) {
29012
29047
  e.preventDefault();
29013
29048
  e.stopPropagation();
29014
- menu.value = true;
29049
+ if (menu.value && mobile.value) {
29050
+ isEditingInput.value = true;
29051
+ } else {
29052
+ menu.value = true;
29053
+ }
29015
29054
  }
29016
29055
  function onCancel() {
29017
29056
  emit('cancel');
29018
29057
  menu.value = false;
29058
+ isEditingInput.value = false;
29019
29059
  }
29020
29060
  function onSave(value) {
29021
29061
  emit('save', value);
@@ -29025,6 +29065,19 @@
29025
29065
  if (value != null) return;
29026
29066
  model.value = null;
29027
29067
  }
29068
+ function onUpdateMenuModel(isMenuOpen) {
29069
+ if (isMenuOpen) return;
29070
+ isEditingInput.value = false;
29071
+ }
29072
+ function onBlur() {
29073
+ blur();
29074
+
29075
+ // When in mobile mode and editing is done (due to keyboard dismissal), close the menu
29076
+ if (mobile.value && isEditingInput.value && !isFocused.value) {
29077
+ menu.value = false;
29078
+ isEditingInput.value = false;
29079
+ }
29080
+ }
29028
29081
  useRender(() => {
29029
29082
  const confirmEditProps = VConfirmEdit.filterProps(props);
29030
29083
  const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
@@ -29035,10 +29088,12 @@
29035
29088
  "class": props.class,
29036
29089
  "style": props.style,
29037
29090
  "modelValue": display.value,
29091
+ "inputmode": inputmode.value,
29092
+ "readonly": isReadonly.value,
29038
29093
  "onKeydown": isInteractive.value ? onKeydown : undefined,
29039
29094
  "focused": menu.value || isFocused.value,
29040
29095
  "onFocus": focus,
29041
- "onBlur": blur,
29096
+ "onBlur": onBlur,
29042
29097
  "onClick:control": isInteractive.value ? onClick : undefined,
29043
29098
  "onClick:prepend": isInteractive.value ? onClick : undefined,
29044
29099
  "onUpdate:modelValue": onUpdateDisplayModel
@@ -29046,7 +29101,7 @@
29046
29101
  ...slots,
29047
29102
  default: () => vue.createVNode(vue.Fragment, null, [vue.createVNode(VMenu, {
29048
29103
  "modelValue": menu.value,
29049
- "onUpdate:modelValue": $event => menu.value = $event,
29104
+ "onUpdate:modelValue": [$event => menu.value = $event, onUpdateMenuModel],
29050
29105
  "activator": "parent",
29051
29106
  "min-width": "0",
29052
29107
  "eager": isFocused.value,
@@ -29057,6 +29112,7 @@
29057
29112
  default: () => [vue.createVNode(VConfirmEdit, vue.mergeProps(confirmEditProps, {
29058
29113
  "modelValue": model.value,
29059
29114
  "onUpdate:modelValue": $event => model.value = $event,
29115
+ "disabled": disabledActions.value,
29060
29116
  "onSave": onSave,
29061
29117
  "onCancel": onCancel
29062
29118
  }), {
@@ -29079,6 +29135,7 @@
29079
29135
  }
29080
29136
  emit('save', value);
29081
29137
  vDateInputRef.value?.blur();
29138
+ disabledActions.value = [];
29082
29139
  }
29083
29140
  return vue.createVNode(VDatePicker, vue.mergeProps(datePickerProps, {
29084
29141
  "modelValue": props.hideActions ? model.value : proxyModel.value,
@@ -29416,6 +29473,174 @@
29416
29473
 
29417
29474
  // Types
29418
29475
 
29476
+ const makeVIconBtnProps = propsFactory({
29477
+ active: {
29478
+ type: Boolean,
29479
+ default: undefined
29480
+ },
29481
+ activeColor: String,
29482
+ activeIcon: [String, Function, Object],
29483
+ activeVariant: String,
29484
+ baseVariant: {
29485
+ type: String,
29486
+ default: 'tonal'
29487
+ },
29488
+ disabled: Boolean,
29489
+ height: [Number, String],
29490
+ width: [Number, String],
29491
+ hideOverlay: Boolean,
29492
+ icon: [String, Function, Object],
29493
+ iconColor: String,
29494
+ iconSize: {
29495
+ type: [Number, String],
29496
+ default: 'default'
29497
+ },
29498
+ iconSizes: {
29499
+ type: Array,
29500
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
29501
+ },
29502
+ loading: Boolean,
29503
+ opacity: [Number, String],
29504
+ readonly: Boolean,
29505
+ rotate: [Number, String],
29506
+ size: {
29507
+ type: [Number, String],
29508
+ default: 'default'
29509
+ },
29510
+ sizes: {
29511
+ type: Array,
29512
+ default: () => [['x-small', 16], ['small', 24], ['default', 40], ['large', 48], ['x-large', 56]]
29513
+ },
29514
+ text: {
29515
+ type: [String, Number, Boolean],
29516
+ default: undefined
29517
+ },
29518
+ ...makeBorderProps(),
29519
+ ...makeComponentProps(),
29520
+ ...makeElevationProps(),
29521
+ ...makeRoundedProps(),
29522
+ ...makeTagProps({
29523
+ tag: 'button'
29524
+ }),
29525
+ ...makeThemeProps(),
29526
+ ...makeVariantProps({
29527
+ variant: 'flat'
29528
+ })
29529
+ }, 'VIconBtn');
29530
+ const VIconBtn = genericComponent()({
29531
+ name: 'VIconBtn',
29532
+ props: makeVIconBtnProps(),
29533
+ emits: {
29534
+ 'update:active': value => true
29535
+ },
29536
+ setup(props, _ref) {
29537
+ let {
29538
+ attrs,
29539
+ slots
29540
+ } = _ref;
29541
+ const isActive = useProxiedModel(props, 'active');
29542
+ const {
29543
+ themeClasses
29544
+ } = provideTheme(props);
29545
+ const {
29546
+ borderClasses
29547
+ } = useBorder(props);
29548
+ const {
29549
+ elevationClasses
29550
+ } = useElevation(props);
29551
+ const {
29552
+ roundedClasses
29553
+ } = useRounded(props);
29554
+ const {
29555
+ colorClasses,
29556
+ colorStyles,
29557
+ variantClasses
29558
+ } = useVariant(vue.toRef(() => ({
29559
+ color: (() => {
29560
+ if (props.disabled) return undefined;
29561
+ if (!isActive.value) return props.color;
29562
+ // Use an inline fallback as opposed to setting a default color
29563
+ // because non-toggle buttons are default flat whereas toggle
29564
+ // buttons are default tonal and active flat. The exact use
29565
+ // case for this is a toggle button with no active color.
29566
+ return props.activeColor ?? props.color ?? 'surface-variant';
29567
+ })(),
29568
+ variant: (() => {
29569
+ if (isActive.value === undefined) return props.variant;
29570
+ if (isActive.value) return props.activeVariant ?? props.variant;
29571
+ return props.baseVariant ?? props.variant;
29572
+ })()
29573
+ })));
29574
+ const btnSizeMap = new Map(props.sizes);
29575
+ const iconSizeMap = new Map(props.iconSizes);
29576
+ function onClick() {
29577
+ if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
29578
+ isActive.value = !isActive.value;
29579
+ }
29580
+ useRender(() => {
29581
+ const icon = isActive.value ? props.activeIcon ?? props.icon : props.icon;
29582
+ const size = props.size;
29583
+ const hasNamedSize = btnSizeMap.has(size);
29584
+ const btnSize = hasNamedSize ? btnSizeMap.get(size) : size;
29585
+ const btnHeight = props.height ?? btnSize;
29586
+ const btnWidth = props.width ?? btnSize;
29587
+ const _iconSize = hasNamedSize ? size : props.iconSize ?? size;
29588
+ const iconSize = iconSizeMap.get(_iconSize) ?? _iconSize;
29589
+ const iconProps = {
29590
+ icon,
29591
+ size: iconSize,
29592
+ iconColor: props.iconColor,
29593
+ opacity: props.opacity
29594
+ };
29595
+ return vue.createVNode(props.tag, {
29596
+ "class": [{
29597
+ 'v-icon-btn': true,
29598
+ 'v-icon-btn--active': isActive.value,
29599
+ 'v-icon-btn--disabled': props.disabled,
29600
+ 'v-icon-btn--loading': props.loading,
29601
+ 'v-icon-btn--readonly': props.readonly,
29602
+ [`v-icon-btn--${props.size}`]: true
29603
+ }, themeClasses.value, colorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, variantClasses.value, props.class],
29604
+ "style": [{
29605
+ '--v-icon-btn-rotate': convertToUnit(props.rotate, 'deg'),
29606
+ '--v-icon-btn-height': convertToUnit(btnHeight),
29607
+ '--v-icon-btn-width': convertToUnit(btnWidth)
29608
+ }, colorStyles.value, props.style],
29609
+ "tabindex": props.disabled || props.readonly ? -1 : 0,
29610
+ "onClick": onClick
29611
+ }, {
29612
+ default: () => [genOverlays(!props.hideOverlay, 'v-icon-btn'), vue.createVNode("div", {
29613
+ "class": "v-icon-btn__content",
29614
+ "data-no-activator": ""
29615
+ }, [!slots.default && icon ? vue.createVNode(VIcon, vue.mergeProps({
29616
+ "key": "content-icon"
29617
+ }, iconProps), null) : vue.createVNode(VDefaultsProvider, {
29618
+ "key": "content-defaults",
29619
+ "disabled": !icon,
29620
+ "defaults": {
29621
+ VIcon: {
29622
+ ...iconProps
29623
+ }
29624
+ }
29625
+ }, {
29626
+ default: () => slots.default?.() ?? vue.toDisplayString(props.text)
29627
+ })]), !!props.loading && vue.createVNode("span", {
29628
+ "key": "loader",
29629
+ "class": "v-icon-btn__loader"
29630
+ }, [slots.loader?.() ?? vue.createVNode(VProgressCircular, {
29631
+ "color": typeof props.loading === 'boolean' ? undefined : props.loading,
29632
+ "indeterminate": "disable-shrink",
29633
+ "width": "2",
29634
+ "size": iconSize
29635
+ }, null)])]
29636
+ });
29637
+ });
29638
+ return {};
29639
+ }
29640
+ });
29641
+
29642
+ // Types
29643
+
29419
29644
  const makeVStepperVerticalActionsProps = propsFactory({
29420
29645
  ...makeVStepperActionsProps()
29421
29646
  }, 'VStepperActions');
@@ -30895,6 +31120,7 @@
30895
31120
  VForm: VForm,
30896
31121
  VHover: VHover,
30897
31122
  VIcon: VIcon,
31123
+ VIconBtn: VIconBtn,
30898
31124
  VImg: VImg,
30899
31125
  VInfiniteScroll: VInfiniteScroll,
30900
31126
  VInput: VInput,
@@ -31314,7 +31540,7 @@
31314
31540
  };
31315
31541
  });
31316
31542
  }
31317
- const version$1 = "3.8.0-beta.0-dev.2025-03-25";
31543
+ const version$1 = "3.8.0-beta.0-dev.2025-03-29";
31318
31544
  createVuetify$1.version = version$1;
31319
31545
 
31320
31546
  // Vue's inject() can only be used in setup
@@ -31599,7 +31825,7 @@
31599
31825
 
31600
31826
  /* eslint-disable local-rules/sort-imports */
31601
31827
 
31602
- const version = "3.8.0-beta.0-dev.2025-03-25";
31828
+ const version = "3.8.0-beta.0-dev.2025-03-29";
31603
31829
 
31604
31830
  /* eslint-disable local-rules/sort-imports */
31605
31831