diff --git a/packages/app/src/components/Header/icons.tsx b/packages/app/src/components/Header/icons.tsx index 6f9d5ebee..57a4134d6 100644 --- a/packages/app/src/components/Header/icons.tsx +++ b/packages/app/src/components/Header/icons.tsx @@ -2,6 +2,69 @@ import type { DOMAttributes, CSSProperties } from 'react'; type IconProps = { style?: CSSProperties; } & DOMAttributes; + +export const RightArrow = ({ style = {}, ...props }: IconProps) => { + return ( + + + + ); +}; +export const Export2Markdown = ({ style = {}, ...props }: IconProps) => { + return ( + + + + + ); +}; +export const Export2HTML = ({ style = {}, ...props }: IconProps) => { + return ( + + + + + + + + ); +}; export const LogoIcon = ({ style = {}, ...props }: IconProps) => { return ( { const { editor, mode, setMode } = useEditor(); return ( <> - { setMode(mode === 'page' ? 'edgeless' : 'page'); }} > - {mode === 'page' ? : } - Convert to {mode === 'page' ? 'Edgeless' : 'Page'} - - { - editor && editor.contentParser.onExportHtml(); - }} + + {mode === 'page' ? : } + Convert to {mode === 'page' ? 'Edgeless' : 'Page'} + + + + { + editor && editor.contentParser.onExportHtml(); + }} + > + + + Export to HTML + + + { + editor && editor.contentParser.onExportMarkdown(); + }} + > + + + Export to Markdown + + + + } > - - Export to HTML - - { - editor && editor.contentParser.onExportMarkdown(); - }} - > - - Export to Markdown - + + + + Export + + + + ); }; @@ -115,14 +144,11 @@ export const Header = () => { - } - style={{ marginLeft: '20px' }} - > + } placement="bottom-end"> - + diff --git a/packages/app/src/components/Header/styles.ts b/packages/app/src/components/Header/styles.ts index afb25abfd..3e3978ca3 100644 --- a/packages/app/src/components/Header/styles.ts +++ b/packages/app/src/components/Header/styles.ts @@ -1,4 +1,5 @@ -import { absoluteCenter, displayFlex, styled } from '@/styles'; +import { displayFlex, styled } from '@/styles'; +import { MenuItem } from '@/ui/menu'; export const StyledHeaderContainer = styled.div<{ hasWarning: boolean }>( ({ hasWarning }) => { @@ -20,7 +21,7 @@ export const StyledHeader = styled.div<{ hasWarning: boolean }>( left: '0', top: hasWarning ? '36px' : '0', padding: '0 22px', - zIndex: theme.zIndex.modal, + zIndex: 99, }; } ); @@ -61,23 +62,23 @@ export const StyledHeaderRightSide = styled('div')({ alignItems: 'center', }); -export const StyledMoreMenuItem = styled('div')(({ theme }) => { +export const StyledMenuItemWrapper = styled.div(({ theme }) => { return { height: '32px', - display: 'flex', - alignItems: 'center', - borderRadius: '5px', - fontSize: '14px', - color: theme.colors.popoverColor, - padding: '0 14px', + position: 'relative', + cursor: 'pointer', + ...displayFlex('flex-start', 'center'), svg: { width: '16px', height: '16px', marginRight: '14px', }, - ':hover': { - color: theme.colors.primaryColor, - background: theme.colors.hoverBackground, + 'svg:nth-child(2)': { + position: 'absolute', + right: 0, + top: 0, + bottom: 0, + margin: 'auto', }, }; }); diff --git a/packages/app/src/ui/menu/index.ts b/packages/app/src/ui/menu/index.ts new file mode 100644 index 000000000..8dde85f11 --- /dev/null +++ b/packages/app/src/ui/menu/index.ts @@ -0,0 +1,2 @@ +export * from './menu'; +export { StyledMenuItem as MenuItem } from './styles'; diff --git a/packages/app/src/ui/menu/menu.tsx b/packages/app/src/ui/menu/menu.tsx new file mode 100644 index 000000000..13d7b178e --- /dev/null +++ b/packages/app/src/ui/menu/menu.tsx @@ -0,0 +1,20 @@ +import { Popper, type PopperProps } from '../popper'; +import { TooltipProps } from '@mui/material'; +import { StyledMenuWrapper } from '@/ui/menu/styles'; + +export const Menu = (props: PopperProps & Omit) => { + const { content, placement = 'bottom-start', children } = props; + return content ? ( + {content} + } + > + {children} + + ) : null; +}; + +export default Menu; diff --git a/packages/app/src/ui/menu/styles.ts b/packages/app/src/ui/menu/styles.ts new file mode 100644 index 000000000..1b426217d --- /dev/null +++ b/packages/app/src/ui/menu/styles.ts @@ -0,0 +1,34 @@ +import { styled } from '@/styles'; +import StyledPopperContainer from '../shared/Container'; + +export const StyledMenuWrapper = styled(StyledPopperContainer)(({ theme }) => { + return { + background: theme.colors.popoverBackground, + padding: '8px 4px', + fontSize: '14px', + backgroundColor: theme.colors.popoverBackground, + boxShadow: theme.shadow.popover, + color: theme.colors.popoverColor, + }; +}); + +export const StyledMenuItem = styled('div')<{ popperVisible?: boolean }>( + ({ theme, popperVisible }) => { + return { + borderRadius: '5px', + padding: '0 14px', + + color: popperVisible + ? theme.colors.primaryColor + : theme.colors.popoverColor, + backgroundColor: popperVisible + ? theme.colors.hoverBackground + : 'transparent', + + ':hover': { + color: theme.colors.primaryColor, + backgroundColor: theme.colors.hoverBackground, + }, + }; + } +);