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.
@@ -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 isDarkModeCache = !!Number(localStorage.getItem(DARK_MODE_SELECTOR));
11
+ const cashedDarkMode = localStorage.getItem(COLOR_MODE_KEY) as ColorMode | null;
12
+ const isDarkModeCashed = cashedDarkMode !== null && cashedDarkMode === ColorMode.Dark;
11
13
 
12
- isDarkMode.value = isDarkModeCache || isDarkModeClass;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "0.0.519",
3
+ "version": "0.0.520",
4
4
  "license": "MIT",
5
5
  "description": "Vue Styleless UI Component Library, powered by Tailwind CSS.",
6
6
  "keywords": [
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 dark mode state.
89
+ * Default color mode.
84
90
  */
85
- darkMode?: boolean;
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
- type DefaultColors = typeof tailwindColors;
34
+ import { ColorMode } from "../types.ts";
34
35
 
35
- interface InternalThemeConfig extends ThemeConfig {
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 prefersColorSchemeDark = window.matchMedia("(prefers-color-scheme: dark)");
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
- setTheme({ systemDarkMode: prefersColorSchemeDark.matches, darkMode: vuelessConfig.darkMode });
54
+ const prefersColorSchemeDark = window.matchMedia("(prefers-color-scheme: dark)");
45
55
 
46
56
  prefersColorSchemeDark.addEventListener("change", (event) =>
47
- setTheme({ systemDarkMode: event.matches, darkMode: vuelessConfig.darkMode }),
57
+ setTheme({ ...themeSettings, colorMode: event.matches ? ColorMode.Dark : ColorMode.Light }),
48
58
  );
49
59
  }
50
60
 
51
- export function setTheme(config: InternalThemeConfig = {}) {
52
- const isDarkMode = setDarkMode(config);
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
 
package/web-types.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "framework": "vue",
3
3
  "name": "vueless",
4
- "version": "0.0.519",
4
+ "version": "0.0.520",
5
5
  "contributions": {
6
6
  "html": {
7
7
  "description-markup": "markdown",