mirror of
https://github.com/docmost/docmost.git
synced 2026-05-21 01:04:39 +08:00
feat(editor): add page break node (#2202)
This commit is contained in:
@@ -10,6 +10,7 @@ import {
|
||||
IconH2,
|
||||
IconH3,
|
||||
IconMenu4,
|
||||
IconPageBreak,
|
||||
IconTypography,
|
||||
} from "@tabler/icons-react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
@@ -102,6 +103,12 @@ export const BlockTypeGroup: FC<Props> = ({ editor }) => {
|
||||
>
|
||||
{t("Divider")}
|
||||
</Menu.Item>
|
||||
<Menu.Item
|
||||
leftSection={<IconPageBreak size={16} />}
|
||||
onClick={() => editor.chain().focus().setPageBreak().run()}
|
||||
>
|
||||
{t("Page break")}
|
||||
</Menu.Item>
|
||||
</Menu.Dropdown>
|
||||
</Menu>
|
||||
);
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
IconTable,
|
||||
IconTypography,
|
||||
IconMenu4,
|
||||
IconPageBreak,
|
||||
IconCalendar,
|
||||
IconAppWindow,
|
||||
IconSitemap,
|
||||
@@ -164,6 +165,14 @@ const CommandGroups: SlashMenuGroupedItemsType = {
|
||||
command: ({ editor, range }: CommandProps) =>
|
||||
editor.chain().focus().deleteRange(range).setHorizontalRule().run(),
|
||||
},
|
||||
{
|
||||
title: "Page break",
|
||||
description: "Insert a page break for printing.",
|
||||
searchTerms: ["page", "break", "pagebreak", "print"],
|
||||
icon: IconPageBreak,
|
||||
command: ({ editor, range }: CommandProps) =>
|
||||
editor.chain().focus().deleteRange(range).setPageBreak().run(),
|
||||
},
|
||||
{
|
||||
title: "Image",
|
||||
description: "Upload any image from your device.",
|
||||
|
||||
@@ -42,6 +42,7 @@ import {
|
||||
Excalidraw,
|
||||
Embed,
|
||||
TiptapPdf,
|
||||
PageBreak,
|
||||
SearchAndReplace,
|
||||
Mention,
|
||||
TableDndExtension,
|
||||
@@ -366,6 +367,7 @@ export const mainExtensions = [
|
||||
TiptapPdf.configure({
|
||||
view: PdfView,
|
||||
}),
|
||||
PageBreak,
|
||||
Subpages.configure({
|
||||
view: SubpagesView,
|
||||
}),
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
@import "./media.css";
|
||||
@import "./code.css";
|
||||
@import "./print.css";
|
||||
@import "./page-break.css";
|
||||
@import "./find.css";
|
||||
@import "./mention.css";
|
||||
@import "./ordered-list.css";
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
.ProseMirror .page-break {
|
||||
position: relative;
|
||||
margin: 1.5rem 0;
|
||||
border-top: 1px dashed var(--mantine-color-default-border);
|
||||
height: 0;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.ProseMirror[contenteditable="false"] .page-break {
|
||||
margin: 0;
|
||||
border: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.ProseMirror[contenteditable="false"] .page-break::after {
|
||||
content: none;
|
||||
}
|
||||
|
||||
.ProseMirror .page-break::after {
|
||||
content: "Page break";
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
padding: 0 0.5rem;
|
||||
background: var(--mantine-color-body);
|
||||
color: var(--mantine-color-dimmed);
|
||||
font-size: 0.75rem;
|
||||
line-height: 1;
|
||||
letter-spacing: 0.02em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.ProseMirror .page-break.ProseMirror-selectednode {
|
||||
border-top-color: var(--mantine-primary-color-filled);
|
||||
}
|
||||
|
||||
@media print {
|
||||
.ProseMirror .page-break {
|
||||
break-before: always;
|
||||
page-break-before: always;
|
||||
visibility: hidden;
|
||||
border: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.ProseMirror .page-break::after {
|
||||
content: none;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user