vuetify 3.5.3 → 3.5.5

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 (159) hide show
  1. package/dist/json/attributes.json +2771 -2523
  2. package/dist/json/importMap-labs.json +12 -8
  3. package/dist/json/importMap.json +100 -100
  4. package/dist/json/tags.json +236 -169
  5. package/dist/json/web-types.json +3218 -2563
  6. package/dist/vuetify-labs.css +2265 -2242
  7. package/dist/vuetify-labs.d.ts +1234 -152
  8. package/dist/vuetify-labs.esm.js +582 -88
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +582 -88
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +1316 -1293
  13. package/dist/vuetify.d.ts +894 -187
  14. package/dist/vuetify.esm.js +148 -87
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +148 -87
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +652 -647
  20. package/dist/vuetify.min.js.map +1 -1
  21. package/lib/components/VAlert/index.d.mts +9 -0
  22. package/lib/components/VAppBar/index.d.mts +18 -0
  23. package/lib/components/VAutocomplete/VAutocomplete.mjs +4 -4
  24. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  25. package/lib/components/VAutocomplete/index.d.mts +33 -6
  26. package/lib/components/VAvatar/VAvatar.mjs +2 -2
  27. package/lib/components/VAvatar/VAvatar.mjs.map +1 -1
  28. package/lib/components/VAvatar/index.d.mts +9 -0
  29. package/lib/components/VBadge/index.d.mts +9 -0
  30. package/lib/components/VBanner/index.d.mts +9 -0
  31. package/lib/components/VBottomNavigation/index.d.mts +9 -0
  32. package/lib/components/VBreadcrumbs/index.d.mts +9 -0
  33. package/lib/components/VBtn/index.d.mts +9 -0
  34. package/lib/components/VBtnGroup/index.d.mts +9 -0
  35. package/lib/components/VBtnToggle/index.d.mts +9 -0
  36. package/lib/components/VCard/index.d.mts +9 -0
  37. package/lib/components/VCarousel/index.d.mts +9 -0
  38. package/lib/components/VChip/index.d.mts +9 -0
  39. package/lib/components/VColorPicker/VColorPicker.mjs +24 -12
  40. package/lib/components/VColorPicker/VColorPicker.mjs.map +1 -1
  41. package/lib/components/VColorPicker/index.d.mts +9 -0
  42. package/lib/components/VCombobox/index.d.mts +33 -6
  43. package/lib/components/VDataIterator/index.d.mts +3 -3
  44. package/lib/components/VDataTable/VDataTable.mjs.map +1 -1
  45. package/lib/components/VDataTable/VDataTableHeaders.mjs.map +1 -1
  46. package/lib/components/VDataTable/index.d.mts +355 -117
  47. package/lib/components/VDataTable/types.mjs.map +1 -1
  48. package/lib/components/VDatePicker/VDatePicker.css +2 -21
  49. package/lib/components/VDatePicker/VDatePicker.mjs +15 -11
  50. package/lib/components/VDatePicker/VDatePicker.mjs.map +1 -1
  51. package/lib/components/VDatePicker/VDatePicker.sass +3 -18
  52. package/lib/components/VDatePicker/VDatePickerHeader.css +2 -0
  53. package/lib/components/VDatePicker/VDatePickerHeader.sass +3 -0
  54. package/lib/components/VDatePicker/VDatePickerMonth.css +11 -5
  55. package/lib/components/VDatePicker/VDatePickerMonth.mjs +2 -1
  56. package/lib/components/VDatePicker/VDatePickerMonth.mjs.map +1 -1
  57. package/lib/components/VDatePicker/VDatePickerMonth.sass +13 -5
  58. package/lib/components/VDatePicker/VDatePickerMonths.css +2 -3
  59. package/lib/components/VDatePicker/VDatePickerMonths.mjs +6 -3
  60. package/lib/components/VDatePicker/VDatePickerMonths.mjs.map +1 -1
  61. package/lib/components/VDatePicker/VDatePickerMonths.sass +4 -3
  62. package/lib/components/VDatePicker/VDatePickerYears.css +2 -2
  63. package/lib/components/VDatePicker/VDatePickerYears.mjs +8 -1
  64. package/lib/components/VDatePicker/VDatePickerYears.mjs.map +1 -1
  65. package/lib/components/VDatePicker/VDatePickerYears.sass +4 -2
  66. package/lib/components/VDatePicker/_variables.scss +14 -34
  67. package/lib/components/VDatePicker/index.d.mts +13 -4
  68. package/lib/components/VExpansionPanel/VExpansionPanel.css +14 -0
  69. package/lib/components/VExpansionPanel/VExpansionPanel.sass +14 -0
  70. package/lib/components/VExpansionPanel/VExpansionPanels.mjs +9 -2
  71. package/lib/components/VExpansionPanel/VExpansionPanels.mjs.map +1 -1
  72. package/lib/components/VExpansionPanel/index.d.mts +27 -0
  73. package/lib/components/VField/VField.css +20 -1
  74. package/lib/components/VField/VField.sass +19 -1
  75. package/lib/components/VField/index.d.mts +9 -0
  76. package/lib/components/VFileInput/VFileInput.mjs +1 -1
  77. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  78. package/lib/components/VFileInput/index.d.mts +9 -0
  79. package/lib/components/VFooter/index.d.mts +9 -0
  80. package/lib/components/VImg/index.d.mts +9 -0
  81. package/lib/components/VList/VListItem.css +2 -1
  82. package/lib/components/VList/VListItem.sass +1 -0
  83. package/lib/components/VList/_variables.scss +2 -1
  84. package/lib/components/VList/index.d.mts +18 -0
  85. package/lib/components/VMenu/VMenu.mjs +5 -5
  86. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  87. package/lib/components/VMenu/shared.mjs.map +1 -1
  88. package/lib/components/VNavigationDrawer/index.d.mts +9 -0
  89. package/lib/components/VPagination/index.d.mts +9 -0
  90. package/lib/components/VProgressLinear/index.d.mts +9 -0
  91. package/lib/components/VRangeSlider/index.d.mts +9 -0
  92. package/lib/components/VSelect/VSelect.mjs +4 -3
  93. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  94. package/lib/components/VSelect/index.d.mts +33 -6
  95. package/lib/components/VSheet/index.d.mts +9 -0
  96. package/lib/components/VSlider/index.d.mts +9 -0
  97. package/lib/components/VSnackbar/VSnackbar.mjs +1 -2
  98. package/lib/components/VSnackbar/VSnackbar.mjs.map +1 -1
  99. package/lib/components/VSnackbar/index.d.mts +9 -0
  100. package/lib/components/VStepper/index.d.mts +9 -0
  101. package/lib/components/VSystemBar/index.d.mts +9 -0
  102. package/lib/components/VTabs/index.d.mts +33 -6
  103. package/lib/components/VTextField/index.d.mts +33 -6
  104. package/lib/components/VTextarea/index.d.mts +9 -0
  105. package/lib/components/VTimeline/index.d.mts +9 -0
  106. package/lib/components/VToolbar/index.d.mts +9 -0
  107. package/lib/components/VTooltip/VTooltip.css +1 -0
  108. package/lib/components/VTooltip/VTooltip.sass +1 -0
  109. package/lib/components/VTooltip/_variables.scss +1 -0
  110. package/lib/components/index.d.mts +857 -151
  111. package/lib/composables/form.mjs +2 -1
  112. package/lib/composables/form.mjs.map +1 -1
  113. package/lib/composables/goto.mjs +16 -18
  114. package/lib/composables/goto.mjs.map +1 -1
  115. package/lib/composables/group.mjs +2 -0
  116. package/lib/composables/group.mjs.map +1 -1
  117. package/lib/composables/icons.mjs +17 -13
  118. package/lib/composables/icons.mjs.map +1 -1
  119. package/lib/composables/rounded.mjs +5 -1
  120. package/lib/composables/rounded.mjs.map +1 -1
  121. package/lib/composables/virtual.mjs +11 -3
  122. package/lib/composables/virtual.mjs.map +1 -1
  123. package/lib/entry-bundler.mjs +1 -1
  124. package/lib/framework.mjs +1 -1
  125. package/lib/iconsets/fa-svg.mjs +2 -1
  126. package/lib/iconsets/fa-svg.mjs.map +1 -1
  127. package/lib/index.d.mts +37 -36
  128. package/lib/labs/VCalendar/VCalendar.mjs +1 -1
  129. package/lib/labs/VCalendar/VCalendar.mjs.map +1 -1
  130. package/lib/labs/VConfirmEdit/__test__/VConfirmEdit.spec.cy.mjs +1 -1
  131. package/lib/labs/VConfirmEdit/__test__/VConfirmEdit.spec.cy.mjs.map +1 -1
  132. package/lib/labs/VPicker/VPicker.css +2 -2
  133. package/lib/labs/VPicker/VPicker.sass +2 -2
  134. package/lib/labs/VPicker/_variables.scss +2 -4
  135. package/lib/labs/VPicker/index.d.mts +9 -0
  136. package/lib/labs/VSparkline/VBarline.mjs +138 -0
  137. package/lib/labs/VSparkline/VBarline.mjs.map +1 -0
  138. package/lib/labs/VSparkline/VSparkline.mjs +49 -0
  139. package/lib/labs/VSparkline/VSparkline.mjs.map +1 -0
  140. package/lib/labs/VSparkline/VTrendline.mjs +143 -0
  141. package/lib/labs/VSparkline/VTrendline.mjs.map +1 -0
  142. package/lib/labs/VSparkline/index.d.mts +374 -0
  143. package/lib/labs/VSparkline/index.mjs +2 -0
  144. package/lib/labs/VSparkline/index.mjs.map +1 -0
  145. package/lib/labs/VSparkline/util/line.mjs +52 -0
  146. package/lib/labs/VSparkline/util/line.mjs.map +1 -0
  147. package/lib/labs/VSparkline/util/path.mjs +60 -0
  148. package/lib/labs/VSparkline/util/path.mjs.map +1 -0
  149. package/lib/labs/components.d.mts +376 -1
  150. package/lib/labs/components.mjs +1 -0
  151. package/lib/labs/components.mjs.map +1 -1
  152. package/lib/locale/nl.mjs +1 -1
  153. package/lib/locale/nl.mjs.map +1 -1
  154. package/lib/util/helpers.mjs +10 -0
  155. package/lib/util/helpers.mjs.map +1 -1
  156. package/package.json +2 -2
  157. package/lib/components/VDatePicker/VDatePickerTitle.mjs +0 -81
  158. package/lib/components/VDatePicker/VDatePickerTitle.mjs.map +0 -1
  159. package/lib/components/VDatePicker/VDatePickerTitle.sass +0 -33
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.5.3
2
+ * Vuetify v3.5.5
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -549,6 +549,16 @@
549
549
  const timeoutId = window.setTimeout(cb, timeout);
