feat(core): add responsive styles to registration page (#5044)

The responsive style of the login and registration page has been adjusted, with special treatment given to the input.
work for #4843
This commit is contained in:
JimmFly
2023-12-06 10:43:13 +00:00
parent 3e92942bb5
commit 7ec8e49b3b
18 changed files with 338 additions and 185 deletions
@@ -0,0 +1,24 @@
import * as styles from './index.css';
import { useNavConfig } from './use-nav-config';
export const DesktopNavbar = () => {
const config = useNavConfig();
return (
<div className={styles.topNavLinks}>
{config.map(item => {
return (
<a
key={item.title}
href={item.path}
target="_blank"
rel="noreferrer"
className={styles.topNavLink}
>
{item.title}
</a>
);
})}
</div>
);
};
@@ -0,0 +1,89 @@
import { style } from '@vanilla-extract/css';
export const root = style({
height: '100vh',
width: '100vw',
display: 'flex',
flexDirection: 'column',
fontSize: 'var(--affine-font-base)',
position: 'relative',
background: 'var(--affine-background-primary-color)',
});
export const affineLogo = style({
color: 'inherit',
});
export const topNav = style({
top: 0,
left: 0,
right: 0,
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
padding: '16px 120px',
selectors: {
'&.mobile': {
padding: '16px 20px',
},
},
});
export const topNavLinks = style({
display: 'flex',
columnGap: 4,
});
export const topNavLink = style({
color: 'var(--affine-text-primary-color)',
fontSize: 'var(--affine-font-sm)',
fontWeight: 500,
textDecoration: 'none',
padding: '4px 18px',
});
export const iconButton = style({
fontSize: '24px',
pointerEvents: 'auto',
selectors: {
'&.plain': {
color: 'var(--affine-text-primary-color)',
},
},
});
export const menu = style({
width: '100vw',
height: '100vh',
padding: '0',
background: 'var(--affine-background-primary-color)',
borderRadius: '0',
border: 'none',
boxShadow: 'none',
});
export const menuItem = style({
color: 'var(--affine-text-primary-color)',
fontSize: 'var(--affine-font-sm)',
fontWeight: 500,
textDecoration: 'none',
padding: '12px 20px',
maxWidth: '100%',
position: 'relative',
borderRadius: '0',
transition: 'background 0.3s ease',
selectors: {
'&:after': {
position: 'absolute',
content: '""',
bottom: 0,
display: 'block',
width: 'calc(100% - 40px)',
height: '0.5px',
background: 'var(--affine-black-10)',
},
'&:not(:last-of-type)': {
marginBottom: '0',
},
},
});
@@ -0,0 +1 @@
export * from './layout';
@@ -0,0 +1,49 @@
import { Button } from '@affine/component/ui/button';
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { Logo1Icon } from '@blocksuite/icons';
import clsx from 'clsx';
import { useCallback } from 'react';
import { DesktopNavbar } from './desktop-navbar';
import * as styles from './index.css';
import { MobileNavbar } from './mobile-navbar';
export const AffineOtherPageLayout = ({
isSmallScreen,
children,
}: {
isSmallScreen: boolean;
children: React.ReactNode;
}) => {
const t = useAFFiNEI18N();
const openDownloadLink = useCallback(() => {
open(runtimeConfig.downloadUrl, '_blank');
}, []);
return (
<div className={styles.root}>
<div
className={clsx(styles.topNav, {
mobile: isSmallScreen,
})}
>
<a href="/" rel="noreferrer" className={styles.affineLogo}>
<Logo1Icon width={24} height={24} />
</a>
{isSmallScreen ? (
<MobileNavbar />
) : (
<>
<DesktopNavbar />
<Button onClick={openDownloadLink}>
{t['com.affine.auth.open.affine.download-app']()}
</Button>
</>
)}
</div>
{children}
</div>
);
};
@@ -0,0 +1,50 @@
import { IconButton } from '@affine/component/ui/button';
import { Menu, MenuItem } from '@affine/component/ui/menu';
import { CloseIcon, PropertyIcon } from '@blocksuite/icons';
import { useState } from 'react';
import * as styles from './index.css';
import { useNavConfig } from './use-nav-config';
export const MobileNavbar = () => {
const [openMenu, setOpenMenu] = useState(false);
const navConfig = useNavConfig();
const menuItems = (
<>
{navConfig.map(item => {
return (
<MenuItem
key={item.title}
onClick={() => {
open(item.path, '_blank');
}}
className={styles.menuItem}
>
{item.title}
</MenuItem>
);
})}
</>
);
return (
<div>
<Menu
items={menuItems}
contentOptions={{
className: styles.menu,
sideOffset: 20,
}}
rootOptions={{
open: openMenu,
onOpenChange: setOpenMenu,
}}
>
<IconButton type="plain" className={styles.iconButton}>
{openMenu ? <CloseIcon /> : <PropertyIcon />}
</IconButton>
</Menu>
</div>
);
};
@@ -0,0 +1,27 @@
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { useMemo } from 'react';
export const useNavConfig = () => {
const t = useAFFiNEI18N();
return useMemo(
() => [
{
title: t['com.affine.other-page.nav.official-website'](),
path: 'https://affine.pro',
},
{
title: t['com.affine.other-page.nav.affine-community'](),
path: 'https://community.affine.pro/home',
},
{
title: t['com.affine.other-page.nav.blog'](),
path: 'https://affine.pro/blog',
},
{
title: t['com.affine.other-page.nav.contact-us'](),
path: 'https://affine.pro/about-us',
},
],
[t]
);
};