@arcblock/ux 3.4.14 → 3.5.0

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.
Files changed (335) hide show
  1. package/lib/Util/constant.d.ts +6 -0
  2. package/lib/Util/constant.js +25 -16
  3. package/lib/package.json.js +1 -1
  4. package/package.json +12 -9
  5. package/src/ActionButton/ActionButton.stories.jsx +0 -61
  6. package/src/ActionButton/index.jsx +0 -106
  7. package/src/ActivityIndicator/ActivityIndicator.stories.jsx +0 -9
  8. package/src/ActivityIndicator/index.jsx +0 -140
  9. package/src/Address/Address.stories.jsx +0 -38
  10. package/src/Address/compact-text.jsx +0 -76
  11. package/src/Address/did-address.tsx +0 -223
  12. package/src/Address/index.tsx +0 -21
  13. package/src/Address/responsive-did-address.tsx +0 -154
  14. package/src/Alert/Alert.stories.jsx +0 -100
  15. package/src/Alert/index.jsx +0 -130
  16. package/src/AnimationWaiter/AnimationWaiter.stories.jsx +0 -35
  17. package/src/AnimationWaiter/dark-animation.json +0 -1
  18. package/src/AnimationWaiter/default-animation.json +0 -1
  19. package/src/AnimationWaiter/index.jsx +0 -296
  20. package/src/Async/index.tsx +0 -44
  21. package/src/Avatar/Avatar.stories.jsx +0 -11
  22. package/src/Avatar/did-motif.jsx +0 -38
  23. package/src/Avatar/etherscan-blockies.js +0 -81
  24. package/src/Avatar/index.jsx +0 -195
  25. package/src/Badge/Badge.stories.jsx +0 -41
  26. package/src/Badge/index.jsx +0 -101
  27. package/src/Blocklet/Blocklet.stories.jsx +0 -21
  28. package/src/Blocklet/blocklet.jsx +0 -276
  29. package/src/Blocklet/index.js +0 -5
  30. package/src/Blocklet/utils.jsx +0 -58
  31. package/src/BlockletContext/index.tsx +0 -72
  32. package/src/BlockletNFT/BlockletNFT.stories.jsx +0 -21
  33. package/src/BlockletNFT/index.jsx +0 -378
  34. package/src/BlockletV2/Blocklet.stories.jsx +0 -34
  35. package/src/BlockletV2/blocklet.tsx +0 -247
  36. package/src/BlockletV2/components/icon-text.tsx +0 -47
  37. package/src/BlockletV2/components/tooltip-icon.tsx +0 -52
  38. package/src/BlockletV2/index.ts +0 -6
  39. package/src/BlockletV2/utils.js +0 -75
  40. package/src/Button/Button.stories.jsx +0 -24
  41. package/src/Button/index.js +0 -9
  42. package/src/Button/wrap.jsx +0 -126
  43. package/src/ButtonGroup/index.js +0 -16
  44. package/src/CardSelector/index.tsx +0 -136
  45. package/src/Center/Center.stories.jsx +0 -20
  46. package/src/Center/index.tsx +0 -33
  47. package/src/ClickToCopy/ClickToCopy.stories.jsx +0 -24
  48. package/src/ClickToCopy/copy-button.tsx +0 -43
  49. package/src/ClickToCopy/hook.ts +0 -42
  50. package/src/ClickToCopy/index.tsx +0 -96
  51. package/src/CloseButton/index.tsx +0 -37
  52. package/src/CodeBlock/CodeBlock.stories.jsx +0 -22
  53. package/src/CodeBlock/LightBox.tsx +0 -87
  54. package/src/CodeBlock/index.tsx +0 -217
  55. package/src/Colors/Colors.stories.jsx +0 -211
  56. package/src/Colors/index.ts +0 -4
  57. package/src/Colors/themes/default.ts +0 -8
  58. package/src/Colors/themes/did-connect.ts +0 -64
  59. package/src/Colors/themes/temp.ts +0 -52
  60. package/src/Config/Config.stories.jsx +0 -16
  61. package/src/Config/config-provider.tsx +0 -62
  62. package/src/Config/index.ts +0 -2
  63. package/src/Config/theme-mode-toggle.tsx +0 -38
  64. package/src/ContactForm/ContactForm.stories.jsx +0 -32
  65. package/src/ContactForm/index.tsx +0 -264
  66. package/src/CookieConsent/CookieConsent.stories.jsx +0 -33
  67. package/src/CookieConsent/index.tsx +0 -104
  68. package/src/CountDown/CountDown.stories.jsx +0 -15
  69. package/src/CountDown/index.tsx +0 -170
  70. package/src/DID/DID.stories.jsx +0 -37
  71. package/src/DID/index.tsx +0 -393
  72. package/src/DIDConnect/app-icon.tsx +0 -37
  73. package/src/DIDConnect/app-info-item.tsx +0 -93
  74. package/src/DIDConnect/auth-apps/auth-apps-info.tsx +0 -77
  75. package/src/DIDConnect/auth-apps/index.tsx +0 -278
  76. package/src/DIDConnect/auth-apps/switch-role.tsx +0 -47
  77. package/src/DIDConnect/did-connect-container.tsx +0 -326
  78. package/src/DIDConnect/did-connect-footer.tsx +0 -76
  79. package/src/DIDConnect/did-connect-logo.tsx +0 -8
  80. package/src/DIDConnect/icons/did-wallet-logo.tsx +0 -18
  81. package/src/DIDConnect/icons/github-logo.tsx +0 -17
  82. package/src/DIDConnect/index.ts +0 -11
  83. package/src/DIDConnect/landing-page.tsx +0 -218
  84. package/src/DIDConnect/powered-by.tsx +0 -48
  85. package/src/DIDConnect/provider-icon.tsx +0 -62
  86. package/src/DIDConnect/request-storage-access-api-dialog.tsx +0 -304
  87. package/src/DIDConnect/with-container.tsx +0 -323
  88. package/src/DIDConnect/with-ux-theme.tsx +0 -22
  89. package/src/DIDLogo/Logo.stories.jsx +0 -11
  90. package/src/DIDLogo/index.tsx +0 -168
  91. package/src/Datatable/CustomToolbar.jsx +0 -415
  92. package/src/Datatable/Datatable.stories.jsx +0 -92
  93. package/src/Datatable/DatatableContext.jsx +0 -35
  94. package/src/Datatable/TableSearch.jsx +0 -166
  95. package/src/Datatable/index.jsx +0 -652
  96. package/src/Datatable/utils.js +0 -161
  97. package/src/Dialog/Dialog.stories.jsx +0 -21
  98. package/src/Dialog/confirm.jsx +0 -143
  99. package/src/Dialog/dialog.jsx +0 -199
  100. package/src/Dialog/index.js +0 -4
  101. package/src/Dialog/types.d.ts +0 -20
  102. package/src/Dialog/use-confirm.jsx +0 -188
  103. package/src/DriftBot/index.tsx +0 -81
  104. package/src/Earth/Earth.stories.jsx +0 -39
  105. package/src/Earth/countries.json +0 -8057
  106. package/src/Earth/index.tsx +0 -515
  107. package/src/Earth/util.ts +0 -72
  108. package/src/Empty/Empty.stories.jsx +0 -23
  109. package/src/Empty/index.jsx +0 -48
  110. package/src/ErrorBoundary/ErrorBoundary.stories.jsx +0 -13
  111. package/src/ErrorBoundary/fallback.tsx +0 -85
  112. package/src/ErrorBoundary/index.ts +0 -1
  113. package/src/Footer/Footer.stories.jsx +0 -13
  114. package/src/Footer/index.tsx +0 -130
  115. package/src/Header/Header.stories.jsx +0 -30
  116. package/src/Header/addon-button.tsx +0 -41
  117. package/src/Header/auto-hidden.tsx +0 -31
  118. package/src/Header/header-addons.tsx +0 -37
  119. package/src/Header/header.tsx +0 -214
  120. package/src/Header/index.ts +0 -3
  121. package/src/Header/responsive-header.tsx +0 -145
  122. package/src/Icon/Icon.stories.jsx +0 -45
  123. package/src/Icon/image.tsx +0 -53
  124. package/src/Icon/index.tsx +0 -63
  125. package/src/Img/Img.stories.jsx +0 -17
  126. package/src/Img/index.jsx +0 -258
  127. package/src/InfoRow/InfoRow.stories.jsx +0 -14
  128. package/src/InfoRow/index.tsx +0 -91
  129. package/src/Layout/Layout.stories.jsx +0 -24
  130. package/src/Layout/dashboard/external-link.tsx +0 -59
  131. package/src/Layout/dashboard/full-page.tsx +0 -58
  132. package/src/Layout/dashboard/index.tsx +0 -260
  133. package/src/Layout/dashboard/sidebar.tsx +0 -198
  134. package/src/Layout/dashboard-legacy/header.tsx +0 -156
  135. package/src/Layout/dashboard-legacy/index.tsx +0 -127
  136. package/src/Layout/dashboard-legacy/sidebar.tsx +0 -129
  137. package/src/Layout/index.tsx +0 -310
  138. package/src/LoadingMask/index.tsx +0 -108
  139. package/src/Locale/LocaleSelector.stories.jsx +0 -44
  140. package/src/Locale/browser-lang.ts +0 -65
  141. package/src/Locale/context.tsx +0 -162
  142. package/src/Locale/languages.ts +0 -58
  143. package/src/Locale/selector.tsx +0 -174
  144. package/src/Locale/util.ts +0 -38
  145. package/src/Logo/Logo.stories.jsx +0 -23
  146. package/src/Logo/images/logo-dark-text.svg +0 -3
  147. package/src/Logo/images/logo-dark-top.svg +0 -6
  148. package/src/Logo/images/logo-light-text.svg +0 -3
  149. package/src/Logo/images/logo-light-top.svg +0 -6
  150. package/src/Logo/index.tsx +0 -58
  151. package/src/Metric/Metric.stories.jsx +0 -29
  152. package/src/Metric/index.tsx +0 -130
  153. package/src/MuiWrap/index.tsx +0 -10
  154. package/src/NFTDisplay/NFTBroken.svg +0 -34
  155. package/src/NFTDisplay/NFTDisplay.stories.jsx +0 -30
  156. package/src/NFTDisplay/README.md +0 -59
  157. package/src/NFTDisplay/aspect-ratio-container.tsx +0 -36
  158. package/src/NFTDisplay/broken.tsx +0 -51
  159. package/src/NFTDisplay/displayApi.ts +0 -43
  160. package/src/NFTDisplay/index.tsx +0 -393
  161. package/src/NFTDisplay/loading.tsx +0 -16
  162. package/src/NFTDisplay/preview.tsx +0 -84
  163. package/src/NFTDisplay/render-svg.tsx +0 -21
  164. package/src/NFTDisplay/svg-embedder/img.tsx +0 -27
  165. package/src/NFTDisplay/svg-embedder/inline-svg.tsx +0 -36
  166. package/src/NavMenu/NavMenu.stories.jsx +0 -17
  167. package/src/NavMenu/images/OCAP.svg +0 -1
  168. package/src/NavMenu/images/abt-network.svg +0 -1
  169. package/src/NavMenu/images/ai-kit.svg +0 -1
  170. package/src/NavMenu/images/aigne-image-smith.svg +0 -1
  171. package/src/NavMenu/images/aigne.svg +0 -1
  172. package/src/NavMenu/images/aistro.png +0 -0
  173. package/src/NavMenu/images/arcsphere.svg +0 -1
  174. package/src/NavMenu/images/blocklet-framework.svg +0 -1
  175. package/src/NavMenu/images/blocklet-launcher.svg +0 -1
  176. package/src/NavMenu/images/blocklet-server.svg +0 -1
  177. package/src/NavMenu/images/blocklet-store.svg +0 -1
  178. package/src/NavMenu/images/creator-studio.svg +0 -1
  179. package/src/NavMenu/images/did-wallet.svg +0 -1
  180. package/src/NavMenu/images/did.svg +0 -1
  181. package/src/NavMenu/images/nft-studio.svg +0 -1
  182. package/src/NavMenu/images/payment-kit.png +0 -0
  183. package/src/NavMenu/images/vc.svg +0 -1
  184. package/src/NavMenu/images/web3-kit.svg +0 -1
  185. package/src/NavMenu/index.ts +0 -3
  186. package/src/NavMenu/nav-menu-context.tsx +0 -30
  187. package/src/NavMenu/nav-menu.tsx +0 -441
  188. package/src/NavMenu/products.tsx +0 -830
  189. package/src/NavMenu/style.ts +0 -258
  190. package/src/NavMenu/sub-container.tsx +0 -125
  191. package/src/NavMenu/sub-item-group.tsx +0 -42
  192. package/src/OrgTransfer/index.tsx +0 -53
  193. package/src/OrgTransfer/locales.ts +0 -25
  194. package/src/OrgTransfer/selector.tsx +0 -252
  195. package/src/OrgTransfer/type.ts +0 -31
  196. package/src/PageScroller/index.tsx +0 -316
  197. package/src/PageScroller/story/FifthComponent.jsx +0 -7
  198. package/src/PageScroller/story/FirstComponent.jsx +0 -7
  199. package/src/PageScroller/story/FourthComponent.jsx +0 -7
  200. package/src/PageScroller/story/FullPage.jsx +0 -55
  201. package/src/PageScroller/story/PageContain.jsx +0 -59
  202. package/src/PageScroller/story/PageScroller.stories.jsx +0 -18
  203. package/src/PageScroller/story/SecondComponent.jsx +0 -7
  204. package/src/PageScroller/story/ThirdComponent.jsx +0 -7
  205. package/src/PageScroller/story/index.css +0 -115
  206. package/src/PageScroller/usePrevValue.ts +0 -11
  207. package/src/Passport/index.ts +0 -3
  208. package/src/Passport/passport.tsx +0 -118
  209. package/src/PhoneInput/PhoneInput.stories.jsx +0 -12
  210. package/src/PhoneInput/country-select.tsx +0 -148
  211. package/src/PhoneInput/index.tsx +0 -269
  212. package/src/PoweredByArcBlock/index.tsx +0 -27
  213. package/src/PricingTable/PricingPlan.tsx +0 -120
  214. package/src/PricingTable/PricingTable.stories.jsx +0 -38
  215. package/src/PricingTable/index.tsx +0 -59
  216. package/src/QRCode/QRCode.stories.jsx +0 -13
  217. package/src/QRCode/index.tsx +0 -66
  218. package/src/RelativeTime/RelativeTime.stories.jsx +0 -20
  219. package/src/RelativeTime/index.tsx +0 -334
  220. package/src/Result/Result.stories.jsx +0 -61
  221. package/src/Result/common.tsx +0 -119
  222. package/src/Result/index.tsx +0 -30
  223. package/src/Result/result.tsx +0 -65
  224. package/src/Result/translations.ts +0 -57
  225. package/src/Screenshot/BaseScreenshot/index.tsx +0 -73
  226. package/src/Screenshot/BaseScreenshot/shells/Macbook.tsx +0 -38
  227. package/src/Screenshot/BaseScreenshot/shells/Phone.tsx +0 -35
  228. package/src/Screenshot/Screenshot.stories.jsx +0 -44
  229. package/src/Screenshot/devices.css +0 -1366
  230. package/src/Screenshot/index.tsx +0 -300
  231. package/src/SessionBlocklet/index.tsx +0 -178
  232. package/src/SessionManager/SessionManager.stories.jsx +0 -9
  233. package/src/SessionManager/index.tsx +0 -3
  234. package/src/SessionPermission/index.tsx +0 -26
  235. package/src/SessionUser/components/did-space.tsx +0 -68
  236. package/src/SessionUser/components/logged-in.tsx +0 -338
  237. package/src/SessionUser/components/quick-login-item.tsx +0 -132
  238. package/src/SessionUser/components/session-user-item.tsx +0 -93
  239. package/src/SessionUser/components/session-user-switch.tsx +0 -240
  240. package/src/SessionUser/components/un-login.tsx +0 -257
  241. package/src/SessionUser/components/user-info.tsx +0 -201
  242. package/src/SessionUser/index.tsx +0 -68
  243. package/src/SessionUser/libs/translation.ts +0 -30
  244. package/src/SessionUser/libs/utils.ts +0 -39
  245. package/src/SharedBridge/index.tsx +0 -126
  246. package/src/SocialShare/index.tsx +0 -194
  247. package/src/Sparkline/Sparkline.stories.jsx +0 -13
  248. package/src/Sparkline/index.tsx +0 -231
  249. package/src/Spinner/Spinner.stories.jsx +0 -98
  250. package/src/Spinner/index.tsx +0 -20
  251. package/src/SplitButton/SplitButton.stories.jsx +0 -32
  252. package/src/SplitButton/index.tsx +0 -116
  253. package/src/SplitButton/useClickAway.tsx +0 -24
  254. package/src/Success/index.tsx +0 -175
  255. package/src/Switch/Switch.stories.jsx +0 -16
  256. package/src/Switch/index.jsx +0 -79
  257. package/src/Tabs/Tabs.stories.jsx +0 -18
  258. package/src/Tabs/index.tsx +0 -255
  259. package/src/Tag/Tag.stories.jsx +0 -15
  260. package/src/Tag/index.jsx +0 -106
  261. package/src/TextCollapse/TextCollapse.stories.jsx +0 -73
  262. package/src/TextCollapse/index.tsx +0 -85
  263. package/src/Theme/Theme.stories.jsx +0 -11
  264. package/src/Theme/index.ts +0 -21
  265. package/src/Theme/theme-provider.tsx +0 -374
  266. package/src/Theme/theme.ts +0 -229
  267. package/src/Toast/Toast.stories.jsx +0 -28
  268. package/src/Toast/index.tsx +0 -80
  269. package/src/Typography/index.tsx +0 -124
  270. package/src/UserCard/Cards/avatar-only.tsx +0 -27
  271. package/src/UserCard/Cards/basic-info.tsx +0 -43
  272. package/src/UserCard/Cards/index.tsx +0 -16
  273. package/src/UserCard/Cards/social-actions.tsx +0 -196
  274. package/src/UserCard/Container/card.tsx +0 -63
  275. package/src/UserCard/Container/dialog.tsx +0 -37
  276. package/src/UserCard/Content/basic.tsx +0 -330
  277. package/src/UserCard/Content/clock.tsx +0 -82
  278. package/src/UserCard/Content/minimal.tsx +0 -113
  279. package/src/UserCard/Content/shorten-label.tsx +0 -32
  280. package/src/UserCard/Content/tooltip-avatar.tsx +0 -80
  281. package/src/UserCard/UserCard.stories.jsx +0 -19
  282. package/src/UserCard/components.tsx +0 -81
  283. package/src/UserCard/index.tsx +0 -132
  284. package/src/UserCard/types.ts +0 -165
  285. package/src/UserCard/use-follow.tsx +0 -111
  286. package/src/UserCard/utils.ts +0 -155
  287. package/src/Util/WebWalletOpener.stories.jsx +0 -5
  288. package/src/Util/client.ts +0 -4
  289. package/src/Util/constant.ts +0 -60
  290. package/src/Util/deprecate.tsx +0 -29
  291. package/src/Util/federated.ts +0 -125
  292. package/src/Util/iframe.ts +0 -19
  293. package/src/Util/index.ts +0 -760
  294. package/src/Util/logger.ts +0 -44
  295. package/src/Util/passport.ts +0 -127
  296. package/src/Util/security.ts +0 -72
  297. package/src/Util/style.ts +0 -17
  298. package/src/Util/wallet.ts +0 -35
  299. package/src/VerificationCode/index.tsx +0 -83
  300. package/src/Video/Video.stories.jsx +0 -6
  301. package/src/Video/index.tsx +0 -70
  302. package/src/Wallet/Action.stories.jsx +0 -8
  303. package/src/Wallet/Action.tsx +0 -118
  304. package/src/Wallet/Download.stories.jsx +0 -9
  305. package/src/Wallet/Download.tsx +0 -157
  306. package/src/Wallet/Open.tsx +0 -47
  307. package/src/Wallet/OpenInWallet.stories.jsx +0 -5
  308. package/src/Wallet/images/abtwallet.png +0 -0
  309. package/src/Wallet/images/android_download.svg +0 -22
  310. package/src/Wallet/images/app-store.svg +0 -30
  311. package/src/Wallet/images/google-play.svg +0 -69
  312. package/src/WalletOSIcon/index.tsx +0 -47
  313. package/src/WebWalletSWKeeper/index.tsx +0 -117
  314. package/src/WechatPrompt/images/android.png +0 -0
  315. package/src/WechatPrompt/images/ios.png +0 -0
  316. package/src/WechatPrompt/index.tsx +0 -75
  317. package/src/global.d.ts +0 -28
  318. package/src/hooks/use-blocklet-logo.tsx +0 -32
  319. package/src/hooks/use-clock.tsx +0 -62
  320. package/src/hooks/use-location-state.tsx +0 -117
  321. package/src/hooks/use-mobile.tsx +0 -6
  322. package/src/index.ts +0 -79
  323. package/src/type.d.ts +0 -44
  324. package/src/withTheme/index.tsx +0 -72
  325. package/src/withTracker/README.md +0 -37
  326. package/src/withTracker/action/bind-wallet.tsx +0 -17
  327. package/src/withTracker/action/login.tsx +0 -18
  328. package/src/withTracker/action/pay.tsx +0 -14
  329. package/src/withTracker/action/switch-passport.tsx +0 -20
  330. package/src/withTracker/constant/index.tsx +0 -3
  331. package/src/withTracker/env.tsx +0 -1
  332. package/src/withTracker/error_boundary.jsx +0 -34
  333. package/src/withTracker/index.tsx +0 -50
  334. package/src/withTracker/libs/utm.ts +0 -46
  335. 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
- }
@@ -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
- };
@@ -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
- };