vuetify 3.7.17 → 3.7.19

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 (43) hide show
  1. package/dist/json/attributes.json +3397 -3385
  2. package/dist/json/importMap-labs.json +16 -16
  3. package/dist/json/importMap.json +168 -168
  4. package/dist/json/tags.json +3 -0
  5. package/dist/json/web-types.json +6343 -6293
  6. package/dist/vuetify-labs.css +3200 -3200
  7. package/dist/vuetify-labs.d.ts +77 -35
  8. package/dist/vuetify-labs.esm.js +116 -37
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +116 -37
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +2769 -2769
  13. package/dist/vuetify.d.ts +95 -92
  14. package/dist/vuetify.esm.js +43 -20
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +43 -20
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +12 -12
  20. package/dist/vuetify.min.js.map +1 -1
  21. package/lib/components/VDataTable/VDataTableRow.mjs +18 -3
  22. package/lib/components/VDataTable/VDataTableRow.mjs.map +1 -1
  23. package/lib/components/VDataTable/index.d.mts +91 -88
  24. package/lib/components/VDatePicker/VDatePicker.mjs +1 -1
  25. package/lib/components/VDatePicker/VDatePicker.mjs.map +1 -1
  26. package/lib/components/VDatePicker/VDatePickerMonth.mjs +21 -12
  27. package/lib/components/VDatePicker/VDatePickerMonth.mjs.map +1 -1
  28. package/lib/components/VDatePicker/index.d.mts +3 -3
  29. package/lib/components/VIcon/VIcon.mjs +2 -2
  30. package/lib/components/VIcon/VIcon.mjs.map +1 -1
  31. package/lib/components/index.d.mts +38 -35
  32. package/lib/composables/calendar.mjs +1 -1
  33. package/lib/composables/calendar.mjs.map +1 -1
  34. package/lib/entry-bundler.mjs +1 -1
  35. package/lib/framework.mjs +1 -1
  36. package/lib/index.d.mts +57 -57
  37. package/lib/labs/VDateInput/VDateInput.mjs +75 -18
  38. package/lib/labs/VDateInput/VDateInput.mjs.map +1 -1
  39. package/lib/labs/VDateInput/index.d.mts +43 -0
  40. package/lib/labs/components.d.mts +43 -4
  41. package/lib/util/helpers.mjs +1 -1
  42. package/lib/util/helpers.mjs.map +1 -1
  43. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.7.17
2
+ * Vuetify v3.7.19
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
  }
@@ -4674,7 +4674,7 @@
4674
4674
  const slotIcon = vue.ref();
4675
4675
  const {
4676
4676
  themeClasses
4677
- } = provideTheme(props);
4677
+ } = useTheme();
4678
4678
  const {
4679
4679
  iconData
4680
4680
  } = useIcon(vue.computed(() => slotIcon.value || props.icon));
@@ -20347,22 +20347,37 @@
20347
20347
  "width": !mobile.value ? column.width : undefined
