vuetify 3.5.4 → 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.
- package/dist/json/attributes.json +2771 -2523
- package/dist/json/importMap-labs.json +4 -0
- package/dist/json/importMap.json +94 -94
- package/dist/json/tags.json +236 -169
- package/dist/json/web-types.json +3218 -2563
- package/dist/vuetify-labs.css +1819 -1796
- package/dist/vuetify-labs.d.ts +1234 -152
- package/dist/vuetify-labs.esm.js +555 -72
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +555 -72
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.css +887 -864
- package/dist/vuetify.d.ts +886 -179
- package/dist/vuetify.esm.js +121 -71
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +121 -71
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +647 -645
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VAlert/index.d.mts +9 -0
- package/lib/components/VAppBar/index.d.mts +18 -0
- package/lib/components/VAutocomplete/VAutocomplete.mjs +4 -4
- package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
- package/lib/components/VAutocomplete/index.d.mts +33 -6
- package/lib/components/VAvatar/index.d.mts +9 -0
- package/lib/components/VBadge/index.d.mts +9 -0
- package/lib/components/VBanner/index.d.mts +9 -0
- package/lib/components/VBottomNavigation/index.d.mts +9 -0
- package/lib/components/VBreadcrumbs/index.d.mts +9 -0
- package/lib/components/VBtn/index.d.mts +9 -0
- package/lib/components/VBtnGroup/index.d.mts +9 -0
- package/lib/components/VBtnToggle/index.d.mts +9 -0
- package/lib/components/VCard/index.d.mts +9 -0
- package/lib/components/VCarousel/index.d.mts +9 -0
- package/lib/components/VChip/index.d.mts +9 -0
- package/lib/components/VColorPicker/index.d.mts +9 -0
- package/lib/components/VCombobox/index.d.mts +33 -6
- package/lib/components/VDataIterator/index.d.mts +3 -3
- package/lib/components/VDataTable/VDataTable.mjs.map +1 -1
- package/lib/components/VDataTable/VDataTableHeaders.mjs.map +1 -1
- package/lib/components/VDataTable/index.d.mts +355 -117
- package/lib/components/VDataTable/types.mjs.map +1 -1
- package/lib/components/VDatePicker/VDatePicker.css +2 -21
- package/lib/components/VDatePicker/VDatePicker.mjs +14 -10
- package/lib/components/VDatePicker/VDatePicker.mjs.map +1 -1
- package/lib/components/VDatePicker/VDatePicker.sass +3 -18
- package/lib/components/VDatePicker/VDatePickerHeader.css +2 -0
- package/lib/components/VDatePicker/VDatePickerHeader.sass +3 -0
- package/lib/components/VDatePicker/VDatePickerMonth.css +11 -5
- package/lib/components/VDatePicker/VDatePickerMonth.mjs +2 -1
- package/lib/components/VDatePicker/VDatePickerMonth.mjs.map +1 -1
- package/lib/components/VDatePicker/VDatePickerMonth.sass +13 -5
- package/lib/components/VDatePicker/VDatePickerMonths.css +2 -3
- package/lib/components/VDatePicker/VDatePickerMonths.mjs +6 -3
- package/lib/components/VDatePicker/VDatePickerMonths.mjs.map +1 -1
- package/lib/components/VDatePicker/VDatePickerMonths.sass +4 -3
- package/lib/components/VDatePicker/VDatePickerYears.css +2 -2
- package/lib/components/VDatePicker/VDatePickerYears.mjs +8 -1
- package/lib/components/VDatePicker/VDatePickerYears.mjs.map +1 -1
- package/lib/components/VDatePicker/VDatePickerYears.sass +4 -2
- package/lib/components/VDatePicker/_variables.scss +14 -34
- package/lib/components/VDatePicker/index.d.mts +13 -4
- package/lib/components/VExpansionPanel/VExpansionPanel.css +14 -0
- package/lib/components/VExpansionPanel/VExpansionPanel.sass +14 -0
- package/lib/components/VExpansionPanel/VExpansionPanels.mjs +9 -2
- package/lib/components/VExpansionPanel/VExpansionPanels.mjs.map +1 -1
- package/lib/components/VExpansionPanel/index.d.mts +27 -0
- package/lib/components/VField/VField.css +20 -1
- package/lib/components/VField/VField.sass +19 -1
- package/lib/components/VField/index.d.mts +9 -0
- package/lib/components/VFileInput/VFileInput.mjs +1 -1
- package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
- package/lib/components/VFileInput/index.d.mts +9 -0
- package/lib/components/VFooter/index.d.mts +9 -0
- package/lib/components/VImg/index.d.mts +9 -0
- package/lib/components/VList/VListItem.css +2 -1
- package/lib/components/VList/VListItem.sass +1 -0
- package/lib/components/VList/_variables.scss +2 -1
- package/lib/components/VList/index.d.mts +18 -0
- package/lib/components/VMenu/VMenu.mjs +5 -5
- package/lib/components/VMenu/VMenu.mjs.map +1 -1
- package/lib/components/VMenu/shared.mjs.map +1 -1
- package/lib/components/VNavigationDrawer/index.d.mts +9 -0
- package/lib/components/VPagination/index.d.mts +9 -0
- package/lib/components/VProgressLinear/index.d.mts +9 -0
- package/lib/components/VRangeSlider/index.d.mts +9 -0
- package/lib/components/VSelect/VSelect.mjs +4 -3
- package/lib/components/VSelect/VSelect.mjs.map +1 -1
- package/lib/components/VSelect/index.d.mts +33 -6
- package/lib/components/VSheet/index.d.mts +9 -0
- package/lib/components/VSlider/index.d.mts +9 -0
- package/lib/components/VSnackbar/index.d.mts +9 -0
- package/lib/components/VStepper/index.d.mts +9 -0
- package/lib/components/VSystemBar/index.d.mts +9 -0
- package/lib/components/VTabs/index.d.mts +33 -6
- package/lib/components/VTextField/index.d.mts +33 -6
- package/lib/components/VTextarea/index.d.mts +9 -0
- package/lib/components/VTimeline/index.d.mts +9 -0
- package/lib/components/VToolbar/index.d.mts +9 -0
- package/lib/components/VTooltip/VTooltip.css +1 -0
- package/lib/components/VTooltip/VTooltip.sass +1 -0
- package/lib/components/VTooltip/_variables.scss +1 -0
- package/lib/components/index.d.mts +857 -151
- package/lib/composables/form.mjs +2 -1
- package/lib/composables/form.mjs.map +1 -1
- package/lib/composables/goto.mjs +16 -18
- package/lib/composables/goto.mjs.map +1 -1
- package/lib/composables/group.mjs +2 -0
- package/lib/composables/group.mjs.map +1 -1
- package/lib/composables/icons.mjs +17 -13
- package/lib/composables/icons.mjs.map +1 -1
- package/lib/composables/rounded.mjs +5 -1
- package/lib/composables/rounded.mjs.map +1 -1
- package/lib/composables/virtual.mjs +11 -3
- package/lib/composables/virtual.mjs.map +1 -1
- package/lib/entry-bundler.mjs +1 -1
- package/lib/framework.mjs +1 -1
- package/lib/iconsets/fa-svg.mjs +2 -1
- package/lib/iconsets/fa-svg.mjs.map +1 -1
- package/lib/index.d.mts +29 -28
- package/lib/labs/VCalendar/VCalendar.mjs +1 -1
- package/lib/labs/VCalendar/VCalendar.mjs.map +1 -1
- package/lib/labs/VPicker/VPicker.css +2 -2
- package/lib/labs/VPicker/VPicker.sass +2 -2
- package/lib/labs/VPicker/_variables.scss +2 -4
- package/lib/labs/VPicker/index.d.mts +9 -0
- package/lib/labs/VSparkline/VBarline.mjs +138 -0
- package/lib/labs/VSparkline/VBarline.mjs.map +1 -0
- package/lib/labs/VSparkline/VSparkline.mjs +49 -0
- package/lib/labs/VSparkline/VSparkline.mjs.map +1 -0
- package/lib/labs/VSparkline/VTrendline.mjs +143 -0
- package/lib/labs/VSparkline/VTrendline.mjs.map +1 -0
- package/lib/labs/VSparkline/index.d.mts +374 -0
- package/lib/labs/VSparkline/index.mjs +2 -0
- package/lib/labs/VSparkline/index.mjs.map +1 -0
- package/lib/labs/VSparkline/util/line.mjs +52 -0
- package/lib/labs/VSparkline/util/line.mjs.map +1 -0
- package/lib/labs/VSparkline/util/path.mjs +60 -0
- package/lib/labs/VSparkline/util/path.mjs.map +1 -0
- package/lib/labs/components.d.mts +376 -1
- package/lib/labs/components.mjs +1 -0
- package/lib/labs/components.mjs.map +1 -1
- package/lib/locale/nl.mjs +1 -1
- package/lib/locale/nl.mjs.map +1 -1
- package/lib/util/helpers.mjs +10 -0
- package/lib/util/helpers.mjs.map +1 -1
- package/package.json +2 -2
- package/lib/components/VDatePicker/VDatePickerTitle.mjs +0 -81
- package/lib/components/VDatePicker/VDatePickerTitle.mjs.map +0 -1
- package/lib/components/VDatePicker/VDatePickerTitle.sass +0 -33
package/dist/vuetify-labs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Vuetify v3.5.
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
2331
|
-
const defaults = genDefaults$
|
|
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
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
4457
|
-
|
|
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
|
|
4465
|
-
sets
|
|
4466
|
-
...defaultSets,
|
|
4467
|
-
mdi
|
|
4468
|
-
},
|
|
4487
|
+
defaultSet,
|
|
4488
|
+
sets,
|
|
4469
4489
|
aliases: {
|
|
4470
4490
|
...aliases,
|
|
4471
4491
|
/* eslint-disable max-len */
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
12573
|
+
select(item);
|
|
12544
12574
|
}
|
|
12545
12575
|
const slotProps = {
|
|
12546
12576
|
'onClick:close': onChipClose,
|
|
@@ -17621,7 +17651,8 @@
|
|
|
17621
17651
|
};
|
|
17622
17652
|
}
|
|
17623
17653
|
async function scrollTo(_target, _options, horizontal, goTo) {
|
|
17624
|
-
const
|
|
17654
|
+
const property = horizontal ? 'scrollLeft' : 'scrollTop';
|
|
17655
|
+
const options = mergeDeep(goTo?.options ?? genDefaults(), _options);
|
|
17625
17656
|
const rtl = goTo?.rtl.value;
|
|
17626
17657
|
const target = (typeof _target === 'number' ? _target : getTarget(_target)) ?? 0;
|
|
17627
17658
|
const container = options.container === 'parent' && target instanceof HTMLElement ? target.parentElement : getContainer(options.container);
|
|
@@ -17639,25 +17670,22 @@
|
|
|
17639
17670
|
}
|
|
17640
17671
|
}
|
|
17641
17672
|
targetLocation += options.offset;
|
|
17642
|
-
const startLocation =
|
|
17673
|
+
const startLocation = container[property] ?? 0;
|
|
17643
17674
|
if (targetLocation === startLocation) return Promise.resolve(targetLocation);
|
|
17644
17675
|
const startTime = performance.now();
|
|
17645
17676
|
return new Promise(resolve => requestAnimationFrame(function step(currentTime) {
|
|
17646
17677
|
const timeElapsed = currentTime - startTime;
|
|
17647
|
-
const progress =
|
|
17648
|
-
const location = Math.floor(startLocation + (targetLocation - startLocation) * ease(progress));
|
|
17649
|
-
container[
|
|
17650
|
-
|
|
17651
|
-
|
|
17652
|
-
|
|
17653
|
-
|
|
17654
|
-
|
|
17655
|
-
|
|
17656
|
-
|
|
17657
|
-
|
|
17658
|
-
clientSize = container === document.body ? document.documentElement.clientWidth : container.clientWidth;
|
|
17659
|
-
reachEnd = clientSize + container.scrollLeft >= container.scrollWidth;
|
|
17660
|
-
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]);
|
|
17661
17689
|
}
|
|
17662
17690
|
requestAnimationFrame(step);
|
|
17663
17691
|
}));
|
|
@@ -20594,12 +20622,13 @@
|
|
|
20594
20622
|
}, [(props.showAdjacentMonths || !item.isAdjacent) && vue.createVNode(VDefaultsProvider, {
|
|
20595
20623
|
"defaults": {
|
|
20596
20624
|
VBtn: {
|
|
20625
|
+
class: 'v-date-picker-month__day-btn',
|
|
20597
20626
|
color: (item.isSelected || item.isToday) && !item.isDisabled ? props.color : undefined,
|
|
20598
20627
|
disabled: item.isDisabled,
|
|
20599
20628
|
icon: true,
|
|
20600
20629
|
ripple: false,
|
|
20601
20630
|
text: item.localized,
|
|
20602
|
-
variant: item.isDisabled ? 'text' : item.isToday && !item.isSelected ? 'outlined' : 'flat',
|
|
20631
|
+
variant: item.isDisabled ? item.isToday ? 'outlined' : 'text' : item.isToday && !item.isSelected ? 'outlined' : 'flat',
|
|
20603
20632
|
onClick: () => onClick(item.date)
|
|
20604
20633
|
}
|
|
20605
20634
|
}
|
|
@@ -20625,6 +20654,7 @@
|
|
|
20625
20654
|
},
|
|
20626
20655
|
setup(props, _ref) {
|
|
20627
20656
|
let {
|
|
20657
|
+
emit,
|
|
20628
20658
|
slots
|
|
20629
20659
|
} = _ref;
|
|
20630
20660
|
const adapter = useDate();
|
|
@@ -20660,6 +20690,10 @@
|
|
|
20660
20690
|
onClick: () => onClick(i)
|
|
20661
20691
|
};
|
|
20662
20692
|
function onClick(i) {
|
|
20693
|
+
if (model.value === i) {
|
|
20694
|
+
emit('update:modelValue', model.value);
|
|
20695
|
+
return;
|
|
20696
|
+
}
|
|
20663
20697
|
model.value = i;
|
|
20664
20698
|
}
|
|
20665
20699
|
return slots.month?.({
|
|
@@ -20668,9 +20702,7 @@
|
|
|
20668
20702
|
props: btnProps
|
|
20669
20703
|
}) ?? vue.createVNode(VBtn, vue.mergeProps({
|
|
20670
20704
|
"key": "month"
|
|
20671
|
-
}, btnProps,
|
|
20672
|
-
"onClick": () => onClick(i)
|
|
20673
|
-
}), null);
|
|
20705
|
+
}, btnProps), null);
|
|
20674
20706
|
})])]));
|
|
20675
20707
|
return {};
|
|
20676
20708
|
}
|
|
@@ -20695,6 +20727,7 @@
|
|
|
20695
20727
|
},
|
|
20696
20728
|
setup(props, _ref) {
|
|
20697
20729
|
let {
|
|
20730
|
+
emit,
|
|
20698
20731
|
slots
|
|
20699
20732
|
} = _ref;
|
|
20700
20733
|
const adapter = useDate();
|
|
@@ -20745,7 +20778,13 @@
|
|
|
20745
20778
|
rounded: true,
|
|
20746
20779
|
text: year.text,
|
|
20747
20780
|
variant: model.value === year.value ? 'flat' : 'text',
|
|
20748
|
-
onClick: () =>
|
|
20781
|
+
onClick: () => {
|
|
20782
|
+
if (model.value === year.value) {
|
|
20783
|
+
emit('update:modelValue', model.value);
|
|
20784
|
+
return;
|
|
20785
|
+
}
|
|
20786
|
+
model.value = year.value;
|
|
20787
|
+
}
|
|
20749
20788
|
};
|
|
20750
20789
|
return slots.year?.({
|
|
20751
20790
|
year,
|
|
@@ -20938,7 +20977,9 @@
|
|
|
20938
20977
|
} else {
|
|
20939
20978
|
year.value++;
|
|
20940
20979
|
month.value = 0;
|
|
20980
|
+
onUpdateYear(year.value);
|
|
20941
20981
|
}
|
|
20982
|
+
onUpdateMonth(month.value);
|
|
20942
20983
|
}
|
|
20943
20984
|
function onClickPrev() {
|
|
20944
20985
|
if (month.value > 0) {
|
|
@@ -20946,7 +20987,9 @@
|
|
|
20946
20987
|
} else {
|
|
20947
20988
|
year.value--;
|
|
20948
20989
|
month.value = 11;
|
|
20990
|
+
onUpdateYear(year.value);
|
|
20949
20991
|
}
|
|
20992
|
+
onUpdateMonth(month.value);
|
|
20950
20993
|
}
|
|
20951
20994
|
function onClickDate() {
|
|
20952
20995
|
viewMode.value = 'month';
|
|
@@ -20957,14 +21000,14 @@
|
|
|
20957
21000
|
function onClickYear() {
|
|
20958
21001
|
viewMode.value = viewMode.value === 'year' ? 'month' : 'year';
|
|
20959
21002
|
}
|
|
20960
|
-
|
|
21003
|
+
function onUpdateMonth(value) {
|
|
20961
21004
|
if (viewMode.value === 'months') onClickMonth();
|
|
20962
|
-
emit('update:month',
|
|
20963
|
-
}
|
|
20964
|
-
|
|
21005
|
+
emit('update:month', value);
|
|
21006
|
+
}
|
|
21007
|
+
function onUpdateYear(value) {
|
|
20965
21008
|
if (viewMode.value === 'year') onClickYear();
|
|
20966
|
-
emit('update:year',
|
|
20967
|
-
}
|
|
21009
|
+
emit('update:year', value);
|
|
21010
|
+
}
|
|
20968
21011
|
vue.watch(model, (val, oldVal) => {
|
|
20969
21012
|
const before = adapter.date(wrapInArray(val)[0]);
|
|
20970
21013
|
const after = adapter.date(wrapInArray(oldVal)[0]);
|
|
@@ -21020,14 +21063,14 @@
|
|
|
21020
21063
|
"key": "date-picker-months"
|
|
21021
21064
|
}, datePickerMonthsProps, {
|
|
21022
21065
|
"modelValue": month.value,
|
|
21023
|
-
"onUpdate:modelValue": $event => month.value = $event,
|
|
21066
|
+
"onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth],
|
|
21024
21067
|
"min": minDate.value,
|
|
21025
21068
|
"max": maxDate.value
|
|
21026
21069
|
}), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
|
|
21027
21070
|
"key": "date-picker-years"
|
|
21028
21071
|
}, datePickerYearsProps, {
|
|
21029
21072
|
"modelValue": year.value,
|
|
21030
|
-
"onUpdate:modelValue": $event => year.value = $event,
|
|
21073
|
+
"onUpdate:modelValue": [$event => year.value = $event, onUpdateYear],
|
|
21031
21074
|
"min": minDate.value,
|
|
21032
21075
|
"max": maxDate.value
|
|
21033
21076
|
}), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
|
|
@@ -21036,9 +21079,9 @@
|
|
|
21036
21079
|
"modelValue": model.value,
|
|
21037
21080
|
"onUpdate:modelValue": $event => model.value = $event,
|
|
21038
21081
|
"month": month.value,
|
|
21039
|
-
"onUpdate:month": $event => month.value = $event,
|
|
21082
|
+
"onUpdate:month": [$event => month.value = $event, onUpdateMonth],
|
|
21040
21083
|
"year": year.value,
|
|
21041
|
-
"onUpdate:year": $event => year.value = $event,
|
|
21084
|
+
"onUpdate:year": [$event => year.value = $event, onUpdateYear],
|
|
21042
21085
|
"min": minDate.value,
|
|
21043
21086
|
"max": maxDate.value
|
|
21044
21087
|
}), null)]
|
|
@@ -21056,7 +21099,9 @@
|
|
|
21056
21099
|
const allowedVariants = ['default', 'accordion', 'inset', 'popout'];
|
|
21057
21100
|
const makeVExpansionPanelsProps = propsFactory({
|
|
21058
21101
|
color: String,
|
|
21102
|
+
flat: Boolean,
|
|
21059
21103
|
static: Boolean,
|
|
21104
|
+
tile: Boolean,
|
|
21060
21105
|
variant: {
|
|
21061
21106
|
type: String,
|
|
21062
21107
|
default: 'default',
|
|
@@ -21086,12 +21131,17 @@
|
|
|
21086
21131
|
provideDefaults({
|
|
21087
21132
|
VExpansionPanel: {
|
|
21088
21133
|
color: vue.toRef(props, 'color'),
|
|
21089
|
-
readonly: vue.toRef(props, 'readonly')
|
|
21134
|
+
readonly: vue.toRef(props, 'readonly')
|
|
21135
|
+
},
|
|
21136
|
+
VExpansionPanelTitle: {
|
|
21090
21137
|
static: vue.toRef(props, 'static')
|
|
21091
21138
|
}
|
|
21092
21139
|
});
|
|
21093
21140
|
useRender(() => vue.createVNode(props.tag, {
|
|
21094
|
-
"class": ['v-expansion-panels',
|
|
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],
|
|
21095
21145
|
"style": props.style
|
|
21096
21146
|
}, slots));
|
|
21097
21147
|
return {};
|
|
@@ -21375,7 +21425,7 @@
|
|
|
21375
21425
|
if (!isFocused.value) focus();
|
|
21376
21426
|
}
|
|
21377
21427
|
function onClickPrepend(e) {
|
|
21378
|
-
|
|
21428
|
+
inputRef.value?.click();
|
|
21379
21429
|
}
|
|
21380
21430
|
function onControlMousedown(e) {
|
|
21381
21431
|
emit('mousedown:control', e);
|
|
@@ -25817,7 +25867,7 @@
|
|
|
25817
25867
|
}, [!props.hideWeekNumber ? vue.createVNode("div", {
|
|
25818
25868
|
"key": "weekNumber0",
|
|
25819
25869
|
"class": "v-calendar-weekly__head-weeknumber"
|
|
25820
|
-
}, null) : '', props.weekdays.
|
|
25870
|
+
}, null) : '', props.weekdays.map(weekday => vue.createVNode("div", {
|
|
25821
25871
|
"class": `v-calendar-weekly__head-weekday${!props.hideWeekNumber ? '-with-weeknumber' : ''}`
|
|
25822
25872
|
}, [dayNames[weekday]]))]), props.viewMode === 'month' && vue.createVNode("div", {
|
|
25823
25873
|
"key": "VCalendarMonth",
|
|
@@ -25846,6 +25896,438 @@
|
|
|
25846
25896
|
}
|
|
25847
25897
|
});
|
|
25848
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
|
+
|
|
25849
26331
|
var components = /*#__PURE__*/Object.freeze({
|
|
25850
26332
|
__proto__: null,
|
|
25851
26333
|
VAlert: VAlert,
|
|
@@ -25988,6 +26470,7 @@
|
|
|
25988
26470
|
VSlider: VSlider,
|
|
25989
26471
|
VSnackbar: VSnackbar,
|
|
25990
26472
|
VSpacer: VSpacer,
|
|
26473
|
+
VSparkline: VSparkline,
|
|
25991
26474
|
VStepper: VStepper,
|
|
25992
26475
|
VStepperActions: VStepperActions,
|
|
25993
26476
|
VStepperHeader: VStepperHeader,
|
|
@@ -26235,7 +26718,7 @@
|
|
|
26235
26718
|
goTo
|
|
26236
26719
|
};
|
|
26237
26720
|
}
|
|
26238
|
-
const version$1 = "3.5.
|
|
26721
|
+
const version$1 = "3.5.5";
|
|
26239
26722
|
createVuetify$1.version = version$1;
|
|
26240
26723
|
|
|
26241
26724
|
// Vue's inject() can only be used in setup
|
|
@@ -26249,7 +26732,7 @@
|
|
|
26249
26732
|
|
|
26250
26733
|
/* eslint-disable local-rules/sort-imports */
|
|
26251
26734
|
|
|
26252
|
-
const version = "3.5.
|
|
26735
|
+
const version = "3.5.5";
|
|
26253
26736
|
|
|
26254
26737
|
/* eslint-disable local-rules/sort-imports */
|
|
26255
26738
|
|