feat: reset modal
This commit is contained in:
@@ -158,6 +158,9 @@ a,
|
|||||||
a:hover {
|
a:hover {
|
||||||
color: var(--affine-link-color);
|
color: var(--affine-link-color);
|
||||||
}
|
}
|
||||||
|
a:visited {
|
||||||
|
color: var(--affine-link-visited-color);
|
||||||
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
border: none;
|
border: none;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ 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';
|
import { EdgelessIcon, PaperIcon } from '../editor-mode-switch/icons';
|
||||||
import ThemeModeSwitch from '@/components/theme-mode-switch';
|
import ThemeModeSwitch from '@/components/theme-mode-switch';
|
||||||
import ContactModal from '@/components/contact-modal';
|
import { useModal } from '@/components/global-modal-provider';
|
||||||
|
|
||||||
const PopoverContent = () => {
|
const PopoverContent = () => {
|
||||||
const { editor, mode, setMode } = useEditor();
|
const { editor, mode, setMode } = useEditor();
|
||||||
@@ -51,8 +51,7 @@ const PopoverContent = () => {
|
|||||||
export const Header = () => {
|
export const Header = () => {
|
||||||
const [title, setTitle] = useState('');
|
const [title, setTitle] = useState('');
|
||||||
const [isHover, setIsHover] = useState(false);
|
const [isHover, setIsHover] = useState(false);
|
||||||
const [showContactModal, setShowContactModal] = useState(false);
|
const { contactModalHandler } = useModal();
|
||||||
|
|
||||||
const { editor } = useEditor();
|
const { editor } = useEditor();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -66,15 +65,11 @@ export const Header = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ContactModal
|
|
||||||
open={showContactModal}
|
|
||||||
onClose={() => setShowContactModal(false)}
|
|
||||||
/>
|
|
||||||
<StyledHeader>
|
<StyledHeader>
|
||||||
<StyledLogo>
|
<StyledLogo>
|
||||||
<LogoIcon
|
<LogoIcon
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setShowContactModal(true);
|
contactModalHandler(true);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</StyledLogo>
|
</StyledLogo>
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ export const ContactModal = ({ open, onClose }: TransitionsModalProps) => {
|
|||||||
<StyledModalHeader>
|
<StyledModalHeader>
|
||||||
<StyledModalHeaderLeft>
|
<StyledModalHeaderLeft>
|
||||||
<StyledLogo src={logo.src} alt="" />
|
<StyledLogo src={logo.src} alt="" />
|
||||||
<span>2.0</span>
|
<span>Alpha</span>
|
||||||
<span>live demo</span>
|
<span>live demo</span>
|
||||||
</StyledModalHeaderLeft>
|
</StyledModalHeaderLeft>
|
||||||
<CloseButton
|
<CloseButton
|
||||||
|
|||||||
@@ -8,51 +8,17 @@ import {
|
|||||||
import { CloseIcon, ContactIcon, HelpIcon, KeyboardIcon } from './icons';
|
import { CloseIcon, ContactIcon, HelpIcon, KeyboardIcon } from './icons';
|
||||||
import Grow from '@mui/material/Grow';
|
import Grow from '@mui/material/Grow';
|
||||||
import { Tooltip } from '../tooltip';
|
import { Tooltip } from '../tooltip';
|
||||||
import ContactModal from '@/components/contact-modal';
|
import { useEditor } from '@/components/editor-provider';
|
||||||
import ShortcutsModal from '@/components/shortcuts-modal';
|
import { useModal } from '@/components/global-modal-provider';
|
||||||
const Contact = () => {
|
import { useTheme } from '@/styles';
|
||||||
const [openModal, setOpenModal] = useState(false);
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<ContactModal open={openModal} onClose={() => setOpenModal(false)} />
|
|
||||||
<Tooltip content="Contact with us" placement="left-end">
|
|
||||||
<StyledIconWrapper
|
|
||||||
onClick={() => {
|
|
||||||
setOpenModal(true);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<ContactIcon />
|
|
||||||
</StyledIconWrapper>
|
|
||||||
</Tooltip>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const Shortcuts = () => {
|
|
||||||
const [openModal, setOpenModal] = useState(false);
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<ShortcutsModal
|
|
||||||
open={openModal}
|
|
||||||
onClose={() => {
|
|
||||||
setOpenModal(false);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Tooltip content="Keyboard shorts" placement="left-end">
|
|
||||||
<StyledIconWrapper
|
|
||||||
onClick={() => {
|
|
||||||
setOpenModal(true);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<KeyboardIcon />
|
|
||||||
</StyledIconWrapper>
|
|
||||||
</Tooltip>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
export const FAQ = () => {
|
export const FAQ = () => {
|
||||||
const [showContent, setShowContent] = useState(false);
|
const [showContent, setShowContent] = useState(false);
|
||||||
|
const { mode } = useTheme();
|
||||||
|
const { mode: editorMode } = useEditor();
|
||||||
|
const { shortcutsModalHandler, contactModalHandler } = useModal();
|
||||||
|
const isEdgelessDark = mode === 'dark' && editorMode === 'edgeless';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<StyledFAQ
|
<StyledFAQ
|
||||||
@@ -66,13 +32,31 @@ export const FAQ = () => {
|
|||||||
>
|
>
|
||||||
<Grow in={showContent}>
|
<Grow in={showContent}>
|
||||||
<StyledFAQWrapper>
|
<StyledFAQWrapper>
|
||||||
<Contact />
|
<Tooltip content="Contact with us" placement="left-end">
|
||||||
<Shortcuts />
|
<StyledIconWrapper
|
||||||
|
isEdgelessDark={isEdgelessDark}
|
||||||
|
onClick={() => {
|
||||||
|
contactModalHandler(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ContactIcon />
|
||||||
|
</StyledIconWrapper>
|
||||||
|
</Tooltip>
|
||||||
|
<Tooltip content="Keyboard shorts" placement="left-end">
|
||||||
|
<StyledIconWrapper
|
||||||
|
isEdgelessDark={isEdgelessDark}
|
||||||
|
onClick={() => {
|
||||||
|
shortcutsModalHandler(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<KeyboardIcon />
|
||||||
|
</StyledIconWrapper>
|
||||||
|
</Tooltip>
|
||||||
</StyledFAQWrapper>
|
</StyledFAQWrapper>
|
||||||
</Grow>
|
</Grow>
|
||||||
|
|
||||||
<div style={{ position: 'relative' }}>
|
<div style={{ position: 'relative' }}>
|
||||||
<StyledIconWrapper>
|
<StyledIconWrapper isEdgelessDark={isEdgelessDark}>
|
||||||
<HelpIcon />
|
<HelpIcon />
|
||||||
</StyledIconWrapper>
|
</StyledIconWrapper>
|
||||||
<StyledTransformIcon in={showContent}>
|
<StyledTransformIcon in={showContent}>
|
||||||
|
|||||||
@@ -10,10 +10,6 @@ export const StyledFAQ = styled('div')(({ theme }) => {
|
|||||||
bottom: '30px',
|
bottom: '30px',
|
||||||
borderRadius: '50%',
|
borderRadius: '50%',
|
||||||
zIndex: theme.zIndex.popover,
|
zIndex: theme.zIndex.popover,
|
||||||
':hover': {
|
|
||||||
backgroundColor: theme.colors.popoverBackground,
|
|
||||||
color: theme.colors.primaryColor,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
export const StyledTransformIcon = styled.div<{ in: boolean }>(
|
export const StyledTransformIcon = styled.div<{ in: boolean }>(
|
||||||
@@ -36,26 +32,34 @@ export const StyledTransformIcon = styled.div<{ in: boolean }>(
|
|||||||
: theme.colors.pageBackground,
|
: theme.colors.pageBackground,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
export const StyledIconWrapper = styled('div')(({ theme }) => {
|
export const StyledIconWrapper = styled('div')<{ isEdgelessDark: boolean }>(
|
||||||
|
({ theme, isEdgelessDark }) => {
|
||||||
return {
|
return {
|
||||||
color: theme.colors.iconColor,
|
color: isEdgelessDark
|
||||||
|
? theme.colors.popoverBackground
|
||||||
|
: theme.colors.iconColor,
|
||||||
marginBottom: '24px',
|
marginBottom: '24px',
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
cursor: 'pointer',
|
cursor: 'pointer',
|
||||||
backgroundColor: theme.colors.pageBackground,
|
backgroundColor: isEdgelessDark
|
||||||
|
? 'transparent'
|
||||||
|
: theme.colors.pageBackground,
|
||||||
borderRadius: '50%',
|
borderRadius: '50%',
|
||||||
width: '32px',
|
width: '32px',
|
||||||
height: '32px',
|
height: '32px',
|
||||||
transition: 'background-color 0.3s',
|
transition: 'background-color 0.3s',
|
||||||
position: 'relative',
|
position: 'relative',
|
||||||
':hover': {
|
':hover': {
|
||||||
color: theme.colors.primaryColor,
|
color: isEdgelessDark
|
||||||
|
? theme.colors.iconColor
|
||||||
|
: theme.colors.primaryColor,
|
||||||
backgroundColor: theme.colors.hoverBackground,
|
backgroundColor: theme.colors.hoverBackground,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
export const StyledFAQWrapper = styled('div')(({ theme }) => {
|
export const StyledFAQWrapper = styled('div')(({ theme }) => {
|
||||||
return {
|
return {
|
||||||
|
|||||||
53
packages/app/src/components/global-modal-provider.tsx
Normal file
53
packages/app/src/components/global-modal-provider.tsx
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
import { createContext, useContext, useState } from 'react';
|
||||||
|
import type { PropsWithChildren } from 'react';
|
||||||
|
import ShortcutsModal from './shortcuts-modal';
|
||||||
|
import ContactModal from '@/components/contact-modal';
|
||||||
|
|
||||||
|
type ModalContextValue = {
|
||||||
|
shortcutsModalHandler: (visible: boolean) => void;
|
||||||
|
contactModalHandler: (visible: boolean) => void;
|
||||||
|
};
|
||||||
|
type ModalContextProps = PropsWithChildren<{}>;
|
||||||
|
|
||||||
|
export const ModalContext = createContext<ModalContextValue>({
|
||||||
|
shortcutsModalHandler: () => {},
|
||||||
|
contactModalHandler: () => {},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useModal = () => useContext(ModalContext);
|
||||||
|
|
||||||
|
export const ModalProvider = ({
|
||||||
|
children,
|
||||||
|
}: PropsWithChildren<ModalContextProps>) => {
|
||||||
|
const [openContactModal, setOpenContactModal] = useState(false);
|
||||||
|
const [openShortcutsModal, setOpenShortcutsModal] = useState(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalContext.Provider
|
||||||
|
value={{
|
||||||
|
shortcutsModalHandler: visible => {
|
||||||
|
setOpenShortcutsModal(visible);
|
||||||
|
},
|
||||||
|
contactModalHandler: visible => {
|
||||||
|
setOpenContactModal(visible);
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ContactModal
|
||||||
|
open={openContactModal}
|
||||||
|
onClose={() => {
|
||||||
|
setOpenContactModal(false);
|
||||||
|
}}
|
||||||
|
></ContactModal>
|
||||||
|
<ShortcutsModal
|
||||||
|
open={openShortcutsModal}
|
||||||
|
onClose={() => {
|
||||||
|
setOpenShortcutsModal(false);
|
||||||
|
}}
|
||||||
|
></ShortcutsModal>
|
||||||
|
{children}
|
||||||
|
</ModalContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ModalProvider;
|
||||||
@@ -50,7 +50,9 @@ export const ShortcutsModal = ({ open, onClose }: ModalProps) => {
|
|||||||
<CloseIcon />
|
<CloseIcon />
|
||||||
</CloseButton>
|
</CloseButton>
|
||||||
</StyledModalHeader>
|
</StyledModalHeader>
|
||||||
<StyledSubTitle>Keyboard shortcuts</StyledSubTitle>
|
<StyledSubTitle style={{ marginTop: 0 }}>
|
||||||
|
Keyboard shortcuts
|
||||||
|
</StyledSubTitle>
|
||||||
{Object.entries(keyboardShortcuts).map(([title, shortcuts]) => {
|
{Object.entries(keyboardShortcuts).map(([title, shortcuts]) => {
|
||||||
return (
|
return (
|
||||||
<StyledListItem key={title}>
|
<StyledListItem key={title}>
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ export const StyledSubTitle = styled.div(({ theme }) => ({
|
|||||||
fontSize: '12px',
|
fontSize: '12px',
|
||||||
height: '36px',
|
height: '36px',
|
||||||
lineHeight: '36px',
|
lineHeight: '36px',
|
||||||
|
marginTop: '28px',
|
||||||
}));
|
}));
|
||||||
export const StyledModalHeader = styled.div(({ theme }) => ({
|
export const StyledModalHeader = styled.div(({ theme }) => ({
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
|
|||||||
@@ -26,11 +26,14 @@ export const placementToContainerDirection: Record<
|
|||||||
};
|
};
|
||||||
|
|
||||||
const useTooltipStyle = (): CSSProperties => {
|
const useTooltipStyle = (): CSSProperties => {
|
||||||
const { theme } = useTheme();
|
const { theme, mode } = useTheme();
|
||||||
return {
|
return {
|
||||||
boxShadow: '1px 1px 4px rgba(0, 0, 0, 0.14)',
|
boxShadow: '1px 1px 4px rgba(0, 0, 0, 0.14)',
|
||||||
padding: '4px 12px',
|
padding: '4px 12px',
|
||||||
backgroundColor: theme.colors.primaryColor,
|
backgroundColor:
|
||||||
|
mode === 'dark'
|
||||||
|
? theme.colors.popoverBackground
|
||||||
|
: theme.colors.primaryColor,
|
||||||
color: '#fff',
|
color: '#fff',
|
||||||
fontSize: theme.font.xs,
|
fontSize: theme.font.xs,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import '../../public/globals.css';
|
|||||||
import '../../public/variable.css';
|
import '../../public/variable.css';
|
||||||
import './temporary.css';
|
import './temporary.css';
|
||||||
import { EditorProvider } from '@/components/editor-provider';
|
import { EditorProvider } from '@/components/editor-provider';
|
||||||
|
import { ModalProvider } from '@/components/global-modal-provider';
|
||||||
|
|
||||||
const ThemeProvider = dynamic(() => import('@/styles/themeProvider'), {
|
const ThemeProvider = dynamic(() => import('@/styles/themeProvider'), {
|
||||||
ssr: false,
|
ssr: false,
|
||||||
@@ -12,9 +13,11 @@ const ThemeProvider = dynamic(() => import('@/styles/themeProvider'), {
|
|||||||
function MyApp({ Component, pageProps }: AppProps) {
|
function MyApp({ Component, pageProps }: AppProps) {
|
||||||
return (
|
return (
|
||||||
<ThemeProvider>
|
<ThemeProvider>
|
||||||
|
<ModalProvider>
|
||||||
<EditorProvider>
|
<EditorProvider>
|
||||||
<Component {...pageProps} />
|
<Component {...pageProps} />
|
||||||
</EditorProvider>
|
</EditorProvider>
|
||||||
|
</ModalProvider>
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,12 @@ export default class AppDocument extends Document {
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<Html>
|
<Html>
|
||||||
<Head />
|
<Head>
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
|
||||||
|
/>
|
||||||
|
</Head>
|
||||||
<body>
|
<body>
|
||||||
<Main />
|
<Main />
|
||||||
<NextScript />
|
<NextScript />
|
||||||
|
|||||||
@@ -34,30 +34,6 @@ const Home: NextPage = () => {
|
|||||||
<StyledEditorContainer>
|
<StyledEditorContainer>
|
||||||
<DynamicEditor />
|
<DynamicEditor />
|
||||||
</StyledEditorContainer>
|
</StyledEditorContainer>
|
||||||
{/*<Button>A button use the theme styles</Button>*/}
|
|
||||||
{/*<simple-counter name="A counter created by web component" />*/}
|
|
||||||
{/*<p>current mode {mode}</p>*/}
|
|
||||||
{/*<button*/}
|
|
||||||
{/* onClick={() => {*/}
|
|
||||||
{/* changeMode('light');*/}
|
|
||||||
{/* }}*/}
|
|
||||||
{/*>*/}
|
|
||||||
{/* light*/}
|
|
||||||
{/*</button>*/}
|
|
||||||
{/*<button*/}
|
|
||||||
{/* onClick={() => {*/}
|
|
||||||
{/* changeMode('dark');*/}
|
|
||||||
{/* }}*/}
|
|
||||||
{/*>*/}
|
|
||||||
{/* dark*/}
|
|
||||||
{/*</button>*/}
|
|
||||||
{/*<button*/}
|
|
||||||
{/* onClick={() => {*/}
|
|
||||||
{/* changeMode('auto');*/}
|
|
||||||
{/* }}*/}
|
|
||||||
{/*>*/}
|
|
||||||
{/* auto*/}
|
|
||||||
{/*</button>*/}
|
|
||||||
<FAQ />
|
<FAQ />
|
||||||
</StyledPage>
|
</StyledPage>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,44 +1,7 @@
|
|||||||
debug-menu {
|
debug-menu {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
/*.affine-editor-container {*/
|
.affine-block-children-container.edgeless {
|
||||||
/* height: 100%;*/
|
background-color: #fff;
|
||||||
/* padding: 0 !important;*/
|
}
|
||||||
/*}*/
|
|
||||||
/*.affine-default-page-block-container {*/
|
|
||||||
/* width: 720px;*/
|
|
||||||
/* height: 100%;*/
|
|
||||||
/* margin: 0 auto;*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
/*u {*/
|
|
||||||
/* text-decoration: none;*/
|
|
||||||
/* border-bottom: 1px solid #4c6275 !important;*/
|
|
||||||
/*}*/
|
|
||||||
/*u::after {*/
|
|
||||||
/* display: none;*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
/*.affine-paragraph-block-container.text {*/
|
|
||||||
/* margin-top: 18px !important;*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
/*.affine-default-page-block-title {*/
|
|
||||||
/* width: 100%;*/
|
|
||||||
/*}*/
|
|
||||||
/*s {*/
|
|
||||||
/* text-decoration: line-through !important;*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
/*.affine-edgeless-page-block-container {*/
|
|
||||||
/* height: 100% !important;*/
|
|
||||||
/*}*/
|
|
||||||
/*.affine-block-children-container.edgeless {*/
|
|
||||||
/* height: 100% !important;*/
|
|
||||||
/*}*/
|
|
||||||
/*.affine-list-rich-text-wrapper > div {*/
|
|
||||||
/* box-sizing: content-box;*/
|
|
||||||
/* color: var(--affine-highlight-color);*/
|
|
||||||
/* min-width: unset !important;*/
|
|
||||||
/* max-width: 26px;*/
|
|
||||||
/*}*/
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export const lightTheme: AffineTheme = {
|
|||||||
sm: '16px',
|
sm: '16px',
|
||||||
base: '18px',
|
base: '18px',
|
||||||
family: `Avenir Next, ${basicFontFamily}`,
|
family: `Avenir Next, ${basicFontFamily}`,
|
||||||
family2: `Roboto Mono, ${basicFontFamily}`,
|
family2: `Roboto, ${basicFontFamily}`,
|
||||||
},
|
},
|
||||||
zIndex: {
|
zIndex: {
|
||||||
modal: 1000,
|
modal: 1000,
|
||||||
@@ -55,8 +55,8 @@ export const darkTheme: AffineTheme = {
|
|||||||
|
|
||||||
textColor: '#fff',
|
textColor: '#fff',
|
||||||
iconColor: '#9096A5',
|
iconColor: '#9096A5',
|
||||||
linkColor: '#6880FF',
|
linkColor: '#7D91FF',
|
||||||
linkColor2: '#7D91FF',
|
linkColor2: '#6880FF',
|
||||||
linkVisitedColor: '#505FAB',
|
linkVisitedColor: '#505FAB',
|
||||||
popoverColor: '#A9B1C6',
|
popoverColor: '#A9B1C6',
|
||||||
codeColor: '#BDDBFD',
|
codeColor: '#BDDBFD',
|
||||||
|
|||||||
Reference in New Issue
Block a user