@vuetify/nightly 3.8.5-pr-21419.3ae3440 → 3.8.6-dev.2025-05-21
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 +21 -10
- package/dist/json/attributes.json +3457 -3421
- package/dist/json/importMap-labs.json +28 -28
- package/dist/json/importMap.json +174 -174
- package/dist/json/tags.json +9 -0
- package/dist/json/web-types.json +6421 -6246
- package/dist/vuetify-labs.cjs +296 -156
- package/dist/vuetify-labs.css +5588 -5549
- package/dist/vuetify-labs.d.ts +1512 -1354
- package/dist/vuetify-labs.esm.js +297 -157
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +296 -156
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +290 -145
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +4006 -3967
- package/dist/vuetify.d.ts +671 -521
- package/dist/vuetify.esm.js +291 -146
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +290 -145
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +1196 -1189
- 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 +14 -9
- package/lib/components/VAlert/VAlert.js.map +1 -1
- package/lib/components/VAlert/VAlert.sass +7 -1
- package/lib/components/VAutocomplete/VAutocomplete.d.ts +120 -96
- package/lib/components/VAutocomplete/VAutocomplete.js +18 -1
- package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
- 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/VCheckbox/VCheckbox.d.ts +3 -3
- package/lib/components/VCombobox/VCombobox.d.ts +120 -96
- package/lib/components/VCombobox/VCombobox.js +19 -1
- package/lib/components/VCombobox/VCombobox.js.map +1 -1
- 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/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/VListChildren.js.map +1 -1
- package/lib/components/VNumberInput/VNumberInput.css +15 -4
- 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/VNumberInput/VNumberInput.sass +18 -6
- package/lib/components/VOverlay/VOverlay.css +1 -1
- package/lib/components/VOverlay/_variables.scss +1 -1
- package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
- package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
- package/lib/components/VSelect/VSelect.d.ts +120 -96
- package/lib/components/VSelect/VSelect.js +19 -34
- package/lib/components/VSelect/VSelect.js.map +1 -1
- package/lib/components/VSlider/VSlider.d.ts +3 -3
- package/lib/components/VSwitch/VSwitch.d.ts +3 -3
- package/lib/components/VTextField/VTextField.d.ts +27 -27
- package/lib/components/VTextarea/VTextarea.d.ts +15 -15
- 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 +1 -1
- package/lib/composables/date/DateAdapter.js.map +1 -1
- 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 +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/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/entry-bundler.d.ts +1 -1
- package/lib/entry-bundler.js +1 -1
- package/lib/entry-bundler.js.map +1 -1
- package/lib/framework.d.ts +76 -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/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/entry-bundler.d.ts +1 -1
- package/lib/util/globals.d.ts +1 -0
- package/lib/util/globals.js +1 -0
- package/lib/util/globals.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.6-dev.2025-05-21
|
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"); }
|
@@ -2786,6 +2787,7 @@
|
|
2786
2787
|
function genDefaults$1() {
|
2787
2788
|
return {
|
2788
2789
|
defaultTheme: 'light',
|
2790
|
+
prefix: 'v-',
|
2789
2791
|
variations: {
|
2790
2792
|
colors: [],
|
2791
2793
|
lighten: 0,
|
@@ -2867,7 +2869,10 @@
|
|
2867
2869
|
}
|
2868
2870
|
}
|
2869
2871
|
},
|
2870
|
-
stylesheetId: 'vuetify-theme-stylesheet'
|
2872
|
+
stylesheetId: 'vuetify-theme-stylesheet',
|
2873
|
+
scoped: false,
|
2874
|
+
unimportant: false,
|
2875
|
+
utilities: true
|
2871
2876
|
};
|
2872
2877
|
}
|
2873
2878
|
function parseThemeOptions() {
|
@@ -2890,21 +2895,21 @@
|
|
2890
2895
|
function createCssClass(lines, selector, content, scope) {
|
2891
2896
|
lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
|
2892
2897
|
}
|
2893
|
-
function genCssVariables(theme) {
|
2898
|
+
function genCssVariables(theme, prefix) {
|
2894
2899
|
const lightOverlay = theme.dark ? 2 : 1;
|
2895
2900
|
const darkOverlay = theme.dark ? 1 : 2;
|
2896
2901
|
const variables = [];
|
2897
2902
|
for (const [key, value] of Object.entries(theme.colors)) {
|
2898
2903
|
const rgb = parseColor(value);
|
2899
|
-
variables.push(
|
2904
|
+
variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
|
2900
2905
|
if (!key.startsWith('on-')) {
|
2901
|
-
variables.push(
|
2906
|
+
variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
|
2902
2907
|
}
|
2903
2908
|
}
|
2904
2909
|
for (const [key, value] of Object.entries(theme.variables)) {
|
2905
2910
|
const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
|
2906
2911
|
const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
|
2907
|
-
variables.push(
|
2912
|
+
variables.push(`--${prefix}${key}: ${rgb ?? value}`);
|
2908
2913
|
}
|
2909
2914
|
return variables;
|
2910
2915
|
}
|
@@ -2948,7 +2953,8 @@
|
|
2948
2953
|
const scopeSelector = `:where(${scope})`;
|
2949
2954
|
return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
|
2950
2955
|
}
|
2951
|
-
function upsertStyles(
|
2956
|
+
function upsertStyles(id, cspNonce, styles) {
|
2957
|
+
const styleEl = getOrCreateStyleElement(id, cspNonce);
|
2952
2958
|
if (!styleEl) return;
|
2953
2959
|
styleEl.innerHTML = styles;
|
2954
2960
|
}
|
@@ -2968,8 +2974,17 @@
|
|
2968
2974
|
// Composables
|
2969
2975
|
function createTheme(options) {
|
2970
2976
|
const parsedOptions = parseThemeOptions(options);
|
2971
|
-
const
|
2977
|
+
const _name = vue.shallowRef(parsedOptions.defaultTheme);
|
2972
2978
|
const themes = vue.ref(parsedOptions.themes);
|
2979
|
+
const systemName = vue.shallowRef('light');
|
2980
|
+
const name = vue.computed({
|
2981
|
+
get() {
|
2982
|
+
return _name.value === 'system' ? systemName.value : _name.value;
|
2983
|
+
},
|
2984
|
+
set(val) {
|
2985
|
+
_name.value = val;
|
2986
|
+
}
|
2987
|
+
});
|
2973
2988
|
const computedThemes = vue.computed(() => {
|
2974
2989
|
const acc = {};
|
2975
2990
|
for (const [name, original] of Object.entries(themes.value)) {
|
@@ -2990,28 +3005,49 @@
|
|
2990
3005
|
const current = vue.toRef(() => computedThemes.value[name.value]);
|
2991
3006
|
const styles = vue.computed(() => {
|
2992
3007
|
const lines = [];
|
3008
|
+
const important = parsedOptions.unimportant ? '' : ' !important';
|
3009
|
+
const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
|
2993
3010
|
if (current.value?.dark) {
|
2994
3011
|
createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
|
2995
3012
|
}
|
2996
|
-
createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
|
3013
|
+
createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
|
2997
3014
|
for (const [themeName, theme] of Object.entries(computedThemes.value)) {
|
2998
|
-
createCssClass(lines,
|
2999
|
-
}
|
3000
|
-
|
3001
|
-
|
3002
|
-
|
3003
|
-
|
3004
|
-
|
3005
|
-
|
3006
|
-
|
3007
|
-
|
3008
|
-
|
3009
|
-
|
3015
|
+
createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
|
3016
|
+
}
|
3017
|
+
if (parsedOptions.utilities) {
|
3018
|
+
const bgLines = [];
|
3019
|
+
const fgLines = [];
|
3020
|
+
const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
|
3021
|
+
for (const key of colors) {
|
3022
|
+
if (key.startsWith('on-')) {
|
3023
|
+
createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
3024
|
+
} else {
|
3025
|
+
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);
|
3026
|
+
createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
3027
|
+
createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
|
3028
|
+
}
|
3010
3029
|
}
|
3030
|
+
lines.push(...bgLines, ...fgLines);
|
3011
3031
|
}
|
3012
|
-
lines.push(...bgLines, ...fgLines);
|
3013
3032
|
return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
|
3014
3033
|
});
|
3034
|
+
const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
|
3035
|
+
const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
|
3036
|
+
if (SUPPORTS_MATCH_MEDIA) {
|
3037
|
+
const media = window.matchMedia('(prefers-color-scheme: dark)');
|
3038
|
+
function updateSystemName() {
|
3039
|
+
systemName.value = media.matches ? 'dark' : 'light';
|
3040
|
+
}
|
3041
|
+
updateSystemName();
|
3042
|
+
media.addEventListener('change', updateSystemName, {
|
3043
|
+
passive: true
|
3044
|
+
});
|
3045
|
+
if (vue.getCurrentScope()) {
|
3046
|
+
vue.onScopeDispose(() => {
|
3047
|
+
media.removeEventListener('change', updateSystemName);
|
3048
|
+
});
|
3049
|
+
}
|
3050
|
+
}
|
3015
3051
|
function install(app) {
|
3016
3052
|
if (parsedOptions.isDisabled) return;
|
3017
3053
|
const head = app._context.provides.usehead;
|
@@ -3049,22 +3085,55 @@
|
|
3049
3085
|
updateStyles();
|
3050
3086
|
}
|
3051
3087
|
function updateStyles() {
|
3052
|
-
upsertStyles(
|
3088
|
+
upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
|
3053
3089
|
}
|
3054
3090
|
}
|
3055
3091
|
}
|
3056
|
-
|
3092
|
+
function change(themeName) {
|
3093
|
+
if (!themeNames.value.includes(themeName)) {
|
3094
|
+
consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
|
3095
|
+
return;
|
3096
|
+
}
|
3097
|
+
name.value = themeName;
|
3098
|
+
}
|
3099
|
+
function cycle() {
|
3100
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
|
3101
|
+
const currentIndex = themeArray.indexOf(name.value);
|
3102
|
+
const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
|
3103
|
+
change(themeArray[nextIndex]);
|
3104
|
+
}
|
3105
|
+
function toggle() {
|
3106
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
|
3107
|
+
cycle(themeArray);
|
3108
|
+
}
|
3109
|
+
const globalName = new Proxy(name, {
|
3110
|
+
get(target, prop) {
|
3111
|
+
return target[prop];
|
3112
|
+
},
|
3113
|
+
set(target, prop, val) {
|
3114
|
+
if (prop === 'value') {
|
3115
|
+
deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
|
3116
|
+
}
|
3117
|
+
// @ts-expect-error
|
3118
|
+
target[prop] = val;
|
3119
|
+
return true;
|
3120
|
+
}
|
3121
|
+
});
|
3057
3122
|
return {
|
3058
3123
|
install,
|
3124
|
+
change,
|
3125
|
+
cycle,
|
3126
|
+
toggle,
|
3059
3127
|
isDisabled: parsedOptions.isDisabled,
|
3060
3128
|
name,
|
3061
3129
|
themes,
|
3062
3130
|
current,
|
3063
3131
|
computedThemes,
|
3132
|
+
prefix: parsedOptions.prefix,
|
3064
3133
|
themeClasses,
|
3065
3134
|
styles,
|
3066
3135
|
global: {
|
3067
|
-
name,
|
3136
|
+
name: globalName,
|
3068
3137
|
current
|
3069
3138
|
}
|
3070
3139
|
};
|
@@ -3075,7 +3144,7 @@
|
|
3075
3144
|
if (!theme) throw new Error('Could not find Vuetify theme injection');
|
3076
3145
|
const name = vue.toRef(() => props.theme ?? theme.name.value);
|
3077
3146
|
const current = vue.toRef(() => theme.themes.value[name.value]);
|
3078
|
-
const themeClasses = vue.toRef(() => theme.isDisabled ? undefined :
|
3147
|
+
const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
|
3079
3148
|
const newTheme = {
|
3080
3149
|
...theme,
|
3081
3150
|
name,
|
@@ -4622,9 +4691,15 @@
|
|
4622
4691
|
};
|
4623
4692
|
}
|
4624
4693
|
|
4694
|
+
// Types
|
4695
|
+
|
4625
4696
|
const makeVBtnGroupProps = propsFactory({
|
4626
4697
|
baseColor: String,
|
4627
4698
|
divided: Boolean,
|
4699
|
+
direction: {
|
4700
|
+
type: String,
|
4701
|
+
default: 'horizontal'
|
4702
|
+
},
|
4628
4703
|
...makeBorderProps(),
|
4629
4704
|
...makeComponentProps(),
|
4630
4705
|
...makeDensityProps(),
|
@@ -4658,7 +4733,7 @@
|
|
4658
4733
|
} = useRounded(props);
|
4659
4734
|
provideDefaults({
|
4660
4735
|
VBtn: {
|
4661
|
-
height: 'auto',
|
4736
|
+
height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
|
4662
4737
|
baseColor: vue.toRef(() => props.baseColor),
|
4663
4738
|
color: vue.toRef(() => props.color),
|
4664
4739
|
density: vue.toRef(() => props.density),
|
@@ -4668,7 +4743,7 @@
|
|
4668
4743
|
});
|
4669
4744
|
useRender(() => {
|
4670
4745
|
return vue.createVNode(props.tag, {
|
4671
|
-
"class": ['v-btn-group', {
|
4746
|
+
"class": ['v-btn-group', `v-btn-group--${props.direction}`, {
|
4672
4747
|
'v-btn-group--divided': props.divided
|
4673
4748
|
}, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
|
4674
4749
|
"style": props.style
|
@@ -6147,6 +6222,31 @@
|
|
6147
6222
|
// Utilities
|
6148
6223
|
const VAlertTitle = createSimpleFunctional('v-alert-title');
|
6149
6224
|
|
6225
|
+
// Utilities
|
6226
|
+
|
6227
|
+
// Types
|
6228
|
+
|
6229
|
+
// Types
|
6230
|
+
|
6231
|
+
// Composables
|
6232
|
+
const makeIconSizeProps = propsFactory({
|
6233
|
+
iconSize: [Number, String],
|
6234
|
+
iconSizes: {
|
6235
|
+
type: Array,
|
6236
|
+
default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
|
6237
|
+
}
|
6238
|
+
}, 'iconSize');
|
6239
|
+
function useIconSizes(props, fallback) {
|
6240
|
+
const iconSize = vue.computed(() => {
|
6241
|
+
const iconSizeMap = new Map(props.iconSizes);
|
6242
|
+
const _iconSize = props.iconSize ?? fallback() ?? 'default';
|
6243
|
+
return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
|
6244
|
+
});
|
6245
|
+
return {
|
6246
|
+
iconSize
|
6247
|
+
};
|
6248
|
+
}
|
6249
|
+
|
6150
6250
|
// Types
|
6151
6251
|
|
6152
6252
|
const allowedTypes = ['success', 'info', 'warning', 'error'];
|
@@ -6186,6 +6286,7 @@
|
|
6186
6286
|
...makeDensityProps(),
|
6187
6287
|
...makeDimensionProps(),
|
6188
6288
|
...makeElevationProps(),
|
6289
|
+
...makeIconSizeProps(),
|
6189
6290
|
...makeLocationProps(),
|
6190
6291
|
...makePositionProps(),
|
6191
6292
|
...makeRoundedProps(),
|
@@ -6213,6 +6314,9 @@
|
|
6213
6314
|
if (!props.type) return props.icon;
|
6214
6315
|
return props.icon ?? `$${props.type}`;
|
6215
6316
|
});
|
6317
|
+
const {
|
6318
|
+
iconSize
|
6319
|
+
} = useIconSizes(props, () => props.prominent ? 44 : 28);
|
6216
6320
|
const {
|
6217
6321
|
themeClasses
|
6218
6322
|
} = provideTheme(props);
|
@@ -6260,6 +6364,11 @@
|
|
6260
6364
|
const hasPrepend = !!(slots.prepend || icon.value);
|
6261
6365
|
const hasTitle = !!(slots.title || props.title);
|
6262
6366
|
const hasClose = !!(slots.close || props.closable);
|
6367
|
+
const iconProps = {
|
6368
|
+
density: props.density,
|
6369
|
+
icon: icon.value,
|
6370
|
+
size: iconSize.value
|
6371
|
+
};
|
6263
6372
|
return isActive.value && vue.createVNode(props.tag, {
|
6264
6373
|
"class": ['v-alert', props.border && {
|
6265
6374
|
'v-alert--border': !!props.border,
|
@@ -6277,19 +6386,14 @@
|
|
6277
6386
|
}, null), hasPrepend && vue.createVNode("div", {
|
6278
6387
|
"key": "prepend",
|
6279
6388
|
"class": "v-alert__prepend"
|
6280
|
-
}, [!slots.prepend ? vue.createVNode(VIcon, {
|
6281
|
-
"key": "prepend-icon"
|
6282
|
-
|
6283
|
-
"icon": icon.value,
|
6284
|
-
"size": props.prominent ? 44 : 28
|
6285
|
-
}, null) : vue.createVNode(VDefaultsProvider, {
|
6389
|
+
}, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
|
6390
|
+
"key": "prepend-icon"
|
6391
|
+
}, iconProps), null) : vue.createVNode(VDefaultsProvider, {
|
6286
6392
|
"key": "prepend-defaults",
|
6287
6393
|
"disabled": !icon.value,
|
6288
6394
|
"defaults": {
|
6289
6395
|
VIcon: {
|
6290
|
-
|
6291
|
-
icon: icon.value,
|
6292
|
-
size: props.prominent ? 44 : 28
|
6396
|
+
...iconProps
|
6293
6397
|
}
|
6294
6398
|
}
|
6295
6399
|
}, slots.prepend)]), vue.createVNode("div", {
|
@@ -8487,6 +8591,68 @@
|
|
8487
8591
|
}
|
8488
8592
|
});
|
8489
8593
|
|
8594
|
+
const makeVDividerProps = propsFactory({
|
8595
|
+
color: String,
|
8596
|
+
inset: Boolean,
|
8597
|
+
length: [Number, String],
|
8598
|
+
opacity: [Number, String],
|
8599
|
+
thickness: [Number, String],
|
8600
|
+
vertical: Boolean,
|
8601
|
+
...makeComponentProps(),
|
8602
|
+
...makeThemeProps()
|
8603
|
+
}, 'VDivider');
|
8604
|
+
const VDivider = genericComponent()({
|
8605
|
+
name: 'VDivider',
|
8606
|
+
props: makeVDividerProps(),
|
8607
|
+
setup(props, _ref) {
|
8608
|
+
let {
|
8609
|
+
attrs,
|
8610
|
+
slots
|
8611
|
+
} = _ref;
|
8612
|
+
const {
|
8613
|
+
themeClasses
|
8614
|
+
} = provideTheme(props);
|
8615
|
+
const {
|
8616
|
+
textColorClasses,
|
8617
|
+
textColorStyles
|
8618
|
+
} = useTextColor(() => props.color);
|
8619
|
+
const dividerStyles = vue.computed(() => {
|
8620
|
+
const styles = {};
|
8621
|
+
if (props.length) {
|
8622
|
+
styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
|
8623
|
+
}
|
8624
|
+
if (props.thickness) {
|
8625
|
+
styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
|
8626
|
+
}
|
8627
|
+
return styles;
|
8628
|
+
});
|
8629
|
+
useRender(() => {
|
8630
|
+
const divider = vue.createVNode("hr", {
|
8631
|
+
"class": [{
|
8632
|
+
'v-divider': true,
|
8633
|
+
'v-divider--inset': props.inset,
|
8634
|
+
'v-divider--vertical': props.vertical
|
8635
|
+
}, themeClasses.value, textColorClasses.value, props.class],
|
8636
|
+
"style": [dividerStyles.value, textColorStyles.value, {
|
8637
|
+
'--v-border-opacity': props.opacity
|
8638
|
+
}, props.style],
|
8639
|
+
"aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
|
8640
|
+
"role": `${attrs.role || 'separator'}`
|
8641
|
+
}, null);
|
8642
|
+
if (!slots.default) return divider;
|
8643
|
+
return vue.createVNode("div", {
|
8644
|
+
"class": ['v-divider__wrapper', {
|
8645
|
+
'v-divider__wrapper--vertical': props.vertical,
|
8646
|
+
'v-divider__wrapper--inset': props.inset
|
8647
|
+
}]
|
8648
|
+
}, [divider, vue.createVNode("div", {
|
8649
|
+
"class": "v-divider__content"
|
8650
|
+
}, [slots.default()]), divider]);
|
8651
|
+
});
|
8652
|
+
return {};
|
8653
|
+
}
|
8654
|
+
});
|
8655
|
+
|
8490
8656
|
// Utilities
|
8491
8657
|
|
8492
8658
|
// List
|
@@ -9638,68 +9804,6 @@
|
|
9638
9804
|
}
|
9639
9805
|
});
|
9640
9806
|
|
9641
|
-
const makeVDividerProps = propsFactory({
|
9642
|
-
color: String,
|
9643
|
-
inset: Boolean,
|
9644
|
-
length: [Number, String],
|
9645
|
-
opacity: [Number, String],
|
9646
|
-
thickness: [Number, String],
|
9647
|
-
vertical: Boolean,
|
9648
|
-
...makeComponentProps(),
|
9649
|
-
...makeThemeProps()
|
9650
|
-
}, 'VDivider');
|
9651
|
-
const VDivider = genericComponent()({
|
9652
|
-
name: 'VDivider',
|
9653
|
-
props: makeVDividerProps(),
|
9654
|
-
setup(props, _ref) {
|
9655
|
-
let {
|
9656
|
-
attrs,
|
9657
|
-
slots
|
9658
|
-
} = _ref;
|
9659
|
-
const {
|
9660
|
-
themeClasses
|
9661
|
-
} = provideTheme(props);
|
9662
|
-
const {
|
9663
|
-
textColorClasses,
|
9664
|
-
textColorStyles
|
9665
|
-
} = useTextColor(() => props.color);
|
9666
|
-
const dividerStyles = vue.computed(() => {
|
9667
|
-
const styles = {};
|
9668
|
-
if (props.length) {
|
9669
|
-
styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
|
9670
|
-
}
|
9671
|
-
if (props.thickness) {
|
9672
|
-
styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
|
9673
|
-
}
|
9674
|
-
return styles;
|
9675
|
-
});
|
9676
|
-
useRender(() => {
|
9677
|
-
const divider = vue.createVNode("hr", {
|
9678
|
-
"class": [{
|
9679
|
-
'v-divider': true,
|
9680
|
-
'v-divider--inset': props.inset,
|
9681
|
-
'v-divider--vertical': props.vertical
|
9682
|
-
}, themeClasses.value, textColorClasses.value, props.class],
|
9683
|
-
"style": [dividerStyles.value, textColorStyles.value, {
|
9684
|
-
'--v-border-opacity': props.opacity
|
9685
|
-
}, props.style],
|
9686
|
-
"aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
|
9687
|
-
"role": `${attrs.role || 'separator'}`
|
9688
|
-
}, null);
|
9689
|
-
if (!slots.default) return divider;
|
9690
|
-
return vue.createVNode("div", {
|
9691
|
-
"class": ['v-divider__wrapper', {
|
9692
|
-
'v-divider__wrapper--vertical': props.vertical,
|
9693
|
-
'v-divider__wrapper--inset': props.inset
|
9694
|
-
}]
|
9695
|
-
}, [divider, vue.createVNode("div", {
|
9696
|
-
"class": "v-divider__content"
|
9697
|
-
}, [slots.default()]), divider]);
|
9698
|
-
});
|
9699
|
-
return {};
|
9700
|
-
}
|
9701
|
-
});
|
9702
|
-
|
9703
9807
|
// Types
|
9704
9808
|
|
9705
9809
|
const makeVListChildrenProps = propsFactory({
|
@@ -12617,7 +12721,12 @@
|
|
12617
12721
|
}
|
12618
12722
|
function calculateOffset(index) {
|
12619
12723
|
index = clamp(index, 0, items.value.length - 1);
|
12620
|
-
|
12724
|
+
const whole = Math.floor(index);
|
12725
|
+
const fraction = index % 1;
|
12726
|
+
const next = whole + 1;
|
12727
|
+
const wholeOffset = offsets[whole] || 0;
|
12728
|
+
const nextOffset = offsets[next] || wholeOffset;
|
12729
|
+
return wholeOffset + (nextOffset - wholeOffset) * fraction;
|
12621
12730
|
}
|
12622
12731
|
function calculateIndex(scrollTop) {
|
12623
12732
|
return binaryClosest(offsets, scrollTop);
|
@@ -13021,7 +13130,6 @@
|
|
13021
13130
|
const selectedValues = vue.computed(() => model.value.map(selection => selection.value));
|
13022
13131
|
const isFocused = vue.shallowRef(false);
|
13023
13132
|
let keyboardLookupPrefix = '';
|
13024
|
-
let keyboardLookupIndex = -1;
|
13025
13133
|
let keyboardLookupLastTime;
|
13026
13134
|
const displayItems = vue.computed(() => {
|
13027
13135
|
if (props.hideSelected) {
|
@@ -13089,41 +13197,10 @@
|
|
13089
13197
|
const now = performance.now();
|
13090
13198
|
if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) {
|
13091
13199
|
keyboardLookupPrefix = '';
|
13092
|
-
keyboardLookupIndex = -1;
|
13093
13200
|
}
|
13094
13201
|
keyboardLookupPrefix += e.key.toLowerCase();
|
13095
13202
|
keyboardLookupLastTime = now;
|
13096
|
-
const
|
13097
|
-
function findItem() {
|
13098
|
-
let result = findItemBase();
|
13099
|
-
if (result !== undefined) return result;
|
13100
|
-
if (keyboardLookupPrefix.at(-1) === keyboardLookupPrefix.at(-2)) {
|
13101
|
-
// No matches but we have a repeated letter, try the next item with that prefix
|
13102
|
-
keyboardLookupPrefix = keyboardLookupPrefix.slice(0, -1);
|
13103
|
-
result = findItemBase();
|
13104
|
-
if (result !== undefined) return result;
|
13105
|
-
}
|
13106
|
-
|
13107
|
-
// Still nothing, wrap around to the top
|
13108
|
-
keyboardLookupIndex = -1;
|
13109
|
-
result = findItemBase();
|
13110
|
-
if (result !== undefined) return result;
|
13111
|
-
|
13112
|
-
// Still nothing, try just the new letter
|
13113
|
-
keyboardLookupPrefix = e.key.toLowerCase();
|
13114
|
-
return findItemBase();
|
13115
|
-
}
|
13116
|
-
function findItemBase() {
|
13117
|
-
for (let i = 0; i < items.length; i++) {
|
13118
|
-
const _item = items[i];
|
13119
|
-
if (i > keyboardLookupIndex && _item.title.toLowerCase().startsWith(keyboardLookupPrefix)) {
|
13120
|
-
keyboardLookupIndex = i;
|
13121
|
-
return _item;
|
13122
|
-
}
|
13123
|
-
}
|
13124
|
-
return undefined;
|
13125
|
-
}
|
13126
|
-
const item = findItem();
|
13203
|
+
const item = items.value.find(item => item.title.toLowerCase().startsWith(keyboardLookupPrefix));
|
13127
13204
|
if (item !== undefined) {
|
13128
13205
|
if (!props.multiple) {
|
13129
13206
|
model.value = [item];
|
@@ -13280,6 +13357,22 @@
|
|
13280
13357
|
key: item.value,
|
13281
13358
|
onClick: () => select(item, null)
|
13282
13359
|
});
|
13360
|
+
if (item.raw.type === 'divider') {
|
13361
|
+
return slots.divider?.({
|
13362
|
+
props: item.raw,
|
13363
|
+
index
|
13364
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
13365
|
+
"key": `divider-${index}`
|
13366
|
+
}), null);
|
13367
|
+
}
|
13368
|
+
if (item.raw.type === 'subheader') {
|
13369
|
+
return slots.subheader?.({
|
13370
|
+
props: item.raw,
|
13371
|
+
index
|
13372
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
13373
|
+
"key": `subheader-${index}`
|
13374
|
+
}), null);
|
13375
|
+
}
|
13283
13376
|
return slots.item?.({
|
13284
13377
|
item,
|
13285
13378
|
index,
|
@@ -13440,6 +13533,9 @@
|
|
13440
13533
|
let match = -1;
|
13441
13534
|
if ((query || customFiltersLength > 0) && !options?.noFilter) {
|
13442
13535
|
if (typeof item === 'object') {
|
13536
|
+
if (['divider', 'subheader'].includes(item.raw?.type)) {
|
13537
|
+
continue;
|
13538
|
+
}
|
13443
13539
|
const filterKeys = keys || Object.keys(transformed);
|
13444
13540
|
for (const key of filterKeys) {
|
13445
13541
|
const value = getPropertyFromItem(transformed, key);
|
@@ -13878,6 +13974,22 @@
|
|
13878
13974
|
active: highlightFirst.value && index === 0 ? true : undefined,
|
13879
13975
|
onClick: () => select(item, null)
|
13880
13976
|
});
|
13977
|
+
if (item.raw.type === 'divider') {
|
13978
|
+
return slots.divider?.({
|
13979
|
+
props: item.raw,
|
13980
|
+
index
|
13981
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
13982
|
+
"key": `divider-${index}`
|
13983
|
+
}), null);
|
13984
|
+
}
|
13985
|
+
if (item.raw.type === 'subheader') {
|
13986
|
+
return slots.subheader?.({
|
13987
|
+
props: item.raw,
|
13988
|
+
index
|
13989
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
13990
|
+
"key": `subheader-${index}`
|
13991
|
+
}), null);
|
13992
|
+
}
|
13881
13993
|
return slots.item?.({
|
13882
13994
|
item,
|
13883
13995
|
index,
|
@@ -17473,13 +17585,13 @@
|
|
17473
17585
|
return null;
|
17474
17586
|
}
|
17475
17587
|
const sundayJanuarySecond2000 = new Date(2000, 0, 2);
|
17476
|
-
function getWeekdays(locale, firstDayOfWeek) {
|
17588
|
+
function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
|
17477
17589
|
const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
|
17478
17590
|
return createRange(7).map(i => {
|
17479
17591
|
const weekday = new Date(sundayJanuarySecond2000);
|
17480
17592
|
weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
|
17481
17593
|
return new Intl.DateTimeFormat(locale, {
|
17482
|
-
weekday: 'narrow'
|
17594
|
+
weekday: weekdayFormat ?? 'narrow'
|
17483
17595
|
}).format(weekday);
|
17484
17596
|
});
|
17485
17597
|
}
|
@@ -17943,9 +18055,9 @@
|
|
17943
18055
|
getDiff(date, comparing, unit) {
|
17944
18056
|
return getDiff(date, comparing, unit);
|
17945
18057
|
}
|
17946
|
-
getWeekdays(firstDayOfWeek) {
|
18058
|
+
getWeekdays(firstDayOfWeek, weekdayFormat) {
|
17947
18059
|
const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
|
17948
|
-
return getWeekdays(this.locale, firstDay);
|
18060
|
+
return getWeekdays(this.locale, firstDay, weekdayFormat);
|
17949
18061
|
}
|
17950
18062
|
getYear(date) {
|
17951
18063
|
return getYear(date);
|
@@ -18288,6 +18400,7 @@
|
|
18288
18400
|
_search.value = val ?? '';
|
18289
18401
|
if (!props.multiple && !hasSelectionSlot.value) {
|
18290
18402
|
model.value = [transformItem$3(props, val)];
|
18403
|
+
vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
|
18291
18404
|
}
|
18292
18405
|
if (val && props.multiple && props.delimiters?.length) {
|
18293
18406
|
const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
|
@@ -18604,6 +18717,22 @@
|
|
18604
18717
|
active: highlightFirst.value && index === 0 ? true : undefined,
|
18605
18718
|
onClick: () => select(item, null)
|
18606
18719
|
});
|
18720
|
+
if (item.raw.type === 'divider') {
|
18721
|
+
return slots.divider?.({
|
18722
|
+
props: item.raw,
|
18723
|
+
index
|
18724
|
+
}) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
|
18725
|
+
"key": `divider-${index}`
|
18726
|
+
}), null);
|
18727
|
+
}
|
18728
|
+
if (item.raw.type === 'subheader') {
|
18729
|
+
return slots.subheader?.({
|
18730
|
+
props: item.raw,
|
18731
|
+
index
|
18732
|
+
}) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
|
18733
|
+
"key": `subheader-${index}`
|
18734
|
+
}), null);
|
18735
|
+
}
|
18607
18736
|
return slots.item?.({
|
18608
18737
|
item,
|
18609
18738
|
index,
|
@@ -22247,7 +22376,8 @@
|
|
22247
22376
|
firstDayOfWeek: {
|
22248
22377
|
type: [Number, String],
|
22249
22378
|
default: undefined
|
22250
|
-
}
|
22379
|
+
},
|
22380
|
+
weekdayFormat: String
|
22251
22381
|
}, 'calendar');
|
22252
22382
|
function useCalendar(props) {
|
22253
22383
|
const adapter = useDate();
|
@@ -22495,7 +22625,7 @@
|
|
22495
22625
|
"ref": daysRef,
|
22496
22626
|
"key": daysInMonth.value[0].date?.toString(),
|
22497
22627
|
"class": "v-date-picker-month__days"
|
22498
|
-
}, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createVNode("div", {
|
22628
|
+
}, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createVNode("div", {
|
22499
22629
|
"class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
|
22500
22630
|
}, [weekDay])), daysInMonth.value.map((item, i) => {
|
22501
22631
|
const slotProps = {
|
@@ -25026,6 +25156,10 @@
|
|
25026
25156
|
type: Number,
|
25027
25157
|
default: 0
|
25028
25158
|
},
|
25159
|
+
minFractionDigits: {
|
25160
|
+
type: Number,
|
25161
|
+
default: null
|
25162
|
+
},
|
25029
25163
|
...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
|
25030
25164
|
}, 'VNumberInput');
|
25031
25165
|
const VNumberInput = genericComponent()({
|
@@ -25056,9 +25190,19 @@
|
|
25056
25190
|
} = useFocus(props);
|
25057
25191
|
function correctPrecision(val) {
|
25058
25192
|
let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
|
25059
|
-
|
25060
|
-
|
25061
|
-
|
25193
|
+
if (precision == null) {
|
25194
|
+
return String(val);
|
25195
|
+
}
|
25196
|
+
let fixed = val.toFixed(precision);
|
25197
|
+
if (isFocused.value) {
|
25198
|
+
return Number(fixed).toString(); // trim zeros
|
25199
|
+
}
|
25200
|
+
if ((props.minFractionDigits ?? precision) < precision) {
|
25201
|
+
const trimLimit = precision - props.minFractionDigits;
|
25202
|
+
const [baseDigits, fractionDigits] = fixed.split('.');
|
25203
|
+
fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
|
25204
|
+
}
|
25205
|
+
return fixed;
|
25062
25206
|
}
|
25063
25207
|
const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
|
25064
25208
|
const _inputText = vue.shallowRef(null);
|
@@ -25111,6 +25255,7 @@
|
|
25111
25255
|
}
|
25112
25256
|
};
|
25113
25257
|
vue.watch(() => props.precision, () => formatInputValue());
|
25258
|
+
vue.watch(() => props.minFractionDigits, () => formatInputValue());
|
25114
25259
|
vue.onMounted(() => {
|
25115
25260
|
clampModel();
|
25116
25261
|
});
|
@@ -25212,7 +25357,7 @@
|
|
25212
25357
|
inputText.value = null;
|
25213
25358
|
return;
|
25214
25359
|
}
|
25215
|
-
inputText.value =
|
25360
|
+
inputText.value = correctPrecision(model.value);
|
25216
25361
|
}
|
25217
25362
|
function trimDecimalZeros() {
|
25218
25363
|
if (controlsDisabled.value) return;
|
@@ -29254,7 +29399,7 @@
|
|
29254
29399
|
};
|
29255
29400
|
});
|
29256
29401
|
}
|
29257
|
-
const version$1 = "3.8.
|
29402
|
+
const version$1 = "3.8.6-dev.2025-05-21";
|
29258
29403
|
createVuetify$1.version = version$1;
|
29259
29404
|
|
29260
29405
|
// Vue's inject() can only be used in setup
|
@@ -29279,7 +29424,7 @@
|
|
29279
29424
|
...options
|
29280
29425
|
});
|
29281
29426
|
};
|
29282
|
-
const version = "3.8.
|
29427
|
+
const version = "3.8.6-dev.2025-05-21";
|
29283
29428
|
createVuetify.version = version;
|
29284
29429
|
|
29285
29430
|
exports.blueprints = index;
|