@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
  */
@@ -18439,6 +18439,10 @@ const makeVConfirmEditProps = propsFactory({
18439
18439
  type: String,
18440
18440
  default: '$vuetify.confirmEdit.ok'
18441
18441
  },
18442
+ disabled: {
18443
+ type: [Boolean, Array],
18444
+ default: undefined
18445
+ },
18442
18446
  hideActions: Boolean
18443
18447
  }, 'VConfirmEdit');
18444
18448
  const VConfirmEdit = genericComponent()({
@@ -18465,6 +18469,17 @@ const VConfirmEdit = genericComponent()({
18465
18469
  const isPristine = computed(() => {
18466
18470
  return deepEqual(model.value, internalModel.value);
18467
18471
  });
18472
+ function isActionDisabled(action) {
18473
+ if (typeof props.disabled === 'boolean') {
18474
+ return props.disabled;
18475
+ }
18476
+ if (Array.isArray(props.disabled)) {
18477
+ return props.disabled.includes(action);
18478
+ }
18479
+ return isPristine.value;
18480
+ }
18481
+ const isSaveDisabled = computed(() => isActionDisabled('save'));
18482
+ const isCancelDisabled = computed(() => isActionDisabled('cancel'));
18468
18483
  function save() {
18469
18484
  model.value = internalModel.value;
18470
18485
  emit('save', internalModel.value);
@@ -18475,13 +18490,13 @@ const VConfirmEdit = genericComponent()({
18475
18490
  }
18476
18491
  function actions(actionsProps) {
18477
18492
  return createVNode(Fragment, null, [createVNode(VBtn, mergeProps({
18478
- "disabled": isPristine.value,
18493
+ "disabled": isCancelDisabled.value,
18479
18494
  "variant": "text",
18480
18495
  "color": props.color,
18481
18496
  "onClick": cancel,
18482
18497
  "text": t(props.cancelText)
18483
18498
  }, actionsProps), null), createVNode(VBtn, mergeProps({
18484
- "disabled": isPristine.value,
18499
+ "disabled": isSaveDisabled.value,
18485
18500
  "variant": "text",
18486
18501
  "color": props.color,
18487
18502
  "onClick": save,
@@ -21936,7 +21951,10 @@ const makeCalendarProps = propsFactory({
21936
21951
  type: String,
21937
21952
  default: 'dynamic'
21938
21953
  },
21939
- firstDayOfWeek: [Number, String]
21954
+ firstDayOfWeek: {
21955
+ type: [Number, String],
21956
+ default: 0
21957
+ }
21940
21958
  }, 'calendar');
21941
21959
  function useCalendar(props) {
21942
21960
  const adapter = useDate();
@@ -21957,15 +21975,15 @@ function useCalendar(props) {
21957
21975
  const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value));
21958
21976
  return adapter.setMonth(date, value);
21959
21977
  }, v => adapter.getMonth(v));
21960
- const defaultFirstDayOfWeek = computed(() => {
21961
- return props.firstDayOfWeek ?? props.weekdays[0];
21962
- });
21963
21978
  const weekDays = computed(() => {
21964
- const firstDayOfWeek = Number(props.firstDayOfWeek ?? 0);
21965
- return props.weekdays.map(day => (day + firstDayOfWeek) % 7);
21979
+ const firstDayOfWeek = Number(props.firstDayOfWeek);
21980
+
21981
+ // Always generate all days, regardless of props.weekdays
21982
+ return [0, 1, 2, 3, 4, 5, 6].map(day => (day + firstDayOfWeek) % 7);
21966
21983
  });
21967
21984
  const weeksInMonth = computed(() => {
21968
- const weeks = adapter.getWeekArray(month.value, defaultFirstDayOfWeek.value);
21985
+ const firstDayOfWeek = Number(props.firstDayOfWeek);
21986
+ const weeks = adapter.getWeekArray(month.value, firstDayOfWeek);
21969
21987
  const days = weeks.flat();
21970
21988
 
21971
21989
  // Make sure there's always 6 weeks in month (6 * 7 days)
@@ -22043,7 +22061,7 @@ function useCalendar(props) {
22043
22061
  if (typeof props.allowedDates === 'function') {
22044
22062
  return !props.allowedDates(date);
22045
22063
  }
22046
- return false;
22064
+ return !props.weekdays.includes(adapter.toJsDate(date).getDay());
22047
22065
  }
22048
22066
  return {
22049
22067
  displayValue,
@@ -28936,6 +28954,7 @@ const makeVDateInputProps = propsFactory({
28936
28954
  type: String,
28937
28955
  default: 'bottom start'
28938
28956
  },
28957
+ ...makeDisplayProps(),
28939
28958
  ...makeFocusProps(),
28940
28959
  ...makeVConfirmEditProps({
28941
28960
  hideActions: true
@@ -28966,6 +28985,9 @@ const VDateInput = genericComponent()({
28966
28985
  t
28967
28986
  } = useLocale();
28968
28987
  const adapter = useDate();
28988
+ const {
28989
+ mobile
28990
+ } = useDisplay();
28969
28991
  const {
28970
28992
  isFocused,
28971
28993
  focus,
@@ -28973,7 +28995,9 @@ const VDateInput = genericComponent()({
28973
28995
  } = useFocus(props);
28974
28996
  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);
28975
28997
  const menu = shallowRef(false);
28998
+ const isEditingInput = shallowRef(false);
28976
28999
  const vDateInputRef = ref();
29000
+ const disabledActions = ref(['save']);
28977
29001
  function format(date) {
28978
29002
  if (typeof props.displayFormat === 'function') {
28979
29003
  return props.displayFormat(date);
@@ -28994,7 +29018,18 @@ const VDateInput = genericComponent()({
28994
29018
  }
28995
29019
  return adapter.isValid(model.value) ? format(adapter.date(model.value)) : '';
28996
29020
  });
29021
+ const inputmode = computed(() => {
29022
+ if (!mobile.value) return undefined;
29023
+ if (isEditingInput.value) return 'text';
29024
+ return 'none';
29025
+ });
28997
29026
  const isInteractive = computed(() => !props.disabled && !props.readonly);
29027
+ const isReadonly = computed(() => !(mobile.value && isEditingInput.value) && props.readonly);
29028
+ watch(menu, val => {
29029
+ if (val) return;
29030
+ isEditingInput.value = false;
29031
+ disabledActions.value = ['save'];
29032
+ });
28998
29033
  function onKeydown(e) {
28999
29034
  if (e.key !== 'Enter') return;
29000
29035
  if (!menu.value || !isFocused.value) {
@@ -29007,11 +29042,16 @@ const VDateInput = genericComponent()({
29007
29042
  function onClick(e) {
29008
29043
  e.preventDefault();
29009
29044
  e.stopPropagation();
29010
- menu.value = true;
29045
+ if (menu.value && mobile.value) {
29046
+ isEditingInput.value = true;
29047
+ } else {
29048
+ menu.value = true;
29049
+ }
29011
29050
  }
29012
29051
  function onCancel() {
29013
29052
  emit('cancel');
29014
29053
  menu.value = false;
29054
+ isEditingInput.value = false;
29015
29055
  }
29016
29056
  function onSave(value) {
29017
29057
  emit('save', value);
@@ -29021,6 +29061,19 @@ const VDateInput = genericComponent()({
29021
29061
  if (value != null) return;
29022
29062
  model.value = null;
29023
29063
  }
29064
+ function onUpdateMenuModel(isMenuOpen) {
29065
+ if (isMenuOpen) return;
29066
+ isEditingInput.value = false;
29067
+ }
29068
+ function onBlur() {
29069
+ blur();
29070
+
29071
+ // When in mobile mode and editing is done (due to keyboard dismissal), close the menu
29072
+ if (mobile.value && isEditingInput.value && !isFocused.value) {
29073
+ menu.value = false;
29074
+ isEditingInput.value = false;
29075
+ }
29076
+ }
29024
29077
  useRender(() => {
29025
29078
  const confirmEditProps = VConfirmEdit.filterProps(props);
29026
29079
  const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
@@ -29031,10 +29084,12 @@ const VDateInput = genericComponent()({
29031
29084
  "class": props.class,
29032
29085
  "style": props.style,
29033
29086
  "modelValue": display.value,
29087
+ "inputmode": inputmode.value,
29088
+ "readonly": isReadonly.value,
29034
29089
  "onKeydown": isInteractive.value ? onKeydown : undefined,
29035
29090
  "focused": menu.value || isFocused.value,
29036
29091
  "onFocus": focus,
29037
- "onBlur": blur,
29092
+ "onBlur": onBlur,
29038
29093
  "onClick:control": isInteractive.value ? onClick : undefined,
29039
29094
  "onClick:prepend": isInteractive.value ? onClick : undefined,
29040
29095
  "onUpdate:modelValue": onUpdateDisplayModel
@@ -29042,7 +29097,7 @@ const VDateInput = genericComponent()({
29042
29097
  ...slots,
29043
29098
  default: () => createVNode(Fragment, null, [createVNode(VMenu, {
29044
29099
  "modelValue": menu.value,
29045
- "onUpdate:modelValue": $event => menu.value = $event,
29100
+ "onUpdate:modelValue": [$event => menu.value = $event, onUpdateMenuModel],
29046
29101
  "activator": "parent",
29047
29102
  "min-width": "0",
29048
29103
  "eager": isFocused.value,
@@ -29053,6 +29108,7 @@ const VDateInput = genericComponent()({
29053
29108
  default: () => [createVNode(VConfirmEdit, mergeProps(confirmEditProps, {
29054
29109
  "modelValue": model.value,
29055
29110
  "onUpdate:modelValue": $event => model.value = $event,
29111
+ "disabled": disabledActions.value,
29056
29112
  "onSave": onSave,
29057
29113
  "onCancel": onCancel
29058
29114
  }), {
@@ -29075,6 +29131,7 @@ const VDateInput = genericComponent()({
29075
29131
  }
29076
29132
  emit('save', value);
29077
29133
  vDateInputRef.value?.blur();
29134
+ disabledActions.value = [];
29078
29135
  }
29079
29136
  return createVNode(VDatePicker, mergeProps(datePickerProps, {
29080
29137
  "modelValue": props.hideActions ? model.value : proxyModel.value,
@@ -29412,6 +29469,174 @@ const VFileUpload = genericComponent()({
29412
29469
 
29413
29470
  // Types
29414
29471
 
29472
+ const makeVIconBtnProps = propsFactory({
29473
+ active: {
29474
+ type: Boolean,
29475
+ default: undefined
29476
+ },
29477
+ activeColor: String,
29478
+ activeIcon: [String, Function, Object],
29479
+ activeVariant: String,
29480
+ baseVariant: {
29481
+ type: String,
29482
+ default: 'tonal'
29483
+ },
29484
+ disabled: Boolean,
29485
+ height: [Number, String],
29486
+ width: [Number, String],
29487
+ hideOverlay: Boolean,
29488
+ icon: [String, Function, Object],
29489
+ iconColor: String,
29490
+ iconSize: {
29491
+ type: [Number, String],
29492
+ default: 'default'
29493
+ },
29494
+ iconSizes: {
29495
+ type: Array,
29496
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
29497
+ },
29498
+ loading: Boolean,
29499
+ opacity: [Number, String],
29500
+ readonly: Boolean,
29501
+ rotate: [Number, String],
29502
+ size: {
29503
+ type: [Number, String],
29504
+ default: 'default'
29505
+ },
29506
+ sizes: {
29507
+ type: Array,
29508
+ default: () => [['x-small', 16], ['small', 24], ['default', 40], ['large', 48], ['x-large', 56]]
29509
+ },
29510
+ text: {
29511
+ type: [String, Number, Boolean],
29512
+ default: undefined
29513
+ },
29514
+ ...makeBorderProps(),
29515
+ ...makeComponentProps(),
29516
+ ...makeElevationProps(),
29517
+ ...makeRoundedProps(),
29518
+ ...makeTagProps({
29519
+ tag: 'button'
29520
+ }),
29521
+ ...makeThemeProps(),
29522
+ ...makeVariantProps({
29523
+ variant: 'flat'
29524
+ })
29525
+ }, 'VIconBtn');
29526
+ const VIconBtn = genericComponent()({
29527
+ name: 'VIconBtn',
29528
+ props: makeVIconBtnProps(),
29529
+ emits: {
29530
+ 'update:active': value => true
29531
+ },
29532
+ setup(props, _ref) {
29533
+ let {
29534
+ attrs,
29535
+ slots
29536
+ } = _ref;
29537
+ const isActive = useProxiedModel(props, 'active');
29538
+ const {
29539
+ themeClasses
29540
+ } = provideTheme(props);
29541
+ const {
29542
+ borderClasses
29543
+ } = useBorder(props);
29544
+ const {
29545
+ elevationClasses
29546
+ } = useElevation(props);
29547
+ const {
29548
+ roundedClasses
29549
+ } = useRounded(props);
29550
+ const {
29551
+ colorClasses,
29552
+ colorStyles,
29553
+ variantClasses
29554
+ } = useVariant(toRef(() => ({
29555
+ color: (() => {
29556
+ if (props.disabled) return undefined;
29557
+ if (!isActive.value) return props.color;
29558
+ // Use an inline fallback as opposed to setting a default color
29559
+ // because non-toggle buttons are default flat whereas toggle
29560
+ // buttons are default tonal and active flat. The exact use
29561
+ // case for this is a toggle button with no active color.
29562
+ return props.activeColor ?? props.color ?? 'surface-variant';
29563
+ })(),
29564
+ variant: (() => {
29565
+ if (isActive.value === undefined) return props.variant;
29566
+ if (isActive.value) return props.activeVariant ?? props.variant;
29567
+ return props.baseVariant ?? props.variant;
29568
+ })()
29569
+ })));
29570
+ const btnSizeMap = new Map(props.sizes);
29571
+ const iconSizeMap = new Map(props.iconSizes);
29572
+ function onClick() {
29573
+ if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
29574
+ isActive.value = !isActive.value;
29575
+ }
29576
+ useRender(() => {
29577
+ const icon = isActive.value ? props.activeIcon ?? props.icon : props.icon;
29578
+ const size = props.size;
29579
+ const hasNamedSize = btnSizeMap.has(size);
29580
+ const btnSize = hasNamedSize ? btnSizeMap.get(size) : size;
29581
+ const btnHeight = props.height ?? btnSize;
29582
+ const btnWidth = props.width ?? btnSize;
29583
+ const _iconSize = hasNamedSize ? size : props.iconSize ?? size;
29584
+ const iconSize = iconSizeMap.get(_iconSize) ?? _iconSize;
29585
+ const iconProps = {
29586
+ icon,
29587
+ size: iconSize,
29588
+ iconColor: props.iconColor,
29589
+ opacity: props.opacity
29590
+ };
29591
+ return createVNode(props.tag, {
29592
+ "class": [{
29593
+ 'v-icon-btn': true,
29594
+ 'v-icon-btn--active': isActive.value,
29595
+ 'v-icon-btn--disabled': props.disabled,
29596
+ 'v-icon-btn--loading': props.loading,
29597
+ 'v-icon-btn--readonly': props.readonly,
29598
+ [`v-icon-btn--${props.size}`]: true
29599
+ }, themeClasses.value, colorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, variantClasses.value, props.class],
29600
+ "style": [{
29601
+ '--v-icon-btn-rotate': convertToUnit(props.rotate, 'deg'),
29602
+ '--v-icon-btn-height': convertToUnit(btnHeight),
29603
+ '--v-icon-btn-width': convertToUnit(btnWidth)
29604
+ }, colorStyles.value, props.style],
29605
+ "tabindex": props.disabled || props.readonly ? -1 : 0,
29606
+ "onClick": onClick
29607
+ }, {
29608
+ default: () => [genOverlays(!props.hideOverlay, 'v-icon-btn'), createVNode("div", {
29609
+ "class": "v-icon-btn__content",
29610
+ "data-no-activator": ""
29611
+ }, [!slots.default && icon ? createVNode(VIcon, mergeProps({
29612
+ "key": "content-icon"
29613
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
29614
+ "key": "content-defaults",
29615
+ "disabled": !icon,
29616
+ "defaults": {
29617
+ VIcon: {
29618
+ ...iconProps
29619
+ }
29620
+ }
29621
+ }, {
29622
+ default: () => slots.default?.() ?? toDisplayString(props.text)
29623
+ })]), !!props.loading && createVNode("span", {
29624
+ "key": "loader",
29625
+ "class": "v-icon-btn__loader"
29626
+ }, [slots.loader?.() ?? createVNode(VProgressCircular, {
29627
+ "color": typeof props.loading === 'boolean' ? undefined : props.loading,
29628
+ "indeterminate": "disable-shrink",
29629
+ "width": "2",
29630
+ "size": iconSize
29631
+ }, null)])]
29632
+ });
29633
+ });
29634
+ return {};
29635
+ }
29636
+ });
29637
+
29638
+ // Types
29639
+
29415
29640
  const makeVStepperVerticalActionsProps = propsFactory({
29416
29641
  ...makeVStepperActionsProps()
29417
29642
  }, 'VStepperActions');
@@ -30891,6 +31116,7 @@ var components = /*#__PURE__*/Object.freeze({
30891
31116
  VForm: VForm,
30892
31117
  VHover: VHover,
30893
31118
  VIcon: VIcon,
31119
+ VIconBtn: VIconBtn,
30894
31120
  VImg: VImg,
30895
31121
  VInfiniteScroll: VInfiniteScroll,
30896
31122
  VInput: VInput,
@@ -31310,7 +31536,7 @@ function createVuetify$1() {
31310
31536
  };
31311
31537
  });
31312
31538
  }
31313
- const version$1 = "3.8.0-beta.0-dev.2025-03-25";
31539
+ const version$1 = "3.8.0-beta.0-dev.2025-03-29";
31314
31540
  createVuetify$1.version = version$1;
31315
31541
 
31316
31542
  // Vue's inject() can only be used in setup
@@ -31595,7 +31821,7 @@ var index = /*#__PURE__*/Object.freeze({
31595
31821
 
31596
31822
  /* eslint-disable local-rules/sort-imports */
31597
31823
 
31598
- const version = "3.8.0-beta.0-dev.2025-03-25";
31824
+ const version = "3.8.0-beta.0-dev.2025-03-29";
31599
31825
 
31600
31826
  /* eslint-disable local-rules/sort-imports */
31601
31827