@blocklet/theme 2.13.54 → 2.13.56

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/dist/cjs/index.js CHANGED
@@ -140,7 +140,12 @@ __export(src_exports, {
140
140
  BLOCKLET_THEME_PREFER_KEY: () => BLOCKLET_THEME_PREFER_KEY,
141
141
  DEFAULT_FONTS: () => DEFAULT_FONTS,
142
142
  DID_CONNECT_THEME_DARK: () => DID_CONNECT_THEME_DARK,
143
- DID_CONNECT_THEME_LIGHT: () => DID_CONNECT_THEME_LIGHT
143
+ DID_CONNECT_THEME_LIGHT: () => DID_CONNECT_THEME_LIGHT,
144
+ buildThemeScript: () => buildThemeScript,
145
+ buildThemeStyles: () => buildThemeStyles,
146
+ getDefaultThemePrefer: () => getDefaultThemePrefer,
147
+ isValidThemeMode: () => isValidThemeMode,
148
+ merge: () => merge
144
149
  });
145
150
  module.exports = __toCommonJS(src_exports);
146
151
 
@@ -254,15 +259,85 @@ function alpha(color, value) {
254
259
 
255
260
  // src/util.ts
256
261
  var import_deepmerge = __toESM(require_cjs());
262
+ var BLOCKLET_THEME_PREFER_KEY = "blocklet_theme_prefer";
257
263
  var merge = (x, y) => {
258
264
  return (0, import_deepmerge.default)(x, y, {
259
265
  // 采用替换策略合并数组
260
266
  arrayMerge: (_, source) => source
261
267
  });
262
268
  };
269
+ function isValidThemeMode(mode) {
270
+ return mode === "light" || mode === "dark";
271
+ }
272
+ function getDefaultThemePrefer(meta) {
273
+ const urlParams = new URLSearchParams(window.location.search);
274
+ const urlPrefer = urlParams.get("theme");
275
+ if (isValidThemeMode(urlPrefer)) {
276
+ return urlPrefer;
277
+ }
278
+ const sessionPrefer = sessionStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
279
+ if (isValidThemeMode(sessionPrefer)) {
280
+ return sessionPrefer;
281
+ }
282
+ const prefer = Object.assign({}, window.blocklet, meta).theme?.prefer;
283
+ if (prefer === "light" || prefer === "dark") {
284
+ return prefer;
285
+ }
286
+ if (prefer === "system") {
287
+ const localPrefer = localStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
288
+ if (isValidThemeMode(localPrefer)) {
289
+ return localPrefer;
290
+ }
291
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
292
+ }
293
+ return "light";
294
+ }
295
+ var buildThemeStyles = (theme) => {
296
+ const { light, dark } = theme;
297
+ return `
298
+ <style id="blocklet-theme-style">
299
+ :root {
300
+ --blocklet-background-default-color: ${light.palette?.background?.default ?? "#ffffff"};
301
+ --blocklet-text-primary-color: ${light.palette?.text?.primary ?? "#18181b"};
302
+ }
303
+
304
+ [data-theme='dark'] {
305
+ --blocklet-background-default-color: ${dark.palette?.background?.default ?? "#121212"};
306
+ --blocklet-text-primary-color: ${dark.palette?.text?.primary ?? "#ffffff"};
307
+ }
308
+
309
+ html, body {
310
+ background-color: var(--blocklet-background-default-color);
311
+ color: var(--blocklet-text-primary-color);
312
+ }
313
+ </style>
314
+ `;
315
+ };
316
+ var buildThemeScript = (theme) => {
317
+ return `
318
+ <script id="blocklet-theme-script">
319
+ (function() {
320
+ try {
321
+ const BLOCKLET_THEME_PREFER_KEY = '${BLOCKLET_THEME_PREFER_KEY}';
322
+ ${isValidThemeMode.toString()}
323
+ ${getDefaultThemePrefer.toString()}
324
+
325
+ const prefer = getDefaultThemePrefer(${JSON.stringify({ theme: { prefer: theme.prefer } })});
326
+
327
+ if(prefer === 'dark') {
328
+ document.documentElement.setAttribute('data-theme', 'dark');
329
+ } else {
330
+ document.documentElement.removeAttribute('data-theme');
331
+ }
332
+ } catch (e) {
333
+ console.error('Theme init error:', e);
334
+ }
335
+ })();
336
+ </script>
337
+ `;
338
+ };
263
339
 
264
340
  // src/blocklet.ts
265
- var BLOCKLET_THEME_PREFER_KEY = "blocklet_theme_prefer";
266
341
  var DEFAULT_FONTS = ["Roboto", "Helvetica", "Arial", "sans-serif"];
267
342
  var shadows = [
268
343
  "none",
@@ -611,37 +686,37 @@ var BLOCKLET_THEME_DARK = merge(BLOCKLET_THEME_LIGHT, {
611
686
  },
612
687
  primary: {
613
688
  main: "#00d5be",
614
- contrastText: "#f4f4f5",
689
+ contrastText: "#121212",
615
690
  light: "#4ce3d0",
616
691
  dark: "#00a89a"
617
692
  },
618
693
  secondary: {
619
694
  main: "#00d3f3",
620
- contrastText: "#f4f4f5",
695
+ contrastText: "#121212",
621
696
  light: "#51e1ff",
622
697
  dark: "#00a2c0"
623
698
  },
624
699
  error: {
625
700
  main: "#ff6467",
626
- contrastText: "#f4f4f5",
701
+ contrastText: "#121212",
627
702
  light: "#ff9598",
628
703
  dark: "#e7000b"
629
704
  },
630
705
  warning: {
631
706
  main: "#ff8904",
632
- contrastText: "#f4f4f5",
707
+ contrastText: "#121212",
633
708
  light: "#ffa644",
634
709
  dark: "#f54900"
635
710
  },
636
711
  info: {
637
712
  main: "#51a2ff",
638
- contrastText: "#f4f4f5",
713
+ contrastText: "#121212",
639
714
  light: "#83c3ff",
640
715
  dark: "#1570e5"
641
716
  },
642
717
  success: {
643
718
  main: "#05df72",
644
- contrastText: "#f4f4f5",
719
+ contrastText: "#121212",
645
720
  light: "#56e799",
646
721
  dark: "#00b24a"
647
722
  },
@@ -821,5 +896,10 @@ var DID_CONNECT_THEME_DARK = merge(BLOCKLET_THEME_DARK, {
821
896
  BLOCKLET_THEME_PREFER_KEY,
822
897
  DEFAULT_FONTS,
823
898
  DID_CONNECT_THEME_DARK,
824
- DID_CONNECT_THEME_LIGHT
899
+ DID_CONNECT_THEME_LIGHT,
900
+ buildThemeScript,
901
+ buildThemeStyles,
902
+ getDefaultThemePrefer,
903
+ isValidThemeMode,
904
+ merge
825
905
  });
package/dist/es/index.js CHANGED
@@ -237,15 +237,85 @@ function alpha(color, value) {
237
237
 
238
238
  // src/util.ts
239
239
  var import_deepmerge = __toESM(require_cjs());
240
+ var BLOCKLET_THEME_PREFER_KEY = "blocklet_theme_prefer";
240
241
  var merge = (x, y) => {
241
242
  return (0, import_deepmerge.default)(x, y, {
242
243
  // 采用替换策略合并数组
243
244
  arrayMerge: (_, source) => source
244
245
  });
245
246
  };
247
+ function isValidThemeMode(mode) {
248
+ return mode === "light" || mode === "dark";
249
+ }
250
+ function getDefaultThemePrefer(meta) {
251
+ const urlParams = new URLSearchParams(window.location.search);
252
+ const urlPrefer = urlParams.get("theme");
253
+ if (isValidThemeMode(urlPrefer)) {
254
+ return urlPrefer;
255
+ }
256
+ const sessionPrefer = sessionStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
257
+ if (isValidThemeMode(sessionPrefer)) {
258
+ return sessionPrefer;
259
+ }
260
+ const prefer = Object.assign({}, window.blocklet, meta).theme?.prefer;
261
+ if (prefer === "light" || prefer === "dark") {
262
+ return prefer;
263
+ }
264
+ if (prefer === "system") {
265
+ const localPrefer = localStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
266
+ if (isValidThemeMode(localPrefer)) {
267
+ return localPrefer;
268
+ }
269
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
270
+ }
271
+ return "light";
272
+ }
273
+ var buildThemeStyles = (theme) => {
274
+ const { light, dark } = theme;
275
+ return `
276
+ <style id="blocklet-theme-style">
277
+ :root {
278
+ --blocklet-background-default-color: ${light.palette?.background?.default ?? "#ffffff"};
279
+ --blocklet-text-primary-color: ${light.palette?.text?.primary ?? "#18181b"};
280
+ }
281
+
282
+ [data-theme='dark'] {
283
+ --blocklet-background-default-color: ${dark.palette?.background?.default ?? "#121212"};
284
+ --blocklet-text-primary-color: ${dark.palette?.text?.primary ?? "#ffffff"};
285
+ }
286
+
287
+ html, body {
288
+ background-color: var(--blocklet-background-default-color);
289
+ color: var(--blocklet-text-primary-color);
290
+ }
291
+ </style>
292
+ `;
293
+ };
294
+ var buildThemeScript = (theme) => {
295
+ return `
296
+ <script id="blocklet-theme-script">
297
+ (function() {
298
+ try {
299
+ const BLOCKLET_THEME_PREFER_KEY = '${BLOCKLET_THEME_PREFER_KEY}';
300
+ ${isValidThemeMode.toString()}
301
+ ${getDefaultThemePrefer.toString()}
302
+
303
+ const prefer = getDefaultThemePrefer(${JSON.stringify({ theme: { prefer: theme.prefer } })});
304
+
305
+ if(prefer === 'dark') {
306
+ document.documentElement.setAttribute('data-theme', 'dark');
307
+ } else {
308
+ document.documentElement.removeAttribute('data-theme');
309
+ }
310
+ } catch (e) {
311
+ console.error('Theme init error:', e);
312
+ }
313
+ })();
314
+ </script>
315
+ `;
316
+ };
246
317
 
247
318
  // src/blocklet.ts
248
- var BLOCKLET_THEME_PREFER_KEY = "blocklet_theme_prefer";
249
319
  var DEFAULT_FONTS = ["Roboto", "Helvetica", "Arial", "sans-serif"];
250
320
  var shadows = [
251
321
  "none",
@@ -594,37 +664,37 @@ var BLOCKLET_THEME_DARK = merge(BLOCKLET_THEME_LIGHT, {
594
664
  },
595
665
  primary: {
596
666
  main: "#00d5be",
597
- contrastText: "#f4f4f5",
667
+ contrastText: "#121212",
598
668
  light: "#4ce3d0",
599
669
  dark: "#00a89a"
600
670
  },
601
671
  secondary: {
602
672
  main: "#00d3f3",
603
- contrastText: "#f4f4f5",
673
+ contrastText: "#121212",
604
674
  light: "#51e1ff",
605
675
  dark: "#00a2c0"
606
676
  },
607
677
  error: {
608
678
  main: "#ff6467",
609
- contrastText: "#f4f4f5",
679
+ contrastText: "#121212",
610
680
  light: "#ff9598",
611
681
  dark: "#e7000b"
612
682
  },
613
683
  warning: {
614
684
  main: "#ff8904",
615
- contrastText: "#f4f4f5",
685
+ contrastText: "#121212",
616
686
  light: "#ffa644",
617
687
  dark: "#f54900"
618
688
  },
619
689
  info: {
620
690
  main: "#51a2ff",
621
- contrastText: "#f4f4f5",
691
+ contrastText: "#121212",
622
692
  light: "#83c3ff",
623
693
  dark: "#1570e5"
624
694
  },
625
695
  success: {
626
696
  main: "#05df72",
627
- contrastText: "#f4f4f5",
697
+ contrastText: "#121212",
628
698
  light: "#56e799",
629
699
  dark: "#00b24a"
630
700
  },
@@ -803,5 +873,10 @@ export {
803
873
  BLOCKLET_THEME_PREFER_KEY,
804
874
  DEFAULT_FONTS,
805
875
  DID_CONNECT_THEME_DARK,
806
- DID_CONNECT_THEME_LIGHT
876
+ DID_CONNECT_THEME_LIGHT,
877
+ buildThemeScript,
878
+ buildThemeStyles,
879
+ getDefaultThemePrefer,
880
+ isValidThemeMode,
881
+ merge
807
882
  };
@@ -53,7 +53,6 @@ declare module "@mui/material/styles/createTypography" {
53
53
  color?: Record<string, string>;
54
54
  }
55
55
  }
56
- export declare const BLOCKLET_THEME_PREFER_KEY = "blocklet_theme_prefer";
57
56
  export declare const DEFAULT_FONTS: string[];
58
57
  /**
59
58
  * figma: https://www.figma.com/file/1qHyMF137EXOQpSFVByszG/UX-Library?node-id=295%3A1518
@@ -62,6 +61,23 @@ export declare const BLOCKLET_THEME_LIGHT: ThemeOptions;
62
61
  export declare const BLOCKLET_THEME_DARK: ThemeOptions;
63
62
  export declare const DID_CONNECT_THEME_LIGHT: import("@mui/material/styles").ThemeOptions;
64
63
  export declare const DID_CONNECT_THEME_DARK: import("@mui/material/styles").ThemeOptions;
64
+ export declare const BLOCKLET_THEME_PREFER_KEY = "blocklet_theme_prefer";
65
+ export declare const merge: <T>(x: T, y: Partial<T>) => T;
66
+ export declare function isValidThemeMode(mode: any): mode is PaletteMode;
67
+ export declare function getDefaultThemePrefer(meta?: {
68
+ theme: {
69
+ prefer: "light" | "dark" | "system";
70
+ };
71
+ }): PaletteMode;
72
+ export type ThemeSettings = {
73
+ prefer: "light" | "dark" | "system";
74
+ light: ThemeOptions;
75
+ dark: ThemeOptions;
76
+ };
77
+ /** 生成用于服务端注入的初始样式,避免首屏加载闪白 */
78
+ export declare const buildThemeStyles: (theme: ThemeSettings) => string;
79
+ /** 生成用于服务端注入的初始脚本,用于选择 theme mode */
80
+ export declare const buildThemeScript: (theme: ThemeSettings) => string;
65
81
 
66
82
  export {
67
83
  Theme,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "2.13.54",
6
+ "version": "2.13.56",
7
7
  "description": "A preset MUI-based theme configuration designed for use with Blocklet.",
8
8
  "main": "dist/cjs/index.js",
9
9
  "module": "dist/es/index.js",
@@ -55,5 +55,5 @@
55
55
  "ts-jest": "^29.1.2",
56
56
  "typescript": "~5.5.4"
57
57
  },
58
- "gitHead": "6515646bea775127c4c85c737b6233823a0062ec"
58
+ "gitHead": "ebf7d863313f1ce95571b81df01182756395197e"
59
59
  }