20348
20348
  }, cellProps, columnCellProps), {
20349
20349
  default: () => {
20350
- if (slots[slotName] && !mobile.value) return slots[slotName]?.(slotProps);
20351
20350
  if (column.key === 'data-table-select') {
20352
- return slots['item.data-table-select']?.(slotProps) ?? vue.createVNode(VCheckboxBtn, {
20351
+ return slots['item.data-table-select']?.({
20352
+ ...slotProps,
20353
+ props: {
20354
+ disabled: !item.selectable,
20355
+ modelValue: isSelected([item]),
20356
+ onClick: vue.withModifiers(() => toggleSelect(item), ['stop'])
20357
+ }
20358
+ }) ?? vue.createVNode(VCheckboxBtn, {
20353
20359
  "disabled": !item.selectable,
20354
20360
  "modelValue": isSelected([item]),
20355
20361
  "onClick": vue.withModifiers(() => toggleSelect(item), ['stop'])
20356
20362
  }, null);
20357
20363
  }
20358
20364
  if (column.key === 'data-table-expand') {
20359
- return slots['item.data-table-expand']?.(slotProps) ?? vue.createVNode(VBtn, {
20365
+ return slots['item.data-table-expand']?.({
20366
+ ...slotProps,
20367
+ props: {
20368
+ icon: isExpanded(item) ? '$collapse' : '$expand',
20369
+ size: 'small',
20370
+ variant: 'text',
20371
+ onClick: vue.withModifiers(() => toggleExpand(item), ['stop'])
20372
+ }
20373
+ }) ?? vue.createVNode(VBtn, {
20360
20374
  "icon": isExpanded(item) ? '$collapse' : '$expand',
20361
20375
  "size": "small",
20362
20376
  "variant": "text",
20363
20377
  "onClick": vue.withModifiers(() => toggleExpand(item), ['stop'])
20364
20378
  }, null);
20365
20379
  }
20380
+ if (slots[slotName] && !mobile.value) return slots[slotName](slotProps);
20366
20381
  const displayValue = vue.toDisplayString(slotProps.value);
20367
20382
  return !mobile.value ? displayValue : vue.createVNode(vue.Fragment, null, [vue.createVNode("div", {
20368
20383
  "class": "v-data-table__td-title"
@@ -21691,7 +21706,7 @@
21691
21706
  }, 'calendar');
21692
21707
  function useCalendar(props) {
21693
21708
  const adapter = useDate();
21694
- const model = useProxiedModel(props, 'modelValue', [], v => wrapInArray(v));
21709
+ const model = useProxiedModel(props, 'modelValue', [], v => wrapInArray(v).map(i => adapter.date(i)));
21695
21710
  const displayValue = vue.computed(() => {
21696
21711
  if (props.displayValue) return adapter.date(props.displayValue);
21697
21712
  if (model.value.length > 0) return adapter.date(model.value[0]);
@@ -21920,7 +21935,7 @@
21920
21935
  model.value = [value];
21921
21936
  }
21922
21937
  }
21923
- useRender(() => vue.createVNode("div", {
21938
+ return () => vue.createVNode("div", {
21924
21939
  "class": "v-date-picker-month"
21925
21940
  }, [props.showWeek && vue.createVNode("div", {
21926
21941
  "key": "weeks",
@@ -21942,13 +21957,6 @@
21942
21957
  }, [weekDay])), daysInMonth.value.map((item, i) => {
21943
21958
  const slotProps = {
21944
21959
  props: {
21945
- class: 'v-date-picker-month__day-btn',
21946
- color: (item.isSelected || item.isToday) && !item.isDisabled ? props.color : undefined,
21947
- disabled: item.isDisabled,
21948
- icon: true,
21949
- ripple: false,
21950
- text: item.localized,
21951
- variant: item.isDisabled ? item.isToday ? 'outlined' : 'text' : item.isToday && !item.isSelected ? 'outlined' : 'flat',
21952
21960
  onClick: () => onClick(item.date)
21953
21961
  },
21954
21962
  item,
@@ -21966,9 +21974,24 @@
21966
21974
  'v-date-picker-month__day--week-start': item.isWeekStart
21967
21975
  }],
21968
21976
  "data-v-date": !item.isDisabled ? item.isoDate : undefined
21969
- }, [(props.showAdjacentMonths || !item.isAdjacent) && (slots.day?.(slotProps) ?? vue.createVNode(VBtn, slotProps.props, null))]);
21977
+ }, [(props.showAdjacentMonths || !item.isAdjacent) && vue.createVNode(VDefaultsProvider, {
21978
+ "defaults": {
21979
+ VBtn: {
21980
+ class: 'v-date-picker-month__day-btn',
21981
+ color: (item.isSelected || item.isToday) && !item.isDisabled ? props.color : undefined,
21982
+ disabled: item.isDisabled,
21983
+ icon: true,
21984
+ ripple: false,
21985
+ text: item.localized,
21986
+ variant: item.isDisabled ? item.isToday ? 'outlined' : 'text' : item.isToday && !item.isSelected ? 'outlined' : 'flat',
21987
+ onClick: () => onClick(item.date)
21988
+ }
21989
+ }
21990
+ }, {
21991
+ default: () => [slots.day?.(slotProps) ?? vue.createVNode(VBtn, slotProps.props, null)]
21992
+ })]);
21970
21993
  })])]
21971
- })]));
21994
+ })]);
21972
21995
  }
21973
21996
  });
21974
21997
 
@@ -22264,7 +22287,7 @@
22264
22287
  const {
22265
22288
  t
22266
22289
  } = useLocale();
22267
- const model = useProxiedModel(props, 'modelValue', undefined, v => wrapInArray(v), v => props.multiple ? v : v[0]);
22290
+ const model = useProxiedModel(props, 'modelValue', undefined, v => wrapInArray(v).map(i => adapter.date(i)), v => props.multiple ? v : v[0]);
22268
22291
  const viewMode = useProxiedModel(props, 'viewMode');
