@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.
- package/lib/Theme/theme-provider.js +21 -3
- package/lib/Theme/theme.d.ts +0 -6
- package/lib/Theme/theme.js +1 -39
- package/package.json +6 -6
- package/src/Theme/theme-provider.tsx +23 -12
- package/src/Theme/theme.ts +1 -41
@@ -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,
|
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, {
|
package/lib/Theme/theme.d.ts
CHANGED
@@ -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;
|
package/lib/Theme/theme.js
CHANGED
@@ -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,
|
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.
|
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": "
|
74
|
+
"gitHead": "ebf7d863313f1ce95571b81df01182756395197e",
|
75
75
|
"dependencies": {
|
76
76
|
"@arcblock/did-motif": "^1.1.13",
|
77
|
-
"@arcblock/icons": "^2.13.
|
78
|
-
"@arcblock/nft-display": "^2.13.
|
79
|
-
"@arcblock/react-hooks": "^2.13.
|
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.
|
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}>
|
package/src/Theme/theme.ts
CHANGED
@@ -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,
|
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') {
|