mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-25 18:26:05 +08:00
feat: modify style
This commit is contained in:
@@ -13,6 +13,7 @@ import { Popover } from '@/components/popover';
|
|||||||
import { useTheme } from '@/styles';
|
import { useTheme } from '@/styles';
|
||||||
import { useEditor } from '@/components/editor-provider';
|
import { useEditor } from '@/components/editor-provider';
|
||||||
import EditorModeSwitch from '@/components/editor-mode-switch';
|
import EditorModeSwitch from '@/components/editor-mode-switch';
|
||||||
|
import { EdgelessIcon, PaperIcon } from '../editor-mode-switch/icons';
|
||||||
|
|
||||||
const DarkModeSwitch = () => {
|
const DarkModeSwitch = () => {
|
||||||
const { changeMode, mode } = useTheme();
|
const { changeMode, mode } = useTheme();
|
||||||
@@ -39,9 +40,17 @@ const DarkModeSwitch = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const PopoverContent = () => {
|
const PopoverContent = () => {
|
||||||
const { editor } = useEditor();
|
const { editor, mode, setMode } = useEditor();
|
||||||
return (
|
return (
|
||||||
<div>
|
<>
|
||||||
|
<StyledMoreMenuItem
|
||||||
|
onClick={() => {
|
||||||
|
setMode(mode === 'page' ? 'edgeless' : 'page');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{mode === 'page' ? <EdgelessIcon /> : <PaperIcon />}
|
||||||
|
Convert to {mode === 'page' ? 'edgeless' : 'page'}
|
||||||
|
</StyledMoreMenuItem>
|
||||||
<StyledMoreMenuItem
|
<StyledMoreMenuItem
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
editor && editor.contentParser.onExportHtml();
|
editor && editor.contentParser.onExportHtml();
|
||||||
@@ -58,7 +67,7 @@ const PopoverContent = () => {
|
|||||||
<ExportIcon />
|
<ExportIcon />
|
||||||
Export to markdown
|
Export to markdown
|
||||||
</StyledMoreMenuItem>
|
</StyledMoreMenuItem>
|
||||||
</div>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ export const StyledTitle = styled('div')({
|
|||||||
display: 'flex',
|
display: 'flex',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
fontWeight: '600',
|
|
||||||
fontSize: '20px',
|
fontSize: '20px',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import type { CSSProperties, PropsWithChildren } from 'react';
|
import type { CSSProperties, PropsWithChildren, ReactNode } from 'react';
|
||||||
|
import Grow from '@mui/material/Grow';
|
||||||
|
|
||||||
import { styled } from '@/styles';
|
import { styled } from '@/styles';
|
||||||
|
|
||||||
type PopoverProps = {
|
type PopoverProps = {
|
||||||
popoverContent?: React.ReactNode;
|
popoverContent?: ReactNode;
|
||||||
style?: CSSProperties;
|
style?: CSSProperties;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -17,8 +19,9 @@ const StyledPopoverWrapper = styled('div')({
|
|||||||
bottom: '0',
|
bottom: '0',
|
||||||
right: '0',
|
right: '0',
|
||||||
paddingTop: '46px',
|
paddingTop: '46px',
|
||||||
|
zIndex: 1000,
|
||||||
});
|
});
|
||||||
const StyledPopover = styled('div')<{ show: boolean }>(({ show }) => {
|
const StyledPopover = styled('div')(() => {
|
||||||
return {
|
return {
|
||||||
width: '248px',
|
width: '248px',
|
||||||
background: '#fff',
|
background: '#fff',
|
||||||
@@ -26,7 +29,6 @@ const StyledPopover = styled('div')<{ show: boolean }>(({ show }) => {
|
|||||||
'0px 1px 10px -6px rgba(24, 39, 75, 0.5), 0px 3px 16px -6px rgba(24, 39, 75, 0.04)',
|
'0px 1px 10px -6px rgba(24, 39, 75, 0.5), 0px 3px 16px -6px rgba(24, 39, 75, 0.04)',
|
||||||
borderRadius: '10px 0px 10px 10px',
|
borderRadius: '10px 0px 10px 10px',
|
||||||
padding: '8px 4px',
|
padding: '8px 4px',
|
||||||
display: show ? 'block' : 'none',
|
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
top: '46px',
|
top: '46px',
|
||||||
right: '0',
|
right: '0',
|
||||||
@@ -52,9 +54,11 @@ export const Popover = ({
|
|||||||
style={style}
|
style={style}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
<StyledPopoverWrapper>
|
<Grow in={show}>
|
||||||
<StyledPopover show={show}>{popoverContent}</StyledPopover>
|
<StyledPopoverWrapper>
|
||||||
</StyledPopoverWrapper>
|
<StyledPopover>{popoverContent}</StyledPopover>
|
||||||
|
</StyledPopoverWrapper>
|
||||||
|
</Grow>
|
||||||
</StyledPopoverContainer>
|
</StyledPopoverContainer>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,136 +1,5 @@
|
|||||||
import type { ReactNode } from 'react';
|
|
||||||
import { useRef, useState, useEffect } from 'react';
|
|
||||||
import { styled } from '@/styles';
|
|
||||||
import { PaperIcon, EdgelessIcon } from '@/components/Header/icons';
|
|
||||||
export const StyledHeader = styled('div')({
|
|
||||||
height: '60px',
|
|
||||||
width: '100vw',
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'space-between',
|
|
||||||
alignItems: 'center',
|
|
||||||
position: 'relative',
|
|
||||||
padding: '0 22px',
|
|
||||||
borderBottom: '1px solid #e5e5e5',
|
|
||||||
});
|
|
||||||
|
|
||||||
export const StyledAnimateRadio = styled('div')<{ shrink: boolean }>(
|
|
||||||
({ shrink }) => {
|
|
||||||
const shrinkStyle = shrink
|
|
||||||
? {
|
|
||||||
width: '66px',
|
|
||||||
background: 'transparent',
|
|
||||||
'::after': {
|
|
||||||
opacity: '0',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
: {};
|
|
||||||
return {
|
|
||||||
border: '1px solid #e5e5e5',
|
|
||||||
width: '132px',
|
|
||||||
height: '36px',
|
|
||||||
borderRadius: '18px',
|
|
||||||
background: '#F1F3FF',
|
|
||||||
position: 'relative',
|
|
||||||
display: 'flex',
|
|
||||||
transition: 'all .3s',
|
|
||||||
'::after': {
|
|
||||||
content: '""',
|
|
||||||
width: '1px',
|
|
||||||
height: '14px',
|
|
||||||
background: '#D0D7E3',
|
|
||||||
position: 'absolute',
|
|
||||||
left: '0',
|
|
||||||
right: '0',
|
|
||||||
top: '0',
|
|
||||||
bottom: '0',
|
|
||||||
margin: 'auto',
|
|
||||||
},
|
|
||||||
...shrinkStyle,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
export const StyledAnimateRadioItem = styled('div')<{
|
|
||||||
active: boolean;
|
|
||||||
shrink: boolean;
|
|
||||||
}>(({ shrink }) => {
|
|
||||||
const shrinkStyle = shrink
|
|
||||||
? {
|
|
||||||
width: '100%',
|
|
||||||
display: 'none',
|
|
||||||
}
|
|
||||||
: {};
|
|
||||||
return {
|
|
||||||
width: '66px',
|
|
||||||
height: '100%',
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'center',
|
|
||||||
alignItems: 'center',
|
|
||||||
...shrinkStyle,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
type AnimateRadioProps = {
|
|
||||||
labelLeft: ReactNode;
|
|
||||||
labelRight: ReactNode;
|
|
||||||
};
|
|
||||||
|
|
||||||
const AnimateRadio = ({ labelLeft, labelRight }: AnimateRadioProps) => {
|
|
||||||
const [active, setActive] = useState('left');
|
|
||||||
const [isHover, setIsHover] = useState(false);
|
|
||||||
const isAnimating = useRef(false);
|
|
||||||
const stretch = () => {
|
|
||||||
!isAnimating.current && setIsHover(true);
|
|
||||||
};
|
|
||||||
const shrink = () => {
|
|
||||||
!isAnimating.current && setIsHover(false);
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// isAnimating.current = true;
|
|
||||||
// setTimeout(() => {
|
|
||||||
// isAnimating.current = false;
|
|
||||||
// }, 500);
|
|
||||||
}, [isHover]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<StyledAnimateRadio
|
|
||||||
shrink={isHover}
|
|
||||||
onMouseEnter={() => {
|
|
||||||
stretch();
|
|
||||||
}}
|
|
||||||
onMouseLeave={() => {
|
|
||||||
shrink();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<StyledAnimateRadioItem
|
|
||||||
active={active === 'left'}
|
|
||||||
shrink={isHover && active === 'right'}
|
|
||||||
onClick={() => {
|
|
||||||
setActive('left');
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{labelLeft}
|
|
||||||
</StyledAnimateRadioItem>
|
|
||||||
<StyledAnimateRadioItem
|
|
||||||
active={active === 'right'}
|
|
||||||
shrink={isHover && active === 'left'}
|
|
||||||
onClick={() => {
|
|
||||||
setActive('right');
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{labelRight}
|
|
||||||
</StyledAnimateRadioItem>
|
|
||||||
</StyledAnimateRadio>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const Affine = () => {
|
const Affine = () => {
|
||||||
return (
|
return <div>affine page</div>;
|
||||||
<StyledHeader>
|
|
||||||
<AnimateRadio labelLeft={<PaperIcon />} labelRight={<EdgelessIcon />} />
|
|
||||||
</StyledHeader>
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Affine;
|
export default Affine;
|
||||||
|
|||||||
Reference in New Issue
Block a user