@blocklet/ui-react 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 (256) hide show
  1. package/lib/common/org-switch/use-org.d.ts +4 -4
  2. package/lib/common/ws.d.ts +22 -1
  3. package/package.json +10 -7
  4. package/.aigne/doc-smith/.local/afs-storage.sqlite3 +0 -0
  5. package/.aigne/doc-smith/config.yaml +0 -78
  6. package/.aigne/doc-smith/history.yaml +0 -14
  7. package/.aigne/doc-smith/media-description.yaml +0 -11
  8. package/.aigne/doc-smith/output/structure-plan.json +0 -255
  9. package/.aigne/doc-smith/translation-cache.yaml +0 -11
  10. package/.aigne/doc-smith/upload-cache.yaml +0 -528
  11. package/build.config.ts +0 -24
  12. package/docs/_sidebar.md +0 -19
  13. package/docs/assets/diagram/component-installer-diagram-0.ja.jpg +0 -0
  14. package/docs/assets/diagram/component-installer-diagram-0.jpg +0 -0
  15. package/docs/assets/diagram/component-installer-diagram-0.zh-TW.jpg +0 -0
  16. package/docs/assets/diagram/component-installer-diagram-0.zh.jpg +0 -0
  17. package/docs/assets/diagram/component-management-diagram-0.ja.jpg +0 -0
  18. package/docs/assets/diagram/component-management-diagram-0.jpg +0 -0
  19. package/docs/assets/diagram/component-management-diagram-0.zh-TW.jpg +0 -0
  20. package/docs/assets/diagram/component-management-diagram-0.zh.jpg +0 -0
  21. package/docs/assets/diagram/core-concepts-diagram-0.ja.jpg +0 -0
  22. package/docs/assets/diagram/core-concepts-diagram-0.jpg +0 -0
  23. package/docs/assets/diagram/core-concepts-diagram-0.zh-TW.jpg +0 -0
  24. package/docs/assets/diagram/core-concepts-diagram-0.zh.jpg +0 -0
  25. package/docs/assets/diagram/dashboard-diagram-0.ja.jpg +0 -0
  26. package/docs/assets/diagram/dashboard-diagram-0.jpg +0 -0
  27. package/docs/assets/diagram/dashboard-diagram-0.zh-TW.jpg +0 -0
  28. package/docs/assets/diagram/dashboard-diagram-0.zh.jpg +0 -0
  29. package/docs/assets/diagram/header-diagram-0.ja.jpg +0 -0
  30. package/docs/assets/diagram/header-diagram-0.jpg +0 -0
  31. package/docs/assets/diagram/header-diagram-0.zh-TW.jpg +0 -0
  32. package/docs/assets/diagram/header-diagram-0.zh.jpg +0 -0
  33. package/docs/assets/diagram/layout-diagram-0.ja.jpg +0 -0
  34. package/docs/assets/diagram/layout-diagram-0.jpg +0 -0
  35. package/docs/assets/diagram/layout-diagram-0.zh-TW.jpg +0 -0
  36. package/docs/assets/diagram/layout-diagram-0.zh.jpg +0 -0
  37. package/docs/assets/diagram/notifications-diagram-0.ja.jpg +0 -0
  38. package/docs/assets/diagram/notifications-diagram-0.jpg +0 -0
  39. package/docs/assets/diagram/notifications-diagram-0.zh-TW.jpg +0 -0
  40. package/docs/assets/diagram/notifications-diagram-0.zh.jpg +0 -0
  41. package/docs/assets/diagram/overview-diagram-0.ja.jpg +0 -0
  42. package/docs/assets/diagram/overview-diagram-0.jpg +0 -0
  43. package/docs/assets/diagram/overview-diagram-0.zh-TW.jpg +0 -0
  44. package/docs/assets/diagram/overview-diagram-0.zh.jpg +0 -0
  45. package/docs/assets/diagram/user-center-diagram-0.ja.jpg +0 -0
  46. package/docs/assets/diagram/user-center-diagram-0.jpg +0 -0
  47. package/docs/assets/diagram/user-center-diagram-0.zh-TW.jpg +0 -0
  48. package/docs/assets/diagram/user-center-diagram-0.zh.jpg +0 -0
  49. package/docs/assets/diagram/user-management-diagram-0.ja.jpg +0 -0
  50. package/docs/assets/diagram/user-management-diagram-0.jpg +0 -0
  51. package/docs/assets/diagram/user-management-diagram-0.zh-TW.jpg +0 -0
  52. package/docs/assets/diagram/user-management-diagram-0.zh.jpg +0 -0
  53. package/docs/assets/diagram/user-sessions-diagram-0.ja.jpg +0 -0
  54. package/docs/assets/diagram/user-sessions-diagram-0.jpg +0 -0
  55. package/docs/assets/diagram/user-sessions-diagram-0.zh-TW.jpg +0 -0
  56. package/docs/assets/diagram/user-sessions-diagram-0.zh.jpg +0 -0
  57. package/docs/components-component-management-blocklet-studio.ja.md +0 -194
  58. package/docs/components-component-management-blocklet-studio.md +0 -194
  59. package/docs/components-component-management-blocklet-studio.zh-TW.md +0 -194
  60. package/docs/components-component-management-blocklet-studio.zh.md +0 -194
  61. package/docs/components-component-management-component-installer.ja.md +0 -182
  62. package/docs/components-component-management-component-installer.md +0 -182
  63. package/docs/components-component-management-component-installer.zh-TW.md +0 -182
  64. package/docs/components-component-management-component-installer.zh.md +0 -182
  65. package/docs/components-component-management.ja.md +0 -30
  66. package/docs/components-component-management.md +0 -30
  67. package/docs/components-component-management.zh-TW.md +0 -30
  68. package/docs/components-component-management.zh.md +0 -30
  69. package/docs/components-layout-dashboard.ja.md +0 -185
  70. package/docs/components-layout-dashboard.md +0 -187
  71. package/docs/components-layout-dashboard.zh-TW.md +0 -185
  72. package/docs/components-layout-dashboard.zh.md +0 -185
  73. package/docs/components-layout-footer.ja.md +0 -165
  74. package/docs/components-layout-footer.md +0 -165
  75. package/docs/components-layout-footer.zh-TW.md +0 -165
  76. package/docs/components-layout-footer.zh.md +0 -165
  77. package/docs/components-layout-header.ja.md +0 -183
  78. package/docs/components-layout-header.md +0 -183
  79. package/docs/components-layout-header.zh-TW.md +0 -183
  80. package/docs/components-layout-header.zh.md +0 -183
  81. package/docs/components-layout.ja.md +0 -31
  82. package/docs/components-layout.md +0 -31
  83. package/docs/components-layout.zh-TW.md +0 -31
  84. package/docs/components-layout.zh.md +0 -31
  85. package/docs/components-notifications.ja.md +0 -125
  86. package/docs/components-notifications.md +0 -125
  87. package/docs/components-notifications.zh-TW.md +0 -125
  88. package/docs/components-notifications.zh.md +0 -125
  89. package/docs/components-user-management-user-center.ja.md +0 -148
  90. package/docs/components-user-management-user-center.md +0 -147
  91. package/docs/components-user-management-user-center.zh-TW.md +0 -148
  92. package/docs/components-user-management-user-center.zh.md +0 -148
  93. package/docs/components-user-management-user-sessions.ja.md +0 -121
  94. package/docs/components-user-management-user-sessions.md +0 -123
  95. package/docs/components-user-management-user-sessions.zh-TW.md +0 -121
  96. package/docs/components-user-management-user-sessions.zh.md +0 -121
  97. package/docs/components-user-management.ja.md +0 -49
  98. package/docs/components-user-management.md +0 -51
  99. package/docs/components-user-management.zh-TW.md +0 -49
  100. package/docs/components-user-management.zh.md +0 -49
  101. package/docs/components-utilities-icon.ja.md +0 -106
  102. package/docs/components-utilities-icon.md +0 -106
  103. package/docs/components-utilities-icon.zh-TW.md +0 -106
  104. package/docs/components-utilities-icon.zh.md +0 -106
  105. package/docs/components-utilities.ja.md +0 -136
  106. package/docs/components-utilities.md +0 -136
  107. package/docs/components-utilities.zh-TW.md +0 -136
  108. package/docs/components-utilities.zh.md +0 -136
  109. package/docs/components.ja.md +0 -27
  110. package/docs/components.md +0 -27
  111. package/docs/components.zh-TW.md +0 -27
  112. package/docs/components.zh.md +0 -27
  113. package/docs/core-concepts.ja.md +0 -134
  114. package/docs/core-concepts.md +0 -135
  115. package/docs/core-concepts.zh-TW.md +0 -134
  116. package/docs/core-concepts.zh.md +0 -134
  117. package/docs/getting-started.ja.md +0 -132
  118. package/docs/getting-started.md +0 -132
  119. package/docs/getting-started.zh-TW.md +0 -132
  120. package/docs/getting-started.zh.md +0 -132
  121. package/docs/hooks-api.ja.md +0 -214
  122. package/docs/hooks-api.md +0 -214
  123. package/docs/hooks-api.zh-TW.md +0 -214
  124. package/docs/hooks-api.zh.md +0 -214
  125. package/docs/how-to-guides.ja.md +0 -413
  126. package/docs/how-to-guides.md +0 -413
  127. package/docs/how-to-guides.zh-TW.md +0 -413
  128. package/docs/how-to-guides.zh.md +0 -413
  129. package/docs/overview.ja.md +0 -51
  130. package/docs/overview.md +0 -51
  131. package/docs/overview.zh-TW.md +0 -51
  132. package/docs/overview.zh.md +0 -51
  133. package/glossary.md +0 -12
  134. package/src/@types/index.ts +0 -230
  135. package/src/@types/shims.d.ts +0 -18
  136. package/src/BlockletStudio/README.md +0 -116
  137. package/src/BlockletStudio/index.tsx +0 -145
  138. package/src/ComponentInstaller/ComponentInstaller.stories.jsx +0 -16
  139. package/src/ComponentInstaller/index.jsx +0 -207
  140. package/src/ComponentInstaller/installer-item.jsx +0 -129
  141. package/src/ComponentInstaller/locales.js +0 -22
  142. package/src/ComponentInstaller/use-component-installed.js +0 -88
  143. package/src/ComponentManager/components/add-component.tsx +0 -136
  144. package/src/ComponentManager/components/check-component.tsx +0 -3
  145. package/src/ComponentManager/components/publish-component.tsx +0 -90
  146. package/src/ComponentManager/components/resource-dialog.tsx +0 -91
  147. package/src/ComponentManager/index.tsx +0 -3
  148. package/src/ComponentManager/libs/locales.ts +0 -15
  149. package/src/Dashboard/Dashboard.stories.jsx +0 -20
  150. package/src/Dashboard/app-shell/app-badge.stories.tsx +0 -64
  151. package/src/Dashboard/app-shell/app-badge.tsx +0 -94
  152. package/src/Dashboard/app-shell/app-header.tsx +0 -104
  153. package/src/Dashboard/app-shell/app-info-context.tsx +0 -182
  154. package/src/Dashboard/app-shell/badges/app-badge-default.tsx +0 -130
  155. package/src/Dashboard/app-shell/badges/app-badge-did.tsx +0 -28
  156. package/src/Dashboard/app-shell/badges/app-badge-state.tsx +0 -40
  157. package/src/Dashboard/app-shell/badges/app-badge-switch.tsx +0 -72
  158. package/src/Dashboard/app-shell/badges/app-badge-version.tsx +0 -60
  159. package/src/Dashboard/app-shell/index.ts +0 -5
  160. package/src/Dashboard/index.jsx +0 -184
  161. package/src/Footer/Footer.stories.jsx +0 -33
  162. package/src/Footer/brand.jsx +0 -81
  163. package/src/Footer/copyright.jsx +0 -22
  164. package/src/Footer/index.jsx +0 -111
  165. package/src/Footer/internal-footer.jsx +0 -139
  166. package/src/Footer/layout/plain.jsx +0 -55
  167. package/src/Footer/layout/row.jsx +0 -43
  168. package/src/Footer/layout/standard.jsx +0 -114
  169. package/src/Footer/links.jsx +0 -321
  170. package/src/Footer/social-media.jsx +0 -55
  171. package/src/Header/Header.stories.jsx +0 -30
  172. package/src/Header/index.tsx +0 -259
  173. package/src/Icon/Icon.stories.jsx +0 -12
  174. package/src/Icon/index.tsx +0 -87
  175. package/src/Notifications/Snackbar.tsx +0 -261
  176. package/src/Notifications/hooks/use-title.tsx +0 -254
  177. package/src/Notifications/hooks/use-width.tsx +0 -16
  178. package/src/Notifications/utils.ts +0 -246
  179. package/src/UserCenter/assets/banner.png +0 -0
  180. package/src/UserCenter/components/config-inviter.tsx +0 -48
  181. package/src/UserCenter/components/config-profile.tsx +0 -99
  182. package/src/UserCenter/components/danger-zone.tsx +0 -82
  183. package/src/UserCenter/components/editable-field.tsx +0 -273
  184. package/src/UserCenter/components/fallback.tsx +0 -57
  185. package/src/UserCenter/components/nft-preview.tsx +0 -84
  186. package/src/UserCenter/components/nft.tsx +0 -279
  187. package/src/UserCenter/components/notification.tsx +0 -319
  188. package/src/UserCenter/components/passport.tsx +0 -107
  189. package/src/UserCenter/components/privacy.tsx +0 -120
  190. package/src/UserCenter/components/settings.tsx +0 -170
  191. package/src/UserCenter/components/status-dialog/date-picker.tsx +0 -77
  192. package/src/UserCenter/components/status-dialog/index.tsx +0 -293
  193. package/src/UserCenter/components/status-selector/duration-menu.tsx +0 -90
  194. package/src/UserCenter/components/status-selector/index.tsx +0 -58
  195. package/src/UserCenter/components/status-selector/menu-item.tsx +0 -56
  196. package/src/UserCenter/components/storage/action.tsx +0 -49
  197. package/src/UserCenter/components/storage/connected.tsx +0 -61
  198. package/src/UserCenter/components/storage/delete.tsx +0 -72
  199. package/src/UserCenter/components/storage/disconnect.tsx +0 -40
  200. package/src/UserCenter/components/storage/icons/empty-spaces-nft.svg +0 -1
  201. package/src/UserCenter/components/storage/icons/long-arrow.svg +0 -5
  202. package/src/UserCenter/components/storage/icons/space-connected.svg +0 -3
  203. package/src/UserCenter/components/storage/icons/space-disconnect.svg +0 -3
  204. package/src/UserCenter/components/storage/index.tsx +0 -41
  205. package/src/UserCenter/components/storage/preview-nft.tsx +0 -72
  206. package/src/UserCenter/components/third-party-login/index.tsx +0 -199
  207. package/src/UserCenter/components/third-party-login/third-party-item.tsx +0 -296
  208. package/src/UserCenter/components/user-center.tsx +0 -787
  209. package/src/UserCenter/components/user-info/address.tsx +0 -143
  210. package/src/UserCenter/components/user-info/index.tsx +0 -4
  211. package/src/UserCenter/components/user-info/link-preview-input.tsx +0 -274
  212. package/src/UserCenter/components/user-info/metadata.tsx +0 -658
  213. package/src/UserCenter/components/user-info/social-actions/chat.tsx +0 -43
  214. package/src/UserCenter/components/user-info/social-actions/follow.tsx +0 -23
  215. package/src/UserCenter/components/user-info/social-actions/index.tsx +0 -17
  216. package/src/UserCenter/components/user-info/switch-role.tsx +0 -42
  217. package/src/UserCenter/components/user-info/timezone-select.tsx +0 -119
  218. package/src/UserCenter/components/user-info/user-basic-info.tsx +0 -292
  219. package/src/UserCenter/components/user-info/user-info-item.tsx +0 -54
  220. package/src/UserCenter/components/user-info/user-info.tsx +0 -91
  221. package/src/UserCenter/components/user-info/user-status.tsx +0 -234
  222. package/src/UserCenter/components/user-info/utils.ts +0 -320
  223. package/src/UserCenter/components/webhook-item.tsx +0 -248
  224. package/src/UserCenter/index.tsx +0 -1
  225. package/src/UserCenter/libs/locales.ts +0 -378
  226. package/src/UserCenter/libs/utils.ts +0 -30
  227. package/src/UserSessions/components/user-session-info.tsx +0 -78
  228. package/src/UserSessions/components/user-sessions.tsx +0 -545
  229. package/src/UserSessions/index.tsx +0 -1
  230. package/src/UserSessions/libs/locales.ts +0 -60
  231. package/src/UserSessions/libs/utils.ts +0 -82
  232. package/src/blocklets.js +0 -195
  233. package/src/common/domain-warning.jsx +0 -178
  234. package/src/common/header-addons.jsx +0 -119
  235. package/src/common/link-blocker.jsx +0 -20
  236. package/src/common/notification-addon.jsx +0 -135
  237. package/src/common/org-switch/avatar-uploader.jsx +0 -271
  238. package/src/common/org-switch/create.jsx +0 -267
  239. package/src/common/org-switch/index.jsx +0 -407
  240. package/src/common/org-switch/locales.js +0 -52
  241. package/src/common/org-switch/use-org.jsx +0 -79
  242. package/src/common/overridable-theme-provider.jsx +0 -17
  243. package/src/common/wallet-hidden-topbar.js +0 -14
  244. package/src/common/wizard-modal.jsx +0 -200
  245. package/src/common/ws.js +0 -68
  246. package/src/contexts/config-user-space.tsx +0 -88
  247. package/src/contexts/user-followers.tsx +0 -54
  248. package/src/hooks/use-follow.tsx +0 -75
  249. package/src/hooks/use-mobile.tsx +0 -6
  250. package/src/index.ts +0 -16
  251. package/src/libs/constant.ts +0 -1
  252. package/src/libs/spaces.tsx +0 -18
  253. package/src/libs/with-hide-when-embed.tsx +0 -24
  254. package/src/types.js +0 -45
  255. package/src/utils.js +0 -161
  256. package/vite.config.mjs +0 -34
