@vuetify/nightly 3.8.7-master.2025-06-03 → 3.8.8-dev.2025-06-04
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 +29 -15
- package/dist/json/attributes.json +3615 -3515
- package/dist/json/importMap-labs.json +18 -18
- package/dist/json/importMap.json +138 -138
- package/dist/json/tags.json +25 -0
- package/dist/json/web-types.json +6428 -6096
- package/dist/vuetify-labs.cjs +363 -145
- package/dist/vuetify-labs.css +3793 -3759
- package/dist/vuetify-labs.d.ts +2390 -1886
- package/dist/vuetify-labs.esm.js +364 -146
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +363 -145
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +357 -134
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +3553 -3519
- package/dist/vuetify.d.ts +1545 -1081
- package/dist/vuetify.esm.js +358 -135
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +357 -134
- 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/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 +70 -55
- 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.cjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Vuetify v3.8.
|
2
|
+
* Vuetify v3.8.8-dev.2025-06-04
|
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"); }
|
@@ -529,6 +530,14 @@
|
|
529
530
|
}
|
530
531
|
return cleanText;
|
531
532
|
}
|
533
|
+
function camelizeProps(props) {
|
534
|
+
if (!props) return;
|
535
|
+
const out = {};
|
536
|
+
for (const prop in props) {
|
537
|
+
out[vue.camelize(prop)] = props[prop];
|
538
|
+
}
|
539
|
+
return out;
|
540
|
+
}
|
532
541
|
|
533
542
|
// Utilities
|
534
543
|
const block = ['top', 'bottom'];
|
@@ -2828,6 +2837,7 @@
|
|
2828
2837
|
function genDefaults$1() {
|
2829
2838
|
return {
|
2830
2839
|
defaultTheme: 'light',
|
2840
|
+
prefix: 'v-',
|
2831
2841
|
variations: {
|
2832
2842
|
colors: [],
|
2833
2843
|
lighten: 0,
|
@@ -2909,7 +2919,10 @@
|
|
2909
2919
|
}
|
2910
2920
|
}
|
2911
2921
|
},
|
2912
|
-
stylesheetId: 'vuetify-theme-stylesheet'
|
2922
|
+
stylesheetId: 'vuetify-theme-stylesheet',
|
2923
|
+
scoped: false,
|
2924
|
+
unimportant: false,
|
2925
|
+
utilities: true
|
2913
2926
|
};
|
2914
2927
|
}
|
2915
2928
|
function parseThemeOptions() {
|
@@ -2932,21 +2945,21 @@
|
|
2932
2945
|
function createCssClass(lines, selector, content, scope) {
|
2933
2946
|
lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
|
2934
2947
|
}
|
2935
|
-
function genCssVariables(theme) {
|
2948
|
+
function genCssVariables(theme, prefix) {
|
2936
2949
|
const lightOverlay = theme.dark ? 2 : 1;
|
2937
2950
|
const darkOverlay = theme.dark ? 1 : 2;
|
2938
2951
|
const variables = [];
|
2939
2952
|
for (const [key, value] of Object.entries(theme.colors)) {
|
2940
2953
|
const rgb = parseColor(value);
|
2941
|
-
variables.push(
|
2954
|
+
variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
|
2942
2955
|
if (!key.startsWith('on-')) {
|
2943
|
-
variables.push(
|
2956
|
+
variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
|
2944
2957
|
}
|
2945
2958
|
}
|
2946
2959
|
for (const [key, value] of Object.entries(theme.variables)) {
|
2947
2960
|
const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
|
2948
2961
|
const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
|
2949
|
-
variables.push(
|
2962
|
+
variables.push(`--${prefix}${key}: ${rgb ?? value}`);
|
2950
2963
|
}
|
2951
2964
|
return variables;
|
2952
2965
|
}
|
@@ -2990,7 +3003,8 @@
|
|
2990
3003
|
const scopeSelector = `:where(${scope})`;
|
2991
3004
|
return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
|
2992
3005
|
}
|
2993
|
-
function upsertStyles(
|
3006
|
+
function upsertStyles(id, cspNonce, styles) {
|
3007
|
+
const styleEl = getOrCreateStyleElement(id, cspNonce);
|
2994
3008
|
if (!styleEl) return;
|
2995
3009
|
styleEl.innerHTML = styles;
|
2996
3010
|
}
|
@@ -3010,8 +3024,17 @@
|
|
3010
3024
|
// Composables
|
3011
3025
|
function createTheme(options) {
|
3012
3026
|
const parsedOptions = parseThemeOptions(options);
|
3013
|
-
const
|
3027
|
+
const _name = vue.shallowRef(parsedOptions.defaultTheme);
|
3014
3028
|
const themes = vue.ref(parsedOptions.themes);
|
3029
|
+
const systemName = vue.shallowRef('light');
|
3030
|
+
const name = vue.computed({
|
3031
|
+
get() {
|
3032
|
+
return _name.value === 'system' ? systemName.value : _name.value;
|
3033
|
+
},
|
3034
|
+
set(val) {
|
3035
|
+
_name.value = val;
|
3036
|
+
}
|
3037
|
+
});
|
3015
3038
|
const computedThemes = vue.computed(() => {
|
3016
3039
|
const acc = {};
|
3017
3040
|
for (const [name, original] of Object.entries(themes.value)) {
|
@@ -3032,28 +3055,49 @@
|
|
3032
3055
|
const current = vue.toRef(() => computedThemes.value[name.value]);
|
3033
3056
|
const styles = vue.computed(() => {
|
3034
3057
|
const lines = [];
|
3058
|
+
const important = parsedOptions.unimportant ? '' : ' !important';
|
3059
|
+
const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
|
3035
3060
|
if (current.value?.dark) {
|
3036
3061
|
createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
|
3037
3062
|
}
|
3038
|
-
createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
|
3063
|
+
createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
|
3039
3064
|
for (const [themeName, theme] of Object.entries(computedThemes.value)) {
|
3040
|
-
createCssClass(lines,
|
3041
|
-
}
|
3042
|
-
|
3043
|
-
|
3044
|
-
|
3045
|
-
|
3046
|
-
|
3047
|
-
|
3048
|
-
|
3049
|
-
|
3050
|
-
|
3051
|
-
|
3065
|
+
createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
|
3066
|
+
}
|
3067
|
+
if (parsedOptions.utilities) {
|
3068
|
+
const bgLines = [];
|
3069
|
+
const fgLines = [];
|
3070
|
+
const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
|
3071
|
+
for (const key of colors) {
|
3072
|
+
if (key.startsWith('on-')) {
|
3073
|
+
createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
3074
|
+
} else {
|
3075
|
+
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);
|
3076
|
+
createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
3077
|
+
createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
|
3078
|
+
}
|
3052
3079
|
}
|
3080
|
+
lines.push(...bgLines, ...fgLines);
|
3053
3081
|
}
|
3054
|
-
lines.push(...bgLines, ...fgLines);
|
3055
3082
|
return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
|
3056
3083
|
});
|
3084
|
+
const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
|
3085
|
+
const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
|
3086
|
+
if (SUPPORTS_MATCH_MEDIA) {
|
3087
|
+
const media = window.matchMedia('(prefers-color-scheme: dark)');
|
3088
|
+
function updateSystemName() {
|
3089
|
+
systemName.value = media.matches ? 'dark' : 'light';
|
3090
|
+
}
|
3091
|
+
updateSystemName();
|
3092
|
+
media.addEventListener('change', updateSystemName, {
|
3093
|
+
passive: true
|
3094
|
+
});
|
3095
|
+
if (vue.getCurrentScope()) {
|
3096
|
+
vue.onScopeDispose(() => {
|
3097
|
+
media.removeEventListener('change', updateSystemName);
|
3098
|
+
});
|
3099
|
+
}
|
3100
|
+
}
|
3057
3101
|
function install(app) {
|
3058
3102
|
if (parsedOptions.isDisabled) return;
|
3059
3103
|
const head = app._context.provides.usehead;
|
@@ -3091,22 +3135,55 @@
|
|
3091
3135
|
updateStyles();
|
3092
3136
|
}
|
3093
3137
|
function updateStyles() {
|
3094
|
-
upsertStyles(
|
3138
|
+
upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
|
3095
3139
|
}
|
3096
3140
|
}
|
3097
3141
|
}
|
3098
|
-
|
3142
|
+
function change(themeName) {
|
3143
|
+
if (!themeNames.value.includes(themeName)) {
|
3144
|
+
consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
|
3145
|
+
return;
|
3146
|
+
}
|
3147
|
+
name.value = themeName;
|
3148
|
+
}
|
3149
|
+
function cycle() {
|
3150
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
|
3151
|
+
const currentIndex = themeArray.indexOf(name.value);
|
3152
|
+
const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
|
3153
|
+
change(themeArray[nextIndex]);
|
3154
|
+
}
|
3155
|
+
function toggle() {
|
3156
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
|
3157
|
+
cycle(themeArray);
|
3158
|
+
}
|
3159
|
+
const globalName = new Proxy(name, {
|
3160
|
+
get(target, prop) {
|
3161
|
+
return target[prop];
|
3162
|
+
},
|
3163
|
+
set(target, prop, val) {
|
3164
|
+
if (prop === 'value') {
|
3165
|
+
deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
|
3166
|
+
}
|
3167
|
+
// @ts-expect-error
|
3168
|
+
target[prop] = val;
|
3169
|
+
return true;
|
3170
|
+
}
|
3171
|
+
});
|
3099
3172
|
return {
|
3100
3173
|
install,
|
3174
|
+
change,
|
3175
|
+
cycle,
|
3176
|
+
toggle,
|
3101
3177
|
isDisabled: parsedOptions.isDisabled,
|
3102
3178
|
name,
|
3103
3179
|
themes,
|
3104
3180
|
current,
|
3105
3181
|
computedThemes,
|
3182
|
+
prefix: parsedOptions.prefix,
|
3106
3183
|
themeClasses,
|
3107
3184
|
styles,
|
3108
3185
|
global: {
|
3109
|
-
name,
|
3186
|
+
name: globalName,
|
3110
3187
|
current
|
3111
3188
|
}
|
3112
3189
|
};
|
@@ -3117,7 +3194,7 @@
|
|
3117
3194
|
if (!theme) throw new Error('Could not find Vuetify theme injection');
|
3118
3195
|
const name = vue.toRef(() => props.theme ?? theme.name.value);
|
3119
3196
|
const current = vue.toRef(() => theme.themes.value[name.value]);
|
3120
|
-
const themeClasses = vue.toRef(() => theme.isDisabled ? undefined :
|
3197
|
+
const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
|
3121
3198
|
const newTheme = {
|
3122
3199
|
...theme,
|
3123
3200
|
name,
|
@@ -4221,7 +4298,10 @@
|
|
4221
4298
|
default: 'default',
|
4222
4299
|
validator: v => allowedDensities$1.includes(v)
|
4223
4300
|
},
|
4224
|
-
extended:
|
4301
|
+
extended: {
|
4302
|
+
type: Boolean,
|
4303
|
+
default: null
|
4304
|
+
},
|
4225
4305
|
extensionHeight: {
|
4226
4306
|
type: [Number, String],
|
4227
4307
|
default: 48
|
@@ -4269,7 +4349,7 @@
|
|
4269
4349
|
const {
|
4270
4350
|
rtlClasses
|
4271
4351
|
} = useRtl();
|
4272
|
-
const isExtended = vue.shallowRef(
|
4352
|
+
const isExtended = vue.shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
|
4273
4353
|
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));
|
4274
4354
|
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);
|
4275
4355
|
provideDefaults({
|
@@ -4281,7 +4361,7 @@
|
|
4281
4361
|
const hasTitle = !!(props.title || slots.title);
|
4282
4362
|
const hasImage = !!(slots.image || props.image);
|
4283
4363
|
const extension = slots.extension?.();
|
4284
|
-
isExtended.value =
|
4364
|
+
isExtended.value = props.extended === null ? !!extension : props.extended;
|
4285
4365
|
return vue.createVNode(props.tag, {
|
4286
4366
|
"class": vue.normalizeClass(['v-toolbar', {
|
4287
4367
|
'v-toolbar--absolute': props.absolute,
|
@@ -4664,9 +4744,15 @@
|
|
4664
4744
|
};
|
4665
4745
|
}
|
4666
4746
|
|
4747
|
+
// Types
|
4748
|
+
|
4667
4749
|
const makeVBtnGroupProps = propsFactory({
|
4668
4750
|
baseColor: String,
|
4669
4751
|
divided: Boolean,
|
4752
|
+
direction: {
|
4753
|
+
type: String,
|
4754
|
+
default: 'horizontal'
|
4755
|
+
},
|
4670
4756
|
...makeBorderProps(),
|
4671
4757
|
...makeComponentProps(),
|
4672
4758
|
...makeDensityProps(),
|
@@ -4700,7 +4786,7 @@
|
|
4700
4786
|
} = useRounded(props);
|
4701
4787
|
provideDefaults({
|
4702
4788
|
VBtn: {
|
4703
|
-
height: 'auto',
|
4789
|
+
height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
|
4704
4790
|
baseColor: vue.toRef(() => props.baseColor),
|
4705
4791
|
color: vue.toRef(() => props.color),
|
4706
4792
|
density: vue.toRef(() => props.density),
|
@@ -4710,7 +4796,7 @@
|
|
4710
4796
|
});
|
4711
4797
|
useRender(() => {
|
4712
4798
|
return vue.createVNode(props.tag, {
|
4713
|
-
"class": vue.normalizeClass(['v-btn-group', {
|
4799
|
+
"class": vue.normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
|
4714
4800
|
'v-btn-group--divided': props.divided
|
4715
4801
|
}, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
|
4716
4802
|
"style": vue.normalizeStyle(props.style)
|
@@ -5833,8 +5919,8 @@
|
|
5833
5919
|
window.clearTimeout(element._ripple.showTimer);
|
5834
5920
|
}
|
5835
5921
|
let keyboardRipple = false;
|
5836
|
-
function keyboardRippleShow(e) {
|
5837
|
-
if (!keyboardRipple && (e.keyCode
|
5922
|
+
function keyboardRippleShow(e, keys) {
|
5923
|
+
if (!keyboardRipple && keys.includes(e.keyCode)) {
|
5838
5924
|
keyboardRipple = true;
|
5839
5925
|
rippleShow(e);
|
5840
5926
|
}
|
@@ -5862,9 +5948,12 @@
|
|
5862
5948
|
el._ripple.enabled = enabled;
|
5863
5949
|
el._ripple.centered = modifiers.center;
|
5864
5950
|
el._ripple.circle = modifiers.circle;
|
5865
|
-
|
5866
|
-
|
5951
|
+
const bindingValue = isObject(value) ? value : {};
|
5952
|
+
if (bindingValue.class) {
|
5953
|
+
el._ripple.class = bindingValue.class;
|
5867
5954
|
}
|
5955
|
+
const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
|
5956
|
+
el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
|
5868
5957
|
if (enabled && !wasEnabled) {
|
5869
5958
|
if (modifiers.stop) {
|
5870
5959
|
el.addEventListener('touchstart', rippleStop, {
|
@@ -5886,7 +5975,7 @@
|
|
5886
5975
|
el.addEventListener('mousedown', rippleShow);
|
5887
5976
|
el.addEventListener('mouseup', rippleHide);
|
5888
5977
|
el.addEventListener('mouseleave', rippleHide);
|
5889
|
-
el.addEventListener('keydown', keyboardRippleShow);
|
5978
|
+
el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
|
5890
5979
|
el.addEventListener('keyup', keyboardRippleHide);
|
5891
5980
|
el.addEventListener('blur', focusRippleHide);
|
5892
5981
|
|
@@ -5906,7 +5995,9 @@
|
|
5906
5995
|
el.removeEventListener('touchcancel', rippleHide);
|
5907
5996
|
el.removeEventListener('mouseup', rippleHide);
|
5908
5997
|
el.removeEventListener('mouseleave', rippleHide);
|
5909
|
-
el.
|
5998
|
+
if (el._ripple?.keyDownHandler) {
|
5999
|
+
el.removeEventListener('keydown', el._ripple.keyDownHandler);
|
6000
|
+
}
|
5910
6001
|
el.removeEventListener('keyup', keyboardRippleHide);
|
5911
6002
|
el.removeEventListener('dragstart', rippleHide);
|
5912
6003
|
el.removeEventListener('blur', focusRippleHide);
|
@@ -5915,8 +6006,8 @@
|
|
5915
6006
|
updateRipple(el, binding, false);
|
5916
6007
|
}
|
5917
6008
|
function unmounted$4(el) {
|
5918
|
-
delete el._ripple;
|
5919
6009
|
removeListeners(el);
|
6010
|
+
delete el._ripple;
|
5920
6011
|
}
|
5921
6012
|
function updated$1(el, binding) {
|
5922
6013
|
if (binding.value === binding.oldValue) {
|
@@ -6189,6 +6280,31 @@
|
|
6189
6280
|
// Utilities
|
6190
6281
|
const VAlertTitle = createSimpleFunctional('v-alert-title');
|
6191
6282
|
|
6283
|
+
// Utilities
|
6284
|
+
|
6285
|
+
// Types
|
6286
|
+
|
6287
|
+
// Types
|
6288
|
+
|
6289
|
+
// Composables
|
6290
|
+
const makeIconSizeProps = propsFactory({
|
6291
|
+
iconSize: [Number, String],
|
6292
|
+
iconSizes: {
|
6293
|
+
type: Array,
|
6294
|
+
default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
|
6295
|
+
}
|
6296
|
+
}, 'iconSize');
|
6297
|
+
function useIconSizes(props, fallback) {
|
6298
|
+
const iconSize = vue.computed(() => {
|
6299
|
+
const iconSizeMap = new Map(props.iconSizes);
|
6300
|
+
const _iconSize = props.iconSize ?? fallback() ?? 'default';
|
6301
|
+
return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
|
6302
|
+
});
|
6303
|
+
return {
|
6304
|
+
iconSize
|
6305
|
+
};
|
6306
|
+
}
|
6307
|
+
|
6192
6308
|
// Types
|
6193
6309
|
|
6194
6310
|
const allowedTypes = ['success', 'info', 'warning', 'error'];
|
@@ -6228,6 +6344,7 @@
|
|
6228
6344
|
...makeDensityProps(),
|
6229
6345
|
...makeDimensionProps(),
|
6230
6346
|
...makeElevationProps(),
|
6347
|
+
...makeIconSizeProps(),
|
6231
6348
|
...makeLocationProps(),
|
6232
6349
|
...makePositionProps(),
|
6233
6350
|
...makeRoundedProps(),
|
@@ -6255,6 +6372,9 @@
|
|
6255
6372
|
if (!props.type) return props.icon;
|
6256
6373
|
return props.icon ?? `$${props.type}`;
|
6257
6374
|
});
|
6375
|
+
const {
|
6376
|
+
iconSize
|
6377
|
+
} = useIconSizes(props, () => props.prominent ? 44 : 28);
|
6258
6378
|
const {
|
6259
6379
|
themeClasses
|
6260
6380
|
} = provideTheme(props);
|
@@ -6302,6 +6422,11 @@
|
|
6302
6422
|
const hasPrepend = !!(slots.prepend || icon.value);
|
6303
6423
|
const hasTitle = !!(slots.title || props.title);
|
6304
6424
|
const hasClose = !!(slots.close || props.closable);
|
6425
|
+
const iconProps = {
|
6426
|
+
density: props.density,
|
6427
|
+
icon: icon.value,
|
6428
|
+
size: iconSize.value
|
6429
|
+
};
|
6305
6430
|
return isActive.value && vue.createVNode(props.tag, {
|
6306
6431
|
"class": vue.normalizeClass(['v-alert', props.border && {
|
6307
6432
|
'v-alert--border': !!props.border,
|
@@ -6319,19 +6444,14 @@
|
|
6319
6444
|
}, null), hasPrepend && vue.createElementVNode("div", {
|
6320
6445
|
"key": "prepend",
|
6321
6446
|
"class": "v-alert__prepend"
|
6322
|
-
}, [!slots.prepend ? vue.createVNode(VIcon, {
|
6323
|
-
"key": "prepend-icon"
|
6324
|
-
|
6325
|
-
"icon": icon.value,
|
6326
|
-
"size": props.prominent ? 44 : 28
|
6327
|
-
}, null) : vue.createVNode(VDefaultsProvider, {
|
6447
|
+
}, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
|
6448
|
+
"key": "prepend-icon"
|
6449
|
+
}, iconProps), null) : vue.createVNode(VDefaultsProvider, {
|
6328
6450
|
"key": "prepend-defaults",
|
6329
6451
|
"disabled": !icon.value,
|
6330
6452
|
"defaults": {
|
6331
6453
|
VIcon: {
|
6332
|
-
|
6333
|
-
icon: icon.value,
|
6334
|
-
size: props.prominent ? 44 : 28
|
6454
|
+
...iconProps
|
6335
6455
|
}
|
6336
6456
|
}
|
6337
6457
|
}, slots.prepend)]), vue.createElementVNode("div", {
|
@@ -7856,6 +7976,7 @@
|
|
7856
7976
|
const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
|
7857
7977
|
const makeVSlideGroupProps = propsFactory({
|
7858
7978
|
centerActive: Boolean,
|
7979
|
+
contentClass: null,
|
7859
7980
|
direction: {
|
7860
7981
|
type: String,
|
7861
7982
|
default: 'horizontal'
|
@@ -8168,7 +8289,7 @@
|
|
8168
8289
|
})]), vue.createElementVNode("div", {
|
8169
8290
|
"key": "container",
|
8170
8291
|
"ref": containerRef,
|
8171
|
-
"class":
|
8292
|
+
"class": vue.normalizeClass(['v-slide-group__container', props.contentClass]),
|
8172
8293
|
"onScroll": onScroll
|
8173
8294
|
}, [vue.createElementVNode("div", {
|
8174
8295
|
"ref": contentRef,
|
@@ -8531,16 +8652,85 @@
|
|
8531
8652
|
}
|
8532
8653
|
});
|
8533
8654
|
|
8655
|
+
const makeVDividerProps = propsFactory({
|
8656
|
+
color: String,
|
8657
|
+
inset: Boolean,
|
8658
|
+
length: [Number, String],
|
8659
|
+
opacity: [Number, String],
|
8660
|
+
thickness: [Number, String],
|
8661
|
+
vertical: Boolean,
|
8662
|
+
...makeComponentProps(),
|
8663
|
+
...makeThemeProps()
|
8664
|
+
}, 'VDivider');
|
8665
|
+
const VDivider = genericComponent()({
|
8666
|
+
name: 'VDivider',
|
8667
|
+
props: makeVDividerProps(),
|
8668
|
+
setup(props, _ref) {
|
8669
|
+
let {
|
8670
|
+
attrs,
|
8671
|
+
slots
|
8672
|
+
} = _ref;
|
8673
|
+
const {
|
8674
|
+
themeClasses
|
8675
|
+
} = provideTheme(props);
|
8676
|
+
const {
|
8677
|
+
textColorClasses,
|
8678
|
+
textColorStyles
|
8679
|
+
} = useTextColor(() => props.color);
|
8680
|
+
const dividerStyles = vue.computed(() => {
|
8681
|
+
const styles = {};
|
8682
|
+
if (props.length) {
|
8683
|
+
styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
|
8684
|
+
}
|
8685
|
+
if (props.thickness) {
|
8686
|
+
styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
|
8687
|
+
}
|
8688
|
+
return styles;
|
8689
|
+
});
|
8690
|
+
useRender(() => {
|
8691
|
+
const divider = vue.createElementVNode("hr", {
|
8692
|
+
"class": vue.normalizeClass([{
|
8693
|
+
'v-divider': true,
|
8694
|
+
'v-divider--inset': props.inset,
|
8695
|
+
'v-divider--vertical': props.vertical
|
8696
|
+
}, themeClasses.value, textColorClasses.value, props.class]),
|
8697
|
+
"style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
|
8698
|
+
'--v-border-opacity': props.opacity
|
8699
|
+
}, props.style]),
|
8700
|
+
"aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
|
8701
|
+
"role": `${attrs.role || 'separator'}`
|
8702
|
+
}, null);
|
8703
|
+
if (!slots.default) return divider;
|
8704
|
+
return vue.createElementVNode("div", {
|
8705
|
+
"class": vue.normalizeClass(['v-divider__wrapper', {
|
8706
|
+
'v-divider__wrapper--vertical': props.vertical,
|
8707
|
+
'v-divider__wrapper--inset': props.inset
|
8708
|
+
}])
|
8709
|
+
}, [divider, vue.createElementVNode("div", {
|
8710
|
+
"class": "v-divider__content"
|
8711
|
+
}, [slots.default()]), divider]);
|
8712
|
+
});
|
8713
|
+
return {};
|
8714
|
+
}
|
8715
|
+
});
|
8716
|
+
|
8534
8717
|
// Utilities
|
8535
8718
|
|
8536
8719
|
// List
|
8537
8720
|
const ListKey = Symbol.for('vuetify:list');
|
8538
8721
|
function createList() {
|
8722
|
+
let {
|
8723
|
+
filterable
|
8724
|
+
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
8725
|
+
filterable: false
|
8726
|
+
};
|
8539
8727
|
const parent = vue.inject(ListKey, {
|
8728
|
+
filterable: false,
|
8540
8729
|
hasPrepend: vue.shallowRef(false),
|
8541
8730
|
updateHasPrepend: () => null
|
8542
8731
|
});
|
8543
8732
|
const data = {
|
8733
|
+
filterable: parent.filterable || filterable,
|
8544
8734
|
hasPrepend: vue.shallowRef(false),
|
8545
8735
|
updateHasPrepend: value => {
|
8546
8736
|
if (value) data.hasPrepend.value = value;
|
@@ -9492,6 +9682,9 @@
|
|
9492
9682
|
roundedClasses
|
9493
9683
|
} = useRounded(roundedProps);
|
9494
9684
|
const lineClasses = vue.toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
|
9685
|
+
const rippleOptions = vue.toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
|
9686
|
+
keys: [keyCodes.enter]
|
9687
|
+
} : props.ripple);
|
9495
9688
|
const slotProps = vue.computed(() => ({
|
9496
9689
|
isActive: isActive.value,
|
9497
9690
|
select,
|
@@ -9516,8 +9709,9 @@
|
|
9516
9709
|
function onKeyDown(e) {
|
9517
9710
|
const target = e.target;
|
9518
9711
|
if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
|
9519
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
9712
|
+
if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
|
9520
9713
|
e.preventDefault();
|
9714
|
+
e.stopPropagation();
|
9521
9715
|
e.target.dispatchEvent(new MouseEvent('click', e));
|
9522
9716
|
}
|
9523
9717
|
}
|
@@ -9627,7 +9821,7 @@
|
|
9627
9821
|
}), vue.createElementVNode("div", {
|
9628
9822
|
"class": "v-list-item__spacer"
|
9629
9823
|
}, null)])]
|
9630
|
-
}), [[Ripple, isClickable.value &&
|
9824
|
+
}), [[Ripple, isClickable.value && rippleOptions.value]]);
|
9631
9825
|
});
|
9632
9826
|
return {
|
9633
9827
|
activate,
|
@@ -9682,68 +9876,6 @@
|
|
9682
9876
|
}
|
9683
9877
|
});
|
9684
9878
|
|
9685
|
-
const makeVDividerProps = propsFactory({
|
9686
|
-
color: String,
|
9687
|
-
inset: Boolean,
|
9688
|
-
length: [Number, String],
|
9689
|
-
opacity: [Number, String],
|
9690
|
-
thickness: [Number, String],
|
9691
|
-
vertical: Boolean,
|
9692
|
-
...makeComponentProps(),
|
9693
|
-
...makeThemeProps()
|
9694
|
-
}, 'VDivider');
|
9695
|
-
const VDivider = genericComponent()({
|
9696
|
-
name: 'VDivider',
|
9697
|
-
props: makeVDividerProps(),
|
9698
|
-
setup(props, _ref) {
|
9699
|
-
let {
|
9700
|
-
attrs,
|
9701
|
-
slots
|
9702
|
-
} = _ref;
|
9703
|
-
const {
|
9704
|
-
themeClasses
|
9705
|
-
} = provideTheme(props);
|
9706
|
-
const {
|
9707
|
-
textColorClasses,
|
9708
|
-
textColorStyles
|
9709
|
-
} = useTextColor(() => props.color);
|
9710
|
-
const dividerStyles = vue.computed(() => {
|
9711
|
-
const styles = {};
|
9712
|
-
if (props.length) {
|
9713
|
-
styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
|
9714
|
-
}
|
9715
|
-
if (props.thickness) {
|
9716
|
-
styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
|
9717
|
-
}
|
9718
|
-
return styles;
|
9719
|
-
});
|
9720
|
-
useRender(() => {
|
9721
|
-
const divider = vue.createElementVNode("hr", {
|
9722
|
-
"class": vue.normalizeClass([{
|
9723
|
-
'v-divider': true,
|
9724
|
-
'v-divider--inset': props.inset,
|
9725
|
-
'v-divider--vertical': props.vertical
|
9726
|
-
}, themeClasses.value, textColorClasses.value, props.class]),
|
9727
|
-
"style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
|
9728
|
-
'--v-border-opacity': props.opacity
|
9729
|
-
}, props.style]),
|
9730
|
-
"aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
|
9731
|
-
"role": `${attrs.role || 'separator'}`
|
9732
|
-
}, null);
|
9733
|
-
if (!slots.default) return divider;
|
9734
|
-
return vue.createElementVNode("div", {
|
9735
|
-
"class": vue.normalizeClass(['v-divider__wrapper', {
|
9736
|
-
'v-divider__wrapper--vertical': props.vertical,
|
9737
|
-
'v-divider__wrapper--inset': props.inset
|
9738
|
-
}])
|
9739
|
-
}, [divider, vue.createElementVNode("div", {
|
9740
|
-
"class": "v-divider__content"
|
9741
|
-
}, [slots.default()]), divider]);
|
9742
|
-
});
|
9743
|
-
return {};
|
9744
|
-
}
|
9745
|
-
});
|
9746
|
-
|
9747
9879
|
// Types
|
9748
9880
|
|
9749
9881
|
const makeVListChildrenProps = propsFactory({
|
@@ -9860,7 +9992,7 @@
|
|
9860
9992
|
const _props = {
|
9861
9993
|
title,
|
9862
9994
|
value,
|
9863
|
-
...itemProps
|
9995
|
+
...camelizeProps(itemProps)
|
9864
9996
|
};
|
9865
9997
|
return {
|
9866
9998
|
title: String(_props.title ?? ''),
|
@@ -10012,6 +10144,7 @@
|
|
10012
10144
|
activeClass: String,
|
10013
10145
|
bgColor: String,
|
10014
10146
|
disabled: Boolean,
|
10147
|
+
filterable: Boolean,
|
10015
10148
|
expandIcon: IconValue,
|
10016
10149
|
collapseIcon: IconValue,
|
10017
10150
|
lines: {
|
@@ -10095,7 +10228,9 @@
|
|
10095
10228
|
const activeColor = vue.toRef(() => props.activeColor);
|
10096
10229
|
const baseColor = vue.toRef(() => props.baseColor);
|
10097
10230
|
const color = vue.toRef(() => props.color);
|
10098
|
-
createList(
|
10231
|
+
createList({
|
10232
|
+
filterable: props.filterable
|
10233
|
+
});
|
10099
10234
|
provideDefaults({
|
10100
10235
|
VListGroup: {
|
10101
10236
|
activeColor,
|
@@ -12671,7 +12806,12 @@
|
|
12671
12806
|
}
|
12672
12807
|
function calculateOffset(index) {
|
12673
12808
|
index = clamp(index, 0, items.value.length - 1);
|
12674
|
-
|
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;
|
12675
12815
|
}
|
12676
12816
|
function calculateIndex(scrollTop) {
|
12677
12817
|
return binaryClosest(offsets, scrollTop);
|
@@ -13025,6 +13165,7 @@
|
|
13025
13165
|
},
|
13026
13166
|
openOnClear: Boolean,
|
13027
13167
|
itemColor: String,
|
13168
|
+
noAutoScroll: Boolean,
|
13028
13169
|
...makeItemsProps({
|
13029
13170
|
itemChildren: false
|
13030
13171
|
})
|
@@ -13239,7 +13380,7 @@
|
|
13239
13380
|
vue.watch(menu, () => {
|
13240
13381
|
if (!props.hideSelected && menu.value && model.value.length) {
|
13241
13382
|
const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
|
13242
|
-
IN_BROWSER && window.requestAnimationFrame(() => {
|
13383
|
+
IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
|
13243
13384
|
index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
|
13244
13385
|
});
|
13245
13386
|
}
|
@@ -13331,6 +13472,22 @@
|
|
13331
13472
|
key: item.value,
|
13332
13473
|
onClick: () => select(item, null)
|
13333
13474
|
});
|
13475
|
+
if (item.raw.type === 'divider') {
|
13476
|
+
return slots.divider?.({
|
13477
|
+
props: item.raw,
|
13478
|
+
index
|
13479
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
13480
|
+
"key": `divider-${index}`
|
13481
|
+
}), null);
|
13482
|
+
}
|
13483
|
+
if (item.raw.type === 'subheader') {
|
13484
|
+
return slots.subheader?.({
|
13485
|
+
props: item.raw,
|
13486
|
+
index
|
13487
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
13488
|
+
"key": `subheader-${index}`
|
13489
|
+
}), null);
|
13490
|
+
}
|
13334
13491
|
return slots.item?.({
|
13335
13492
|
item,
|
13336
13493
|
index,
|
@@ -13491,6 +13648,9 @@
|
|
13491
13648
|
let match = -1;
|
13492
13649
|
if ((query || customFiltersLength > 0) && !options?.noFilter) {
|
13493
13650
|
if (typeof item === 'object') {
|
13651
|
+
if (['divider', 'subheader'].includes(item.raw?.type)) {
|
13652
|
+
continue;
|
13653
|
+
}
|
13494
13654
|
const filterKeys = keys || Object.keys(transformed);
|
13495
13655
|
for (const key of filterKeys) {
|
13496
13656
|
const value = getPropertyFromItem(transformed, key);
|
@@ -13693,7 +13853,7 @@
|
|
13693
13853
|
menu.value = !menu.value;
|
13694
13854
|
}
|
13695
13855
|
function onListKeydown(e) {
|
13696
|
-
if (e.key
|
13856
|
+
if (checkPrintable(e) || e.key === 'Backspace') {
|
13697
13857
|
vTextFieldRef.value?.focus();
|
13698
13858
|
}
|
13699
13859
|
}
|
@@ -13898,6 +14058,7 @@
|
|
13898
14058
|
}, props.menuProps), {
|
13899
14059
|
default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
|
13900
14060
|
"ref": listRef,
|
14061
|
+
"filterable": true,
|
13901
14062
|
"selected": selectedValues.value,
|
13902
14063
|
"selectStrategy": props.multiple ? 'independent' : 'single-independent',
|
13903
14064
|
"onMousedown": e => e.preventDefault(),
|
@@ -13929,6 +14090,22 @@
|
|
13929
14090
|
active: highlightFirst.value && index === 0 ? true : undefined,
|
13930
14091
|
onClick: () => select(item, null)
|
13931
14092
|
});
|
14093
|
+
if (item.raw.type === 'divider') {
|
14094
|
+
return slots.divider?.({
|
14095
|
+
props: item.raw,
|
14096
|
+
index
|
14097
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
14098
|
+
"key": `divider-${index}`
|
14099
|
+
}), null);
|
14100
|
+
}
|
14101
|
+
if (item.raw.type === 'subheader') {
|
14102
|
+
return slots.subheader?.({
|
14103
|
+
props: item.raw,
|
14104
|
+
index
|
14105
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
14106
|
+
"key": `subheader-${index}`
|
14107
|
+
}), null);
|
14108
|
+
}
|
13932
14109
|
return slots.item?.({
|
13933
14110
|
item,
|
13934
14111
|
index,
|
@@ -17533,13 +17710,13 @@
|
|
17533
17710
|
return null;
|
17534
17711
|
}
|
17535
17712
|
const sundayJanuarySecond2000 = new Date(2000, 0, 2);
|
17536
|
-
function getWeekdays(locale, firstDayOfWeek) {
|
17713
|
+
function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
|
17537
17714
|
const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
|
17538
17715
|
return createRange(7).map(i => {
|
17539
17716
|
const weekday = new Date(sundayJanuarySecond2000);
|
17540
17717
|
weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
|
17541
17718
|
return new Intl.DateTimeFormat(locale, {
|
17542
|
-
weekday: 'narrow'
|
17719
|
+
weekday: weekdayFormat ?? 'narrow'
|
17543
17720
|
}).format(weekday);
|
17544
17721
|
});
|
17545
17722
|
}
|
@@ -18003,9 +18180,9 @@
|
|
18003
18180
|
getDiff(date, comparing, unit) {
|
18004
18181
|
return getDiff(date, comparing, unit);
|
18005
18182
|
}
|
18006
|
-
getWeekdays(firstDayOfWeek) {
|
18183
|
+
getWeekdays(firstDayOfWeek, weekdayFormat) {
|
18007
18184
|
const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
|
18008
|
-
return getWeekdays(this.locale, firstDay);
|
18185
|
+
return getWeekdays(this.locale, firstDay, weekdayFormat);
|
18009
18186
|
}
|
18010
18187
|
getYear(date) {
|
18011
18188
|
return getYear(date);
|
@@ -18361,6 +18538,7 @@
|
|
18361
18538
|
_search.value = val ?? '';
|
18362
18539
|
if (!props.multiple && !hasSelectionSlot.value) {
|
18363
18540
|
model.value = [transformItem$3(props, val)];
|
18541
|
+
vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
|
18364
18542
|
}
|
18365
18543
|
if (val && props.multiple && props.delimiters?.length) {
|
18366
18544
|
const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
|
@@ -18441,7 +18619,7 @@
|
|
18441
18619
|
menu.value = !menu.value;
|
18442
18620
|
}
|
18443
18621
|
function onListKeydown(e) {
|
18444
|
-
if (e.key
|
18622
|
+
if (checkPrintable(e) || e.key === 'Backspace') {
|
18445
18623
|
vTextFieldRef.value?.focus();
|
18446
18624
|
}
|
18447
18625
|
}
|
@@ -18646,6 +18824,7 @@
|
|
18646
18824
|
}, props.menuProps), {
|
18647
18825
|
default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
|
18648
18826
|
"ref": listRef,
|
18827
|
+
"filterable": true,
|
18649
18828
|
"selected": selectedValues.value,
|
18650
18829
|
"selectStrategy": props.multiple ? 'independent' : 'single-independent',
|
18651
18830
|
"onMousedown": e => e.preventDefault(),
|
@@ -18677,6 +18856,22 @@
|
|
18677
18856
|
active: highlightFirst.value && index === 0 ? true : undefined,
|
18678
18857
|
onClick: () => select(item, null)
|
18679
18858
|
});
|
18859
|
+
if (item.raw.type === 'divider') {
|
18860
|
+
return slots.divider?.({
|
18861
|
+
props: item.raw,
|
18862
|
+
index
|
18863
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
18864
|
+
"key": `divider-${index}`
|
18865
|
+
}), null);
|
18866
|
+
}
|
18867
|
+
if (item.raw.type === 'subheader') {
|
18868
|
+
return slots.subheader?.({
|
18869
|
+
props: item.raw,
|
18870
|
+
index
|
18871
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
18872
|
+
"key": `subheader-${index}`
|
18873
|
+
}), null);
|
18874
|
+
}
|
18680
18875
|
return slots.item?.({
|
18681
18876
|
item,
|
18682
18877
|
index,
|
@@ -20556,6 +20751,7 @@
|
|
20556
20751
|
color: String,
|
20557
20752
|
disableSort: Boolean,
|
20558
20753
|
fixedHeader: Boolean,
|
20754
|
+
lastFixed: Boolean,
|
20559
20755
|
multiSort: Boolean,
|
20560
20756
|
sortAscIcon: {
|
20561
20757
|
type: IconValue,
|
@@ -20602,10 +20798,11 @@
|
|
20602
20798
|
loaderClasses
|
20603
20799
|
} = useLoader(props);
|
20604
20800
|
function getFixedStyles(column, y) {
|
20605
|
-
if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
|
20801
|
+
if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
|
20606
20802
|
return {
|
20607
20803
|
position: 'sticky',
|
20608
|
-
left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
|
20804
|
+
left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
|
20805
|
+
right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
|
20609
20806
|
top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
|
20610
20807
|
};
|
20611
20808
|
}
|
@@ -21114,11 +21311,18 @@
|
|
21114
21311
|
}
|
21115
21312
|
});
|
21116
21313
|
|
21314
|
+
// Types
|
21315
|
+
|
21117
21316
|
const makeVTableProps = propsFactory({
|
21118
21317
|
fixedHeader: Boolean,
|
21119
21318
|
fixedFooter: Boolean,
|
21120
21319
|
height: [Number, String],
|
21121
21320
|
hover: Boolean,
|
21321
|
+
striped: {
|
21322
|
+
type: String,
|
21323
|
+
default: null,
|
21324
|
+
validator: v => ['even', 'odd'].includes(v)
|
21325
|
+
},
|
21122
21326
|
...makeComponentProps(),
|
21123
21327
|
...makeDensityProps(),
|
21124
21328
|
...makeTagProps(),
|
@@ -21145,7 +21349,9 @@
|
|
21145
21349
|
'v-table--fixed-footer': props.fixedFooter,
|
21146
21350
|
'v-table--has-top': !!slots.top,
|
21147
21351
|
'v-table--has-bottom': !!slots.bottom,
|
21148
|
-
'v-table--hover': props.hover
|
21352
|
+
'v-table--hover': props.hover,
|
21353
|
+
'v-table--striped-even': props.striped === 'even',
|
21354
|
+
'v-table--striped-odd': props.striped === 'odd'
|
21149
21355
|
}, themeClasses.value, densityClasses.value, props.class]),
|
21150
21356
|
"style": vue.normalizeStyle(props.style)
|
21151
21357
|
}, {
|
@@ -22320,7 +22526,8 @@
|
|
22320
22526
|
firstDayOfWeek: {
|
22321
22527
|
type: [Number, String],
|
22322
22528
|
default: undefined
|
22323
|
-
}
|
22529
|
+
},
|
22530
|
+
weekdayFormat: String
|
22324
22531
|
}, 'calendar');
|
22325
22532
|
function useCalendar(props) {
|
22326
22533
|
const adapter = useDate();
|
@@ -22561,7 +22768,7 @@
|
|
22561
22768
|
"ref": daysRef,
|
22562
22769
|
"key": daysInMonth.value[0].date?.toString(),
|
22563
22770
|
"class": "v-date-picker-month__days"
|
22564
|
-
}, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
|
22771
|
+
}, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createElementVNode("div", {
|
22565
22772
|
"class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
|
22566
22773
|
}, [weekDay])), daysInMonth.value.map((item, i) => {
|
22567
22774
|
const slotProps = {
|
@@ -25151,6 +25358,10 @@
|
|
25151
25358
|
type: Number,
|
25152
25359
|
default: 0
|
25153
25360
|
},
|
25361
|
+
minFractionDigits: {
|
25362
|
+
type: Number,
|
25363
|
+
default: null
|
25364
|
+
},
|
25154
25365
|
...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
|
25155
25366
|
}, 'VNumberInput');
|
25156
25367
|
const VNumberInput = genericComponent()({
|
@@ -25181,9 +25392,19 @@
|
|
25181
25392
|
} = useFocus(props);
|
25182
25393
|
function correctPrecision(val) {
|
25183
25394
|
let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
|
25184
|
-
|
25185
|
-
|
25186
|
-
|
25395
|
+
if (precision == null) {
|
25396
|
+
return String(val);
|
25397
|
+
}
|
25398
|
+
let fixed = val.toFixed(precision);
|
25399
|
+
if (isFocused.value) {
|
25400
|
+
return Number(fixed).toString(); // trim zeros
|
25401
|
+
}
|
25402
|
+
if ((props.minFractionDigits ?? precision) < precision) {
|
25403
|
+
const trimLimit = precision - props.minFractionDigits;
|
25404
|
+
const [baseDigits, fractionDigits] = fixed.split('.');
|
25405
|
+
fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
|
25406
|
+
}
|
25407
|
+
return fixed;
|
25187
25408
|
}
|
25188
25409
|
const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
|
25189
25410
|
const _inputText = vue.shallowRef(null);
|
@@ -25238,6 +25459,7 @@
|
|
25238
25459
|
}
|
25239
25460
|
};
|
25240
25461
|
vue.watch(() => props.precision, () => formatInputValue());
|
25462
|
+
vue.watch(() => props.minFractionDigits, () => formatInputValue());
|
25241
25463
|
vue.onMounted(() => {
|
25242
25464
|
clampModel();
|
25243
25465
|
});
|
@@ -25352,7 +25574,7 @@
|
|
25352
25574
|
inputText.value = null;
|
25353
25575
|
return;
|
25354
25576
|
}
|
25355
|
-
inputText.value =
|
25577
|
+
inputText.value = correctPrecision(model.value);
|
25356
25578
|
}
|
25357
25579
|
function trimDecimalZeros() {
|
25358
25580
|
if (controlsDisabled.value) return;
|
@@ -25612,9 +25834,10 @@
|
|
25612
25834
|
e.preventDefault();
|
25613
25835
|
e.stopPropagation();
|
25614
25836
|
const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
|
25837
|
+
const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
|
25615
25838
|
if (isValidNumber(clipboardText)) return;
|
25616
25839
|
model.value = clipboardText.split('');
|
25617
|
-
inputRef.value?.[
|
25840
|
+
inputRef.value?.[finalIndex].focus();
|
25618
25841
|
}
|
25619
25842
|
function reset() {
|
25620
25843
|
model.value = [];
|
@@ -29396,7 +29619,7 @@
|
|
29396
29619
|
};
|
29397
29620
|
});
|
29398
29621
|
}
|
29399
|
-
const version$1 = "3.8.
|
29622
|
+
const version$1 = "3.8.8-dev.2025-06-04";
|
29400
29623
|
createVuetify$1.version = version$1;
|
29401
29624
|
|
29402
29625
|
// Vue's inject() can only be used in setup
|
@@ -29421,7 +29644,7 @@
|
|
29421
29644
|
...options
|
29422
29645
|
});
|
29423
29646
|
};
|
29424
|
-
const version = "3.8.
|
29647
|
+
const version = "3.8.8-dev.2025-06-04";
|
29425
29648
|
createVuetify.version = version;
|
29426
29649
|
|
29427
29650
|
exports.blueprints = index;
|