22269
22292
  // const inputMode = useProxiedModel(props, 'inputMode')
22270
22293
 
@@ -28233,11 +28256,13 @@
28233
28256
  // Types
28234
28257
 
28235
28258
  const makeVDateInputProps = propsFactory({
28259
+ displayFormat: [Function, String],
28236
28260
  hideActions: Boolean,
28237
28261
  location: {
28238
28262
  type: String,
28239
28263
  default: 'bottom start'
28240
28264
  },
28265
+ ...makeDisplayProps(),
28241
28266
  ...makeFocusProps(),
28242
28267
  ...makeVConfirmEditProps(),
28243
28268
  ...makeVTextFieldProps({
@@ -28253,16 +28278,22 @@
28253
28278
  name: 'VDateInput',
28254
28279
  props: makeVDateInputProps(),
28255
28280
  emits: {
28281
+ save: value => true,
28282
+ cancel: () => true,
28256
28283
  'update:modelValue': val => true
28257
28284
  },
28258
28285
  setup(props, _ref) {
28259
28286
  let {
28287
+ emit,
28260
28288
  slots
28261
28289
  } = _ref;
28262
28290
  const {
28263
28291
  t
28264
28292
  } = useLocale();
28265
28293
  const adapter = useDate();
28294
+ const {
28295
+ mobile
28296
+ } = useDisplay();
28266
28297
  const {
28267
28298
  isFocused,
28268
28299
  focus,
@@ -28270,7 +28301,14 @@
28270
28301
  } = useFocus(props);
28271
28302
  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);
28272
28303
  const menu = vue.shallowRef(false);
28304
+ const isEditingInput = vue.shallowRef(false);
28273
28305
  const vDateInputRef = vue.ref();
28306
+ function format(date) {
28307
+ if (typeof props.displayFormat === 'function') {
28308
+ return props.displayFormat(date);
28309
+ }
28310
+ return adapter.format(date, props.displayFormat ?? 'keyboardDate');
28311
+ }
28274
28312
  const display = vue.computed(() => {
28275
28313
  const value = wrapInArray(model.value);
28276
28314
  if (!value.length) return null;
@@ -28280,11 +28318,22 @@
28280
28318
  if (props.multiple === 'range') {
28281
28319
  const start = value[0];
28282
28320
  const end = value[value.length - 1];
28283
- return adapter.isValid(start) && adapter.isValid(end) ? `${adapter.format(adapter.date(start), 'keyboardDate')} - ${adapter.format(adapter.date(end), 'keyboardDate')}` : '';
28321
+ if (!adapter.isValid(start) || !adapter.isValid(end)) return '';
28322
+ return `${format(adapter.date(start))} - ${format(adapter.date(end))}`;
28284
28323
  }
28285
- return adapter.isValid(model.value) ? adapter.format(adapter.date(model.value), 'keyboardDate') : '';
28324
+ return adapter.isValid(model.value) ? format(adapter.date(model.value)) : '';
28325
+ });
28326
+ const inputmode = vue.computed(() => {
28327
+ if (!mobile.value) return undefined;
28328
+ if (isEditingInput.value) return 'text';
28329
+ return 'none';
28286
28330
  });
28287
28331
  const isInteractive = vue.computed(() => !props.disabled && !props.readonly);
28332
+ const isReadonly = vue.computed(() => !(mobile.value && isEditingInput.value) && props.readonly);
28333
+ vue.watch(menu, val => {
28334
+ if (val) return;
28335
+ isEditingInput.value = false;
28336
+ });
28288
28337
  function onKeydown(e) {
28289
28338
  if (e.key !== 'Enter') return;
28290
28339
  if (!menu.value || !isFocused.value) {
@@ -28297,15 +28346,38 @@
28297
28346
  function onClick(e) {
28298
28347
  e.preventDefault();
28299
28348
  e.stopPropagation();
28300
- menu.value = true;
28349
+ if (menu.value && mobile.value) {
28350
+ isEditingInput.value = true;
28351
+ } else {
28352
+ menu.value = true;
28353
+ }
28354
+ }
28355
+ function onCancel() {
28356
+ emit('cancel');
28357
+ menu.value = false;
28358
+ isEditingInput.value = false;
28301
28359
  }
28302
- function onSave() {
28360
+ function onSave(value) {
28361
+ emit('save', value);
28303
28362
  menu.value = false;
28304
28363
  }
28305
- function onUpdateModel(value) {
28364
+ function onUpdateDisplayModel(value) {
28306
28365
  if (value != null) return;
28307
28366
  model.value = null;
28308
28367
  }
28368
+ function onUpdateMenuModel(isMenuOpen) {
28369
+ if (isMenuOpen) return;
28370
+ isEditingInput.value = false;
28371
+ }
28372
+ function onBlur() {
28373
+ blur();
28374
+
28375
+ // When in mobile mode and editing is done (due to keyboard dismissal), close the menu
28376
+ if (mobile.value && isEditingInput.value && !isFocused.value) {
28377
+ menu.value = false;
28378
+ isEditingInput.value = false;
28379
+ }
28380
+ }
28309
28381
  useRender(() => {
28310
28382
  const confirmEditProps = VConfirmEdit.filterProps(props);
28311
28383
  const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
@@ -28316,18 +28388,20 @@
28316
28388
  "class": props.class,
28317
28389
  "style": props.style,
28318
28390
  "modelValue": display.value,
28391
+ "inputmode": inputmode.value,
28392
+ "readonly": isReadonly.value,
28319
28393
  "onKeydown": isInteractive.value ? onKeydown : undefined,
28320
28394
  "focused": menu.value || isFocused.value,
28321
28395
  "onFocus": focus,
28322
- "onBlur": blur,
28396
+ "onBlur": onBlur,
28323
28397
  "onClick:control": isInteractive.value ? onClick : undefined,
28324
28398
  "onClick:prepend": isInteractive.value ? onClick : undefined,
28325
- "onUpdate:modelValue": onUpdateModel
28399
+ "onUpdate:modelValue": onUpdateDisplayModel
28326
28400
  }), {
28327
28401
  ...slots,
28328
28402
  default: () => vue.createVNode(vue.Fragment, null, [vue.createVNode(VMenu, {
28329
28403
  "modelValue": menu.value,
28330
- "onUpdate:modelValue": $event => menu.value = $event,
28404
+ "onUpdate:modelValue": [$event => menu.value = $event, onUpdateMenuModel],
28331
28405
  "activator": "parent",
28332
28406
  "min-width": "0",
28333
28407
  "eager": isFocused.value,
@@ -28339,7 +28413,7 @@
28339
28413
  "modelValue": model.value,
28340
28414
  "onUpdate:modelValue": $event => model.value = $event,
28341
28415
  "onSave": onSave,
28342
- "onCancel": () => menu.value = false
28416
+ "onCancel": onCancel
28343
28417
  }), {
28344
28418
  default: _ref2 => {
28345
28419
  let {
@@ -28349,16 +28423,21 @@
28349
28423
  cancel,
28350
28424
  isPristine
28351
28425
  } = _ref2;
28426
+ function onUpdateModel(value) {
28427
+ if (!props.hideActions) {
28428
+ proxyModel.value = value;
28429
+ } else {
28430
+ model.value = value;
28431
+ if (!props.multiple) {
28432
+ menu.value = false;
28433
+ }
28434
+ }
28435
+ emit('save', value);
28436
+ vDateInputRef.value?.blur();
28437
+ }
28352
28438
  return vue.createVNode(VDatePicker, vue.mergeProps(datePickerProps, {
28353
28439
  "modelValue": props.hideActions ? model.value : proxyModel.value,
28354
- "onUpdate:modelValue": val => {
28355
- if (!props.hideActions) {
28356
- proxyModel.value = val;
28357
- } else {
28358
- model.value = val;
28359
- if (!props.multiple) menu.value = false;
28360
- }
28361
- },
28440
+ "onUpdate:modelValue": value => onUpdateModel(value),
28362
28441
  "onMousedown": e => e.preventDefault()
28363
28442
  }), {
28364
28443
  actions: !props.hideActions ? () => slots.actions?.({
@@ -31076,7 +31155,7 @@
31076
31155
  goTo
31077
31156
  };
31078
31157
  }
31079
- const version$1 = "3.7.17";
31158
+ const version$1 = "3.7.19";
31080
31159
  createVuetify$1.version = version$1;
31081
31160
 
31082
31161
  // Vue's inject() can only be used in setup
@@ -31329,7 +31408,7 @@
31329
31408
 
31330
31409
  /* eslint-disable local-rules/sort-imports */
31331
31410
 
31332
- const version = "3.7.17";
31411
+ const version = "3.7.19";
31333
31412
 
31334
31413
  /* eslint-disable local-rules/sort-imports */
31335
31414