@arcblock/ux 3.4.15 → 3.5.1
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/package.json.js +1 -1
- package/package.json +10 -7
- package/src/ActionButton/ActionButton.stories.jsx +0 -61
- package/src/ActionButton/index.jsx +0 -106
- package/src/ActivityIndicator/ActivityIndicator.stories.jsx +0 -9
- package/src/ActivityIndicator/index.jsx +0 -140
- package/src/Address/Address.stories.jsx +0 -38
- package/src/Address/compact-text.jsx +0 -76
- package/src/Address/did-address.tsx +0 -223
- package/src/Address/index.tsx +0 -21
- package/src/Address/responsive-did-address.tsx +0 -154
- package/src/Alert/Alert.stories.jsx +0 -100
- package/src/Alert/index.jsx +0 -130
- package/src/AnimationWaiter/AnimationWaiter.stories.jsx +0 -35
- package/src/AnimationWaiter/dark-animation.json +0 -1
- package/src/AnimationWaiter/default-animation.json +0 -1
- package/src/AnimationWaiter/index.jsx +0 -296
- package/src/Async/index.tsx +0 -44
- package/src/Avatar/Avatar.stories.jsx +0 -11
- package/src/Avatar/did-motif.jsx +0 -38
- package/src/Avatar/etherscan-blockies.js +0 -81
- package/src/Avatar/index.jsx +0 -195
- package/src/Badge/Badge.stories.jsx +0 -41
- package/src/Badge/index.jsx +0 -101
- package/src/Blocklet/Blocklet.stories.jsx +0 -21
- package/src/Blocklet/blocklet.jsx +0 -276
- package/src/Blocklet/index.js +0 -5
- package/src/Blocklet/utils.jsx +0 -58
- package/src/BlockletContext/index.tsx +0 -72
- package/src/BlockletNFT/BlockletNFT.stories.jsx +0 -21
- package/src/BlockletNFT/index.jsx +0 -378
- package/src/BlockletV2/Blocklet.stories.jsx +0 -34
- package/src/BlockletV2/blocklet.tsx +0 -247
- package/src/BlockletV2/components/icon-text.tsx +0 -47
- package/src/BlockletV2/components/tooltip-icon.tsx +0 -52
- package/src/BlockletV2/index.ts +0 -6
- package/src/BlockletV2/utils.js +0 -75
- package/src/Button/Button.stories.jsx +0 -24
- package/src/Button/index.js +0 -9
- package/src/Button/wrap.jsx +0 -126
- package/src/ButtonGroup/index.js +0 -16
- package/src/CardSelector/index.tsx +0 -136
- package/src/Center/Center.stories.jsx +0 -20
- package/src/Center/index.tsx +0 -33
- package/src/ClickToCopy/ClickToCopy.stories.jsx +0 -24
- package/src/ClickToCopy/copy-button.tsx +0 -43
- package/src/ClickToCopy/hook.ts +0 -42
- package/src/ClickToCopy/index.tsx +0 -96
- package/src/CloseButton/index.tsx +0 -37
- package/src/CodeBlock/CodeBlock.stories.jsx +0 -22
- package/src/CodeBlock/LightBox.tsx +0 -87
- package/src/CodeBlock/index.tsx +0 -217
- package/src/Colors/Colors.stories.jsx +0 -211
- package/src/Colors/index.ts +0 -4
- package/src/Colors/themes/default.ts +0 -8
- package/src/Colors/themes/did-connect.ts +0 -64
- package/src/Colors/themes/temp.ts +0 -52
- package/src/Config/Config.stories.jsx +0 -16
- package/src/Config/config-provider.tsx +0 -62
- package/src/Config/index.ts +0 -2
- package/src/Config/theme-mode-toggle.tsx +0 -38
- package/src/ContactForm/ContactForm.stories.jsx +0 -32
- package/src/ContactForm/index.tsx +0 -264
- package/src/CookieConsent/CookieConsent.stories.jsx +0 -33
- package/src/CookieConsent/index.tsx +0 -104
- package/src/CountDown/CountDown.stories.jsx +0 -15
- package/src/CountDown/index.tsx +0 -170
- package/src/DID/DID.stories.jsx +0 -37
- package/src/DID/index.tsx +0 -393
- package/src/DIDConnect/app-icon.tsx +0 -37
- package/src/DIDConnect/app-info-item.tsx +0 -93
- package/src/DIDConnect/auth-apps/auth-apps-info.tsx +0 -77
- package/src/DIDConnect/auth-apps/index.tsx +0 -278
- package/src/DIDConnect/auth-apps/switch-role.tsx +0 -47
- package/src/DIDConnect/did-connect-container.tsx +0 -326
- package/src/DIDConnect/did-connect-footer.tsx +0 -76
- package/src/DIDConnect/did-connect-logo.tsx +0 -8
- package/src/DIDConnect/icons/did-wallet-logo.tsx +0 -18
- package/src/DIDConnect/icons/github-logo.tsx +0 -17
- package/src/DIDConnect/index.ts +0 -11
- package/src/DIDConnect/landing-page.tsx +0 -218
- package/src/DIDConnect/powered-by.tsx +0 -48
- package/src/DIDConnect/provider-icon.tsx +0 -62
- package/src/DIDConnect/request-storage-access-api-dialog.tsx +0 -304
- package/src/DIDConnect/with-container.tsx +0 -323
- package/src/DIDConnect/with-ux-theme.tsx +0 -22
- package/src/DIDLogo/Logo.stories.jsx +0 -11
- package/src/DIDLogo/index.tsx +0 -168
- package/src/Datatable/CustomToolbar.jsx +0 -415
- package/src/Datatable/Datatable.stories.jsx +0 -92
- package/src/Datatable/DatatableContext.jsx +0 -35
- package/src/Datatable/TableSearch.jsx +0 -166
- package/src/Datatable/index.jsx +0 -652
- package/src/Datatable/utils.js +0 -161
- package/src/Dialog/Dialog.stories.jsx +0 -21
- package/src/Dialog/confirm.jsx +0 -143
- package/src/Dialog/dialog.jsx +0 -199
- package/src/Dialog/index.js +0 -4
- package/src/Dialog/types.d.ts +0 -20
- package/src/Dialog/use-confirm.jsx +0 -188
- package/src/DriftBot/index.tsx +0 -81
- package/src/Earth/Earth.stories.jsx +0 -39
- package/src/Earth/countries.json +0 -8057
- package/src/Earth/index.tsx +0 -515
- package/src/Earth/util.ts +0 -72
- package/src/Empty/Empty.stories.jsx +0 -23
- package/src/Empty/index.jsx +0 -48
- package/src/ErrorBoundary/ErrorBoundary.stories.jsx +0 -13
- package/src/ErrorBoundary/fallback.tsx +0 -85
- package/src/ErrorBoundary/index.ts +0 -1
- package/src/Footer/Footer.stories.jsx +0 -13
- package/src/Footer/index.tsx +0 -130
- package/src/Header/Header.stories.jsx +0 -30
- package/src/Header/addon-button.tsx +0 -41
- package/src/Header/auto-hidden.tsx +0 -31
- package/src/Header/header-addons.tsx +0 -37
- package/src/Header/header.tsx +0 -214
- package/src/Header/index.ts +0 -3
- package/src/Header/responsive-header.tsx +0 -145
- package/src/Icon/Icon.stories.jsx +0 -45
- package/src/Icon/image.tsx +0 -53
- package/src/Icon/index.tsx +0 -63
- package/src/Img/Img.stories.jsx +0 -17
- package/src/Img/index.jsx +0 -258
- package/src/InfoRow/InfoRow.stories.jsx +0 -14
- package/src/InfoRow/index.tsx +0 -91
- package/src/Layout/Layout.stories.jsx +0 -24
- package/src/Layout/dashboard/external-link.tsx +0 -59
- package/src/Layout/dashboard/full-page.tsx +0 -58
- package/src/Layout/dashboard/index.tsx +0 -260
- package/src/Layout/dashboard/sidebar.tsx +0 -198
- package/src/Layout/dashboard-legacy/header.tsx +0 -156
- package/src/Layout/dashboard-legacy/index.tsx +0 -127
- package/src/Layout/dashboard-legacy/sidebar.tsx +0 -129
- package/src/Layout/index.tsx +0 -310
- package/src/LoadingMask/index.tsx +0 -108
- package/src/Locale/LocaleSelector.stories.jsx +0 -44
- package/src/Locale/browser-lang.ts +0 -65
- package/src/Locale/context.tsx +0 -162
- package/src/Locale/languages.ts +0 -58
- package/src/Locale/selector.tsx +0 -174
- package/src/Locale/util.ts +0 -38
- package/src/Logo/Logo.stories.jsx +0 -23
- package/src/Logo/images/logo-dark-text.svg +0 -3
- package/src/Logo/images/logo-dark-top.svg +0 -6
- package/src/Logo/images/logo-light-text.svg +0 -3
- package/src/Logo/images/logo-light-top.svg +0 -6
- package/src/Logo/index.tsx +0 -58
- package/src/Metric/Metric.stories.jsx +0 -29
- package/src/Metric/index.tsx +0 -130
- package/src/MuiWrap/index.tsx +0 -10
- package/src/NFTDisplay/NFTBroken.svg +0 -34
- package/src/NFTDisplay/NFTDisplay.stories.jsx +0 -30
- package/src/NFTDisplay/README.md +0 -59
- package/src/NFTDisplay/aspect-ratio-container.tsx +0 -36
- package/src/NFTDisplay/broken.tsx +0 -51
- package/src/NFTDisplay/displayApi.ts +0 -43
- package/src/NFTDisplay/index.tsx +0 -393
- package/src/NFTDisplay/loading.tsx +0 -16
- package/src/NFTDisplay/preview.tsx +0 -84
- package/src/NFTDisplay/render-svg.tsx +0 -21
- package/src/NFTDisplay/svg-embedder/img.tsx +0 -27
- package/src/NFTDisplay/svg-embedder/inline-svg.tsx +0 -36
- package/src/NavMenu/NavMenu.stories.jsx +0 -17
- package/src/NavMenu/images/OCAP.svg +0 -1
- package/src/NavMenu/images/abt-network.svg +0 -1
- package/src/NavMenu/images/ai-kit.svg +0 -1
- package/src/NavMenu/images/aigne-image-smith.svg +0 -1
- package/src/NavMenu/images/aigne.svg +0 -1
- package/src/NavMenu/images/aistro.png +0 -0
- package/src/NavMenu/images/arcsphere.svg +0 -1
- package/src/NavMenu/images/blocklet-framework.svg +0 -1
- package/src/NavMenu/images/blocklet-launcher.svg +0 -1
- package/src/NavMenu/images/blocklet-server.svg +0 -1
- package/src/NavMenu/images/blocklet-store.svg +0 -1
- package/src/NavMenu/images/creator-studio.svg +0 -1
- package/src/NavMenu/images/did-wallet.svg +0 -1
- package/src/NavMenu/images/did.svg +0 -1
- package/src/NavMenu/images/nft-studio.svg +0 -1
- package/src/NavMenu/images/payment-kit.png +0 -0
- package/src/NavMenu/images/vc.svg +0 -1
- package/src/NavMenu/images/web3-kit.svg +0 -1
- package/src/NavMenu/index.ts +0 -3
- package/src/NavMenu/nav-menu-context.tsx +0 -30
- package/src/NavMenu/nav-menu.tsx +0 -441
- package/src/NavMenu/products.tsx +0 -830
- package/src/NavMenu/style.ts +0 -258
- package/src/NavMenu/sub-container.tsx +0 -125
- package/src/NavMenu/sub-item-group.tsx +0 -42
- package/src/OrgTransfer/index.tsx +0 -53
- package/src/OrgTransfer/locales.ts +0 -25
- package/src/OrgTransfer/selector.tsx +0 -252
- package/src/OrgTransfer/type.ts +0 -31
- package/src/PageScroller/index.tsx +0 -316
- package/src/PageScroller/story/FifthComponent.jsx +0 -7
- package/src/PageScroller/story/FirstComponent.jsx +0 -7
- package/src/PageScroller/story/FourthComponent.jsx +0 -7
- package/src/PageScroller/story/FullPage.jsx +0 -55
- package/src/PageScroller/story/PageContain.jsx +0 -59
- package/src/PageScroller/story/PageScroller.stories.jsx +0 -18
- package/src/PageScroller/story/SecondComponent.jsx +0 -7
- package/src/PageScroller/story/ThirdComponent.jsx +0 -7
- package/src/PageScroller/story/index.css +0 -115
- package/src/PageScroller/usePrevValue.ts +0 -11
- package/src/Passport/index.ts +0 -3
- package/src/Passport/passport.tsx +0 -118
- package/src/PhoneInput/PhoneInput.stories.jsx +0 -12
- package/src/PhoneInput/country-select.tsx +0 -148
- package/src/PhoneInput/index.tsx +0 -269
- package/src/PoweredByArcBlock/index.tsx +0 -27
- package/src/PricingTable/PricingPlan.tsx +0 -120
- package/src/PricingTable/PricingTable.stories.jsx +0 -38
- package/src/PricingTable/index.tsx +0 -59
- package/src/QRCode/QRCode.stories.jsx +0 -13
- package/src/QRCode/index.tsx +0 -66
- package/src/RelativeTime/RelativeTime.stories.jsx +0 -20
- package/src/RelativeTime/index.tsx +0 -334
- package/src/Result/Result.stories.jsx +0 -61
- package/src/Result/common.tsx +0 -119
- package/src/Result/index.tsx +0 -30
- package/src/Result/result.tsx +0 -65
- package/src/Result/translations.ts +0 -57
- package/src/Screenshot/BaseScreenshot/index.tsx +0 -73
- package/src/Screenshot/BaseScreenshot/shells/Macbook.tsx +0 -38
- package/src/Screenshot/BaseScreenshot/shells/Phone.tsx +0 -35
- package/src/Screenshot/Screenshot.stories.jsx +0 -44
- package/src/Screenshot/devices.css +0 -1366
- package/src/Screenshot/index.tsx +0 -300
- package/src/SessionBlocklet/index.tsx +0 -178
- package/src/SessionManager/SessionManager.stories.jsx +0 -9
- package/src/SessionManager/index.tsx +0 -3
- package/src/SessionPermission/index.tsx +0 -26
- package/src/SessionUser/components/did-space.tsx +0 -68
- package/src/SessionUser/components/logged-in.tsx +0 -338
- package/src/SessionUser/components/quick-login-item.tsx +0 -132
- package/src/SessionUser/components/session-user-item.tsx +0 -93
- package/src/SessionUser/components/session-user-switch.tsx +0 -240
- package/src/SessionUser/components/un-login.tsx +0 -257
- package/src/SessionUser/components/user-info.tsx +0 -201
- package/src/SessionUser/index.tsx +0 -68
- package/src/SessionUser/libs/translation.ts +0 -30
- package/src/SessionUser/libs/utils.ts +0 -39
- package/src/SharedBridge/index.tsx +0 -126
- package/src/SocialShare/index.tsx +0 -194
- package/src/Sparkline/Sparkline.stories.jsx +0 -13
- package/src/Sparkline/index.tsx +0 -231
- package/src/Spinner/Spinner.stories.jsx +0 -98
- package/src/Spinner/index.tsx +0 -20
- package/src/SplitButton/SplitButton.stories.jsx +0 -32
- package/src/SplitButton/index.tsx +0 -116
- package/src/SplitButton/useClickAway.tsx +0 -24
- package/src/Success/index.tsx +0 -175
- package/src/Switch/Switch.stories.jsx +0 -16
- package/src/Switch/index.jsx +0 -79
- package/src/Tabs/Tabs.stories.jsx +0 -18
- package/src/Tabs/index.tsx +0 -255
- package/src/Tag/Tag.stories.jsx +0 -15
- package/src/Tag/index.jsx +0 -106
- package/src/TextCollapse/TextCollapse.stories.jsx +0 -73
- package/src/TextCollapse/index.tsx +0 -85
- package/src/Theme/Theme.stories.jsx +0 -11
- package/src/Theme/index.ts +0 -21
- package/src/Theme/theme-provider.tsx +0 -374
- package/src/Theme/theme.ts +0 -229
- package/src/Toast/Toast.stories.jsx +0 -28
- package/src/Toast/index.tsx +0 -80
- package/src/Typography/index.tsx +0 -124
- package/src/UserCard/Cards/avatar-only.tsx +0 -27
- package/src/UserCard/Cards/basic-info.tsx +0 -43
- package/src/UserCard/Cards/index.tsx +0 -16
- package/src/UserCard/Cards/social-actions.tsx +0 -196
- package/src/UserCard/Container/card.tsx +0 -63
- package/src/UserCard/Container/dialog.tsx +0 -37
- package/src/UserCard/Content/basic.tsx +0 -330
- package/src/UserCard/Content/clock.tsx +0 -82
- package/src/UserCard/Content/minimal.tsx +0 -113
- package/src/UserCard/Content/shorten-label.tsx +0 -32
- package/src/UserCard/Content/tooltip-avatar.tsx +0 -80
- package/src/UserCard/UserCard.stories.jsx +0 -19
- package/src/UserCard/components.tsx +0 -81
- package/src/UserCard/index.tsx +0 -132
- package/src/UserCard/types.ts +0 -165
- package/src/UserCard/use-follow.tsx +0 -111
- package/src/UserCard/utils.ts +0 -155
- package/src/Util/WebWalletOpener.stories.jsx +0 -5
- package/src/Util/client.ts +0 -4
- package/src/Util/constant.ts +0 -70
- package/src/Util/deprecate.tsx +0 -29
- package/src/Util/federated.ts +0 -125
- package/src/Util/iframe.ts +0 -19
- package/src/Util/index.ts +0 -760
- package/src/Util/logger.ts +0 -44
- package/src/Util/passport.ts +0 -127
- package/src/Util/security.ts +0 -72
- package/src/Util/style.ts +0 -17
- package/src/Util/wallet.ts +0 -35
- package/src/VerificationCode/index.tsx +0 -83
- package/src/Video/Video.stories.jsx +0 -6
- package/src/Video/index.tsx +0 -70
- package/src/Wallet/Action.stories.jsx +0 -8
- package/src/Wallet/Action.tsx +0 -118
- package/src/Wallet/Download.stories.jsx +0 -9
- package/src/Wallet/Download.tsx +0 -157
- package/src/Wallet/Open.tsx +0 -47
- package/src/Wallet/OpenInWallet.stories.jsx +0 -5
- package/src/Wallet/images/abtwallet.png +0 -0
- package/src/Wallet/images/android_download.svg +0 -22
- package/src/Wallet/images/app-store.svg +0 -30
- package/src/Wallet/images/google-play.svg +0 -69
- package/src/WalletOSIcon/index.tsx +0 -47
- package/src/WebWalletSWKeeper/index.tsx +0 -117
- package/src/WechatPrompt/images/android.png +0 -0
- package/src/WechatPrompt/images/ios.png +0 -0
- package/src/WechatPrompt/index.tsx +0 -75
- package/src/global.d.ts +0 -28
- package/src/hooks/use-blocklet-logo.tsx +0 -32
- package/src/hooks/use-clock.tsx +0 -62
- package/src/hooks/use-location-state.tsx +0 -117
- package/src/hooks/use-mobile.tsx +0 -6
- package/src/index.ts +0 -79
- package/src/type.d.ts +0 -44
- package/src/withTheme/index.tsx +0 -72
- package/src/withTracker/README.md +0 -37
- package/src/withTracker/action/bind-wallet.tsx +0 -17
- package/src/withTracker/action/login.tsx +0 -18
- package/src/withTracker/action/pay.tsx +0 -14
- package/src/withTracker/action/switch-passport.tsx +0 -20
- package/src/withTracker/constant/index.tsx +0 -3
- package/src/withTracker/env.tsx +0 -1
- package/src/withTracker/error_boundary.jsx +0 -34
- package/src/withTracker/index.tsx +0 -50
- package/src/withTracker/libs/utm.ts +0 -46
- package/vite.config.mjs +0 -37
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
import { createContext, useCallback, use, useEffect, useMemo, useState, useRef } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
GlobalStyles,
|
|
4
|
-
PaletteMode,
|
|
5
|
-
StyledEngineProvider,
|
|
6
|
-
ThemeProvider as MuiThemeProvider,
|
|
7
|
-
Theme,
|
|
8
|
-
ThemeOptions,
|
|
9
|
-
useTheme,
|
|
10
|
-
CssBaseline,
|
|
11
|
-
} from '@mui/material';
|
|
12
|
-
import { deepmerge } from '@mui/utils';
|
|
13
|
-
import set from 'lodash/set';
|
|
14
|
-
import isUndefined from 'lodash/isUndefined';
|
|
15
|
-
import { useCreation, useDebounceFn } from 'ahooks';
|
|
16
|
-
import {
|
|
17
|
-
BLOCKLET_THEME_PREFER_KEY,
|
|
18
|
-
getDefaultThemePrefer,
|
|
19
|
-
isValidThemeMode,
|
|
20
|
-
getBlockletThemeOptions,
|
|
21
|
-
type BlockletThemeMeta,
|
|
22
|
-
} from '@blocklet/theme';
|
|
23
|
-
|
|
24
|
-
import { useLocationState } from '../hooks/use-location-state';
|
|
25
|
-
import { createTheme, isTheme, isUxTheme, lazyCreateDefaultTheme, type UxThemeOptions } from './theme';
|
|
26
|
-
|
|
27
|
-
const defaultTheme = createTheme();
|
|
28
|
-
|
|
29
|
-
/** 颜色模式上下文类型 */
|
|
30
|
-
export interface ColorSchemeContextType {
|
|
31
|
-
mode: PaletteMode;
|
|
32
|
-
toggleMode: () => void;
|
|
33
|
-
changeMode: (mode: PaletteMode) => void;
|
|
34
|
-
prefer?: Prefer;
|
|
35
|
-
}
|
|
36
|
-
export type UxTheme = ThemeOptions | ((parentTheme: Theme, context?: { mode: PaletteMode }) => Theme);
|
|
37
|
-
export type Prefer = 'light' | 'dark' | 'system';
|
|
38
|
-
|
|
39
|
-
export const ColorSchemeContext = createContext<ColorSchemeContextType>({} as ColorSchemeContextType);
|
|
40
|
-
export function useColorScheme() {
|
|
41
|
-
return use(ColorSchemeContext);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** 根据偏好获取颜色模式 */
|
|
45
|
-
const resolveMode = (prefer?: Prefer): PaletteMode => {
|
|
46
|
-
// 允许组件的 prefer 属性覆盖 blocklet theme 中配置的 prefer
|
|
47
|
-
if (prefer) {
|
|
48
|
-
if (prefer === 'system') {
|
|
49
|
-
return getDefaultThemePrefer({ theme: { prefer: 'system' } });
|
|
50
|
-
}
|
|
51
|
-
return prefer;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return getDefaultThemePrefer();
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
/** 深色模式全局样式 */
|
|
58
|
-
function DarkSchemeStyles({ className = undefined }: { className?: string }) {
|
|
59
|
-
const theme = useTheme();
|
|
60
|
-
|
|
61
|
-
const trackColor = 'transparent';
|
|
62
|
-
const thumbColor = theme.palette.grey[300];
|
|
63
|
-
|
|
64
|
-
// 处理作用域选择器
|
|
65
|
-
const prefix = (className || '')
|
|
66
|
-
.trim()
|
|
67
|
-
.split(/\s+/)
|
|
68
|
-
.filter(Boolean)
|
|
69
|
-
.map((c) => (c.startsWith('.') ? c : `.${c}`))
|
|
70
|
-
.join(' ');
|
|
71
|
-
|
|
72
|
-
// 统一滚动条样式
|
|
73
|
-
const webkitScrollbar = prefix
|
|
74
|
-
? `${prefix}::-webkit-scrollbar, ${prefix} *::-webkit-scrollbar`
|
|
75
|
-
: '*::-webkit-scrollbar';
|
|
76
|
-
const webkitTrack = prefix
|
|
77
|
-
? `${prefix}::-webkit-scrollbar-track, ${prefix} *::-webkit-scrollbar-track`
|
|
78
|
-
: '*::-webkit-scrollbar-track';
|
|
79
|
-
const webkitThumb = prefix
|
|
80
|
-
? `${prefix}::-webkit-scrollbar-thumb, ${prefix} *::-webkit-scrollbar-thumb`
|
|
81
|
-
: '*::-webkit-scrollbar-thumb';
|
|
82
|
-
const webKitCorner = prefix
|
|
83
|
-
? `${prefix}::-webkit-scrollbar-corner, ${prefix} *::-webkit-scrollbar-corner`
|
|
84
|
-
: '*::-webkit-scrollbar-corner';
|
|
85
|
-
const firefoxSelector = prefix ? `${prefix}, ${prefix} *` : '*';
|
|
86
|
-
|
|
87
|
-
return (
|
|
88
|
-
<GlobalStyles
|
|
89
|
-
styles={{
|
|
90
|
-
// Chrome, Safari, Edge
|
|
91
|
-
'@supports selector(::-webkit-scrollbar)': {
|
|
92
|
-
[webkitScrollbar]: {
|
|
93
|
-
width: '12px',
|
|
94
|
-
height: '12px',
|
|
95
|
-
},
|
|
96
|
-
[webkitTrack]: {
|
|
97
|
-
background: trackColor,
|
|
98
|
-
},
|
|
99
|
-
[webkitThumb]: {
|
|
100
|
-
background: thumbColor,
|
|
101
|
-
borderRadius: '6px',
|
|
102
|
-
border: '2px solid',
|
|
103
|
-
borderColor: trackColor,
|
|
104
|
-
backgroundClip: 'padding-box',
|
|
105
|
-
'&:hover': {
|
|
106
|
-
background: theme.palette.grey[400],
|
|
107
|
-
backgroundClip: 'padding-box',
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
[webKitCorner]: {
|
|
111
|
-
background: trackColor,
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
// Firefox
|
|
115
|
-
'@supports not selector(::-webkit-scrollbar)': {
|
|
116
|
-
[firefoxSelector]: {
|
|
117
|
-
scrollbarWidth: 'auto',
|
|
118
|
-
scrollbarColor: `${thumbColor} ${trackColor}`,
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
}}
|
|
122
|
-
/>
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
let injectedCssBaseline = false;
|
|
127
|
-
const injectedDarkSchemeStylesMap: Record<string, boolean> = {};
|
|
128
|
-
|
|
129
|
-
interface BaseThemeProviderProps {
|
|
130
|
-
children?: React.ReactNode;
|
|
131
|
-
theme?: UxTheme;
|
|
132
|
-
injectFirst?: boolean;
|
|
133
|
-
/** 指定一个类名,DarkSchemeStyles 只会作用于带有该类的元素及其后代 */
|
|
134
|
-
darkSchemeClass?: string;
|
|
135
|
-
/** 禁用样式缓存 */
|
|
136
|
-
disableStyleCache?: boolean;
|
|
137
|
-
}
|
|
138
|
-
/** 快速配置 MUI 主题 */
|
|
139
|
-
function BaseThemeProvider({
|
|
140
|
-
children = null,
|
|
141
|
-
theme = defaultTheme,
|
|
142
|
-
injectFirst = true,
|
|
143
|
-
darkSchemeClass = '',
|
|
144
|
-
disableStyleCache = false,
|
|
145
|
-
}: BaseThemeProviderProps) {
|
|
146
|
-
const _theme = useMemo(() => {
|
|
147
|
-
if (typeof theme === 'function') {
|
|
148
|
-
return theme;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (isTheme(theme)) return theme;
|
|
152
|
-
|
|
153
|
-
// 是 ThemeOptions 则创建一个 theme
|
|
154
|
-
return createTheme(theme);
|
|
155
|
-
}, [theme]);
|
|
156
|
-
|
|
157
|
-
const cssBaseline = useCreation(() => {
|
|
158
|
-
if (disableStyleCache) return <CssBaseline />;
|
|
159
|
-
|
|
160
|
-
if (injectedCssBaseline) return null;
|
|
161
|
-
injectedCssBaseline = true;
|
|
162
|
-
return <CssBaseline />;
|
|
163
|
-
}, [disableStyleCache]);
|
|
164
|
-
|
|
165
|
-
const darkSchemeStyles = useCreation(() => {
|
|
166
|
-
if (disableStyleCache) return <DarkSchemeStyles className={darkSchemeClass} />;
|
|
167
|
-
|
|
168
|
-
if (injectedDarkSchemeStylesMap[darkSchemeClass]) return null;
|
|
169
|
-
injectedDarkSchemeStylesMap[darkSchemeClass] = true;
|
|
170
|
-
return <DarkSchemeStyles className={darkSchemeClass} />;
|
|
171
|
-
}, [darkSchemeClass, disableStyleCache]);
|
|
172
|
-
|
|
173
|
-
return (
|
|
174
|
-
// injectFirst 会影响 makeStyles 自定义样式和 mui styles 覆盖问题
|
|
175
|
-
<StyledEngineProvider injectFirst={injectFirst}>
|
|
176
|
-
<MuiThemeProvider theme={_theme}>
|
|
177
|
-
{cssBaseline}
|
|
178
|
-
{darkSchemeStyles}
|
|
179
|
-
{children}
|
|
180
|
-
</MuiThemeProvider>
|
|
181
|
-
</StyledEngineProvider>
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
interface ColorSchemeProviderProps extends BaseThemeProviderProps {
|
|
186
|
-
prefer?: Prefer;
|
|
187
|
-
disableBlockletTheme?: boolean;
|
|
188
|
-
}
|
|
189
|
-
/** 配置带颜色模式切换功能的 MUI 主题 */
|
|
190
|
-
function ColorSchemeProvider({
|
|
191
|
-
children = null,
|
|
192
|
-
theme: themeInput = undefined,
|
|
193
|
-
prefer = undefined,
|
|
194
|
-
disableBlockletTheme = false,
|
|
195
|
-
...rest
|
|
196
|
-
}: ThemeProviderProps) {
|
|
197
|
-
const parentColorScheme = useColorScheme();
|
|
198
|
-
const [mode, setMode] = useState<PaletteMode>(() => resolveMode(prefer));
|
|
199
|
-
const [themeBuilderConfig, setThemeBuilderConfig] = useState<BlockletThemeMeta | null>(null);
|
|
200
|
-
const parentTheme = useTheme();
|
|
201
|
-
const location = useLocationState();
|
|
202
|
-
const metaThemeColorRef = useRef<HTMLMetaElement | null>(null);
|
|
203
|
-
const isTopColorScheme = isUndefined(parentColorScheme.toggleMode);
|
|
204
|
-
|
|
205
|
-
// 使用防抖函数包装 setThemeBuilderConfig,避免过于频繁的主题修改
|
|
206
|
-
const { run: debouncedSetThemeBuilderConfig } = useDebounceFn(
|
|
207
|
-
(config: BlockletThemeMeta | null) => {
|
|
208
|
-
setThemeBuilderConfig(config);
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
wait: 200,
|
|
212
|
-
}
|
|
213
|
-
);
|
|
214
|
-
|
|
215
|
-
const _themeInput = useMemo(() => {
|
|
216
|
-
let result: UxThemeOptions = {};
|
|
217
|
-
|
|
218
|
-
if (themeInput) {
|
|
219
|
-
const createBaseTheme = lazyCreateDefaultTheme(mode);
|
|
220
|
-
|
|
221
|
-
if (typeof themeInput === 'function') {
|
|
222
|
-
const baseTheme = createBaseTheme();
|
|
223
|
-
|
|
224
|
-
if (isUxTheme(parentTheme)) {
|
|
225
|
-
result = { ...themeInput(parentTheme, { mode }) };
|
|
226
|
-
} else {
|
|
227
|
-
result = { ...themeInput(baseTheme, { mode }) };
|
|
228
|
-
}
|
|
229
|
-
} else {
|
|
230
|
-
result = { ...themeInput };
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// 接受 ThemeBuilder 配置
|
|
235
|
-
let _mode = mode;
|
|
236
|
-
if (themeBuilderConfig) {
|
|
237
|
-
_mode = themeBuilderConfig.mode || 'light';
|
|
238
|
-
result = deepmerge(result, getBlockletThemeOptions(_mode, themeBuilderConfig));
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
set(result, 'palette.mode', _mode);
|
|
242
|
-
set(result, 'mode', _mode);
|
|
243
|
-
|
|
244
|
-
return result;
|
|
245
|
-
}, [mode, themeInput, parentTheme, themeBuilderConfig]);
|
|
246
|
-
|
|
247
|
-
const theme = useMemo(() => {
|
|
248
|
-
return createTheme({ ..._themeInput, disableBlockletTheme: !!themeBuilderConfig || disableBlockletTheme });
|
|
249
|
-
}, [_themeInput, disableBlockletTheme, themeBuilderConfig]);
|
|
250
|
-
|
|
251
|
-
// 切换明/暗模式
|
|
252
|
-
const toggleMode = useCallback(() => {
|
|
253
|
-
const newMode = mode === 'light' ? 'dark' : 'light';
|
|
254
|
-
setMode(newMode);
|
|
255
|
-
sessionStorage.removeItem(BLOCKLET_THEME_PREFER_KEY);
|
|
256
|
-
localStorage.setItem(BLOCKLET_THEME_PREFER_KEY, newMode);
|
|
257
|
-
}, [mode, setMode]);
|
|
258
|
-
|
|
259
|
-
const changeMode = useCallback(
|
|
260
|
-
(newMode: PaletteMode) => {
|
|
261
|
-
if (mode !== newMode) {
|
|
262
|
-
setMode(newMode);
|
|
263
|
-
sessionStorage.removeItem(BLOCKLET_THEME_PREFER_KEY);
|
|
264
|
-
localStorage.setItem(BLOCKLET_THEME_PREFER_KEY, newMode);
|
|
265
|
-
}
|
|
266
|
-
},
|
|
267
|
-
[mode, setMode]
|
|
268
|
-
);
|
|
269
|
-
|
|
270
|
-
const colorSchemeValue = useMemo(
|
|
271
|
-
() => ({
|
|
272
|
-
mode,
|
|
273
|
-
toggleMode,
|
|
274
|
-
changeMode,
|
|
275
|
-
prefer,
|
|
276
|
-
}),
|
|
277
|
-
[mode, prefer, toggleMode, changeMode]
|
|
278
|
-
);
|
|
279
|
-
|
|
280
|
-
// 相应 prefer 或 urlTheme 的改变
|
|
281
|
-
useEffect(() => {
|
|
282
|
-
setMode(resolveMode(prefer));
|
|
283
|
-
}, [prefer, setMode, location.search]);
|
|
284
|
-
|
|
285
|
-
// 会话缓存 urlTheme 便于 App Launching 阶段临时统一 theme mode
|
|
286
|
-
useEffect(() => {
|
|
287
|
-
const urlTheme = new URLSearchParams(location.search).get('theme');
|
|
288
|
-
|
|
289
|
-
if (isValidThemeMode(urlTheme)) {
|
|
290
|
-
sessionStorage.setItem(BLOCKLET_THEME_PREFER_KEY, urlTheme);
|
|
291
|
-
}
|
|
292
|
-
}, [location.search]);
|
|
293
|
-
|
|
294
|
-
// 动态设置 <meta name="theme-color" content="..."> 标签,用于控制移动端浏览器状态栏颜色
|
|
295
|
-
useEffect(() => {
|
|
296
|
-
if (!metaThemeColorRef.current) {
|
|
297
|
-
metaThemeColorRef.current = document.querySelector('meta[name="theme-color"]');
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const bgcolor = theme.palette.background.default;
|
|
301
|
-
|
|
302
|
-
if (metaThemeColorRef.current) {
|
|
303
|
-
metaThemeColorRef.current.setAttribute('content', bgcolor);
|
|
304
|
-
} else {
|
|
305
|
-
const meta = document.createElement('meta');
|
|
306
|
-
meta.name = 'theme-color';
|
|
307
|
-
meta.content = bgcolor;
|
|
308
|
-
document.head.appendChild(meta);
|
|
309
|
-
metaThemeColorRef.current = meta;
|
|
310
|
-
}
|
|
311
|
-
}, [theme.palette.background.default]);
|
|
312
|
-
|
|
313
|
-
// 监听来自 ThemeBuilder 的消息,支持 Blocklet 实时预览
|
|
314
|
-
useEffect(() => {
|
|
315
|
-
const handleMessage = (event: MessageEvent) => {
|
|
316
|
-
// 必须同源
|
|
317
|
-
if (event.origin !== window.origin) return;
|
|
318
|
-
|
|
319
|
-
if (event.data.type === 'THEME_BUILDER_CONFIG_CHANGED') {
|
|
320
|
-
debouncedSetThemeBuilderConfig(event.data.payload);
|
|
321
|
-
}
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
window.addEventListener('message', handleMessage);
|
|
325
|
-
|
|
326
|
-
return () => window.removeEventListener('message', handleMessage);
|
|
327
|
-
}, [debouncedSetThemeBuilderConfig]);
|
|
328
|
-
|
|
329
|
-
// 修改 document[data-theme] 属性
|
|
330
|
-
useEffect(() => {
|
|
331
|
-
if (isTopColorScheme) {
|
|
332
|
-
if (mode === 'dark') {
|
|
333
|
-
document.documentElement.setAttribute('data-theme', 'dark');
|
|
334
|
-
} else {
|
|
335
|
-
document.documentElement.removeAttribute('data-theme');
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}, [isTopColorScheme, mode]);
|
|
339
|
-
|
|
340
|
-
return (
|
|
341
|
-
<ColorSchemeContext value={colorSchemeValue}>
|
|
342
|
-
<BaseThemeProvider theme={theme} {...rest}>
|
|
343
|
-
{children}
|
|
344
|
-
</BaseThemeProvider>
|
|
345
|
-
</ColorSchemeContext>
|
|
346
|
-
);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
export interface ThemeProviderProps extends ColorSchemeProviderProps {
|
|
350
|
-
/** 下列情况会启用 ColorScheme 功能(让 theme 支持明暗模式切换)
|
|
351
|
-
* 1. 显示打开 enableColorScheme
|
|
352
|
-
* 2. 显示设置 prefer
|
|
353
|
-
* 3. 顶层 ThemeProvider
|
|
354
|
-
*/
|
|
355
|
-
enableColorScheme?: boolean;
|
|
356
|
-
}
|
|
357
|
-
export default function ThemeProvider({
|
|
358
|
-
children = null,
|
|
359
|
-
prefer = undefined,
|
|
360
|
-
enableColorScheme = false,
|
|
361
|
-
...props
|
|
362
|
-
}: ThemeProviderProps) {
|
|
363
|
-
const { toggleMode } = useColorScheme();
|
|
364
|
-
|
|
365
|
-
if (enableColorScheme || prefer || !toggleMode) {
|
|
366
|
-
return (
|
|
367
|
-
<ColorSchemeProvider prefer={prefer} {...props}>
|
|
368
|
-
{children}
|
|
369
|
-
</ColorSchemeProvider>
|
|
370
|
-
);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
return <BaseThemeProvider {...props}>{children}</BaseThemeProvider>;
|
|
374
|
-
}
|
package/src/Theme/theme.ts
DELETED
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-shadow */
|
|
2
|
-
// https://app.zeplin.io/styleguide/5d1436f1e97c2156f49c0725/colors
|
|
3
|
-
import { createTheme as _createTheme, responsiveFontSizes, type PaletteMode } from '@mui/material';
|
|
4
|
-
import webfontloader from 'webfontloader';
|
|
5
|
-
import {
|
|
6
|
-
BLOCKLET_THEME_LIGHT,
|
|
7
|
-
BLOCKLET_THEME_DARK,
|
|
8
|
-
DEFAULT_FONTS,
|
|
9
|
-
mergeThemeOptions as deepmerge,
|
|
10
|
-
getDefaultThemePrefer,
|
|
11
|
-
getBlockletThemeOptions,
|
|
12
|
-
type ThemeOptions,
|
|
13
|
-
type Theme,
|
|
14
|
-
} from '@blocklet/theme';
|
|
15
|
-
import { cleanedObj, deepmergeAll } from '../Util';
|
|
16
|
-
|
|
17
|
-
// 默认只加载最基本的 Roboto latin 字体
|
|
18
|
-
import '@fontsource/roboto/latin-400.css';
|
|
19
|
-
import '@fontsource/roboto/latin-500.css';
|
|
20
|
-
import '@fontsource/roboto/latin-700.css';
|
|
21
|
-
import '@fontsource/roboto/latin-ext-400.css';
|
|
22
|
-
import '@fontsource/roboto/latin-ext-500.css';
|
|
23
|
-
import '@fontsource/roboto/latin-ext-700.css';
|
|
24
|
-
|
|
25
|
-
/** 是否是 MUI Theme 对象 */
|
|
26
|
-
export function isTheme(obj: any): obj is Theme {
|
|
27
|
-
return obj && typeof obj === 'object' && obj.palette && typeof obj.palette.getContrastText === 'function';
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** 是否是 UX Theme 对象 */
|
|
31
|
-
export function isUxTheme(obj: any): obj is Theme {
|
|
32
|
-
return isTheme(obj) && obj.__isUxTheme__ === true;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// 收集字体配置
|
|
36
|
-
export function collectFontFamilies(obj?: { fontFamily?: string }, fontSet: Set<string> = new Set()): Set<string> {
|
|
37
|
-
if (!obj || typeof obj !== 'object') return fontSet;
|
|
38
|
-
|
|
39
|
-
if (typeof obj.fontFamily === 'string') {
|
|
40
|
-
obj.fontFamily
|
|
41
|
-
.replace(/"/g, '')
|
|
42
|
-
.split(',')
|
|
43
|
-
.map((font: string) => font.trim())
|
|
44
|
-
.filter(Boolean)
|
|
45
|
-
.forEach((font: string) => fontSet.add(font));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
Object.values(obj).forEach((value) => {
|
|
49
|
-
if (typeof value === 'object') {
|
|
50
|
-
collectFontFamilies(value, fontSet);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
return fontSet;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// 动态加载字体
|
|
58
|
-
const prevFonts = new Set<string>(DEFAULT_FONTS.concat('inherit')); // inherit 属于 MUI 特殊值,无需动态加载
|
|
59
|
-
export function loadFonts(fonts: string[]) {
|
|
60
|
-
// 过滤出未加载的字体
|
|
61
|
-
const unloadedFonts = fonts.filter((font) => !prevFonts.has(font));
|
|
62
|
-
|
|
63
|
-
// 如果所有字体都已加载,直接返回
|
|
64
|
-
if (unloadedFonts.length === 0) {
|
|
65
|
-
return Promise.resolve(true);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// record
|
|
69
|
-
unloadedFonts.forEach((font) => prevFonts.add(font));
|
|
70
|
-
|
|
71
|
-
// support font-display: swap
|
|
72
|
-
const lastFontIndex = unloadedFonts.length - 1;
|
|
73
|
-
unloadedFonts[lastFontIndex] = `${unloadedFonts[lastFontIndex]}&display=swap`;
|
|
74
|
-
|
|
75
|
-
return new Promise<boolean>((resolve) => {
|
|
76
|
-
webfontloader.load({
|
|
77
|
-
google: {
|
|
78
|
-
families: unloadedFonts,
|
|
79
|
-
},
|
|
80
|
-
active: () => resolve(true),
|
|
81
|
-
inactive: () => resolve(true),
|
|
82
|
-
fontinactive: (familyName, fvd) => {
|
|
83
|
-
prevFonts.delete(familyName);
|
|
84
|
-
console.warn(`font ${familyName} ${fvd} download failed`);
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// 创建默认主题配置
|
|
91
|
-
export function createDefaultThemeOptions(mode: PaletteMode = 'light') {
|
|
92
|
-
if (mode === 'dark') {
|
|
93
|
-
return BLOCKLET_THEME_DARK;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return BLOCKLET_THEME_LIGHT;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export interface UxThemeOptions extends ThemeOptions {
|
|
100
|
-
disableBlockletTheme?: boolean;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export function lazyCreateDefaultTheme(mode: PaletteMode) {
|
|
104
|
-
let theme: Theme | null = null;
|
|
105
|
-
|
|
106
|
-
return () => {
|
|
107
|
-
if (theme) return theme;
|
|
108
|
-
|
|
109
|
-
const options = deepmerge(createDefaultThemeOptions(mode), getBlockletThemeOptions(mode));
|
|
110
|
-
|
|
111
|
-
theme = _createTheme(options);
|
|
112
|
-
return theme;
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// 主要处理 overrides
|
|
117
|
-
const normalizeUserThemeOptions = ({ palette, components, overrides, ...rest }: UxThemeOptions) => {
|
|
118
|
-
const result: UxThemeOptions = {
|
|
119
|
-
palette,
|
|
120
|
-
components: {
|
|
121
|
-
...overrides,
|
|
122
|
-
...components,
|
|
123
|
-
},
|
|
124
|
-
...rest,
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
return result;
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
const defaultUxThemeOptions: UxThemeOptions = {
|
|
131
|
-
themeName: 'ArcBlock',
|
|
132
|
-
pageWidth: 'md',
|
|
133
|
-
disableBlockletTheme: false,
|
|
134
|
-
// @deprecated use theme.palette
|
|
135
|
-
colors: {
|
|
136
|
-
white: '#FFFFFF',
|
|
137
|
-
dark: '#4A707C',
|
|
138
|
-
gray: '#222222',
|
|
139
|
-
minor: '#9B9B9B',
|
|
140
|
-
darkText: '#DCDCDC',
|
|
141
|
-
background: '#F7F8F8',
|
|
142
|
-
yellow: '#FFCF71',
|
|
143
|
-
green: '#44cdc6',
|
|
144
|
-
red: '#D0021B',
|
|
145
|
-
blue: '#4E6AF6',
|
|
146
|
-
primary: '#222222',
|
|
147
|
-
black: '#222222',
|
|
148
|
-
secondary: '#44cdc6',
|
|
149
|
-
mint: '#44cdc6',
|
|
150
|
-
textSecondary: '#4A4A4A',
|
|
151
|
-
active: '#5b9025',
|
|
152
|
-
danger: '#D0021B',
|
|
153
|
-
lightGrey: '#BCBCBC',
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
// https://material-ui.com/customization/default-theme/
|
|
158
|
-
export const create = (...args: Array<UxThemeOptions | ((baseTheme: Theme) => UxThemeOptions)>) => {
|
|
159
|
-
const defaultPrefer = getDefaultThemePrefer();
|
|
160
|
-
const createBaseTheme = lazyCreateDefaultTheme(defaultPrefer);
|
|
161
|
-
const userThemeOptions = args.reduce<UxThemeOptions>(
|
|
162
|
-
(acc, curr) =>
|
|
163
|
-
deepmerge(acc, normalizeUserThemeOptions(typeof curr === 'function' ? curr(createBaseTheme()) : curr)),
|
|
164
|
-
normalizeUserThemeOptions(defaultUxThemeOptions)
|
|
165
|
-
);
|
|
166
|
-
const prefer = userThemeOptions.mode || userThemeOptions.palette?.mode || defaultPrefer;
|
|
167
|
-
const blockletThemeOptions = getBlockletThemeOptions(prefer);
|
|
168
|
-
const defaultThemeOptions = createDefaultThemeOptions(prefer);
|
|
169
|
-
const { disableBlockletTheme } = userThemeOptions;
|
|
170
|
-
|
|
171
|
-
// 合并配置
|
|
172
|
-
const mergedThemeOptions = deepmergeAll(
|
|
173
|
-
[
|
|
174
|
-
defaultThemeOptions,
|
|
175
|
-
!disableBlockletTheme && cleanedObj(blockletThemeOptions),
|
|
176
|
-
cleanedObj(userThemeOptions),
|
|
177
|
-
// 确保 mode 跟 prefer 一致
|
|
178
|
-
{
|
|
179
|
-
mode: prefer,
|
|
180
|
-
palette: { mode: prefer },
|
|
181
|
-
},
|
|
182
|
-
].filter(Boolean) as ThemeOptions[]
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
// 创建主题
|
|
186
|
-
const theme = _createTheme(mergedThemeOptions);
|
|
187
|
-
theme.__isUxTheme__ = true;
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* 支持响应式字体,theme.typography.$variant 中会添加 @media 分支,比如
|
|
191
|
-
* {
|
|
192
|
-
* "h1": {
|
|
193
|
-
* "fontSize": "3rem",
|
|
194
|
-
* "@media (min-width:600px)": {
|
|
195
|
-
* "fontSize": "3.3125rem"
|
|
196
|
-
* }
|
|
197
|
-
* }
|
|
198
|
-
* }
|
|
199
|
-
*/
|
|
200
|
-
const enhanced = responsiveFontSizes(theme, {
|
|
201
|
-
breakpoints: ['xs', 'sm', 'md', 'lg'],
|
|
202
|
-
disableAlign: false,
|
|
203
|
-
factor: 3,
|
|
204
|
-
variants: [
|
|
205
|
-
'h1',
|
|
206
|
-
'h2',
|
|
207
|
-
'h3',
|
|
208
|
-
'h4',
|
|
209
|
-
'h5',
|
|
210
|
-
'h6',
|
|
211
|
-
'subtitle1',
|
|
212
|
-
'subtitle2',
|
|
213
|
-
'body1',
|
|
214
|
-
'body2',
|
|
215
|
-
'caption',
|
|
216
|
-
'button',
|
|
217
|
-
'overline',
|
|
218
|
-
],
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
// 异步加载字体
|
|
222
|
-
const fonts = collectFontFamilies(enhanced.typography);
|
|
223
|
-
loadFonts(Array.from(fonts));
|
|
224
|
-
|
|
225
|
-
return enhanced;
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
export const createTheme = create;
|
|
229
|
-
export { deepmerge, deepmergeAll };
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Box } from '@mui/material';
|
|
2
|
-
import { ThemeProvider } from '../Theme';
|
|
3
|
-
import { ThemeModeToggle } from '../Config';
|
|
4
|
-
|
|
5
|
-
export { default as Basic } from './demo/basic';
|
|
6
|
-
export { default as CustomOptions } from './demo/custom-options';
|
|
7
|
-
export { default as ManualClose } from './demo/manual-close';
|
|
8
|
-
|
|
9
|
-
export default {
|
|
10
|
-
title: 'Feedback/Toast',
|
|
11
|
-
parameters: {
|
|
12
|
-
docs: {
|
|
13
|
-
description: {
|
|
14
|
-
component: 'A `iamhosseindhv/notistack` wrapper used to display notifications on web apps.',
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
decorators: [
|
|
19
|
-
(Story) => (
|
|
20
|
-
<ThemeProvider prefer="system">
|
|
21
|
-
<Box>
|
|
22
|
-
<ThemeModeToggle />
|
|
23
|
-
</Box>
|
|
24
|
-
<Story />
|
|
25
|
-
</ThemeProvider>
|
|
26
|
-
),
|
|
27
|
-
],
|
|
28
|
-
};
|
package/src/Toast/index.tsx
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { createRef } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
type OptionsObject,
|
|
4
|
-
type ProviderContext,
|
|
5
|
-
type SnackbarMessage,
|
|
6
|
-
type VariantType,
|
|
7
|
-
type SnackbarKey,
|
|
8
|
-
type SnackbarProviderProps,
|
|
9
|
-
SnackbarProvider,
|
|
10
|
-
useSnackbar,
|
|
11
|
-
} from 'notistack';
|
|
12
|
-
import { IconButton } from '@mui/material';
|
|
13
|
-
import { Close as CloseIcon } from '@mui/icons-material';
|
|
14
|
-
import noop from 'lodash/noop';
|
|
15
|
-
|
|
16
|
-
type EnqueueSnackbar = ProviderContext['enqueueSnackbar'];
|
|
17
|
-
|
|
18
|
-
let success = noop as EnqueueSnackbar;
|
|
19
|
-
let error = noop as EnqueueSnackbar;
|
|
20
|
-
let warning = noop as EnqueueSnackbar;
|
|
21
|
-
let info = noop as EnqueueSnackbar;
|
|
22
|
-
let close: (key?: SnackbarKey) => void = noop;
|
|
23
|
-
|
|
24
|
-
const genFn =
|
|
25
|
-
(enqueueSnackbar: EnqueueSnackbar, variant: VariantType) =>
|
|
26
|
-
(message: SnackbarMessage, opts: OptionsObject = {}) =>
|
|
27
|
-
enqueueSnackbar(message, {
|
|
28
|
-
autoHideDuration: 5000,
|
|
29
|
-
variant,
|
|
30
|
-
...opts,
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
function ToastProvider({ children, anchorOrigin, ...rest }: Omit<SnackbarProviderProps, 'ref' | 'action'>) {
|
|
34
|
-
const notistackRef = createRef<SnackbarProvider>();
|
|
35
|
-
const onClickDismiss = (key: SnackbarKey) => () => {
|
|
36
|
-
notistackRef.current?.closeSnackbar(key);
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<SnackbarProvider
|
|
41
|
-
anchorOrigin={{
|
|
42
|
-
vertical: 'top',
|
|
43
|
-
horizontal: 'right',
|
|
44
|
-
...anchorOrigin,
|
|
45
|
-
}}
|
|
46
|
-
{...rest}
|
|
47
|
-
ref={notistackRef}
|
|
48
|
-
// eslint-disable-next-line react/no-unstable-nested-components
|
|
49
|
-
action={(key) => (
|
|
50
|
-
<IconButton key="close" aria-label="close" color="inherit" onClick={onClickDismiss(key)} size="large">
|
|
51
|
-
<CloseIcon style={{ fontSize: 16 }} />
|
|
52
|
-
</IconButton>
|
|
53
|
-
)}>
|
|
54
|
-
<Toast />
|
|
55
|
-
{children}
|
|
56
|
-
</SnackbarProvider>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function Toast() {
|
|
61
|
-
const { enqueueSnackbar, closeSnackbar } = useSnackbar();
|
|
62
|
-
|
|
63
|
-
success = genFn(enqueueSnackbar, 'success');
|
|
64
|
-
error = genFn(enqueueSnackbar, 'error');
|
|
65
|
-
warning = genFn(enqueueSnackbar, 'warning');
|
|
66
|
-
info = genFn(enqueueSnackbar, 'info');
|
|
67
|
-
close = closeSnackbar;
|
|
68
|
-
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export { ToastProvider };
|
|
73
|
-
|
|
74
|
-
export default {
|
|
75
|
-
success: (message: SnackbarMessage, options: OptionsObject = {}) => success(message, options),
|
|
76
|
-
error: (message: SnackbarMessage, options: OptionsObject = { autoHideDuration: 15000 }) => error(message, options),
|
|
77
|
-
warning: (message: SnackbarMessage, options: OptionsObject = {}) => warning(message, options),
|
|
78
|
-
info: (message: SnackbarMessage, options: OptionsObject = {}) => info(message, options),
|
|
79
|
-
close: (key?: SnackbarKey) => close(key),
|
|
80
|
-
};
|