@vuetify/nightly 3.8.0-beta.0-dev.2025-03-24 → 3.8.0-beta.0-dev.2025-03-26

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 (46) hide show
  1. package/CHANGELOG.md +83 -3
  2. package/dist/json/attributes.json +1534 -1522
  3. package/dist/json/importMap-labs.json +30 -30
  4. package/dist/json/importMap.json +138 -138
  5. package/dist/json/tags.json +3 -0
  6. package/dist/json/web-types.json +3219 -3169
  7. package/dist/vuetify-labs.cjs +101 -28
  8. package/dist/vuetify-labs.css +3682 -3682
  9. package/dist/vuetify-labs.d.ts +124 -81
  10. package/dist/vuetify-labs.esm.js +101 -28
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +101 -28
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +25 -10
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +5460 -5460
  17. package/dist/vuetify.d.ts +82 -79
  18. package/dist/vuetify.esm.js +25 -10
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +25 -10
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +10 -10
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VDataTable/VDataTable.d.ts +4 -4
  26. package/lib/components/VDataTable/VDataTableRow.d.ts +9 -6
  27. package/lib/components/VDataTable/VDataTableRow.js +18 -3
  28. package/lib/components/VDataTable/VDataTableRow.js.map +1 -1
  29. package/lib/components/VDataTable/VDataTableRows.d.ts +4 -4
  30. package/lib/components/VDataTable/VDataTableServer.d.ts +4 -4
  31. package/lib/components/VDataTable/VDataTableVirtual.d.ts +4 -4
  32. package/lib/components/VDatePicker/VDatePicker.js +1 -1
  33. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  34. package/lib/components/VIcon/VIcon.js +2 -2
  35. package/lib/components/VIcon/VIcon.js.map +1 -1
  36. package/lib/composables/calendar.js +1 -1
  37. package/lib/composables/calendar.js.map +1 -1
  38. package/lib/entry-bundler.js +1 -1
  39. package/lib/framework.d.ts +47 -47
  40. package/lib/framework.js +1 -1
  41. package/lib/labs/VDateInput/VDateInput.d.ts +70 -3
  42. package/lib/labs/VDateInput/VDateInput.js +78 -19
  43. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  44. package/lib/util/helpers.js +1 -1
  45. package/lib/util/helpers.js.map +1 -1
  46. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.0-beta.0-dev.2025-03-24
2
+ * Vuetify v3.8.0-beta.0-dev.2025-03-26
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -233,7 +233,7 @@
233
233
  function pick(obj, paths) {
234
234
  const found = {};
235
235
  for (const key of paths) {
236
- if (Object.hasOwn(obj, key)) {
236
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
237
237
  found[key] = obj[key];
238
238
  }
239
239
  }
@@ -4686,7 +4686,7 @@
4686
4686
  const slotIcon = vue.ref();
4687
4687
  const {
4688
4688
  themeClasses
4689
- } = provideTheme(props);
4689
+ } = useTheme();
4690
4690
  const {
4691
4691
  iconData
4692
4692
  } = useIcon(vue.computed(() => slotIcon.value || props.icon));
@@ -20571,22 +20571,37 @@
20571
20571
  "width": !mobile.value ? column.width : undefined