550
550
  return () => window.clearTimeout(timeoutId);
551
551
  }
552
+ function isClickInsideElement(event, targetDiv) {
553
+ const mouseX = event.clientX;
554
+ const mouseY = event.clientY;
555
+ const divRect = targetDiv.getBoundingClientRect();
556
+ const divLeft = divRect.left;
557
+ const divTop = divRect.top;
558
+ const divRight = divRect.right;
559
+ const divBottom = divRect.bottom;
560
+ return mouseX >= divLeft && mouseX <= divRight && mouseY >= divTop && mouseY <= divBottom;
561
+ }
552
562
 
553
563
  // Utilities
554
564
  const block = ['top', 'bottom'];
@@ -2160,7 +2170,7 @@
2160
2170
  vue.provide(LocaleSymbol, data);
2161
2171
  return data;
2162
2172
  }
2163
- function genDefaults$2() {
2173
+ function genDefaults$3() {
2164
2174
  return {
2165
2175
  af: false,
2166
2176
  ar: true,
@@ -2207,7 +2217,7 @@
2207
2217
  };
2208
2218
  }
2209
2219
  function createRtl(i18n, options) {
2210
- const rtl = vue.ref(options?.rtl ?? genDefaults$2());
2220
+ const rtl = vue.ref(options?.rtl ?? genDefaults$3());
2211
2221
  const isRtl = vue.computed(() => rtl.value[i18n.current.value] ?? false);
2212
2222
  return {
2213
2223
  isRtl,
@@ -2240,7 +2250,7 @@
2240
2250
  const makeThemeProps = propsFactory({
2241
2251
  theme: String
2242
2252
  }, 'theme');
2243
- function genDefaults$1() {
2253
+ function genDefaults$2() {
2244
2254
  return {
2245
2255
  defaultTheme: 'light',
2246
2256
  variations: {
@@ -2327,8 +2337,8 @@
2327
2337
  };
2328
2338
  }
2329
2339
  function parseThemeOptions() {
2330
- let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : genDefaults$1();
2331
- const defaults = genDefaults$1();
2340
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : genDefaults$2();
2341
+ const defaults = genDefaults$2();
2332
2342
  if (!options) return {
2333
2343
  ...defaults,
2334
2344
  isDisabled: true
@@ -3111,12 +3121,14 @@
3111
3121
  rounded: {
3112
3122
  type: [Boolean, Number, String],
3113
3123
  default: undefined
3114
- }
3124
+ },
3125
+ tile: Boolean
3115
3126
  }, 'rounded');
3116
3127
  function useRounded(props) {
3117
3128
  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
3118
3129
  const roundedClasses = vue.computed(() => {
3119
3130
  const rounded = vue.isRef(props) ? props.value : props.rounded;
3131
+ const tile = vue.isRef(props) ? props.value : props.tile;
3120
3132
  const classes = [];
3121
3133
  if (rounded === true || rounded === '') {
3122
3134
  classes.push(`${name}--rounded`);
@@ -3124,6 +3136,8 @@
3124
3136
  for (const value of String(rounded).split(' ')) {
3125
3137
  classes.push(`rounded-${value}`);
3126
3138
  }
3139
+ } else if (tile) {
3140
+ classes.push('rounded-0');
3127
3141
  }
3128
3142
  return classes;
3129
3143
  });
@@ -4114,6 +4128,8 @@
4114
4128
  vm.emit('group:selected', {
4115
4129
  value
4116
4130
  });
4131
+ }, {
4132
+ flush: 'sync'
4117
4133
  });
4118
4134
  return {
4119
4135
  id,
@@ -4449,23 +4465,27 @@
4449
4465
  };
4450
4466
  }
4451
4467
  });