@@ -1,321 +0,0 @@
1
- /* eslint-disable react/no-array-index-key */
2
- import { useState } from 'react';
3
- import PropTypes from 'prop-types';
4
- import { useCreation } from 'ahooks';
5
- import isInteger from 'lodash/isInteger';
6
- import isString from 'lodash/isString';
7
- import { styled } from '@arcblock/ux/lib/Theme';
8
- import clsx from 'clsx';
9
- import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
10
- import Icon from '../Icon';
11
- import useMobile from '../hooks/use-mobile';
12
- import { splitNavColumns, isMailProtocol } from '../utils';
13
-
14
- /**
15
- * footer 中的 links (支持分组, 最多支持 2 级)
16
- */
17
- export default function Links({ links = [], flowLayout = false, minColumns = 1, maxColumns = 4, ...rest }) {
18
- const [activeIndex, setActiveIndex] = useState(-1);
19
- const isMobile = useMobile({ key: 'md' });
20
- // 只要发现一项元素有子元素, 就认为是分组 (大字号突出 group title)
21
- const isGroupMode = links.some((item) => item.items?.length);
22
- // 是否启用分列布局
23
- const columnsLayout = !isMobile && isGroupMode && isInteger(minColumns) && minColumns > 1 && maxColumns >= minColumns;
24
- // Clamp columns
25
- const columns = columnsLayout ? Math.min(Math.max(links.length, minColumns), maxColumns) : 1;
26
- const renderItem = ({ label, link, icon, render, props }) => {
27
- let result = label;
28
-
29
- if (render) {
30
- result = render({ label, link, props });
31
- } else if (link && isString(link)) {
32
- const isExternal = link.startsWith('http') || link.startsWith('//');
33
- const isMail = isMailProtocol(link);
34
-
35
- const otherProps = isMail
36
- ? {}
37
- : {
38
- target: isExternal ? '_blank' : '_self',
39
- rel: isExternal ? 'noreferrer noopener' : undefined,
40
- };
41
-
42
- result = (
43
- <a href={link} aria-label={`Footer link for ${label}`} {...otherProps} {...props}>
44
- {label}
45
- </a>
46
- );
47
- }
48
-
49
- return (
50
- <>
51
- {icon && <Icon icon={icon} size={20} sx={{ mr: 0.5 }} />}
52
- {result}
53
- </>
54
- );
55
- };
56
- const content = useCreation(() => {
57
- if (!links?.length) {
58
- return null;
59
- }
60
- // 流布局
61
- if (flowLayout) {
62
- return links.map((item, i) => (
63
- <span key={i} className="footer-links-item">
64
- {renderItem(item)}
65
- </span>
66
- ));
67
- }
68
- // 列布局
69
- if (columnsLayout) {
70
- return splitNavColumns(links, { columns }).map((cols, i) => {
71
- return (
72
- <div key={i} className="footer-links-column">
73
- {cols
74
- .filter((v) => v.group)
75
- .map((item, j) => {
76
- const { items } = item;
77
-
78
- return (
79
- <div key={j} className="footer-links-group">
80
- <span className="footer-links-item">{renderItem(item)}</span>
81
- {!!items?.length && (
82
- <div className="footer-links-sub">
83
- {items.map((child, k) => (
84
- <span
85
- key={k}
86
- className={clsx('footer-links-item', { 'footer-links-item--new': child.isNew })}>
87
- {renderItem(child)}
88
- </span>
89
- ))}
90
- </div>
91
- )}
92
- </div>
93
- );
94
- })}
95
- </div>
96
- );
97
- });
98
- }
99
- // 纯 flex 布局
100
- return links.map((item, i) => {
101
- const { items } = item;
102
- // 用于移动端展开
103
- const isActive = i === activeIndex;
104
-
105
- return (
106
- <div
107
- key={i}
108
- className={clsx('footer-links-group', {
109
- 'footer-links-group--active': isActive,
110
- })}
111
- onClick={() => setActiveIndex(activeIndex === i ? -1 : i)}>
112
- <span className="footer-links-item">
113
- {renderItem(item)}
114
- {!!items?.length && (
115
- <span className="footer-links-group-expand-icon">
116
- <ExpandMoreIcon
117
- style={{
118
- transform: `rotate(${isActive ? 180 : 0}deg)`,
119
- }}
120
- />
121
- </span>
122
- )}
123
- </span>
124
- {!!items?.length && (
125
- <div className="footer-links-sub">
126
- {items.map((child, j) => (
127
- <span key={j} className={clsx('footer-links-item', { 'footer-links-item--new': child.isNew })}>
128
- {renderItem(child)}
129
- </span>
130
- ))}
131
- </div>
132
- )}
133
- </div>
134
- );
135
- });
136
- }, [links, flowLayout, columnsLayout, activeIndex]);
137
-
138
- if (!links?.length) {
139
- return null;
140
- }
141
-
142
- return (
143
- <Root
144
- columns={columns}
145
- {...rest}
146
- className={clsx(rest.className, {
147
- 'footer-links--grouped': isGroupMode,
148
- 'footer-links--flow': flowLayout,
149
- 'footer-links--columns': columnsLayout,
150
- })}>
151
- <div className="footer-links-inner">{content}</div>
152
- </Root>
153
- );
154
- }
155
-
156
- Links.propTypes = {
157
- links: PropTypes.arrayOf(
158
- PropTypes.shape({
159
- label: PropTypes.string,
160
- link: PropTypes.string,
161
- render: PropTypes.func,
162
- props: PropTypes.object,
163
- })
164
- ),
165
- // 流动布局, 简单的从左到右排列
166
- flowLayout: PropTypes.bool,
167
- // 列布局,最小列数,最大列数
168
- minColumns: PropTypes.number,
169
- maxColumns: PropTypes.number,
170
- };
171
-
172
- const Root = styled('div', { shouldForwardProp: (prop) => prop !== 'columns' })`
173
- overflow: hidden;
174
- color: ${({ theme }) => theme.palette.text.secondary};
175
- .footer-links-inner {
176
- display: flex;
177
- justify-content: space-between;
178
- margin: 0 -8px;
179
- }
180
- .footer-links-group,
181
- .footer-links-sub {
182
- display: flex;
183
- flex-direction: column;
184
- }
185
- .footer-links-group-expand-icon {
186
- display: none;
187
- position: absolute;
188
- right: 16px;
189
- top: 50%;
190
- transform: translate(0, -50%);
191
- line-height: 1;
192
- svg {
193
- width: auto;
194
- height: 0.75em;
195
- }
196
- }
197
- .footer-links-item {
198
- display: inline-flex;
199
- align-items: center;
200
- position: relative;
201
- padding: 6px 8px;
202
- font-size: 14px;
203
- white-space: nowrap;
204
- &--new::after {
205
- content: 'New';
206
- color: ${({ theme }) => theme.palette.info.main};
207
- background-color: ${({ theme }) => theme.palette.info.light};
208
- padding: 1px 8px;
209
- border-radius: 10px/50%;
210
- margin-left: 8px;
211
- }
212
- }
213
- &.footer-links--grouped {
214
- .footer-links-group {
215
- > .footer-links-item {
216
- font-weight: 600;
217
- color: ${({ theme }) => theme.palette.text.primary};
218
- }
219
- .footer-links-sub {
220
- margin-top: 8px;
221
- }
222
- }
223
- }
224
- a {
225
- display: inline-block;
226
- max-width: 150px;
227
- color: inherit;
228
- text-decoration: none;
229
- transition: color 0.2s ease-in-out;
230
- &:hover {
231
- color: ${({ theme }) => theme.palette.text.primary};
232
- }
233
- }
234
- /* columns 布局 */
235
- &.footer-links--columns {
236
- .footer-links-inner {
237
- gap: ${({ columns }) => `${288 / columns}px`};
238
- }
239
- .footer-links-column {
240
- display: flex;
241
- flex-direction: column;
242
- }
243
- .footer-links-group {
244
- .footer-links-sub {
245
- margin-top: 2px;
246
- margin-bottom: 12px;
247
- }
248
- }
249
- }
250
-
251
- /* flow 布局 */
252
- &.footer-links--flow {
253
- display: inline-flex;
254
- .footer-links-inner {
255
- justify-content: center;
256
- flex-wrap: wrap;
257
- margin: 0 -8px;
258
- .footer-links-item {
259
- padding: 0 8px;
260
- }
261
- .footer-links-item + .footer-links-item::before {
262
- content: '';
263
- position: absolute;
264
- left: 0;
265
- top: 50%;
266
- transform: translate(0, -50%);
267
- height: 1em;
268
- border-left: 1px solid ${(props) => props.theme.palette.text.secondary};
269
- }
270
- }
271
- }
272
-
273
- /* 移动端样式 */
274
- ${(props) => props.theme.breakpoints.down('md')} {
275
- .footer-links-inner {
276
- flex-direction: column;
277
- margin: 0;
278
- }
279
- .footer-links-sub {
280
- display: none;
281
- }
282
- .footer-links-group {
283
- position: relative;
284
- padding: 12px 0;
285
- .footer-links-item .footer-links-group-expand-icon {
286
- display: inline-block;
287
- }
288
- }
289
- .footer-links-group + .footer-links-group {
290
- border-top: 1px solid ${(props) => props.theme.palette.grey[200]};
291
- }
292
- .footer-links-group--active {
293
- .footer-links-sub {
294
- display: flex;
295
- flex-direction: row;
296
- flex-wrap: wrap;
297
- .footer-links-item {
298
- flex: 0 0 50%;
299
- }
300
- }
301
- }
302
- .footer-links-item {
303
- padding-left: 0;
304
- padding-right: 0;
305
- font-size: 13px;
306
- }
307
- &.footer-links--grouped {
308
- .footer-links-group {
309
- > .footer-links-item {
310
- font-size: 14px;
311
- }
312
- }
313
- }
314
-
315
- &.footer-links--flow {
316
- .footer-links-inner {
317
- flex-direction: row;
318
- }
319
- }
320
- }
321
- `;
@@ -1,55 +0,0 @@
1
- import PropTypes from 'prop-types';
2
- import { styled } from '@arcblock/ux/lib/Theme';
3
- import Icon from '../Icon';
4
-
5
- export default function SocialMedia({ items = null, ...rest }) {
6
- if (!items?.length) {
7
- return null;
8
- }
9
- return (
10
- <Root {...rest}>
11
- {items.map((item, i) => {
12
- return (
13
- <a
14
- // eslint-disable-next-line react/no-array-index-key
15
- key={i}
16
- href={item.link}
17
- target="_blank"
18
- aria-label={`Social media icon${item.title ? ` for ${item.title}` : ''}`}
19
- rel="noreferrer">
20
- <Icon icon={item.icon || item.title} size={24} component="span" />
21
- </a>
22
- );
23
- })}
24
- </Root>
25
- );
26
- }
27
-
28
- SocialMedia.propTypes = {
29
- items: PropTypes.arrayOf(
30
- PropTypes.shape({
31
- // icon 对应 Icon#icon prop, 支持 iconify name 和 url 2 种形式:
32
- icon: PropTypes.string,
33
- link: PropTypes.string,
34
- })
35
- ),
36
- };
37
-
38
- const Root = styled('div')`
39
- display: inline-flex;
40
- flex-wrap: wrap;
41
- align-items: center;
42
- justify-content: center;
43
- gap: 20px;
44
- a {
45
- color: ${(props) => props.theme.palette.text.secondary};
46
- text-decoration: none;
47
- transition: color 0.2s ease-in-out;
48
- &:hover {
49
- color: ${({ theme }) => theme.palette.text.primary};
50
- }
51
- }
52
- ${(props) => props.theme.breakpoints.down('md')} {
53
- gap: 12px;
54
- }
55
- `;
@@ -1,30 +0,0 @@
1
- import Basic from './demo/basic';
2
- import WithEnableConnectEnableLocale from './demo/with-enable-connect-enable-locale';
3
- import AddonsCustomization from './demo/addons-customization';
4
-
5
- export default {
6
- title: 'Blocklet-UI-React/Header',
7
-
8
- parameters: {
9
- layout: 'fullscreen',
10
- docs: {
11
- description: {
12
- component:
13
- 'Used to render a page header for Blocklet based on Blocklet runtime information. It requires a blocklet environment to work properly.',
14
- },
15
- },
16
- design: {
17
- type: 'figma',
18
- url: 'https://www.figma.com/file/E8TSBWCOyXzETmVOjzbqvw/ArcBlock-UI-Kit?node-id=1504%3A4630',
19
- },
20
- },
21
- argTypes: {
22
- maxWidth: { control: 'select', options: ['xs', 'sm', 'md', 'lg', 'xl', false] },
23
- },
24
- };
25
-
26
- AddonsCustomization.argTypes = {
27
- overrideTheme: { control: 'boolean', defaultValue: false },
28
- };
29
-
30
- export { Basic, WithEnableConnectEnableLocale, AddonsCustomization };
@@ -1,259 +0,0 @@
1
- import { useMemo, type JSX } from 'react';
2
- import { useMemoizedFn } from 'ahooks';
3
- import { withErrorBoundary } from 'react-error-boundary';
4
- import { ErrorFallback } from '@arcblock/ux/lib/ErrorBoundary';
5
- import { styled, useTheme, deepmerge, ThemeProvider } from '@arcblock/ux/lib/Theme';
6
- import { ResponsiveHeader } from '@arcblock/ux/lib/Header';
7
- import NavMenu, { Products, ProductsType } from '@arcblock/ux/lib/NavMenu';
8
- import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';
9
- import { translate } from '@arcblock/ux/lib/Locale/util';
10
- import useBlockletLogo from '@arcblock/ux/lib/hooks/use-blocklet-logo';
11
- import omit from 'lodash/omit';
12
- import isFinite from 'lodash/isFinite';
13
- import type { BoxProps, Breakpoint, Theme } from '@mui/material';
14
- import clsx from 'clsx';
15
- import { getUTMUrl } from '@arcblock/ux/lib/withTracker/libs/utm';
16
-
17
- import Icon from '../Icon';
18
- import { mapRecursive, flatRecursive, matchPaths } from '../utils';
19
- import { publicPath, formatBlockletInfo, getLocalizedNavigation } from '../blocklets';
20
- import HeaderAddons from '../common/header-addons';
21
- import { useWalletHiddenTopbar } from '../common/wallet-hidden-topbar';
22
- import { BlockletMetaProps, SessionManagerProps } from '../@types';
23
- import withHideWhenEmbed from '../libs/with-hide-when-embed';
24
-
25
- const translations = {
26
- en: {
27
- products: 'Products',
28
- },
29
- zh: {
30
- products: '产品',
31
- },
32
- 'zh-TW': {
33
- products: '產品',
34
- },
35
- ja: {
36
- products: '製品',
37
- },
38
- };
39
-
40
- // blocklet meta 中的 navigation 数据 => NavMenu 组件的 items
41
- const parseNavigation = (navigation: any) => {
42
- if (!navigation?.length) {
43
- return { navItems: [], activeId: null };
44
- }
45
- let counter = 1;
46
- const parseItem = (item: any) => {
47
- const icon = item.icon ? <Icon icon={item.icon} /> : null;
48
-
49
- // sub menu
50
- if (item.items) {
51
- return {
52
- id: `${counter++}`,
53
- label: item.title,
54
- icon,
55
- children: item.items,
56
- };
57
- }
58
- let props = {};
59
-
60
- // external link
61
- if (item.link?.startsWith('http') || item.link?.startsWith('//')) {
62
- props = {
63
- target: '_blank',
64
- rel: 'noreferrer',
65
- };
66
- }
67
-
68
- return {
69
- id: `${counter++}`,
70
- label: (
71
- <a href={getUTMUrl(item.link, 'header')} {...props}>
72
- {item.title}
73
- </a>
74
- ),
75
- icon,
76
- description: item.description,
77
- link: item.link,
78
- };
79
- };
80
- const navItems = mapRecursive(navigation, parseItem, 'items');
81
- const flattened = flatRecursive(navItems);
82
- const matchedIndex = matchPaths(flattened.map((item) => item.link));
83
- return { navItems, activeId: matchedIndex >= 0 ? flattened[matchedIndex].id : null };
84
- };
85
-
86
- type HeaderProps = {
87
- meta?: BlockletMetaProps;
88
- addons?: Function | React.ReactNode;
89
- sessionManagerProps?: SessionManagerProps;
90
- homeLink?: string | ((brandContent: React.ReactNode) => JSX.Element | null);
91
- theme?: object;
92
- hideNavMenu?: boolean;
93
- bordered?: boolean;
94
- logo?: React.ReactNode;
95
- brand?: React.ReactNode;
96
- brandAddon?: React.ReactNode;
97
- description?: React.ReactNode;
98
- children?: React.ReactNode;
99
- prepend?: React.ReactNode;
100
- align?: 'left' | 'right';
101
- maxWidth?: false | Breakpoint;
102
- showDomainWarningDialog?: boolean;
103
- };
104
-
105
- /**
106
- * 专门用于 (composable) blocklet 的 Header 组件, 解析 blocklet meta 中的数据, 通过组合 UX 中的 Header & NavMenu 组件来渲染
107
- */
108
- // eslint-disable-next-line no-shadow
109
-
110
- function Header({
111
- meta = {},
112
- addons = undefined,
113
- sessionManagerProps = {
114
- showRole: true,
115
- },
116
- homeLink = publicPath,
117
- theme: themeOverrides = {},
118
- hideNavMenu = false,
119
- showDomainWarningDialog = true,
120
- ...rest
121
- }: HeaderProps & Omit<BoxProps, keyof HeaderProps>) {
122
- useWalletHiddenTopbar();
123
- const parentTheme = useTheme();
124
- const { locale, defaultLocale } = useLocaleContext() || {};
125
- const t = useMemoizedFn((key, data = {}) => {
126
- return translate(translations, key, locale, 'en', data);
127
- });
128
- const formattedBlocklet = useMemo(() => {
129
- const blocklet = Object.assign({}, window.blocklet, meta);
130
- try {
131
- return formatBlockletInfo(blocklet);
132
- } catch (e) {
133
- console.error('Failed to format blocklet info', e, blocklet);
134
- return blocklet;
135
- }
136
- }, [meta]);
137
- const mergeTheme = useMemo(() => deepmerge(parentTheme, themeOverrides), [parentTheme, themeOverrides]) as Theme;
138
- const appLogo = useBlockletLogo({
139
- meta,
140
- theme: themeOverrides,
141
- });
142
-
143
- // 显示 Products 导航
144
- const { productsOrder, productsType } = useMemo<{
145
- productsOrder: number | null;
146
- productsType: ProductsType | null;
147
- }>(() => {
148
- let { USE_ARCBLOCK_THEME, USE_AIGNE_THEME } = formattedBlocklet;
149
- USE_ARCBLOCK_THEME = parseInt(USE_ARCBLOCK_THEME, 10);
150
- USE_AIGNE_THEME = parseInt(USE_AIGNE_THEME, 10);
151
-
152
- if (isFinite(USE_AIGNE_THEME)) {
153
- return {
154
- productsOrder: USE_AIGNE_THEME,
155
- productsType: 'AIGNE',
156
- };
157
- }
158
- if (isFinite(USE_ARCBLOCK_THEME)) {
159
- return {
160
- productsOrder: USE_ARCBLOCK_THEME,
161
- productsType: 'ARCBLOCK',
162
- };
163
- }
164
-
165
- return {
166
- productsOrder: null,
167
- productsType: null,
168
- };
169
- }, [formattedBlocklet]);
170
-
171
- if (!formattedBlocklet.appName) {
172
- return null;
173
- }
174
- const navigation = getLocalizedNavigation({
175
- navigation: formattedBlocklet?.navigation?.header,
176
- locale,
177
- defaultLocale,
178
- });
179
-
180
- const parsedNavigation = parseNavigation(navigation);
181
- const { navItems, activeId } = parsedNavigation;
182
-
183
- if (productsType && Number.isInteger(productsOrder)) {
184
- navItems.splice(productsOrder, 0, {
185
- label: t('products'),
186
- // eslint-disable-next-line react/no-unstable-nested-components
187
- children: () => <Products type={productsType} />,
188
- });
189
- }
190
-
191
- // eslint-disable-next-line @typescript-eslint/naming-convention
192
- const _addons =
193
- typeof addons === 'function'
194
- ? (builtInAddons: any) => addons(builtInAddons, { navigation: parsedNavigation })
195
- : addons;
196
- const headerAddons = (
197
- // @ts-ignore
198
- <HeaderAddons
199
- formattedBlocklet={formattedBlocklet}
200
- // @ts-ignore
201
- addons={_addons}
202
- // @ts-ignore
203
- sessionManagerProps={sessionManagerProps}
204
- showDomainWarningDialog={showDomainWarningDialog}
205
- />
206
- );
207
-
208
- return (
209
- <ThemeProvider theme={mergeTheme}>
210
- <StyledUxHeader
211
- // @ts-ignore
212
- homeLink={homeLink}
213
- logo={<img src={appLogo} alt="logo" />}
214
- addons={headerAddons}
215
- {...omit(rest, ['bordered'])}
216
- $bordered={rest?.bordered}
217
- $bgcolor={mergeTheme.palette.background.default}
218
- className={clsx('blocklet__header', rest.className)}>
219
- {/* blocklet.yml 没有配置 navigation 时, 则为 children 传入 null, 此时 ResponsiveHeader 会渲染普通的不带 menu 的 Header */}
220
- {hideNavMenu || !navItems?.length
221
- ? null
222
- : ({ isMobile }: { isMobile: boolean }) => (
223
- // @ts-ignore
224
- <NavMenu
225
- mode={isMobile ? 'inline' : 'horizontal'}
226
- activeId={activeId}
227
- items={navItems}
228
- className="header-nav"
229
- bgColor="transparent"
230
- textColor={mergeTheme.palette.grey[500]}
231
- activeTextColor={mergeTheme.palette.text.primary}
232
- />
233
- )}
234
- </StyledUxHeader>
235
- </ThemeProvider>
236
- );
237
- }
238
-
239
- type StyledUxHeaderProps = {
240
- $bordered?: boolean;
241
- $bgcolor?: string;
242
- };
243
-
244
- const StyledUxHeader = styled(ResponsiveHeader)<StyledUxHeaderProps>`
245
- ${({ $bgcolor }) => `background-color: ${$bgcolor || '#fff'};`}
246
- .header-logo {
247
- min-width: 44px;
248
- }
249
- ${({ $bordered, theme }) => ($bordered ? `border-bottom: 1px solid ${theme.palette.divider};` : '')}
250
- ${(props) => props.theme.breakpoints.down('md')} {
251
- .header-logo {
252
- min-width: 32px;
253
- }
254
- }
255
- `;
256
-
257
- export default withErrorBoundary(withHideWhenEmbed(Header), {
258
- FallbackComponent: ErrorFallback,
259
- });
@@ -1,12 +0,0 @@
1
- export { default as Icon } from './demo/basic';
2
-
3
- export default {
4
- title: 'Blocklet-UI-React/Icon',
5
- parameters: {
6
- docs: {
7
- description: {
8
- component: 'A wrapper for Material UI Avatar component that supports iconify icon.',
9
- },
10
- },
11
- },
12
- };