vuetify 3.7.18 → 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 (40) hide show
  1. package/dist/json/attributes.json +2834 -2822
  2. package/dist/json/importMap-labs.json +26 -26
  3. package/dist/json/importMap.json +138 -138
  4. package/dist/json/tags.json +3 -0
  5. package/dist/json/web-types.json +5323 -5273
  6. package/dist/vuetify-labs.css +3725 -3725
  7. package/dist/vuetify-labs.d.ts +74 -32
  8. package/dist/vuetify-labs.esm.js +98 -27
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +98 -27
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +3391 -3391
  13. package/dist/vuetify.d.ts +86 -83
  14. package/dist/vuetify.esm.js +25 -10
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +25 -10
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +10 -10
  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/VIcon/VIcon.mjs +2 -2
  27. package/lib/components/VIcon/VIcon.mjs.map +1 -1
  28. package/lib/components/index.d.mts +35 -32
  29. package/lib/composables/calendar.mjs +1 -1
  30. package/lib/composables/calendar.mjs.map +1 -1
  31. package/lib/entry-bundler.mjs +1 -1
  32. package/lib/framework.mjs +1 -1
  33. package/lib/index.d.mts +51 -51
  34. package/lib/labs/VDateInput/VDateInput.mjs +75 -18
  35. package/lib/labs/VDateInput/VDateInput.mjs.map +1 -1
  36. package/lib/labs/VDateInput/index.d.mts +43 -0
  37. package/lib/labs/components.d.mts +43 -4
  38. package/lib/util/helpers.mjs +1 -1
  39. package/lib/util/helpers.mjs.map +1 -1
  40. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.7.18
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]);
@@ -22272,7 +22287,7 @@
22272
22287
  const {
22273
22288
  t
22274
22289
  } = useLocale();
22275
- 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]);
22276
22291
  const viewMode = useProxiedModel(props, 'viewMode');
22277
22292
  // const inputMode = useProxiedModel(props, 'inputMode')
22278
22293
 
@@ -28241,11 +28256,13 @@
28241
28256
  // Types
28242
28257
 
