vuetify 3.10.9 → 3.10.11

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 (77) hide show
  1. package/dist/json/attributes.json +3178 -3218
  2. package/dist/json/importMap-labs.json +16 -16
  3. package/dist/json/importMap.json +154 -154
  4. package/dist/json/tags.json +0 -10
  5. package/dist/json/web-types.json +5596 -5696
  6. package/dist/vuetify-labs.cjs +204 -216
  7. package/dist/vuetify-labs.css +4081 -4083
  8. package/dist/vuetify-labs.d.ts +470 -658
  9. package/dist/vuetify-labs.esm.js +204 -216
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +204 -216
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.cjs +136 -99
  14. package/dist/vuetify.cjs.map +1 -1
  15. package/dist/vuetify.css +2706 -2696
  16. package/dist/vuetify.d.ts +328 -456
  17. package/dist/vuetify.esm.js +136 -99
  18. package/dist/vuetify.esm.js.map +1 -1
  19. package/dist/vuetify.js +136 -99
  20. package/dist/vuetify.js.map +1 -1
  21. package/dist/vuetify.min.css +2 -2
  22. package/dist/vuetify.min.js +333 -329
  23. package/dist/vuetify.min.js.map +1 -1
  24. package/lib/components/VAutocomplete/VAutocomplete.d.ts +63 -94
  25. package/lib/components/VAvatar/VAvatar.css +1 -1
  26. package/lib/components/VAvatar/_variables.scss +1 -1
  27. package/lib/components/VBtnToggle/VBtnToggle.sass +1 -1
  28. package/lib/components/VCard/VCard.js +8 -1
  29. package/lib/components/VCard/VCard.js.map +1 -1
  30. package/lib/components/VCombobox/VCombobox.d.ts +63 -94
  31. package/lib/components/VDatePicker/VDatePicker.js +7 -16
  32. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  33. package/lib/components/VField/VField.css +6 -1
  34. package/lib/components/VField/VField.d.ts +8 -13
  35. package/lib/components/VField/VField.js +1 -1
  36. package/lib/components/VField/VField.js.map +1 -1
  37. package/lib/components/VField/VField.sass +5 -0
  38. package/lib/components/VFileInput/VFileInput.d.ts +0 -13
  39. package/lib/components/VNumberInput/VNumberInput.d.ts +63 -89
  40. package/lib/components/VSelect/VSelect.d.ts +63 -94
  41. package/lib/components/VTabs/VTab.css +3 -2
  42. package/lib/components/VTabs/VTab.sass +2 -1
  43. package/lib/components/VTextField/VTextField.d.ts +18 -31
  44. package/lib/components/VTextField/VTextField.js +17 -7
  45. package/lib/components/VTextField/VTextField.js.map +1 -1
  46. package/lib/components/VTextarea/VTextarea.d.ts +0 -13
  47. package/lib/components/VTextarea/VTextarea.js +17 -7
  48. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  49. package/lib/components/VWindow/VWindow.js +2 -2
  50. package/lib/components/VWindow/VWindow.js.map +1 -1
  51. package/lib/composables/calendar.d.ts +6 -0
  52. package/lib/composables/calendar.js +37 -2
  53. package/lib/composables/calendar.js.map +1 -1
  54. package/lib/composables/delay.js +3 -2
  55. package/lib/composables/delay.js.map +1 -1
  56. package/lib/composables/hotkey/hotkey.js +42 -53
  57. package/lib/composables/hotkey/hotkey.js.map +1 -1
  58. package/lib/entry-bundler.js +1 -1
  59. package/lib/entry-bundler.js.map +1 -1
  60. package/lib/framework.d.ts +50 -50
  61. package/lib/framework.js +1 -1
  62. package/lib/framework.js.map +1 -1
  63. package/lib/labs/VColorInput/VColorInput.d.ts +0 -13
  64. package/lib/labs/VDateInput/VDateInput.d.ts +63 -94
  65. package/lib/labs/VDateInput/VDateInput.js +8 -12
  66. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  67. package/lib/labs/VHotkey/VHotkey.css +4 -16
  68. package/lib/labs/VHotkey/VHotkey.d.ts +29 -29
  69. package/lib/labs/VHotkey/VHotkey.js +62 -106
  70. package/lib/labs/VHotkey/VHotkey.js.map +1 -1
  71. package/lib/labs/VHotkey/VHotkey.scss +8 -25
  72. package/lib/labs/VMaskInput/VMaskInput.d.ts +63 -94
  73. package/lib/styles/main.css +4 -0
  74. package/lib/styles/settings/_variables.scss +1 -0
  75. package/lib/util/box.js +3 -8
  76. package/lib/util/box.js.map +1 -1
  77. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.10.9
