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