4452
- const defaultSets = {
4453
- svg: {
4454
- component: VSvgIcon
4455
- },
4456
- class: {
4457
- component: VClassIcon
4458
- }
4459
- };
4468
+ function genDefaults$1() {
4469
+ return {
4470
+ svg: {
4471
+ component: VSvgIcon
4472
+ },
4473
+ class: {
4474
+ component: VClassIcon
4475
+ }
4476
+ };
4477
+ }
4460
4478
 
4461
4479
  // Composables
4462
4480
  function createIcons(options) {
4481
+ const sets = genDefaults$1();
4482
+ const defaultSet = options?.defaultSet ?? 'mdi';
4483
+ if (defaultSet === 'mdi' && !sets.mdi) {
4484
+ sets.mdi = mdi;
4485
+ }
4463
4486
  return mergeDeep({
4464
- defaultSet: 'mdi',
4465
- sets: {
4466
- ...defaultSets,
4467
- mdi
4468
- },
4487
+ defaultSet,
4488
+ sets,
4469
4489
  aliases: {
4470
4490
  ...aliases,
4471
4491
  /* eslint-disable max-len */
@@ -5901,7 +5921,7 @@
5901
5921
  }, null) : props.text : vue.createVNode(VDefaultsProvider, {
5902
5922
  "key": "content-defaults",
5903
5923
  "defaults": {
5904
- VAvatar: {
5924
+ VImg: {
5905
5925
  cover: true,
5906
5926
  image: props.image
5907
5927
  },
@@ -5910,7 +5930,7 @@
5910
5930
  }
5911
5931
  }
5912
5932
  }, {
5913
- default: () => [slots.default?.()]
5933
+ default: () => [slots.default()]
5914
5934
  }), genOverlays(false, 'v-avatar')]
5915
5935
  }));
5916
5936
  return {};
@@ -6469,7 +6489,8 @@
6469
6489
  errors.value = results;
6470
6490
  model.value = invalid > 0 ? false : valid === items.value.length ? true : null;
6471
6491
  }, {
6472
- deep: true
6492
+ deep: true,
6493
+ flush: 'post'
6473
6494
  });
6474
6495
  vue.provide(FormKey, {
6475
6496
  register: _ref => {
@@ -10573,9 +10594,9 @@
10573
10594
  unregister() {
10574
10595
  --openChildren.value;
10575
10596
  },
10576
- closeParents() {
10597
+ closeParents(e) {
10577
10598
  setTimeout(() => {
10578
- if (!openChildren.value) {
10599
+ if (!openChildren.value && (e == null || e && !isClickInsideElement(e, overlay.value.contentEl))) {
10579
10600
  isActive.value = false;
10580
10601
  parent?.closeParents();
10581
10602
  }
@@ -10608,8 +10629,8 @@
10608
10629
  document.removeEventListener('focusin', onFocusIn);
10609
10630
  }
10610
10631
  });
10611
- function onClickOutside() {
10612
- parent?.closeParents();
10632
+ function onClickOutside(e) {
10633
+ parent?.closeParents(e);
10613
10634
  }
10614
10635
  function onKeydown(e) {
10615
10636
  if (props.disabled) return;
@@ -11343,9 +11364,6 @@
11343
11364
  });
11344
11365
  });
11345
11366
  });
11346
- vue.watch(viewportHeight, (val, oldVal) => {
11347
- oldVal && calculateVisibleItems();
11348
- });
11349
11367
  vue.onScopeDispose(() => {
11350
11368
  updateOffsets.clear();
11351
11369
  });
@@ -11368,6 +11386,17 @@
11368
11386
  let lastScrollTop = 0;
11369
11387
  let scrollVelocity = 0;
11370
11388
  let lastScrollTime = 0;
11389
+ vue.watch(viewportHeight, (val, oldVal) => {
11390
+ if (oldVal) {
11391
+ calculateVisibleItems();
11392
+ if (val < oldVal) {
11393
+ requestAnimationFrame(() => {
11394
+ scrollVelocity = 0;
11395
+ calculateVisibleItems();
11396
+ });
11397
+ }
11398
+ }
11399
+ });
11371
11400
  function handleScroll() {
11372
11401
  if (!containerRef.value || !markerRef.value) return;
11373
11402
  const scrollTop = containerRef.value.scrollTop;
@@ -11820,9 +11849,10 @@
11820
11849
  }
11821
11850
  }
11822
11851
  function select(item) {
11852
+ const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
11853
+ const add = index === -1;
11823
11854
  if (props.multiple) {
11824
- const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
11825
- if (index === -1) {
11855
+ if (add) {
11826
11856
  model.value = [...model.value, item];
11827
11857
  } else {
11828
11858
  const value = [...model.value];
@@ -11830,7 +11860,7 @@
11830
11860
  model.value = value;
11831
11861
  }
11832
11862
  } else {
11833
- model.value = [item];
11863
+ model.value = add ? [item] : [];
11834
11864
  menu.value = false;
11835
11865
  }
11836
11866
  }
@@ -12367,11 +12397,11 @@
12367
12397
  }
12368
12398
  const isSelecting = vue.shallowRef(false);
