@vuetify/nightly 3.8.8-master.2025-06-08 → 3.8.9-dev.2025-06-11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -16
- package/dist/json/attributes.json +3215 -3091
- package/dist/json/importMap-labs.json +44 -44
- package/dist/json/importMap.json +166 -166
- package/dist/json/tags.json +32 -1
- package/dist/json/web-types.json +6040 -5654
- package/dist/vuetify-labs.cjs +397 -154
- package/dist/vuetify-labs.css +4053 -4019
- package/dist/vuetify-labs.d.ts +2604 -2064
- package/dist/vuetify-labs.esm.js +398 -155
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +397 -154
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +391 -143
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +3715 -3681
- package/dist/vuetify.d.ts +1600 -1100
- package/dist/vuetify.esm.js +392 -144
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +391 -143
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +1198 -1183
- 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/VInfiniteScroll/VInfiniteScroll.d.ts +9 -3
- package/lib/components/VInfiniteScroll/VInfiniteScroll.js +29 -0
- package/lib/components/VInfiniteScroll/VInfiniteScroll.js.map +1 -1
- 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 +27 -8
- 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 +5 -5
- package/lib/composables/date/adapters/vuetify.js.map +1 -1
- package/lib/composables/date/date.d.ts +3 -3
- package/lib/composables/date/date.js +1 -1
- package/lib/composables/date/date.js.map +1 -1
- 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 +86 -71
- 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 -1
- package/lib/util/helpers.js +0 -1
- package/lib/util/helpers.js.map +1 -1
- package/package.json +3 -1
package/dist/vuetify.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Vuetify v3.8.
|
2
|
+
* Vuetify v3.8.9-dev.2025-06-11
|
3
3
|
* Forged by John Leider
|
4
4
|
* Released under the MIT License.
|
5
5
|
*/
|
@@ -14,6 +14,7 @@
|
|
14
14
|
const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
|
15
15
|
const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
|
16
16
|
const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
|
17
|
+
const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
|
17
18
|
|
18
19
|
function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
|
19
20
|
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
@@ -530,7 +531,6 @@
|
|
530
531
|
return cleanText;
|
531
532
|
}
|
532
533
|
function camelizeProps(props) {
|
533
|
-
if (!props) return;
|
534
534
|
const out = {};
|
535
535
|
for (const prop in props) {
|
536
536
|
out[vue.camelize(prop)] = props[prop];
|
@@ -2836,6 +2836,7 @@
|
|
2836
2836
|
function genDefaults$1() {
|
2837
2837
|
return {
|
2838
2838
|
defaultTheme: 'light',
|
2839
|
+
prefix: 'v-',
|
2839
2840
|
variations: {
|
2840
2841
|
colors: [],
|
2841
2842
|
lighten: 0,
|
@@ -2917,7 +2918,10 @@
|
|
2917
2918
|
}
|
2918
2919
|
}
|
2919
2920
|
},
|
2920
|
-
stylesheetId: 'vuetify-theme-stylesheet'
|
2921
|
+
stylesheetId: 'vuetify-theme-stylesheet',
|
2922
|
+
scoped: false,
|
2923
|
+
unimportant: false,
|
2924
|
+
utilities: true
|
2921
2925
|
};
|
2922
2926
|
}
|
2923
2927
|
function parseThemeOptions() {
|
@@ -2940,21 +2944,21 @@
|
|
2940
2944
|
function createCssClass(lines, selector, content, scope) {
|
2941
2945
|
lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
|
2942
2946
|
}
|
2943
|
-
function genCssVariables(theme) {
|
2947
|
+
function genCssVariables(theme, prefix) {
|
2944
2948
|
const lightOverlay = theme.dark ? 2 : 1;
|
2945
2949
|
const darkOverlay = theme.dark ? 1 : 2;
|
2946
2950
|
const variables = [];
|
2947
2951
|
for (const [key, value] of Object.entries(theme.colors)) {
|
2948
2952
|
const rgb = parseColor(value);
|
2949
|
-
variables.push(
|
2953
|
+
variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
|
2950
2954
|
if (!key.startsWith('on-')) {
|
2951
|
-
variables.push(
|
2955
|
+
variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
|
2952
2956
|
}
|
2953
2957
|
}
|
2954
2958
|
for (const [key, value] of Object.entries(theme.variables)) {
|
2955
2959
|
const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
|
2956
2960
|
const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
|
2957
|
-
variables.push(
|
2961
|
+
variables.push(`--${prefix}${key}: ${rgb ?? value}`);
|
2958
2962
|
}
|
2959
2963
|
return variables;
|
2960
2964
|
}
|
@@ -2998,7 +3002,8 @@
|
|
2998
3002
|
const scopeSelector = `:where(${scope})`;
|
2999
3003
|
return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
|
3000
3004
|
}
|
3001
|
-
function upsertStyles(
|
3005
|
+
function upsertStyles(id, cspNonce, styles) {
|
3006
|
+
const styleEl = getOrCreateStyleElement(id, cspNonce);
|
3002
3007
|
if (!styleEl) return;
|
3003
3008
|
styleEl.innerHTML = styles;
|
3004
3009
|
}
|
@@ -3018,8 +3023,17 @@
|
|
3018
3023
|
// Composables
|
3019
3024
|
function createTheme(options) {
|
3020
3025
|
const parsedOptions = parseThemeOptions(options);
|
3021
|
-
const
|
3026
|
+
const _name = vue.shallowRef(parsedOptions.defaultTheme);
|
3022
3027
|
const themes = vue.ref(parsedOptions.themes);
|
3028
|
+
const systemName = vue.shallowRef('light');
|
3029
|
+
const name = vue.computed({
|
3030
|
+
get() {
|
3031
|
+
return _name.value === 'system' ? systemName.value : _name.value;
|
3032
|
+
},
|
3033
|
+
set(val) {
|
3034
|
+
_name.value = val;
|
3035
|
+
}
|
3036
|
+
});
|
3023
3037
|
const computedThemes = vue.computed(() => {
|
3024
3038
|
const acc = {};
|
3025
3039
|
for (const [name, original] of Object.entries(themes.value)) {
|
@@ -3040,28 +3054,49 @@
|
|
3040
3054
|
const current = vue.toRef(() => computedThemes.value[name.value]);
|
3041
3055
|
const styles = vue.computed(() => {
|
3042
3056
|
const lines = [];
|
3057
|
+
const important = parsedOptions.unimportant ? '' : ' !important';
|
3058
|
+
const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
|
3043
3059
|
if (current.value?.dark) {
|
3044
3060
|
createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
|
3045
3061
|
}
|
3046
|
-
createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
|
3062
|
+
createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
|
3047
3063
|
for (const [themeName, theme] of Object.entries(computedThemes.value)) {
|
3048
|
-
createCssClass(lines,
|
3049
|
-
}
|
3050
|
-
|
3051
|
-
|
3052
|
-
|
3053
|
-
|
3054
|
-
|
3055
|
-
|
3056
|
-
|
3057
|
-
|
3058
|
-
|
3059
|
-
|
3064
|
+
createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
|
3065
|
+
}
|
3066
|
+
if (parsedOptions.utilities) {
|
3067
|
+
const bgLines = [];
|
3068
|
+
const fgLines = [];
|
3069
|
+
const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
|
3070
|
+
for (const key of colors) {
|
3071
|
+
if (key.startsWith('on-')) {
|
3072
|
+
createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
3073
|
+
} else {
|
3074
|
+
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);
|
3075
|
+
createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
3076
|
+
createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
|
3077
|
+
}
|
3060
3078
|
}
|
3079
|
+
lines.push(...bgLines, ...fgLines);
|
3061
3080
|
}
|
3062
|
-
lines.push(...bgLines, ...fgLines);
|
3063
3081
|
return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
|
3064
3082
|
});
|
3083
|
+
const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
|
3084
|
+
const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
|
3085
|
+
if (SUPPORTS_MATCH_MEDIA) {
|
3086
|
+
const media = window.matchMedia('(prefers-color-scheme: dark)');
|
3087
|
+
function updateSystemName() {
|
3088
|
+
systemName.value = media.matches ? 'dark' : 'light';
|
3089
|
+
}
|
3090
|
+
updateSystemName();
|
3091
|
+
media.addEventListener('change', updateSystemName, {
|
3092
|
+
passive: true
|
3093
|
+
});
|
3094
|
+
if (vue.getCurrentScope()) {
|
3095
|
+
vue.onScopeDispose(() => {
|
3096
|
+
media.removeEventListener('change', updateSystemName);
|
3097
|
+
});
|
3098
|
+
}
|
3099
|
+
}
|
3065
3100
|
function install(app) {
|
3066
3101
|
if (parsedOptions.isDisabled) return;
|
3067
3102
|
const head = app._context.provides.usehead;
|
@@ -3099,22 +3134,55 @@
|
|
3099
3134
|
updateStyles();
|
3100
3135
|
}
|
3101
3136
|
function updateStyles() {
|
3102
|
-
upsertStyles(
|
3137
|
+
upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
|
3103
3138
|
}
|
3104
3139
|
}
|
3105
3140
|
}
|
3106
|
-
|
3141
|
+
function change(themeName) {
|
3142
|
+
if (!themeNames.value.includes(themeName)) {
|
3143
|
+
consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
|
3144
|
+
return;
|
3145
|
+
}
|
3146
|
+
name.value = themeName;
|
3147
|
+
}
|
3148
|
+
function cycle() {
|
3149
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
|
3150
|
+
const currentIndex = themeArray.indexOf(name.value);
|
3151
|
+
const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
|
3152
|
+
change(themeArray[nextIndex]);
|
3153
|
+
}
|
3154
|
+
function toggle() {
|
3155
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
|
3156
|
+
cycle(themeArray);
|
3157
|
+
}
|
3158
|
+
const globalName = new Proxy(name, {
|
3159
|
+
get(target, prop) {
|
3160
|
+
return target[prop];
|
3161
|
+
},
|
3162
|
+
set(target, prop, val) {
|
3163
|
+
if (prop === 'value') {
|
3164
|
+
deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
|
3165
|
+
}
|
3166
|
+
// @ts-expect-error
|
3167
|
+
target[prop] = val;
|
3168
|
+
return true;
|
3169
|
+
}
|
3170
|
+
});
|
3107
3171
|
return {
|
3108
3172
|
install,
|
3173
|
+
change,
|
3174
|
+
cycle,
|
3175
|
+
toggle,
|
3109
3176
|
isDisabled: parsedOptions.isDisabled,
|
3110
3177
|
name,
|
3111
3178
|
themes,
|
3112
3179
|
current,
|
3113
3180
|
computedThemes,
|
3181
|
+
prefix: parsedOptions.prefix,
|
3114
3182
|
themeClasses,
|
3115
3183
|
styles,
|
3116
3184
|
global: {
|
3117
|
-
name,
|
3185
|
+
name: globalName,
|
3118
3186
|
current
|
3119
3187
|
}
|
3120
3188
|
};
|
@@ -3125,7 +3193,7 @@
|
|
3125
3193
|
if (!theme) throw new Error('Could not find Vuetify theme injection');
|
3126
3194
|
const name = vue.toRef(() => props.theme ?? theme.name.value);
|
3127
3195
|
const current = vue.toRef(() => theme.themes.value[name.value]);
|
3128
|
-
const themeClasses = vue.toRef(() => theme.isDisabled ? undefined :
|
3196
|
+
const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
|
3129
3197
|
const newTheme = {
|
3130
3198
|
...theme,
|
3131
3199
|
name,
|
@@ -4229,7 +4297,10 @@
|
|
4229
4297
|
default: 'default',
|
4230
4298
|
validator: v => allowedDensities$1.includes(v)
|
4231
4299
|
},
|
4232
|
-
extended:
|
4300
|
+
extended: {
|
4301
|
+
type: Boolean,
|
4302
|
+
default: null
|
4303
|
+
},
|
4233
4304
|
extensionHeight: {
|
4234
4305
|
type: [Number, String],
|
4235
4306
|
default: 48
|
@@ -4277,7 +4348,7 @@
|
|
4277
4348
|
const {
|
4278
4349
|
rtlClasses
|
4279
4350
|
} = useRtl();
|
4280
|
-
const isExtended = vue.shallowRef(
|
4351
|
+
const isExtended = vue.shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
|
4281
4352
|
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));
|
4282
4353
|
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);
|
4283
4354
|
provideDefaults({
|
@@ -4289,7 +4360,7 @@
|
|
4289
4360
|
const hasTitle = !!(props.title || slots.title);
|
4290
4361
|
const hasImage = !!(slots.image || props.image);
|
4291
4362
|
const extension = slots.extension?.();
|
4292
|
-
isExtended.value =
|
4363
|
+
isExtended.value = props.extended === null ? !!extension : props.extended;
|
4293
4364
|
return vue.createVNode(props.tag, {
|
4294
4365
|
"class": vue.normalizeClass(['v-toolbar', {
|
4295
4366
|
'v-toolbar--absolute': props.absolute,
|
@@ -4672,9 +4743,15 @@
|
|
4672
4743
|
};
|
4673
4744
|
}
|
4674
4745
|
|
4746
|
+
// Types
|
4747
|
+
|
4675
4748
|
const makeVBtnGroupProps = propsFactory({
|
4676
4749
|
baseColor: String,
|
4677
4750
|
divided: Boolean,
|
4751
|
+
direction: {
|
4752
|
+
type: String,
|
4753
|
+
default: 'horizontal'
|
4754
|
+
},
|
4678
4755
|
...makeBorderProps(),
|
4679
4756
|
...makeComponentProps(),
|
4680
4757
|
...makeDensityProps(),
|
@@ -4708,7 +4785,7 @@
|
|
4708
4785
|
} = useRounded(props);
|
4709
4786
|
provideDefaults({
|
4710
4787
|
VBtn: {
|
4711
|
-
height: 'auto',
|
4788
|
+
height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
|
4712
4789
|
baseColor: vue.toRef(() => props.baseColor),
|
4713
4790
|
color: vue.toRef(() => props.color),
|
4714
4791
|
density: vue.toRef(() => props.density),
|
@@ -4718,7 +4795,7 @@
|
|
4718
4795
|
});
|
4719
4796
|
useRender(() => {
|
4720
4797
|
return vue.createVNode(props.tag, {
|
4721
|
-
"class": vue.normalizeClass(['v-btn-group', {
|
4798
|
+
"class": vue.normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
|
4722
4799
|
'v-btn-group--divided': props.divided
|
4723
4800
|
}, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
|
4724
4801
|
"style": vue.normalizeStyle(props.style)
|
@@ -5841,8 +5918,8 @@
|
|
5841
5918
|
window.clearTimeout(element._ripple.showTimer);
|
5842
5919
|
}
|
5843
5920
|
let keyboardRipple = false;
|
5844
|
-
function keyboardRippleShow(e) {
|
5845
|
-
if (!keyboardRipple && (e.keyCode
|
5921
|
+
function keyboardRippleShow(e, keys) {
|
5922
|
+
if (!keyboardRipple && keys.includes(e.keyCode)) {
|
5846
5923
|
keyboardRipple = true;
|
5847
5924
|
rippleShow(e);
|
5848
5925
|
}
|
@@ -5870,9 +5947,12 @@
|
|
5870
5947
|
el._ripple.enabled = enabled;
|
5871
5948
|
el._ripple.centered = modifiers.center;
|
5872
5949
|
el._ripple.circle = modifiers.circle;
|
5873
|
-
|
5874
|
-
|
5950
|
+
const bindingValue = isObject(value) ? value : {};
|
5951
|
+
if (bindingValue.class) {
|
5952
|
+
el._ripple.class = bindingValue.class;
|
5875
5953
|
}
|
5954
|
+
const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
|
5955
|
+
el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
|
5876
5956
|
if (enabled && !wasEnabled) {
|
5877
5957
|
if (modifiers.stop) {
|
5878
5958
|
el.addEventListener('touchstart', rippleStop, {
|
@@ -5894,7 +5974,7 @@
|
|
5894
5974
|
el.addEventListener('mousedown', rippleShow);
|
5895
5975
|
el.addEventListener('mouseup', rippleHide);
|
5896
5976
|
el.addEventListener('mouseleave', rippleHide);
|
5897
|
-
el.addEventListener('keydown', keyboardRippleShow);
|
5977
|
+
el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
|
5898
5978
|
el.addEventListener('keyup', keyboardRippleHide);
|
5899
5979
|
el.addEventListener('blur', focusRippleHide);
|
5900
5980
|
|
@@ -5914,7 +5994,9 @@
|
|
5914
5994
|
el.removeEventListener('touchcancel', rippleHide);
|
5915
5995
|
el.removeEventListener('mouseup', rippleHide);
|
5916
5996
|
el.removeEventListener('mouseleave', rippleHide);
|
5917
|
-
el.
|
5997
|
+
if (el._ripple?.keyDownHandler) {
|
5998
|
+
el.removeEventListener('keydown', el._ripple.keyDownHandler);
|
5999
|
+
}
|
5918
6000
|
el.removeEventListener('keyup', keyboardRippleHide);
|
5919
6001
|
el.removeEventListener('dragstart', rippleHide);
|
5920
6002
|
el.removeEventListener('blur', focusRippleHide);
|
@@ -5923,8 +6005,8 @@
|
|
5923
6005
|
updateRipple(el, binding, false);
|
5924
6006
|
}
|
5925
6007
|
function unmounted$4(el) {
|
5926
|
-
delete el._ripple;
|
5927
6008
|
removeListeners(el);
|
6009
|
+
delete el._ripple;
|
5928
6010
|
}
|
5929
6011
|
function updated$1(el, binding) {
|
5930
6012
|
if (binding.value === binding.oldValue) {
|
@@ -6197,6 +6279,31 @@
|
|
6197
6279
|
// Utilities
|
6198
6280
|
const VAlertTitle = createSimpleFunctional('v-alert-title');
|
6199
6281
|
|
6282
|
+
// Utilities
|
6283
|
+
|
6284
|
+
// Types
|
6285
|
+
|
6286
|
+
// Types
|
6287
|
+
|
6288
|
+
// Composables
|
6289
|
+
const makeIconSizeProps = propsFactory({
|
6290
|
+
iconSize: [Number, String],
|
6291
|
+
iconSizes: {
|
6292
|
+
type: Array,
|
6293
|
+
default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
|
6294
|
+
}
|
6295
|
+
}, 'iconSize');
|
6296
|
+
function useIconSizes(props, fallback) {
|
6297
|
+
const iconSize = vue.computed(() => {
|
6298
|
+
const iconSizeMap = new Map(props.iconSizes);
|
6299
|
+
const _iconSize = props.iconSize ?? fallback() ?? 'default';
|
6300
|
+
return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
|
6301
|
+
});
|
6302
|
+
return {
|
6303
|
+
iconSize
|
6304
|
+
};
|
6305
|
+
}
|
6306
|
+
|
6200
6307
|
// Types
|
6201
6308
|
|
6202
6309
|
const allowedTypes = ['success', 'info', 'warning', 'error'];
|
@@ -6236,6 +6343,7 @@
|
|
6236
6343
|
...makeDensityProps(),
|
6237
6344
|
...makeDimensionProps(),
|
6238
6345
|
...makeElevationProps(),
|
6346
|
+
...makeIconSizeProps(),
|
6239
6347
|
...makeLocationProps(),
|
6240
6348
|
...makePositionProps(),
|
6241
6349
|
...makeRoundedProps(),
|
@@ -6263,6 +6371,9 @@
|
|
6263
6371
|
if (!props.type) return props.icon;
|
6264
6372
|
return props.icon ?? `$${props.type}`;
|
6265
6373
|
});
|
6374
|
+
const {
|
6375
|
+
iconSize
|
6376
|
+
} = useIconSizes(props, () => props.prominent ? 44 : 28);
|
6266
6377
|
const {
|
6267
6378
|
themeClasses
|
6268
6379
|
} = provideTheme(props);
|
@@ -6310,6 +6421,11 @@
|
|
6310
6421
|
const hasPrepend = !!(slots.prepend || icon.value);
|
6311
6422
|
const hasTitle = !!(slots.title || props.title);
|
6312
6423
|
const hasClose = !!(slots.close || props.closable);
|
6424
|
+
const iconProps = {
|
6425
|
+
density: props.density,
|
6426
|
+
icon: icon.value,
|
6427
|
+
size: iconSize.value
|
6428
|
+
};
|
6313
6429
|
return isActive.value && vue.createVNode(props.tag, {
|
6314
6430
|
"class": vue.normalizeClass(['v-alert', props.border && {
|
6315
6431
|
'v-alert--border': !!props.border,
|
@@ -6327,19 +6443,14 @@
|
|
6327
6443
|
}, null), hasPrepend && vue.createElementVNode("div", {
|
6328
6444
|
"key": "prepend",
|
6329
6445
|
"class": "v-alert__prepend"
|
6330
|
-
}, [!slots.prepend ? vue.createVNode(VIcon, {
|
6331
|
-
"key": "prepend-icon"
|
6332
|
-
|
6333
|
-
"icon": icon.value,
|
6334
|
-
"size": props.prominent ? 44 : 28
|
6335
|
-
}, null) : vue.createVNode(VDefaultsProvider, {
|
6446
|
+
}, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
|
6447
|
+
"key": "prepend-icon"
|
6448
|
+
}, iconProps), null) : vue.createVNode(VDefaultsProvider, {
|
6336
6449
|
"key": "prepend-defaults",
|
6337
6450
|
"disabled": !icon.value,
|
6338
6451
|
"defaults": {
|
6339
6452
|
VIcon: {
|
6340
|
-
|
6341
|
-
icon: icon.value,
|
6342
|
-
size: props.prominent ? 44 : 28
|
6453
|
+
...iconProps
|
6343
6454
|
}
|
6344
6455
|
}
|
6345
6456
|
}, slots.prepend)]), vue.createElementVNode("div", {
|
@@ -7864,6 +7975,7 @@
|
|
7864
7975
|
const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
|
7865
7976
|
const makeVSlideGroupProps = propsFactory({
|
7866
7977
|
centerActive: Boolean,
|
7978
|
+
contentClass: null,
|
7867
7979
|
direction: {
|
7868
7980
|
type: String,
|
7869
7981
|
default: 'horizontal'
|
@@ -8176,7 +8288,7 @@
|
|
8176
8288
|
})]), vue.createElementVNode("div", {
|
8177
8289
|
"key": "container",
|
8178
8290
|
"ref": containerRef,
|
8179
|
-
"class":
|
8291
|
+
"class": vue.normalizeClass(['v-slide-group__container', props.contentClass]),
|
8180
8292
|
"onScroll": onScroll
|
8181
8293
|
}, [vue.createElementVNode("div", {
|
8182
8294
|
"ref": contentRef,
|
@@ -8539,16 +8651,85 @@
|
|
8539
8651
|
}
|
8540
8652
|
});
|
8541
8653
|
|
8654
|
+
const makeVDividerProps = propsFactory({
|
8655
|
+
color: String,
|
8656
|
+
inset: Boolean,
|
8657
|
+
length: [Number, String],
|
8658
|
+
opacity: [Number, String],
|
8659
|
+
thickness: [Number, String],
|
8660
|
+
vertical: Boolean,
|
8661
|
+
...makeComponentProps(),
|
8662
|
+
...makeThemeProps()
|
8663
|
+
}, 'VDivider');
|
8664
|
+
const VDivider = genericComponent()({
|
8665
|
+
name: 'VDivider',
|
8666
|
+
props: makeVDividerProps(),
|
8667
|
+
setup(props, _ref) {
|
8668
|
+
let {
|
8669
|
+
attrs,
|
8670
|
+
slots
|
8671
|
+
} = _ref;
|
8672
|
+
const {
|
8673
|
+
themeClasses
|
8674
|
+
} = provideTheme(props);
|
8675
|
+
const {
|
8676
|
+
textColorClasses,
|
8677
|
+
textColorStyles
|
8678
|
+
} = useTextColor(() => props.color);
|
8679
|
+
const dividerStyles = vue.computed(() => {
|
8680
|
+
const styles = {};
|
8681
|
+
if (props.length) {
|
8682
|
+
styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
|
8683
|
+
}
|
8684
|
+
if (props.thickness) {
|
8685
|
+
styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
|
8686
|
+
}
|
8687
|
+
return styles;
|
8688
|
+
});
|
8689
|
+
useRender(() => {
|
8690
|
+
const divider = vue.createElementVNode("hr", {
|
8691
|
+
"class": vue.normalizeClass([{
|
8692
|
+
'v-divider': true,
|
8693
|
+
'v-divider--inset': props.inset,
|
8694
|
+
'v-divider--vertical': props.vertical
|
8695
|
+
}, themeClasses.value, textColorClasses.value, props.class]),
|
8696
|
+
"style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
|
8697
|
+
'--v-border-opacity': props.opacity
|
8698
|
+
}, props.style]),
|
8699
|
+
"aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
|
8700
|
+
"role": `${attrs.role || 'separator'}`
|
8701
|
+
}, null);
|
8702
|
+
if (!slots.default) return divider;
|
8703
|
+
return vue.createElementVNode("div", {
|
8704
|
+
"class": vue.normalizeClass(['v-divider__wrapper', {
|
8705
|
+
'v-divider__wrapper--vertical': props.vertical,
|
8706
|
+
'v-divider__wrapper--inset': props.inset
|
8707
|
+
}])
|
8708
|
+
}, [divider, vue.createElementVNode("div", {
|
8709
|
+
"class": "v-divider__content"
|
8710
|
+
}, [slots.default()]), divider]);
|
8711
|
+
});
|
8712
|
+
return {};
|
8713
|
+
}
|
8714
|
+
});
|
8715
|
+
|
8542
8716
|
// Utilities
|
8543
8717
|
|
8544
8718
|
// List
|
8545
8719
|
const ListKey = Symbol.for('vuetify:list');
|
8546
8720
|
function createList() {
|
8721
|
+
let {
|
8722
|
+
filterable
|
8723
|
+
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
8724
|
+
filterable: false
|
8725
|
+
};
|
8547
8726
|
const parent = vue.inject(ListKey, {
|
8727
|
+
filterable: false,
|
8548
8728
|
hasPrepend: vue.shallowRef(false),
|
8549
8729
|
updateHasPrepend: () => null
|
8550
8730
|
});
|
8551
8731
|
const data = {
|
8732
|
+
filterable: parent.filterable || filterable,
|
8552
8733
|
hasPrepend: vue.shallowRef(false),
|
8553
8734
|
updateHasPrepend: value => {
|
8554
8735
|
if (value) data.hasPrepend.value = value;
|
@@ -9500,6 +9681,9 @@
|
|
9500
9681
|
roundedClasses
|
9501
9682
|
} = useRounded(roundedProps);
|
9502
9683
|
const lineClasses = vue.toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
|
9684
|
+
const rippleOptions = vue.toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
|
9685
|
+
keys: [keyCodes.enter]
|
9686
|
+
} : props.ripple);
|
9503
9687
|
const slotProps = vue.computed(() => ({
|
9504
9688
|
isActive: isActive.value,
|
9505
9689
|
select,
|
@@ -9524,8 +9708,9 @@
|
|
9524
9708
|
function onKeyDown(e) {
|
9525
9709
|
const target = e.target;
|
9526
9710
|
if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
|
9527
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
9711
|
+
if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
|
9528
9712
|
e.preventDefault();
|
9713
|
+
e.stopPropagation();
|
9529
9714
|
e.target.dispatchEvent(new MouseEvent('click', e));
|
9530
9715
|
}
|
9531
9716
|
}
|
@@ -9635,7 +9820,7 @@
|
|
9635
9820
|
}), vue.createElementVNode("div", {
|
9636
9821
|
"class": "v-list-item__spacer"
|
9637
9822
|
}, null)])]
|
9638
|
-
}), [[Ripple, isClickable.value &&
|
9823
|
+
}), [[Ripple, isClickable.value && rippleOptions.value]]);
|
9639
9824
|
});
|
9640
9825
|
return {
|
9641
9826
|
activate,
|
@@ -9690,68 +9875,6 @@
|
|
9690
9875
|
}
|
9691
9876
|
});
|
9692
9877
|
|
9693
|
-
const makeVDividerProps = propsFactory({
|
9694
|
-
color: String,
|
9695
|
-
inset: Boolean,
|
9696
|
-
length: [Number, String],
|
9697
|
-
opacity: [Number, String],
|
9698
|
-
thickness: [Number, String],
|
9699
|
-
vertical: Boolean,
|
9700
|
-
...makeComponentProps(),
|
9701
|
-
...makeThemeProps()
|
9702
|
-
}, 'VDivider');
|
9703
|
-
const VDivider = genericComponent()({
|
9704
|
-
name: 'VDivider',
|
9705
|
-
props: makeVDividerProps(),
|
9706
|
-
setup(props, _ref) {
|
9707
|
-
let {
|
9708
|
-
attrs,
|
9709
|
-
slots
|
9710
|
-
} = _ref;
|
9711
|
-
const {
|
9712
|
-
themeClasses
|
9713
|
-
} = provideTheme(props);
|
9714
|
-
const {
|
9715
|
-
textColorClasses,
|
9716
|
-
textColorStyles
|
9717
|
-
} = useTextColor(() => props.color);
|
9718
|
-
const dividerStyles = vue.computed(() => {
|
9719
|
-
const styles = {};
|
9720
|
-
if (props.length) {
|
9721
|
-
styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
|
9722
|
-
}
|
9723
|
-
if (props.thickness) {
|
9724
|
-
styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
|
9725
|
-
}
|
9726
|
-
return styles;
|
9727
|
-
});
|
9728
|
-
useRender(() => {
|
9729
|
-
const divider = vue.createElementVNode("hr", {
|
9730
|
-
"class": vue.normalizeClass([{
|
9731
|
-
'v-divider': true,
|
9732
|
-
'v-divider--inset': props.inset,
|
9733
|
-
'v-divider--vertical': props.vertical
|
9734
|
-
}, themeClasses.value, textColorClasses.value, props.class]),
|
9735
|
-
"style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
|
9736
|
-
'--v-border-opacity': props.opacity
|
9737
|
-
}, props.style]),
|
9738
|
-
"aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
|
9739
|
-
"role": `${attrs.role || 'separator'}`
|
9740
|
-
}, null);
|
9741
|
-
if (!slots.default) return divider;
|
9742
|
-
return vue.createElementVNode("div", {
|
9743
|
-
"class": vue.normalizeClass(['v-divider__wrapper', {
|
9744
|
-
'v-divider__wrapper--vertical': props.vertical,
|
9745
|
-
'v-divider__wrapper--inset': props.inset
|
9746
|
-
}])
|
9747
|
-
}, [divider, vue.createElementVNode("div", {
|
9748
|
-
"class": "v-divider__content"
|
9749
|
-
}, [slots.default()]), divider]);
|
9750
|
-
});
|
9751
|
-
return {};
|
9752
|
-
}
|
9753
|
-
});
|
9754
|
-
|
9755
9878
|
// Types
|
9756
9879
|
|
9757
9880
|
const makeVListChildrenProps = propsFactory({
|
@@ -9868,7 +9991,7 @@
|
|
9868
9991
|
const _props = {
|
9869
9992
|
title,
|
9870
9993
|
value,
|
9871
|
-
...
|
9994
|
+
...itemProps
|
9872
9995
|
};
|
9873
9996
|
return {
|
9874
9997
|
title: String(_props.title ?? ''),
|
@@ -10020,6 +10143,7 @@
|
|
10020
10143
|
activeClass: String,
|
10021
10144
|
bgColor: String,
|
10022
10145
|
disabled: Boolean,
|
10146
|
+
filterable: Boolean,
|
10023
10147
|
expandIcon: IconValue,
|
10024
10148
|
collapseIcon: IconValue,
|
10025
10149
|
lines: {
|
@@ -10103,7 +10227,9 @@
|
|
10103
10227
|
const activeColor = vue.toRef(() => props.activeColor);
|
10104
10228
|
const baseColor = vue.toRef(() => props.baseColor);
|
10105
10229
|
const color = vue.toRef(() => props.color);
|
10106
|
-
createList(
|
10230
|
+
createList({
|
10231
|
+
filterable: props.filterable
|
10232
|
+
});
|
10107
10233
|
provideDefaults({
|
10108
10234
|
VListGroup: {
|
10109
10235
|
activeColor,
|
@@ -12680,7 +12806,12 @@
|
|
12680
12806
|
}
|
12681
12807
|
function calculateOffset(index) {
|
12682
12808
|
index = clamp(index, 0, items.value.length - 1);
|
12683
|
-
|
12809
|
+
const whole = Math.floor(index);
|
12810
|
+
const fraction = index % 1;
|
12811
|
+
const next = whole + 1;
|
12812
|
+
const wholeOffset = offsets[whole] || 0;
|
12813
|
+
const nextOffset = offsets[next] || wholeOffset;
|
12814
|
+
return wholeOffset + (nextOffset - wholeOffset) * fraction;
|
12684
12815
|
}
|
12685
12816
|
function calculateIndex(scrollTop) {
|
12686
12817
|
return binaryClosest(offsets, scrollTop);
|
@@ -13034,6 +13165,7 @@
|
|
13034
13165
|
},
|
13035
13166
|
openOnClear: Boolean,
|
13036
13167
|
itemColor: String,
|
13168
|
+
noAutoScroll: Boolean,
|
13037
13169
|
...makeItemsProps({
|
13038
13170
|
itemChildren: false
|
13039
13171
|
})
|
@@ -13248,7 +13380,7 @@
|
|
13248
13380
|
vue.watch(menu, () => {
|
13249
13381
|
if (!props.hideSelected && menu.value && model.value.length) {
|
13250
13382
|
const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
|
13251
|
-
IN_BROWSER && window.requestAnimationFrame(() => {
|
13383
|
+
IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
|
13252
13384
|
index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
|
13253
13385
|
});
|
13254
13386
|
}
|
@@ -13335,11 +13467,28 @@
|
|
13335
13467
|
index,
|
13336
13468
|
itemRef
|
13337
13469
|
} = _ref2;
|
13470
|
+
const camelizedProps = camelizeProps(item.props);
|
13338
13471
|
const itemProps = vue.mergeProps(item.props, {
|
13339
13472
|
ref: itemRef,
|
13340
13473
|
key: item.value,
|
13341
13474
|
onClick: () => select(item, null)
|
13342
13475
|
});
|
13476
|
+
if (item.raw.type === 'divider') {
|
13477
|
+
return slots.divider?.({
|
13478
|
+
props: item.raw,
|
13479
|
+
index
|
13480
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
13481
|
+
"key": `divider-${index}`
|
13482
|
+
}), null);
|
13483
|
+
}
|
13484
|
+
if (item.raw.type === 'subheader') {
|
13485
|
+
return slots.subheader?.({
|
13486
|
+
props: item.raw,
|
13487
|
+
index
|
13488
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
13489
|
+
"key": `subheader-${index}`
|
13490
|
+
}), null);
|
13491
|
+
}
|
13343
13492
|
return slots.item?.({
|
13344
13493
|
item,
|
13345
13494
|
index,
|
@@ -13356,10 +13505,10 @@
|
|
13356
13505
|
"modelValue": isSelected,
|
13357
13506
|
"ripple": false,
|
13358
13507
|
"tabindex": "-1"
|
13359
|
-
}, null) : undefined,
|
13360
|
-
"image":
|
13361
|
-
}, null),
|
13362
|
-
"icon":
|
13508
|
+
}, null) : undefined, camelizedProps.prependAvatar && vue.createVNode(VAvatar, {
|
13509
|
+
"image": camelizedProps.prependAvatar
|
13510
|
+
}, null), camelizedProps.prependIcon && vue.createVNode(VIcon, {
|
13511
|
+
"icon": camelizedProps.prependIcon
|
13363
13512
|
}, null)]);
|
13364
13513
|
}
|
13365
13514
|
});
|
@@ -13500,6 +13649,9 @@
|
|
13500
13649
|
let match = -1;
|
13501
13650
|
if ((query || customFiltersLength > 0) && !options?.noFilter) {
|
13502
13651
|
if (typeof item === 'object') {
|
13652
|
+
if (['divider', 'subheader'].includes(item.raw?.type)) {
|
13653
|
+
continue;
|
13654
|
+
}
|
13503
13655
|
const filterKeys = keys || Object.keys(transformed);
|
13504
13656
|
for (const key of filterKeys) {
|
13505
13657
|
const value = getPropertyFromItem(transformed, key);
|
@@ -13702,7 +13854,7 @@
|
|
13702
13854
|
menu.value = !menu.value;
|
13703
13855
|
}
|
13704
13856
|
function onListKeydown(e) {
|
13705
|
-
if (e.key
|
13857
|
+
if (checkPrintable(e) || e.key === 'Backspace') {
|
13706
13858
|
vTextFieldRef.value?.focus();
|
13707
13859
|
}
|
13708
13860
|
}
|
@@ -13907,6 +14059,7 @@
|
|
13907
14059
|
}, props.menuProps), {
|
13908
14060
|
default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
|
13909
14061
|
"ref": listRef,
|
14062
|
+
"filterable": true,
|
13910
14063
|
"selected": selectedValues.value,
|
13911
14064
|
"selectStrategy": props.multiple ? 'independent' : 'single-independent',
|
13912
14065
|
"onMousedown": e => e.preventDefault(),
|
@@ -13938,6 +14091,22 @@
|
|
13938
14091
|
active: highlightFirst.value && index === 0 ? true : undefined,
|
13939
14092
|
onClick: () => select(item, null)
|
13940
14093
|
});
|
14094
|
+
if (item.raw.type === 'divider') {
|
14095
|
+
return slots.divider?.({
|
14096
|
+
props: item.raw,
|
14097
|
+
index
|
14098
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
14099
|
+
"key": `divider-${index}`
|
14100
|
+
}), null);
|
14101
|
+
}
|
14102
|
+
if (item.raw.type === 'subheader') {
|
14103
|
+
return slots.subheader?.({
|
14104
|
+
props: item.raw,
|
14105
|
+
index
|
14106
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
14107
|
+
"key": `subheader-${index}`
|
14108
|
+
}), null);
|
14109
|
+
}
|
13941
14110
|
return slots.item?.({
|
13942
14111
|
item,
|
13943
14112
|
index,
|
@@ -14082,7 +14251,8 @@
|
|
14082
14251
|
...makeThemeProps(),
|
14083
14252
|
...makeTransitionProps({
|
14084
14253
|
transition: 'scale-rotate-transition'
|
14085
|
-
})
|
14254
|
+
}),
|
14255
|
+
...makeDimensionProps()
|
14086
14256
|
}, 'VBadge');
|
14087
14257
|
const VBadge = genericComponent()({
|
14088
14258
|
name: 'VBadge',
|
@@ -14112,6 +14282,9 @@
|
|
14112
14282
|
const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
|
14113
14283
|
return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
|
14114
14284
|
});
|
14285
|
+
const {
|
14286
|
+
dimensionStyles
|
14287
|
+
} = useDimension(props);
|
14115
14288
|
useRender(() => {
|
14116
14289
|
const value = Number(props.content);
|
14117
14290
|
const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
|
@@ -14133,7 +14306,7 @@
|
|
14133
14306
|
}, {
|
14134
14307
|
default: () => [vue.withDirectives(vue.createElementVNode("span", vue.mergeProps({
|
14135
14308
|
"class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
|
14136
|
-
"style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
|
14309
|
+
"style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
|
14137
14310
|
"aria-atomic": "true",
|
14138
14311
|
"aria-label": t(props.label, value),
|
14139
14312
|
"aria-live": "polite",
|
@@ -17542,13 +17715,13 @@
|
|
17542
17715
|
return null;
|
17543
17716
|
}
|
17544
17717
|
const sundayJanuarySecond2000 = new Date(2000, 0, 2);
|
17545
|
-
function getWeekdays(locale, firstDayOfWeek) {
|
17718
|
+
function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
|
17546
17719
|
const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
|
17547
17720
|
return createRange(7).map(i => {
|
17548
17721
|
const weekday = new Date(sundayJanuarySecond2000);
|
17549
17722
|
weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
|
17550
17723
|
return new Intl.DateTimeFormat(locale, {
|
17551
|
-
weekday: 'narrow'
|
17724
|
+
weekday: weekdayFormat ?? 'narrow'
|
17552
17725
|
}).format(weekday);
|
17553
17726
|
});
|
17554
17727
|
}
|
@@ -17807,7 +17980,7 @@
|
|
17807
17980
|
const yearStart = new Date(year, 0, 1);
|
17808
17981
|
const size = firstWeekSize(year);
|
17809
17982
|
const d1w1 = size >= minWeekSize ? addDays(yearStart, size - 7) : addDays(yearStart, size);
|
17810
|
-
return 1 + getDiff(date, d1w1, 'weeks');
|
17983
|
+
return 1 + getDiff(endOfDay(date), startOfDay(d1w1), 'weeks');
|
17811
17984
|
}
|
17812
17985
|
function getDate(date) {
|
17813
17986
|
return date.getDate();
|
@@ -18012,9 +18185,9 @@
|
|
18012
18185
|
getDiff(date, comparing, unit) {
|
18013
18186
|
return getDiff(date, comparing, unit);
|
18014
18187
|
}
|
18015
|
-
getWeekdays(firstDayOfWeek) {
|
18188
|
+
getWeekdays(firstDayOfWeek, weekdayFormat) {
|
18016
18189
|
const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
|
18017
|
-
return getWeekdays(this.locale, firstDay);
|
18190
|
+
return getWeekdays(this.locale, firstDay, weekdayFormat);
|
18018
18191
|
}
|
18019
18192
|
getYear(date) {
|
18020
18193
|
return getYear(date);
|
@@ -18111,7 +18284,7 @@
|
|
18111
18284
|
};
|
18112
18285
|
}
|
18113
18286
|
function createDateRange(adapter, start, stop) {
|
18114
|
-
const diff = adapter.getDiff(stop ?? start, start, 'days');
|
18287
|
+
const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
|
18115
18288
|
const datesInRange = [start];
|
18116
18289
|
for (let i = 1; i < diff; i++) {
|
18117
18290
|
const nextDate = adapter.addDays(start, i);
|
@@ -18369,6 +18542,7 @@
|
|
18369
18542
|
_search.value = val ?? '';
|
18370
18543
|
if (!props.multiple && !hasSelectionSlot.value) {
|
18371
18544
|
model.value = [transformItem$3(props, val)];
|
18545
|
+
vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
|
18372
18546
|
}
|
18373
18547
|
if (val && props.multiple && props.delimiters?.length) {
|
18374
18548
|
const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
|
@@ -18449,7 +18623,7 @@
|
|
18449
18623
|
menu.value = !menu.value;
|
18450
18624
|
}
|
18451
18625
|
function onListKeydown(e) {
|
18452
|
-
if (e.key
|
18626
|
+
if (checkPrintable(e) || e.key === 'Backspace') {
|
18453
18627
|
vTextFieldRef.value?.focus();
|
18454
18628
|
}
|
18455
18629
|
}
|
@@ -18654,6 +18828,7 @@
|
|
18654
18828
|
}, props.menuProps), {
|
18655
18829
|
default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
|
18656
18830
|
"ref": listRef,
|
18831
|
+
"filterable": true,
|
18657
18832
|
"selected": selectedValues.value,
|
18658
18833
|
"selectStrategy": props.multiple ? 'independent' : 'single-independent',
|
18659
18834
|
"onMousedown": e => e.preventDefault(),
|
@@ -18685,6 +18860,22 @@
|
|
18685
18860
|
active: highlightFirst.value && index === 0 ? true : undefined,
|
18686
18861
|
onClick: () => select(item, null)
|
18687
18862
|
});
|
18863
|
+
if (item.raw.type === 'divider') {
|
18864
|
+
return slots.divider?.({
|
18865
|
+
props: item.raw,
|
18866
|
+
index
|
18867
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
18868
|
+
"key": `divider-${index}`
|
18869
|
+
}), null);
|
18870
|
+
}
|
18871
|
+
if (item.raw.type === 'subheader') {
|
18872
|
+
return slots.subheader?.({
|
18873
|
+
props: item.raw,
|
18874
|
+
index
|
18875
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
18876
|
+
"key": `subheader-${index}`
|
18877
|
+
}), null);
|
18878
|
+
}
|
18688
18879
|
return slots.item?.({
|
18689
18880
|
item,
|
18690
18881
|
index,
|
@@ -20567,6 +20758,7 @@
|
|
20567
20758
|
color: String,
|
20568
20759
|
disableSort: Boolean,
|
20569
20760
|
fixedHeader: Boolean,
|
20761
|
+
lastFixed: Boolean,
|
20570
20762
|
multiSort: Boolean,
|
20571
20763
|
sortAscIcon: {
|
20572
20764
|
type: IconValue,
|
@@ -20613,10 +20805,11 @@
|
|
20613
20805
|
loaderClasses
|
20614
20806
|
} = useLoader(props);
|
20615
20807
|
function getFixedStyles(column, y) {
|
20616
|
-
if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
|
20808
|
+
if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
|
20617
20809
|
return {
|
20618
20810
|
position: 'sticky',
|
20619
|
-
left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
|
20811
|
+
left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
|
20812
|
+
right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
|
20620
20813
|
top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
|
20621
20814
|
};
|
20622
20815
|
}
|
@@ -21132,11 +21325,18 @@
|
|
21132
21325
|
}
|
21133
21326
|
});
|
21134
21327
|
|
21328
|
+
// Types
|
21329
|
+
|
21135
21330
|
const makeVTableProps = propsFactory({
|
21136
21331
|
fixedHeader: Boolean,
|
21137
21332
|
fixedFooter: Boolean,
|
21138
21333
|
height: [Number, String],
|
21139
21334
|
hover: Boolean,
|
21335
|
+
striped: {
|
21336
|
+
type: String,
|
21337
|
+
default: null,
|
21338
|
+
validator: v => ['even', 'odd'].includes(v)
|
21339
|
+
},
|
21140
21340
|
...makeComponentProps(),
|
21141
21341
|
...makeDensityProps(),
|
21142
21342
|
...makeTagProps(),
|
@@ -21163,7 +21363,9 @@
|
|
21163
21363
|
'v-table--fixed-footer': props.fixedFooter,
|
21164
21364
|
'v-table--has-top': !!slots.top,
|
21165
21365
|
'v-table--has-bottom': !!slots.bottom,
|
21166
|
-
'v-table--hover': props.hover
|
21366
|
+
'v-table--hover': props.hover,
|
21367
|
+
'v-table--striped-even': props.striped === 'even',
|
21368
|
+
'v-table--striped-odd': props.striped === 'odd'
|
21167
21369
|
}, themeClasses.value, densityClasses.value, props.class]),
|
21168
21370
|
"style": vue.normalizeStyle(props.style)
|
21169
21371
|
}, {
|
@@ -22338,7 +22540,8 @@
|
|
22338
22540
|
firstDayOfWeek: {
|
22339
22541
|
type: [Number, String],
|
22340
22542
|
default: undefined
|
22341
|
-
}
|
22543
|
+
},
|
22544
|
+
weekdayFormat: String
|
22342
22545
|
}, 'calendar');
|
22343
22546
|
function useCalendar(props) {
|
22344
22547
|
const adapter = useDate();
|
@@ -22579,7 +22782,7 @@
|
|
22579
22782
|
"ref": daysRef,
|
22580
22783
|
"key": daysInMonth.value[0].date?.toString(),
|
22581
22784
|
"class": "v-date-picker-month__days"
|
22582
|
-
}, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
|
22785
|
+
}, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createElementVNode("div", {
|
22583
22786
|
"class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
|
22584
22787
|
}, [weekDay])), daysInMonth.value.map((item, i) => {
|
22585
22788
|
const slotProps = {
|
@@ -24194,6 +24397,9 @@
|
|
24194
24397
|
startStatus.value = status;
|
24195
24398
|
} else if (side === 'end') {
|
24196
24399
|
endStatus.value = status;
|
24400
|
+
} else if (side === 'both') {
|
24401
|
+
startStatus.value = status;
|
24402
|
+
endStatus.value = status;
|
24197
24403
|
}
|
24198
24404
|
}
|
24199
24405
|
function getStatus(side) {
|
@@ -24305,6 +24511,32 @@
|
|
24305
24511
|
}, [renderSide('end', endStatus.value)])]
|
24306
24512
|
});
|
24307
24513
|
});
|
24514
|
+
function reset(side) {
|
24515
|
+
const effectiveSide = side ?? props.side;
|
24516
|
+
setStatus(effectiveSide, 'ok');
|
24517
|
+
vue.nextTick(() => {
|
24518
|
+
setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
|
24519
|
+
if (props.mode !== 'manual') {
|
24520
|
+
vue.nextTick(() => {
|
24521
|
+
window.requestAnimationFrame(() => {
|
24522
|
+
window.requestAnimationFrame(() => {
|
24523
|
+
window.requestAnimationFrame(() => {
|
24524
|
+
if (effectiveSide === 'both') {
|
24525
|
+
intersecting('start');
|
24526
|
+
intersecting('end');
|
24527
|
+
} else {
|
24528
|
+
intersecting(effectiveSide);
|
24529
|
+
}
|
24530
|
+
});
|
24531
|
+
});
|
24532
|
+
});
|
24533
|
+
});
|
24534
|
+
}
|
24535
|
+
});
|
24536
|
+
}
|
24537
|
+
return {
|
24538
|
+
reset
|
24539
|
+
};
|
24308
24540
|
}
|
24309
24541
|
});
|
24310
24542
|
|
@@ -25223,6 +25455,10 @@
|
|
25223
25455
|
type: Number,
|
25224
25456
|
default: 0
|
25225
25457
|
},
|
25458
|
+
minFractionDigits: {
|
25459
|
+
type: Number,
|
25460
|
+
default: null
|
25461
|
+
},
|
25226
25462
|
...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
|
25227
25463
|
}, 'VNumberInput');
|
25228
25464
|
const VNumberInput = genericComponent()({
|
@@ -25250,9 +25486,19 @@
|
|
25250
25486
|
const isFocused = vue.shallowRef(props.focused);
|
25251
25487
|
function correctPrecision(val) {
|
25252
25488
|
let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
|
25253
|
-
|
25254
|
-
|
25255
|
-
|
25489
|
+
if (precision == null) {
|
25490
|
+
return String(val);
|
25491
|
+
}
|
25492
|
+
let fixed = val.toFixed(precision);
|
25493
|
+
if (isFocused.value) {
|
25494
|
+
return Number(fixed).toString(); // trim zeros
|
25495
|
+
}
|
25496
|
+
if ((props.minFractionDigits ?? precision) < precision) {
|
25497
|
+
const trimLimit = precision - props.minFractionDigits;
|
25498
|
+
const [baseDigits, fractionDigits] = fixed.split('.');
|
25499
|
+
fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
|
25500
|
+
}
|
25501
|
+
return fixed;
|
25256
25502
|
}
|
25257
25503
|
const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
|
25258
25504
|
const _inputText = vue.shallowRef(null);
|
@@ -25307,6 +25553,7 @@
|
|
25307
25553
|
}
|
25308
25554
|
};
|
25309
25555
|
vue.watch(() => props.precision, () => formatInputValue());
|
25556
|
+
vue.watch(() => props.minFractionDigits, () => formatInputValue());
|
25310
25557
|
vue.onMounted(() => {
|
25311
25558
|
clampModel();
|
25312
25559
|
});
|
@@ -25421,7 +25668,7 @@
|
|
25421
25668
|
inputText.value = null;
|
25422
25669
|
return;
|
25423
25670
|
}
|
25424
|
-
inputText.value =
|
25671
|
+
inputText.value = correctPrecision(model.value);
|
25425
25672
|
}
|
25426
25673
|
function trimDecimalZeros() {
|
25427
25674
|
if (controlsDisabled.value) return;
|
@@ -25681,9 +25928,10 @@
|
|
25681
25928
|
e.preventDefault();
|
25682
25929
|
e.stopPropagation();
|
25683
25930
|
const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
|
25931
|
+
const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
|
25684
25932
|
if (isValidNumber(clipboardText)) return;
|
25685
25933
|
model.value = clipboardText.split('');
|
25686
|
-
inputRef.value?.[
|
25934
|
+
inputRef.value?.[finalIndex].focus();
|
25687
25935
|
}
|
25688
25936
|
function reset() {
|
25689
25937
|
model.value = [];
|
@@ -29468,7 +29716,7 @@
|
|
29468
29716
|
};
|
29469
29717
|
});
|
29470
29718
|
}
|
29471
|
-
const version$1 = "3.8.
|
29719
|
+
const version$1 = "3.8.9-dev.2025-06-11";
|
29472
29720
|
createVuetify$1.version = version$1;
|
29473
29721
|
|
29474
29722
|
// Vue's inject() can only be used in setup
|
@@ -29493,7 +29741,7 @@
|
|
29493
29741
|
...options
|
29494
29742
|
});
|
29495
29743
|
};
|
29496
|
-
const version = "3.8.
|
29744
|
+
const version = "3.8.9-dev.2025-06-11";
|
29497
29745
|
createVuetify.version = version;
|
29498
29746
|
|
29499
29747
|
exports.blueprints = index;
|