@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,24 +0,0 @@
1
- export { default as Basic } from './demo/basic';
2
- export { default as CustomElement } from './demo/custom-element';
3
- export { default as Dashboard } from './demo/dashboard';
4
- export { default as DashboardGroupedNav } from './demo/dashboard-grouped-nav';
5
- export { default as FullPage } from './demo/full-page';
6
- export { default as DashboardLegacy } from './demo/dashboard-legacy';
7
- export { default as DashboardLegacyCustomLogo } from './demo/dashboard-legacy-custom-logo';
8
-
9
- export default {
10
- title: 'Layout/Layout',
11
- parameters: {
12
- layout: 'fullscreen',
13
- docs: {
14
- description: {
15
- component:
16
- 'Dashboard Layout is a generic, customizable layout component that includes a header, navigation, and footer, it can be used to quickly build management pages.',
17
- },
18
- },
19
- design: {
20
- type: 'figma',
21
- url: 'https://www.figma.com/file/E8TSBWCOyXzETmVOjzbqvw/ArcBlock-UI-Kit?node-id=1504%3A5211',
22
- },
23
- },
24
- };
@@ -1,59 +0,0 @@
1
- import { type NavLinkRenderProps, Link as RouterLink, NavLink as RouterNavLink } from 'react-router-dom';
2
-
3
- type RouterLinkProps = React.ComponentProps<typeof RouterLink>;
4
- type RouterNavLinkProps = React.ComponentProps<typeof RouterNavLink>;
5
- type ExternalLinkProps = {
6
- external?: false | true;
7
- } & (
8
- | ({
9
- routerLinkComponent: typeof RouterLink;
10
- } & RouterLinkProps)
11
- | ({
12
- routerLinkComponent: typeof RouterNavLink;
13
- } & RouterNavLinkProps)
14
- );
15
-
16
- // 包裹 router Link/NavLink 组件, 支持 external link (external 为 true 时渲染为 a 标签)
17
- function ExternalLink({
18
- routerLinkComponent: RouterLinkComponent,
19
- to,
20
- external = false,
21
- children,
22
- ...rest
23
- }: ExternalLinkProps) {
24
- if (external) {
25
- return (
26
- // @ts-expect-error
27
- <a href={to} {...rest}>
28
- {/* @ts-expect-error */}
29
- {children}
30
- </a>
31
- );
32
- }
33
- return (
34
- // @ts-ignore
35
- <RouterLinkComponent to={to} {...rest}>
36
- {/* @ts-expect-error */}
37
- {children}
38
- </RouterLinkComponent>
39
- );
40
- }
41
-
42
- export interface LinkProps extends RouterLinkProps {
43
- external?: false | true;
44
- }
45
-
46
- export function Link({ ...props }: LinkProps) {
47
- return <ExternalLink routerLinkComponent={RouterLink} {...props} />;
48
- }
49
-
50
- export interface NavLinkProps extends Omit<RouterNavLinkProps, 'className'> {
51
- className?: string | ((props: Partial<NavLinkRenderProps>) => string | undefined);
52
- external?: false | true;
53
- }
54
-
55
- export function NavLink({ className = '', ...rest }: NavLinkProps) {
56
- // NavLink#className 支持 function
57
- const classes = rest.external && typeof className === 'function' ? className({}) : className;
58
- return <ExternalLink routerLinkComponent={RouterNavLink} className={classes} {...rest} />;
59
- }
@@ -1,58 +0,0 @@
1
- import { useState, use, createContext, useMemo, useLayoutEffect } from 'react';
2
-
3
- type FullPageState = {
4
- inFullPage: boolean;
5
- showToggleButton: boolean;
6
- headerVisibleInFullPage: boolean;
7
- footerVisibleInFullPage: boolean;
8
- sidebarVisibleInFullPage: boolean;
9
- };
10
-
11
- type FullPageContextValue = FullPageState & {
12
- headerVisible: boolean;
13
- footerVisible: boolean;
14
- sidebarVisible: boolean;
15
- toggleFullPage: () => void;
16
- configure: (params: Partial<FullPageState>) => void;
17
- };
18
-
19
- export const FullPageContext = createContext<FullPageContextValue>(null!);
20
-
21
- export const useFullPage = (initialState?: FullPageState) => {
22
- const ctx = use(FullPageContext);
23
- useLayoutEffect(() => {
24
- if (initialState) {
25
- ctx.configure(initialState);
26
- }
27
- // eslint-disable-next-line react-hooks/exhaustive-deps
28
- }, []);
29
- return ctx;
30
- };
31
-
32
- export function FullPageProvider({ children = undefined, ...rest }: { children?: React.ReactNode }) {
33
- const [state, setState] = useState({
34
- inFullPage: false,
35
- showToggleButton: false,
36
- headerVisibleInFullPage: true,
37
- footerVisibleInFullPage: false,
38
- sidebarVisibleInFullPage: false,
39
- });
40
- const toggleFullPage = () => {
41
- setState((prev) => ({ ...prev, inFullPage: !prev.inFullPage }));
42
- };
43
- const value = useMemo<FullPageContextValue>(() => {
44
- return {
45
- ...state,
46
- headerVisible: !state.inFullPage || state.headerVisibleInFullPage,
47
- footerVisible: !state.inFullPage || state.footerVisibleInFullPage,
48
- sidebarVisible: !state.inFullPage || state.sidebarVisibleInFullPage,
49
- toggleFullPage,
50
- configure: (params) => setState((prev) => ({ ...prev, ...params })),
51
- };
52
- }, [state]);
53
- return (
54
- <FullPageContext value={value} {...rest}>
55
- {children}
56
- </FullPageContext>
57
- );
58
- }
@@ -1,260 +0,0 @@
1
- import { useEffect, useMemo } from 'react';
2
- import { useLocation, matchPath, type Location } from 'react-router-dom';
3
- import Helmet from 'react-helmet';
4
- import { Container, Box, type SxProps } from '@mui/material';
5
- import clsx from 'clsx';
6
- import { OpenInFull as OpenInFullIcon, CloseFullscreen as CloseFullscreenIcon } from '@mui/icons-material';
7
- import DashboardLegacy from '../dashboard-legacy';
8
- import { ResponsiveHeader } from '../../Header';
9
- import NavMenu from '../../NavMenu';
10
- import Footer, { type FooterProps } from '../../Footer';
11
- import Sidebar, { type LinkItem } from './sidebar';
12
- import { styled, useTheme } from '../../Theme';
13
- import { Link } from './external-link';
14
- import { FullPageProvider, useFullPage } from './full-page';
15
- import { NavMenuProps } from '../../NavMenu/nav-menu';
16
- import { type DashboardProps as DashboardLegacyProps } from '../dashboard-legacy';
17
-
18
- // 监听 location 变化并关闭 header 中的 menu (确保 drawer - disablePortal:false, keepMounted:true)
19
- // 直接监听 menu 中 link 点击来触发 closeMenu 会有问题 (Suspense & lazy)
20
- function NavMenuWrapper({ closeMenu, ...rest }: { closeMenu: () => void } & NavMenuProps) {
21
- const location = useLocation();
22
- useEffect(() => {
23
- closeMenu();
24
- // eslint-disable-next-line react-hooks/exhaustive-deps
25
- }, [location]);
26
- return <NavMenu {...rest} />;
27
- }
28
-
29
- function formatLinks(links: LinkItem[], location: Location): LinkItem[] {
30
- return links.map((link) => {
31
- if (link.children?.length) {
32
- return {
33
- ...link,
34
- label: link.title,
35
- children: formatLinks(link.children, location),
36
- };
37
- }
38
- return {
39
- ...link,
40
- label: (
41
- <Link to={link.url} external={link.external}>
42
- {link.title}
43
- </Link>
44
- ),
45
- // external = true 时 active 状态由传入 links 的调用方决定 (适用于 blocklet ui dashboard 的情况)
46
- active: link.external ? link.active : !!matchPath({ path: link.url, end: false }, location.pathname),
47
- };
48
- });
49
- }
50
-
51
- export interface DashboardProps extends React.HTMLAttributes<HTMLDivElement> {
52
- title?: string;
53
- headerProps?: object;
54
- /** 支持分组, links item 如果是数组, 则视为一个 group */
55
- links?: LinkItem[];
56
- sidebarWidth?: number;
57
- fullWidth?: false | true;
58
- /** sidenav 稠密一些的布局, 纵向空间占用较少, 默认为 auto, 当 links 个数 > 8 时自动启用 */
59
- dense?: 'auto' | boolean;
60
- footerProps?: FooterProps;
61
- sx?: SxProps;
62
- /** 是否隐藏 html title, 默认不隐藏, 避免重复导致 html title 失效 */
63
- hideHtmlTitle?: boolean;
64
- }
65
-
66
- function Dashboard({
67
- title = 'Home',
68
- headerProps = {},
69
- links = [],
70
- sidebarWidth = 120,
71
- fullWidth = false,
72
- dense = 'auto',
73
- footerProps = {},
74
- sx = {},
75
- children,
76
- hideHtmlTitle = false,
77
- ...rest
78
- }: DashboardProps) {
79
- const theme = useTheme();
80
- const { inFullPage, showToggleButton, headerVisible, footerVisible, sidebarVisible, toggleFullPage } = useFullPage();
81
- const location = useLocation();
82
- const navItems = useMemo(() => formatLinks(links, location), [location, links]);
83
- const isGroupedMode = navItems.some((item) => !!item.children?.length);
84
- // 一级菜单数量 > 8 或都分组模式, 都启用 dense 布局
85
- const _dense = dense === 'auto' ? navItems.length >= 8 || isGroupedMode : dense;
86
- const classes = clsx('dashboard', { 'dashboard-dense': _dense }, rest.className);
87
- const defaultHomeLink = (content: React.ReactNode) => <Link to={window.blocklet?.prefix || '/'}>{content}</Link>;
88
- const _headerProps = {
89
- homeLink: defaultHomeLink,
90
- ...headerProps,
91
- };
92
-
93
- useEffect(() => {
94
- const { searchParams } = new URL(window.location.href);
95
- if (searchParams.get('inviter')) {
96
- window.localStorage.setItem('inviter', searchParams.get('inviter')!);
97
- }
98
- }, []);
99
-
100
- return (
101
- <Wrapper sx={sx} {...rest} className={classes} sidebarWidth={sidebarWidth}>
102
- {!hideHtmlTitle && <Helmet title={title} key={title} />}
103
- {headerVisible && (
104
- <StyledUxHeader {..._headerProps} className="dashboard-header">
105
- {links?.length
106
- ? ({ isMobile, closeMenu }) => {
107
- if (isMobile) {
108
- return (
109
- <NavMenuWrapper
110
- mode="inline"
111
- items={navItems}
112
- closeMenu={closeMenu}
113
- bgColor="transparent"
114
- activeTextColor={theme.palette.primary.main}
115
- />
116
- );
117
- }
118
- return null;
119
- }
120
- : null}
121
- </StyledUxHeader>
122
- )}
123
- <Box
124
- className="dashboard-body"
125
- sx={{
126
- display: 'flex',
127
- }}>
128
- {!!links?.length && sidebarVisible && (
129
- <Box
130
- className="dashboard-sidebar"
131
- sx={{
132
- display: {
133
- xs: 'none',
134
- md: 'block',
135
- },
136
- }}>
137
- {_dense ? (
138
- <Sidebar links={links} dense={_dense} />
139
- ) : (
140
- <Box className="dashboard-sidebar-container">
141
- <Sidebar links={links} dense={_dense} />
142
- </Box>
143
- )}
144
- </Box>
145
- )}
146
- <Box className="dashboard-main" id="arc__dashboard-main">
147
- {showToggleButton && (
148
- <Box
149
- sx={{
150
- position: 'absolute',
151
- top: 4,
152
- right: 4,
153
- display: 'flex',
154
- justifyContent: 'center',
155
- alignItems: 'center',
156
- width: 24,
157
- height: 24,
158
- color: '#fff',
159
- bgcolor: 'rgba(158,158,158, 0.6);',
160
- borderRadius: 1,
161
- cursor: 'pointer',
162
- }}
163
- onClick={toggleFullPage}>
164
- {inFullPage ? (
165
- <CloseFullscreenIcon style={{ fontSize: 18 }} />
166
- ) : (
167
- <OpenInFullIcon style={{ fontSize: 18 }} />
168
- )}
169
- </Box>
170
- )}
171
- <Container className="dashboard-content" id="arc__dashboard-content" {...(fullWidth && { maxWidth: false })}>
172
- {children}
173
- </Container>
174
- {footerVisible && <Footer {...{ dark: theme.palette.mode === 'dark', ...footerProps }} />}
175
- </Box>
176
- </Box>
177
- </Wrapper>
178
- );
179
- }
180
-
181
- type WrapperProps = React.HTMLAttributes<HTMLDivElement> & { sidebarWidth: number };
182
-
183
- const Wrapper = styled(Box)<WrapperProps>`
184
- &.dashboard {
185
- display: flex;
186
- flex-direction: column;
187
- height: 100vh;
188
- background-color: ${({ theme }) => theme.palette.background.default};
189
- }
190
- .dashboard-body {
191
- overflow: hidden;
192
- flex: 1;
193
- }
194
- .dashboard-sidebar {
195
- box-sizing: border-box;
196
- flex: 0 0 auto;
197
- width: ${(props) => props.sidebarWidth}px;
198
- overflow: hidden;
199
- &:hover {
200
- overflow-y: auto;
201
- }
202
- }
203
- .dashboard-sidebar-container {
204
- width: ${(props) => props.sidebarWidth}px;
205
- }
206
- .dashboard-main {
207
- display: flex;
208
- flex-direction: column;
209
- overflow: auto;
210
- flex: 1;
211
- position: relative;
212
- }
213
- .dashboard-content {
214
- flex: 1;
215
- }
216
- &.dashboard-dense {
217
- .dashboard-header {
218
- border-bottom: 1px solid;
219
- border-color: ${({ theme }) => theme.palette.divider};
220
- }
221
- .dashboard-sidebar {
222
- width: 256px;
223
- border-right: 1px solid;
224
- border-color: ${({ theme }) => theme.palette.divider};
225
- }
226
- }
227
- ${(props) => props.theme.breakpoints.up('md')} {
228
- .header-logo {
229
- display: flex;
230
- justify-content: center;
231
- }
232
- &.dashboard-dense {
233
- .header-logo {
234
- /* dense = true 时 logo 与 sidenav icons 不需要对齐 */
235
- width: auto;
236
- }
237
- }
238
- }
239
- `;
240
-
241
- const StyledUxHeader = styled(ResponsiveHeader)`
242
- .header-container {
243
- max-width: 100%;
244
- }
245
- `;
246
-
247
- // 兼容旧版 dashboard
248
- export default function DashboardWrapper<T extends boolean = true>({
249
- legacy = true as T,
250
- ...rest
251
- }: T extends true ? { legacy?: T } & DashboardLegacyProps : { legacy?: T } & DashboardProps) {
252
- if (legacy) {
253
- return <DashboardLegacy {...(rest as unknown as DashboardLegacyProps)} />;
254
- }
255
- return (
256
- <FullPageProvider>
257
- <Dashboard {...rest} />
258
- </FullPageProvider>
259
- );
260
- }
@@ -1,198 +0,0 @@
1
- import { Typography } from '@mui/material';
2
- import clsx from 'clsx';
3
- import { styled } from '../../Theme';
4
- import { NavLink } from './external-link';
5
-
6
- export type LinkItem = {
7
- url: string;
8
- title: React.ReactNode;
9
- icon?: React.ReactNode;
10
- iconZoom?: number;
11
- color?: string;
12
- showBadge?: false | true;
13
- external?: false | true;
14
- active?: boolean;
15
- children?: LinkItem[];
16
- };
17
-
18
- function renderItem(item: LinkItem, index: number) {
19
- if (item.children?.length) {
20
- // eslint-disable-next-line no-use-before-define
21
- return renderGroup(item, index);
22
- }
23
- const { url, icon, title, showBadge, external, active } = item;
24
- // external = true 时 link active 状态由传入 links 的调用方决定 (适用于 blocklet ui dashboard 的情况)
25
- return (
26
- <li key={`${url}-${index}`} className="layout-sidebar-item">
27
- <NavLink
28
- external={external}
29
- to={url}
30
- className={({ isActive }) =>
31
- clsx('layout-sidebar-link', { 'layout-sidebar-link--active': external ? active : isActive })
32
- }>
33
- {icon && <span className={`layout-sidebar-icon ${showBadge ? 'layout-sidebar-badge' : ''}`}>{icon}</span>}
34
- <Typography component="span" className="layout-sidebar-link-text">
35
- {title}
36
- </Typography>
37
- </NavLink>
38
- </li>
39
- );
40
- }
41
-
42
- function renderGroup(item: LinkItem, index: number) {
43
- return (
44
- <li key={`group-${item.title}-${index}`} className="layout-sidebar-group">
45
- <span className="layout-sidebar-group-title">{item.title}</span>
46
- <ul>{item.children!.map(renderItem)}</ul>
47
- </li>
48
- );
49
- }
50
-
51
- export interface SidebarProps {
52
- links: LinkItem[];
53
- addons?: React.ReactNode;
54
- dense?: false | true;
55
- }
56
-
57
- function Sidebar({ links, addons = undefined, dense = false, ...rest }: SidebarProps) {
58
- return (
59
- <Root {...rest} className={clsx({ 'layout-sidebar-dense': dense })}>
60
- <ul>{links.map(renderItem)}</ul>
61
- <div style={{ flex: 1 }} />
62
- {addons}
63
- </Root>
64
- );
65
- }
66
-
67
- const gradient = 'linear-gradient(32deg, rgba(144, 255, 230, 0.1), rgba(144, 255, 230, 0))';
68
-
69
- const Root = styled('div')`
70
- display: flex;
71
- flex-direction: column;
72
- ul {
73
- list-style: none;
74
- margin: 0;
75
- padding: 0;
76
- }
77
- .layout-sidebar-link {
78
- display: flex;
79
- flex-direction: column;
80
- align-items: center;
81
- padding: 22px 24px;
82
- color: ${(props) => props.theme.palette.text.secondary};
83
- text-decoration: none;
84
-
85
- &:hover,
86
- &.layout-sidebar-link--active {
87
- color: ${(props) => props.theme.palette.primary.main};
88
- background: ${gradient};
89
- border-left-color: ${(props) => props.theme.palette.primary.main};
90
- }
91
- }
92
- .layout-sidebar-icon {
93
- display: inline-block;
94
- width: 32px;
95
- height: 32px;
96
- > img,
97
- > svg {
98
- width: 32px;
99
- height: 32px;
100
- }
101
- }
102
- .layout-sidebar-badge {
103
- position: relative;
104
- &:after {
105
- content: '';
106
- position: absolute;
107
- width: 10px;
108
- height: 10px;
109
- border-radius: 10px;
110
- background-color: #fe4e44;
111
- right: -2px;
112
- top: 0;
113
- box-shadow:
114
- 0px 1px 4px rgba(0, 0, 0, 0.3),
115
- 0px 0px 20px rgba(0, 0, 0, 0.1);
116
- }
117
- }
118
- .layout-sidebar-link-text {
119
- margin-top: 8px;
120
- font-size: 12px;
121
- font-weight: 500;
122
- text-align: center;
123
- text-transform: capitalize;
124
- letter-spacing: normal;
125
- }
126
- /* dense=false 时隐藏 group title */
127
- .layout-sidebar-group-title {
128
- display: none;
129
- }
130
- &.layout-sidebar-dense {
131
- box-sizing: border-box;
132
- padding: 20px 0;
133
- font-weight: bold;
134
- .layout-sidebar-item {
135
- padding: 0 16px;
136
- }
137
- .layout-sidebar-item + .layout-sidebar-item {
138
- margin-top: 1px;
139
- }
140
- .layout-sidebar-link {
141
- box-sizing: border-box;
142
- flex-direction: row;
143
- align-items: center;
144
- width: 100%;
145
- padding: 8px;
146
- &:hover,
147
- &.layout-sidebar-link--active {
148
- color: ${(props) => props.theme.palette.grey[900]};
149
- background: ${(props) => props.theme.palette.grey[100]};
150
- border: 0;
151
- border-radius: 4px;
152
- }
153
- }
154
- .layout-sidebar-icon {
155
- display: inline-block;
156
- width: 20px;
157
- height: 20px;
158
- margin-right: 8px;
159
- > img,
160
- > svg {
161
- width: 20px;
162
- height: 20px;
163
- }
164
- }
165
- .layout-sidebar-badge {
166
- &:after {
167
- width: 6px;
168
- height: 6px;
169
- border-radius: 6px;
170
- right: -2px;
171
- top: 0;
172
- }
173
- }
174
- .layout-sidebar-link-text {
175
- margin-top: 0;
176
- font-size: 14px;
177
- line-height: 1;
178
- }
179
- .layout-sidebar-group {
180
- color: ${(props) => {
181
- return props.theme.palette.text.hint;
182
- }};
183
- .layout-sidebar-group-title {
184
- display: inline-block;
185
- padding: 8px 0 8px 24px;
186
- font-size: 13px;
187
- text-transform: uppercase;
188
- }
189
- }
190
- .layout-sidebar-group + .layout-sidebar-group,
191
- .layout-sidebar-group + .layout-sidebar-item,
192
- .layout-sidebar-item + .layout-sidebar-group {
193
- margin-top: 16px;
194
- }
195
- }
196
- `;
197
-
198
- export default Sidebar;