20572
20572
  }, cellProps, columnCellProps), {
20573
20573
  default: () => {
20574
- if (slots[slotName] && !mobile.value) return slots[slotName]?.(slotProps);
20575
20574
  if (column.key === 'data-table-select') {
20576
- return slots['item.data-table-select']?.(slotProps) ?? vue.createVNode(VCheckboxBtn, {
20575
+ return slots['item.data-table-select']?.({
20576
+ ...slotProps,
20577
+ props: {
20578
+ disabled: !item.selectable,
20579
+ modelValue: isSelected([item]),
20580
+ onClick: vue.withModifiers(() => toggleSelect(item), ['stop'])
20581
+ }
20582
+ }) ?? vue.createVNode(VCheckboxBtn, {
20577
20583
  "disabled": !item.selectable,
20578
20584
  "modelValue": isSelected([item]),
20579
20585
  "onClick": vue.withModifiers(event => toggleSelect(item, props.index, event), ['stop'])
20580
20586
  }, null);
20581
20587
  }
20582
20588
  if (column.key === 'data-table-expand') {
20583
- return slots['item.data-table-expand']?.(slotProps) ?? vue.createVNode(VBtn, {
20589
+ return slots['item.data-table-expand']?.({
20590
+ ...slotProps,
20591
+ props: {
20592
+ icon: isExpanded(item) ? '$collapse' : '$expand',
20593
+ size: 'small',
20594
+ variant: 'text',
20595
+ onClick: vue.withModifiers(() => toggleExpand(item), ['stop'])
20596
+ }
20597
+ }) ?? vue.createVNode(VBtn, {
20584
20598
  "icon": isExpanded(item) ? '$collapse' : '$expand',
20585
20599
  "size": "small",
20586
20600
  "variant": "text",
20587
20601
  "onClick": vue.withModifiers(() => toggleExpand(item), ['stop'])
20588
20602
  }, null);
20589
20603
  }
20604
+ if (slots[slotName] && !mobile.value) return slots[slotName](slotProps);
20590
20605
  const displayValue = vue.toDisplayString(slotProps.value);
20591
20606
  return !mobile.value ? displayValue : vue.createVNode(vue.Fragment, null, [vue.createVNode("div", {
20592
20607
  "class": "v-data-table__td-title"
@@ -21929,7 +21944,7 @@
21929
21944
  }, 'calendar');
21930
21945
  function useCalendar(props) {
21931
21946
  const adapter = useDate();
21932
- const model = useProxiedModel(props, 'modelValue', [], v => wrapInArray(v));
21947
+ const model = useProxiedModel(props, 'modelValue', [], v => wrapInArray(v).map(i => adapter.date(i)));
21933
21948
  const displayValue = vue.computed(() => {
21934
21949
  if (props.displayValue) return adapter.date(props.displayValue);
21935
21950
  if (model.value.length > 0) return adapter.date(model.value[0]);
@@ -22442,7 +22457,7 @@
22442
22457
  const {
22443
22458
  rtlClasses
22444
22459
  } = useRtl();
22445
- const model = useProxiedModel(props, 'modelValue', undefined, v => wrapInArray(v), v => props.multiple ? v : v[0]);
22460
+ const model = useProxiedModel(props, 'modelValue', undefined, v => wrapInArray(v).map(i => adapter.date(i)), v => props.multiple ? v : v[0]);
22446
22461
  const viewMode = useProxiedModel(props, 'viewMode');
22447
22462
  // const inputMode = useProxiedModel(props, 'inputMode')
22448
22463
 
@@ -28920,12 +28935,16 @@
28920
28935
  // Types
28921
28936
 
28922
28937
  const makeVDateInputProps = propsFactory({
28938
+ displayFormat: [Function, String],
28923
28939
  location: {
28924
28940
  type: String,
28925
28941
  default: 'bottom start'
28926
28942
  },
28943
+ ...makeDisplayProps(),
28927
28944
  ...makeFocusProps(),
28928
- ...makeVConfirmEditProps(),
28945
+ ...makeVConfirmEditProps({
28946
+ hideActions: true
28947
+ }),
28929
28948
  ...makeVTextFieldProps({
28930
28949
  placeholder: 'mm/dd/yyyy',
28931
28950
  prependIcon: '$calendar'
@@ -28939,16 +28958,22 @@
28939
28958
  name: 'VDateInput',
28940
28959
  props: makeVDateInputProps(),
28941
28960
  emits: {
28961
+ save: value => true,
28962
+ cancel: () => true,
28942
28963
  'update:modelValue': val => true
28943
28964
  },
28944
28965
  setup(props, _ref) {
28945
28966
  let {
28967
+ emit,
28946
28968
  slots
28947
28969
  } = _ref;
28948
28970
  const {
28949
28971
  t
28950
28972
  } = useLocale();
28951
28973
  const adapter = useDate();
28974
+ const {
28975
+ mobile
28976
+ } = useDisplay();
28952
28977
  const {
28953
28978
  isFocused,
28954
28979
  focus,
@@ -28956,7 +28981,14 @@
28956
28981
  } = useFocus(props);
28957
28982
  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);
28958
28983
  const menu = vue.shallowRef(false);
28984
+ const isEditingInput = vue.shallowRef(false);
28959
28985
  const vDateInputRef = vue.ref();
28986
+ function format(date) {
28987
+ if (typeof props.displayFormat === 'function') {
28988
+ return props.displayFormat(date);
28989
+ }
28990
+ return adapter.format(date, props.displayFormat ?? 'keyboardDate');
28991
+ }
28960
28992
  const display = vue.computed(() => {
28961
28993
  const value = wrapInArray(model.value);
28962
28994
  if (!value.length) return null;
@@ -28966,11 +28998,22 @@
28966
28998
  if (props.multiple === 'range') {
28967
28999
  const start = value[0];
28968
29000
  const end = value[value.length - 1];
28969
- return adapter.isValid(start) && adapter.isValid(end) ? `${adapter.format(adapter.date(start), 'keyboardDate')} - ${adapter.format(adapter.date(end), 'keyboardDate')}` : '';
29001
+ if (!adapter.isValid(start) || !adapter.isValid(end)) return '';
29002
+ return `${format(adapter.date(start))} - ${format(adapter.date(end))}`;
28970
29003
  }
28971
- return adapter.isValid(model.value) ? adapter.format(adapter.date(model.value), 'keyboardDate') : '';
29004
+ return adapter.isValid(model.value) ? format(adapter.date(model.value)) : '';
29005
+ });
29006
+ const inputmode = vue.computed(() => {
29007
+ if (!mobile.value) return undefined;
29008
+ if (isEditingInput.value) return 'text';
29009
+ return 'none';
28972
29010
  });
28973
29011
  const isInteractive = vue.computed(() => !props.disabled && !props.readonly);
29012
+ const isReadonly = vue.computed(() => !(mobile.value && isEditingInput.value) && props.readonly);
29013
+ vue.watch(menu, val => {
29014
+ if (val) return;
29015
+ isEditingInput.value = false;
29016
+ });
28974
29017
  function onKeydown(e) {
28975
29018
  if (e.key !== 'Enter') return;
28976
29019
  if (!menu.value || !isFocused.value) {
@@ -28983,15 +29026,38 @@
28983
29026
  function onClick(e) {
28984
29027
  e.preventDefault();
28985
29028
  e.stopPropagation();
28986
- menu.value = true;
29029
+ if (menu.value && mobile.value) {
29030
+ isEditingInput.value = true;
29031
+ } else {
29032
+ menu.value = true;
29033
+ }
29034
+ }
29035
+ function onCancel() {
29036
+ emit('cancel');
29037
+ menu.value = false;
29038
+ isEditingInput.value = false;
28987
29039
  }
28988
- function onSave() {
29040
+ function onSave(value) {
29041
+ emit('save', value);
28989
29042
  menu.value = false;
28990
29043
  }
28991
- function onUpdateModel(value) {
29044
+ function onUpdateDisplayModel(value) {
28992
29045
  if (value != null) return;
28993
29046
  model.value = null;
28994
29047
  }
29048
+ function onUpdateMenuModel(isMenuOpen) {
29049
+ if (isMenuOpen) return;
29050
+ isEditingInput.value = false;
29051
+ }
29052
+ function onBlur() {
29053
+ blur();
29054
+
29055
+ // When in mobile mode and editing is done (due to keyboard dismissal), close the menu
29056
+ if (mobile.value && isEditingInput.value && !isFocused.value) {
29057
+ menu.value = false;
29058
+ isEditingInput.value = false;
29059
+ }
29060
+ }
28995
29061
  useRender(() => {
28996
29062
  const confirmEditProps = VConfirmEdit.filterProps(props);
28997
29063
  const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
@@ -29002,18 +29068,20 @@
29002
29068
  "class": props.class,
29003
29069
  "style": props.style,
29004
29070
  "modelValue": display.value,
29071
+ "inputmode": inputmode.value,
29072
+ "readonly": isReadonly.value,
29005
29073
  "onKeydown": isInteractive.value ? onKeydown : undefined,
29006
29074
  "focused": menu.value || isFocused.value,
29007
29075
  "onFocus": focus,
29008
- "onBlur": blur,
29076
+ "onBlur": onBlur,
29009
29077
  "onClick:control": isInteractive.value ? onClick : undefined,
29010
29078
  "onClick:prepend": isInteractive.value ? onClick : undefined,
29011
- "onUpdate:modelValue": onUpdateModel
29079
+ "onUpdate:modelValue": onUpdateDisplayModel
29012
29080
  }), {
29013
29081
  ...slots,
29014
29082
  default: () => vue.createVNode(vue.Fragment, null, [vue.createVNode(VMenu, {
29015
29083
  "modelValue": menu.value,
29016
- "onUpdate:modelValue": $event => menu.value = $event,
29084
+ "onUpdate:modelValue": [$event => menu.value = $event, onUpdateMenuModel],
29017
29085
  "activator": "parent",
29018
29086
  "min-width": "0",
29019
29087
  "eager": isFocused.value,
@@ -29025,7 +29093,7 @@
29025
29093
  "modelValue": model.value,
29026
29094
  "onUpdate:modelValue": $event => model.value = $event,
29027
29095
  "onSave": onSave,
29028
- "onCancel": () => menu.value = false
29096
+ "onCancel": onCancel
29029
29097
  }), {
29030
29098
  default: _ref2 => {
29031
29099
  let {
@@ -29035,16 +29103,21 @@
29035
29103
  cancel,
29036
29104
  isPristine
29037
29105
  } = _ref2;
29106
+ function onUpdateModel(value) {
29107
+ if (!props.hideActions) {
29108
+ proxyModel.value = value;
29109
+ } else {
29110
+ model.value = value;
29111
+ if (!props.multiple) {
29112
+ menu.value = false;
29113
+ }
29114
+ }
29115
+ emit('save', value);
29116
+ vDateInputRef.value?.blur();
29117
+ }
29038
29118
  return vue.createVNode(VDatePicker, vue.mergeProps(datePickerProps, {
29039
29119
  "modelValue": props.hideActions ? model.value : proxyModel.value,
29040
- "onUpdate:modelValue": val => {
29041
- if (!props.hideActions) {
29042
- proxyModel.value = val;
29043
- } else {
29044
- model.value = val;
29045
- if (!props.multiple) menu.value = false;
29046
- }
29047
- },
29120
+ "onUpdate:modelValue": value => onUpdateModel(value),
29048
29121
  "onMousedown": e => e.preventDefault()
29049
29122
  }), {
29050
29123
  actions: !props.hideActions ? () => slots.actions?.({
@@ -31276,7 +31349,7 @@
31276
31349
  };
31277
31350
  });
31278
31351
  }
31279
- const version$1 = "3.8.0-beta.0-dev.2025-03-24";
31352
+ const version$1 = "3.8.0-beta.0-dev.2025-03-26";
31280
31353
  createVuetify$1.version = version$1;
31281
31354
 
31282
31355
  // Vue's inject() can only be used in setup
@@ -31561,7 +31634,7 @@
31561
31634
 
31562
31635
  /* eslint-disable local-rules/sort-imports */
31563
31636
 
31564
- const version = "3.8.0-beta.0-dev.2025-03-24";
31637
+ const version = "3.8.0-beta.0-dev.2025-03-26";
31565
31638
 
31566
31639
  /* eslint-disable local-rules/sort-imports */
31567
31640