28243
28258
  const makeVDateInputProps = propsFactory({
28259
+ displayFormat: [Function, String],
28244
28260
  hideActions: Boolean,
28245
28261
  location: {
28246
28262
  type: String,
28247
28263
  default: 'bottom start'
28248
28264
  },
28265
+ ...makeDisplayProps(),
28249
28266
  ...makeFocusProps(),
28250
28267
  ...makeVConfirmEditProps(),
28251
28268
  ...makeVTextFieldProps({
@@ -28261,16 +28278,22 @@
28261
28278
  name: 'VDateInput',
28262
28279
  props: makeVDateInputProps(),
28263
28280
  emits: {
28281
+ save: value => true,
28282
+ cancel: () => true,
28264
28283
  'update:modelValue': val => true
28265
28284
  },
28266
28285
  setup(props, _ref) {
28267
28286
  let {
28287
+ emit,
28268
28288
  slots
28269
28289
  } = _ref;
28270
28290
  const {
28271
28291
  t
28272
28292
  } = useLocale();
28273
28293
  const adapter = useDate();
28294
+ const {
28295
+ mobile
28296
+ } = useDisplay();
28274
28297
  const {
28275
28298
  isFocused,
28276
28299
  focus,
@@ -28278,7 +28301,14 @@
28278
28301
  } = useFocus(props);
28279
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);
28280
28303
  const menu = vue.shallowRef(false);
28304
+ const isEditingInput = vue.shallowRef(false);
28281
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
+ }
28282
28312
  const display = vue.computed(() => {
28283
28313
  const value = wrapInArray(model.value);
28284
28314
  if (!value.length) return null;
@@ -28288,11 +28318,22 @@
28288
28318
  if (props.multiple === 'range') {
28289
28319
  const start = value[0];
28290
28320
  const end = value[value.length - 1];
28291
- 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))}`;
28292
28323
  }
28293
- 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';
28294
28330
  });
28295
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
+ });
28296
28337
  function onKeydown(e) {
28297
28338
  if (e.key !== 'Enter') return;
28298
28339
  if (!menu.value || !isFocused.value) {
@@ -28305,15 +28346,38 @@
28305
28346
  function onClick(e) {
28306
28347
  e.preventDefault();
28307
28348
  e.stopPropagation();
28308
- menu.value = true;
28349
+ if (menu.value && mobile.value) {
28350
+ isEditingInput.value = true;
28351
+ } else {
28352
+ menu.value = true;
28353
+ }
28309
28354
  }
28310
- function onSave() {
28355
+ function onCancel() {
28356
+ emit('cancel');
28311
28357
  menu.value = false;
28358
+ isEditingInput.value = false;
28312
28359
  }
28313
- function onUpdateModel(value) {
28360
+ function onSave(value) {
28361
+ emit('save', value);
28362
+ menu.value = false;
28363
+ }
28364
+ function onUpdateDisplayModel(value) {
28314
28365
  if (value != null) return;
28315
28366
  model.value = null;
28316
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
+ }
28317
28381
  useRender(() => {
28318
28382
  const confirmEditProps = VConfirmEdit.filterProps(props);
28319
28383
  const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
@@ -28324,18 +28388,20 @@
28324
28388
  "class": props.class,
28325
28389
  "style": props.style,
28326
28390
  "modelValue": display.value,
28391
+ "inputmode": inputmode.value,
28392
+ "readonly": isReadonly.value,
28327
28393
  "onKeydown": isInteractive.value ? onKeydown : undefined,
28328
28394
  "focused": menu.value || isFocused.value,
28329
28395
  "onFocus": focus,
28330
- "onBlur": blur,
28396
+ "onBlur": onBlur,
28331
28397
  "onClick:control": isInteractive.value ? onClick : undefined,
28332
28398
  "onClick:prepend": isInteractive.value ? onClick : undefined,
28333
- "onUpdate:modelValue": onUpdateModel
28399
+ "onUpdate:modelValue": onUpdateDisplayModel
28334
28400
  }), {
28335
28401
  ...slots,
28336
28402
  default: () => vue.createVNode(vue.Fragment, null, [vue.createVNode(VMenu, {
28337
28403
  "modelValue": menu.value,
28338
- "onUpdate:modelValue": $event => menu.value = $event,
28404
+ "onUpdate:modelValue": [$event => menu.value = $event, onUpdateMenuModel],
28339
28405
  "activator": "parent",
28340
28406
  "min-width": "0",
28341
28407
  "eager": isFocused.value,
@@ -28347,7 +28413,7 @@
28347
28413
  "modelValue": model.value,
28348
28414
  "onUpdate:modelValue": $event => model.value = $event,
28349
28415
  "onSave": onSave,
28350
- "onCancel": () => menu.value = false
28416
+ "onCancel": onCancel
28351
28417
  }), {
28352
28418
  default: _ref2 => {
28353
28419
  let {
@@ -28357,16 +28423,21 @@
28357
28423
  cancel,
28358
28424
  isPristine
28359
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
+ }
28360
28438
  return vue.createVNode(VDatePicker, vue.mergeProps(datePickerProps, {
28361
28439
  "modelValue": props.hideActions ? model.value : proxyModel.value,
28362
- "onUpdate:modelValue": val => {
28363
- if (!props.hideActions) {
28364
- proxyModel.value = val;
28365
- } else {
28366
- model.value = val;
28367
- if (!props.multiple) menu.value = false;
28368
- }
28369
- },
28440
+ "onUpdate:modelValue": value => onUpdateModel(value),
28370
28441
  "onMousedown": e => e.preventDefault()
28371
28442
  }), {
28372
28443
  actions: !props.hideActions ? () => slots.actions?.({
@@ -31084,7 +31155,7 @@
31084
31155
  goTo
31085
31156
  };
31086
31157
  }
31087
- const version$1 = "3.7.18";
31158
+ const version$1 = "3.7.19";
31088
31159
  createVuetify$1.version = version$1;
31089
31160
 
31090
31161
  // Vue's inject() can only be used in setup
@@ -31337,7 +31408,7 @@
31337
31408
 
31338
31409
  /* eslint-disable local-rules/sort-imports */
31339
31410
 
31340
- const version = "3.7.18";
31411
+ const version = "3.7.19";
31341
31412
 
31342
31413
  /* eslint-disable local-rules/sort-imports */
31343
31414