@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.
- package/lib/common/org-switch/use-org.d.ts +4 -4
- package/lib/common/ws.d.ts +22 -1
- package/package.json +10 -7
- package/.aigne/doc-smith/.local/afs-storage.sqlite3 +0 -0
- package/.aigne/doc-smith/config.yaml +0 -78
- package/.aigne/doc-smith/history.yaml +0 -14
- package/.aigne/doc-smith/media-description.yaml +0 -11
- package/.aigne/doc-smith/output/structure-plan.json +0 -255
- package/.aigne/doc-smith/translation-cache.yaml +0 -11
- package/.aigne/doc-smith/upload-cache.yaml +0 -528
- package/build.config.ts +0 -24
- package/docs/_sidebar.md +0 -19
- package/docs/assets/diagram/component-installer-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/component-installer-diagram-0.jpg +0 -0
- package/docs/assets/diagram/component-installer-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/component-installer-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/component-management-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/component-management-diagram-0.jpg +0 -0
- package/docs/assets/diagram/component-management-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/component-management-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/core-concepts-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/core-concepts-diagram-0.jpg +0 -0
- package/docs/assets/diagram/core-concepts-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/core-concepts-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/dashboard-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/dashboard-diagram-0.jpg +0 -0
- package/docs/assets/diagram/dashboard-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/dashboard-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/header-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/header-diagram-0.jpg +0 -0
- package/docs/assets/diagram/header-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/header-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/layout-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/layout-diagram-0.jpg +0 -0
- package/docs/assets/diagram/layout-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/layout-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/notifications-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/notifications-diagram-0.jpg +0 -0
- package/docs/assets/diagram/notifications-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/notifications-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/overview-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/overview-diagram-0.jpg +0 -0
- package/docs/assets/diagram/overview-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/overview-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/user-center-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/user-center-diagram-0.jpg +0 -0
- package/docs/assets/diagram/user-center-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/user-center-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/user-management-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/user-management-diagram-0.jpg +0 -0
- package/docs/assets/diagram/user-management-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/user-management-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/user-sessions-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/user-sessions-diagram-0.jpg +0 -0
- package/docs/assets/diagram/user-sessions-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/user-sessions-diagram-0.zh.jpg +0 -0
- package/docs/components-component-management-blocklet-studio.ja.md +0 -194
- package/docs/components-component-management-blocklet-studio.md +0 -194
- package/docs/components-component-management-blocklet-studio.zh-TW.md +0 -194
- package/docs/components-component-management-blocklet-studio.zh.md +0 -194
- package/docs/components-component-management-component-installer.ja.md +0 -182
- package/docs/components-component-management-component-installer.md +0 -182
- package/docs/components-component-management-component-installer.zh-TW.md +0 -182
- package/docs/components-component-management-component-installer.zh.md +0 -182
- package/docs/components-component-management.ja.md +0 -30
- package/docs/components-component-management.md +0 -30
- package/docs/components-component-management.zh-TW.md +0 -30
- package/docs/components-component-management.zh.md +0 -30
- package/docs/components-layout-dashboard.ja.md +0 -185
- package/docs/components-layout-dashboard.md +0 -187
- package/docs/components-layout-dashboard.zh-TW.md +0 -185
- package/docs/components-layout-dashboard.zh.md +0 -185
- package/docs/components-layout-footer.ja.md +0 -165
- package/docs/components-layout-footer.md +0 -165
- package/docs/components-layout-footer.zh-TW.md +0 -165
- package/docs/components-layout-footer.zh.md +0 -165
- package/docs/components-layout-header.ja.md +0 -183
- package/docs/components-layout-header.md +0 -183
- package/docs/components-layout-header.zh-TW.md +0 -183
- package/docs/components-layout-header.zh.md +0 -183
- package/docs/components-layout.ja.md +0 -31
- package/docs/components-layout.md +0 -31
- package/docs/components-layout.zh-TW.md +0 -31
- package/docs/components-layout.zh.md +0 -31
- package/docs/components-notifications.ja.md +0 -125
- package/docs/components-notifications.md +0 -125
- package/docs/components-notifications.zh-TW.md +0 -125
- package/docs/components-notifications.zh.md +0 -125
- package/docs/components-user-management-user-center.ja.md +0 -148
- package/docs/components-user-management-user-center.md +0 -147
- package/docs/components-user-management-user-center.zh-TW.md +0 -148
- package/docs/components-user-management-user-center.zh.md +0 -148
- package/docs/components-user-management-user-sessions.ja.md +0 -121
- package/docs/components-user-management-user-sessions.md +0 -123
- package/docs/components-user-management-user-sessions.zh-TW.md +0 -121
- package/docs/components-user-management-user-sessions.zh.md +0 -121
- package/docs/components-user-management.ja.md +0 -49
- package/docs/components-user-management.md +0 -51
- package/docs/components-user-management.zh-TW.md +0 -49
- package/docs/components-user-management.zh.md +0 -49
- package/docs/components-utilities-icon.ja.md +0 -106
- package/docs/components-utilities-icon.md +0 -106
- package/docs/components-utilities-icon.zh-TW.md +0 -106
- package/docs/components-utilities-icon.zh.md +0 -106
- package/docs/components-utilities.ja.md +0 -136
- package/docs/components-utilities.md +0 -136
- package/docs/components-utilities.zh-TW.md +0 -136
- package/docs/components-utilities.zh.md +0 -136
- package/docs/components.ja.md +0 -27
- package/docs/components.md +0 -27
- package/docs/components.zh-TW.md +0 -27
- package/docs/components.zh.md +0 -27
- package/docs/core-concepts.ja.md +0 -134
- package/docs/core-concepts.md +0 -135
- package/docs/core-concepts.zh-TW.md +0 -134
- package/docs/core-concepts.zh.md +0 -134
- package/docs/getting-started.ja.md +0 -132
- package/docs/getting-started.md +0 -132
- package/docs/getting-started.zh-TW.md +0 -132
- package/docs/getting-started.zh.md +0 -132
- package/docs/hooks-api.ja.md +0 -214
- package/docs/hooks-api.md +0 -214
- package/docs/hooks-api.zh-TW.md +0 -214
- package/docs/hooks-api.zh.md +0 -214
- package/docs/how-to-guides.ja.md +0 -413
- package/docs/how-to-guides.md +0 -413
- package/docs/how-to-guides.zh-TW.md +0 -413
- package/docs/how-to-guides.zh.md +0 -413
- package/docs/overview.ja.md +0 -51
- package/docs/overview.md +0 -51
- package/docs/overview.zh-TW.md +0 -51
- package/docs/overview.zh.md +0 -51
- package/glossary.md +0 -12
- package/src/@types/index.ts +0 -230
- package/src/@types/shims.d.ts +0 -18
- package/src/BlockletStudio/README.md +0 -116
- package/src/BlockletStudio/index.tsx +0 -145
- package/src/ComponentInstaller/ComponentInstaller.stories.jsx +0 -16
- package/src/ComponentInstaller/index.jsx +0 -207
- package/src/ComponentInstaller/installer-item.jsx +0 -129
- package/src/ComponentInstaller/locales.js +0 -22
- package/src/ComponentInstaller/use-component-installed.js +0 -88
- package/src/ComponentManager/components/add-component.tsx +0 -136
- package/src/ComponentManager/components/check-component.tsx +0 -3
- package/src/ComponentManager/components/publish-component.tsx +0 -90
- package/src/ComponentManager/components/resource-dialog.tsx +0 -91
- package/src/ComponentManager/index.tsx +0 -3
- package/src/ComponentManager/libs/locales.ts +0 -15
- package/src/Dashboard/Dashboard.stories.jsx +0 -20
- package/src/Dashboard/app-shell/app-badge.stories.tsx +0 -64
- package/src/Dashboard/app-shell/app-badge.tsx +0 -94
- package/src/Dashboard/app-shell/app-header.tsx +0 -104
- package/src/Dashboard/app-shell/app-info-context.tsx +0 -182
- package/src/Dashboard/app-shell/badges/app-badge-default.tsx +0 -130
- package/src/Dashboard/app-shell/badges/app-badge-did.tsx +0 -28
- package/src/Dashboard/app-shell/badges/app-badge-state.tsx +0 -40
- package/src/Dashboard/app-shell/badges/app-badge-switch.tsx +0 -72
- package/src/Dashboard/app-shell/badges/app-badge-version.tsx +0 -60
- package/src/Dashboard/app-shell/index.ts +0 -5
- package/src/Dashboard/index.jsx +0 -184
- package/src/Footer/Footer.stories.jsx +0 -33
- package/src/Footer/brand.jsx +0 -81
- package/src/Footer/copyright.jsx +0 -22
- package/src/Footer/index.jsx +0 -111
- package/src/Footer/internal-footer.jsx +0 -139
- package/src/Footer/layout/plain.jsx +0 -55
- package/src/Footer/layout/row.jsx +0 -43
- package/src/Footer/layout/standard.jsx +0 -114
- package/src/Footer/links.jsx +0 -321
- package/src/Footer/social-media.jsx +0 -55
- package/src/Header/Header.stories.jsx +0 -30
- package/src/Header/index.tsx +0 -259
- package/src/Icon/Icon.stories.jsx +0 -12
- package/src/Icon/index.tsx +0 -87
- package/src/Notifications/Snackbar.tsx +0 -261
- package/src/Notifications/hooks/use-title.tsx +0 -254
- package/src/Notifications/hooks/use-width.tsx +0 -16
- package/src/Notifications/utils.ts +0 -246
- package/src/UserCenter/assets/banner.png +0 -0
- package/src/UserCenter/components/config-inviter.tsx +0 -48
- package/src/UserCenter/components/config-profile.tsx +0 -99
- package/src/UserCenter/components/danger-zone.tsx +0 -82
- package/src/UserCenter/components/editable-field.tsx +0 -273
- package/src/UserCenter/components/fallback.tsx +0 -57
- package/src/UserCenter/components/nft-preview.tsx +0 -84
- package/src/UserCenter/components/nft.tsx +0 -279
- package/src/UserCenter/components/notification.tsx +0 -319
- package/src/UserCenter/components/passport.tsx +0 -107
- package/src/UserCenter/components/privacy.tsx +0 -120
- package/src/UserCenter/components/settings.tsx +0 -170
- package/src/UserCenter/components/status-dialog/date-picker.tsx +0 -77
- package/src/UserCenter/components/status-dialog/index.tsx +0 -293
- package/src/UserCenter/components/status-selector/duration-menu.tsx +0 -90
- package/src/UserCenter/components/status-selector/index.tsx +0 -58
- package/src/UserCenter/components/status-selector/menu-item.tsx +0 -56
- package/src/UserCenter/components/storage/action.tsx +0 -49
- package/src/UserCenter/components/storage/connected.tsx +0 -61
- package/src/UserCenter/components/storage/delete.tsx +0 -72
- package/src/UserCenter/components/storage/disconnect.tsx +0 -40
- package/src/UserCenter/components/storage/icons/empty-spaces-nft.svg +0 -1
- package/src/UserCenter/components/storage/icons/long-arrow.svg +0 -5
- package/src/UserCenter/components/storage/icons/space-connected.svg +0 -3
- package/src/UserCenter/components/storage/icons/space-disconnect.svg +0 -3
- package/src/UserCenter/components/storage/index.tsx +0 -41
- package/src/UserCenter/components/storage/preview-nft.tsx +0 -72
- package/src/UserCenter/components/third-party-login/index.tsx +0 -199
- package/src/UserCenter/components/third-party-login/third-party-item.tsx +0 -296
- package/src/UserCenter/components/user-center.tsx +0 -787
- package/src/UserCenter/components/user-info/address.tsx +0 -143
- package/src/UserCenter/components/user-info/index.tsx +0 -4
- package/src/UserCenter/components/user-info/link-preview-input.tsx +0 -274
- package/src/UserCenter/components/user-info/metadata.tsx +0 -658
- package/src/UserCenter/components/user-info/social-actions/chat.tsx +0 -43
- package/src/UserCenter/components/user-info/social-actions/follow.tsx +0 -23
- package/src/UserCenter/components/user-info/social-actions/index.tsx +0 -17
- package/src/UserCenter/components/user-info/switch-role.tsx +0 -42
- package/src/UserCenter/components/user-info/timezone-select.tsx +0 -119
- package/src/UserCenter/components/user-info/user-basic-info.tsx +0 -292
- package/src/UserCenter/components/user-info/user-info-item.tsx +0 -54
- package/src/UserCenter/components/user-info/user-info.tsx +0 -91
- package/src/UserCenter/components/user-info/user-status.tsx +0 -234
- package/src/UserCenter/components/user-info/utils.ts +0 -320
- package/src/UserCenter/components/webhook-item.tsx +0 -248
- package/src/UserCenter/index.tsx +0 -1
- package/src/UserCenter/libs/locales.ts +0 -378
- package/src/UserCenter/libs/utils.ts +0 -30
- package/src/UserSessions/components/user-session-info.tsx +0 -78
- package/src/UserSessions/components/user-sessions.tsx +0 -545
- package/src/UserSessions/index.tsx +0 -1
- package/src/UserSessions/libs/locales.ts +0 -60
- package/src/UserSessions/libs/utils.ts +0 -82
- package/src/blocklets.js +0 -195
- package/src/common/domain-warning.jsx +0 -178
- package/src/common/header-addons.jsx +0 -119
- package/src/common/link-blocker.jsx +0 -20
- package/src/common/notification-addon.jsx +0 -135
- package/src/common/org-switch/avatar-uploader.jsx +0 -271
- package/src/common/org-switch/create.jsx +0 -267
- package/src/common/org-switch/index.jsx +0 -407
- package/src/common/org-switch/locales.js +0 -52
- package/src/common/org-switch/use-org.jsx +0 -79
- package/src/common/overridable-theme-provider.jsx +0 -17
- package/src/common/wallet-hidden-topbar.js +0 -14
- package/src/common/wizard-modal.jsx +0 -200
- package/src/common/ws.js +0 -68
- package/src/contexts/config-user-space.tsx +0 -88
- package/src/contexts/user-followers.tsx +0 -54
- package/src/hooks/use-follow.tsx +0 -75
- package/src/hooks/use-mobile.tsx +0 -6
- package/src/index.ts +0 -16
- package/src/libs/constant.ts +0 -1
- package/src/libs/spaces.tsx +0 -18
- package/src/libs/with-hide-when-embed.tsx +0 -24
- package/src/types.js +0 -45
- package/src/utils.js +0 -161
- package/vite.config.mjs +0 -34
package/src/Footer/index.jsx
DELETED
|
@@ -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;
|