@arcblock/ux 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.
@@ -1,14 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState, useRef } from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import { GlobalStyles } from '@mui/material';
5
5
  import { ThemeProvider as MuiThemeProvider, useTheme } from '@mui/material/styles';
6
6
  import StyledEngineProvider from '@mui/material/StyledEngineProvider';
7
7
  import CssBaseline from '@mui/material/CssBaseline';
8
8
  import set from 'lodash/set';
9
- import { BLOCKLET_THEME_PREFER_KEY } from '@blocklet/theme';
9
+ import { BLOCKLET_THEME_PREFER_KEY, getDefaultThemePrefer, isValidThemeMode } from '@blocklet/theme';
10
10
  import useLocationState from '../hooks/use-location-state';
11
- import { createTheme, getDefaultThemePrefer, isTheme, isUxTheme, isValidThemeMode, lazyCreateDefaultTheme } from './theme';
11
+ import { createTheme, isTheme, isUxTheme, lazyCreateDefaultTheme } from './theme';
12
12
  const defaultTheme = createTheme();
13
13
 
14
14
  /** 颜色模式上下文类型 */
@@ -125,6 +125,7 @@ function ColorSchemeProvider({
125
125
  const [mode, setMode] = useState(() => resolveMode(prefer));
126
126
  const parentTheme = useTheme();
127
127
  const location = useLocationState();
128
+ const metaThemeColorRef = useRef(null);
128
129
  const _themeInput = useMemo(() => {
129
130
  let result = {};
130
131
  const createBaseTheme = lazyCreateDefaultTheme(mode);
@@ -192,6 +193,23 @@ function ColorSchemeProvider({
192
193
  sessionStorage.setItem(BLOCKLET_THEME_PREFER_KEY, urlTheme);
193
194
  }
194
195
  }, [location.search]);
196
+
197
+ // 动态设置 <meta name="theme-color" content="..."> 标签,用于控制移动端浏览器状态栏颜色
198
+ useEffect(() => {
199
+ if (!metaThemeColorRef.current) {
200
+ metaThemeColorRef.current = document.querySelector('meta[name="theme-color"]');
201
+ }
202
+ const bgcolor = theme.palette.background.default;
203
+ if (metaThemeColorRef.current) {
204
+ metaThemeColorRef.current.setAttribute('content', bgcolor);
205
+ } else {
206
+ const meta = document.createElement('meta');
207
+ meta.name = 'theme-color';
208
+ meta.content = bgcolor;
209
+ document.head.appendChild(meta);
210
+ metaThemeColorRef.current = meta;
211
+ }
212
+ }, [theme.palette.background.default]);
195
213
  return /*#__PURE__*/_jsx(ColorSchemeContext.Provider, {
196
214
  value: colorSchemeValue,
197
215
  children: /*#__PURE__*/_jsx(BaseThemeProvider, {
@@ -15,12 +15,6 @@ export declare function collectFontFamilies(obj?: {
15
15
  fontFamily?: string;
16
16
  }, fontSet?: Set<string>): Set<string>;
17
17
  export declare function loadFonts(fonts: string[]): Promise<boolean>;
18
- export declare function isValidThemeMode(mode: any): mode is PaletteMode;
19
- export declare function getDefaultThemePrefer(meta?: {
20
- theme: {
21
- prefer: 'light' | 'dark' | 'system';
22
- };
23
- }): PaletteMode;
24
18
  export declare function createDefaultThemeOptions(mode?: PaletteMode): ThemeOptions;
25
19
  export interface UxThemeOptions extends ThemeOptions {
26
20
  disableBlockletTheme?: boolean;
@@ -4,7 +4,7 @@
4
4
  import { createTheme as _createTheme, responsiveFontSizes } from '@mui/material/styles';
5
5
  import { deepmerge } from '@mui/utils';
6
6
  import webfontloader from 'webfontloader';
7
- import { BLOCKLET_THEME_LIGHT, BLOCKLET_THEME_DARK, DEFAULT_FONTS, BLOCKLET_THEME_PREFER_KEY } from '@blocklet/theme';
7
+ import { BLOCKLET_THEME_LIGHT, BLOCKLET_THEME_DARK, DEFAULT_FONTS, getDefaultThemePrefer } from '@blocklet/theme';
8
8
  import { cleanedObj, deepmergeAll } from '../Util';
9
9
 
10
10
  // 默认只加载最基本的 roboto latin 字体
@@ -71,44 +71,6 @@ export function loadFonts(fonts) {
71
71
  });
72
72
  }
73
73
 
74
- // 获取默认主题偏好
75
- export function isValidThemeMode(mode) {
76
- return mode === 'light' || mode === 'dark';
77
- }
78
- export function getDefaultThemePrefer(meta) {
79
- // 跟随 url theme 参数
80
- const urlParams = new URLSearchParams(window.location.search);
81
- const urlPrefer = urlParams.get('theme');
82
- if (isValidThemeMode(urlPrefer)) {
83
- return urlPrefer;
84
- }
85
-
86
- // 跟随 session theme
87
- const sessionPrefer = sessionStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
88
- if (isValidThemeMode(sessionPrefer)) {
89
- return sessionPrefer;
90
- }
91
-
92
- // 跟随 blocklet theme mode
93
- const prefer = Object.assign({}, window.blocklet, meta).theme?.prefer;
94
- if (prefer === 'light' || prefer === 'dark') {
95
- return prefer;
96
- }
97
- if (prefer === 'system') {
98
- // 跟随本地缓存
99
- const localPrefer = localStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
100
- if (isValidThemeMode(localPrefer)) {
101
- return localPrefer;
102
- }
103
-
104
- // 跟随系统
105
- return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
106
- }
107
-
108
- // fallback
109
- return 'light';
110
- }
111
-
112
74
  // 创建默认主题配置
113
75
  export function createDefaultThemeOptions(mode = 'light') {
114
76
  if (mode === 'dark') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcblock/ux",
3
- "version": "2.13.54",
3
+ "version": "2.13.56",
4
4
  "description": "Common used react components for arcblock products",
5
5
  "keywords": [
6
6
  "react",
@@ -71,14 +71,14 @@
71
71
  "react": ">=18.2.0",
72
72
  "react-router-dom": ">=6.22.3"
73
73
  },
74
- "gitHead": "6515646bea775127c4c85c737b6233823a0062ec",
74
+ "gitHead": "ebf7d863313f1ce95571b81df01182756395197e",
75
75
  "dependencies": {
76
76
  "@arcblock/did-motif": "^1.1.13",
77
- "@arcblock/icons": "^2.13.54",
78
- "@arcblock/nft-display": "^2.13.54",
79
- "@arcblock/react-hooks": "^2.13.54",
77
+ "@arcblock/icons": "^2.13.56",
78
+ "@arcblock/nft-display": "^2.13.56",
79
+ "@arcblock/react-hooks": "^2.13.56",
80
80
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
81
- "@blocklet/theme": "^2.13.54",
81
+ "@blocklet/theme": "^2.13.56",
82
82
  "@fontsource/roboto": "~5.1.1",
83
83
  "@fontsource/ubuntu-mono": "^5.0.18",
84
84
  "@iconify-icons/logos": "^1.2.36",
@@ -1,23 +1,14 @@
1
- import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
1
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState, useRef } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { GlobalStyles, PaletteMode } from '@mui/material';
4
4
  import { ThemeProvider as MuiThemeProvider, Theme, ThemeOptions, useTheme } from '@mui/material/styles';
5
5
  import StyledEngineProvider from '@mui/material/StyledEngineProvider';
6
6
  import CssBaseline from '@mui/material/CssBaseline';
7
7
  import set from 'lodash/set';
8
- import { BLOCKLET_THEME_PREFER_KEY } from '@blocklet/theme';
8
+ import { BLOCKLET_THEME_PREFER_KEY, getDefaultThemePrefer, isValidThemeMode } from '@blocklet/theme';
9
9
 
10
10
  import useLocationState from '../hooks/use-location-state';
11
-
12
- import {
13
- createTheme,
14
- getDefaultThemePrefer,
15
- isTheme,
16
- isUxTheme,
17
- isValidThemeMode,
18
- lazyCreateDefaultTheme,
19
- type UxThemeOptions,
20
- } from './theme';
11
+ import { createTheme, isTheme, isUxTheme, lazyCreateDefaultTheme, type UxThemeOptions } from './theme';
21
12
 
22
13
  const defaultTheme = createTheme();
23
14
 
@@ -170,6 +161,7 @@ function ColorSchemeProvider({
170
161
  const [mode, setMode] = useState<PaletteMode>(() => resolveMode(prefer));
171
162
  const parentTheme = useTheme();
172
163
  const location = useLocationState();
164
+ const metaThemeColorRef = useRef<HTMLMetaElement | null>(null);
173
165
 
174
166
  const _themeInput = useMemo(() => {
175
167
  let result: UxThemeOptions = {};
@@ -240,6 +232,25 @@ function ColorSchemeProvider({
240
232
  }
241
233
  }, [location.search]);
242
234
 
235
+ // 动态设置 <meta name="theme-color" content="..."> 标签,用于控制移动端浏览器状态栏颜色
236
+ useEffect(() => {
237
+ if (!metaThemeColorRef.current) {
238
+ metaThemeColorRef.current = document.querySelector('meta[name="theme-color"]');
239
+ }
240
+
241
+ const bgcolor = theme.palette.background.default;
242
+
243
+ if (metaThemeColorRef.current) {
244
+ metaThemeColorRef.current.setAttribute('content', bgcolor);
245
+ } else {
246
+ const meta = document.createElement('meta');
247
+ meta.name = 'theme-color';
248
+ meta.content = bgcolor;
249
+ document.head.appendChild(meta);
250
+ metaThemeColorRef.current = meta;
251
+ }
252
+ }, [theme.palette.background.default]);
253
+
243
254
  return (
244
255
  <ColorSchemeContext.Provider value={colorSchemeValue}>
245
256
  <BaseThemeProvider theme={theme} {...rest}>
@@ -4,7 +4,7 @@ import type { PaletteMode, Theme } from '@mui/material';
4
4
  import { createTheme as _createTheme, responsiveFontSizes, type ThemeOptions } from '@mui/material/styles';
5
5
  import { deepmerge } from '@mui/utils';
6
6
  import webfontloader from 'webfontloader';
7
- import { BLOCKLET_THEME_LIGHT, BLOCKLET_THEME_DARK, DEFAULT_FONTS, BLOCKLET_THEME_PREFER_KEY } from '@blocklet/theme';
7
+ import { BLOCKLET_THEME_LIGHT, BLOCKLET_THEME_DARK, DEFAULT_FONTS, getDefaultThemePrefer } from '@blocklet/theme';
8
8
  import { cleanedObj, deepmergeAll } from '../Util';
9
9
 
10
10
  // 默认只加载最基本的 roboto latin 字体
@@ -80,46 +80,6 @@ export function loadFonts(fonts: string[]) {
80
80
  });
81
81
  }
82
82
 
83
- // 获取默认主题偏好
84
- export function isValidThemeMode(mode: any): mode is PaletteMode {
85
- return mode === 'light' || mode === 'dark';
86
- }
87
-
88
- export function getDefaultThemePrefer(meta?: { theme: { prefer: 'light' | 'dark' | 'system' } }): PaletteMode {
89
- // 跟随 url theme 参数
90
- const urlParams = new URLSearchParams(window.location.search);
91
- const urlPrefer = urlParams.get('theme');
92
- if (isValidThemeMode(urlPrefer)) {
93
- return urlPrefer;
94
- }
95
-
96
- // 跟随 session theme
97
- const sessionPrefer = sessionStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
98
- if (isValidThemeMode(sessionPrefer)) {
99
- return sessionPrefer;
100
- }
101
-
102
- // 跟随 blocklet theme mode
103
- const prefer = Object.assign({}, window.blocklet, meta).theme?.prefer;
104
- if (prefer === 'light' || prefer === 'dark') {
105
- return prefer;
106
- }
107
-
108
- if (prefer === 'system') {
109
- // 跟随本地缓存
110
- const localPrefer = localStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
111
- if (isValidThemeMode(localPrefer)) {
112
- return localPrefer;
113
- }
114
-
115
- // 跟随系统
116
- return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
117
- }
118
-
119
- // fallback
120
- return 'light';
121
- }
122
-
123
83
  // 创建默认主题配置
124
84
  export function createDefaultThemeOptions(mode: PaletteMode = 'light') {
125
85
  if (mode === 'dark') {