vueless 0.0.519 → 0.0.520
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/composables/useDarkMode.ts +5 -3
- package/constants.js +1 -0
- package/package.json +1 -1
- package/types.ts +8 -2
- package/utils/theme.ts +62 -44
- package/web-types.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { onMounted, ref, nextTick } from "vue";
|
|
2
|
-
import { DARK_MODE_SELECTOR } from "../constants.js";
|
|
2
|
+
import { COLOR_MODE_KEY, DARK_MODE_SELECTOR } from "../constants.js";
|
|
3
|
+
import { ColorMode } from "../types.js";
|
|
3
4
|
|
|
4
5
|
export function useDarkMode() {
|
|
5
6
|
const isDarkMode = ref(false);
|
|
@@ -7,9 +8,10 @@ export function useDarkMode() {
|
|
|
7
8
|
onMounted(async () => {
|
|
8
9
|
await nextTick(() => {
|
|
9
10
|
const isDarkModeClass = document.documentElement.classList.contains(DARK_MODE_SELECTOR);
|
|
10
|
-
const
|
|
11
|
+
const cashedDarkMode = localStorage.getItem(COLOR_MODE_KEY) as ColorMode | null;
|
|
12
|
+
const isDarkModeCashed = cashedDarkMode !== null && cashedDarkMode === ColorMode.Dark;
|
|
11
13
|
|
|
12
|
-
isDarkMode.value =
|
|
14
|
+
isDarkMode.value = isDarkModeCashed || isDarkModeClass;
|
|
13
15
|
|
|
14
16
|
window.addEventListener("darkModeChange", ((event: CustomEvent) => {
|
|
15
17
|
isDarkMode.value = Boolean(event.detail);
|
package/constants.js
CHANGED
|
@@ -12,6 +12,7 @@ export const GRAYSCALE_COLOR = "grayscale";
|
|
|
12
12
|
/* Vueless dark mode */
|
|
13
13
|
export const DARK_MODE_SELECTOR = "vl-dark";
|
|
14
14
|
export const LIGHT_MODE_SELECTOR = "vl-light";
|
|
15
|
+
export const COLOR_MODE_KEY = "vl-color-mode";
|
|
15
16
|
|
|
16
17
|
/* Vueless defaults */
|
|
17
18
|
export const DEFAULT_BRAND_COLOR = GRAYSCALE_COLOR;
|
package/package.json
CHANGED
package/types.ts
CHANGED
|
@@ -39,6 +39,12 @@ import type { LocaleOptions } from "./adatper.locale/vueless.ts";
|
|
|
39
39
|
|
|
40
40
|
export type TemplateRefElement = MaybeRef<HTMLElement | HTMLElement[] | null>;
|
|
41
41
|
|
|
42
|
+
export enum ColorMode {
|
|
43
|
+
Dark = "dark",
|
|
44
|
+
Light = "light",
|
|
45
|
+
Auto = "auto",
|
|
46
|
+
}
|
|
47
|
+
|
|
42
48
|
export interface ExtendedKeyClasses {
|
|
43
49
|
[key: string]: Ref<string>;
|
|
44
50
|
}
|
|
@@ -80,9 +86,9 @@ export interface ThemeConfig {
|
|
|
80
86
|
ringOffsetColorDark?: string;
|
|
81
87
|
|
|
82
88
|
/**
|
|
83
|
-
* Default
|
|
89
|
+
* Default color mode.
|
|
84
90
|
*/
|
|
85
|
-
|
|
91
|
+
colorMode?: `${ColorMode}`;
|
|
86
92
|
}
|
|
87
93
|
|
|
88
94
|
export interface Config extends ThemeConfig {
|
package/utils/theme.ts
CHANGED
|
@@ -20,37 +20,89 @@ import {
|
|
|
20
20
|
COOL_COLOR,
|
|
21
21
|
GRAY_COLOR,
|
|
22
22
|
LIGHT_MODE_SELECTOR,
|
|
23
|
+
COLOR_MODE_KEY,
|
|
23
24
|
} from "../constants.js";
|
|
24
25
|
|
|
25
26
|
import type {
|
|
26
|
-
ThemeConfig,
|
|
27
27
|
GrayColors,
|
|
28
28
|
BrandColors,
|
|
29
29
|
VuelessCssVariables,
|
|
30
30
|
TailwindColorShades,
|
|
31
|
+
Config,
|
|
31
32
|
} from "../types.ts";
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
import { ColorMode } from "../types.ts";
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
systemDarkMode?: boolean;
|
|
37
|
-
}
|
|
36
|
+
type DefaultColors = typeof tailwindColors;
|
|
38
37
|
|
|
39
38
|
export function themeInit() {
|
|
40
39
|
if (isSSR) return;
|
|
41
40
|
|
|
42
|
-
const
|
|
41
|
+
const themeSettings = {
|
|
42
|
+
colorMode: vuelessConfig.colorMode,
|
|
43
|
+
ringOffsetColorLight: vuelessConfig.ringOffsetColorLight,
|
|
44
|
+
ringOffsetColorDark: vuelessConfig.ringOffsetColorDark,
|
|
45
|
+
ringOffset: vuelessConfig.ringOffset,
|
|
46
|
+
ring: vuelessConfig.ring,
|
|
47
|
+
gray: vuelessConfig.gray,
|
|
48
|
+
brand: vuelessConfig.gray,
|
|
49
|
+
rounding: vuelessConfig.rounding,
|
|
50
|
+
} as Config;
|
|
51
|
+
|
|
52
|
+
setTheme(themeSettings);
|
|
43
53
|
|
|
44
|
-
|
|
54
|
+
const prefersColorSchemeDark = window.matchMedia("(prefers-color-scheme: dark)");
|
|
45
55
|
|
|
46
56
|
prefersColorSchemeDark.addEventListener("change", (event) =>
|
|
47
|
-
setTheme({
|
|
57
|
+
setTheme({ ...themeSettings, colorMode: event.matches ? ColorMode.Dark : ColorMode.Light }),
|
|
48
58
|
);
|
|
49
59
|
}
|
|
50
60
|
|
|
51
|
-
export function
|
|
52
|
-
const
|
|
61
|
+
export function setColorMode(colorMode: `${ColorMode}`) {
|
|
62
|
+
const cashedColorMode = localStorage.getItem(COLOR_MODE_KEY) as ColorMode | null;
|
|
63
|
+
|
|
64
|
+
const isDark = colorMode === ColorMode.Dark;
|
|
65
|
+
const isLight = colorMode === ColorMode.Light;
|
|
66
|
+
const isAuto = colorMode === ColorMode.Auto;
|
|
67
|
+
|
|
68
|
+
let newColorMode = ColorMode.Auto;
|
|
69
|
+
|
|
70
|
+
if (isAuto) {
|
|
71
|
+
const isSystemDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
72
|
+
|
|
73
|
+
newColorMode = isSystemDark ? ColorMode.Dark : ColorMode.Light;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (isLight) {
|
|
77
|
+
newColorMode = ColorMode.Light;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (isDark) {
|
|
81
|
+
newColorMode = ColorMode.Dark;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (cashedColorMode !== null) {
|
|
85
|
+
newColorMode = cashedColorMode;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (newColorMode === ColorMode.Dark) {
|
|
89
|
+
document.documentElement.classList.remove(LIGHT_MODE_SELECTOR);
|
|
90
|
+
document.documentElement.classList.add(DARK_MODE_SELECTOR);
|
|
91
|
+
} else {
|
|
92
|
+
document.documentElement.classList.remove(DARK_MODE_SELECTOR);
|
|
93
|
+
document.documentElement.classList.add(LIGHT_MODE_SELECTOR);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
isAuto
|
|
97
|
+
? localStorage.removeItem(COLOR_MODE_KEY)
|
|
98
|
+
: localStorage.setItem(COLOR_MODE_KEY, newColorMode);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function setTheme(config: Config = {}) {
|
|
102
|
+
setColorMode(config.colorMode || ColorMode.Auto);
|
|
103
|
+
|
|
53
104
|
const rounding = config?.rounding ?? vuelessConfig.rounding ?? DEFAULT_ROUNDING;
|
|
105
|
+
const isDarkMode = document.documentElement.classList.contains(DARK_MODE_SELECTOR);
|
|
54
106
|
|
|
55
107
|
let brand: BrandColors | GrayColors | typeof GRAY_COLOR =
|
|
56
108
|
config?.brand ?? vuelessConfig.brand ?? DEFAULT_BRAND_COLOR;
|
|
@@ -139,40 +191,6 @@ export function setTheme(config: InternalThemeConfig = {}) {
|
|
|
139
191
|
return rootVariables;
|
|
140
192
|
}
|
|
141
193
|
|
|
142
|
-
function setDarkMode(config: InternalThemeConfig) {
|
|
143
|
-
config?.darkMode === undefined
|
|
144
|
-
? isCSR && localStorage.removeItem(DARK_MODE_SELECTOR)
|
|
145
|
-
: isCSR && localStorage.setItem(DARK_MODE_SELECTOR, Number(config?.darkMode).toString());
|
|
146
|
-
|
|
147
|
-
let storedDarkMode = null;
|
|
148
|
-
|
|
149
|
-
if (isCSR) {
|
|
150
|
-
storedDarkMode = localStorage.getItem(DARK_MODE_SELECTOR);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
let isDarkMode = !!(config?.darkMode ?? vuelessConfig.darkMode ?? config?.systemDarkMode);
|
|
154
|
-
|
|
155
|
-
if (storedDarkMode !== null) {
|
|
156
|
-
isDarkMode = !!Number(storedDarkMode);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (isCSR) {
|
|
160
|
-
const darkModeChange = new CustomEvent("darkModeChange", { detail: isDarkMode });
|
|
161
|
-
|
|
162
|
-
if (isDarkMode) {
|
|
163
|
-
document.documentElement.classList.remove(LIGHT_MODE_SELECTOR);
|
|
164
|
-
document.documentElement.classList.add(DARK_MODE_SELECTOR);
|
|
165
|
-
} else {
|
|
166
|
-
document.documentElement.classList.remove(DARK_MODE_SELECTOR);
|
|
167
|
-
document.documentElement.classList.add(LIGHT_MODE_SELECTOR);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
window.dispatchEvent(darkModeChange);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return isDarkMode;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
194
|
export function convertHexInRgb(hex: string) {
|
|
177
195
|
const color = hex.replace(/#/g, "");
|
|
178
196
|
|