12369
12399
  function select(item) {
12370
- let add = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12371
12400
  if (item.props.disabled) return;
12401
+ const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
12402
+ const add = index === -1;
12372
12403
  if (props.multiple) {
12373
- const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
12374
- if (index === -1) {
12404
+ if (add) {
12375
12405
  model.value = [...model.value, item];
12376
12406
  } else {
12377
12407
  const value = [...model.value];
@@ -12540,7 +12570,7 @@
12540
12570
  function onChipClose(e) {
12541
12571
  e.stopPropagation();
12542
12572
  e.preventDefault();
12543
- select(item, false);
12573
+ select(item);
12544
12574
  }
12545
12575
  const slotProps = {
12546
12576
  'onClick:close': onChipClose,
@@ -15812,8 +15842,8 @@
15812
15842
  },
15813
15843
  setup(props) {
15814
15844
  const mode = useProxiedModel(props, 'mode');
15815
- const lastPickedColor = vue.ref(null);
15816
- const currentColor = useProxiedModel(props, 'modelValue', undefined, v => {
15845
+ const hue = vue.ref(null);
15846
+ const model = useProxiedModel(props, 'modelValue', undefined, v => {
15817
15847
  if (v == null || v === '') return null;
15818
15848
  let c;
15819
15849
  try {
@@ -15822,24 +15852,36 @@
15822
15852
  consoleWarn(err);
15823
15853
  return null;
15824
15854
  }
15825
- if (lastPickedColor.value) {
15826
- c = {
15827
- ...c,
15828
- h: lastPickedColor.value.h
15829
- };
15830
- lastPickedColor.value = null;
15831
- }
15832
15855
  return c;
15833
15856
  }, v => {
15834
15857
  if (!v) return null;
15835
15858
  return extractColor(v, props.modelValue);
15836
15859
  });
15860
+ const currentColor = vue.computed(() => {
15861
+ return model.value ? {
15862
+ ...model.value,
15863
+ h: hue.value ?? model.value.h
15864
+ } : null;
15865
+ });
15837
15866
  const {
15838
15867
  rtlClasses
15839
15868
  } = useRtl();
15869
+ let externalChange = true;
15870
+ vue.watch(model, v => {
15871
+ if (!externalChange) {
15872
+ // prevent hue shift from rgb conversion inaccuracy
15873
+ externalChange = true;
15874
+ return;
15875
+ }
15876
+ if (!v) return;
15877
+ hue.value = v.h;
15878
+ }, {
15879
+ immediate: true
15880
+ });
15840
15881
  const updateColor = hsva => {
15841
- currentColor.value = hsva;
15842
- lastPickedColor.value = hsva;
15882
+ externalChange = false;
15883
+ hue.value = hsva.h;
15884
+ model.value = hsva;
15843
15885
  };
15844
15886
  vue.onMounted(() => {
15845
15887
  if (!props.modes.includes(mode.value)) mode.value = props.modes[0];
@@ -17609,7 +17651,8 @@
17609
17651
  };
17610
17652
  }
17611
17653
  async function scrollTo(_target, _options, horizontal, goTo) {
17612
- const options = mergeDeep(goTo?.options, _options);
17654
+ const property = horizontal ? 'scrollLeft' : 'scrollTop';
17655
+ const options = mergeDeep(goTo?.options ?? genDefaults(), _options);
17613
17656
  const rtl = goTo?.rtl.value;
17614
17657
  const target = (typeof _target === 'number' ? _target : getTarget(_target)) ?? 0;
17615
17658
  const container = options.container === 'parent' && target instanceof HTMLElement ? target.parentElement : getContainer(options.container);
@@ -17627,25 +17670,22 @@
17627
17670
  }
17628
17671
  }
17629
17672
  targetLocation += options.offset;
17630
- const startLocation = (horizontal ? container.scrollLeft : container.scrollTop) ?? 0;
17673
+ const startLocation = container[property] ?? 0;
17631
17674
  if (targetLocation === startLocation) return Promise.resolve(targetLocation);
17632
17675
  const startTime = performance.now();
17633
17676
  return new Promise(resolve => requestAnimationFrame(function step(currentTime) {
17634
17677
  const timeElapsed = currentTime - startTime;
17635
- const progress = Math.abs(options.duration ? Math.min(timeElapsed / options.duration, 1) : 1);
17636
- const location = Math.floor(startLocation + (targetLocation - startLocation) * ease(progress));
17637
- container[horizontal ? 'scrollLeft' : 'scrollTop'] = location;
17638
- if (progress === 1) return resolve(targetLocation);
17639
- let clientSize;
17640
- let reachEnd;
17641
- if (!horizontal) {
17642
- clientSize = container === document.body ? document.documentElement.clientHeight : container.clientHeight;
17643
- reachEnd = clientSize + container.scrollTop >= container.scrollHeight;
17644
- if (targetLocation > container.scrollTop && reachEnd) return resolve(targetLocation);
17645
- } else {
17646
- clientSize = container === document.body ? document.documentElement.clientWidth : container.clientWidth;
17647
- reachEnd = clientSize + container.scrollLeft >= container.scrollWidth;
17648
- if (targetLocation > container.scrollLeft && reachEnd) return resolve(targetLocation);
17678
+ const progress = timeElapsed / options.duration;
17679
+ const location = Math.floor(startLocation + (targetLocation - startLocation) * ease(Math.max(progress, 1)));
17680
+ container[property] = location;
17681
+
17682
+ // Allow for some jitter if target time has elapsed
17683
+ if (progress >= 1 && Math.abs(location - container[property]) < 10) {
17684
+ return resolve(targetLocation);
17685
+ } else if (progress > 2) {
17686
+ // The target might not be reachable
17687
+ consoleWarn('Scroll target is not reachable');
17688
+ return resolve(container[property]);
17649
17689
  }
17650
17690
  requestAnimationFrame(step);
17651
17691
  }));
@@ -20582,12 +20622,13 @@
20582
20622
  }, [(props.showAdjacentMonths || !item.isAdjacent) && vue.createVNode(VDefaultsProvider, {
20583
20623
  "defaults": {
20584
20624
  VBtn: {
20625
+ class: 'v-date-picker-month__day-btn',
20585
20626
  color: (item.isSelected || item.isToday) && !item.isDisabled ? props.color : undefined,
20586
20627
  disabled: item.isDisabled,
20587
20628
  icon: true,
20588
20629
  ripple: false,
20589
20630
  text: item.localized,
20590
- variant: item.isDisabled ? 'text' : item.isToday && !item.isSelected ? 'outlined' : 'flat',
20631
+ variant: item.isDisabled ? item.isToday ? 'outlined' : 'text' : item.isToday && !item.isSelected ? 'outlined' : 'flat',
20591
20632
  onClick: () => onClick(item.date)
20592
20633
  }
20593
20634
  }
@@ -20613,6 +20654,7 @@
20613
20654
  },
20614
20655
  setup(props, _ref) {
20615
20656
  let {
20657
+ emit,
20616
20658
  slots
20617
20659
  } = _ref;
20618
20660
  const adapter = useDate();
@@ -20648,6 +20690,10 @@
20648
20690
  onClick: () => onClick(i)
20649
20691
  };
20650
20692
  function onClick(i) {
20693
+ if (model.value === i) {
20694
+ emit('update:modelValue', model.value);
20695
+ return;
20696
+ }
20651
20697
  model.value = i;
20652
20698
  }
20653
20699
  return slots.month?.({
@@ -20656,9 +20702,7 @@
20656
20702
  props: btnProps
20657
20703
  }) ?? vue.createVNode(VBtn, vue.mergeProps({
20658
20704
  "key": "month"
20659
- }, btnProps, {
20660
- "onClick": () => onClick(i)
20661
- }), null);
20705
+ }, btnProps), null);
20662
20706
  })])]));
20663
20707
  return {};
20664
20708
  }
@@ -20683,6 +20727,7 @@
20683
20727
  },
