@blocklet/ui-react 3.4.15 → 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 (255) hide show
  1. package/lib/common/org-switch/use-org.d.ts +4 -4
  2. package/package.json +9 -6
  3. package/.aigne/doc-smith/.local/afs-storage.sqlite3 +0 -0
  4. package/.aigne/doc-smith/config.yaml +0 -78
  5. package/.aigne/doc-smith/history.yaml +0 -14
  6. package/.aigne/doc-smith/media-description.yaml +0 -11
  7. package/.aigne/doc-smith/output/structure-plan.json +0 -255
  8. package/.aigne/doc-smith/translation-cache.yaml +0 -11
  9. package/.aigne/doc-smith/upload-cache.yaml +0 -528
  10. package/build.config.ts +0 -24
  11. package/docs/_sidebar.md +0 -19
  12. package/docs/assets/diagram/component-installer-diagram-0.ja.jpg +0 -0
  13. package/docs/assets/diagram/component-installer-diagram-0.jpg +0 -0
  14. package/docs/assets/diagram/component-installer-diagram-0.zh-TW.jpg +0 -0
  15. package/docs/assets/diagram/component-installer-diagram-0.zh.jpg +0 -0
  16. package/docs/assets/diagram/component-management-diagram-0.ja.jpg +0 -0
  17. package/docs/assets/diagram/component-management-diagram-0.jpg +0 -0
  18. package/docs/assets/diagram/component-management-diagram-0.zh-TW.jpg +0 -0
  19. package/docs/assets/diagram/component-management-diagram-0.zh.jpg +0 -0
  20. package/docs/assets/diagram/core-concepts-diagram-0.ja.jpg +0 -0
  21. package/docs/assets/diagram/core-concepts-diagram-0.jpg +0 -0
  22. package/docs/assets/diagram/core-concepts-diagram-0.zh-TW.jpg +0 -0
  23. package/docs/assets/diagram/core-concepts-diagram-0.zh.jpg +0 -0
  24. package/docs/assets/diagram/dashboard-diagram-0.ja.jpg +0 -0
  25. package/docs/assets/diagram/dashboard-diagram-0.jpg +0 -0
  26. package/docs/assets/diagram/dashboard-diagram-0.zh-TW.jpg +0 -0
  27. package/docs/assets/diagram/dashboard-diagram-0.zh.jpg +0 -0
  28. package/docs/assets/diagram/header-diagram-0.ja.jpg +0 -0
  29. package/docs/assets/diagram/header-diagram-0.jpg +0 -0
  30. package/docs/assets/diagram/header-diagram-0.zh-TW.jpg +0 -0
  31. package/docs/assets/diagram/header-diagram-0.zh.jpg +0 -0
  32. package/docs/assets/diagram/layout-diagram-0.ja.jpg +0 -0
  33. package/docs/assets/diagram/layout-diagram-0.jpg +0 -0
  34. package/docs/assets/diagram/layout-diagram-0.zh-TW.jpg +0 -0
  35. package/docs/assets/diagram/layout-diagram-0.zh.jpg +0 -0
  36. package/docs/assets/diagram/notifications-diagram-0.ja.jpg +0 -0
  37. package/docs/assets/diagram/notifications-diagram-0.jpg +0 -0
  38. package/docs/assets/diagram/notifications-diagram-0.zh-TW.jpg +0 -0
  39. package/docs/assets/diagram/notifications-diagram-0.zh.jpg +0 -0
  40. package/docs/assets/diagram/overview-diagram-0.ja.jpg +0 -0
  41. package/docs/assets/diagram/overview-diagram-0.jpg +0 -0
  42. package/docs/assets/diagram/overview-diagram-0.zh-TW.jpg +0 -0
  43. package/docs/assets/diagram/overview-diagram-0.zh.jpg +0 -0
  44. package/docs/assets/diagram/user-center-diagram-0.ja.jpg +0 -0
  45. package/docs/assets/diagram/user-center-diagram-0.jpg +0 -0
  46. package/docs/assets/diagram/user-center-diagram-0.zh-TW.jpg +0 -0
  47. package/docs/assets/diagram/user-center-diagram-0.zh.jpg +0 -0
  48. package/docs/assets/diagram/user-management-diagram-0.ja.jpg +0 -0
  49. package/docs/assets/diagram/user-management-diagram-0.jpg +0 -0
  50. package/docs/assets/diagram/user-management-diagram-0.zh-TW.jpg +0 -0
  51. package/docs/assets/diagram/user-management-diagram-0.zh.jpg +0 -0
  52. package/docs/assets/diagram/user-sessions-diagram-0.ja.jpg +0 -0
  53. package/docs/assets/diagram/user-sessions-diagram-0.jpg +0 -0
  54. package/docs/assets/diagram/user-sessions-diagram-0.zh-TW.jpg +0 -0
  55. package/docs/assets/diagram/user-sessions-diagram-0.zh.jpg +0 -0
  56. package/docs/components-component-management-blocklet-studio.ja.md +0 -194
  57. package/docs/components-component-management-blocklet-studio.md +0 -194
  58. package/docs/components-component-management-blocklet-studio.zh-TW.md +0 -194
  59. package/docs/components-component-management-blocklet-studio.zh.md +0 -194
  60. package/docs/components-component-management-component-installer.ja.md +0 -182
  61. package/docs/components-component-management-component-installer.md +0 -182
  62. package/docs/components-component-management-component-installer.zh-TW.md +0 -182
  63. package/docs/components-component-management-component-installer.zh.md +0 -182
  64. package/docs/components-component-management.ja.md +0 -30
  65. package/docs/components-component-management.md +0 -30
  66. package/docs/components-component-management.zh-TW.md +0 -30
  67. package/docs/components-component-management.zh.md +0 -30
  68. package/docs/components-layout-dashboard.ja.md +0 -185
  69. package/docs/components-layout-dashboard.md +0 -187
  70. package/docs/components-layout-dashboard.zh-TW.md +0 -185
  71. package/docs/components-layout-dashboard.zh.md +0 -185
  72. package/docs/components-layout-footer.ja.md +0 -165
  73. package/docs/components-layout-footer.md +0 -165
  74. package/docs/components-layout-footer.zh-TW.md +0 -165
  75. package/docs/components-layout-footer.zh.md +0 -165
  76. package/docs/components-layout-header.ja.md +0 -183
  77. package/docs/components-layout-header.md +0 -183
  78. package/docs/components-layout-header.zh-TW.md +0 -183
  79. package/docs/components-layout-header.zh.md +0 -183
  80. package/docs/components-layout.ja.md +0 -31
  81. package/docs/components-layout.md +0 -31
  82. package/docs/components-layout.zh-TW.md +0 -31
  83. package/docs/components-layout.zh.md +0 -31
  84. package/docs/components-notifications.ja.md +0 -125
  85. package/docs/components-notifications.md +0 -125
  86. package/docs/components-notifications.zh-TW.md +0 -125
  87. package/docs/components-notifications.zh.md +0 -125
  88. package/docs/components-user-management-user-center.ja.md +0 -148
  89. package/docs/components-user-management-user-center.md +0 -147
  90. package/docs/components-user-management-user-center.zh-TW.md +0 -148
  91. package/docs/components-user-management-user-center.zh.md +0 -148
  92. package/docs/components-user-management-user-sessions.ja.md +0 -121
  93. package/docs/components-user-management-user-sessions.md +0 -123
  94. package/docs/components-user-management-user-sessions.zh-TW.md +0 -121
  95. package/docs/components-user-management-user-sessions.zh.md +0 -121
  96. package/docs/components-user-management.ja.md +0 -49
  97. package/docs/components-user-management.md +0 -51
  98. package/docs/components-user-management.zh-TW.md +0 -49
  99. package/docs/components-user-management.zh.md +0 -49
  100. package/docs/components-utilities-icon.ja.md +0 -106
  101. package/docs/components-utilities-icon.md +0 -106
  102. package/docs/components-utilities-icon.zh-TW.md +0 -106
  103. package/docs/components-utilities-icon.zh.md +0 -106
  104. package/docs/components-utilities.ja.md +0 -136
  105. package/docs/components-utilities.md +0 -136
  106. package/docs/components-utilities.zh-TW.md +0 -136
  107. package/docs/components-utilities.zh.md +0 -136
  108. package/docs/components.ja.md +0 -27
  109. package/docs/components.md +0 -27
  110. package/docs/components.zh-TW.md +0 -27
  111. package/docs/components.zh.md +0 -27
  112. package/docs/core-concepts.ja.md +0 -134
  113. package/docs/core-concepts.md +0 -135
  114. package/docs/core-concepts.zh-TW.md +0 -134
  115. package/docs/core-concepts.zh.md +0 -134
  116. package/docs/getting-started.ja.md +0 -132
  117. package/docs/getting-started.md +0 -132
  118. package/docs/getting-started.zh-TW.md +0 -132
  119. package/docs/getting-started.zh.md +0 -132
  120. package/docs/hooks-api.ja.md +0 -214
  121. package/docs/hooks-api.md +0 -214
  122. package/docs/hooks-api.zh-TW.md +0 -214
  123. package/docs/hooks-api.zh.md +0 -214
  124. package/docs/how-to-guides.ja.md +0 -413
  125. package/docs/how-to-guides.md +0 -413
  126. package/docs/how-to-guides.zh-TW.md +0 -413
  127. package/docs/how-to-guides.zh.md +0 -413
  128. package/docs/overview.ja.md +0 -51
  129. package/docs/overview.md +0 -51
  130. package/docs/overview.zh-TW.md +0 -51
  131. package/docs/overview.zh.md +0 -51
  132. package/glossary.md +0 -12
  133. package/src/@types/index.ts +0 -230
  134. package/src/@types/shims.d.ts +0 -18
  135. package/src/BlockletStudio/README.md +0 -116
  136. package/src/BlockletStudio/index.tsx +0 -145
  137. package/src/ComponentInstaller/ComponentInstaller.stories.jsx +0 -16
  138. package/src/ComponentInstaller/index.jsx +0 -207
  139. package/src/ComponentInstaller/installer-item.jsx +0 -129
  140. package/src/ComponentInstaller/locales.js +0 -22
  141. package/src/ComponentInstaller/use-component-installed.js +0 -88
  142. package/src/ComponentManager/components/add-component.tsx +0 -136
  143. package/src/ComponentManager/components/check-component.tsx +0 -3
  144. package/src/ComponentManager/components/publish-component.tsx +0 -90
  145. package/src/ComponentManager/components/resource-dialog.tsx +0 -91
  146. package/src/ComponentManager/index.tsx +0 -3
  147. package/src/ComponentManager/libs/locales.ts +0 -15
  148. package/src/Dashboard/Dashboard.stories.jsx +0 -20
  149. package/src/Dashboard/app-shell/app-badge.stories.tsx +0 -64
  150. package/src/Dashboard/app-shell/app-badge.tsx +0 -94
  151. package/src/Dashboard/app-shell/app-header.tsx +0 -104
  152. package/src/Dashboard/app-shell/app-info-context.tsx +0 -182
  153. package/src/Dashboard/app-shell/badges/app-badge-default.tsx +0 -130
  154. package/src/Dashboard/app-shell/badges/app-badge-did.tsx +0 -28
  155. package/src/Dashboard/app-shell/badges/app-badge-state.tsx +0 -40
  156. package/src/Dashboard/app-shell/badges/app-badge-switch.tsx +0 -72
  157. package/src/Dashboard/app-shell/badges/app-badge-version.tsx +0 -60
  158. package/src/Dashboard/app-shell/index.ts +0 -5
  159. package/src/Dashboard/index.jsx +0 -184
  160. package/src/Footer/Footer.stories.jsx +0 -33
  161. package/src/Footer/brand.jsx +0 -81
  162. package/src/Footer/copyright.jsx +0 -22
  163. package/src/Footer/index.jsx +0 -111
  164. package/src/Footer/internal-footer.jsx +0 -139
  165. package/src/Footer/layout/plain.jsx +0 -55
  166. package/src/Footer/layout/row.jsx +0 -43
  167. package/src/Footer/layout/standard.jsx +0 -114
  168. package/src/Footer/links.jsx +0 -321
  169. package/src/Footer/social-media.jsx +0 -55
  170. package/src/Header/Header.stories.jsx +0 -30
  171. package/src/Header/index.tsx +0 -259
  172. package/src/Icon/Icon.stories.jsx +0 -12
  173. package/src/Icon/index.tsx +0 -87
  174. package/src/Notifications/Snackbar.tsx +0 -261
  175. package/src/Notifications/hooks/use-title.tsx +0 -254
  176. package/src/Notifications/hooks/use-width.tsx +0 -16
  177. package/src/Notifications/utils.ts +0 -246
  178. package/src/UserCenter/assets/banner.png +0 -0
  179. package/src/UserCenter/components/config-inviter.tsx +0 -48
  180. package/src/UserCenter/components/config-profile.tsx +0 -99
  181. package/src/UserCenter/components/danger-zone.tsx +0 -82
  182. package/src/UserCenter/components/editable-field.tsx +0 -273
  183. package/src/UserCenter/components/fallback.tsx +0 -57
  184. package/src/UserCenter/components/nft-preview.tsx +0 -84
  185. package/src/UserCenter/components/nft.tsx +0 -279
  186. package/src/UserCenter/components/notification.tsx +0 -319
  187. package/src/UserCenter/components/passport.tsx +0 -107
  188. package/src/UserCenter/components/privacy.tsx +0 -120
  189. package/src/UserCenter/components/settings.tsx +0 -170
  190. package/src/UserCenter/components/status-dialog/date-picker.tsx +0 -77
  191. package/src/UserCenter/components/status-dialog/index.tsx +0 -293
  192. package/src/UserCenter/components/status-selector/duration-menu.tsx +0 -90
  193. package/src/UserCenter/components/status-selector/index.tsx +0 -58
  194. package/src/UserCenter/components/status-selector/menu-item.tsx +0 -56
  195. package/src/UserCenter/components/storage/action.tsx +0 -49
  196. package/src/UserCenter/components/storage/connected.tsx +0 -61
  197. package/src/UserCenter/components/storage/delete.tsx +0 -72
  198. package/src/UserCenter/components/storage/disconnect.tsx +0 -40
  199. package/src/UserCenter/components/storage/icons/empty-spaces-nft.svg +0 -1
  200. package/src/UserCenter/components/storage/icons/long-arrow.svg +0 -5
  201. package/src/UserCenter/components/storage/icons/space-connected.svg +0 -3
  202. package/src/UserCenter/components/storage/icons/space-disconnect.svg +0 -3
  203. package/src/UserCenter/components/storage/index.tsx +0 -41
  204. package/src/UserCenter/components/storage/preview-nft.tsx +0 -72
  205. package/src/UserCenter/components/third-party-login/index.tsx +0 -199
  206. package/src/UserCenter/components/third-party-login/third-party-item.tsx +0 -296
  207. package/src/UserCenter/components/user-center.tsx +0 -787
  208. package/src/UserCenter/components/user-info/address.tsx +0 -143
  209. package/src/UserCenter/components/user-info/index.tsx +0 -4
  210. package/src/UserCenter/components/user-info/link-preview-input.tsx +0 -274
  211. package/src/UserCenter/components/user-info/metadata.tsx +0 -658
  212. package/src/UserCenter/components/user-info/social-actions/chat.tsx +0 -43
  213. package/src/UserCenter/components/user-info/social-actions/follow.tsx +0 -23
  214. package/src/UserCenter/components/user-info/social-actions/index.tsx +0 -17
  215. package/src/UserCenter/components/user-info/switch-role.tsx +0 -42
  216. package/src/UserCenter/components/user-info/timezone-select.tsx +0 -119
  217. package/src/UserCenter/components/user-info/user-basic-info.tsx +0 -292
  218. package/src/UserCenter/components/user-info/user-info-item.tsx +0 -54
  219. package/src/UserCenter/components/user-info/user-info.tsx +0 -91
  220. package/src/UserCenter/components/user-info/user-status.tsx +0 -234
  221. package/src/UserCenter/components/user-info/utils.ts +0 -320
  222. package/src/UserCenter/components/webhook-item.tsx +0 -248
  223. package/src/UserCenter/index.tsx +0 -1
  224. package/src/UserCenter/libs/locales.ts +0 -378
  225. package/src/UserCenter/libs/utils.ts +0 -30
  226. package/src/UserSessions/components/user-session-info.tsx +0 -78
  227. package/src/UserSessions/components/user-sessions.tsx +0 -545
  228. package/src/UserSessions/index.tsx +0 -1
  229. package/src/UserSessions/libs/locales.ts +0 -60
  230. package/src/UserSessions/libs/utils.ts +0 -82
  231. package/src/blocklets.js +0 -195
  232. package/src/common/domain-warning.jsx +0 -178
  233. package/src/common/header-addons.jsx +0 -119
  234. package/src/common/link-blocker.jsx +0 -20
  235. package/src/common/notification-addon.jsx +0 -135
  236. package/src/common/org-switch/avatar-uploader.jsx +0 -271
  237. package/src/common/org-switch/create.jsx +0 -267
  238. package/src/common/org-switch/index.jsx +0 -407
  239. package/src/common/org-switch/locales.js +0 -52
  240. package/src/common/org-switch/use-org.jsx +0 -79
  241. package/src/common/overridable-theme-provider.jsx +0 -17
  242. package/src/common/wallet-hidden-topbar.js +0 -14
  243. package/src/common/wizard-modal.jsx +0 -200
  244. package/src/common/ws.js +0 -68
  245. package/src/contexts/config-user-space.tsx +0 -88
  246. package/src/contexts/user-followers.tsx +0 -54
  247. package/src/hooks/use-follow.tsx +0 -75
  248. package/src/hooks/use-mobile.tsx +0 -6
  249. package/src/index.ts +0 -16
  250. package/src/libs/constant.ts +0 -1
  251. package/src/libs/spaces.tsx +0 -18
  252. package/src/libs/with-hide-when-embed.tsx +0 -24
  253. package/src/types.js +0 -45
  254. package/src/utils.js +0 -161
  255. package/vite.config.mjs +0 -34
