refactor(web): sidebar

pull/13/head
moonrailgun 4 years ago
parent 127b13d0c9
commit 402ddb9a68

@ -10,7 +10,7 @@ const NavbarNavItem: React.FC<{
return ( return (
<div <div
className={clsx( className={clsx(
'w-10 h-10 hover:rounded-lg bg-gray-300 transition-all rounded-1/2 cursor-pointer flex items-center justify-center overflow-hidden', 'w-12 h-12 hover:rounded-lg bg-gray-300 transition-all rounded-1/2 cursor-pointer flex items-center justify-center overflow-hidden',
props.className props.className
)} )}
> >
@ -27,13 +27,13 @@ export const Navbar: React.FC = React.memo(() => {
const userInfo = useAppSelector((state) => state.user.info); const userInfo = useAppSelector((state) => state.user.info);
return ( return (
<div className="w-16 bg-gray-900 flex flex-col justify-start items-center pt-4 pb-4 p-1"> <div className="w-18 bg-gray-900 flex flex-col justify-start items-center pt-4 pb-4 p-1">
{/* Navbar */} {/* Navbar */}
<div className="flex-1"> <div className="flex-1">
<NavbarNavItem> <NavbarNavItem>
<Avatar <Avatar
shape="square" shape="square"
size="large" size={48}
name={userInfo?.nickname} name={userInfo?.nickname}
src={userInfo?.avatar} src={userInfo?.avatar}
/> />

@ -0,0 +1,87 @@
import React from 'react';
import clsx, { ClassValue } from 'clsx';
import { Icon } from '@iconify/react';
import { Avatar } from '../../components/Avatar';
const SidebarItem: React.FC<{
className?: ClassValue;
icon?: React.ReactNode;
action?: React.ReactNode;
}> = React.memo((props) => {
return (
<div
className={clsx(
'w-full hover:bg-white hover:bg-opacity-20 cursor-pointer text-white rounded px-2 h-11 flex items-center text-base group',
props.className
)}
>
<div className="flex h-8 items-center justify-center text-2xl w-8 mr-3">
{props.icon}
</div>
<div className="flex-1">{props.children}</div>
<div className="text-base p-1 cursor-pointer hidden opacity-70 group-hover:block hover:opacity-100">
{props.action}
</div>
</div>
);
});
SidebarItem.displayName = 'SidebarItem';
const SidebarSection: React.FC<{
action: React.ReactNode;
}> = React.memo((props) => {
return (
<div className="h-10 text-white flex pt-4 px-2">
<span className="flex-1 overflow-hidden overflow-ellipsis text-xs text-gray-300">
{props.children}
</span>
<div className="text-base opacity-70 hover:opacity-100 cursor-pointer">
{props.action}
</div>
</div>
);
});
SidebarSection.displayName = 'SidebarSection';
/**
*
*/
export const Sidebar: React.FC = React.memo(() => {
return (
<div className="w-60 bg-gray-800 p-2">
{/* Sidebar */}
<SidebarItem icon={<Icon icon="mdi-account-multiple" />}>
</SidebarItem>
<SidebarItem icon={<Icon icon="mdi-puzzle" />}></SidebarItem>
<SidebarSection action={<Icon icon="mdi-plus" />}></SidebarSection>
<SidebarItem
icon={<Avatar name="用户" />}
action={<Icon icon="mdi-close" />}
>
1
</SidebarItem>
<SidebarItem
icon={<Avatar name="用户" />}
action={<Icon icon="mdi-close" />}
>
1
</SidebarItem>
<SidebarItem
icon={<Avatar name="用户" />}
action={<Icon icon="mdi-close" />}
>
1
</SidebarItem>
<SidebarItem
icon={<Avatar name="用户" />}
action={<Icon icon="mdi-close" />}
>
1
</SidebarItem>
</div>
);
});
Sidebar.displayName = 'Sidebar';

@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import { Navbar } from './Navbar'; import { Navbar } from './Navbar';
import { MainProvider } from './Provider'; import { MainProvider } from './Provider';
import { Sidebar } from './Sidebar';
export const MainRoute: React.FC = React.memo(() => { export const MainRoute: React.FC = React.memo(() => {
return ( return (
@ -8,12 +9,8 @@ export const MainRoute: React.FC = React.memo(() => {
<MainProvider> <MainProvider>
<Navbar /> <Navbar />
<div className="w-56 bg-gray-800 p-2"> <Sidebar />
{/* Sidebar */}
<div className="w-full hover:bg-white hover:bg-opacity-20 cursor-pointer text-white rounded p-2">
</div>
</div>
<div className="flex-auto bg-gray-700">{/* Main Content */}</div> <div className="flex-auto bg-gray-700">{/* Main Content */}</div>
</MainProvider> </MainProvider>
</div> </div>

@ -9,22 +9,24 @@ module.exports = {
darkMode: 'class', // or 'media' darkMode: 'class', // or 'media'
theme: { theme: {
screens: { screens: {
'lg': {'min': '1024px'}, lg: { min: '1024px' },
'md': {'max': '767px'}, md: { max: '767px' },
'sm': {'max': '639px'}, sm: { max: '639px' },
}, },
extend: { extend: {
borderRadius: { borderRadius: {
"1/2": '50%' '1/2': '50%',
}, },
spacing: { spacing: {
"142": "35.5rem" 18: '4.5rem',
} 142: '35.5rem',
},
}, },
}, },
variants: { variants: {
extend: { extend: {
opacity: ['disabled'], opacity: ['disabled'],
display: ['group-hover'],
borderRadius: ['hover'], borderRadius: ['hover'],
}, },
}, },

Loading…
Cancel
Save