20684
20728
  setup(props, _ref) {
20685
20729
  let {
20730
+ emit,
20686
20731
  slots
20687
20732
  } = _ref;
20688
20733
  const adapter = useDate();
@@ -20733,7 +20778,13 @@
20733
20778
  rounded: true,
20734
20779
  text: year.text,
20735
20780
  variant: model.value === year.value ? 'flat' : 'text',
20736
- onClick: () => model.value = year.value
20781
+ onClick: () => {
20782
+ if (model.value === year.value) {
20783
+ emit('update:modelValue', model.value);
20784
+ return;
20785
+ }
20786
+ model.value = year.value;
20787
+ }
20737
20788
  };
20738
20789
  return slots.year?.({
20739
20790
  year,
@@ -20883,7 +20934,7 @@
20883
20934
  return props.multiple && model.value.length > 1 ? t('$vuetify.datePicker.itemsSelected', model.value.length) : model.value[0] && adapter.isValid(model.value[0]) ? adapter.format(model.value[0], 'normalDateWithWeekday') : t(props.header);
20884
20935
  });
20885
20936
  const text = vue.computed(() => {
20886
- return adapter.format(adapter.parseISO(`${year.value}-${month.value + 1}-01`), 'monthAndYear');
20937
+ return adapter.format(adapter.date(new Date(year.value, month.value, 1)), 'monthAndYear');
20887
20938
  });
20888
20939
  // const headerIcon = computed(() => props.inputMode === 'calendar' ? props.keyboardIcon : props.calendarIcon)
20889
20940
  const headerTransition = vue.computed(() => `date-picker-header${isReversing.value ? '-reverse' : ''}-transition`);
@@ -20926,7 +20977,9 @@
20926
20977
  } else {
20927
20978
  year.value++;
20928
20979
  month.value = 0;
20980
+ onUpdateYear(year.value);
20929
20981
  }
20982
+ onUpdateMonth(month.value);
20930
20983
  }
20931
20984
  function onClickPrev() {
20932
20985
  if (month.value > 0) {
@@ -20934,7 +20987,9 @@
20934
20987
  } else {
20935
20988
  year.value--;
20936
20989
  month.value = 11;
20990
+ onUpdateYear(year.value);
20937
20991
  }
20992
+ onUpdateMonth(month.value);
20938
20993
  }
20939
20994
  function onClickDate() {
20940
20995
  viewMode.value = 'month';
@@ -20945,14 +21000,14 @@
20945
21000
  function onClickYear() {
20946
21001
  viewMode.value = viewMode.value === 'year' ? 'month' : 'year';
20947
21002
  }
20948
- vue.watch(month, () => {
21003
+ function onUpdateMonth(value) {
20949
21004
  if (viewMode.value === 'months') onClickMonth();
20950
- emit('update:month', month.value);
20951
- });
20952
- vue.watch(year, () => {
21005
+ emit('update:month', value);
21006
+ }
21007
+ function onUpdateYear(value) {
20953
21008
  if (viewMode.value === 'year') onClickYear();
20954
- emit('update:year', year.value);
20955
- });
21009
+ emit('update:year', value);
21010
+ }
20956
21011
  vue.watch(model, (val, oldVal) => {
20957
21012
  const before = adapter.date(wrapInArray(val)[0]);
20958
21013
  const after = adapter.date(wrapInArray(oldVal)[0]);
@@ -21008,14 +21063,14 @@
21008
21063
  "key": "date-picker-months"
21009
21064
  }, datePickerMonthsProps, {
21010
21065
  "modelValue": month.value,
21011
- "onUpdate:modelValue": $event => month.value = $event,
21066
+ "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth],
21012
21067
  "min": minDate.value,
21013
21068
  "max": maxDate.value
21014
21069
  }), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
21015
21070
  "key": "date-picker-years"
21016
21071
  }, datePickerYearsProps, {
21017
21072
  "modelValue": year.value,
21018
- "onUpdate:modelValue": $event => year.value = $event,
21073
+ "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear],
21019
21074
  "min": minDate.value,
21020
21075
  "max": maxDate.value
21021
21076
  }), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
@@ -21024,9 +21079,9 @@
21024
21079
  "modelValue": model.value,
21025
21080
  "onUpdate:modelValue": $event => model.value = $event,
21026
21081
  "month": month.value,
21027
- "onUpdate:month": $event => month.value = $event,
21082
+ "onUpdate:month": [$event => month.value = $event, onUpdateMonth],
21028
21083
  "year": year.value,
21029
- "onUpdate:year": $event => year.value = $event,
21084
+ "onUpdate:year": [$event => year.value = $event, onUpdateYear],
21030
21085
  "min": minDate.value,
21031
21086
  "max": maxDate.value
21032
21087
  }), null)]
@@ -21044,7 +21099,9 @@
21044
21099
  const allowedVariants = ['default', 'accordion', 'inset', 'popout'];
