@vuetify/nightly 3.8.7-master.2025-06-03 → 3.8.8-dev.2025-06-08
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/CHANGELOG.md +30 -15
- package/dist/json/attributes.json +3542 -3418
- package/dist/json/importMap-labs.json +18 -18
- package/dist/json/importMap.json +168 -168
- package/dist/json/tags.json +32 -1
- package/dist/json/web-types.json +6581 -6195
- package/dist/vuetify-labs.cjs +369 -147
- package/dist/vuetify-labs.css +3246 -3212
- package/dist/vuetify-labs.d.ts +2433 -1899
- package/dist/vuetify-labs.esm.js +370 -148
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +369 -147
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +363 -136
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +3712 -3678
- package/dist/vuetify.d.ts +1588 -1094
- package/dist/vuetify.esm.js +364 -137
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +363 -136
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +1224 -1206
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VAlert/VAlert.css +6 -1
- package/lib/components/VAlert/VAlert.d.ts +35 -0
- package/lib/components/VAlert/VAlert.js +15 -10
- package/lib/components/VAlert/VAlert.js.map +1 -1
- package/lib/components/VAlert/VAlert.sass +7 -1
- package/lib/components/VAppBar/VAppBar.d.ts +15 -3
- package/lib/components/VAppBar/VAppBarNavIcon.d.ts +20 -10
- package/lib/components/VAutocomplete/VAutocomplete.d.ts +154 -103
- package/lib/components/VAutocomplete/VAutocomplete.js +21 -3
- package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/lib/components/VBadge/VBadge.d.ts +60 -0
- package/lib/components/VBadge/VBadge.js +7 -2
- package/lib/components/VBadge/VBadge.js.map +1 -1
- package/lib/components/VBtn/VBtn.d.ts +20 -10
- package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
- package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
- package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
- package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
- package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
- package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
- package/lib/components/VCard/VCard.d.ts +20 -10
- package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
- package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
- package/lib/components/VChip/VChip.d.ts +20 -10
- package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
- package/lib/components/VCombobox/VCombobox.d.ts +154 -103
- package/lib/components/VCombobox/VCombobox.js +22 -3
- package/lib/components/VCombobox/VCombobox.js.map +1 -1
- package/lib/components/VDataTable/VDataTable.d.ts +60 -0
- package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
- package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
- package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
- package/lib/components/VDataTable/VDataTableServer.d.ts +42 -0
- package/lib/components/VDataTable/VDataTableVirtual.d.ts +42 -0
- package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
- package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
- package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
- package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
- package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
- package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
- package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
- package/lib/components/VFab/VFab.d.ts +20 -10
- package/lib/components/VField/VField.d.ts +3 -3
- package/lib/components/VFileInput/VFileInput.d.ts +15 -15
- package/lib/components/VInput/VInput.d.ts +4 -4
- package/lib/components/VList/VList.d.ts +13 -0
- package/lib/components/VList/VList.js +4 -1
- package/lib/components/VList/VList.js.map +1 -1
- package/lib/components/VList/VListChildren.js.map +1 -1
- package/lib/components/VList/VListItem.d.ts +23 -10
- package/lib/components/VList/VListItem.js +7 -3
- package/lib/components/VList/VListItem.js.map +1 -1
- package/lib/components/VList/list.d.ts +9 -2
- package/lib/components/VList/list.js +7 -0
- package/lib/components/VList/list.js.map +1 -1
- package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
- package/lib/components/VNumberInput/VNumberInput.js +19 -4
- package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
- package/lib/components/VOtpInput/VOtpInput.js +2 -1
- package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
- package/lib/components/VOverlay/VOverlay.css +1 -1
- package/lib/components/VOverlay/_variables.scss +1 -1
- package/lib/components/VRadio/VRadio.d.ts +20 -10
- package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
- package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
- package/lib/components/VSelect/VSelect.d.ts +171 -107
- package/lib/components/VSelect/VSelect.js +21 -3
- package/lib/components/VSelect/VSelect.js.map +1 -1
- package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
- package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
- package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
- package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
- package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
- package/lib/components/VSlider/VSlider.d.ts +3 -3
- package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
- package/lib/components/VStepper/VStepperItem.d.ts +28 -14
- package/lib/components/VSwitch/VSwitch.d.ts +23 -13
- package/lib/components/VTable/VTable.css +6 -0
- package/lib/components/VTable/VTable.d.ts +55 -24
- package/lib/components/VTable/VTable.js +9 -2
- package/lib/components/VTable/VTable.js.map +1 -1
- package/lib/components/VTable/VTable.sass +14 -0
- package/lib/components/VTable/_variables.scss +1 -0
- package/lib/components/VTabs/VTab.d.ts +56 -28
- package/lib/components/VTabs/VTabs.d.ts +10 -0
- package/lib/components/VTextField/VTextField.d.ts +27 -27
- package/lib/components/VTextarea/VTextarea.d.ts +15 -15
- package/lib/components/VToolbar/VToolbar.d.ts +15 -3
- package/lib/components/VToolbar/VToolbar.js +6 -3
- package/lib/components/VToolbar/VToolbar.js.map +1 -1
- package/lib/composables/calendar.d.ts +6 -0
- package/lib/composables/calendar.js +2 -1
- package/lib/composables/calendar.js.map +1 -1
- package/lib/composables/date/DateAdapter.d.ts +3 -3
- package/lib/composables/date/DateAdapter.js.map +1 -1
- package/lib/composables/date/adapters/string.d.ts +54 -0
- package/lib/composables/date/adapters/string.js +153 -0
- package/lib/composables/date/adapters/string.js.map +1 -0
- package/lib/composables/date/adapters/vuetify.d.ts +1 -1
- package/lib/composables/date/adapters/vuetify.js +4 -4
- package/lib/composables/date/adapters/vuetify.js.map +1 -1
- package/lib/composables/date/date.d.ts +3 -3
- package/lib/composables/date/index.d.ts +1 -0
- package/lib/composables/date/index.js +1 -0
- package/lib/composables/date/index.js.map +1 -1
- package/lib/composables/filter.js +3 -0
- package/lib/composables/filter.js.map +1 -1
- package/lib/composables/iconSizes.d.ts +28 -0
- package/lib/composables/iconSizes.js +23 -0
- package/lib/composables/iconSizes.js.map +1 -0
- package/lib/composables/list-items.js +2 -2
- package/lib/composables/list-items.js.map +1 -1
- package/lib/composables/theme.d.ts +6 -1
- package/lib/composables/theme.js +94 -26
- package/lib/composables/theme.js.map +1 -1
- package/lib/composables/virtual.js +6 -1
- package/lib/composables/virtual.js.map +1 -1
- package/lib/directives/ripple/index.d.ts +2 -1
- package/lib/directives/ripple/index.js +12 -7
- package/lib/directives/ripple/index.js.map +1 -1
- package/lib/entry-bundler.d.ts +3 -3
- package/lib/entry-bundler.js +1 -1
- package/lib/entry-bundler.js.map +1 -1
- package/lib/framework.d.ts +83 -68
- package/lib/framework.js +1 -1
- package/lib/framework.js.map +1 -1
- package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
- package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
- package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
- package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
- package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
- package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
- package/lib/labs/VIconBtn/VIconBtn.js +7 -11
- package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
- package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
- package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
- package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
- package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
- package/lib/labs/entry-bundler.d.ts +3 -3
- package/lib/util/globals.d.ts +1 -0
- package/lib/util/globals.js +1 -0
- package/lib/util/globals.js.map +1 -1
- package/lib/util/helpers.d.ts +1 -0
- package/lib/util/helpers.js +9 -1
- package/lib/util/helpers.js.map +1 -1
- package/package.json +3 -1
package/dist/vuetify-labs.cjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Vuetify v3.8.
|
2
|
+
* Vuetify v3.8.8-dev.2025-06-08
|
3
3
|
* Forged by John Leider
|
4
4
|
* Released under the MIT License.
|
5
5
|
*/
|
@@ -85,6 +85,7 @@
|
|
85
85
|
const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
|
86
86
|
const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
|
87
87
|
const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
|
88
|
+
const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
|
88
89
|
|
89
90
|
function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
|
90
91
|
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
@@ -606,6 +607,14 @@
|
|
606
607
|
}
|
607
608
|
return cleanText;
|
608
609
|
}
|
610
|
+
function camelizeProps(props) {
|
611
|
+
if (!props) return;
|
612
|
+
const out = {};
|
613
|
+
for (const prop in props) {
|
614
|
+
out[vue.camelize(prop)] = props[prop];
|
615
|
+
}
|
616
|
+
return out;
|
617
|
+
}
|
609
618
|
|
610
619
|
// Utilities
|
611
620
|
const block = ['top', 'bottom'];
|
@@ -2341,6 +2350,7 @@
|
|
2341
2350
|
function genDefaults$2() {
|
2342
2351
|
return {
|
2343
2352
|
defaultTheme: 'light',
|
2353
|
+
prefix: 'v-',
|
2344
2354
|
variations: {
|
2345
2355
|
colors: [],
|
2346
2356
|
lighten: 0,
|
@@ -2422,7 +2432,10 @@
|
|
2422
2432
|
}
|
2423
2433
|
}
|
2424
2434
|
},
|
2425
|
-
stylesheetId: 'vuetify-theme-stylesheet'
|
2435
|
+
stylesheetId: 'vuetify-theme-stylesheet',
|
2436
|
+
scoped: false,
|
2437
|
+
unimportant: false,
|
2438
|
+
utilities: true
|
2426
2439
|
};
|
2427
2440
|
}
|
2428
2441
|
function parseThemeOptions() {
|
@@ -2445,21 +2458,21 @@
|
|
2445
2458
|
function createCssClass(lines, selector, content, scope) {
|
2446
2459
|
lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
|
2447
2460
|
}
|
2448
|
-
function genCssVariables(theme) {
|
2461
|
+
function genCssVariables(theme, prefix) {
|
2449
2462
|
const lightOverlay = theme.dark ? 2 : 1;
|
2450
2463
|
const darkOverlay = theme.dark ? 1 : 2;
|
2451
2464
|
const variables = [];
|
2452
2465
|
for (const [key, value] of Object.entries(theme.colors)) {
|
2453
2466
|
const rgb = parseColor(value);
|
2454
|
-
variables.push(
|
2467
|
+
variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
|
2455
2468
|
if (!key.startsWith('on-')) {
|
2456
|
-
variables.push(
|
2469
|
+
variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
|
2457
2470
|
}
|
2458
2471
|
}
|
2459
2472
|
for (const [key, value] of Object.entries(theme.variables)) {
|
2460
2473
|
const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
|
2461
2474
|
const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
|
2462
|
-
variables.push(
|
2475
|
+
variables.push(`--${prefix}${key}: ${rgb ?? value}`);
|
2463
2476
|
}
|
2464
2477
|
return variables;
|
2465
2478
|
}
|
@@ -2503,7 +2516,8 @@
|
|
2503
2516
|
const scopeSelector = `:where(${scope})`;
|
2504
2517
|
return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
|
2505
2518
|
}
|
2506
|
-
function upsertStyles(
|
2519
|
+
function upsertStyles(id, cspNonce, styles) {
|
2520
|
+
const styleEl = getOrCreateStyleElement(id, cspNonce);
|
2507
2521
|
if (!styleEl) return;
|
2508
2522
|
styleEl.innerHTML = styles;
|
2509
2523
|
}
|
@@ -2523,8 +2537,17 @@
|
|
2523
2537
|
// Composables
|
2524
2538
|
function createTheme(options) {
|
2525
2539
|
const parsedOptions = parseThemeOptions(options);
|
2526
|
-
const
|
2540
|
+
const _name = vue.shallowRef(parsedOptions.defaultTheme);
|
2527
2541
|
const themes = vue.ref(parsedOptions.themes);
|
2542
|
+
const systemName = vue.shallowRef('light');
|
2543
|
+
const name = vue.computed({
|
2544
|
+
get() {
|
2545
|
+
return _name.value === 'system' ? systemName.value : _name.value;
|
2546
|
+
},
|
2547
|
+
set(val) {
|
2548
|
+
_name.value = val;
|
2549
|
+
}
|
2550
|
+
});
|
2528
2551
|
const computedThemes = vue.computed(() => {
|
2529
2552
|
const acc = {};
|
2530
2553
|
for (const [name, original] of Object.entries(themes.value)) {
|
@@ -2545,28 +2568,49 @@
|
|
2545
2568
|
const current = vue.toRef(() => computedThemes.value[name.value]);
|
2546
2569
|
const styles = vue.computed(() => {
|
2547
2570
|
const lines = [];
|
2571
|
+
const important = parsedOptions.unimportant ? '' : ' !important';
|
2572
|
+
const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
|
2548
2573
|
if (current.value?.dark) {
|
2549
2574
|
createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
|
2550
2575
|
}
|
2551
|
-
createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
|
2576
|
+
createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
|
2552
2577
|
for (const [themeName, theme] of Object.entries(computedThemes.value)) {
|
2553
|
-
createCssClass(lines,
|
2554
|
-
}
|
2555
|
-
|
2556
|
-
|
2557
|
-
|
2558
|
-
|
2559
|
-
|
2560
|
-
|
2561
|
-
|
2562
|
-
|
2563
|
-
|
2564
|
-
|
2578
|
+
createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
|
2579
|
+
}
|
2580
|
+
if (parsedOptions.utilities) {
|
2581
|
+
const bgLines = [];
|
2582
|
+
const fgLines = [];
|
2583
|
+
const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
|
2584
|
+
for (const key of colors) {
|
2585
|
+
if (key.startsWith('on-')) {
|
2586
|
+
createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
2587
|
+
} else {
|
2588
|
+
createCssClass(bgLines, `.${scoped}bg-${key}`, [`--${parsedOptions.prefix}theme-overlay-multiplier: var(--${parsedOptions.prefix}theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`, `color: rgb(var(--${parsedOptions.prefix}theme-on-${key}))${important}`], parsedOptions.scope);
|
2589
|
+
createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
2590
|
+
createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
|
2591
|
+
}
|
2565
2592
|
}
|
2593
|
+
lines.push(...bgLines, ...fgLines);
|
2566
2594
|
}
|
2567
|
-
lines.push(...bgLines, ...fgLines);
|
2568
2595
|
return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
|
2569
2596
|
});
|
2597
|
+
const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
|
2598
|
+
const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
|
2599
|
+
if (SUPPORTS_MATCH_MEDIA) {
|
2600
|
+
const media = window.matchMedia('(prefers-color-scheme: dark)');
|
2601
|
+
function updateSystemName() {
|
2602
|
+
systemName.value = media.matches ? 'dark' : 'light';
|
2603
|
+
}
|
2604
|
+
updateSystemName();
|
2605
|
+
media.addEventListener('change', updateSystemName, {
|
2606
|
+
passive: true
|
2607
|
+
});
|
2608
|
+
if (vue.getCurrentScope()) {
|
2609
|
+
vue.onScopeDispose(() => {
|
2610
|
+
media.removeEventListener('change', updateSystemName);
|
2611
|
+
});
|
2612
|
+
}
|
2613
|
+
}
|
2570
2614
|
function install(app) {
|
2571
2615
|
if (parsedOptions.isDisabled) return;
|
2572
2616
|
const head = app._context.provides.usehead;
|
@@ -2604,22 +2648,55 @@
|
|
2604
2648
|
updateStyles();
|
2605
2649
|
}
|
2606
2650
|
function updateStyles() {
|
2607
|
-
upsertStyles(
|
2651
|
+
upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
|
2608
2652
|
}
|
2609
2653
|
}
|
2610
2654
|
}
|
2611
|
-
|
2655
|
+
function change(themeName) {
|
2656
|
+
if (!themeNames.value.includes(themeName)) {
|
2657
|
+
consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
|
2658
|
+
return;
|
2659
|
+
}
|
2660
|
+
name.value = themeName;
|
2661
|
+
}
|
2662
|
+
function cycle() {
|
2663
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
|
2664
|
+
const currentIndex = themeArray.indexOf(name.value);
|
2665
|
+
const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
|
2666
|
+
change(themeArray[nextIndex]);
|
2667
|
+
}
|
2668
|
+
function toggle() {
|
2669
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
|
2670
|
+
cycle(themeArray);
|
2671
|
+
}
|
2672
|
+
const globalName = new Proxy(name, {
|
2673
|
+
get(target, prop) {
|
2674
|
+
return target[prop];
|
2675
|
+
},
|
2676
|
+
set(target, prop, val) {
|
2677
|
+
if (prop === 'value') {
|
2678
|
+
deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
|
2679
|
+
}
|
2680
|
+
// @ts-expect-error
|
2681
|
+
target[prop] = val;
|
2682
|
+
return true;
|
2683
|
+
}
|
2684
|
+
});
|
2612
2685
|
return {
|
2613
2686
|
install,
|
2687
|
+
change,
|
2688
|
+
cycle,
|
2689
|
+
toggle,
|
2614
2690
|
isDisabled: parsedOptions.isDisabled,
|
2615
2691
|
name,
|
2616
2692
|
themes,
|
2617
2693
|
current,
|
2618
2694
|
computedThemes,
|
2695
|
+
prefix: parsedOptions.prefix,
|
2619
2696
|
themeClasses,
|
2620
2697
|
styles,
|
2621
2698
|
global: {
|
2622
|
-
name,
|
2699
|
+
name: globalName,
|
2623
2700
|
current
|
2624
2701
|
}
|
2625
2702
|
};
|
@@ -2630,7 +2707,7 @@
|
|
2630
2707
|
if (!theme) throw new Error('Could not find Vuetify theme injection');
|
2631
2708
|
const name = vue.toRef(() => props.theme ?? theme.name.value);
|
2632
2709
|
const current = vue.toRef(() => theme.themes.value[name.value]);
|
2633
|
-
const themeClasses = vue.toRef(() => theme.isDisabled ? undefined :
|
2710
|
+
const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
|
2634
2711
|
const newTheme = {
|
2635
2712
|
...theme,
|
2636
2713
|
name,
|
@@ -3734,7 +3811,10 @@
|
|
3734
3811
|
default: 'default',
|
3735
3812
|
validator: v => allowedDensities$1.includes(v)
|
3736
3813
|
},
|
3737
|
-
extended:
|
3814
|
+
extended: {
|
3815
|
+
type: Boolean,
|
3816
|
+
default: null
|
3817
|
+
},
|
3738
3818
|
extensionHeight: {
|
3739
3819
|
type: [Number, String],
|
3740
3820
|
default: 48
|
@@ -3782,7 +3862,7 @@
|
|
3782
3862
|
const {
|
3783
3863
|
rtlClasses
|
3784
3864
|
} = useRtl();
|
3785
|
-
const isExtended = vue.shallowRef(
|
3865
|
+
const isExtended = vue.shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
|
3786
3866
|
const contentHeight = vue.computed(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10));
|
3787
3867
|
const extensionHeight = vue.computed(() => isExtended.value ? parseInt(Number(props.extensionHeight) + (props.density === 'prominent' ? Number(props.extensionHeight) : 0) - (props.density === 'comfortable' ? 4 : 0) - (props.density === 'compact' ? 8 : 0), 10) : 0);
|
3788
3868
|
provideDefaults({
|
@@ -3794,7 +3874,7 @@
|
|
3794
3874
|
const hasTitle = !!(props.title || slots.title);
|
3795
3875
|
const hasImage = !!(slots.image || props.image);
|
3796
3876
|
const extension = slots.extension?.();
|
3797
|
-
isExtended.value =
|
3877
|
+
isExtended.value = props.extended === null ? !!extension : props.extended;
|
3798
3878
|
return vue.createVNode(props.tag, {
|
3799
3879
|
"class": vue.normalizeClass(['v-toolbar', {
|
3800
3880
|
'v-toolbar--absolute': props.absolute,
|
@@ -4177,9 +4257,15 @@
|
|
4177
4257
|
};
|
4178
4258
|
}
|
4179
4259
|
|
4260
|
+
// Types
|
4261
|
+
|
4180
4262
|
const makeVBtnGroupProps = propsFactory({
|
4181
4263
|
baseColor: String,
|
4182
4264
|
divided: Boolean,
|
4265
|
+
direction: {
|
4266
|
+
type: String,
|
4267
|
+
default: 'horizontal'
|
4268
|
+
},
|
4183
4269
|
...makeBorderProps(),
|
4184
4270
|
...makeComponentProps(),
|
4185
4271
|
...makeDensityProps(),
|
@@ -4213,7 +4299,7 @@
|
|
4213
4299
|
} = useRounded(props);
|
4214
4300
|
provideDefaults({
|
4215
4301
|
VBtn: {
|
4216
|
-
height: 'auto',
|
4302
|
+
height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
|
4217
4303
|
baseColor: vue.toRef(() => props.baseColor),
|
4218
4304
|
color: vue.toRef(() => props.color),
|
4219
4305
|
density: vue.toRef(() => props.density),
|
@@ -4223,7 +4309,7 @@
|
|
4223
4309
|
});
|
4224
4310
|
useRender(() => {
|
4225
4311
|
return vue.createVNode(props.tag, {
|
4226
|
-
"class": vue.normalizeClass(['v-btn-group', {
|
4312
|
+
"class": vue.normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
|
4227
4313
|
'v-btn-group--divided': props.divided
|
4228
4314
|
}, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
|
4229
4315
|
"style": vue.normalizeStyle(props.style)
|
@@ -5555,8 +5641,8 @@
|
|
5555
5641
|
window.clearTimeout(element._ripple.showTimer);
|
5556
5642
|
}
|
5557
5643
|
let keyboardRipple = false;
|
5558
|
-
function keyboardRippleShow(e) {
|
5559
|
-
if (!keyboardRipple && (e.keyCode
|
5644
|
+
function keyboardRippleShow(e, keys) {
|
5645
|
+
if (!keyboardRipple && keys.includes(e.keyCode)) {
|
5560
5646
|
keyboardRipple = true;
|
5561
5647
|
rippleShow(e);
|
5562
5648
|
}
|
@@ -5584,9 +5670,12 @@
|
|
5584
5670
|
el._ripple.enabled = enabled;
|
5585
5671
|
el._ripple.centered = modifiers.center;
|
5586
5672
|
el._ripple.circle = modifiers.circle;
|
5587
|
-
|
5588
|
-
|
5673
|
+
const bindingValue = isObject(value) ? value : {};
|
5674
|
+
if (bindingValue.class) {
|
5675
|
+
el._ripple.class = bindingValue.class;
|
5589
5676
|
}
|
5677
|
+
const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
|
5678
|
+
el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
|
5590
5679
|
if (enabled && !wasEnabled) {
|
5591
5680
|
if (modifiers.stop) {
|
5592
5681
|
el.addEventListener('touchstart', rippleStop, {
|
@@ -5608,7 +5697,7 @@
|
|
5608
5697
|
el.addEventListener('mousedown', rippleShow);
|
5609
5698
|
el.addEventListener('mouseup', rippleHide);
|
5610
5699
|
el.addEventListener('mouseleave', rippleHide);
|
5611
|
-
el.addEventListener('keydown', keyboardRippleShow);
|
5700
|
+
el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
|
5612
5701
|
el.addEventListener('keyup', keyboardRippleHide);
|
5613
5702
|
el.addEventListener('blur', focusRippleHide);
|
5614
5703
|
|
@@ -5628,7 +5717,9 @@
|
|
5628
5717
|
el.removeEventListener('touchcancel', rippleHide);
|
5629
5718
|
el.removeEventListener('mouseup', rippleHide);
|
5630
5719
|
el.removeEventListener('mouseleave', rippleHide);
|
5631
|
-
el.
|
5720
|
+
if (el._ripple?.keyDownHandler) {
|
5721
|
+
el.removeEventListener('keydown', el._ripple.keyDownHandler);
|
5722
|
+
}
|
5632
5723
|
el.removeEventListener('keyup', keyboardRippleHide);
|
5633
5724
|
el.removeEventListener('dragstart', rippleHide);
|
5634
5725
|
el.removeEventListener('blur', focusRippleHide);
|
@@ -5637,8 +5728,8 @@
|
|
5637
5728
|
updateRipple(el, binding, false);
|
5638
5729
|
}
|
5639
5730
|
function unmounted$4(el) {
|
5640
|
-
delete el._ripple;
|
5641
5731
|
removeListeners(el);
|
5732
|
+
delete el._ripple;
|
5642
5733
|
}
|
5643
5734
|
function updated$1(el, binding) {
|
5644
5735
|
if (binding.value === binding.oldValue) {
|
@@ -5911,6 +6002,31 @@
|
|
5911
6002
|
// Utilities
|
5912
6003
|
const VAlertTitle = createSimpleFunctional('v-alert-title');
|
5913
6004
|
|
6005
|
+
// Utilities
|
6006
|
+
|
6007
|
+
// Types
|
6008
|
+
|
6009
|
+
// Types
|
6010
|
+
|
6011
|
+
// Composables
|
6012
|
+
const makeIconSizeProps = propsFactory({
|
6013
|
+
iconSize: [Number, String],
|
6014
|
+
iconSizes: {
|
6015
|
+
type: Array,
|
6016
|
+
default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
|
6017
|
+
}
|
6018
|
+
}, 'iconSize');
|
6019
|
+
function useIconSizes(props, fallback) {
|
6020
|
+
const iconSize = vue.computed(() => {
|
6021
|
+
const iconSizeMap = new Map(props.iconSizes);
|
6022
|
+
const _iconSize = props.iconSize ?? fallback() ?? 'default';
|
6023
|
+
return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
|
6024
|
+
});
|
6025
|
+
return {
|
6026
|
+
iconSize
|
6027
|
+
};
|
6028
|
+
}
|
6029
|
+
|
5914
6030
|
// Types
|
5915
6031
|
|
5916
6032
|
const allowedTypes = ['success', 'info', 'warning', 'error'];
|
@@ -5950,6 +6066,7 @@
|
|
5950
6066
|
...makeDensityProps(),
|
5951
6067
|
...makeDimensionProps(),
|
5952
6068
|
...makeElevationProps(),
|
6069
|
+
...makeIconSizeProps(),
|
5953
6070
|
...makeLocationProps(),
|
5954
6071
|
...makePositionProps(),
|
5955
6072
|
...makeRoundedProps(),
|
@@ -5977,6 +6094,9 @@
|
|
5977
6094
|
if (!props.type) return props.icon;
|
5978
6095
|
return props.icon ?? `$${props.type}`;
|
5979
6096
|
});
|
6097
|
+
const {
|
6098
|
+
iconSize
|
6099
|
+
} = useIconSizes(props, () => props.prominent ? 44 : 28);
|
5980
6100
|
const {
|
5981
6101
|
themeClasses
|
5982
6102
|
} = provideTheme(props);
|
@@ -6024,6 +6144,11 @@
|
|
6024
6144
|
const hasPrepend = !!(slots.prepend || icon.value);
|
6025
6145
|
const hasTitle = !!(slots.title || props.title);
|
6026
6146
|
const hasClose = !!(slots.close || props.closable);
|
6147
|
+
const iconProps = {
|
6148
|
+
density: props.density,
|
6149
|
+
icon: icon.value,
|
6150
|
+
size: iconSize.value
|
6151
|
+
};
|
6027
6152
|
return isActive.value && vue.createVNode(props.tag, {
|
6028
6153
|
"class": vue.normalizeClass(['v-alert', props.border && {
|
6029
6154
|
'v-alert--border': !!props.border,
|
@@ -6041,19 +6166,14 @@
|
|
6041
6166
|
}, null), hasPrepend && vue.createElementVNode("div", {
|
6042
6167
|
"key": "prepend",
|
6043
6168
|
"class": "v-alert__prepend"
|
6044
|
-
}, [!slots.prepend ? vue.createVNode(VIcon, {
|
6045
|
-
"key": "prepend-icon"
|
6046
|
-
|
6047
|
-
"icon": icon.value,
|
6048
|
-
"size": props.prominent ? 44 : 28
|
6049
|
-
}, null) : vue.createVNode(VDefaultsProvider, {
|
6169
|
+
}, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
|
6170
|
+
"key": "prepend-icon"
|
6171
|
+
}, iconProps), null) : vue.createVNode(VDefaultsProvider, {
|
6050
6172
|
"key": "prepend-defaults",
|
6051
6173
|
"disabled": !icon.value,
|
6052
6174
|
"defaults": {
|
6053
6175
|
VIcon: {
|
6054
|
-
|
6055
|
-
icon: icon.value,
|
6056
|
-
size: props.prominent ? 44 : 28
|
6176
|
+
...iconProps
|
6057
6177
|
}
|
6058
6178
|
}
|
6059
6179
|
}, slots.prepend)]), vue.createElementVNode("div", {
|
@@ -7578,6 +7698,7 @@
|
|
7578
7698
|
const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
|
7579
7699
|
const makeVSlideGroupProps = propsFactory({
|
7580
7700
|
centerActive: Boolean,
|
7701
|
+
contentClass: null,
|
7581
7702
|
direction: {
|
7582
7703
|
type: String,
|
7583
7704
|
default: 'horizontal'
|
@@ -7890,7 +8011,7 @@
|
|
7890
8011
|
})]), vue.createElementVNode("div", {
|
7891
8012
|
"key": "container",
|
7892
8013
|
"ref": containerRef,
|
7893
|
-
"class":
|
8014
|
+
"class": vue.normalizeClass(['v-slide-group__container', props.contentClass]),
|
7894
8015
|
"onScroll": onScroll
|
7895
8016
|
}, [vue.createElementVNode("div", {
|
7896
8017
|
"ref": contentRef,
|
@@ -8253,16 +8374,85 @@
|
|
8253
8374
|
}
|
8254
8375
|
});
|
8255
8376
|
|
8377
|
+
const makeVDividerProps = propsFactory({
|
8378
|
+
color: String,
|
8379
|
+
inset: Boolean,
|
8380
|
+
length: [Number, String],
|
8381
|
+
opacity: [Number, String],
|
8382
|
+
thickness: [Number, String],
|
8383
|
+
vertical: Boolean,
|
8384
|
+
...makeComponentProps(),
|
8385
|
+
...makeThemeProps()
|
8386
|
+
}, 'VDivider');
|
8387
|
+
const VDivider = genericComponent()({
|
8388
|
+
name: 'VDivider',
|
8389
|
+
props: makeVDividerProps(),
|
8390
|
+
setup(props, _ref) {
|
8391
|
+
let {
|
8392
|
+
attrs,
|
8393
|
+
slots
|
8394
|
+
} = _ref;
|
8395
|
+
const {
|
8396
|
+
themeClasses
|
8397
|
+
} = provideTheme(props);
|
8398
|
+
const {
|
8399
|
+
textColorClasses,
|
8400
|
+
textColorStyles
|
8401
|
+
} = useTextColor(() => props.color);
|
8402
|
+
const dividerStyles = vue.computed(() => {
|
8403
|
+
const styles = {};
|
8404
|
+
if (props.length) {
|
8405
|
+
styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
|
8406
|
+
}
|
8407
|
+
if (props.thickness) {
|
8408
|
+
styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
|
8409
|
+
}
|
8410
|
+
return styles;
|
8411
|
+
});
|
8412
|
+
useRender(() => {
|
8413
|
+
const divider = vue.createElementVNode("hr", {
|
8414
|
+
"class": vue.normalizeClass([{
|
8415
|
+
'v-divider': true,
|
8416
|
+
'v-divider--inset': props.inset,
|
8417
|
+
'v-divider--vertical': props.vertical
|
8418
|
+
}, themeClasses.value, textColorClasses.value, props.class]),
|
8419
|
+
"style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
|
8420
|
+
'--v-border-opacity': props.opacity
|
8421
|
+
}, props.style]),
|
8422
|
+
"aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
|
8423
|
+
"role": `${attrs.role || 'separator'}`
|
8424
|
+
}, null);
|
8425
|
+
if (!slots.default) return divider;
|
8426
|
+
return vue.createElementVNode("div", {
|
8427
|
+
"class": vue.normalizeClass(['v-divider__wrapper', {
|
8428
|
+
'v-divider__wrapper--vertical': props.vertical,
|
8429
|
+
'v-divider__wrapper--inset': props.inset
|
8430
|
+
}])
|
8431
|
+
}, [divider, vue.createElementVNode("div", {
|
8432
|
+
"class": "v-divider__content"
|
8433
|
+
}, [slots.default()]), divider]);
|
8434
|
+
});
|
8435
|
+
return {};
|
8436
|
+
}
|
8437
|
+
});
|
8438
|
+
|
8256
8439
|
// Utilities
|
8257
8440
|
|
8258
8441
|
// List
|
8259
8442
|
const ListKey = Symbol.for('vuetify:list');
|
8260
8443
|
function createList() {
|
8444
|
+
let {
|
8445
|
+
filterable
|
8446
|
+
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
8447
|
+
filterable: false
|
8448
|
+
};
|
8261
8449
|
const parent = vue.inject(ListKey, {
|
8450
|
+
filterable: false,
|
8262
8451
|
hasPrepend: vue.shallowRef(false),
|
8263
8452
|
updateHasPrepend: () => null
|
8264
8453
|
});
|
8265
8454
|
const data = {
|
8455
|
+
filterable: parent.filterable || filterable,
|
8266
8456
|
hasPrepend: vue.shallowRef(false),
|
8267
8457
|
updateHasPrepend: value => {
|
8268
8458
|
if (value) data.hasPrepend.value = value;
|
@@ -9214,6 +9404,9 @@
|
|
9214
9404
|
roundedClasses
|
9215
9405
|
} = useRounded(roundedProps);
|
9216
9406
|
const lineClasses = vue.toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
|
9407
|
+
const rippleOptions = vue.toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
|
9408
|
+
keys: [keyCodes.enter]
|
9409
|
+
} : props.ripple);
|
9217
9410
|
const slotProps = vue.computed(() => ({
|
9218
9411
|
isActive: isActive.value,
|
9219
9412
|
select,
|
@@ -9238,8 +9431,9 @@
|
|
9238
9431
|
function onKeyDown(e) {
|
9239
9432
|
const target = e.target;
|
9240
9433
|
if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
|
9241
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
9434
|
+
if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
|
9242
9435
|
e.preventDefault();
|
9436
|
+
e.stopPropagation();
|
9243
9437
|
e.target.dispatchEvent(new MouseEvent('click', e));
|
9244
9438
|
}
|
9245
9439
|
}
|
@@ -9349,7 +9543,7 @@
|
|
9349
9543
|
}), vue.createElementVNode("div", {
|
9350
9544
|
"class": "v-list-item__spacer"
|
9351
9545
|
}, null)])]
|
9352
|
-
}), [[Ripple, isClickable.value &&
|
9546
|
+
}), [[Ripple, isClickable.value && rippleOptions.value]]);
|
9353
9547
|
});
|
9354
9548
|
return {
|
9355
9549
|
activate,
|
@@ -9404,68 +9598,6 @@
|
|
9404
9598
|
}
|
9405
9599
|
});
|
9406
9600
|
|
9407
|
-
const makeVDividerProps = propsFactory({
|
9408
|
-
color: String,
|
9409
|
-
inset: Boolean,
|
9410
|
-
length: [Number, String],
|
9411
|
-
opacity: [Number, String],
|
9412
|
-
thickness: [Number, String],
|
9413
|
-
vertical: Boolean,
|
9414
|
-
...makeComponentProps(),
|
9415
|
-
...makeThemeProps()
|
9416
|
-
}, 'VDivider');
|
9417
|
-
const VDivider = genericComponent()({
|
9418
|
-
name: 'VDivider',
|
9419
|
-
props: makeVDividerProps(),
|
9420
|
-
setup(props, _ref) {
|
9421
|
-
let {
|
9422
|
-
attrs,
|
9423
|
-
slots
|
9424
|
-
} = _ref;
|
9425
|
-
const {
|
9426
|
-
themeClasses
|
9427
|
-
} = provideTheme(props);
|
9428
|
-
const {
|
9429
|
-
textColorClasses,
|
9430
|
-
textColorStyles
|
9431
|
-
} = useTextColor(() => props.color);
|
9432
|
-
const dividerStyles = vue.computed(() => {
|
9433
|
-
const styles = {};
|
9434
|
-
if (props.length) {
|
9435
|
-
styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
|
9436
|
-
}
|
9437
|
-
if (props.thickness) {
|
9438
|
-
styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
|
9439
|
-
}
|
9440
|
-
return styles;
|
9441
|
-
});
|
9442
|
-
useRender(() => {
|
9443
|
-
const divider = vue.createElementVNode("hr", {
|
9444
|
-
"class": vue.normalizeClass([{
|
9445
|
-
'v-divider': true,
|
9446
|
-
'v-divider--inset': props.inset,
|
9447
|
-
'v-divider--vertical': props.vertical
|
9448
|
-
}, themeClasses.value, textColorClasses.value, props.class]),
|
9449
|
-
"style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
|
9450
|
-
'--v-border-opacity': props.opacity
|
9451
|
-
}, props.style]),
|
9452
|
-
"aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
|
9453
|
-
"role": `${attrs.role || 'separator'}`
|
9454
|
-
}, null);
|
9455
|
-
if (!slots.default) return divider;
|
9456
|
-
return vue.createElementVNode("div", {
|
9457
|
-
"class": vue.normalizeClass(['v-divider__wrapper', {
|
9458
|
-
'v-divider__wrapper--vertical': props.vertical,
|
9459
|
-
'v-divider__wrapper--inset': props.inset
|
9460
|
-
}])
|
9461
|
-
}, [divider, vue.createElementVNode("div", {
|
9462
|
-
"class": "v-divider__content"
|
9463
|
-
}, [slots.default()]), divider]);
|
9464
|
-
});
|
9465
|
-
return {};
|
9466
|
-
}
|
9467
|
-
});
|
9468
|
-
|
9469
9601
|
// Types
|
9470
9602
|
|
9471
9603
|
const makeVListChildrenProps = propsFactory({
|
@@ -9582,7 +9714,7 @@
|
|
9582
9714
|
const _props = {
|
9583
9715
|
title,
|
9584
9716
|
value,
|
9585
|
-
...itemProps
|
9717
|
+
...camelizeProps(itemProps)
|
9586
9718
|
};
|
9587
9719
|
return {
|
9588
9720
|
title: String(_props.title ?? ''),
|
@@ -9734,6 +9866,7 @@
|
|
9734
9866
|
activeClass: String,
|
9735
9867
|
bgColor: String,
|
9736
9868
|
disabled: Boolean,
|
9869
|
+
filterable: Boolean,
|
9737
9870
|
expandIcon: IconValue,
|
9738
9871
|
collapseIcon: IconValue,
|
9739
9872
|
lines: {
|
@@ -9817,7 +9950,9 @@
|
|
9817
9950
|
const activeColor = vue.toRef(() => props.activeColor);
|
9818
9951
|
const baseColor = vue.toRef(() => props.baseColor);
|
9819
9952
|
const color = vue.toRef(() => props.color);
|
9820
|
-
createList(
|
9953
|
+
createList({
|
9954
|
+
filterable: props.filterable
|
9955
|
+
});
|
9821
9956
|
provideDefaults({
|
9822
9957
|
VListGroup: {
|
9823
9958
|
activeColor,
|
@@ -12393,7 +12528,12 @@
|
|
12393
12528
|
}
|
12394
12529
|
function calculateOffset(index) {
|
12395
12530
|
index = clamp(index, 0, items.value.length - 1);
|
12396
|
-
|
12531
|
+
const whole = Math.floor(index);
|
12532
|
+
const fraction = index % 1;
|
12533
|
+
const next = whole + 1;
|
12534
|
+
const wholeOffset = offsets[whole] || 0;
|
12535
|
+
const nextOffset = offsets[next] || wholeOffset;
|
12536
|
+
return wholeOffset + (nextOffset - wholeOffset) * fraction;
|
12397
12537
|
}
|
12398
12538
|
function calculateIndex(scrollTop) {
|
12399
12539
|
return binaryClosest(offsets, scrollTop);
|
@@ -12747,6 +12887,7 @@
|
|
12747
12887
|
},
|
12748
12888
|
openOnClear: Boolean,
|
12749
12889
|
itemColor: String,
|
12890
|
+
noAutoScroll: Boolean,
|
12750
12891
|
...makeItemsProps({
|
12751
12892
|
itemChildren: false
|
12752
12893
|
})
|
@@ -12961,7 +13102,7 @@
|
|
12961
13102
|
vue.watch(menu, () => {
|
12962
13103
|
if (!props.hideSelected && menu.value && model.value.length) {
|
12963
13104
|
const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
|
12964
|
-
IN_BROWSER && window.requestAnimationFrame(() => {
|
13105
|
+
IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
|
12965
13106
|
index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
|
12966
13107
|
});
|
12967
13108
|
}
|
@@ -13053,6 +13194,22 @@
|
|
13053
13194
|
key: item.value,
|
13054
13195
|
onClick: () => select(item, null)
|
13055
13196
|
});
|
13197
|
+
if (item.raw.type === 'divider') {
|
13198
|
+
return slots.divider?.({
|
13199
|
+
props: item.raw,
|
13200
|
+
index
|
13201
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
13202
|
+
"key": `divider-${index}`
|
13203
|
+
}), null);
|
13204
|
+
}
|
13205
|
+
if (item.raw.type === 'subheader') {
|
13206
|
+
return slots.subheader?.({
|
13207
|
+
props: item.raw,
|
13208
|
+
index
|
13209
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
13210
|
+
"key": `subheader-${index}`
|
13211
|
+
}), null);
|
13212
|
+
}
|
13056
13213
|
return slots.item?.({
|
13057
13214
|
item,
|
13058
13215
|
index,
|
@@ -13213,6 +13370,9 @@
|
|
13213
13370
|
let match = -1;
|
13214
13371
|
if ((query || customFiltersLength > 0) && !options?.noFilter) {
|
13215
13372
|
if (typeof item === 'object') {
|
13373
|
+
if (['divider', 'subheader'].includes(item.raw?.type)) {
|
13374
|
+
continue;
|
13375
|
+
}
|
13216
13376
|
const filterKeys = keys || Object.keys(transformed);
|
13217
13377
|
for (const key of filterKeys) {
|
13218
13378
|
const value = getPropertyFromItem(transformed, key);
|
@@ -13415,7 +13575,7 @@
|
|
13415
13575
|
menu.value = !menu.value;
|
13416
13576
|
}
|
13417
13577
|
function onListKeydown(e) {
|
13418
|
-
if (e.key
|
13578
|
+
if (checkPrintable(e) || e.key === 'Backspace') {
|
13419
13579
|
vTextFieldRef.value?.focus();
|
13420
13580
|
}
|
13421
13581
|
}
|
@@ -13620,6 +13780,7 @@
|
|
13620
13780
|
}, props.menuProps), {
|
13621
13781
|
default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
|
13622
13782
|
"ref": listRef,
|
13783
|
+
"filterable": true,
|
13623
13784
|
"selected": selectedValues.value,
|
13624
13785
|
"selectStrategy": props.multiple ? 'independent' : 'single-independent',
|
13625
13786
|
"onMousedown": e => e.preventDefault(),
|
@@ -13651,6 +13812,22 @@
|
|
13651
13812
|
active: highlightFirst.value && index === 0 ? true : undefined,
|
13652
13813
|
onClick: () => select(item, null)
|
13653
13814
|
});
|
13815
|
+
if (item.raw.type === 'divider') {
|
13816
|
+
return slots.divider?.({
|
13817
|
+
props: item.raw,
|
13818
|
+
index
|
13819
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
13820
|
+
"key": `divider-${index}`
|
13821
|
+
}), null);
|
13822
|
+
}
|
13823
|
+
if (item.raw.type === 'subheader') {
|
13824
|
+
return slots.subheader?.({
|
13825
|
+
props: item.raw,
|
13826
|
+
index
|
13827
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
13828
|
+
"key": `subheader-${index}`
|
13829
|
+
}), null);
|
13830
|
+
}
|
13654
13831
|
return slots.item?.({
|
13655
13832
|
item,
|
13656
13833
|
index,
|
@@ -13795,7 +13972,8 @@
|
|
13795
13972
|
...makeThemeProps(),
|
13796
13973
|
...makeTransitionProps({
|
13797
13974
|
transition: 'scale-rotate-transition'
|
13798
|
-
})
|
13975
|
+
}),
|
13976
|
+
...makeDimensionProps()
|
13799
13977
|
}, 'VBadge');
|
13800
13978
|
const VBadge = genericComponent()({
|
13801
13979
|
name: 'VBadge',
|
@@ -13825,6 +14003,9 @@
|
|
13825
14003
|
const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
|
13826
14004
|
return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
|
13827
14005
|
});
|
14006
|
+
const {
|
14007
|
+
dimensionStyles
|
14008
|
+
} = useDimension(props);
|
13828
14009
|
useRender(() => {
|
13829
14010
|
const value = Number(props.content);
|
13830
14011
|
const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
|
@@ -13846,7 +14027,7 @@
|
|
13846
14027
|
}, {
|
13847
14028
|
default: () => [vue.withDirectives(vue.createElementVNode("span", vue.mergeProps({
|
13848
14029
|
"class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
|
13849
|
-
"style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
|
14030
|
+
"style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
|
13850
14031
|
"aria-atomic": "true",
|
13851
14032
|
"aria-label": t(props.label, value),
|
13852
14033
|
"aria-live": "polite",
|
@@ -17255,13 +17436,13 @@
|
|
17255
17436
|
return null;
|
17256
17437
|
}
|
17257
17438
|
const sundayJanuarySecond2000 = new Date(2000, 0, 2);
|
17258
|
-
function getWeekdays(locale, firstDayOfWeek) {
|
17439
|
+
function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
|
17259
17440
|
const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
|
17260
17441
|
return createRange(7).map(i => {
|
17261
17442
|
const weekday = new Date(sundayJanuarySecond2000);
|
17262
17443
|
weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
|
17263
17444
|
return new Intl.DateTimeFormat(locale, {
|
17264
|
-
weekday: 'narrow'
|
17445
|
+
weekday: weekdayFormat ?? 'narrow'
|
17265
17446
|
}).format(weekday);
|
17266
17447
|
});
|
17267
17448
|
}
|
@@ -17725,9 +17906,9 @@
|
|
17725
17906
|
getDiff(date, comparing, unit) {
|
17726
17907
|
return getDiff(date, comparing, unit);
|
17727
17908
|
}
|
17728
|
-
getWeekdays(firstDayOfWeek) {
|
17909
|
+
getWeekdays(firstDayOfWeek, weekdayFormat) {
|
17729
17910
|
const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
|
17730
|
-
return getWeekdays(this.locale, firstDay);
|
17911
|
+
return getWeekdays(this.locale, firstDay, weekdayFormat);
|
17731
17912
|
}
|
17732
17913
|
getYear(date) {
|
17733
17914
|
return getYear(date);
|
@@ -18083,6 +18264,7 @@
|
|
18083
18264
|
_search.value = val ?? '';
|
18084
18265
|
if (!props.multiple && !hasSelectionSlot.value) {
|
18085
18266
|
model.value = [transformItem$3(props, val)];
|
18267
|
+
vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
|
18086
18268
|
}
|
18087
18269
|
if (val && props.multiple && props.delimiters?.length) {
|
18088
18270
|
const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
|
@@ -18163,7 +18345,7 @@
|
|
18163
18345
|
menu.value = !menu.value;
|
18164
18346
|
}
|
18165
18347
|
function onListKeydown(e) {
|
18166
|
-
if (e.key
|
18348
|
+
if (checkPrintable(e) || e.key === 'Backspace') {
|
18167
18349
|
vTextFieldRef.value?.focus();
|
18168
18350
|
}
|
18169
18351
|
}
|
@@ -18368,6 +18550,7 @@
|
|
18368
18550
|
}, props.menuProps), {
|
18369
18551
|
default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
|
18370
18552
|
"ref": listRef,
|
18553
|
+
"filterable": true,
|
18371
18554
|
"selected": selectedValues.value,
|
18372
18555
|
"selectStrategy": props.multiple ? 'independent' : 'single-independent',
|
18373
18556
|
"onMousedown": e => e.preventDefault(),
|
@@ -18399,6 +18582,22 @@
|
|
18399
18582
|
active: highlightFirst.value && index === 0 ? true : undefined,
|
18400
18583
|
onClick: () => select(item, null)
|
18401
18584
|
});
|
18585
|
+
if (item.raw.type === 'divider') {
|
18586
|
+
return slots.divider?.({
|
18587
|
+
props: item.raw,
|
18588
|
+
index
|
18589
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
18590
|
+
"key": `divider-${index}`
|
18591
|
+
}), null);
|
18592
|
+
}
|
18593
|
+
if (item.raw.type === 'subheader') {
|
18594
|
+
return slots.subheader?.({
|
18595
|
+
props: item.raw,
|
18596
|
+
index
|
18597
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
18598
|
+
"key": `subheader-${index}`
|
18599
|
+
}), null);
|
18600
|
+
}
|
18402
18601
|
return slots.item?.({
|
18403
18602
|
item,
|
18404
18603
|
index,
|
@@ -20278,6 +20477,7 @@
|
|
20278
20477
|
color: String,
|
20279
20478
|
disableSort: Boolean,
|
20280
20479
|
fixedHeader: Boolean,
|
20480
|
+
lastFixed: Boolean,
|
20281
20481
|
multiSort: Boolean,
|
20282
20482
|
sortAscIcon: {
|
20283
20483
|
type: IconValue,
|
@@ -20324,10 +20524,11 @@
|
|
20324
20524
|
loaderClasses
|
20325
20525
|
} = useLoader(props);
|
20326
20526
|
function getFixedStyles(column, y) {
|
20327
|
-
if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
|
20527
|
+
if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
|
20328
20528
|
return {
|
20329
20529
|
position: 'sticky',
|
20330
|
-
left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
|
20530
|
+
left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
|
20531
|
+
right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
|
20331
20532
|
top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
|
20332
20533
|
};
|
20333
20534
|
}
|
@@ -20836,11 +21037,18 @@
|
|
20836
21037
|
}
|
20837
21038
|
});
|
20838
21039
|
|
21040
|
+
// Types
|
21041
|
+
|
20839
21042
|
const makeVTableProps = propsFactory({
|
20840
21043
|
fixedHeader: Boolean,
|
20841
21044
|
fixedFooter: Boolean,
|
20842
21045
|
height: [Number, String],
|
20843
21046
|
hover: Boolean,
|
21047
|
+
striped: {
|
21048
|
+
type: String,
|
21049
|
+
default: null,
|
21050
|
+
validator: v => ['even', 'odd'].includes(v)
|
21051
|
+
},
|
20844
21052
|
...makeComponentProps(),
|
20845
21053
|
...makeDensityProps(),
|
20846
21054
|
...makeTagProps(),
|
@@ -20867,7 +21075,9 @@
|
|
20867
21075
|
'v-table--fixed-footer': props.fixedFooter,
|
20868
21076
|
'v-table--has-top': !!slots.top,
|
20869
21077
|
'v-table--has-bottom': !!slots.bottom,
|
20870
|
-
'v-table--hover': props.hover
|
21078
|
+
'v-table--hover': props.hover,
|
21079
|
+
'v-table--striped-even': props.striped === 'even',
|
21080
|
+
'v-table--striped-odd': props.striped === 'odd'
|
20871
21081
|
}, themeClasses.value, densityClasses.value, props.class]),
|
20872
21082
|
"style": vue.normalizeStyle(props.style)
|
20873
21083
|
}, {
|
@@ -22042,7 +22252,8 @@
|
|
22042
22252
|
firstDayOfWeek: {
|
22043
22253
|
type: [Number, String],
|
22044
22254
|
default: undefined
|
22045
|
-
}
|
22255
|
+
},
|
22256
|
+
weekdayFormat: String
|
22046
22257
|
}, 'calendar');
|
22047
22258
|
function useCalendar(props) {
|
22048
22259
|
const adapter = useDate();
|
@@ -22283,7 +22494,7 @@
|
|
22283
22494
|
"ref": daysRef,
|
22284
22495
|
"key": daysInMonth.value[0].date?.toString(),
|
22285
22496
|
"class": "v-date-picker-month__days"
|
22286
|
-
}, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
|
22497
|
+
}, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createElementVNode("div", {
|
22287
22498
|
"class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
|
22288
22499
|
}, [weekDay])), daysInMonth.value.map((item, i) => {
|
22289
22500
|
const slotProps = {
|
@@ -24873,6 +25084,10 @@
|
|
24873
25084
|
type: Number,
|
24874
25085
|
default: 0
|
24875
25086
|
},
|
25087
|
+
minFractionDigits: {
|
25088
|
+
type: Number,
|
25089
|
+
default: null
|
25090
|
+
},
|
24876
25091
|
...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
|
24877
25092
|
}, 'VNumberInput');
|
24878
25093
|
const VNumberInput = genericComponent()({
|
@@ -24903,9 +25118,19 @@
|
|
24903
25118
|
} = useFocus(props);
|
24904
25119
|
function correctPrecision(val) {
|
24905
25120
|
let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
|
24906
|
-
|
24907
|
-
|
24908
|
-
|
25121
|
+
if (precision == null) {
|
25122
|
+
return String(val);
|
25123
|
+
}
|
25124
|
+
let fixed = val.toFixed(precision);
|
25125
|
+
if (isFocused.value) {
|
25126
|
+
return Number(fixed).toString(); // trim zeros
|
25127
|
+
}
|
25128
|
+
if ((props.minFractionDigits ?? precision) < precision) {
|
25129
|
+
const trimLimit = precision - props.minFractionDigits;
|
25130
|
+
const [baseDigits, fractionDigits] = fixed.split('.');
|
25131
|
+
fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
|
25132
|
+
}
|
25133
|
+
return fixed;
|
24909
25134
|
}
|
24910
25135
|
const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
|
24911
25136
|
const _inputText = vue.shallowRef(null);
|
@@ -24960,6 +25185,7 @@
|
|
24960
25185
|
}
|
24961
25186
|
};
|
24962
25187
|
vue.watch(() => props.precision, () => formatInputValue());
|
25188
|
+
vue.watch(() => props.minFractionDigits, () => formatInputValue());
|
24963
25189
|
vue.onMounted(() => {
|
24964
25190
|
clampModel();
|
24965
25191
|
});
|
@@ -25074,7 +25300,7 @@
|
|
25074
25300
|
inputText.value = null;
|
25075
25301
|
return;
|
25076
25302
|
}
|
25077
|
-
inputText.value =
|
25303
|
+
inputText.value = correctPrecision(model.value);
|
25078
25304
|
}
|
25079
25305
|
function trimDecimalZeros() {
|
25080
25306
|
if (controlsDisabled.value) return;
|
@@ -25334,9 +25560,10 @@
|
|
25334
25560
|
e.preventDefault();
|
25335
25561
|
e.stopPropagation();
|
25336
25562
|
const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
|
25563
|
+
const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
|
25337
25564
|
if (isValidNumber(clipboardText)) return;
|
25338
25565
|
model.value = clipboardText.split('');
|
25339
|
-
inputRef.value?.[
|
25566
|
+
inputRef.value?.[finalIndex].focus();
|
25340
25567
|
}
|
25341
25568
|
function reset() {
|
25342
25569
|
model.value = [];
|
@@ -30039,11 +30266,6 @@
|
|
30039
30266
|
hideOverlay: Boolean,
|
30040
30267
|
icon: [String, Function, Object],
|
30041
30268
|
iconColor: String,
|
30042
|
-
iconSize: [Number, String],
|
30043
|
-
iconSizes: {
|
30044
|
-
type: Array,
|
30045
|
-
default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
|
30046
|
-
},
|
30047
30269
|
loading: Boolean,
|
30048
30270
|
opacity: [Number, String],
|
30049
30271
|
readonly: Boolean,
|
@@ -30063,6 +30285,7 @@
|
|
30063
30285
|
...makeBorderProps(),
|
30064
30286
|
...makeComponentProps(),
|
30065
30287
|
...makeElevationProps(),
|
30288
|
+
...makeIconSizeProps(),
|
30066
30289
|
...makeRoundedProps(),
|
30067
30290
|
...makeTagProps({
|
30068
30291
|
tag: 'button'
|
@@ -30117,7 +30340,6 @@
|
|
30117
30340
|
})()
|
30118
30341
|
}));
|
30119
30342
|
const btnSizeMap = new Map(props.sizes);
|
30120
|
-
const iconSizeMap = new Map(props.iconSizes);
|
30121
30343
|
function onClick() {
|
30122
30344
|
if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
|
30123
30345
|
isActive.value = !isActive.value;
|
@@ -30129,12 +30351,12 @@
|
|
30129
30351
|
const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
|
30130
30352
|
const btnHeight = props.height ?? btnSize;
|
30131
30353
|
const btnWidth = props.width ?? btnSize;
|
30132
|
-
const
|
30133
|
-
|
30134
|
-
|
30354
|
+
const {
|
30355
|
+
iconSize
|
30356
|
+
} = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
|
30135
30357
|
const iconProps = {
|
30136
30358
|
icon,
|
30137
|
-
size: iconSize,
|
30359
|
+
size: iconSize.value,
|
30138
30360
|
iconColor: props.iconColor,
|
30139
30361
|
opacity: props.opacity
|
30140
30362
|
};
|
@@ -30177,7 +30399,7 @@
|
|
30177
30399
|
"color": typeof props.loading === 'boolean' ? undefined : props.loading,
|
30178
30400
|
"indeterminate": "disable-shrink",
|
30179
30401
|
"width": "2",
|
30180
|
-
"size": iconSize
|
30402
|
+
"size": iconSize.value
|
30181
30403
|
}, null)])]
|
30182
30404
|
});
|
30183
30405
|
});
|
@@ -32087,7 +32309,7 @@
|
|
32087
32309
|
};
|
32088
32310
|
});
|
32089
32311
|
}
|
32090
|
-
const version$1 = "3.8.
|
32312
|
+
const version$1 = "3.8.8-dev.2025-06-08";
|
32091
32313
|
createVuetify$1.version = version$1;
|
32092
32314
|
|
32093
32315
|
// Vue's inject() can only be used in setup
|
@@ -32385,7 +32607,7 @@
|
|
32385
32607
|
|
32386
32608
|
/* eslint-disable local-rules/sort-imports */
|
32387
32609
|
|
32388
|
-
const version = "3.8.
|
32610
|
+
const version = "3.8.8-dev.2025-06-08";
|
32389
32611
|
|
32390
32612
|
/* eslint-disable local-rules/sort-imports */
|
32391
32613
|
|