diff --git a/packages/mini-markdown-ast-parser/src/core/transform/render/link.ts b/packages/mini-markdown-ast-parser/src/core/transform/render/link.ts index 956165e0c6b03ae1835656958ca3531440618a8b..4a7eca627ea51d3a33745862e5e3826ad0b547cd 100644 --- a/packages/mini-markdown-ast-parser/src/core/transform/render/link.ts +++ b/packages/mini-markdown-ast-parser/src/core/transform/render/link.ts @@ -1,7 +1,7 @@ -import { Tokens } from '@/types/tokens' -import { astToHtml } from '..' -import { prefix } from '@/common/constant' +import { Tokens } from "@/types/tokens"; +import { astToHtml } from ".."; +import { prefix } from "@/common/constant"; export const renderLink = (node: Tokens) => { - return `${astToHtml(node.children![0])}` -} + return `${astToHtml(node.children![0])}`; +}; diff --git a/packages/mini-markdown-editor/src/EditorWrapper.tsx b/packages/mini-markdown-editor/src/EditorWrapper.tsx index 62e1d59c8b0914551861249bcdf1e7ba22574bac..d009c1c629a5d1a72a59468fc83de9b95fbdba79 100644 --- a/packages/mini-markdown-editor/src/EditorWrapper.tsx +++ b/packages/mini-markdown-editor/src/EditorWrapper.tsx @@ -1,4 +1,4 @@ -import { FC, useDeferredValue } from "react"; +import { FC, Fragment, useDeferredValue } from "react"; import styled from "styled-components"; import { useEditorContentStore } from "@/store/editor"; import Toolbar from "@/components/Toolbar"; @@ -42,7 +42,10 @@ const ContentWrapper = styled.div` `; const StyledRow = styled(Row)` + width: 100%; height: 100%; + display: flex; + justify-content: center; .ant-col { height: 100%; overflow-y: auto; @@ -62,12 +65,80 @@ const Divider = styled.div` height: 100%; width: 1px; position: absolute; - left: 50%; top: 50%; - transform: translate(-50%, -50%); z-index: 1; `; +// 布局配置映射 +const LayoutConfig = { + // 只写模式 + WRITE_ONLY: { cols: [18], components: ["editor"] }, + // 仅预览模式 + READ_ONLY: { cols: [18], components: ["preview"] }, + // 读写模式 + READ_WRITE: { cols: [12, 12], components: ["editor", "preview"] }, + // 只写+侧边栏 + WRITE_ONLY_SIDEBAR: { cols: [18, 6], components: ["editor", "sidebar"] }, + // 仅预览+侧边栏 + READ_ONLY_SIDEBAR: { cols: [18, 6], components: ["preview", "sidebar"] }, + // 读写+侧边栏 + READ_WRITE_SIDEBAR: { cols: [9, 9, 6], components: ["editor", "preview", "sidebar"] }, +}; + +// 渲染不同分区 +const RenderRow: FC<{ + editor: React.ReactNode; + preview: React.ReactNode; +}> = ({ editor, preview }) => { + const { isOnlyWrite, isOnlyPreview, isSidebar, sidebarComponent } = useToolbarStore(); + + // 根据状态确定布局配置 + const getLayoutConfig = () => { + // 处理只写模式 + if (isOnlyWrite && !isOnlyPreview) { + return isSidebar ? LayoutConfig.WRITE_ONLY_SIDEBAR : LayoutConfig.WRITE_ONLY; + } + // 处理只读模式 + if (!isOnlyWrite && isOnlyPreview) { + return isSidebar ? LayoutConfig.READ_ONLY_SIDEBAR : LayoutConfig.READ_ONLY; + } + // 处理读写模式(默认模式) + if (!isOnlyWrite && !isOnlyPreview) { + return isSidebar ? LayoutConfig.READ_WRITE_SIDEBAR : LayoutConfig.READ_WRITE; + } + // 处理异常情况(都为true的情况),默认返回只写模式 + return isSidebar ? LayoutConfig.WRITE_ONLY_SIDEBAR : LayoutConfig.WRITE_ONLY; + }; + + const layout = getLayoutConfig(); + const components = { + editor, + preview, + sidebar: sidebarComponent, + }; + // 两列以上时显示分割线 + const showDivider = layout.cols.length > 1; + + return ( + <> + {layout.cols.map((span, index) => { + const offset = + (layout.cols.slice(0, index + 1).reduce((acc, curr) => acc + curr, 0) / + layout.cols.reduce((acc, curr) => acc + curr, 0)) * + 100; + return ( + + {components[layout.components[index] as keyof typeof components]} + {showDivider && ( + + )} + + ); + })} + + ); +}; + const EditorWrapper: FC = (config) => { const content = useEditorContentStore((state) => state.content); const deferredContent = useDeferredValue(content); @@ -84,21 +155,8 @@ const EditorWrapper: FC = (config) => { {/* 内容区域 */} - - {/* 编辑区 */} - - - - {/* 渲染区 */} - - - - {/* 渲染区 */} - 123 - + } preview={} /> - {/* 分割线 */} - {/* 底部状态栏 */} diff --git a/packages/mini-markdown-editor/src/components/Toolbar/ShowLayout.tsx b/packages/mini-markdown-editor/src/components/Toolbar/ShowLayout.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e16bcddbf84c39cfe5c9c6ba6a2f7fb218b64dde --- /dev/null +++ b/packages/mini-markdown-editor/src/components/Toolbar/ShowLayout.tsx @@ -0,0 +1,40 @@ +import { FC } from "react"; +import styled from "styled-components"; +import IconTooltip from "../base/IconTooltip"; +import WriteIcon from "@/assets/images/write.svg?raw"; +import PreviewIcon from "@/assets/images/perview.svg?raw"; +import { useToolbarStore } from "@/store/toolbar"; + +const Wrapper = styled.div<{ $isSelect: boolean }>` + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + color: ${(props) => (props.$isSelect ? "#0366d6" : "")}; +`; + +export const Write: FC = () => { + const { isOnlyWrite, setIsOnlyWrite } = useToolbarStore(); + return ( + <> + setIsOnlyWrite()}> + + + + ); +}; + +export const Read: FC = () => { + const { isOnlyPreview, setIsOnlyPreview } = useToolbarStore(); + return ( + <> + setIsOnlyPreview()}> + + + + ); +}; diff --git a/packages/mini-markdown-editor/src/components/Toolbar/ToolbarItem.tsx b/packages/mini-markdown-editor/src/components/Toolbar/ToolbarItem.tsx index 59f4b93ab5fe8a6c6c23bee6463ee2472608be9e..b7736a1da56e39c5860a082a07ed5c75938aff1f 100644 --- a/packages/mini-markdown-editor/src/components/Toolbar/ToolbarItem.tsx +++ b/packages/mini-markdown-editor/src/components/Toolbar/ToolbarItem.tsx @@ -24,6 +24,7 @@ const ToolbarItemWrapper = styled.div` height: 16px; display: block; flex-shrink: 0; + user-select: none; } `; diff --git a/packages/mini-markdown-editor/src/config/toolbar/base.tsx b/packages/mini-markdown-editor/src/config/toolbar/base.tsx index faacec02f32699d4f2052739ad7dbd667bb9fa06..d02048b02ef93d1799379827c0705455b4d40f70 100644 --- a/packages/mini-markdown-editor/src/config/toolbar/base.tsx +++ b/packages/mini-markdown-editor/src/config/toolbar/base.tsx @@ -14,8 +14,6 @@ import ImageIcon from "@/assets/images/image.svg"; import TableIcon from "@/assets/images/table.svg"; import Undo from "@/assets/images/undo.svg"; import Redo from "@/assets/images/redo.svg"; -import WriteIcon from "@/assets/images/write.svg"; -import PreviewIcon from "@/assets/images/perview.svg"; import ContentsIcon from "@/assets/images/contents.svg"; import HelpIcon from "@/assets/images/help.svg"; import OutputPDFIcon from "@/assets/images/output-pdf.svg"; @@ -24,6 +22,7 @@ import { ToolbarItem } from "@/types/toolbar"; // 组件 import Upload from "@/components/Toolbar/Upload"; import FullScreen from "@/components/Toolbar/FullScreen"; +import { Read, Write } from "@/components/Toolbar/ShowLayout"; export const toolbar: ToolbarItem[] = [ { @@ -170,13 +169,11 @@ export const toolbar: ToolbarItem[] = [ }, { type: "write", - icon: WriteIcon, - title: "只写", + component: , }, { type: "preview", - icon: PreviewIcon, - title: "仅预览", + component: , }, { type: "contents", diff --git a/packages/mini-markdown-editor/src/store/toolbar.ts b/packages/mini-markdown-editor/src/store/toolbar.ts index 88be379a20af695fb2cee0456b48ffa65c0e5f0b..178150a69ba3ed9e5d220effc9080f63173a302b 100644 --- a/packages/mini-markdown-editor/src/store/toolbar.ts +++ b/packages/mini-markdown-editor/src/store/toolbar.ts @@ -2,15 +2,34 @@ import { create } from "zustand"; export interface ToolbarStoreType { isFullScreen: boolean; - setIsFullScreen: (isFullScreen: boolean) => any; + setIsFullScreen: (isFullScreen: boolean) => void; + isOnlyWrite: boolean; + setIsOnlyWrite: () => void; + isOnlyPreview: boolean; + setIsOnlyPreview: () => void; + isSidebar: boolean; + sidebarComponent: React.ReactNode | null; } -const useToolbarStore = create((set) => ({ +const useToolbarStore = create((set, get) => ({ // 全屏 isFullScreen: false, setIsFullScreen: (isFullScreen: boolean) => set({ isFullScreen }), // 只写 + isOnlyWrite: false, + setIsOnlyWrite: () => { + const { isOnlyWrite } = get(); + set({ isOnlyWrite: !isOnlyWrite, isOnlyPreview: false }); + }, // 仅预览 + isOnlyPreview: false, + setIsOnlyPreview: () => { + const { isOnlyPreview } = get(); + set({ isOnlyPreview: !isOnlyPreview, isOnlyWrite: false }); + }, + // 侧边栏 + isSidebar: false, + sidebarComponent: null, })); export { useToolbarStore };