21045
21100
  const makeVExpansionPanelsProps = propsFactory({
21046
21101
  color: String,
21102
+ flat: Boolean,
21047
21103
  static: Boolean,
21104
+ tile: Boolean,
21048
21105
  variant: {
21049
21106
  type: String,
21050
21107
  default: 'default',
@@ -21074,12 +21131,17 @@
21074
21131
  provideDefaults({
21075
21132
  VExpansionPanel: {
21076
21133
  color: vue.toRef(props, 'color'),
21077
- readonly: vue.toRef(props, 'readonly'),
21134
+ readonly: vue.toRef(props, 'readonly')
21135
+ },
21136
+ VExpansionPanelTitle: {
21078
21137
  static: vue.toRef(props, 'static')
21079
21138
  }
21080
21139
  });
21081
21140
  useRender(() => vue.createVNode(props.tag, {
21082
- "class": ['v-expansion-panels', themeClasses.value, variantClass.value, props.class],
21141
+ "class": ['v-expansion-panels', {
21142
+ 'v-expansion-panels--flat': props.flat,
21143
+ 'v-expansion-panels--tile': props.tile
21144
+ }, themeClasses.value, variantClass.value, props.class],
21083
21145
  "style": props.style
21084
21146
  }, slots));
21085
21147
  return {};
@@ -21363,7 +21425,7 @@
21363
21425
  if (!isFocused.value) focus();
21364
21426
  }
21365
21427
  function onClickPrepend(e) {
21366
- onControlClick(e);
21428
+ inputRef.value?.click();
21367
21429
  }
21368
21430
  function onControlMousedown(e) {
21369
21431
  emit('mousedown:control', e);
@@ -23817,12 +23879,11 @@
23817
23879
  "scrollStrategy": "none",
23818
23880
  "_disableGlobalStack": true
23819
23881
  }, scopeId), {
23820
- default: () => [genOverlays(false, 'v-snackbar'), props.timer && vue.createVNode("div", {
23882
+ default: () => [genOverlays(false, 'v-snackbar'), props.timer && !isHovering.value && vue.createVNode("div", {
23821
23883
  "key": "timer",
23822
23884
  "class": "v-snackbar__timer"
23823
23885
  }, [vue.createVNode(VProgressLinear, {
23824
23886
  "ref": timerRef,
23825
- "active": !isHovering.value,
23826
23887
  "color": typeof props.timer === 'string' ? props.timer : 'info',
23827
23888
  "max": props.timeout,
23828
23889
  "model-value": countdown.time.value
@@ -25806,7 +25867,7 @@
25806
25867
  }, [!props.hideWeekNumber ? vue.createVNode("div", {
25807
25868
  "key": "weekNumber0",
25808
25869
  "class": "v-calendar-weekly__head-weeknumber"
25809
- }, null) : '', props.weekdays.sort((a, b) => a - b).map(weekday => vue.createVNode("div", {
25870
+ }, null) : '', props.weekdays.map(weekday => vue.createVNode("div", {
25810
25871
  "class": `v-calendar-weekly__head-weekday${!props.hideWeekNumber ? '-with-weeknumber' : ''}`
25811
25872
  }, [dayNames[weekday]]))]), props.viewMode === 'month' && vue.createVNode("div", {
25812
25873
  "key": "VCalendarMonth",
@@ -25835,6 +25896,438 @@
25835
25896
  }
25836
25897
  });
25837
25898
 
25899
+ // Utilities
25900
+
25901
+ // Types
25902
+
25903
+ const makeLineProps = propsFactory({
25904
+ autoDraw: Boolean,
25905
+ autoDrawDuration: [Number, String],
25906
+ autoDrawEasing: {
25907
+ type: String,
25908
+ default: 'ease'
25909
+ },
25910
+ color: String,
25911
+ gradient: {
25912
+ type: Array,
25913
+ default: () => []
25914
+ },
25915
+ gradientDirection: {
25916
+ type: String,
25917
+ validator: val => ['top', 'bottom', 'left', 'right'].includes(val),
25918
+ default: 'top'
25919
+ },
25920
+ height: {
25921
+ type: [String, Number],
25922
+ default: 75
25923
+ },
25924
+ labels: {
25925
+ type: Array,
25926
+ default: () => []
25927
+ },
25928
+ labelSize: {
25929
+ type: [Number, String],
25930
+ default: 7
25931
+ },
25932
+ lineWidth: {
25933
+ type: [String, Number],
25934
+ default: 4
25935
+ },
25936
+ id: String,
25937
+ modelValue: {
25938
+ type: Array,
25939
+ default: () => []
25940
+ },
25941
+ padding: {
25942
+ type: [String, Number],
25943
+ default: 8
25944
+ },
25945
+ showLabels: Boolean,
25946
+ smooth: Boolean,
25947
+ width: {
25948
+ type: [Number, String],
25949
+ default: 300
25950
+ }
25951
+ }, 'Line');
25952
+
25953
+ // Types
25954
+
25955
+ const makeVBarlineProps = propsFactory({
25956
+ autoLineWidth: Boolean,
25957
+ ...makeLineProps()
25958
+ }, 'VBarline');
25959
+ const VBarline = genericComponent()({
25960
+ name: 'VBarline',
25961
+ props: makeVBarlineProps(),
25962
+ setup(props, _ref) {
25963
+ let {
25964
+ slots
25965
+ } = _ref;
25966
+ const uid = getUid();
25967
+ const id = vue.computed(() => props.id || `barline-${uid}`);
25968
+ const autoDrawDuration = vue.computed(() => Number(props.autoDrawDuration) || 500);
25969
+ const hasLabels = vue.computed(() => {
25970
+ return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
25971
+ });
25972
+ const lineWidth = vue.computed(() => parseFloat(props.lineWidth) || 4);
25973
+ const totalWidth = vue.computed(() => Math.max(props.modelValue.length * lineWidth.value, Number(props.width)));
25974
+ const boundary = vue.computed(() => {
25975
+ return {
25976
+ minX: 0,
25977
+ maxX: totalWidth.value,
25978
+ minY: 0,
25979
+ maxY: parseInt(props.height, 10)
25980
+ };
25981
+ });
25982
+ function genBars(values, boundary) {
25983
+ const {
25984
+ minX,
25985
+ maxX,
25986
+ minY,
25987
+ maxY
25988
+ } = boundary;
25989
+ const totalValues = values.length;
25990
+ let maxValue = Math.max(...values);
25991
+ let minValue = Math.min(...values);
25992
+ if (minValue > 0) minValue = 0;
25993
+ if (maxValue < 0) maxValue = 0;
25994
+ const gridX = maxX / totalValues;
25995
+ const gridY = (maxY - minY) / (maxValue - minValue || 1);
25996
+ const horizonY = maxY - Math.abs(minValue * gridY);
25997
+ return values.map((value, index) => {
25998
+ const height = Math.abs(gridY * value);
25999
+ return {
26000
+ x: minX + index * gridX,
26001
+ y: horizonY - height + +(value < 0) * height,
26002
+ height,
26003
+ value
26004
+ };
26005
+ });
26006
+ }
26007
+ const parsedLabels = vue.computed(() => {
26008
+ const labels = [];
26009
+ const points = genBars(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value);
26010
+ const len = points.length;
26011
+ for (let i = 0; labels.length < len; i++) {
26012
+ const item = points[i];
26013
+ let value = props.labels[i];
26014
+ if (!value) {
26015
+ value = typeof item === 'object' ? item.value : item;
26016
+ }
26017
+ labels.push({
26018
+ x: item.x,
26019
+ value: String(value)
26020
+ });
26021
+ }
26022
+ return labels;
26023
+ });
26024
+ const bars = vue.computed(() => genBars(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value));
26025
+ const offsetX = vue.computed(() => (Math.abs(bars.value[0].x - bars.value[1].x) - lineWidth.value) / 2);
26026
+ useRender(() => {
26027
+ const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse();
26028
+ return vue.createVNode("svg", {
26029
+ "display": "block"
26030
+ }, [vue.createVNode("defs", null, [vue.createVNode("linearGradient", {
26031
+ "id": id.value,
26032
+ "gradientUnits": "userSpaceOnUse",
26033
+ "x1": props.gradientDirection === 'left' ? '100%' : '0',
26034
+ "y1": props.gradientDirection === 'top' ? '100%' : '0',
26035
+ "x2": props.gradientDirection === 'right' ? '100%' : '0',
26036
+ "y2": props.gradientDirection === 'bottom' ? '100%' : '0'
26037
+ }, [gradientData.map((color, index) => vue.createVNode("stop", {
26038
+ "offset": index / Math.max(gradientData.length - 1, 1),
26039
+ "stop-color": color || 'currentColor'
26040
+ }, null))])]), vue.createVNode("clipPath", {
26041
+ "id": `${id.value}-clip`
26042
+ }, [bars.value.map(item => vue.createVNode("rect", {
26043
+ "x": item.x + offsetX.value,
26044
+ "y": item.y,
26045
+ "width": lineWidth.value,
26046
+ "height": item.height,
26047
+ "rx": typeof props.smooth === 'number' ? props.smooth : props.smooth ? 2 : 0,
26048
+ "ry": typeof props.smooth === 'number' ? props.smooth : props.smooth ? 2 : 0
26049
+ }, [props.autoDraw && vue.createVNode(vue.Fragment, null, [vue.createVNode("animate", {
26050
+ "attributeName": "y",
26051
+ "from": item.y + item.height,
26052
+ "to": item.y,
26053
+ "dur": `${autoDrawDuration.value}ms`,
26054
+ "fill": "freeze"
26055
+ }, null), vue.createVNode("animate", {
26056
+ "attributeName": "height",
26057
+ "from": "0",
26058
+ "to": item.height,
26059
+ "dur": `${autoDrawDuration.value}ms`,
26060
+ "fill": "freeze"
26061
+ }, null)])]))]), hasLabels.value && vue.createVNode("g", {
26062
+ "key": "labels",
26063
+ "style": {
26064
+ textAnchor: 'middle',
26065
+ dominantBaseline: 'mathematical',
26066
+ fill: 'currentColor'
26067
+ }
26068
+ }, [parsedLabels.value.map((item, i) => vue.createVNode("text", {
26069
+ "x": item.x + offsetX.value + lineWidth.value / 2,
26070
+ "y": parseInt(props.height, 10) - 2 + (parseInt(props.labelSize, 10) || 7 * 0.75),
26071
+ "font-size": Number(props.labelSize) || 7
26072
+ }, [slots.label?.({
26073
+ index: i,
26074
+ value: item.value
26075
+ }) ?? item.value]))]), vue.createVNode("g", {
26076
+ "clip-path": `url(#${id.value}-clip)`,
26077
+ "fill": `url(#${id.value})`
26078
+ }, [vue.createVNode("rect", {
26079
+ "x": 0,
26080
+ "y": 0,
26081
+ "width": Math.max(props.modelValue.length * lineWidth.value, Number(props.width)),
26082
+ "height": props.height
26083
+ }, null)])]);
26084
+ });
26085
+ }
26086
+ });
26087
+
26088
+ // @ts-nocheck
26089
+ /* eslint-disable */
26090
+
26091
+ // import { checkCollinear, getDistance, moveTo } from './math'
26092
+
26093
+ /**
26094
+ * From https://github.com/unsplash/react-trend/blob/master/src/helpers/DOM.helpers.js#L18
26095
+ */
26096
+ function genPath(points, radius) {
26097
+ let fill = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
26098
+ let height = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 75;
26099
+ if (points.length === 0) return '';
26100
+ const start = points.shift();
26101
+ const end = points[points.length - 1];
26102
+ return (fill ? `M${start.x} ${height - start.x + 2} L${start.x} ${start.y}` : `M${start.x} ${start.y}`) + points.map((point, index) => {
26103
+ const next = points[index + 1];
26104
+ const prev = points[index - 1] || start;
26105
+ const isCollinear = next && checkCollinear(next, point, prev);
26106
+ if (!next || isCollinear) {
26107
+ return `L${point.x} ${point.y}`;
26108
+ }
26109
+ const threshold = Math.min(getDistance(prev, point), getDistance(next, point));
26110
+ const isTooCloseForRadius = threshold / 2 < radius;
26111
+ const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius;
26112
+ const before = moveTo(prev, point, radiusForPoint);
26113
+ const after = moveTo(next, point, radiusForPoint);
26114
+ return `L${before.x} ${before.y}S${point.x} ${point.y} ${after.x} ${after.y}`;
26115
+ }).join('') + (fill ? `L${end.x} ${height - start.x + 2} Z` : '');
26116
+ }
26117
+ function int(value) {
26118
+ return parseInt(value, 10);
26119
+ }
26120
+
26121
+ /**
26122
+ * https://en.wikipedia.org/wiki/Collinearity
26123
+ * x=(x1+x2)/2
26124
+ * y=(y1+y2)/2
26125
+ */
26126
+ function checkCollinear(p0, p1, p2) {
26127
+ return int(p0.x + p2.x) === int(2 * p1.x) && int(p0.y + p2.y) === int(2 * p1.y);
26128
+ }
26129
+ function getDistance(p1, p2) {
26130
+ return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
26131
+ }
26132
+ function moveTo(to, from, radius) {
26133
+ const vector = {
26134
+ x: to.x - from.x,
26135
+ y: to.y - from.y
26136
+ };
26137
+ const length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
26138
+ const unitVector = {
26139
+ x: vector.x / length,
26140
+ y: vector.y / length
26141
+ };
26142
+ return {
26143
+ x: from.x + unitVector.x * radius,
26144
+ y: from.y + unitVector.y * radius
26145
+ };
26146
+ }
26147
+
26148
+ // Types
26149
+
26150
+ const makeVTrendlineProps = propsFactory({
26151
+ fill: Boolean,
26152
+ ...makeLineProps()
26153
+ }, 'VTrendline');
26154
+ const VTrendline = genericComponent()({
26155
+ name: 'VTrendline',
26156
+ props: makeVTrendlineProps(),
26157
+ setup(props, _ref) {
26158
+ let {
26159
+ slots
26160
+ } = _ref;
26161
+ const uid = getUid();
26162
+ const id = vue.computed(() => props.id || `trendline-${uid}`);
26163
+ const autoDrawDuration = vue.computed(() => Number(props.autoDrawDuration) || (props.fill ? 500 : 2000));
26164
+ const lastLength = vue.ref(0);
26165
+ const path = vue.ref(null);
26166
+ function genPoints(values, boundary) {
26167
+ const {
26168
+ minX,
26169
+ maxX,
26170
+ minY,
26171
+ maxY
26172
+ } = boundary;
26173
+ const totalValues = values.length;
26174
+ const maxValue = Math.max(...values);
26175
+ const minValue = Math.min(...values);
26176
+ const gridX = (maxX - minX) / (totalValues - 1);
26177
+ const gridY = (maxY - minY) / (maxValue - minValue || 1);
26178
+ return values.map((value, index) => {
26179
+ return {
26180
+ x: minX + index * gridX,
26181
+ y: maxY - (value - minValue) * gridY,
26182
+ value
26183
+ };
26184
+ });
26185
+ }
26186
+ const hasLabels = vue.computed(() => {
26187
+ return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
26188
+ });
26189
+ const lineWidth = vue.computed(() => {
26190
+ return parseFloat(props.lineWidth) || 4;
26191
+ });
26192
+ const totalWidth = vue.computed(() => Number(props.width));
26193
+ const boundary = vue.computed(() => {
26194
+ const padding = Number(props.padding);
26195
+ return {
26196
+ minX: padding,
26197
+ maxX: totalWidth.value - padding,
26198
+ minY: padding,
26199
+ maxY: parseInt(props.height, 10) - padding
26200
+ };
26201
+ });
26202
+ const parsedLabels = vue.computed(() => {
26203
+ const labels = [];
26204
+ const points = genPoints(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value);
26205
+ const len = points.length;
26206
+ for (let i = 0; labels.length < len; i++) {
26207
+ const item = points[i];
26208
+ let value = props.labels[i];
26209
+ if (!value) {
26210
+ value = typeof item === 'object' ? item.value : item;
26211
+ }
26212
+ labels.push({
26213
+ x: item.x,
26214
+ value: String(value)
26215
+ });
26216
+ }
26217
+ return labels;
26218
+ });
26219
+ vue.watch(() => props.modelValue, async () => {
26220
+ await vue.nextTick();
26221
+ if (!props.autoDraw || !path.value) return;
26222
+ const pathRef = path.value;
26223
+ const length = pathRef.getTotalLength();
26224
+ if (!props.fill) {
26225
+ // Initial setup to "hide" the line by using the stroke dash array
26226
+ pathRef.style.strokeDasharray = `${length}`;
26227
+ pathRef.style.strokeDashoffset = `${length}`;
26228
+
26229
+ // Force reflow to ensure the transition starts from this state
26230
+ pathRef.getBoundingClientRect();
26231
+
26232
+ // Animate the stroke dash offset to "draw" the line
26233
+ pathRef.style.transition = `stroke-dashoffset ${autoDrawDuration.value}ms ${props.autoDrawEasing}`;
26234
+ pathRef.style.strokeDashoffset = '0';
26235
+ } else {
26236
+ // Your existing logic for filled paths remains the same
26237
+ pathRef.style.transformOrigin = 'bottom center';
26238
+ pathRef.style.transition = 'none';
26239
+ pathRef.style.transform = `scaleY(0)`;
26240
+ pathRef.getBoundingClientRect();
26241
+ pathRef.style.transition = `transform ${autoDrawDuration.value}ms ${props.autoDrawEasing}`;
26242
+ pathRef.style.transform = `scaleY(1)`;
26243
+ }
26244
+ lastLength.value = length;
26245
+ }, {
26246
+ immediate: true
26247
+ });
26248
+ useRender(() => {
26249
+ const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse();
26250
+ return vue.createVNode("svg", {
26251
+ "display": "block",
26252
+ "stroke-width": parseFloat(props.lineWidth) ?? 4
26253
+ }, [vue.createVNode("defs", null, [vue.createVNode("linearGradient", {
26254
+ "id": id.value,
26255
+ "gradientUnits": "userSpaceOnUse",
26256
+ "x1": props.gradientDirection === 'left' ? '100%' : '0',
26257
+ "y1": props.gradientDirection === 'top' ? '100%' : '0',
26258
+ "x2": props.gradientDirection === 'right' ? '100%' : '0',
26259
+ "y2": props.gradientDirection === 'bottom' ? '100%' : '0'
26260
+ }, [gradientData.map((color, index) => vue.createVNode("stop", {
26261
+ "offset": index / Math.max(gradientData.length - 1, 1),
26262
+ "stop-color": color || 'currentColor'
26263
+ }, null))])]), hasLabels.value && vue.createVNode("g", {
26264
+ "key": "labels",
26265
+ "style": {
26266
+ textAnchor: 'middle',
26267
+ dominantBaseline: 'mathematical',
26268
+ fill: 'currentColor'
26269
+ }
26270
+ }, [parsedLabels.value.map((item, i) => vue.createVNode("text", {
26271
+ "x": item.x + lineWidth.value / 2 + lineWidth.value / 2,
26272
+ "y": parseInt(props.height, 10) - 4 + (parseInt(props.labelSize, 10) || 7 * 0.75),
26273
+ "font-size": Number(props.labelSize) || 7
26274
+ }, [slots.label?.({
26275
+ index: i,
26276
+ value: item.value
26277
+ }) ?? item.value]))]), vue.createVNode("path", {
26278
+ "ref": path,
26279
+ "d": genPath(genPoints(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value), props.smooth ? 8 : Number(props.smooth), props.fill, parseInt(props.height, 10)),
26280
+ "fill": props.fill ? `url(#${id.value})` : 'none',
26281
+ "stroke": props.fill ? 'none' : `url(#${id.value})`
26282
+ }, null)]);
26283
+ });
26284
+ }
26285
+ });
26286
+
26287
+ // Types
26288
+
26289
+ // Types
26290
+
26291
+ const makeVSparklineProps = propsFactory({
26292
+ type: {
26293
+ type: String,
26294
+ default: 'trend'
26295
+ },
26296
+ ...makeVBarlineProps(),
26297
+ ...makeVTrendlineProps()
26298
+ }, 'VSparkline');
26299
+ const VSparkline = genericComponent()({
26300
+ name: 'VSparkline',
26301
+ props: makeVSparklineProps(),
26302
+ setup(props, _ref) {
26303
+ let {
26304
+ slots
26305
+ } = _ref;
26306
+ const {
26307
+ textColorClasses,
26308
+ textColorStyles
26309
+ } = useTextColor(vue.toRef(props, 'color'));
26310
+ const hasLabels = vue.computed(() => {
26311
+ return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
26312
+ });
26313
+ const totalHeight = vue.computed(() => {
26314
+ let height = parseInt(props.height, 10);
26315
+ if (hasLabels.value) height += parseInt(props.labelSize, 10) * 1.5;
26316
+ return height;
26317
+ });
26318
+ useRender(() => {
26319
+ const Tag = props.type === 'trend' ? VTrendline : VBarline;
26320
+ const lineProps = props.type === 'trend' ? VTrendline.filterProps(props) : VBarline.filterProps(props);
26321
+ return vue.createVNode(Tag, vue.mergeProps({
26322
+ "key": props.type,
26323
+ "class": textColorClasses.value,
26324
+ "style": textColorStyles.value,
26325
+ "viewBox": `0 0 ${props.width} ${parseInt(totalHeight.value, 10)}`
26326
+ }, lineProps), slots);
26327
+ });
26328
+ }
26329
+ });
26330
+
25838
26331
  var components = /*#__PURE__*/Object.freeze({
25839
26332
  __proto__: null,
25840
26333
  VAlert: VAlert,
@@ -25977,6 +26470,7 @@
25977
26470
  VSlider: VSlider,
25978
26471
  VSnackbar: VSnackbar,
25979
26472
  VSpacer: VSpacer,
26473
+ VSparkline: VSparkline,
25980
26474
  VStepper: VStepper,
25981
26475
  VStepperActions: VStepperActions,
25982
26476
  VStepperHeader: VStepperHeader,
@@ -26224,7 +26718,7 @@
26224
26718
  goTo
26225
26719
  };
26226
26720
  }
26227
- const version$1 = "3.5.3";
26721
+ const version$1 = "3.5.5";
26228
26722
  createVuetify$1.version = version$1;
26229
26723
 
26230
26724
  // Vue's inject() can only be used in setup
@@ -26238,7 +26732,7 @@
26238
26732
 
26239
26733
  /* eslint-disable local-rules/sort-imports */
26240
26734
 
26241
- const version = "3.5.3";
26735
+ const version = "3.5.5";
26242
26736
 
26243
26737
  /* eslint-disable local-rules/sort-imports */
26244
26738