2
+ * Vuetify v3.10.11
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -609,7 +609,8 @@ function getAxis(anchor) {
609
609
  class Box {
610
610
  constructor(args) {
611
611
  const pageScale = document.body.currentCSSZoom ?? 1;
612
- const factor = args instanceof DOMRect ? 1 + (1 - pageScale) / pageScale : 1;
612
+ const ignoreZoom = args.top === undefined; // detect DOMRect without breaking in jsdom
613
+ const factor = ignoreZoom ? 1 : 1 + (1 - pageScale) / pageScale;
613
614
  const {
614
615
  x,
615
616
  y,
@@ -679,13 +680,7 @@ function getElementBox(el) {
679
680
  });
680
681
  }
681
682
  } else {
682
- const rect = el.getBoundingClientRect();
683
- return new Box({
684
- x: rect.x,
685
- y: rect.y,
686
- width: el.clientWidth,
687
- height: el.clientHeight
688
- });
683
+ return new Box(el.getBoundingClientRect());
689
684
  }
690
685
  }
691
686
 
@@ -11571,9 +11566,10 @@ function useDelay(props, cb) {
11571
11566
  let clearDelay = () => {};
11572
11567
  function runDelay(isOpening, options) {
11573
11568
  clearDelay?.();
11574
- const delay = Math.max(options?.minDelay ?? 0, Number(isOpening ? props.openDelay : props.closeDelay));
11569
+ const delay = isOpening ? props.openDelay : props.closeDelay;
11570
+ const normalizedDelay = Math.max(options?.minDelay ?? 0, Number(delay ?? 0));
11575
11571
  return new Promise(resolve => {
11576
- clearDelay = defer(delay, () => {
11572
+ clearDelay = defer(normalizedDelay, () => {
11577
11573
  cb?.(isOpening);
11578
11574
  resolve(isOpening);
11579
11575
  });
@@ -12658,7 +12654,6 @@ const makeVFieldProps = propsFactory({
12658
12654
  },
12659
12655
  color: String,
12660
12656
  baseColor: String,
12661
- details: Boolean,
12662
12657
  dirty: Boolean,
12663
12658
  disabled: {
12664
12659
  type: Boolean,
@@ -12691,6 +12686,7 @@ const VField = genericComponent()({
12691
12686
  inheritAttrs: false,
12692
12687
  props: {
12693
12688
  id: String,
12689
+ details: Boolean,
12694
12690
  ...makeFocusProps(),
12695
12691
  ...makeVFieldProps()
12696
12692
  },
@@ -13080,14 +13076,24 @@ const VTextField = genericComponent()({
13080
13076
  }
13081
13077
  function onInput(e) {
13082
13078
  const el = e.target;
13083
- model.value = el.value;
13084
- if (props.modelModifiers?.trim && ['text', 'search', 'password', 'tel', 'url'].includes(props.type)) {
13085
- const caretPosition = [el.selectionStart, el.selectionEnd];
13086
- nextTick(() => {
13087
- el.selectionStart = caretPosition[0];
13088
- el.selectionEnd = caretPosition[1];
13089
- });
13079
+ if (!(props.modelModifiers?.trim && ['text', 'search', 'password', 'tel', 'url'].includes(props.type))) {
13080
+ model.value = el.value;
13081
+ return;
13090
13082
  }
13083
+ const value = el.value;
13084
+ const start = el.selectionStart;
13085
+ const end = el.selectionEnd;
13086
+ model.value = value;
13087
+ nextTick(() => {
13088
+ let offset = 0;
13089
+ if (value.trimStart().length === el.value.length) {
13090
+ // #22307 - Whitespace has been removed from the
13091
+ // start, offset the caret position to compensate
13092
+ offset = value.length - el.value.length;
13093
+ }
13094
+ if (start != null) el.selectionStart = start - offset;
13095
+ if (end != null) el.selectionEnd = end - offset;
13096
+ });
13091
13097
  }
13092
13098
  useRender(() => {
13093
13099
  const hasCounter = !!(slots.counter || props.counter !== false && props.counter != null);
@@ -15814,6 +15820,12 @@ const VCard = genericComponent()({
15814
15820
  roundedClasses
15815
15821
  } = useRounded(props);
15816
15822
  const link = useLink(props, attrs);
15823
+ const loadingColor = shallowRef(undefined);
15824
+ watch(() => props.loading, (val, old) => {
15825
+ loadingColor.value = !val && typeof old === 'string' ? old : typeof val === 'boolean' ? undefined : val;
15826
+ }, {
15827
+ immediate: true
15828
+ });
15817
15829
  useRender(() => {
15818
15830
  const isLink = props.link !== false && link.isLink.value;
15819
15831
  const isClickable = !props.disabled && props.link !== false && (props.link || link.isClickable.value);
@@ -15856,7 +15868,7 @@ const VCard = genericComponent()({
15856
15868
  }, slots.image)]), createVNode(LoaderSlot, {
15857
15869
  "name": "v-card",
15858
15870
  "active": !!props.loading,
15859
- "color": typeof props.loading === 'boolean' ? undefined : props.loading
15871
+ "color": loadingColor.value
15860
15872
  }, {
15861
15873
  default: slots.loader
15862
15874
  }), hasCardItem && createVNode(VCardItem, {
@@ -16097,9 +16109,9 @@ const VWindow = genericComponent()({
16097
16109
  if (itemsLength <= 2) {
16098
16110
  isReversed.value = newVal < oldVal;
16099
16111
  } else if (newVal === lastIndex && oldVal === 0) {
16100
- isReversed.value = true;
16101
- } else if (newVal === 0 && oldVal === lastIndex) {
16102
16112
  isReversed.value = false;
16113
+ } else if (newVal === 0 && oldVal === lastIndex) {
16114
+ isReversed.value = true;
16103
16115
  } else {
16104
16116
  isReversed.value = newVal < oldVal;
16105
16117
  }
@@ -19279,11 +19291,6 @@ function useHotkey(keys, callback) {
19279
19291
  let keyGroups;
19280
19292
  let isSequence = false;
19281
19293
  let groupIndex = 0;
19282
- function clearTimer() {
19283
- if (!timeout) return;
19284
- clearTimeout(timeout);
19285
- timeout = 0;
19286
- }
19287
19294
  function isInputFocused() {
19288
19295
  if (toValue(inputs)) return false;
19289
19296
  const activeElement = document.activeElement;
@@ -19291,12 +19298,12 @@ function useHotkey(keys, callback) {
19291
19298
  }
19292
19299
  function resetSequence() {
19293
19300
  groupIndex = 0;
19294
- clearTimer();
19301
+ clearTimeout(timeout);
19295
19302
  }
19296
19303
  function handler(e) {
19297
19304
  const group = keyGroups[groupIndex];
19298
19305
  if (!group || isInputFocused()) return;
19299
- if (!matchesKeyGroup(e, group)) {
19306
+ if (!matchesKeyGroup(e, group, isMac)) {
19300
19307
  if (isSequence) resetSequence();
19301
19308
  return;
19302
19309
  }
@@ -19305,7 +19312,7 @@ function useHotkey(keys, callback) {
19305
19312
  callback(e);
19306
19313
  return;
19307
19314
  }
19308
- clearTimer();
19315
+ clearTimeout(timeout);
19309
19316
  groupIndex++;
19310
19317
  if (groupIndex === keyGroups.length) {
19311
19318
  callback(e);
@@ -19316,12 +19323,12 @@ function useHotkey(keys, callback) {
19316
19323
  }
19317
19324
  function cleanup() {
19318
19325
  window.removeEventListener(toValue(event), handler);
19319
- clearTimer();
19326
+ clearTimeout(timeout);
19320
19327
  }
19321
- watch(() => toValue(keys), function (unrefKeys) {
19328
+ watch(() => toValue(keys), newKeys => {
19322
19329
  cleanup();
19323
- if (unrefKeys) {
19324
- const groups = splitKeySequence(unrefKeys.toLowerCase());
19330
+ if (newKeys) {
19331
+ const groups = splitKeySequence(newKeys.toLowerCase());
19325
19332
  isSequence = groups.length > 1;
19326
19333
  keyGroups = groups;
19327
19334
  resetSequence();
@@ -19332,55 +19339,50 @@ function useHotkey(keys, callback) {
19332
19339
  });
19333
19340
 
19334
19341
  // Watch for changes in the event type to re-register the listener
19335
- watch(() => toValue(event), function (newEvent, oldEvent) {
19342
+ watch(() => toValue(event), (newEvent, oldEvent) => {
19336
19343
  if (oldEvent && keyGroups && keyGroups.length > 0) {
19337
19344
  window.removeEventListener(oldEvent, handler);
19338
19345
  window.addEventListener(newEvent, handler);
19339
19346
  }
19340
19347
  });
19341
- try {
19342
- getCurrentInstance('useHotkey');
19343
- onBeforeUnmount(cleanup);
19344
- } catch {
19345
- // Not in Vue setup context
19346
- }
19347
- function parseKeyGroup(group) {
19348
- const MODIFIERS = ['ctrl', 'shift', 'alt', 'meta', 'cmd'];
19348
+ onScopeDispose(cleanup, true);
19349
+ return cleanup;
19350
+ }
19351
+ function matchesKeyGroup(e, group, isMac) {
19352
+ const {
19353
+ modifiers,
19354
+ actualKey
19355
+ } = parseKeyGroup(group);
19356
+ const expectCtrl = modifiers.ctrl || !isMac && (modifiers.cmd || modifiers.meta);
19357
+ const expectMeta = isMac && (modifiers.cmd || modifiers.meta);
19358
+ return e.ctrlKey === expectCtrl && e.metaKey === expectMeta && e.shiftKey === modifiers.shift && e.altKey === modifiers.alt && e.key.toLowerCase() === actualKey?.toLowerCase();
19359
+ }
19360
+ function parseKeyGroup(group) {
19361
+ const MODIFIERS = ['ctrl', 'shift', 'alt', 'meta', 'cmd'];
19349
19362
 
19350
- // Use the shared combination splitting logic
19351
- const parts = splitKeyCombination(group.toLowerCase());
19363
+ // Use the shared combination splitting logic
19364
+ const parts = splitKeyCombination(group.toLowerCase());
19352
19365
 
19353
- // If the combination is invalid, return empty result
19354
- if (parts.length === 0) {
19355
- return {
19356
- modifiers: Object.fromEntries(MODIFIERS.map(m => [m, false])),
19357
- actualKey: undefined
19358
- };
19359
- }
19360
- const modifiers = Object.fromEntries(MODIFIERS.map(m => [m, false]));
19361
- let actualKey;
19362
- for (const part of parts) {
19363
- if (MODIFIERS.includes(part)) {
19364
- modifiers[part] = true;
19365
- } else {
19366
- actualKey = part;
19367
- }
19368
- }
19366
+ // If the combination is invalid, return empty result
19367
+ if (parts.length === 0) {
19369
19368
  return {
19370
- modifiers,
19371
- actualKey
19369
+ modifiers: Object.fromEntries(MODIFIERS.map(m => [m, false])),
19370
+ actualKey: undefined
19372
19371
  };
19373
19372
  }
19374
- function matchesKeyGroup(e, group) {
19375
- const {
19376
- modifiers,
19377
- actualKey
19378
- } = parseKeyGroup(group);
19379
- const expectCtrl = modifiers.ctrl || !isMac && (modifiers.cmd || modifiers.meta);
19380
- const expectMeta = isMac && (modifiers.cmd || modifiers.meta);
19381
- return e.ctrlKey === expectCtrl && e.metaKey === expectMeta && e.shiftKey === modifiers.shift && e.altKey === modifiers.alt && e.key.toLowerCase() === actualKey?.toLowerCase();
19373
+ const modifiers = Object.fromEntries(MODIFIERS.map(m => [m, false]));
19374
+ let actualKey;
19375
+ for (const part of parts) {
19376
+ if (MODIFIERS.includes(part)) {
19377
+ modifiers[part] = true;
19378
+ } else {
19379
+ actualKey = part;
19380
+ }
19382
19381
  }
19383
- return cleanup;
19382
+ return {
19383
+ modifiers,
19384
+ actualKey
19385
+ };
19384
19386
  }
19385
19387
 
19386
19388
  // Utilities
@@ -24001,11 +24003,15 @@ function useCalendar(props) {
24001
24003
  return week.length ? adapter.getWeek(week[0], props.firstDayOfWeek, props.firstDayOfYear) : null;
24002
24004
  });
24003
24005
  });
24006
+ const {
24007
+ minDate,
24008
+ maxDate
24009
+ } = useCalendarRange(props);
24004
24010
  function isDisabled(value) {
24005
24011
  if (props.disabled) return true;
24006
24012
  const date = adapter.date(value);
24007
- if (props.min && adapter.isBefore(adapter.endOfDay(date), adapter.date(props.min))) return true;
24008
- if (props.max && adapter.isAfter(date, adapter.date(props.max))) return true;
24013
+ if (minDate.value && adapter.isBefore(adapter.endOfDay(date), minDate.value)) return true;
24014
+ if (maxDate.value && adapter.isAfter(date, maxDate.value)) return true;
24009
24015
  if (Array.isArray(props.allowedDates) && props.allowedDates.length > 0) {
24010
24016
  return !props.allowedDates.some(d => adapter.isSameDay(adapter.date(d), date));
24011
24017
  }
@@ -24025,6 +24031,37 @@ function useCalendar(props) {
24025
24031
  weekNumbers
24026
24032
  };
24027
24033
  }
24034
+ function useCalendarRange(props) {
24035
+ const adapter = useDate();
24036
+ const minDate = computed(() => {
24037
+ if (!props.min) return null;
24038
+ const date = adapter.date(props.min);
24039
+ return adapter.isValid(date) ? date : null;
24040
+ });
24041
+ const maxDate = computed(() => {
24042
+ if (!props.max) return null;
24043
+ const date = adapter.date(props.max);
24044
+ return adapter.isValid(date) ? date : null;
24045
+ });
24046
+ function clampDate(date) {
24047
+ if (minDate.value && adapter.isBefore(date, minDate.value)) {
24048
+ return minDate.value;
24049
+ }
24050
+ if (maxDate.value && adapter.isAfter(date, maxDate.value)) {
24051
+ return maxDate.value;
24052
+ }
24053
+ return date;
24054
+ }
24055
+ function isInAllowedRange(date) {
24056
+ return (!minDate.value || adapter.isAfter(date, minDate.value)) && (!maxDate.value || adapter.isBefore(date, maxDate.value));
24057
+ }
24058
+ return {
24059
+ minDate,
24060
+ maxDate,
24061
+ clampDate,
24062
+ isInAllowedRange
24063
+ };
24064
+ }
24028
24065
 
24029
24066
  // Types
24030
24067
 
@@ -24465,24 +24502,14 @@ const VDatePicker = genericComponent()({
24465
24502
  const viewMode = useProxiedModel(props, 'viewMode');
24466
24503
  // const inputMode = useProxiedModel(props, 'inputMode')
24467
24504
 
24468
- const minDate = computed(() => {
24469
- const date = adapter.date(props.min);
24470
- return props.min && adapter.isValid(date) ? date : null;
24471
- });
24472
- const maxDate = computed(() => {
24473
- const date = adapter.date(props.max);
24474
- return props.max && adapter.isValid(date) ? date : null;
24475
- });
24505
+ const {
24506
+ minDate,
24507
+ maxDate,
24508
+ clampDate
24509
+ } = useCalendarRange(props);
24476
24510
  const internal = computed(() => {
24477
24511
  const today = adapter.date();
24478
- let value = today;
24479
- if (model.value?.[0]) {
24480
- value = adapter.date(model.value[0]);
24481
- } else if (minDate.value && adapter.isBefore(today, minDate.value)) {
24482
- value = minDate.value;
24483
- } else if (maxDate.value && adapter.isAfter(today, maxDate.value)) {
24484
- value = maxDate.value;
24485
- }
24512
+ const value = model.value?.[0] ? adapter.date(model.value[0]) : clampDate(today);
24486
24513
  return value && adapter.isValid(value) ? value : today;
24487
24514
  });
24488
24515
  const headerColor = toRef(() => props.headerColor ?? props.color);
@@ -30269,14 +30296,24 @@ const VTextarea = genericComponent()({
30269
30296
  }
30270
30297
  function onInput(e) {
30271
30298
  const el = e.target;
30272
- model.value = el.value;
30273
- if (props.modelModifiers?.trim) {
30274
- const caretPosition = [el.selectionStart, el.selectionEnd];
30275
- nextTick(() => {
30276
- el.selectionStart = caretPosition[0];
30277
- el.selectionEnd = caretPosition[1];
30278
- });
30299
+ if (!props.modelModifiers?.trim) {
30300
+ model.value = el.value;
30301
+ return;
30279
30302
  }
30303
+ const value = el.value;
30304
+ const start = el.selectionStart;
30305
+ const end = el.selectionEnd;
30306
+ model.value = value;
30307
+ nextTick(() => {
30308
+ let offset = 0;
30309
+ if (value.trimStart().length === el.value.length) {
30310
+ // #22307 - Whitespace has been removed from the
30311
+ // start, offset the caret position to compensate
30312
+ offset = value.length - el.value.length;
30313
+ }
30314
+ if (start != null) el.selectionStart = start - offset;
30315
+ if (end != null) el.selectionEnd = end - offset;
30316
+ });
30280
30317
  }
30281
30318
  const sizerRef = ref();
30282
30319
  const rows = ref(Number(props.rows));
@@ -32515,7 +32552,7 @@ function createVuetify$1() {
32515
32552
  };
32516
32553
  });
32517
32554
  }
32518
- const version$1 = "3.10.9";
32555
+ const version$1 = "3.10.11";
32519
32556
  createVuetify$1.version = version$1;
32520
32557
 
32521
32558
  // Vue's inject() can only be used in setup
@@ -32540,7 +32577,7 @@ const createVuetify = function () {
32540
32577
  ...options
32541
32578
  });
32542
32579
  };
32543
- const version = "3.10.9";
32580
+ const version = "3.10.11";
32544
32581
  createVuetify.version = version;
32545
32582
 
32546
32583
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useHotkey, useLayout, useLocale, useMask, useRtl, useTheme, version };