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/index.d.ts +9 -1
- package/index.ts +9 -1
- package/modules.d.ts +1 -0
- package/package.json +1 -1
- package/plugin-vite.js +5 -0
- package/types.ts +5 -0
- package/ui.form-calendar/UCalendar.vue +2 -0
- package/ui.form-calendar/UCalendarDayView.vue +18 -0
- package/ui.form-calendar/storybook/stories.ts +26 -0
- package/ui.form-calendar/tests/UCalendar.test.ts +13 -0
- package/ui.form-calendar/tests/UCalendarDayView.test.ts +33 -0
- package/ui.form-calendar/types.ts +6 -0
- package/ui.form-date-picker/UDatePicker.vue +2 -0
- package/ui.form-date-picker/storybook/stories.ts +29 -0
- package/ui.form-date-picker/tests/UDatePicker.test.ts +13 -0
- package/ui.form-date-picker/types.ts +5 -0
- package/ui.form-date-picker-range/UDatePickerRange.vue +63 -8
- package/ui.form-date-picker-range/UDatePickerRangePeriodMenu.vue +26 -29
- package/ui.form-date-picker-range/config.ts +17 -2
- package/ui.form-date-picker-range/storybook/stories.ts +77 -0
- package/ui.form-date-picker-range/tests/UDatePickerRange.test.ts +203 -1
- package/ui.form-date-picker-range/types.ts +14 -1
- package/utils/node/helper.d.ts +1 -0
- package/utils/node/helper.js +13 -1
- package/utils/tests/theme.test.ts +124 -0
- package/utils/theme.ts +46 -48
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,
|
|
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
|
-
|
|
73
|
-
|
|
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 ||
|
|
94
|
-
const
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
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
|
-
|
|
613
|
-
|
|
614
|
-
|
|
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
|
-
|
|
676
|
-
|
|
677
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
735
|
-
localStorage.setItem(storageKey, String(mergedOpacity));
|
|
733
|
+
storeThemeValue(storageKey, String(mergedOpacity));
|
|
736
734
|
}
|
|
737
735
|
|
|
738
736
|
return mergedOpacity;
|