vueless 1.5.1-beta.2 → 1.5.1-beta.4

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/utils/theme.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { cloneDeep, merge } from "lodash-es";
2
2
 
3
3
  import { vuelessConfig } from "./ui";
4
- import { isCSR, getStored, getCookie, setCookie, deleteCookie, toNumber } from "./helper";
4
+ import { isCSR, getStored, setCookie, deleteCookie, toNumber } from "./helper";
5
5
 
6
6
  import {
7
7
  PX_IN_REM,
@@ -63,14 +63,33 @@ declare interface SetColorMode {
63
63
  /* Creates a media query that checks if the user's system color scheme is set to the dark. */
64
64
  const prefersColorSchemeDark = isCSR && window.matchMedia("(prefers-color-scheme: dark)");
65
65
 
66
+ /* Prefixes theme cookie names, so apps sharing a host (cookies ignore the port) don't collide. */
67
+ export function getThemeCookieName(key: string) {
68
+ const appName = typeof __VUELESS_APP_NAME__ === "undefined" ? "" : __VUELESS_APP_NAME__;
69
+ const prefix = (vuelessConfig.cookiePrefix ?? appName)
70
+ .toLowerCase()
71
+ .replace(/[^a-z0-9_-]/g, "-")
72
+ .replace(/^-+|-+$/g, "");
73
+
74
+ return prefix ? `${prefix}-${key}` : key;
75
+ }
76
+
77
+ /* Saves a theme value under the raw key in local storage (client) and the prefixed cookie (SSR). */
78
+ function storeThemeValue(key: string, value: string) {
79
+ if (!isCSR) return;
80
+
81
+ localStorage.setItem(key, value);
82
+ setCookie(getThemeCookieName(key), value);
83
+ }
84
+
66
85
  function toggleColorModeClass() {
67
86
  if (!prefersColorSchemeDark) return;
68
87
 
69
88
  const isDarkMode = prefersColorSchemeDark.matches;
70
89
  const colorMode = isDarkMode ? ColorMode.Dark : ColorMode.Light;
71
90
 
72
- setCookie(COLOR_MODE_KEY, colorMode);
73
- setCookie(AUTO_MODE_KEY, String(Number(true)));
91
+ storeThemeValue(COLOR_MODE_KEY, colorMode);
92
+ storeThemeValue(AUTO_MODE_KEY, String(Number(true)));
74
93
 
75
94
  document.documentElement.classList.toggle(DARK_MODE_CLASS, isDarkMode);
76
95
  document.documentElement.classList.toggle(LIGHT_MODE_CLASS, !isDarkMode);
@@ -90,8 +109,9 @@ function toggleColorModeClass() {
90
109
  * - `isColorModeAuto` {boolean}: Indicates whether the color mode is set to auto.
91
110
  */
92
111
  function setCSRColorMode(mode: `${ColorMode}`): SetColorMode {
93
- const colorMode = mode || getCookie(COLOR_MODE_KEY) || vuelessConfig.colorMode || ColorMode.Light;
94
- const isCachedAutoMode = !!Number(getCookie(AUTO_MODE_KEY) ?? 0);
112
+ const colorMode = mode || getStored(COLOR_MODE_KEY) || vuelessConfig.colorMode || ColorMode.Light;
113
+ const storedAutoMode = getStored(AUTO_MODE_KEY);
114
+ const isCachedAutoMode = !!Number(storedAutoMode ?? 0);
95
115
 
96
116
  const isAutoMode = colorMode === ColorMode.Auto;
97
117
  const isSystemDarkMode = isAutoMode && prefersColorSchemeDark && prefersColorSchemeDark?.matches;
@@ -114,17 +134,15 @@ function setCSRColorMode(mode: `${ColorMode}`): SetColorMode {
114
134
  /* Dispatching custom event for the useDarkMode composable. */
115
135
  window.dispatchEvent(new CustomEvent("darkModeChange", { detail: isDarkMode }));
116
136
 
117
- /* Saving color mode value into cookies (server) and local storage (client). */
118
137
  let currentColorMode = colorMode;
119
138
 
120
139
  if (isAutoMode) {
121
140
  currentColorMode = isDarkMode ? ColorMode.Dark : ColorMode.Light;
122
141
  }
123
142
 
124
- /* Define color mode cookies to be used in both CSR and SSR */
125
- if (mode || getCookie(AUTO_MODE_KEY) === undefined) {
126
- setCookie(COLOR_MODE_KEY, currentColorMode);
127
- setCookie(AUTO_MODE_KEY, String(Number(isAutoMode)));
143
+ if (mode || storedAutoMode === undefined) {
144
+ storeThemeValue(COLOR_MODE_KEY, currentColorMode);
145
+ storeThemeValue(AUTO_MODE_KEY, String(Number(isAutoMode)));
128
146
 
129
147
  if (mode !== ColorMode.Auto && prefersColorSchemeDark) {
130
148
  prefersColorSchemeDark.removeEventListener("change", toggleColorModeClass);
@@ -196,7 +214,7 @@ export function resetTheme() {
196
214
 
197
215
  themeKeys.forEach((key) => {
198
216
  localStorage.removeItem(key);
199
- deleteCookie(key);
217
+ deleteCookie(getThemeCookieName(key));
200
218
  });
201
219
  }
202
220
 
@@ -436,8 +454,7 @@ function getPrimaryColor(primary?: PrimaryColors) {
436
454
  validateColorShades(primaryColor, PRIMARY_COLOR);
437
455
 
438
456
  if (isCSR && primary) {
439
- setCookie(storageKey, JSON.stringify(primaryColor));
440
- localStorage.setItem(storageKey, JSON.stringify(primaryColor));
457
+ storeThemeValue(storageKey, JSON.stringify(primaryColor));
441
458
  }
442
459
 
443
460
  return primaryColor;
@@ -454,8 +471,7 @@ function getPrimaryColor(primary?: PrimaryColors) {
454
471
  }
455
472
 
456
473
  if (isCSR && primary) {
457
- setCookie(storageKey, String(primaryColor));
458
- localStorage.setItem(storageKey, String(primaryColor));
474
+ storeThemeValue(storageKey, String(primaryColor));
459
475
  }
460
476
 
461
477
  return primaryColor;
@@ -486,8 +502,7 @@ function getNeutralColor(neutral?: NeutralColors) {
486
502
  validateColorShades(neutralColor, NEUTRAL_COLOR);
487
503
 
488
504
  if (isCSR && neutral) {
489
- setCookie(storageKey, JSON.stringify(neutralColor));
490
- localStorage.setItem(storageKey, JSON.stringify(neutralColor));
505
+ storeThemeValue(storageKey, JSON.stringify(neutralColor));
491
506
  }
492
507
 
493
508
  return neutralColor;
@@ -503,8 +518,7 @@ function getNeutralColor(neutral?: NeutralColors) {
503
518
  }
504
519
 
505
520
  if (isCSR && neutral) {
506
- setCookie(storageKey, String(neutralColor));
507
- localStorage.setItem(storageKey, String(neutralColor));
521
+ storeThemeValue(storageKey, String(neutralColor));
508
522
  }
509
523
 
510
524
  return neutralColor;
@@ -553,15 +567,10 @@ function getText(text?: ThemeConfig["text"]) {
553
567
  /* eslint-enable prettier/prettier,vue/max-len */
554
568
 
555
569
  if (isCSR && text !== undefined) {
556
- setCookie(storageKey.xs, String(mergedText.xs));
557
- setCookie(storageKey.sm, String(mergedText.sm));
558
- setCookie(storageKey.md, String(mergedText.md));
559
- setCookie(storageKey.lg, String(mergedText.lg));
560
-
561
- localStorage.setItem(storageKey.xs, String(mergedText.xs));
562
- localStorage.setItem(storageKey.sm, String(mergedText.sm));
563
- localStorage.setItem(storageKey.md, String(mergedText.md));
564
- localStorage.setItem(storageKey.lg, String(mergedText.lg));
570
+ storeThemeValue(storageKey.xs, String(mergedText.xs));
571
+ storeThemeValue(storageKey.sm, String(mergedText.sm));
572
+ storeThemeValue(storageKey.md, String(mergedText.md));
573
+ storeThemeValue(storageKey.lg, String(mergedText.lg));
565
574
  }
566
575
 
567
576
  return mergedText;
@@ -609,13 +618,9 @@ function getOutlines(outline?: ThemeConfig["outline"]) {
609
618
  /* eslint-enable prettier/prettier,vue/max-len */
610
619
 
611
620
  if (isCSR && outline !== undefined) {
612
- setCookie(storageKey.sm, String(mergedOutline.sm));
613
- setCookie(storageKey.md, String(mergedOutline.md));
614
- setCookie(storageKey.lg, String(mergedOutline.lg));
615
-
616
- localStorage.setItem(storageKey.sm, String(mergedOutline.sm));
617
- localStorage.setItem(storageKey.md, String(mergedOutline.md));
618
- localStorage.setItem(storageKey.lg, String(mergedOutline.lg));
621
+ storeThemeValue(storageKey.sm, String(mergedOutline.sm));
622
+ storeThemeValue(storageKey.md, String(mergedOutline.md));
623
+ storeThemeValue(storageKey.lg, String(mergedOutline.lg));
619
624
  }
620
625
 
621
626
  return mergedOutline;
@@ -672,13 +677,9 @@ function getRoundings(rounding?: ThemeConfig["rounding"]) {
672
677
  /* eslint-enable prettier/prettier,vue/max-len */
673
678
 
674
679
  if (isCSR && rounding !== undefined) {
675
- setCookie(storageKey.sm, String(mergedRounding.sm));
676
- setCookie(storageKey.md, String(mergedRounding.md));
677
- setCookie(storageKey.lg, String(mergedRounding.lg));
678
-
679
- localStorage.setItem(storageKey.sm, String(mergedRounding.sm));
680
- localStorage.setItem(storageKey.md, String(mergedRounding.md));
681
- localStorage.setItem(storageKey.lg, String(mergedRounding.lg));
680
+ storeThemeValue(storageKey.sm, String(mergedRounding.sm));
681
+ storeThemeValue(storageKey.md, String(mergedRounding.md));
682
+ storeThemeValue(storageKey.lg, String(mergedRounding.lg));
682
683
  }
683
684
 
684
685
  return mergedRounding;
@@ -695,8 +696,7 @@ function getSpacing(spacing?: ThemeConfig["spacing"]) {
695
696
  const mergedSpacing = Number(storedSpacing ?? DEFAULT_SPACING);
696
697
 
697
698
  if (isCSR && spacing !== undefined) {
698
- setCookie(storageKey, String(mergedSpacing));
699
- localStorage.setItem(storageKey, String(mergedSpacing));
699
+ storeThemeValue(storageKey, String(mergedSpacing));
700
700
  }
701
701
 
702
702
  return mergedSpacing;
@@ -713,8 +713,7 @@ function getLetterSpacing(letterSpacing?: ThemeConfig["letterSpacing"]) {
713
713
  const mergedSpacing = Number(spacing ?? DEFAULT_LETTER_SPACING);
714
714
 
715
715
  if (isCSR && letterSpacing !== undefined) {
716
- setCookie(storageKey, String(mergedSpacing));
717
- localStorage.setItem(storageKey, String(mergedSpacing));
716
+ storeThemeValue(storageKey, String(mergedSpacing));
718
717
  }
719
718
 
720
719
  return mergedSpacing;
@@ -731,8 +730,7 @@ function getDisabledOpacity(disabledOpacity?: ThemeConfig["disabledOpacity"]) {
731
730
  const mergedOpacity = Math.max(0, Number(opacity ?? DEFAULT_DISABLED_OPACITY));
732
731
 
733
732
  if (isCSR && disabledOpacity !== undefined) {
734
- setCookie(storageKey, String(mergedOpacity));
735
- localStorage.setItem(storageKey, String(mergedOpacity));
733
+ storeThemeValue(storageKey, String(mergedOpacity));
736
734
  }
737
735
 
738
736
  return mergedOpacity;