@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.
@@ -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: {
@@ -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 name = ref(parsedOptions.defaultTheme);
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 theme = acc[name] = {
212
+ const colors = {
213
+ ...original.colors,
214
+ ...genVariations(original.colors, parsedOptions.variations)
215
+ };
216
+ acc[name] = {
122
217
  ...original,
123
218
  colors: {
124
- ...original.colors
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, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)]);
236
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
170
237
  }
171
- const bgLines = [];
172
- const fgLines = [];
173
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
174
- for (const key of colors) {
175
- if (/^on-[a-z]/.test(key)) {
176
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`]);
177
- } else {
178
- createCssClass(bgLines, `.bg-${key}`, [`--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--v-theme-${key})) !important`, `color: rgb(var(--v-theme-on-${key})) !important`]);
179
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`]);
180
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`]);
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
- function getHead() {
187
- return {
188
- style: [{
189
- textContent: styles.value,
190
- id: parsedOptions.stylesheetId,
191
- nonce: parsedOptions.cspNonce || false
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
- if (typeof document !== 'undefined' && !styleEl) {
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
- const themeClasses = computed(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
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 : `v-theme--${name.value}`);
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":"AAAA;AACA,SACEA,QAAQ,EACRC,MAAM,EACNC,OAAO,EACPC,GAAG,EACHC,KAAK,EACLC,WAAW,QACN,KAAK;AAAA,SAEVC,WAAW,EACXC,MAAM,EACNC,kBAAkB,EAClBC,aAAa,EACbC,OAAO,EACPC,UAAU,EACVC,OAAO,EACPC,SAAS,EACTC,UAAU,EACVC,YAAY,EACZC,QAAQ,4BAGV;AAkFA,OAAO,MAAMC,WAAwC,GAAGC,MAAM,CAACC,GAAG,CAAC,eAAe,CAAC;AAEnF,OAAO,MAAMC,cAAc,GAAGL,YAAY,CAAC;EACzCM,KAAK,EAAEC;AACT,CAAC,EAAE,OAAO,CAAC;AAEX,SAASC,WAAWA,CAAA,EAAI;EACtB,OAAO;IACLC,YAAY,EAAE,OAAO;IACrBC,UAAU,EAAE;MAAEC,MAAM,EAAE,EAAE;MAAEd,OAAO,EAAE,CAAC;MAAEL,MAAM,EAAE;IAAE,CAAC;IACjDoB,MAAM,EAAE;MACNC,KAAK,EAAE;QACLC,IAAI,EAAE,KAAK;QACXH,MAAM,EAAE;UACNI,UAAU,EAAE,SAAS;UACrBC,OAAO,EAAE,SAAS;UAClB,gBAAgB,EAAE,SAAS;UAC3B,eAAe,EAAE,SAAS;UAC1B,iBAAiB,EAAE,SAAS;UAC5B,oBAAoB,EAAE,SAAS;UAC/BC,OAAO,EAAE,SAAS;UAClB,kBAAkB,EAAE,SAAS;UAC7BC,SAAS,EAAE,SAAS;UACpB,oBAAoB,EAAE,SAAS;UAC/BC,KAAK,EAAE,SAAS;UAChBC,IAAI,EAAE,SAAS;UACfC,OAAO,EAAE,SAAS;UAClBC,OAAO,EAAE;QACX,CAAC;QACDC,SAAS,EAAE;UACT,cAAc,EAAE,SAAS;UACzB,gBAAgB,EAAE,IAAI;UACtB,uBAAuB,EAAE,IAAI;UAC7B,yBAAyB,EAAE,IAAI;UAC/B,kBAAkB,EAAE,IAAI;UACxB,cAAc,EAAE,IAAI;UACpB,eAAe,EAAE,IAAI;UACrB,eAAe,EAAE,IAAI;UACrB,kBAAkB,EAAE,IAAI;UACxB,mBAAmB,EAAE,IAAI;UACzB,iBAAiB,EAAE,IAAI;UACvB,iBAAiB,EAAE,IAAI;UACvB,WAAW,EAAE,SAAS;UACtB,cAAc,EAAE,SAAS;UACzB,YAAY,EAAE,SAAS;UACvB,eAAe,EAAE;QACnB;MACF,CAAC;MACDT,IAAI,EAAE;QACJA,IAAI,EAAE,IAAI;QACVH,MAAM,EAAE;UACNI,UAAU,EAAE,SAAS;UACrBC,OAAO,EAAE,SAAS;UAClB,gBAAgB,EAAE,SAAS;UAC3B,eAAe,EAAE,SAAS;UAC1B,iBAAiB,EAAE,SAAS;UAC5B,oBAAoB,EAAE,SAAS;UAC/BC,OAAO,EAAE,SAAS;UAClB,kBAAkB,EAAE,SAAS;UAC7BC,SAAS,EAAE,SAAS;UACpB,oBAAoB,EAAE,SAAS;UAC/BC,KAAK,EAAE,SAAS;UAChBC,IAAI,EAAE,SAAS;UACfC,OAAO,EAAE,SAAS;UAClBC,OAAO,EAAE;QACX,CAAC;QACDC,SAAS,EAAE;UACT,cAAc,EAAE,SAAS;UACzB,gBAAgB,EAAE,IAAI;UACtB,uBAAuB,EAAE,CAAC;UAC1B,yBAAyB,EAAE,IAAI;UAC/B,kBAAkB,EAAE,IAAI;UACxB,cAAc,EAAE,IAAI;UACpB,eAAe,EAAE,IAAI;UACrB,eAAe,EAAE,IAAI;UACrB,kBAAkB,EAAE,IAAI;UACxB,mBAAmB,EAAE,IAAI;UACzB,iBAAiB,EAAE,IAAI;UACvB,iBAAiB,EAAE,IAAI;UACvB,WAAW,EAAE,SAAS;UACtB,cAAc,EAAE,SAAS;UACzB,YAAY,EAAE,SAAS;UACvB,eAAe,EAAE;QACnB;MACF;IACF,CAAC;IACDC,YAAY,EAAE;EAChB,CAAC;AACH;AAEA,SAASC,iBAAiBA,CAAA,EAA+D;EAAA,IAA7DC,OAAqB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGnB,WAAW,CAAC,CAAC;EAC/D,MAAMsB,QAAQ,GAAGtB,WAAW,CAAC,CAAC;EAE9B,IAAI,CAACkB,OAAO,EAAE,OAAO;IAAE,GAAGI,QAAQ;IAAEC,UAAU,EAAE;EAAK,CAAC;EAEtD,MAAMnB,MAA+C,GAAG,CAAC,CAAC;EAC1D,KAAK,MAAM,CAACoB,GAAG,EAAE1B,KAAK,CAAC,IAAI2B,MAAM,CAACC,OAAO,CAACR,OAAO,CAACd,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE;IAC/D,MAAMH,YAAY,GAAGH,KAAK,CAACQ,IAAI,IAAIkB,GAAG,KAAK,MAAM,GAC7CF,QAAQ,CAAClB,MAAM,EAAEE,IAAI,GACrBgB,QAAQ,CAAClB,MAAM,EAAEC,KAAK;IAC1BD,MAAM,CAACoB,GAAG,CAAC,GAAGlC,SAAS,CAACW,YAAY,EAAEH,KAAK,CAA4B;EACzE;EAEA,OAAOR,SAAS,CACdgC,QAAQ,EACR;IAAE,GAAGJ,OAAO;IAAEd;EAAO,CACvB,CAAC;AACH;;AAEA;AACA,OAAO,SAASuB,WAAWA,CAAET,OAAsB,EAAmD;EACpG,MAAMU,aAAa,GAAGX,iBAAiB,CAACC,OAAO,CAAC;EAChD,MAAMW,IAAI,GAAGjD,GAAG,CAACgD,aAAa,CAAC3B,YAAY,CAAC;EAC5C,MAAMG,MAAM,GAAGxB,GAAG,CAACgD,aAAa,CAACxB,MAAM,CAAC;EAExC,MAAM0B,cAAc,GAAGrD,QAAQ,CAAC,MAAM;IACpC,MAAMsD,GAA4C,GAAG,CAAC,CAAC;IACvD,KAAK,MAAM,CAACF,IAAI,EAAEG,QAAQ,CAAC,IAAIP,MAAM,CAACC,OAAO,CAACtB,MAAM,CAAC6B,KAAK,CAAC,EAAE;MAC3D,MAAMnC,KAA8B,GAAGiC,GAAG,CAACF,IAAI,CAAC,GAAG;QACjD,GAAGG,QAAQ;QACX7B,MAAM,EAAE;UACN,GAAG6B,QAAQ,CAAC7B;QACd;MACF,CAAC;MAED,IAAIyB,aAAa,CAAC1B,UAAU,EAAE;QAC5B,KAAK,MAAM2B,IAAI,IAAID,aAAa,CAAC1B,UAAU,CAACC,MAAM,EAAE;UAClD,MAAM+B,KAAK,GAAGpC,KAAK,CAACK,MAAM,CAAC0B,IAAI,CAAC;UAEhC,IAAI,CAACK,KAAK,EAAE;UAEZ,KAAK,MAAMC,SAAS,IAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAY;YACxD,MAAMC,EAAE,GAAGD,SAAS,KAAK,SAAS,GAAG9C,OAAO,GAAGL,MAAM;YACrD,KAAK,MAAMqD,MAAM,IAAItD,WAAW,CAAC6C,aAAa,CAAC1B,UAAU,CAACiC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE;cACxErC,KAAK,CAACK,MAAM,CAAC,GAAG0B,IAAI,IAAIM,SAAS,IAAIE,MAAM,EAAE,CAAC,GAAG5C,QAAQ,CAAC2C,EAAE,CAAC7C,UAAU,CAAC2C,KAAK,CAAC,EAAEG,MAAM,CAAC,CAAC;YAC1F;UACF;QACF;MACF;MAEA,KAAK,MAAMH,KAAK,IAAIT,MAAM,CAACa,IAAI,CAACxC,KAAK,CAACK,MAAM,CAAC,EAAE;QAC7C,IAAI,WAAW,CAACoC,IAAI,CAACL,KAAK,CAAC,IAAIpC,KAAK,CAACK,MAAM,CAAC,MAAM+B,KAAK,EAAE,CAAC,EAAE;QAE5D,MAAMM,OAAO,GAAG,MAAMN,KAAK,EAAoB;QAC/C,MAAMO,QAAQ,GAAGlD,UAAU,CAACO,KAAK,CAACK,MAAM,CAAC+B,KAAK,CAAE,CAAC;QAEjDpC,KAAK,CAACK,MAAM,CAACqC,OAAO,CAAC,GAAGtD,aAAa,CAACuD,QAAQ,CAAC;MACjD;IACF;IAEA,OAAOV,GAAG;EACZ,CAAC,CAAC;EACF,MAAMW,OAAO,GAAGjE,QAAQ,CAAC,MAAMqD,cAAc,CAACG,KAAK,CAACJ,IAAI,CAACI,KAAK,CAAC,CAAC;EAEhE,SAASU,cAAcA,CAAEC,KAAe,EAAEC,QAAgB,EAAEC,OAAiB,EAAE;IAC7EF,KAAK,CAACG,IAAI,CACR,GAAGC,iBAAiB,CAACH,QAAQ,CAAC,MAAM,EACpC,GAAGC,OAAO,CAACG,GAAG,CAACC,IAAI,IAAI,KAAKA,IAAI,KAAK,CAAC,EACtC,KACF,CAAC;EACH;EAEA,SAASF,iBAAiBA,CAAEH,QAAgB,EAAE;IAC5C,IAAI,CAACjB,aAAa,CAACuB,KAAK,EAAE;MACxB,OAAON,QAAQ;IACjB;IACA,MAAMO,aAAa,GAAG,UAAUxB,aAAa,CAACuB,KAAK,GAAG;IACtD,IAAIN,QAAQ,KAAK,OAAO,EAAE;MACxB,OAAOO,aAAa;IACtB;IACA,OAAO,GAAGA,aAAa,IAAIP,QAAQ,EAAE;EACvC;EAEA,MAAMQ,MAAM,GAAG5E,QAAQ,CAAC,MAAM;IAC5B,MAAMmE,KAAe,GAAG,EAAE;IAE1B,IAAIF,OAAO,CAACT,KAAK,EAAE3B,IAAI,EAAE;MACvBqC,cAAc,CAACC,KAAK,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,CAAC;IACxD;IAEAD,cAAc,CAACC,KAAK,EAAE,OAAO,EAAEU,eAAe,CAACZ,OAAO,CAACT,KAAK,CAAC,CAAC;IAE9D,KAAK,MAAM,CAACsB,SAAS,EAAEzD,KAAK,CAAC,IAAI2B,MAAM,CAACC,OAAO,CAACI,cAAc,CAACG,KAAK,CAAC,EAAE;MACrEU,cAAc,CAACC,KAAK,EAAE,aAAaW,SAAS,EAAE,EAAE,CAC9C,iBAAiBzD,KAAK,CAACQ,IAAI,GAAG,MAAM,GAAG,QAAQ,EAAE,EACjD,GAAGgD,eAAe,CAACxD,KAAK,CAAC,CAC1B,CAAC;IACJ;IAEA,MAAM0D,OAAiB,GAAG,EAAE;IAC5B,MAAMC,OAAiB,GAAG,EAAE;IAE5B,MAAMtD,MAAM,GAAG,IAAIuD,GAAG,CAACjC,MAAM,CAACkC,MAAM,CAAC7B,cAAc,CAACG,KAAK,CAAC,CAAC2B,OAAO,CAAC9D,KAAK,IAAI2B,MAAM,CAACa,IAAI,CAACxC,KAAK,CAACK,MAAM,CAAC,CAAC,CAAC;IACvG,KAAK,MAAMqB,GAAG,IAAIrB,MAAM,EAAE;MACxB,IAAI,WAAW,CAACoC,IAAI,CAACf,GAAG,CAAC,EAAE;QACzBmB,cAAc,CAACc,OAAO,EAAE,IAAIjC,GAAG,EAAE,EAAE,CAAC,4BAA4BA,GAAG,eAAe,CAAC,CAAC;MACtF,CAAC,MAAM;QACLmB,cAAc,CAACa,OAAO,EAAE,OAAOhC,GAAG,EAAE,EAAE,CACpC,+CAA+CA,GAAG,sBAAsB,EACxE,uCAAuCA,GAAG,eAAe,EACzD,+BAA+BA,GAAG,eAAe,CAClD,CAAC;QACFmB,cAAc,CAACc,OAAO,EAAE,SAASjC,GAAG,EAAE,EAAE,CAAC,4BAA4BA,GAAG,eAAe,CAAC,CAAC;QACzFmB,cAAc,CAACc,OAAO,EAAE,WAAWjC,GAAG,EAAE,EAAE,CAAC,mCAAmCA,GAAG,GAAG,CAAC,CAAC;MACxF;IACF;IAEAoB,KAAK,CAACG,IAAI,CAAC,GAAGS,OAAO,EAAE,GAAGC,OAAO,CAAC;IAElC,OAAOb,KAAK,CAACK,GAAG,CAAC,CAACY,GAAG,EAAEC,CAAC,KAAKA,CAAC,KAAK,CAAC,GAAGD,GAAG,GAAG,OAAOA,GAAG,EAAE,CAAC,CAACE,IAAI,CAAC,EAAE,CAAC;EACrE,CAAC,CAAC;EAEF,SAASC,OAAOA,CAAA,EAAI;IAClB,OAAO;MACLC,KAAK,EAAE,CAAC;QACNC,WAAW,EAAEb,MAAM,CAACpB,KAAK;QACzBkC,EAAE,EAAEvC,aAAa,CAACZ,YAAY;QAC9BoD,KAAK,EAAExC,aAAa,CAACyC,QAAQ,IAAI;MACnC,CAAC;IACH,CAAC;EACH;EAEA,SAASC,OAAOA,CAAEC,GAAQ,EAAE;IAC1B,IAAI3C,aAAa,CAACL,UAAU,EAAE;IAE9B,MAAMiD,IAAI,GAAGD,GAAG,CAACE,QAAQ,CAACC,QAAQ,CAACC,OAAsD;IACzF,IAAIH,IAAI,EAAE;MACR,IAAIA,IAAI,CAACzB,IAAI,EAAE;QACb,MAAM6B,KAAK,GAAGJ,IAAI,CAACzB,IAAI,CAACiB,OAAO,CAAC;QAChC,IAAI5E,UAAU,EAAE;UACdP,KAAK,CAACwE,MAAM,EAAE,MAAM;YAAEuB,KAAK,CAACC,KAAK,CAACb,OAAO,CAAC;UAAC,CAAC,CAAC;QAC/C;MACF,CAAC,MAAM;QACL,IAAI5E,UAAU,EAAE;UACdoF,IAAI,CAACM,WAAW,CAACrG,QAAQ,CAACuF,OAAO,CAAC,CAAC;UACnClF,WAAW,CAAC,MAAM0F,IAAI,CAACO,SAAS,CAAC,CAAC,CAAC;QACrC,CAAC,MAAM;UACLP,IAAI,CAACM,WAAW,CAACd,OAAO,CAAC,CAAC,CAAC;QAC7B;MACF;IACF,CAAC,MAAM;MACL,IAAIgB,OAAO,GAAG5F,UAAU,GACpB6F,QAAQ,CAACC,cAAc,CAACtD,aAAa,CAACZ,YAAY,CAAC,GACnD,IAAI;MAER,IAAI5B,UAAU,EAAE;QACdP,KAAK,CAACwE,MAAM,EAAE8B,YAAY,EAAE;UAAEC,SAAS,EAAE;QAAK,CAAC,CAAC;MAClD,CAAC,MAAM;QACLD,YAAY,CAAC,CAAC;MAChB;MAEA,SAASA,YAAYA,CAAA,EAAI;QACvB,IAAI,OAAOF,QAAQ,KAAK,WAAW,IAAI,CAACD,OAAO,EAAE;UAC/C,MAAMK,EAAE,GAAGJ,QAAQ,CAACK,aAAa,CAAC,OAAO,CAAC;UAC1CD,EAAE,CAACE,IAAI,GAAG,UAAU;UACpBF,EAAE,CAAClB,EAAE,GAAGvC,aAAa,CAACZ,YAAY;UAClC,IAAIY,aAAa,CAACyC,QAAQ,EAAEgB,EAAE,CAACG,YAAY,CAAC,OAAO,EAAE5D,aAAa,CAACyC,QAAQ,CAAC;UAE5EW,OAAO,GAAGK,EAAE;UACZJ,QAAQ,CAACT,IAAI,CAACiB,WAAW,CAACT,OAAO,CAAC;QACpC;QAEA,IAAIA,OAAO,EAAEA,OAAO,CAACU,SAAS,GAAGrC,MAAM,CAACpB,KAAK;MAC/C;IACF;EACF;EAEA,MAAM0D,YAAY,GAAGlH,QAAQ,CAAC,MAAMmD,aAAa,CAACL,UAAU,GAAGF,SAAS,GAAG,YAAYQ,IAAI,CAACI,KAAK,EAAE,CAAC;EAEpG,OAAO;IACLqC,OAAO;IACP/C,UAAU,EAAEK,aAAa,CAACL,UAAU;IACpCM,IAAI;IACJzB,MAAM;IACNsC,OAAO;IACPZ,cAAc;IACd6D,YAAY;IACZtC,MAAM;IACNuC,MAAM,EAAE;MACN/D,IAAI;MACJa;IACF;EACF,CAAC;AACH;AAEA,OAAO,SAASmD,YAAYA,CAAEC,KAAyB,EAAE;EACvD7G,kBAAkB,CAAC,cAAc,CAAC;EAElC,MAAMa,KAAK,GAAGpB,MAAM,CAACgB,WAAW,EAAE,IAAI,CAAC;EAEvC,IAAI,CAACI,KAAK,EAAE,MAAM,IAAIiG,KAAK,CAAC,wCAAwC,CAAC;EAErE,MAAMlE,IAAI,GAAGpD,QAAQ,CAAS,MAAM;IAClC,OAAOqH,KAAK,CAAChG,KAAK,IAAIA,KAAK,CAAC+B,IAAI,CAACI,KAAK;EACxC,CAAC,CAAC;EACF,MAAMS,OAAO,GAAGjE,QAAQ,CAAC,MAAMqB,KAAK,CAACM,MAAM,CAAC6B,KAAK,CAACJ,IAAI,CAACI,KAAK,CAAC,CAAC;EAE9D,MAAM0D,YAAY,GAAGlH,QAAQ,CAAC,MAAMqB,KAAK,CAACyB,UAAU,GAAGF,SAAS,GAAG,YAAYQ,IAAI,CAACI,KAAK,EAAE,CAAC;EAE5F,MAAM+D,QAAuB,GAAG;IAC9B,GAAGlG,KAAK;IACR+B,IAAI;IACJa,OAAO;IACPiD;EACF,CAAC;EAEDhH,OAAO,CAACe,WAAW,EAAEsG,QAAQ,CAAC;EAE9B,OAAOA,QAAQ;AACjB;AAEA,OAAO,SAASC,QAAQA,CAAA,EAAI;EAC1BhH,kBAAkB,CAAC,UAAU,CAAC;EAE9B,MAAMa,KAAK,GAAGpB,MAAM,CAACgB,WAAW,EAAE,IAAI,CAAC;EAEvC,IAAI,CAACI,KAAK,EAAE,MAAM,IAAIiG,KAAK,CAAC,wCAAwC,CAAC;EAErE,OAAOjG,KAAK;AACd;AAEA,SAASwD,eAAeA,CAAExD,KAA8B,EAAE;EACxD,MAAMoG,YAAY,GAAGpG,KAAK,CAACQ,IAAI,GAAG,CAAC,GAAG,CAAC;EACvC,MAAM6F,WAAW,GAAGrG,KAAK,CAACQ,IAAI,GAAG,CAAC,GAAG,CAAC;EAEtC,MAAMS,SAAmB,GAAG,EAAE;EAC9B,KAAK,MAAM,CAACS,GAAG,EAAES,KAAK,CAAC,IAAIR,MAAM,CAACC,OAAO,CAAC5B,KAAK,CAACK,MAAM,CAAC,EAAE;IACvD,MAAMiG,GAAG,GAAG7G,UAAU,CAAC0C,KAAK,CAAC;IAC7BlB,SAAS,CAACgC,IAAI,CAAC,aAAavB,GAAG,KAAK4E,GAAG,CAACC,CAAC,IAAID,GAAG,CAACE,CAAC,IAAIF,GAAG,CAACG,CAAC,EAAE,CAAC;IAC9D,IAAI,CAAC/E,GAAG,CAACgF,UAAU,CAAC,KAAK,CAAC,EAAE;MAC1BzF,SAAS,CAACgC,IAAI,CAAC,aAAavB,GAAG,wBAAwBrC,OAAO,CAAC8C,KAAK,CAAC,GAAG,IAAI,GAAGiE,YAAY,GAAGC,WAAW,EAAE,CAAC;IAC9G;EACF;EAEA,KAAK,MAAM,CAAC3E,GAAG,EAAES,KAAK,CAAC,IAAIR,MAAM,CAACC,OAAO,CAAC5B,KAAK,CAACiB,SAAS,CAAC,EAAE;IAC1D,MAAMmB,KAAK,GAAG,OAAOD,KAAK,KAAK,QAAQ,IAAIA,KAAK,CAACuE,UAAU,CAAC,GAAG,CAAC,GAAGjH,UAAU,CAAC0C,KAAK,CAAC,GAAGZ,SAAS;IAChG,MAAM+E,GAAG,GAAGlE,KAAK,GAAG,GAAGA,KAAK,CAACmE,CAAC,KAAKnE,KAAK,CAACoE,CAAC,KAAKpE,KAAK,CAACqE,CAAC,EAAE,GAAGlF,SAAS;IACpEN,SAAS,CAACgC,IAAI,CAAC,OAAOvB,GAAG,KAAK4E,GAAG,IAAInE,KAAK,EAAE,CAAC;EAC/C;EAEA,OAAOlB,SAAS;AAClB","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
- return offsets[index] || 0;
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);