vuetify 3.10.8 → 3.10.10

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 (68) hide show
  1. package/dist/json/attributes.json +1543 -1543
  2. package/dist/json/importMap-labs.json +18 -18
  3. package/dist/json/importMap.json +174 -174
  4. package/dist/json/web-types.json +2937 -2937
  5. package/dist/vuetify-labs.cjs +205 -216
  6. package/dist/vuetify-labs.css +4754 -4730
  7. package/dist/vuetify-labs.d.ts +72 -72
  8. package/dist/vuetify-labs.esm.js +205 -216
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +205 -216
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.cjs +137 -99
  13. package/dist/vuetify.cjs.map +1 -1
  14. package/dist/vuetify.css +2766 -2730
  15. package/dist/vuetify.d.ts +56 -56
  16. package/dist/vuetify.esm.js +137 -99
  17. package/dist/vuetify.esm.js.map +1 -1
  18. package/dist/vuetify.js +137 -99
  19. package/dist/vuetify.js.map +1 -1
  20. package/dist/vuetify.min.css +2 -2
  21. package/dist/vuetify.min.js +334 -330
  22. package/dist/vuetify.min.js.map +1 -1
  23. package/lib/components/VAvatar/VAvatar.css +1 -1
  24. package/lib/components/VAvatar/_variables.scss +1 -1
  25. package/lib/components/VBtnToggle/VBtnToggle.css +21 -0
  26. package/lib/components/VBtnToggle/VBtnToggle.sass +22 -0
  27. package/lib/components/VCard/VCard.js +8 -1
  28. package/lib/components/VCard/VCard.js.map +1 -1
  29. package/lib/components/VDatePicker/VDatePicker.js +7 -16
  30. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  31. package/lib/components/VList/VList.css +6 -0
  32. package/lib/components/VList/VList.sass +6 -0
  33. package/lib/components/VList/VListItem.css +0 -3
  34. package/lib/components/VList/VListItem.sass +0 -4
  35. package/lib/components/VOverlay/useActivator.js +2 -1
  36. package/lib/components/VOverlay/useActivator.js.map +1 -1
  37. package/lib/components/VTabs/VTab.css +8 -0
  38. package/lib/components/VTabs/VTab.sass +7 -0
  39. package/lib/components/VTextField/VTextField.js +17 -7
  40. package/lib/components/VTextField/VTextField.js.map +1 -1
  41. package/lib/components/VTextarea/VTextarea.js +17 -7
  42. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  43. package/lib/composables/calendar.d.ts +6 -0
  44. package/lib/composables/calendar.js +37 -2
  45. package/lib/composables/calendar.js.map +1 -1
  46. package/lib/composables/delay.js +3 -2
  47. package/lib/composables/delay.js.map +1 -1
  48. package/lib/composables/hotkey/hotkey.js +42 -53
  49. package/lib/composables/hotkey/hotkey.js.map +1 -1
  50. package/lib/entry-bundler.js +1 -1
  51. package/lib/entry-bundler.js.map +1 -1
  52. package/lib/framework.d.ts +56 -56
  53. package/lib/framework.js +1 -1
  54. package/lib/framework.js.map +1 -1
  55. package/lib/labs/VDateInput/VDateInput.js +8 -12
  56. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  57. package/lib/labs/VHotkey/VHotkey.css +4 -16
  58. package/lib/labs/VHotkey/VHotkey.d.ts +29 -29
  59. package/lib/labs/VHotkey/VHotkey.js +62 -106
  60. package/lib/labs/VHotkey/VHotkey.js.map +1 -1
  61. package/lib/labs/VHotkey/VHotkey.scss +8 -25
  62. package/lib/styles/main.css +4 -0
  63. package/lib/styles/settings/_variables.scss +1 -0
  64. package/lib/util/box.js +3 -8
  65. package/lib/util/box.js.map +1 -1
  66. package/lib/util/throttle.js +2 -2
  67. package/lib/util/throttle.js.map +1 -1
  68. package/package.json +1 -1
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.10.8
2
+ * Vuetify v3.10.10
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -613,7 +613,8 @@
613
613
  class Box {
614
614
  constructor(args) {
615
615
  const pageScale = document.body.currentCSSZoom ?? 1;
616
- const factor = args instanceof DOMRect ? 1 + (1 - pageScale) / pageScale : 1;
616
+ const ignoreZoom = args.top === undefined; // detect DOMRect without breaking in jsdom
617
+ const factor = ignoreZoom ? 1 : 1 + (1 - pageScale) / pageScale;
617
618
  const {
618
619
  x,
619
620
  y,
@@ -683,13 +684,7 @@
683
684
  });
684
685
  }
