@vuetify/nightly 3.8.0-master.2025-04-06 → 3.8.1-dev.2025-04-12
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 +14 -15
- package/dist/json/attributes.json +615 -615
- package/dist/json/importMap-labs.json +20 -20
- package/dist/json/importMap.json +126 -126
- package/dist/json/web-types.json +1125 -1125
- package/dist/vuetify-labs.cjs +192 -96
- package/dist/vuetify-labs.css +3977 -3977
- package/dist/vuetify-labs.d.ts +53 -48
- package/dist/vuetify-labs.esm.js +193 -97
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +192 -96
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +192 -96
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +4047 -4047
- package/dist/vuetify.d.ts +53 -48
- package/dist/vuetify.esm.js +193 -97
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +192 -96
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +1178 -1171
- package/dist/vuetify.min.js.map +1 -1
- package/lib/composables/theme.d.ts +6 -1
- package/lib/composables/theme.js +183 -93
- 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.js +1 -1
- package/lib/entry-bundler.js.map +1 -1
- package/lib/framework.d.ts +53 -48
- package/lib/framework.js +1 -1
- package/lib/framework.js.map +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 +2 -2
@@ -4,11 +4,12 @@ type DeepPartial<T> = T extends object ? {
|
|
4
4
|
} : T;
|
5
5
|
export type ThemeOptions = false | {
|
6
6
|
cspNonce?: string;
|
7
|
-
defaultTheme?: string;
|
7
|
+
defaultTheme?: 'light' | 'dark' | 'system' | string;
|
8
8
|
variations?: false | VariationsOptions;
|
9
9
|
themes?: Record<string, ThemeDefinition>;
|
10
10
|
stylesheetId?: string;
|
11
11
|
scope?: string;
|
12
|
+
unimportant?: boolean;
|
12
13
|
};
|
13
14
|
export type ThemeDefinition = DeepPartial<InternalThemeDefinition>;
|
14
15
|
interface VariationsOptions {
|
@@ -45,11 +46,15 @@ interface OnColors {
|
|
45
46
|
'on-info': string;
|
46
47
|
}
|
47
48
|
export interface ThemeInstance {
|
49
|
+
change: (themeName: string) => void;
|
50
|
+
cycle: (themeArray?: string[]) => void;
|
51
|
+
toggle: (themeArray?: [string, string]) => void;
|
48
52
|
readonly isDisabled: boolean;
|
49
53
|
readonly themes: Ref<Record<string, InternalThemeDefinition>>;
|
50
54
|
readonly name: Readonly<Ref<string>>;
|
51
55
|
readonly current: DeepReadonly<Ref<InternalThemeDefinition>>;
|
52
56
|
readonly computedThemes: DeepReadonly<Ref<Record<string, InternalThemeDefinition>>>;
|
57
|
+
readonly prefix: string;
|
53
58
|
readonly themeClasses: Readonly<Ref<string | undefined>>;
|
54
59
|
readonly styles: Readonly<Ref<string>>;
|
55
60
|
readonly global: {
|
package/lib/composables/theme.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
// Utilities
|
2
|
-
import { computed, inject, provide, ref, watch, watchEffect } from 'vue';
|
3
|
-
import { createRange, darken, getCurrentInstance, getForeground, getLuma, IN_BROWSER, lighten, mergeDeep, parseColor, propsFactory, RGBtoHex } from "../util/index.js"; // Types
|
2
|
+
import { computed, getCurrentScope, inject, onScopeDispose, provide, ref, shallowRef, watch, watchEffect } from 'vue';
|
3
|
+
import { consoleWarn, createRange, darken, deprecate, getCurrentInstance, getForeground, getLuma, IN_BROWSER, lighten, mergeDeep, parseColor, propsFactory, RGBtoHex, SUPPORTS_MATCH_MEDIA } from "../util/index.js"; // Types
|
4
4
|
export const ThemeSymbol = Symbol.for('vuetify:theme');
|
5
5
|
export const makeThemeProps = propsFactory({
|
6
6
|
theme: String
|
@@ -8,6 +8,7 @@ export const makeThemeProps = propsFactory({
|
|
8
8
|
function genDefaults() {
|
9
9
|
return {
|
10
10
|
defaultTheme: 'light',
|
11
|
+
prefix: 'v-',
|
11
12
|
variations: {
|
12
13
|
colors: [],
|
13
14
|
lighten: 0,
|
@@ -89,7 +90,10 @@ function genDefaults() {
|
|
89
90
|
}
|
90
91
|
}
|
91
92
|
},
|
92
|
-
stylesheetId: 'vuetify-theme-stylesheet'
|
93
|
+
stylesheetId: 'vuetify-theme-stylesheet',
|
94
|
+
scoped: false,
|
95
|
+
unimportant: false,
|
96
|
+
utilities: true
|
93
97
|
};
|
94
98
|
}
|
95
99
|
function parseThemeOptions() {
|
@@ -109,93 +113,175 @@ function parseThemeOptions() {
|
|
109
113
|
themes
|
110
114
|
});
|
111
115
|
}
|
116
|
+
function createCssClass(lines, selector, content, scope) {
|
117
|
+
lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
|
118
|
+
}
|
119
|
+
function genCssVariables(theme, prefix) {
|
120
|
+
const lightOverlay = theme.dark ? 2 : 1;
|
121
|
+
const darkOverlay = theme.dark ? 1 : 2;
|
122
|
+
const variables = [];
|
123
|
+
for (const [key, value] of Object.entries(theme.colors)) {
|
124
|
+
const rgb = parseColor(value);
|
125
|
+
variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
|
126
|
+
if (!key.startsWith('on-')) {
|
127
|
+
variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
|
128
|
+
}
|
129
|
+
}
|
130
|
+
for (const [key, value] of Object.entries(theme.variables)) {
|
131
|
+
const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
|
132
|
+
const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
|
133
|
+
variables.push(`--${prefix}${key}: ${rgb ?? value}`);
|
134
|
+
}
|
135
|
+
return variables;
|
136
|
+
}
|
137
|
+
function genVariation(name, color, variations) {
|
138
|
+
const object = {};
|
139
|
+
if (variations) {
|
140
|
+
for (const variation of ['lighten', 'darken']) {
|
141
|
+
const fn = variation === 'lighten' ? lighten : darken;
|
142
|
+
for (const amount of createRange(variations[variation], 1)) {
|
143
|
+
object[`${name}-${variation}-${amount}`] = RGBtoHex(fn(parseColor(color), amount));
|
144
|
+
}
|
145
|
+
}
|
146
|
+
}
|
147
|
+
return object;
|
148
|
+
}
|
149
|
+
function genVariations(colors, variations) {
|
150
|
+
if (!variations) return {};
|
151
|
+
let variationColors = {};
|
152
|
+
for (const name of variations.colors) {
|
153
|
+
const color = colors[name];
|
154
|
+
if (!color) continue;
|
155
|
+
variationColors = {
|
156
|
+
...variationColors,
|
157
|
+
...genVariation(name, color, variations)
|
158
|
+
};
|
159
|
+
}
|
160
|
+
return variationColors;
|
161
|
+
}
|
162
|
+
function genOnColors(colors) {
|
163
|
+
const onColors = {};
|
164
|
+
for (const color of Object.keys(colors)) {
|
165
|
+
if (color.startsWith('on-') || colors[`on-${color}`]) continue;
|
166
|
+
const onColor = `on-${color}`;
|
167
|
+
const colorVal = parseColor(colors[color]);
|
168
|
+
onColors[onColor] = getForeground(colorVal);
|
169
|
+
}
|
170
|
+
return onColors;
|
171
|
+
}
|
172
|
+
function getScopedSelector(selector, scope) {
|
173
|
+
if (!scope) return selector;
|
174
|
+
const scopeSelector = `:where(${scope})`;
|
175
|
+
return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
|
176
|
+
}
|
177
|
+
function upsertStyles(id, cspNonce, styles) {
|
178
|
+
const styleEl = getOrCreateStyleElement(id, cspNonce);
|
179
|
+
if (!styleEl) return;
|
180
|
+
styleEl.innerHTML = styles;
|
181
|
+
}
|
182
|
+
function getOrCreateStyleElement(id, cspNonce) {
|
183
|
+
if (!IN_BROWSER) return null;
|
184
|
+
let style = document.getElementById(id);
|
185
|
+
if (!style) {
|
186
|
+
style = document.createElement('style');
|
187
|
+
style.id = id;
|
188
|
+
style.type = 'text/css';
|
189
|
+
if (cspNonce) style.setAttribute('nonce', cspNonce);
|
190
|
+
document.head.appendChild(style);
|
191
|
+
}
|
192
|
+
return style;
|
193
|
+
}
|
112
194
|
|
113
195
|
// Composables
|
114
196
|
export function createTheme(options) {
|
115
197
|
const parsedOptions = parseThemeOptions(options);
|
116
|
-
const
|
198
|
+
const _name = shallowRef(parsedOptions.defaultTheme);
|
117
199
|
const themes = ref(parsedOptions.themes);
|
200
|
+
const systemName = shallowRef('light');
|
201
|
+
const name = computed({
|
202
|
+
get() {
|
203
|
+
return _name.value === 'system' ? systemName.value : _name.value;
|
204
|
+
},
|
205
|
+
set(val) {
|
206
|
+
_name.value = val;
|
207
|
+
}
|
208
|
+
});
|
118
209
|
const computedThemes = computed(() => {
|
119
210
|
const acc = {};
|
120
211
|
for (const [name, original] of Object.entries(themes.value)) {
|
121
|
-
const
|
212
|
+
const colors = {
|
213
|
+
...original.colors,
|
214
|
+
...genVariations(original.colors, parsedOptions.variations)
|
215
|
+
};
|
216
|
+
acc[name] = {
|
122
217
|
...original,
|
123
218
|
colors: {
|
124
|
-
...
|
219
|
+
...colors,
|
220
|
+
...genOnColors(colors)
|
125
221
|
}
|
126
222
|
};
|
127
|
-
if (parsedOptions.variations) {
|
128
|
-
for (const name of parsedOptions.variations.colors) {
|
129
|
-
const color = theme.colors[name];
|
130
|
-
if (!color) continue;
|
131
|
-
for (const variation of ['lighten', 'darken']) {
|
132
|
-
const fn = variation === 'lighten' ? lighten : darken;
|
133
|
-
for (const amount of createRange(parsedOptions.variations[variation], 1)) {
|
134
|
-
theme.colors[`${name}-${variation}-${amount}`] = RGBtoHex(fn(parseColor(color), amount));
|
135
|
-
}
|
136
|
-
}
|
137
|
-
}
|
138
|
-
}
|
139
|
-
for (const color of Object.keys(theme.colors)) {
|
140
|
-
if (/^on-[a-z]/.test(color) || theme.colors[`on-${color}`]) continue;
|
141
|
-
const onColor = `on-${color}`;
|
142
|
-
const colorVal = parseColor(theme.colors[color]);
|
143
|
-
theme.colors[onColor] = getForeground(colorVal);
|
144
|
-
}
|
145
223
|
}
|
146
224
|
return acc;
|
147
225
|
});
|
148
226
|
const current = computed(() => computedThemes.value[name.value]);
|
149
|
-
function createCssClass(lines, selector, content) {
|
150
|
-
lines.push(`${getScopedSelector(selector)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
|
151
|
-
}
|
152
|
-
function getScopedSelector(selector) {
|
153
|
-
if (!parsedOptions.scope) {
|
154
|
-
return selector;
|
155
|
-
}
|
156
|
-
const scopeSelector = `:where(${parsedOptions.scope})`;
|
157
|
-
if (selector === ':root') {
|
158
|
-
return scopeSelector;
|
159
|
-
}
|
160
|
-
return `${scopeSelector} ${selector}`;
|
161
|
-
}
|
162
227
|
const styles = computed(() => {
|
163
228
|
const lines = [];
|
229
|
+
const important = parsedOptions.unimportant ? '' : ' !important';
|
230
|
+
const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
|
164
231
|
if (current.value?.dark) {
|
165
|
-
createCssClass(lines, ':root', ['color-scheme: dark']);
|
232
|
+
createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
|
166
233
|
}
|
167
|
-
createCssClass(lines, ':root', genCssVariables(current.value));
|
234
|
+
createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
|
168
235
|
for (const [themeName, theme] of Object.entries(computedThemes.value)) {
|
169
|
-
createCssClass(lines,
|
236
|
+
createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
|
170
237
|
}
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
238
|
+
if (parsedOptions.utilities) {
|
239
|
+
const bgLines = [];
|
240
|
+
const fgLines = [];
|
241
|
+
const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
|
242
|
+
for (const key of colors) {
|
243
|
+
if (key.startsWith('on-')) {
|
244
|
+
createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
245
|
+
} else {
|
246
|
+
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);
|
247
|
+
createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
|
248
|
+
createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
|
249
|
+
}
|
181
250
|
}
|
251
|
+
lines.push(...bgLines, ...fgLines);
|
182
252
|
}
|
183
|
-
lines.push(...bgLines, ...fgLines);
|
184
253
|
return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
|
185
254
|
});
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
255
|
+
const themeClasses = computed(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
|
256
|
+
const themeNames = computed(() => Object.keys(computedThemes.value));
|
257
|
+
if (SUPPORTS_MATCH_MEDIA) {
|
258
|
+
const media = window.matchMedia('(prefers-color-scheme: dark)');
|
259
|
+
function updateSystemName() {
|
260
|
+
systemName.value = media.matches ? 'dark' : 'light';
|
261
|
+
}
|
262
|
+
updateSystemName();
|
263
|
+
media.addEventListener('change', updateSystemName, {
|
264
|
+
passive: true
|
265
|
+
});
|
266
|
+
if (getCurrentScope()) {
|
267
|
+
onScopeDispose(() => {
|
268
|
+
media.removeEventListener('change', updateSystemName);
|
269
|
+
});
|
270
|
+
}
|
194
271
|
}
|
195
272
|
function install(app) {
|
196
273
|
if (parsedOptions.isDisabled) return;
|
197
274
|
const head = app._context.provides.usehead;
|
198
275
|
if (head) {
|
276
|
+
function getHead() {
|
277
|
+
return {
|
278
|
+
style: [{
|
279
|
+
textContent: styles.value,
|
280
|
+
id: parsedOptions.stylesheetId,
|
281
|
+
nonce: parsedOptions.cspNonce || false
|
282
|
+
}]
|
283
|
+
};
|
284
|
+
}
|
199
285
|
if (head.push) {
|
200
286
|
const entry = head.push(getHead);
|
201
287
|
if (IN_BROWSER) {
|
@@ -212,7 +298,6 @@ export function createTheme(options) {
|
|
212
298
|
}
|
213
299
|
}
|
214
300
|
} else {
|
215
|
-
let styleEl = IN_BROWSER ? document.getElementById(parsedOptions.stylesheetId) : null;
|
216
301
|
if (IN_BROWSER) {
|
217
302
|
watch(styles, updateStyles, {
|
218
303
|
immediate: true
|
@@ -221,30 +306,55 @@ export function createTheme(options) {
|
|
221
306
|
updateStyles();
|
222
307
|
}
|
223
308
|
function updateStyles() {
|
224
|
-
|
225
|
-
const el = document.createElement('style');
|
226
|
-
el.type = 'text/css';
|
227
|
-
el.id = parsedOptions.stylesheetId;
|
228
|
-
if (parsedOptions.cspNonce) el.setAttribute('nonce', parsedOptions.cspNonce);
|
229
|
-
styleEl = el;
|
230
|
-
document.head.appendChild(styleEl);
|
231
|
-
}
|
232
|
-
if (styleEl) styleEl.innerHTML = styles.value;
|
309
|
+
upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
|
233
310
|
}
|
234
311
|
}
|
235
312
|
}
|
236
|
-
|
313
|
+
function change(themeName) {
|
314
|
+
if (!themeNames.value.includes(themeName)) {
|
315
|
+
consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
|
316
|
+
return;
|
317
|
+
}
|
318
|
+
name.value = themeName;
|
319
|
+
}
|
320
|
+
function cycle() {
|
321
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
|
322
|
+
const currentIndex = themeArray.indexOf(name.value);
|
323
|
+
const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
|
324
|
+
change(themeArray[nextIndex]);
|
325
|
+
}
|
326
|
+
function toggle() {
|
327
|
+
let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
|
328
|
+
cycle(themeArray);
|
329
|
+
}
|
330
|
+
const globalName = new Proxy(name, {
|
331
|
+
get(target, prop) {
|
332
|
+
return target[prop];
|
333
|
+
},
|
334
|
+
set(target, prop, val) {
|
335
|
+
if (prop === 'value') {
|
336
|
+
deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
|
337
|
+
}
|
338
|
+
// @ts-expect-error
|
339
|
+
target[prop] = val;
|
340
|
+
return true;
|
341
|
+
}
|
342
|
+
});
|
237
343
|
return {
|
238
344
|
install,
|
345
|
+
change,
|
346
|
+
cycle,
|
347
|
+
toggle,
|
239
348
|
isDisabled: parsedOptions.isDisabled,
|
240
349
|
name,
|
241
350
|
themes,
|
242
351
|
current,
|
243
352
|
computedThemes,
|
353
|
+
prefix: parsedOptions.prefix,
|
244
354
|
themeClasses,
|
245
355
|
styles,
|
246
356
|
global: {
|
247
|
-
name,
|
357
|
+
name: globalName,
|
248
358
|
current
|
249
359
|
}
|
250
360
|
};
|
@@ -253,11 +363,9 @@ export function provideTheme(props) {
|
|
253
363
|
getCurrentInstance('provideTheme');
|
254
364
|
const theme = inject(ThemeSymbol, null);
|
255
365
|
if (!theme) throw new Error('Could not find Vuetify theme injection');
|
256
|
-
const name = computed(() =>
|
257
|
-
return props.theme ?? theme.name.value;
|
258
|
-
});
|
366
|
+
const name = computed(() => props.theme ?? theme.name.value);
|
259
367
|
const current = computed(() => theme.themes.value[name.value]);
|
260
|
-
const themeClasses = computed(() => theme.isDisabled ? undefined :
|
368
|
+
const themeClasses = computed(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
|
261
369
|
const newTheme = {
|
262
370
|
...theme,
|
263
371
|
name,
|
@@ -273,22 +381,4 @@ export function useTheme() {
|
|
273
381
|
if (!theme) throw new Error('Could not find Vuetify theme injection');
|
274
382
|
return theme;
|
275
383
|
}
|
276
|
-
function genCssVariables(theme) {
|
277
|
-
const lightOverlay = theme.dark ? 2 : 1;
|
278
|
-
const darkOverlay = theme.dark ? 1 : 2;
|
279
|
-
const variables = [];
|
280
|
-
for (const [key, value] of Object.entries(theme.colors)) {
|
281
|
-
const rgb = parseColor(value);
|
282
|
-
variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
|
283
|
-
if (!key.startsWith('on-')) {
|
284
|
-
variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
|
285
|
-
}
|
286
|
-
}
|
287
|
-
for (const [key, value] of Object.entries(theme.variables)) {
|
288
|
-
const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
|
289
|
-
const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
|
290
|
-
variables.push(`--v-${key}: ${rgb ?? value}`);
|
291
|
-
}
|
292
|
-
return variables;
|
293
|
-
}
|
294
384
|
//# sourceMappingURL=theme.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"theme.js","names":["computed","inject","provide","ref","watch","watchEffect","createRange","darken","getCurrentInstance","getForeground","getLuma","IN_BROWSER","lighten","mergeDeep","parseColor","propsFactory","RGBtoHex","ThemeSymbol","Symbol","for","makeThemeProps","theme","String","genDefaults","defaultTheme","variations","colors","themes","light","dark","background","surface","primary","secondary","error","info","success","warning","variables","stylesheetId","parseThemeOptions","options","arguments","length","undefined","defaults","isDisabled","key","Object","entries","createTheme","parsedOptions","name","computedThemes","acc","original","value","color","variation","fn","amount","keys","test","onColor","colorVal","current","createCssClass","lines","selector","content","push","getScopedSelector","map","line","scope","scopeSelector","styles","genCssVariables","themeName","bgLines","fgLines","Set","values","flatMap","str","i","join","getHead","style","textContent","id","nonce","cspNonce","install","app","head","_context","provides","usehead","entry","patch","addHeadObjs","updateDOM","styleEl","document","getElementById","updateStyles","immediate","el","createElement","type","setAttribute","appendChild","innerHTML","themeClasses","global","provideTheme","props","Error","newTheme","useTheme","lightOverlay","darkOverlay","rgb","r","g","b","startsWith"],"sources":["../../src/composables/theme.ts"],"sourcesContent":["// Utilities\nimport {\n computed,\n inject,\n provide,\n ref,\n watch,\n watchEffect,\n} from 'vue'\nimport {\n createRange,\n darken,\n getCurrentInstance,\n getForeground,\n getLuma,\n IN_BROWSER,\n lighten,\n mergeDeep,\n parseColor,\n propsFactory,\n RGBtoHex,\n} from '@/util'\n\n// Types\nimport type { VueHeadClient } from '@unhead/vue'\nimport type { HeadClient } from '@vueuse/head'\nimport type { App, DeepReadonly, InjectionKey, Ref } from 'vue'\n\ntype DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T\n\nexport type ThemeOptions = false | {\n cspNonce?: string\n defaultTheme?: string\n variations?: false | VariationsOptions\n themes?: Record<string, ThemeDefinition>\n stylesheetId?: string\n scope?: string\n}\nexport type ThemeDefinition = DeepPartial<InternalThemeDefinition>\n\ninterface InternalThemeOptions {\n cspNonce?: string\n isDisabled: boolean\n defaultTheme: string\n variations: false | VariationsOptions\n themes: Record<string, InternalThemeDefinition>\n stylesheetId: string\n scope?: string\n}\n\ninterface VariationsOptions {\n colors: string[]\n lighten: number\n darken: number\n}\n\ninterface InternalThemeDefinition {\n dark: boolean\n colors: Colors\n variables: Record<string, string | number>\n}\n\nexport interface Colors extends BaseColors, OnColors {\n [key: string]: string\n}\n\ninterface BaseColors {\n background: string\n surface: string\n primary: string\n secondary: string\n success: string\n warning: string\n error: string\n info: string\n}\n\ninterface OnColors {\n 'on-background': string\n 'on-surface': string\n 'on-primary': string\n 'on-secondary': string\n 'on-success': string\n 'on-warning': string\n 'on-error': string\n 'on-info': string\n}\n\nexport interface ThemeInstance {\n readonly isDisabled: boolean\n readonly themes: Ref<Record<string, InternalThemeDefinition>>\n\n readonly name: Readonly<Ref<string>>\n readonly current: DeepReadonly<Ref<InternalThemeDefinition>>\n readonly computedThemes: DeepReadonly<Ref<Record<string, InternalThemeDefinition>>>\n\n readonly themeClasses: Readonly<Ref<string | undefined>>\n readonly styles: Readonly<Ref<string>>\n\n readonly global: {\n readonly name: Ref<string>\n readonly current: DeepReadonly<Ref<InternalThemeDefinition>>\n }\n}\n\nexport const ThemeSymbol: InjectionKey<ThemeInstance> = Symbol.for('vuetify:theme')\n\nexport const makeThemeProps = propsFactory({\n theme: String,\n}, 'theme')\n\nfunction genDefaults () {\n return {\n defaultTheme: 'light',\n variations: { colors: [], lighten: 0, darken: 0 },\n themes: {\n light: {\n dark: false,\n colors: {\n background: '#FFFFFF',\n surface: '#FFFFFF',\n 'surface-bright': '#FFFFFF',\n 'surface-light': '#EEEEEE',\n 'surface-variant': '#424242',\n 'on-surface-variant': '#EEEEEE',\n primary: '#1867C0',\n 'primary-darken-1': '#1F5592',\n secondary: '#48A9A6',\n 'secondary-darken-1': '#018786',\n error: '#B00020',\n info: '#2196F3',\n success: '#4CAF50',\n warning: '#FB8C00',\n },\n variables: {\n 'border-color': '#000000',\n 'border-opacity': 0.12,\n 'high-emphasis-opacity': 0.87,\n 'medium-emphasis-opacity': 0.60,\n 'disabled-opacity': 0.38,\n 'idle-opacity': 0.04,\n 'hover-opacity': 0.04,\n 'focus-opacity': 0.12,\n 'selected-opacity': 0.08,\n 'activated-opacity': 0.12,\n 'pressed-opacity': 0.12,\n 'dragged-opacity': 0.08,\n 'theme-kbd': '#212529',\n 'theme-on-kbd': '#FFFFFF',\n 'theme-code': '#F5F5F5',\n 'theme-on-code': '#000000',\n },\n },\n dark: {\n dark: true,\n colors: {\n background: '#121212',\n surface: '#212121',\n 'surface-bright': '#ccbfd6',\n 'surface-light': '#424242',\n 'surface-variant': '#a3a3a3',\n 'on-surface-variant': '#424242',\n primary: '#2196F3',\n 'primary-darken-1': '#277CC1',\n secondary: '#54B6B2',\n 'secondary-darken-1': '#48A9A6',\n error: '#CF6679',\n info: '#2196F3',\n success: '#4CAF50',\n warning: '#FB8C00',\n },\n variables: {\n 'border-color': '#FFFFFF',\n 'border-opacity': 0.12,\n 'high-emphasis-opacity': 1,\n 'medium-emphasis-opacity': 0.70,\n 'disabled-opacity': 0.50,\n 'idle-opacity': 0.10,\n 'hover-opacity': 0.04,\n 'focus-opacity': 0.12,\n 'selected-opacity': 0.08,\n 'activated-opacity': 0.12,\n 'pressed-opacity': 0.16,\n 'dragged-opacity': 0.08,\n 'theme-kbd': '#212529',\n 'theme-on-kbd': '#FFFFFF',\n 'theme-code': '#343434',\n 'theme-on-code': '#CCCCCC',\n },\n },\n },\n stylesheetId: 'vuetify-theme-stylesheet',\n }\n}\n\nfunction parseThemeOptions (options: ThemeOptions = genDefaults()): InternalThemeOptions {\n const defaults = genDefaults()\n\n if (!options) return { ...defaults, isDisabled: true } as any\n\n const themes: Record<string, InternalThemeDefinition> = {}\n for (const [key, theme] of Object.entries(options.themes ?? {})) {\n const defaultTheme = theme.dark || key === 'dark'\n ? defaults.themes?.dark\n : defaults.themes?.light\n themes[key] = mergeDeep(defaultTheme, theme) as InternalThemeDefinition\n }\n\n return mergeDeep(\n defaults,\n { ...options, themes },\n ) as InternalThemeOptions\n}\n\n// Composables\nexport function createTheme (options?: ThemeOptions): ThemeInstance & { install: (app: App) => void } {\n const parsedOptions = parseThemeOptions(options)\n const name = ref(parsedOptions.defaultTheme)\n const themes = ref(parsedOptions.themes)\n\n const computedThemes = computed(() => {\n const acc: Record<string, InternalThemeDefinition> = {}\n for (const [name, original] of Object.entries(themes.value)) {\n const theme: InternalThemeDefinition = acc[name] = {\n ...original,\n colors: {\n ...original.colors,\n },\n }\n\n if (parsedOptions.variations) {\n for (const name of parsedOptions.variations.colors) {\n const color = theme.colors[name]\n\n if (!color) continue\n\n for (const variation of (['lighten', 'darken'] as const)) {\n const fn = variation === 'lighten' ? lighten : darken\n for (const amount of createRange(parsedOptions.variations[variation], 1)) {\n theme.colors[`${name}-${variation}-${amount}`] = RGBtoHex(fn(parseColor(color), amount))\n }\n }\n }\n }\n\n for (const color of Object.keys(theme.colors)) {\n if (/^on-[a-z]/.test(color) || theme.colors[`on-${color}`]) continue\n\n const onColor = `on-${color}` as keyof OnColors\n const colorVal = parseColor(theme.colors[color]!)\n\n theme.colors[onColor] = getForeground(colorVal)\n }\n }\n\n return acc\n })\n const current = computed(() => computedThemes.value[name.value])\n\n function createCssClass (lines: string[], selector: string, content: string[]) {\n lines.push(\n `${getScopedSelector(selector)} {\\n`,\n ...content.map(line => ` ${line};\\n`),\n '}\\n',\n )\n }\n\n function getScopedSelector (selector: string) {\n if (!parsedOptions.scope) {\n return selector\n }\n const scopeSelector = `:where(${parsedOptions.scope})`\n if (selector === ':root') {\n return scopeSelector\n }\n return `${scopeSelector} ${selector}`\n }\n\n const styles = computed(() => {\n const lines: string[] = []\n\n if (current.value?.dark) {\n createCssClass(lines, ':root', ['color-scheme: dark'])\n }\n\n createCssClass(lines, ':root', genCssVariables(current.value))\n\n for (const [themeName, theme] of Object.entries(computedThemes.value)) {\n createCssClass(lines, `.v-theme--${themeName}`, [\n `color-scheme: ${theme.dark ? 'dark' : 'normal'}`,\n ...genCssVariables(theme),\n ])\n }\n\n const bgLines: string[] = []\n const fgLines: string[] = []\n\n const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)))\n for (const key of colors) {\n if (/^on-[a-z]/.test(key)) {\n createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`])\n } else {\n createCssClass(bgLines, `.bg-${key}`, [\n `--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`,\n `background-color: rgb(var(--v-theme-${key})) !important`,\n `color: rgb(var(--v-theme-on-${key})) !important`,\n ])\n createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`])\n createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`])\n }\n }\n\n lines.push(...bgLines, ...fgLines)\n\n return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('')\n })\n\n function getHead () {\n return {\n style: [{\n textContent: styles.value,\n id: parsedOptions.stylesheetId,\n nonce: parsedOptions.cspNonce || false as never,\n }],\n }\n }\n\n function install (app: App) {\n if (parsedOptions.isDisabled) return\n\n const head = app._context.provides.usehead as HeadClient & VueHeadClient<any> | undefined\n if (head) {\n if (head.push) {\n const entry = head.push(getHead)\n if (IN_BROWSER) {\n watch(styles, () => { entry.patch(getHead) })\n }\n } else {\n if (IN_BROWSER) {\n head.addHeadObjs(computed(getHead))\n watchEffect(() => head.updateDOM())\n } else {\n head.addHeadObjs(getHead())\n }\n }\n } else {\n let styleEl = IN_BROWSER\n ? document.getElementById(parsedOptions.stylesheetId)\n : null\n\n if (IN_BROWSER) {\n watch(styles, updateStyles, { immediate: true })\n } else {\n updateStyles()\n }\n\n function updateStyles () {\n if (typeof document !== 'undefined' && !styleEl) {\n const el = document.createElement('style')\n el.type = 'text/css'\n el.id = parsedOptions.stylesheetId\n if (parsedOptions.cspNonce) el.setAttribute('nonce', parsedOptions.cspNonce)\n\n styleEl = el\n document.head.appendChild(styleEl)\n }\n\n if (styleEl) styleEl.innerHTML = styles.value\n }\n }\n }\n\n const themeClasses = computed(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`)\n\n return {\n install,\n isDisabled: parsedOptions.isDisabled,\n name,\n themes,\n current,\n computedThemes,\n themeClasses,\n styles,\n global: {\n name,\n current,\n },\n }\n}\n\nexport function provideTheme (props: { theme?: string }) {\n getCurrentInstance('provideTheme')\n\n const theme = inject(ThemeSymbol, null)\n\n if (!theme) throw new Error('Could not find Vuetify theme injection')\n\n const name = computed<string>(() => {\n return props.theme ?? theme.name.value\n })\n const current = computed(() => theme.themes.value[name.value])\n\n const themeClasses = computed(() => theme.isDisabled ? undefined : `v-theme--${name.value}`)\n\n const newTheme: ThemeInstance = {\n ...theme,\n name,\n current,\n themeClasses,\n }\n\n provide(ThemeSymbol, newTheme)\n\n return newTheme\n}\n\nexport function useTheme () {\n getCurrentInstance('useTheme')\n\n const theme = inject(ThemeSymbol, null)\n\n if (!theme) throw new Error('Could not find Vuetify theme injection')\n\n return theme\n}\n\nfunction genCssVariables (theme: InternalThemeDefinition) {\n const lightOverlay = theme.dark ? 2 : 1\n const darkOverlay = theme.dark ? 1 : 2\n\n const variables: string[] = []\n for (const [key, value] of Object.entries(theme.colors)) {\n const rgb = parseColor(value)\n variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`)\n if (!key.startsWith('on-')) {\n variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`)\n }\n }\n\n for (const [key, value] of Object.entries(theme.variables)) {\n const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined\n const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined\n variables.push(`--v-${key}: ${rgb ?? value}`)\n }\n\n return variables\n}\n"],"mappings":"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","ignoreList":[]}
|
1
|
+
{"version":3,"file":"theme.js","names":["computed","getCurrentScope","inject","onScopeDispose","provide","ref","shallowRef","watch","watchEffect","consoleWarn","createRange","darken","deprecate","getCurrentInstance","getForeground","getLuma","IN_BROWSER","lighten","mergeDeep","parseColor","propsFactory","RGBtoHex","SUPPORTS_MATCH_MEDIA","ThemeSymbol","Symbol","for","makeThemeProps","theme","String","genDefaults","defaultTheme","prefix","variations","colors","themes","light","dark","background","surface","primary","secondary","error","info","success","warning","variables","stylesheetId","scoped","unimportant","utilities","parseThemeOptions","options","arguments","length","undefined","defaults","isDisabled","key","Object","entries","createCssClass","lines","selector","content","scope","push","getScopedSelector","map","line","genCssVariables","lightOverlay","darkOverlay","value","rgb","r","g","b","startsWith","color","genVariation","name","object","variation","fn","amount","genVariations","variationColors","genOnColors","onColors","keys","onColor","colorVal","scopeSelector","upsertStyles","id","cspNonce","styles","styleEl","getOrCreateStyleElement","innerHTML","style","document","getElementById","createElement","type","setAttribute","head","appendChild","createTheme","parsedOptions","_name","systemName","get","set","val","computedThemes","acc","original","current","important","themeName","bgLines","fgLines","Set","values","flatMap","str","i","join","themeClasses","themeNames","media","window","matchMedia","updateSystemName","matches","addEventListener","passive","removeEventListener","install","app","_context","provides","usehead","getHead","textContent","nonce","entry","patch","addHeadObjs","updateDOM","updateStyles","immediate","change","includes","cycle","themeArray","currentIndex","indexOf","nextIndex","toggle","globalName","Proxy","target","prop","global","provideTheme","props","Error","newTheme","useTheme"],"sources":["../../src/composables/theme.ts"],"sourcesContent":["// Utilities\nimport {\n computed,\n getCurrentScope,\n inject,\n onScopeDispose,\n provide,\n ref,\n shallowRef,\n watch,\n watchEffect,\n} from 'vue'\nimport {\n consoleWarn,\n createRange,\n darken,\n deprecate,\n getCurrentInstance,\n getForeground,\n getLuma,\n IN_BROWSER,\n lighten,\n mergeDeep,\n parseColor,\n propsFactory,\n RGBtoHex,\n SUPPORTS_MATCH_MEDIA,\n} from '@/util'\n\n// Types\nimport type { VueHeadClient } from '@unhead/vue'\nimport type { HeadClient } from '@vueuse/head'\nimport type { App, DeepReadonly, InjectionKey, Ref } from 'vue'\n\ntype DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T\n\nexport type ThemeOptions = false | {\n cspNonce?: string\n defaultTheme?: 'light' | 'dark' | 'system' | string\n variations?: false | VariationsOptions\n themes?: Record<string, ThemeDefinition>\n stylesheetId?: string\n scope?: string\n unimportant?: boolean\n}\nexport type ThemeDefinition = DeepPartial<InternalThemeDefinition>\n\ninterface InternalThemeOptions {\n cspNonce?: string\n isDisabled: boolean\n defaultTheme: 'light' | 'dark' | 'system' | string\n prefix: string\n variations: false | VariationsOptions\n themes: Record<string, InternalThemeDefinition>\n stylesheetId: string\n scope?: string\n scoped: boolean\n unimportant: boolean\n utilities: boolean\n}\n\ninterface VariationsOptions {\n colors: string[]\n lighten: number\n darken: number\n}\n\ninterface InternalThemeDefinition {\n dark: boolean\n colors: Colors\n variables: Record<string, string | number>\n}\n\nexport interface Colors extends BaseColors, OnColors {\n [key: string]: string\n}\n\ninterface BaseColors {\n background: string\n surface: string\n primary: string\n secondary: string\n success: string\n warning: string\n error: string\n info: string\n}\n\ninterface OnColors {\n 'on-background': string\n 'on-surface': string\n 'on-primary': string\n 'on-secondary': string\n 'on-success': string\n 'on-warning': string\n 'on-error': string\n 'on-info': string\n}\n\nexport interface ThemeInstance {\n change: (themeName: string) => void\n cycle: (themeArray?: string[]) => void\n toggle: (themeArray?: [string, string]) => void\n\n readonly isDisabled: boolean\n readonly themes: Ref<Record<string, InternalThemeDefinition>>\n\n readonly name: Readonly<Ref<string>>\n readonly current: DeepReadonly<Ref<InternalThemeDefinition>>\n readonly computedThemes: DeepReadonly<Ref<Record<string, InternalThemeDefinition>>>\n readonly prefix: string\n\n readonly themeClasses: Readonly<Ref<string | undefined>>\n readonly styles: Readonly<Ref<string>>\n\n readonly global: {\n readonly name: Ref<string>\n readonly current: DeepReadonly<Ref<InternalThemeDefinition>>\n }\n}\n\nexport const ThemeSymbol: InjectionKey<ThemeInstance> = Symbol.for('vuetify:theme')\n\nexport const makeThemeProps = propsFactory({\n theme: String,\n}, 'theme')\n\nfunction genDefaults () {\n return {\n defaultTheme: 'light',\n prefix: 'v-',\n variations: { colors: [], lighten: 0, darken: 0 },\n themes: {\n light: {\n dark: false,\n colors: {\n background: '#FFFFFF',\n surface: '#FFFFFF',\n 'surface-bright': '#FFFFFF',\n 'surface-light': '#EEEEEE',\n 'surface-variant': '#424242',\n 'on-surface-variant': '#EEEEEE',\n primary: '#1867C0',\n 'primary-darken-1': '#1F5592',\n secondary: '#48A9A6',\n 'secondary-darken-1': '#018786',\n error: '#B00020',\n info: '#2196F3',\n success: '#4CAF50',\n warning: '#FB8C00',\n },\n variables: {\n 'border-color': '#000000',\n 'border-opacity': 0.12,\n 'high-emphasis-opacity': 0.87,\n 'medium-emphasis-opacity': 0.60,\n 'disabled-opacity': 0.38,\n 'idle-opacity': 0.04,\n 'hover-opacity': 0.04,\n 'focus-opacity': 0.12,\n 'selected-opacity': 0.08,\n 'activated-opacity': 0.12,\n 'pressed-opacity': 0.12,\n 'dragged-opacity': 0.08,\n 'theme-kbd': '#212529',\n 'theme-on-kbd': '#FFFFFF',\n 'theme-code': '#F5F5F5',\n 'theme-on-code': '#000000',\n },\n },\n dark: {\n dark: true,\n colors: {\n background: '#121212',\n surface: '#212121',\n 'surface-bright': '#ccbfd6',\n 'surface-light': '#424242',\n 'surface-variant': '#a3a3a3',\n 'on-surface-variant': '#424242',\n primary: '#2196F3',\n 'primary-darken-1': '#277CC1',\n secondary: '#54B6B2',\n 'secondary-darken-1': '#48A9A6',\n error: '#CF6679',\n info: '#2196F3',\n success: '#4CAF50',\n warning: '#FB8C00',\n },\n variables: {\n 'border-color': '#FFFFFF',\n 'border-opacity': 0.12,\n 'high-emphasis-opacity': 1,\n 'medium-emphasis-opacity': 0.70,\n 'disabled-opacity': 0.50,\n 'idle-opacity': 0.10,\n 'hover-opacity': 0.04,\n 'focus-opacity': 0.12,\n 'selected-opacity': 0.08,\n 'activated-opacity': 0.12,\n 'pressed-opacity': 0.16,\n 'dragged-opacity': 0.08,\n 'theme-kbd': '#212529',\n 'theme-on-kbd': '#FFFFFF',\n 'theme-code': '#343434',\n 'theme-on-code': '#CCCCCC',\n },\n },\n },\n stylesheetId: 'vuetify-theme-stylesheet',\n scoped: false,\n unimportant: false,\n utilities: true,\n }\n}\n\nfunction parseThemeOptions (options: ThemeOptions = genDefaults()): InternalThemeOptions {\n const defaults = genDefaults()\n\n if (!options) return { ...defaults, isDisabled: true } as any\n\n const themes: Record<string, InternalThemeDefinition> = {}\n for (const [key, theme] of Object.entries(options.themes ?? {})) {\n const defaultTheme = theme.dark || key === 'dark'\n ? defaults.themes?.dark\n : defaults.themes?.light\n themes[key] = mergeDeep(defaultTheme, theme) as InternalThemeDefinition\n }\n\n return mergeDeep(\n defaults,\n { ...options, themes },\n ) as InternalThemeOptions\n}\n\nfunction createCssClass (lines: string[], selector: string, content: string[], scope?: string) {\n lines.push(\n `${getScopedSelector(selector, scope)} {\\n`,\n ...content.map(line => ` ${line};\\n`),\n '}\\n',\n )\n}\n\nfunction genCssVariables (theme: InternalThemeDefinition, prefix: string) {\n const lightOverlay = theme.dark ? 2 : 1\n const darkOverlay = theme.dark ? 1 : 2\n\n const variables: string[] = []\n for (const [key, value] of Object.entries(theme.colors)) {\n const rgb = parseColor(value)\n variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`)\n if (!key.startsWith('on-')) {\n variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`)\n }\n }\n\n for (const [key, value] of Object.entries(theme.variables)) {\n const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined\n const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined\n variables.push(`--${prefix}${key}: ${rgb ?? value}`)\n }\n\n return variables\n}\n\nfunction genVariation (name: string, color: string, variations: VariationsOptions | false) {\n const object: Record<string, string> = {}\n if (variations) {\n for (const variation of (['lighten', 'darken'] as const)) {\n const fn = variation === 'lighten' ? lighten : darken\n for (const amount of createRange(variations[variation], 1)) {\n object[`${name}-${variation}-${amount}`] = RGBtoHex(fn(parseColor(color), amount))\n }\n }\n }\n return object\n}\n\nfunction genVariations (colors: InternalThemeDefinition['colors'], variations: VariationsOptions | false) {\n if (!variations) return {}\n\n let variationColors = {}\n for (const name of variations.colors) {\n const color = colors[name]\n\n if (!color) continue\n\n variationColors = {\n ...variationColors,\n ...genVariation(name, color, variations),\n }\n }\n return variationColors\n}\n\nfunction genOnColors (colors: InternalThemeDefinition['colors']) {\n const onColors = {} as InternalThemeDefinition['colors']\n\n for (const color of Object.keys(colors)) {\n if (color.startsWith('on-') || colors[`on-${color}`]) continue\n\n const onColor = `on-${color}` as keyof OnColors\n const colorVal = parseColor(colors[color])\n\n onColors[onColor] = getForeground(colorVal)\n }\n\n return onColors\n}\n\nfunction getScopedSelector (selector: string, scope?: string) {\n if (!scope) return selector\n\n const scopeSelector = `:where(${scope})`\n\n return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`\n}\n\nfunction upsertStyles (id: string, cspNonce: string | undefined, styles: string) {\n const styleEl = getOrCreateStyleElement(id, cspNonce)\n\n if (!styleEl) return\n\n styleEl.innerHTML = styles\n}\n\nfunction getOrCreateStyleElement (id: string, cspNonce?: string) {\n if (!IN_BROWSER) return null\n\n let style = document.getElementById(id) as HTMLStyleElement | null\n\n if (!style) {\n style = document.createElement('style')\n style.id = id\n style.type = 'text/css'\n\n if (cspNonce) style.setAttribute('nonce', cspNonce)\n\n document.head.appendChild(style)\n }\n\n return style\n}\n\n// Composables\nexport function createTheme (options?: ThemeOptions): ThemeInstance & { install: (app: App) => void } {\n const parsedOptions = parseThemeOptions(options)\n const _name = shallowRef(parsedOptions.defaultTheme)\n const themes = ref(parsedOptions.themes)\n const systemName = shallowRef('light')\n\n const name = computed({\n get () {\n return _name.value === 'system' ? systemName.value : _name.value\n },\n set (val: string) {\n _name.value = val\n },\n })\n\n const computedThemes = computed(() => {\n const acc: Record<string, InternalThemeDefinition> = {}\n for (const [name, original] of Object.entries(themes.value)) {\n const colors = {\n ...original.colors,\n ...genVariations(original.colors, parsedOptions.variations),\n }\n\n acc[name] = {\n ...original,\n colors: {\n ...colors,\n ...genOnColors(colors),\n },\n }\n }\n return acc\n })\n\n const current = computed(() => computedThemes.value[name.value])\n\n const styles = computed(() => {\n const lines: string[] = []\n const important = parsedOptions.unimportant ? '' : ' !important'\n const scoped = parsedOptions.scoped ? parsedOptions.prefix : ''\n\n if (current.value?.dark) {\n createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope)\n }\n\n createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope)\n\n for (const [themeName, theme] of Object.entries(computedThemes.value)) {\n createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [\n `color-scheme: ${theme.dark ? 'dark' : 'normal'}`,\n ...genCssVariables(theme, parsedOptions.prefix),\n ], parsedOptions.scope)\n }\n\n if (parsedOptions.utilities) {\n const bgLines: string[] = []\n const fgLines: string[] = []\n\n const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)))\n for (const key of colors) {\n if (key.startsWith('on-')) {\n createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope)\n } else {\n createCssClass(bgLines, `.${scoped}bg-${key}`, [\n `--${parsedOptions.prefix}theme-overlay-multiplier: var(--${parsedOptions.prefix}theme-${key}-overlay-multiplier)`,\n `background-color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`,\n `color: rgb(var(--${parsedOptions.prefix}theme-on-${key}))${important}`,\n ], parsedOptions.scope)\n createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope)\n createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope)\n }\n }\n\n lines.push(...bgLines, ...fgLines)\n }\n\n return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('')\n })\n\n const themeClasses = computed(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`)\n const themeNames = computed(() => Object.keys(computedThemes.value))\n\n if (SUPPORTS_MATCH_MEDIA) {\n const media = window.matchMedia('(prefers-color-scheme: dark)')\n\n function updateSystemName () {\n systemName.value = media.matches ? 'dark' : 'light'\n }\n\n updateSystemName()\n\n media.addEventListener('change', updateSystemName, { passive: true })\n\n if (getCurrentScope()) {\n onScopeDispose(() => {\n media.removeEventListener('change', updateSystemName)\n })\n }\n }\n\n function install (app: App) {\n if (parsedOptions.isDisabled) return\n\n const head = app._context.provides.usehead as HeadClient & VueHeadClient<any> | undefined\n if (head) {\n function getHead () {\n return {\n style: [{\n textContent: styles.value,\n id: parsedOptions.stylesheetId,\n nonce: parsedOptions.cspNonce || false as never,\n }],\n }\n }\n\n if (head.push) {\n const entry = head.push(getHead)\n if (IN_BROWSER) {\n watch(styles, () => { entry.patch(getHead) })\n }\n } else {\n if (IN_BROWSER) {\n head.addHeadObjs(computed(getHead))\n watchEffect(() => head.updateDOM())\n } else {\n head.addHeadObjs(getHead())\n }\n }\n } else {\n if (IN_BROWSER) {\n watch(styles, updateStyles, { immediate: true })\n } else {\n updateStyles()\n }\n\n function updateStyles () {\n upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value)\n }\n }\n }\n\n function change (themeName: string) {\n if (!themeNames.value.includes(themeName)) {\n consoleWarn(`Theme \"${themeName}\" not found on the Vuetify theme instance`)\n return\n }\n\n name.value = themeName\n }\n\n function cycle (themeArray: string[] = themeNames.value) {\n const currentIndex = themeArray.indexOf(name.value)\n const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length\n\n change(themeArray[nextIndex])\n }\n\n function toggle (themeArray: [string, string] = ['light', 'dark']) {\n cycle(themeArray)\n }\n\n const globalName = new Proxy(name, {\n get (target, prop) {\n return target[prop as keyof typeof target]\n },\n set (target, prop, val) {\n if (prop === 'value') {\n deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`)\n }\n // @ts-expect-error\n target[prop] = val\n return true\n },\n }) as typeof name\n\n return {\n install,\n change,\n cycle,\n toggle,\n isDisabled: parsedOptions.isDisabled,\n name,\n themes,\n current,\n computedThemes,\n prefix: parsedOptions.prefix,\n themeClasses,\n styles,\n global: {\n name: globalName,\n current,\n },\n }\n}\n\nexport function provideTheme (props: { theme?: string }) {\n getCurrentInstance('provideTheme')\n\n const theme = inject(ThemeSymbol, null)\n\n if (!theme) throw new Error('Could not find Vuetify theme injection')\n\n const name = computed(() => props.theme ?? theme.name.value)\n const current = computed(() => theme.themes.value[name.value])\n\n const themeClasses = computed(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`)\n\n const newTheme: ThemeInstance = {\n ...theme,\n name,\n current,\n themeClasses,\n }\n\n provide(ThemeSymbol, newTheme)\n\n return newTheme\n}\n\nexport function useTheme () {\n getCurrentInstance('useTheme')\n\n const theme = inject(ThemeSymbol, null)\n\n if (!theme) throw new Error('Could not find Vuetify theme injection')\n\n return theme\n}\n"],"mappings":"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","ignoreList":[]}
|
@@ -107,7 +107,12 @@ export function useVirtual(props, items) {
|
|
107
107
|
}
|
108
108
|
function calculateOffset(index) {
|
109
109
|
index = clamp(index, 0, items.value.length - 1);
|
110
|
-
|
110
|
+
const whole = Math.floor(index);
|
111
|
+
const fraction = index % 1;
|
112
|
+
const next = whole + 1;
|
113
|
+
const wholeOffset = offsets[whole] || 0;
|
114
|
+
const nextOffset = offsets[next] || wholeOffset;
|
115
|
+
return wholeOffset + (nextOffset - wholeOffset) * fraction;
|
111
116
|
}
|
112
117
|
function calculateIndex(scrollTop) {
|
113
118
|
return binaryClosest(offsets, scrollTop);
|