@@ -1,111 +0,0 @@
1
- import { useMemo } from 'react';
2
- import PropTypes from 'prop-types';
3
- import { styled, useTheme, deepmerge, ThemeProvider } from '@arcblock/ux/lib/Theme';
4
- import { withErrorBoundary } from 'react-error-boundary';
5
- import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';
6
- import { ErrorFallback } from '@arcblock/ux/lib/ErrorBoundary';
7
- import useBlockletLogo from '@arcblock/ux/lib/hooks/use-blocklet-logo';
8
- import omit from 'lodash/omit';
9
-
10
- import InternalFooter from './internal-footer';
11
- import { mapRecursive } from '../utils';
12
- import { formatBlockletInfo, getLocalizedNavigation } from '../blocklets';
13
- import { BlockletMetaProps } from '../types';
14
- import withHideWhenEmbed from '../libs/with-hide-when-embed';
15
-
16
- /**
17
- * 专门用于 (composable) blocklet 的 Footer 组件, 基于 blocklet meta 中的数据渲染
18
- */
19
- function Footer({ meta = {}, theme: themeOverrides = {}, ...rest }) {
20
- const { locale, defaultLocale } = useLocaleContext() || {};
21
- const parentTheme = useTheme();
22
- const formattedBlocklet = useMemo(() => {
23
- const blocklet = Object.assign({}, window.blocklet, meta);
24
- try {
25
- return formatBlockletInfo(blocklet);
26
- } catch (e) {
27
- console.error('Failed to format blocklet info', e, blocklet);
28
- return blocklet;
29
- }
30
- }, [meta]);
31
-
32
- const mergeTheme = useMemo(() => deepmerge(parentTheme, themeOverrides), [parentTheme, themeOverrides]);
33
- const appLogo = useBlockletLogo({
34
- key: 'xs', // 始终优先长 logo
35
- meta,
36
- theme: themeOverrides,
37
- });
38
-
39
- if (!formattedBlocklet.appName) {
40
- return null;
41
- }
42
-
43
- const { appName, appDescription, description, copyright } = formattedBlocklet;
44
- const $bgColor = mergeTheme.palette.background.default;
45
-
46
- const localized = {
47
- footerNav:
48
- getLocalizedNavigation({
49
- navigation: formattedBlocklet?.navigation?.footer,
50
- locale,
51
- defaultLocale,
52
- section: 'footer',
53
- }) || [],
54
- socialMedia:
55
- getLocalizedNavigation({
56
- navigation: formattedBlocklet?.navigation?.social,
57
- locale,
58
- defaultLocale,
59
- section: 'footer',
60
- }) || [],
61
- links:
62
- getLocalizedNavigation({
63
- navigation: formattedBlocklet?.navigation?.bottom,
64
- locale,
65
- defaultLocale,
66
- section: 'footer',
67
- }) || [],
68
- };
69
-
70
- const props = {
71
- brand: {
72
- name: appName,
73
- description: appDescription || description,
74
- logo: appLogo,
75
- },
76
- navigation: mapRecursive(
77
- localized.footerNav,
78
- (item) => ({
79
- ...item,
80
- label: item.title,
81
- link: item.link,
82
- }),
83
- 'items'
84
- ),
85
- copyright,
86
- socialMedia: localized.socialMedia,
87
- links: localized.links.map((item) => ({ ...item, label: item.title })),
88
- };
89
-
90
- return (
91
- <ThemeProvider theme={mergeTheme}>
92
- <StyledInternalFooter {...props} {...omit(rest, ['bordered'])} $bordered={rest?.bordered} $bgcolor={$bgColor} />
93
- </ThemeProvider>
94
- );
95
- }
96
-
97
- Footer.propTypes = {
98
- meta: BlockletMetaProps,
99
- // 允许覆盖 footer 内置的 theme
100
- theme: PropTypes.object,
101
- };
102
-
103
- const StyledInternalFooter = styled(InternalFooter)`
104
- ${({ $bordered, theme }) => `border-top: 1px solid ${$bordered && theme.palette.divider};`}
105
- color: ${({ theme }) => theme.palette.text.secondary};
106
- ${({ $bgcolor }) => $bgcolor && `background-color: ${$bgcolor};`}
107
- `;
108
-
109
- export default withErrorBoundary(withHideWhenEmbed(Footer), {
110
- FallbackComponent: ErrorFallback,
111
- });
@@ -1,139 +0,0 @@
1
- import PropTypes from 'prop-types';
2
- import { Box } from '@mui/material';
3
- import clsx from 'clsx';
4
-
5
- import Brand from './brand';
6
- import Links from './links';
7
- import SocialMedia from './social-media';
8
- import Copyright from './copyright';
9
- import StandardLayout from './layout/standard';
10
- import PlainLayout from './layout/plain';
11
-
12
- const layouts = [
13
- {
14
- name: 'plain',
15
- // 没有 navigation 和 socialMedia, 使用一个简单的两端对齐布局
16
- support: (_, data) => !data.navigation?.length && !data.socialMedia?.length,
17
- component: PlainLayout,
18
- },
19
- {
20
- name: 'standard',
21
- // 默认标准布局
22
- support: () => true,
23
- component: StandardLayout,
24
- },
25
- ];
26
-
27
- const layoutsKeyByName = layouts.reduce((acc, cur) => ({ ...acc, [cur.name]: cur }), {});
28
-
29
- /**
30
- * 通用的内部 footer 组件, 定义并渲染常见的几种 footer 元素: brand/navigation/social medial 等
31
- */
32
- function InternalFooter({ ...props }) {
33
- const {
34
- brand = null,
35
- navigation = null,
36
- socialMedia = null,
37
- copyright = null,
38
- links = null,
39
- layout = 'auto',
40
- ...rest
41
- } = props;
42
- const renderBrand = () => {
43
- return brand ? <Brand {...brand} /> : null;
44
- };
45
- const renderNavigation = () => {
46
- return navigation?.length ? <Links links={navigation} minColumns={3} /> : null;
47
- };
48
- const renderSocialMedia = () => {
49
- return socialMedia?.length ? <SocialMedia items={socialMedia} /> : null;
50
- };
51
- const renderCopyright = () => {
52
- // 如果 copyright.owner 不存在, 则使用 brand.name, 如果 brand.name 也不存在, copyright 元素为空
53
- const copyrightOwner = copyright?.owner || brand?.name;
54
- if (!copyrightOwner) {
55
- return null;
56
- }
57
- return <Copyright owner={copyrightOwner} year={copyright?.year || undefined} />;
58
- };
59
- const renderLinks = () => {
60
- return links?.length ? <Links flowLayout links={links} /> : null;
61
- };
62
-
63
- const elements = {
64
- brand: renderBrand(),
65
- navigation: renderNavigation(),
66
- socialMedia: renderSocialMedia(),
67
- copyright: renderCopyright(),
68
- links: renderLinks(),
69
- };
70
- let LayoutComponent = null;
71
- if (layout === 'auto') {
72
- LayoutComponent = layouts.find((item) => item.support(elements, props)).component;
73
- } else {
74
- LayoutComponent = layoutsKeyByName[layout]?.component;
75
- }
76
- if (!LayoutComponent) {
77
- throw new Error(`layout ${layout} is not supported.`);
78
- }
79
-
80
- return (
81
- <Box
82
- {...rest}
83
- className={clsx('blocklet__footer', rest.className)}
84
- sx={[
85
- {
86
- position: 'relative',
87
- },
88
- ...(Array.isArray(rest.sx) ? rest.sx : [rest.sx]),
89
- ]}>
90
- <LayoutComponent elements={elements} data={props} />
91
- <Box
92
- sx={{
93
- position: 'absolute',
94
- right: 16,
95
- bottom: 0,
96
- fontSize: 12,
97
- color: 'transparent',
98
- '::selection': { background: '#000', color: '#fff' },
99
- }}>
100
- {window?.blocklet?.version}
101
- </Box>
102
- </Box>
103
- );
104
- }
105
-
106
- InternalFooter.propTypes = {
107
- brand: PropTypes.shape({
108
- name: PropTypes.node,
109
- description: PropTypes.string,
110
- logo: PropTypes.node,
111
- }),
112
- navigation: PropTypes.arrayOf(
113
- PropTypes.shape({
114
- label: PropTypes.node,
115
- link: PropTypes.string,
116
- })
117
- ),
118
- socialMedia: PropTypes.arrayOf(
119
- PropTypes.shape({
120
- icon: PropTypes.node,
121
- link: PropTypes.string,
122
- })
123
- ),
124
- copyright: PropTypes.shape({
125
- owner: PropTypes.string,
126
- year: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
127
- }),
128
- // privacy/legal 等链接, 常放于 footer 右下侧或最底部
129
- links: PropTypes.arrayOf(
130
- PropTypes.shape({
131
- label: PropTypes.node,
132
- link: PropTypes.string,
133
- })
134
- ),
135
- // 可显式指定 footer layout, 默认根据内容自动决定 layout
136
- layout: PropTypes.oneOf(['auto', 'standard', 'plain']),
137
- };
138
-
139
- export default InternalFooter;
@@ -1,55 +0,0 @@
1
- import { cloneElement } from 'react';
2
- import PropTypes from 'prop-types';
3
- import { Container } from '@mui/material';
4
- import { styled } from '@arcblock/ux/lib/Theme';
5
- import Row from './row';
6
-
7
- /**
8
- * footer plain layout
9
- */
10
- function PlainLayout({ elements, data, ...rest }) {
11
- return (
12
- <Root {...rest}>
13
- <Container style={{ padding: 0 }}>
14
- <Container className="plain-layout-container">
15
- {elements.links && (
16
- <Row sx={{ width: 1 }} autoCenter>
17
- {elements.copyright}
18
- {elements.links}
19
- </Row>
20
- )}
21
- {!elements.links && (
22
- <>
23
- {cloneElement(elements.brand, { name: null, description: null })}
24
- {elements.copyright}
25
- </>
26
- )}
27
- </Container>
28
- </Container>
29
- </Root>
30
- );
31
- }
32
-
33
- PlainLayout.propTypes = {
34
- elements: PropTypes.shape({
35
- brand: PropTypes.element,
36
- navigation: PropTypes.element,
37
- socialMedia: PropTypes.element,
38
- copyright: PropTypes.element,
39
- links: PropTypes.element,
40
- }).isRequired,
41
- data: PropTypes.object.isRequired,
42
- };
43
-
44
- const Root = styled('div')`
45
- padding: 24px 0;
46
- .plain-layout-container {
47
- display: flex;
48
- justify-content: space-between;
49
- align-items: center;
50
- flex-wrap: wrap;
51
- gap: 8px;
52
- }
53
- `;
54
-
55
- export default PlainLayout;
@@ -1,43 +0,0 @@
1
- import PropTypes from 'prop-types';
2
- import { Box } from '@mui/material';
3
- import { styled } from '@arcblock/ux/lib/Theme';
4
- import clsx from 'clsx';
5
-
6
- export default function Row({ children = null, autoCenter = false, ...rest }) {
7
- if (!children) {
8
- return null;
9
- }
10
- return (
11
- <RowRoot {...rest} className={clsx(rest.className, { 'footer-row-auto-center': autoCenter })}>
12
- {children}
13
- </RowRoot>
14
- );
15
- }
16
-
17
- Row.propTypes = {
18
- children: PropTypes.any,
19
- autoCenter: PropTypes.bool,
20
- };
21
-
22
- const RowRoot = styled(Box)`
23
- display: flex;
24
- justify-content: space-between;
25
- & + & {
26
- margin-top: 24px;
27
- }
28
- &.footer-row-auto-center > *:only-child {
29
- margin: 0 auto;
30
- }
31
-
32
- ${({ theme }) => theme.breakpoints.down('md')} {
33
- align-items: stretch;
34
- flex-direction: column;
35
- gap: ${({ theme }) => theme.spacing(1)};
36
- > * {
37
- flex: 1 0 100%;
38
- }
39
- &.footer-row-auto-center > * {
40
- margin: 0 auto;
41
- }
42
- }
43
- `;
@@ -1,114 +0,0 @@
1
- import PropTypes from 'prop-types';
2
- import clsx from 'clsx';
3
- import { Box, Container } from '@mui/material';
4
- import { styled } from '@arcblock/ux/lib/Theme';
5
-
6
- import Row from './row';
7
-
8
- /**
9
- * footer standard layout
10
- */
11
- function StandardLayout({ elements, data, className = '', ...rest }) {
12
- const withNavigation = !!data.navigation?.length;
13
-
14
- let topSection = null;
15
-
16
- if (withNavigation) {
17
- // 左 brand & social,右导航栏
18
- topSection = (
19
- <Container sx={{ display: 'flex', flexDirection: { xs: 'column', md: 'row' }, justifyContent: 'space-between' }}>
20
- <Box
21
- sx={{
22
- flex: '1 1 auto',
23
- paddingRight: { xs: 0, md: 3 },
24
- display: 'flex',
25
- flexDirection: 'column',
26
- alignItems: 'flex-start',
27
- gap: 2,
28
- pb: 3,
29
- }}>
30
- <Box>{elements.brand}</Box>
31
- <Box
32
- sx={{
33
- lineHeight: 1,
34
- }}>
35
- {elements.socialMedia}
36
- </Box>
37
- </Box>
38
- <Box sx={({ palette }) => ({ mb: 3, borderTop: { xs: `1px solid ${palette.grey[200]}`, md: 0 } })}>
39
- {elements.navigation}
40
- </Box>
41
- </Container>
42
- );
43
- } else {
44
- // 左 brand,右 social
45
- topSection = (
46
- <Container
47
- sx={{
48
- display: 'flex',
49
- flexDirection: { xs: 'column', md: 'row' },
50
- justifyContent: 'space-between',
51
- alignItems: 'space-between',
52
- gap: 2,
53
- pb: 3,
54
- }}>
55
- <Box>{elements.brand}</Box>
56
- <Box
57
- sx={{
58
- lineHeight: 1,
59
- }}>
60
- {elements.socialMedia}
61
- </Box>
62
- </Container>
63
- );
64
- }
65
-
66
- return (
67
- <Root {...rest} className={clsx({ 'footer--with-navs': withNavigation }, className)}>
68
- <Container style={{ padding: 0 }}>
69
- {topSection}
70
- {/* 分割线可以延伸 */}
71
- <Box sx={{ pt: 3, borderTop: 1, borderColor: 'divider' }} />
72
- <Container>
73
- <Row autoCenter>
74
- {elements.copyright}
75
- {elements.links}
76
- </Row>
77
- </Container>
78
- </Container>
79
- </Root>
80
- );
81
- }
82
-
83
- StandardLayout.propTypes = {
84
- elements: PropTypes.shape({
85
- brand: PropTypes.element,
86
- navigation: PropTypes.element,
87
- socialMedia: PropTypes.element,
88
- copyright: PropTypes.element,
89
- links: PropTypes.element,
90
- }).isRequired,
91
- data: PropTypes.object.isRequired,
92
- className: PropTypes.string,
93
- };
94
-
95
- const Root = styled('div')`
96
- padding: 32px 0 24px 0;
97
- .footer-brand-name,
98
- .footer-brand-desc {
99
- display: none;
100
- }
101
- &.footer--with-navs {
102
- ${(props) => props.theme.breakpoints.up('md')} {
103
- .footer-brand-desc {
104
- max-width: 360px;
105
- display: block;
106
- }
107
- }
108
- }
109
- && .footer-brand-logo {
110
- margin-right: 0;
111
- }
112
- `;
113
-
114
- export default StandardLayout;