685
686
  } else {
686
- const rect = el.getBoundingClientRect();
687
- return new Box({
688
- x: rect.x,
689
- y: rect.y,
690
- width: el.clientWidth,
691
- height: el.clientHeight
692
- });
687
+ return new Box(el.getBoundingClientRect());
693
688
  }
694
689
  }
695
690
 
@@ -1760,7 +1755,7 @@
1760
1755
  const elapsed = now - Math.max(start, lastExec);
1761
1756
  function invoke() {
1762
1757
  lastExec = Date.now();
1763
- timeoutId = window.setTimeout(clear, delay);
1758
+ timeoutId = setTimeout(clear, delay);
1764
1759
  fn(...args);
1765
1760
  }
1766
1761
  if (!throttling) {
@@ -1771,7 +1766,7 @@
1771
1766
  } else if (elapsed >= delay) {
1772
1767
  invoke();
1773
1768
  } else if (options.trailing) {
1774
- timeoutId = window.setTimeout(invoke, delay - elapsed);
1769
+ timeoutId = setTimeout(invoke, delay - elapsed);
1775
1770
  }
1776
1771
  };
1777
1772
  wrap.clear = clear;
@@ -11575,9 +11570,10 @@
11575
11570
  let clearDelay = () => {};
11576
11571
  function runDelay(isOpening, options) {
11577
11572
  clearDelay?.();
11578
- const delay = Math.max(options?.minDelay ?? 0, Number(isOpening ? props.openDelay : props.closeDelay));
11573
+ const delay = isOpening ? props.openDelay : props.closeDelay;
11574
+ const normalizedDelay = Math.max(options?.minDelay ?? 0, Number(delay ?? 0));
11579
11575
  return new Promise(resolve => {
11580
- clearDelay = defer(delay, () => {
11576
+ clearDelay = defer(normalizedDelay, () => {
11581
11577
  cb?.(isOpening);
11582
11578
  resolve(isOpening);
11583
11579
  });
@@ -11705,7 +11701,8 @@
11705
11701
  };
11706
11702
  }
11707
11703
  if (openOnFocus.value) {
11708
- events.onFocusin = () => {
11704
+ events.onFocusin = e => {
11705
+ if (!e.target.matches(':focus-visible')) return;
11709
11706
  isFocused = true;
11710
11707
  runOpenDelay();
11711
11708
  };
@@ -13083,14 +13080,24 @@
13083
13080
  }
13084
13081
  function onInput(e) {
13085
13082
  const el = e.target;
13086
- model.value = el.value;
13087
- if (props.modelModifiers?.trim && ['text', 'search', 'password', 'tel', 'url'].includes(props.type)) {
13088
- const caretPosition = [el.selectionStart, el.selectionEnd];
13089
- vue.nextTick(() => {
13090
- el.selectionStart = caretPosition[0];
13091
- el.selectionEnd = caretPosition[1];
13092
- });
13083
+ if (!(props.modelModifiers?.trim && ['text', 'search', 'password', 'tel', 'url'].includes(props.type))) {
13084
+ model.value = el.value;
13085
+ return;
13093
13086
  }
13087
+ const value = el.value;
13088
+ const start = el.selectionStart;
13089
+ const end = el.selectionEnd;
13090
+ model.value = value;
13091
+ vue.nextTick(() => {
13092
+ let offset = 0;
13093
+ if (value.trimStart().length === el.value.length) {
13094
+ // #22307 - Whitespace has been removed from the
13095
+ // start, offset the caret position to compensate
13096
+ offset = value.length - el.value.length;
13097
+ }
13098
+ if (start != null) el.selectionStart = start - offset;
13099
+ if (end != null) el.selectionEnd = end - offset;
13100
+ });
13094
13101
  }
13095
13102
  useRender(() => {
13096
13103
  const hasCounter = !!(slots.counter || props.counter !== false && props.counter != null);
@@ -15817,6 +15824,12 @@
15817
15824
  roundedClasses
15818
15825
  } = useRounded(props);
15819
15826
  const link = useLink(props, attrs);
15827
+ const loadingColor = vue.shallowRef(undefined);
15828
+ vue.watch(() => props.loading, (val, old) => {
15829
+ loadingColor.value = !val && typeof old === 'string' ? old : typeof val === 'boolean' ? undefined : val;
15830
+ }, {
15831
+ immediate: true
15832
+ });
15820
15833
  useRender(() => {
15821
15834
  const isLink = props.link !== false && link.isLink.value;
15822
15835
  const isClickable = !props.disabled && props.link !== false && (props.link || link.isClickable.value);
@@ -15859,7 +15872,7 @@
15859
15872
  }, slots.image)]), vue.createVNode(LoaderSlot, {
15860
15873
  "name": "v-card",
15861
15874
  "active": !!props.loading,
15862
- "color": typeof props.loading === 'boolean' ? undefined : props.loading
15875
+ "color": loadingColor.value
15863
15876
  }, {
15864
15877
  default: slots.loader
15865
15878
  }), hasCardItem && vue.createVNode(VCardItem, {
@@ -19282,11 +19295,6 @@
19282
19295
  let keyGroups;
19283
19296
  let isSequence = false;
19284
19297
  let groupIndex = 0;
19285
- function clearTimer() {
19286
- if (!timeout) return;
19287
- clearTimeout(timeout);
19288
- timeout = 0;
19289
- }
19290
19298
  function isInputFocused() {
19291
19299
  if (vue.toValue(inputs)) return false;
19292
19300
  const activeElement = document.activeElement;
@@ -19294,12 +19302,12 @@
19294
19302
  }
19295
19303
  function resetSequence() {
19296
19304
  groupIndex = 0;
19297
- clearTimer();
19305
+ clearTimeout(timeout);
19298
19306
  }
19299
19307
  function handler(e) {
19300
19308
  const group = keyGroups[groupIndex];
19301
19309
  if (!group || isInputFocused()) return;
19302
- if (!matchesKeyGroup(e, group)) {
19310
+ if (!matchesKeyGroup(e, group, isMac)) {
19303
19311
  if (isSequence) resetSequence();
19304
19312
  return;
19305
19313
  }
@@ -19308,7 +19316,7 @@
19308
19316
  callback(e);
19309
19317
  return;
19310
19318
  }
19311
- clearTimer();
19319
+ clearTimeout(timeout);
19312
19320
  groupIndex++;
19313
19321
  if (groupIndex === keyGroups.length) {
19314
19322
  callback(e);
@@ -19319,12 +19327,12 @@
19319
19327
  }
19320
19328
  function cleanup() {
19321
19329
  window.removeEventListener(vue.toValue(event), handler);
19322
- clearTimer();
19330
+ clearTimeout(timeout);
19323
19331
  }
19324
- vue.watch(() => vue.toValue(keys), function (unrefKeys) {
19332
+ vue.watch(() => vue.toValue(keys), newKeys => {
19325
19333
  cleanup();
19326
- if (unrefKeys) {
19327
- const groups = splitKeySequence(unrefKeys.toLowerCase());
19334
+ if (newKeys) {
19335
+ const groups = splitKeySequence(newKeys.toLowerCase());
19328
19336
  isSequence = groups.length > 1;
19329
19337
  keyGroups = groups;
19330
19338
  resetSequence();
@@ -19335,55 +19343,50 @@
19335
19343
  });
19336
19344
 
19337
19345
  // Watch for changes in the event type to re-register the listener
19338
- vue.watch(() => vue.toValue(event), function (newEvent, oldEvent) {
19346
+ vue.watch(() => vue.toValue(event), (newEvent, oldEvent) => {
19339
19347
  if (oldEvent && keyGroups && keyGroups.length > 0) {
19340
19348
  window.removeEventListener(oldEvent, handler);
19341
19349
  window.addEventListener(newEvent, handler);
19342
19350
  }
19343
19351
  });
19344
- try {
19345
- getCurrentInstance('useHotkey');
19346
- vue.onBeforeUnmount(cleanup);
19347
- } catch {
19348
- // Not in Vue setup context
19349
- }
19350
- function parseKeyGroup(group) {
19351
- const MODIFIERS = ['ctrl', 'shift', 'alt', 'meta', 'cmd'];
19352
+ vue.onScopeDispose(cleanup, true);
19353
+ return cleanup;
19354
+ }
19355
+ function matchesKeyGroup(e, group, isMac) {
19356
+ const {
19357
+ modifiers,
19358
+ actualKey
19359
+ } = parseKeyGroup(group);
19360
+ const expectCtrl = modifiers.ctrl || !isMac && (modifiers.cmd || modifiers.meta);
19361
+ const expectMeta = isMac && (modifiers.cmd || modifiers.meta);
19362
+ return e.ctrlKey === expectCtrl && e.metaKey === expectMeta && e.shiftKey === modifiers.shift && e.altKey === modifiers.alt && e.key.toLowerCase() === actualKey?.toLowerCase();
19363
+ }
19364
+ function parseKeyGroup(group) {
19365
+ const MODIFIERS = ['ctrl', 'shift', 'alt', 'meta', 'cmd'];
19352
19366
 
19353
- // Use the shared combination splitting logic
19354
- const parts = splitKeyCombination(group.toLowerCase());
19367
+ // Use the shared combination splitting logic
19368
+ const parts = splitKeyCombination(group.toLowerCase());
19355
19369
 
19356
- // If the combination is invalid, return empty result
19357
- if (parts.length === 0) {
19358
- return {
19359
- modifiers: Object.fromEntries(MODIFIERS.map(m => [m, false])),
19360
- actualKey: undefined
19361
- };
19362
- }
19363
- const modifiers = Object.fromEntries(MODIFIERS.map(m => [m, false]));
19364
- let actualKey;
19365
- for (const part of parts) {
19366
- if (MODIFIERS.includes(part)) {
19367
- modifiers[part] = true;
19368
- } else {
19369
- actualKey = part;
19370
- }
19371
- }
19370
+ // If the combination is invalid, return empty result
19371
+ if (parts.length === 0) {
19372
19372
  return {
19373
- modifiers,
19374
- actualKey
19373
+ modifiers: Object.fromEntries(MODIFIERS.map(m => [m, false])),
19374
+ actualKey: undefined
19375
19375
  };
19376
19376
  }
19377
- function matchesKeyGroup(e, group) {
19378
- const {
19379
- modifiers,
19380
- actualKey
19381
- } = parseKeyGroup(group);
19382
- const expectCtrl = modifiers.ctrl || !isMac && (modifiers.cmd || modifiers.meta);
19383
- const expectMeta = isMac && (modifiers.cmd || modifiers.meta);
19384
- return e.ctrlKey === expectCtrl && e.metaKey === expectMeta && e.shiftKey === modifiers.shift && e.altKey === modifiers.alt && e.key.toLowerCase() === actualKey?.toLowerCase();
19377
+ const modifiers = Object.fromEntries(MODIFIERS.map(m => [m, false]));
19378
+ let actualKey;
19379
+ for (const part of parts) {
19380
+ if (MODIFIERS.includes(part)) {
19381
+ modifiers[part] = true;
19382
+ } else {
19383
+ actualKey = part;
19384
+ }
19385
19385
  }
19386
- return cleanup;
19386
+ return {
19387
+ modifiers,
19388
+ actualKey
19389
+ };
19387
19390
  }
19388
19391
 
19389
19392
  // Utilities
@@ -24004,11 +24007,15 @@
24004
24007
  return week.length ? adapter.getWeek(week[0], props.firstDayOfWeek, props.firstDayOfYear) : null;
24005
24008
  });
24006
24009
  });
24010
+ const {
24011
+ minDate,
24012
+ maxDate
24013
+ } = useCalendarRange(props);
24007
24014
  function isDisabled(value) {
24008
24015
  if (props.disabled) return true;
24009
24016
  const date = adapter.date(value);
24010
- if (props.min && adapter.isBefore(adapter.endOfDay(date), adapter.date(props.min))) return true;
24011
- if (props.max && adapter.isAfter(date, adapter.date(props.max))) return true;
24017
+ if (minDate.value && adapter.isBefore(adapter.endOfDay(date), minDate.value)) return true;
24018
+ if (maxDate.value && adapter.isAfter(date, maxDate.value)) return true;
24012
24019
  if (Array.isArray(props.allowedDates) && props.allowedDates.length > 0) {
24013
24020
  return !props.allowedDates.some(d => adapter.isSameDay(adapter.date(d), date));
24014
24021
  }
@@ -24028,6 +24035,37 @@
24028
24035
  weekNumbers
24029
24036
  };
24030
24037
  }
24038
+ function useCalendarRange(props) {
24039
+ const adapter = useDate();
24040
+ const minDate = vue.computed(() => {
24041
+ if (!props.min) return null;
24042
+ const date = adapter.date(props.min);
24043
+ return adapter.isValid(date) ? date : null;
24044
+ });
24045
+ const maxDate = vue.computed(() => {
24046
+ if (!props.max) return null;
24047
+ const date = adapter.date(props.max);
24048
+ return adapter.isValid(date) ? date : null;
24049
+ });
24050
+ function clampDate(date) {
24051
+ if (minDate.value && adapter.isBefore(date, minDate.value)) {
24052
+ return minDate.value;
24053
+ }
24054
+ if (maxDate.value && adapter.isAfter(date, maxDate.value)) {
24055
+ return maxDate.value;
24056
+ }
24057
+ return date;
24058
+ }
24059
+ function isInAllowedRange(date) {
24060
+ return (!minDate.value || adapter.isAfter(date, minDate.value)) && (!maxDate.value || adapter.isBefore(date, maxDate.value));
24061
+ }
24062
+ return {
24063
+ minDate,
24064
+ maxDate,
24065
+ clampDate,
24066
+ isInAllowedRange
24067
+ };
24068
+ }
24031
24069
 
24032
24070
  // Types
24033
24071
 
@@ -24468,24 +24506,14 @@
24468
24506
  const viewMode = useProxiedModel(props, 'viewMode');
24469
24507
  // const inputMode = useProxiedModel(props, 'inputMode')
24470
24508
 
24471
- const minDate = vue.computed(() => {
24472
- const date = adapter.date(props.min);
24473
- return props.min && adapter.isValid(date) ? date : null;
24474
- });
24475
- const maxDate = vue.computed(() => {
24476
- const date = adapter.date(props.max);
24477
- return props.max && adapter.isValid(date) ? date : null;
24478
- });
24509
+ const {
24510
+ minDate,
24511
+ maxDate,
24512
+ clampDate
24513
+ } = useCalendarRange(props);
24479
24514
  const internal = vue.computed(() => {
24480
24515
  const today = adapter.date();
24481
- let value = today;
24482
- if (model.value?.[0]) {
24483
- value = adapter.date(model.value[0]);
24484
- } else if (minDate.value && adapter.isBefore(today, minDate.value)) {
24485
- value = minDate.value;
24486
- } else if (maxDate.value && adapter.isAfter(today, maxDate.value)) {
24487
- value = maxDate.value;
24488
- }
24516
+ const value = model.value?.[0] ? adapter.date(model.value[0]) : clampDate(today);
24489
24517
  return value && adapter.isValid(value) ? value : today;
24490
24518
  });
24491
24519
  const headerColor = vue.toRef(() => props.headerColor ?? props.color);
@@ -30272,14 +30300,24 @@
30272
30300
  }
30273
30301
  function onInput(e) {
30274
30302
  const el = e.target;
30275
- model.value = el.value;
30276
- if (props.modelModifiers?.trim) {
30277
- const caretPosition = [el.selectionStart, el.selectionEnd];
30278
- vue.nextTick(() => {
30279
- el.selectionStart = caretPosition[0];
30280
- el.selectionEnd = caretPosition[1];
30281
- });
30303
+ if (!props.modelModifiers?.trim) {
30304
+ model.value = el.value;
30305
+ return;
30282
30306
  }
30307
+ const value = el.value;
30308
+ const start = el.selectionStart;
30309
+ const end = el.selectionEnd;
30310
+ model.value = value;
30311
+ vue.nextTick(() => {
30312
+ let offset = 0;
30313
+ if (value.trimStart().length === el.value.length) {
30314
+ // #22307 - Whitespace has been removed from the
30315
+ // start, offset the caret position to compensate
30316
+ offset = value.length - el.value.length;
30317
+ }
30318
+ if (start != null) el.selectionStart = start - offset;
30319
+ if (end != null) el.selectionEnd = end - offset;
30320
+ });
30283
30321
  }
30284
30322
  const sizerRef = vue.ref();
30285
30323
  const rows = vue.ref(Number(props.rows));
@@ -32518,7 +32556,7 @@
32518
32556
  };
32519
32557
  });
32520
32558
  }
32521
- const version$1 = "3.10.8";
32559
+ const version$1 = "3.10.10";
32522
32560
  createVuetify$1.version = version$1;
32523
32561
 
32524
32562
  // Vue's inject() can only be used in setup
@@ -32543,7 +32581,7 @@
32543
32581
  ...options
32544
32582
  });
32545
32583
  };
32546
- const version = "3.10.8";
32584
+ const version = "3.10.10";
32547
32585
  createVuetify.version = version;
32548
32586
 
32549
32587
  exports.blueprints = index;