From 8802672ff3123936b290ccec99895e2d8dd8ac1e Mon Sep 17 00:00:00 2001 From: Felix Feng Date: Tue, 26 Nov 2024 17:31:45 +0800 Subject: [PATCH 1/7] export --- apps/www/content/docs/examples/export.mdx | 58 +++++++ apps/www/package.json | 2 + .../public/r/styles/default/editor-ai.json | 2 +- apps/www/public/r/styles/default/editor.json | 2 +- .../public/r/styles/default/export-demo.json | 13 ++ .../styles/default/fixed-toolbar-buttons.json | 2 +- apps/www/public/r/styles/default/input.json | 2 +- .../public/r/styles/default/toc-element.json | 2 +- apps/www/src/config/docs-examples.ts | 6 + .../src/registry/default/plate-ui/editor.tsx | 3 +- .../plate-ui/fixed-toolbar-buttons.tsx | 8 + .../default/plate-ui/pdf-toolbar-button.tsx | 54 +++++++ .../registry/default/plate-ui/toc-element.tsx | 4 +- apps/www/src/registry/registry-ui.ts | 14 ++ apps/www/src/styles/globals.css | 12 +- package.json | 3 + yarn.lock | 141 +++++++++++++++++- 17 files changed, 316 insertions(+), 12 deletions(-) create mode 100644 apps/www/content/docs/examples/export.mdx create mode 100644 apps/www/public/r/styles/default/export-demo.json create mode 100644 apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx diff --git a/apps/www/content/docs/examples/export.mdx b/apps/www/content/docs/examples/export.mdx new file mode 100644 index 0000000000..13047dcb2f --- /dev/null +++ b/apps/www/content/docs/examples/export.mdx @@ -0,0 +1,58 @@ +--- +title: Export +--- + + + + + +## Features + +- Export editor content to: +- Client-side export with no server dependencies + + + +## Usage + +Install the [PDF Toolbar Button](/docs/plate-ui/pdf-toolbar-button) component. + +Note: When using Tailwind CSS, you may encounter background color issues. Please refer to [this link](https://github.com/niklasvh/html2canvas/issues/2775#issuecomment-1204988157) for a solution. + +Add the following CSS to fix background color rendering issues with html2canvas: +```css +@layer base { + img { + @apply inline-block; + } +} +``` + +## Examples + +### Plate UI + +Refer to the preview above. + +### Plate Plus + +- Server-side PDF export: + - High-quality PDF generation + - Custom fonts and styling + - Headers and footers + - Page numbers + - Font selectable +- Advanced export options: + - Paper size selection + - Margin controls + - Orientation settings + - Compression level +- Enterprise-ready features: + {/* - Batch processing */} + {/* - Watermarking */} + - Custom templates + - Password protection + +Try it out with our server-side PDF export: + + diff --git a/apps/www/package.json b/apps/www/package.json index 649de99b9e..b2a8255168 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -139,6 +139,7 @@ "contentlayer2": "^0.4.6", "date-fns": "^3.6.0", "framer-motion": "^11.5.4", + "html2canvas": "^1.4.1", "lodash.template": "^4.5.0", "lucide-react": "0.460.0", "match-sorter": "6.3.4", @@ -146,6 +147,7 @@ "next-contentlayer2": "^0.4.6", "next-themes": "^0.3.0", "nuqs": "^2.0.3", + "pdf-lib": "^1.17.1", "prismjs": "^1.29.0", "react": "^18.3.1", "react-day-picker": "^8.10.1", diff --git a/apps/www/public/r/styles/default/editor-ai.json b/apps/www/public/r/styles/default/editor-ai.json index d268a91200..f756ba55ad 100644 --- a/apps/www/public/r/styles/default/editor-ai.json +++ b/apps/www/public/r/styles/default/editor-ai.json @@ -38,7 +38,7 @@ "type": "registry:component" }, { - "content": "import { withProps } from '@udecode/cn';\nimport { AIPlugin } from '@udecode/plate-ai/react';\nimport {\n BoldPlugin,\n CodePlugin,\n ItalicPlugin,\n StrikethroughPlugin,\n SubscriptPlugin,\n SuperscriptPlugin,\n UnderlinePlugin,\n} from '@udecode/plate-basic-marks/react';\nimport { BlockquotePlugin } from '@udecode/plate-block-quote/react';\nimport {\n CodeBlockPlugin,\n CodeLinePlugin,\n CodeSyntaxPlugin,\n} from '@udecode/plate-code-block/react';\nimport { CommentsPlugin } from '@udecode/plate-comments/react';\nimport {\n ParagraphPlugin,\n PlateLeaf,\n usePlateEditor,\n} from '@udecode/plate-common/react';\nimport { DatePlugin } from '@udecode/plate-date/react';\nimport { EmojiInputPlugin } from '@udecode/plate-emoji/react';\nimport { ExcalidrawPlugin } from '@udecode/plate-excalidraw/react';\nimport { HEADING_KEYS } from '@udecode/plate-heading';\nimport { TocPlugin } from '@udecode/plate-heading/react';\nimport { HighlightPlugin } from '@udecode/plate-highlight/react';\nimport { HorizontalRulePlugin } from '@udecode/plate-horizontal-rule/react';\nimport { KbdPlugin } from '@udecode/plate-kbd/react';\nimport { ColumnItemPlugin, ColumnPlugin } from '@udecode/plate-layout/react';\nimport { LinkPlugin } from '@udecode/plate-link/react';\nimport { ImagePlugin, MediaEmbedPlugin } from '@udecode/plate-media/react';\nimport {\n MentionInputPlugin,\n MentionPlugin,\n} from '@udecode/plate-mention/react';\nimport { SlashInputPlugin } from '@udecode/plate-slash-command/react';\nimport {\n TableCellHeaderPlugin,\n TableCellPlugin,\n TablePlugin,\n TableRowPlugin,\n} from '@udecode/plate-table/react';\nimport { TogglePlugin } from '@udecode/plate-toggle/react';\n\nimport { copilotPlugins } from '@/components/editor/plugins/copilot-plugins';\nimport { editorPlugins } from '@/components/editor/plugins/editor-plugins';\nimport { FixedToolbarPlugin } from '@/components/editor/plugins/fixed-toolbar-plugin';\nimport { FloatingToolbarPlugin } from '@/components/editor/plugins/floating-toolbar-plugin';\nimport { AILeaf } from '@/components/plate-ui/ai-leaf';\nimport { BlockquoteElement } from '@/components/plate-ui/blockquote-element';\nimport { CodeBlockElement } from '@/components/plate-ui/code-block-element';\nimport { CodeLeaf } from '@/components/plate-ui/code-leaf';\nimport { CodeLineElement } from '@/components/plate-ui/code-line-element';\nimport { CodeSyntaxLeaf } from '@/components/plate-ui/code-syntax-leaf';\nimport { ColumnElement } from '@/components/plate-ui/column-element';\nimport { ColumnGroupElement } from '@/components/plate-ui/column-group-element';\nimport { CommentLeaf } from '@/components/plate-ui/comment-leaf';\nimport { DateElement } from '@/components/plate-ui/date-element';\nimport { EmojiInputElement } from '@/components/plate-ui/emoji-input-element';\nimport { ExcalidrawElement } from '@/components/plate-ui/excalidraw-element';\nimport { HeadingElement } from '@/components/plate-ui/heading-element';\nimport { HighlightLeaf } from '@/components/plate-ui/highlight-leaf';\nimport { HrElement } from '@/components/plate-ui/hr-element';\nimport { ImageElement } from '@/components/plate-ui/image-element';\nimport { KbdLeaf } from '@/components/plate-ui/kbd-leaf';\nimport { LinkElement } from '@/components/plate-ui/link-element';\nimport { MediaEmbedElement } from '@/components/plate-ui/media-embed-element';\nimport { MentionElement } from '@/components/plate-ui/mention-element';\nimport { MentionInputElement } from '@/components/plate-ui/mention-input-element';\nimport { ParagraphElement } from '@/components/plate-ui/paragraph-element';\nimport { withPlaceholders } from '@/components/plate-ui/placeholder';\nimport { SlashInputElement } from '@/components/plate-ui/slash-input-element';\nimport {\n TableCellElement,\n TableCellHeaderElement,\n} from '@/components/plate-ui/table-cell-element';\nimport { TableElement } from '@/components/plate-ui/table-element';\nimport { TableRowElement } from '@/components/plate-ui/table-row-element';\nimport { TocElement } from '@/components/plate-ui/toc-element';\nimport { ToggleElement } from '@/components/plate-ui/toggle-element';\nimport { withDraggables } from '@/components/plate-ui/with-draggables';\n\nexport const useCreateEditor = () => {\n return usePlateEditor({\n override: {\n components: withDraggables(\n withPlaceholders({\n [AIPlugin.key]: AILeaf,\n [BlockquotePlugin.key]: BlockquoteElement,\n [BoldPlugin.key]: withProps(PlateLeaf, { as: 'strong' }),\n [CodeBlockPlugin.key]: CodeBlockElement,\n [CodeLinePlugin.key]: CodeLineElement,\n [CodePlugin.key]: CodeLeaf,\n [CodeSyntaxPlugin.key]: CodeSyntaxLeaf,\n [ColumnItemPlugin.key]: ColumnElement,\n [ColumnPlugin.key]: ColumnGroupElement,\n [CommentsPlugin.key]: CommentLeaf,\n [DatePlugin.key]: DateElement,\n [EmojiInputPlugin.key]: EmojiInputElement,\n [ExcalidrawPlugin.key]: ExcalidrawElement,\n [HEADING_KEYS.h1]: withProps(HeadingElement, { variant: 'h1' }),\n [HEADING_KEYS.h2]: withProps(HeadingElement, { variant: 'h2' }),\n [HEADING_KEYS.h3]: withProps(HeadingElement, { variant: 'h3' }),\n [HEADING_KEYS.h4]: withProps(HeadingElement, { variant: 'h4' }),\n [HEADING_KEYS.h5]: withProps(HeadingElement, { variant: 'h5' }),\n [HEADING_KEYS.h6]: withProps(HeadingElement, { variant: 'h6' }),\n [HighlightPlugin.key]: HighlightLeaf,\n [HorizontalRulePlugin.key]: HrElement,\n [ImagePlugin.key]: ImageElement,\n [ItalicPlugin.key]: withProps(PlateLeaf, { as: 'em' }),\n [KbdPlugin.key]: KbdLeaf,\n [LinkPlugin.key]: LinkElement,\n [MediaEmbedPlugin.key]: MediaEmbedElement,\n [MentionInputPlugin.key]: MentionInputElement,\n [MentionPlugin.key]: MentionElement,\n [ParagraphPlugin.key]: ParagraphElement,\n [SlashInputPlugin.key]: SlashInputElement,\n [StrikethroughPlugin.key]: withProps(PlateLeaf, { as: 's' }),\n [SubscriptPlugin.key]: withProps(PlateLeaf, { as: 'sub' }),\n [SuperscriptPlugin.key]: withProps(PlateLeaf, { as: 'sup' }),\n [TableCellHeaderPlugin.key]: TableCellHeaderElement,\n [TableCellPlugin.key]: TableCellElement,\n [TablePlugin.key]: TableElement,\n [TableRowPlugin.key]: TableRowElement,\n [TocPlugin.key]: TocElement,\n [TogglePlugin.key]: ToggleElement,\n [UnderlinePlugin.key]: withProps(PlateLeaf, { as: 'u' }),\n })\n ),\n },\n plugins: [\n ...copilotPlugins,\n ...editorPlugins,\n FixedToolbarPlugin,\n FloatingToolbarPlugin,\n ],\n value: [\n {\n children: [{ text: 'Playground' }],\n type: 'h1',\n },\n {\n children: [\n { text: 'A rich-text editor with AI capabilities. Try the ' },\n { bold: true, text: 'AI commands' },\n { text: ' or use ' },\n { kbd: true, text: 'Cmd+J' },\n { text: ' to open the AI menu.' },\n ],\n type: ParagraphPlugin.key,\n },\n ],\n });\n};\n", + "content": "import { withProps } from '@udecode/cn';\nimport { AIPlugin } from '@udecode/plate-ai/react';\nimport {\n BoldPlugin,\n CodePlugin,\n ItalicPlugin,\n StrikethroughPlugin,\n SubscriptPlugin,\n SuperscriptPlugin,\n UnderlinePlugin,\n} from '@udecode/plate-basic-marks/react';\nimport { BlockquotePlugin } from '@udecode/plate-block-quote/react';\nimport {\n CodeBlockPlugin,\n CodeLinePlugin,\n CodeSyntaxPlugin,\n} from '@udecode/plate-code-block/react';\nimport { CommentsPlugin } from '@udecode/plate-comments/react';\nimport {\n ParagraphPlugin,\n PlateLeaf,\n usePlateEditor,\n} from '@udecode/plate-common/react';\nimport { DatePlugin } from '@udecode/plate-date/react';\nimport { EmojiInputPlugin } from '@udecode/plate-emoji/react';\nimport { ExcalidrawPlugin } from '@udecode/plate-excalidraw/react';\nimport { HEADING_KEYS } from '@udecode/plate-heading';\nimport { TocPlugin } from '@udecode/plate-heading/react';\nimport { HighlightPlugin } from '@udecode/plate-highlight/react';\nimport { HorizontalRulePlugin } from '@udecode/plate-horizontal-rule/react';\nimport { KbdPlugin } from '@udecode/plate-kbd/react';\nimport { ColumnItemPlugin, ColumnPlugin } from '@udecode/plate-layout/react';\nimport { LinkPlugin } from '@udecode/plate-link/react';\nimport { ImagePlugin, MediaEmbedPlugin } from '@udecode/plate-media/react';\nimport {\n MentionInputPlugin,\n MentionPlugin,\n} from '@udecode/plate-mention/react';\nimport { SlashInputPlugin } from '@udecode/plate-slash-command/react';\nimport {\n TableCellHeaderPlugin,\n TableCellPlugin,\n TablePlugin,\n TableRowPlugin,\n} from '@udecode/plate-table/react';\nimport { TogglePlugin } from '@udecode/plate-toggle/react';\n\nimport { copilotPlugins } from '@/components/editor/plugins/copilot-plugins';\nimport { editorPlugins } from '@/components/editor/plugins/editor-plugins';\nimport { FixedToolbarPlugin } from '@/components/editor/plugins/fixed-toolbar-plugin';\nimport { FloatingToolbarPlugin } from '@/components/editor/plugins/floating-toolbar-plugin';\nimport { AILeaf } from '@/components/plate-ui/ai-leaf';\nimport { BlockquoteElement } from '@/components/plate-ui/blockquote-element';\nimport { CodeBlockElement } from '@/components/plate-ui/code-block-element';\nimport { CodeLeaf } from '@/components/plate-ui/code-leaf';\nimport { CodeLineElement } from '@/components/plate-ui/code-line-element';\nimport { CodeSyntaxLeaf } from '@/components/plate-ui/code-syntax-leaf';\nimport { ColumnElement } from '@/components/plate-ui/column-element';\nimport { ColumnGroupElement } from '@/components/plate-ui/column-group-element';\nimport { CommentLeaf } from '@/components/plate-ui/comment-leaf';\nimport { DateElement } from '@/components/plate-ui/date-element';\nimport { EmojiInputElement } from '@/components/plate-ui/emoji-input-element';\nimport { ExcalidrawElement } from '@/components/plate-ui/excalidraw-element';\nimport { HeadingElement } from '@/components/plate-ui/heading-element';\nimport { HighlightLeaf } from '@/components/plate-ui/highlight-leaf';\nimport { HrElement } from '@/components/plate-ui/hr-element';\nimport { ImageElement } from '@/components/plate-ui/image-element';\nimport { KbdLeaf } from '@/components/plate-ui/kbd-leaf';\nimport { LinkElement } from '@/components/plate-ui/link-element';\nimport { MediaEmbedElement } from '@/components/plate-ui/media-embed-element';\nimport { MentionElement } from '@/components/plate-ui/mention-element';\nimport { MentionInputElement } from '@/components/plate-ui/mention-input-element';\nimport { ParagraphElement } from '@/components/plate-ui/paragraph-element';\nimport { withPlaceholders } from '@/components/plate-ui/placeholder';\nimport { SlashInputElement } from '@/components/plate-ui/slash-input-element';\nimport {\n TableCellElement,\n TableCellHeaderElement,\n} from '@/components/plate-ui/table-cell-element';\nimport { TableElement } from '@/components/plate-ui/table-element';\nimport { TableRowElement } from '@/components/plate-ui/table-row-element';\nimport { TocElement } from '@/components/plate-ui/toc-element';\nimport { ToggleElement } from '@/components/plate-ui/toggle-element';\nimport { withDraggables } from '@/components/plate-ui/with-draggables';\nimport { usePlaygroundValue } from '@/registry/default/example/playground-demo';\n\nexport const useCreateEditor = () => {\n const value = usePlaygroundValue();\n\n return usePlateEditor({\n override: {\n components: withDraggables(\n withPlaceholders({\n [AIPlugin.key]: AILeaf,\n [BlockquotePlugin.key]: BlockquoteElement,\n [BoldPlugin.key]: withProps(PlateLeaf, { as: 'strong' }),\n [CodeBlockPlugin.key]: CodeBlockElement,\n [CodeLinePlugin.key]: CodeLineElement,\n [CodePlugin.key]: CodeLeaf,\n [CodeSyntaxPlugin.key]: CodeSyntaxLeaf,\n [ColumnItemPlugin.key]: ColumnElement,\n [ColumnPlugin.key]: ColumnGroupElement,\n [CommentsPlugin.key]: CommentLeaf,\n [DatePlugin.key]: DateElement,\n [EmojiInputPlugin.key]: EmojiInputElement,\n [ExcalidrawPlugin.key]: ExcalidrawElement,\n [HEADING_KEYS.h1]: withProps(HeadingElement, { variant: 'h1' }),\n [HEADING_KEYS.h2]: withProps(HeadingElement, { variant: 'h2' }),\n [HEADING_KEYS.h3]: withProps(HeadingElement, { variant: 'h3' }),\n [HEADING_KEYS.h4]: withProps(HeadingElement, { variant: 'h4' }),\n [HEADING_KEYS.h5]: withProps(HeadingElement, { variant: 'h5' }),\n [HEADING_KEYS.h6]: withProps(HeadingElement, { variant: 'h6' }),\n [HighlightPlugin.key]: HighlightLeaf,\n [HorizontalRulePlugin.key]: HrElement,\n [ImagePlugin.key]: ImageElement,\n [ItalicPlugin.key]: withProps(PlateLeaf, { as: 'em' }),\n [KbdPlugin.key]: KbdLeaf,\n [LinkPlugin.key]: LinkElement,\n [MediaEmbedPlugin.key]: MediaEmbedElement,\n [MentionInputPlugin.key]: MentionInputElement,\n [MentionPlugin.key]: MentionElement,\n [ParagraphPlugin.key]: ParagraphElement,\n [SlashInputPlugin.key]: SlashInputElement,\n [StrikethroughPlugin.key]: withProps(PlateLeaf, { as: 's' }),\n [SubscriptPlugin.key]: withProps(PlateLeaf, { as: 'sub' }),\n [SuperscriptPlugin.key]: withProps(PlateLeaf, { as: 'sup' }),\n [TableCellHeaderPlugin.key]: TableCellHeaderElement,\n [TableCellPlugin.key]: TableCellElement,\n [TablePlugin.key]: TableElement,\n [TableRowPlugin.key]: TableRowElement,\n [TocPlugin.key]: TocElement,\n [TogglePlugin.key]: ToggleElement,\n [UnderlinePlugin.key]: withProps(PlateLeaf, { as: 'u' }),\n })\n ),\n },\n plugins: [\n ...copilotPlugins,\n ...editorPlugins,\n FixedToolbarPlugin,\n FloatingToolbarPlugin,\n ],\n value: value,\n });\n};\n", "path": "block/editor-ai/components/editor/use-create-editor.tsx", "target": "components/editor/use-create-editor.tsx", "type": "registry:component" diff --git a/apps/www/public/r/styles/default/editor.json b/apps/www/public/r/styles/default/editor.json index df15e69c48..290e3fcdab 100644 --- a/apps/www/public/r/styles/default/editor.json +++ b/apps/www/public/r/styles/default/editor.json @@ -15,7 +15,7 @@ }, "files": [ { - "content": "'use client';\n\nimport React from 'react';\n\nimport type { PlateContentProps } from '@udecode/plate-common/react';\nimport type { VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@udecode/cn';\nimport {\n PlateContent,\n useEditorContainerRef,\n useEditorRef,\n} from '@udecode/plate-common/react';\nimport { cva } from 'class-variance-authority';\n\nconst editorContainerVariants = cva(\n 'relative w-full cursor-text overflow-y-auto caret-primary selection:bg-brand/25 [&_.slate-selection-area]:border [&_.slate-selection-area]:border-brand/25 [&_.slate-selection-area]:bg-brand/15',\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n default: 'h-full',\n demo: 'h-[650px]',\n },\n },\n }\n);\n\nexport const EditorContainer = ({\n className,\n variant,\n ...props\n}: React.HTMLAttributes &\n VariantProps) => {\n const editor = useEditorRef();\n const containerRef = useEditorContainerRef();\n\n return (\n \n );\n};\n\nEditorContainer.displayName = 'EditorContainer';\n\nconst editorVariants = cva(\n cn(\n 'group/editor',\n 'relative w-full overflow-x-hidden whitespace-pre-wrap break-words',\n 'rounded-md ring-offset-background placeholder:text-muted-foreground/80 focus-visible:outline-none',\n '[&_[data-slate-placeholder]]:text-muted-foreground/80 [&_[data-slate-placeholder]]:!opacity-100',\n '[&_[data-slate-placeholder]]:top-[auto_!important]',\n '[&_strong]:font-bold'\n ),\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n disabled: {\n true: 'cursor-not-allowed opacity-50',\n },\n focused: {\n true: 'ring-2 ring-ring ring-offset-2',\n },\n variant: {\n ai: 'w-full px-0 text-sm',\n aiChat:\n 'max-h-[min(70vh,320px)] w-full max-w-[700px] overflow-y-auto px-3 py-2 text-sm',\n default:\n 'size-full px-16 pb-72 pt-4 text-base sm:px-[max(64px,calc(50%-350px))]',\n demo: 'size-full px-16 pb-72 pt-4 text-base sm:px-[max(64px,calc(50%-350px))]',\n fullWidth: 'size-full px-16 pb-72 pt-4 text-base sm:px-24',\n none: '',\n },\n },\n }\n);\n\nexport type EditorProps = PlateContentProps &\n VariantProps;\n\nexport const Editor = React.forwardRef(\n ({ className, disabled, focused, variant, ...props }, ref) => {\n return (\n \n );\n }\n);\n\nEditor.displayName = 'Editor';\n", + "content": "'use client';\n\nimport React from 'react';\n\nimport type { PlateContentProps } from '@udecode/plate-common/react';\nimport type { VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@udecode/cn';\nimport {\n PlateContent,\n useEditorContainerRef,\n useEditorRef,\n} from '@udecode/plate-common/react';\nimport { cva } from 'class-variance-authority';\n\nconst editorContainerVariants = cva(\n 'relative w-full cursor-text overflow-y-auto caret-primary selection:bg-brand/25 [&_.slate-selection-area]:border [&_.slate-selection-area]:border-brand/25 [&_.slate-selection-area]:bg-brand/15',\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n default: 'h-full',\n demo: 'h-[650px]',\n },\n },\n }\n);\n\nexport const EditorContainer = ({\n className,\n variant,\n ...props\n}: React.HTMLAttributes &\n VariantProps) => {\n const editor = useEditorRef();\n const containerRef = useEditorContainerRef();\n\n return (\n \n );\n};\n\nEditorContainer.displayName = 'EditorContainer';\n\nconst editorVariants = cva(\n cn(\n 'group/editor',\n 'relative w-full overflow-x-hidden whitespace-pre-wrap break-words',\n 'rounded-md ring-offset-background placeholder:text-muted-foreground/80 focus-visible:outline-none',\n '[&_[data-slate-placeholder]]:text-muted-foreground/80 [&_[data-slate-placeholder]]:!opacity-100',\n '[&_[data-slate-placeholder]]:top-[auto_!important]',\n '[&_strong]:font-bold'\n ),\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n disabled: {\n true: 'cursor-not-allowed opacity-50',\n },\n focused: {\n true: 'ring-2 ring-ring ring-offset-2',\n },\n variant: {\n ai: 'w-full px-0 text-sm',\n aiChat:\n 'max-h-[min(70vh,320px)] w-full max-w-[700px] overflow-y-auto px-3 py-2 text-sm',\n default:\n 'size-full px-16 pb-72 pt-4 text-base sm:px-[max(64px,calc(50%-350px))]',\n demo: 'size-full px-16 pb-72 pt-4 text-base sm:px-[max(64px,calc(50%-350px))]',\n fullWidth: 'size-full px-16 pb-72 pt-4 text-base sm:px-24',\n none: '',\n },\n },\n }\n);\n\nexport type EditorProps = PlateContentProps &\n VariantProps;\n\nexport const Editor = React.forwardRef(\n ({ className, disabled, focused, variant, ...props }, ref) => {\n return (\n \n );\n }\n);\n\nEditor.displayName = 'Editor';\n", "path": "plate-ui/editor.tsx", "target": "components/plate-ui/editor.tsx", "type": "registry:ui" diff --git a/apps/www/public/r/styles/default/export-demo.json b/apps/www/public/r/styles/default/export-demo.json new file mode 100644 index 0000000000..3545345a2a --- /dev/null +++ b/apps/www/public/r/styles/default/export-demo.json @@ -0,0 +1,13 @@ +{ + "files": [ + { + "content": "'use client';\n\nimport React from 'react';\n\nimport {\n Plate,\n PlateContent,\n usePlateEditor,\n} from '@udecode/plate-common/react';\n\nexport default function BasicEditorDefaultDemo() {\n const editor = usePlateEditor();\n\n return (\n \n \n \n );\n}\n", + "path": "example/export-demo.tsx", + "target": "components/export-demo.tsx", + "type": "registry:example" + } + ], + "name": "export-demo", + "registryDependencies": [], + "type": "registry:example" +} \ No newline at end of file diff --git a/apps/www/public/r/styles/default/fixed-toolbar-buttons.json b/apps/www/public/r/styles/default/fixed-toolbar-buttons.json index ba97a1bf78..56123e44d0 100644 --- a/apps/www/public/r/styles/default/fixed-toolbar-buttons.json +++ b/apps/www/public/r/styles/default/fixed-toolbar-buttons.json @@ -14,7 +14,7 @@ }, "files": [ { - "content": "'use client';\n\nimport React from 'react';\n\nimport {\n BoldPlugin,\n CodePlugin,\n ItalicPlugin,\n StrikethroughPlugin,\n UnderlinePlugin,\n} from '@udecode/plate-basic-marks/react';\nimport { useEditorReadOnly } from '@udecode/plate-common/react';\nimport {\n FontBackgroundColorPlugin,\n FontColorPlugin,\n} from '@udecode/plate-font/react';\nimport { HighlightPlugin } from '@udecode/plate-highlight/react';\nimport { ListStyleType } from '@udecode/plate-indent-list';\nimport {\n AudioPlugin,\n FilePlugin,\n ImagePlugin,\n VideoPlugin,\n} from '@udecode/plate-media/react';\nimport {\n BaselineIcon,\n BoldIcon,\n Code2Icon,\n HighlighterIcon,\n ItalicIcon,\n PaintBucketIcon,\n StrikethroughIcon,\n UnderlineIcon,\n WandSparklesIcon,\n} from 'lucide-react';\n\nimport { MoreDropdownMenu } from '@/components/plate-ui/more-dropdown-menu';\n\nimport { AIToolbarButton } from './ai-toolbar-button';\nimport { AlignDropdownMenu } from './align-dropdown-menu';\nimport { ColorDropdownMenu } from './color-dropdown-menu';\nimport { CommentToolbarButton } from './comment-toolbar-button';\nimport { EmojiDropdownMenu } from './emoji-dropdown-menu';\nimport { RedoToolbarButton, UndoToolbarButton } from './history-toolbar-button';\nimport { IndentListToolbarButton } from './indent-list-toolbar-button';\nimport { IndentTodoToolbarButton } from './indent-todo-toolbar-button';\nimport { IndentToolbarButton } from './indent-toolbar-button';\nimport { InsertDropdownMenu } from './insert-dropdown-menu';\nimport { LineHeightDropdownMenu } from './line-height-dropdown-menu';\nimport { LinkToolbarButton } from './link-toolbar-button';\nimport { MarkToolbarButton } from './mark-toolbar-button';\nimport { MediaToolbarButton } from './media-toolbar-button';\nimport { ModeDropdownMenu } from './mode-dropdown-menu';\nimport { OutdentToolbarButton } from './outdent-toolbar-button';\nimport { TableDropdownMenu } from './table-dropdown-menu';\nimport { ToggleToolbarButton } from './toggle-toolbar-button';\nimport { ToolbarGroup } from './toolbar';\nimport { TurnIntoDropdownMenu } from './turn-into-dropdown-menu';\n\nexport function FixedToolbarButtons() {\n const readOnly = useEditorReadOnly();\n\n return (\n
\n {!readOnly && (\n <>\n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n\n \n \n\n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n )}\n\n
\n\n \n \n \n \n \n \n\n \n \n \n
\n );\n}\n", + "content": "'use client';\n\nimport React from 'react';\n\nimport {\n BoldPlugin,\n CodePlugin,\n ItalicPlugin,\n StrikethroughPlugin,\n UnderlinePlugin,\n} from '@udecode/plate-basic-marks/react';\nimport { useEditorReadOnly } from '@udecode/plate-common/react';\nimport {\n FontBackgroundColorPlugin,\n FontColorPlugin,\n} from '@udecode/plate-font/react';\nimport { HighlightPlugin } from '@udecode/plate-highlight/react';\nimport { ListStyleType } from '@udecode/plate-indent-list';\nimport {\n AudioPlugin,\n FilePlugin,\n ImagePlugin,\n VideoPlugin,\n} from '@udecode/plate-media/react';\nimport {\n ArrowUpToLineIcon,\n BaselineIcon,\n BoldIcon,\n Code2Icon,\n HighlighterIcon,\n ItalicIcon,\n PaintBucketIcon,\n StrikethroughIcon,\n UnderlineIcon,\n WandSparklesIcon,\n} from 'lucide-react';\n\nimport { MoreDropdownMenu } from '@/components/plate-ui/more-dropdown-menu';\n\nimport { AIToolbarButton } from './ai-toolbar-button';\nimport { AlignDropdownMenu } from './align-dropdown-menu';\nimport { ColorDropdownMenu } from './color-dropdown-menu';\nimport { CommentToolbarButton } from './comment-toolbar-button';\nimport { EmojiDropdownMenu } from './emoji-dropdown-menu';\nimport { RedoToolbarButton, UndoToolbarButton } from './history-toolbar-button';\nimport { IndentListToolbarButton } from './indent-list-toolbar-button';\nimport { IndentTodoToolbarButton } from './indent-todo-toolbar-button';\nimport { IndentToolbarButton } from './indent-toolbar-button';\nimport { InsertDropdownMenu } from './insert-dropdown-menu';\nimport { LineHeightDropdownMenu } from './line-height-dropdown-menu';\nimport { LinkToolbarButton } from './link-toolbar-button';\nimport { MarkToolbarButton } from './mark-toolbar-button';\nimport { MediaToolbarButton } from './media-toolbar-button';\nimport { ModeDropdownMenu } from './mode-dropdown-menu';\nimport { OutdentToolbarButton } from './outdent-toolbar-button';\nimport { PdfToolbarButton } from './pdf-toolbar-button';\nimport { TableDropdownMenu } from './table-dropdown-menu';\nimport { ToggleToolbarButton } from './toggle-toolbar-button';\nimport { ToolbarGroup } from './toolbar';\nimport { TurnIntoDropdownMenu } from './turn-into-dropdown-menu';\n\nexport function FixedToolbarButtons() {\n const readOnly = useEditorReadOnly();\n\n return (\n
\n {!readOnly && (\n <>\n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n\n \n \n\n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n )}\n\n
\n\n \n \n \n \n \n \n\n \n \n \n
\n );\n}\n", "path": "plate-ui/fixed-toolbar-buttons.tsx", "target": "components/plate-ui/fixed-toolbar-buttons.tsx", "type": "registry:ui" diff --git a/apps/www/public/r/styles/default/input.json b/apps/www/public/r/styles/default/input.json index cf6b92f863..3f4858d2ac 100644 --- a/apps/www/public/r/styles/default/input.json +++ b/apps/www/public/r/styles/default/input.json @@ -5,7 +5,7 @@ }, "files": [ { - "content": "import { withVariants } from '@udecode/cn';\nimport { type VariantProps, cva } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nexport const inputVariants = cva(\n 'flex w-full rounded-md bg-transparent text-sm file:border-0 file:bg-background file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n {\n defaultVariants: {\n h: 'md',\n variant: 'default',\n },\n variants: {\n h: {\n md: 'h-10 px-3 py-2',\n sm: 'h-[28px] px-1.5 py-1',\n },\n variant: {\n default:\n 'border border-input ring-offset-background focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n ghost: 'border-none focus-visible:ring-transparent',\n },\n },\n }\n);\n\nexport type InputProps = React.ComponentPropsWithoutRef<'input'> &\n VariantProps;\n\nexport const Input = withVariants('input', inputVariants, ['variant', 'h']);\n\nexport type FloatingInputProps = InputProps & {\n label: string;\n};\n\nexport function FloatingInput({\n id,\n className,\n label,\n ...props\n}: FloatingInputProps) {\n return (\n <>\n \n {label}\n \n \n \n );\n}\n", + "content": "import React from 'react';\n\nimport { cn, withVariants } from '@udecode/cn';\nimport { type VariantProps, cva } from 'class-variance-authority';\n\nexport const inputVariants = cva(\n 'flex w-full rounded-md bg-transparent text-sm file:border-0 file:bg-background file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n {\n defaultVariants: {\n h: 'md',\n variant: 'default',\n },\n variants: {\n h: {\n md: 'h-10 px-3 py-2',\n sm: 'h-[28px] px-1.5 py-1',\n },\n variant: {\n default:\n 'border border-input ring-offset-background focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n ghost: 'border-none focus-visible:ring-transparent',\n },\n },\n }\n);\n\nexport type InputProps = React.ComponentPropsWithoutRef<'input'> &\n VariantProps;\n\nexport const Input = withVariants('input', inputVariants, ['variant', 'h']);\n\nexport type FloatingInputProps = InputProps & {\n label: string;\n};\n\nexport function FloatingInput({\n id,\n className,\n label,\n ...props\n}: FloatingInputProps) {\n return (\n <>\n \n {label}\n \n \n \n );\n}\n", "path": "plate-ui/input.tsx", "target": "components/plate-ui/input.tsx", "type": "registry:ui" diff --git a/apps/www/public/r/styles/default/toc-element.json b/apps/www/public/r/styles/default/toc-element.json index bdaa90fa7c..5b2334a557 100644 --- a/apps/www/public/r/styles/default/toc-element.json +++ b/apps/www/public/r/styles/default/toc-element.json @@ -22,7 +22,7 @@ }, "files": [ { - "content": "'use client';\n\nimport { cn, withRef } from '@udecode/cn';\nimport {\n useTocElement,\n useTocElementState,\n} from '@udecode/plate-heading/react';\nimport { cva } from 'class-variance-authority';\n\nimport { Button } from './button';\nimport { PlateElement } from './plate-element';\n\nconst headingItemVariants = cva(\n 'block h-auto w-full cursor-pointer truncate rounded-none px-0.5 py-1.5 text-left font-medium text-muted-foreground underline decoration-[0.5px] underline-offset-4 hover:bg-accent hover:text-muted-foreground',\n {\n variants: {\n depth: {\n 1: 'pl-0.5',\n 2: 'pl-[26px]',\n 3: 'pl-[50px]',\n },\n },\n }\n);\n\nexport const TocElement = withRef(\n ({ children, className, ...props }, ref) => {\n const state = useTocElementState();\n\n const { props: btnProps } = useTocElement(state);\n\n const { headingList } = state;\n\n return (\n \n \n {children}\n \n );\n }\n);\n", + "content": "'use client';\n\nimport { cn, withRef } from '@udecode/cn';\nimport {\n useTocElement,\n useTocElementState,\n} from '@udecode/plate-heading/react';\nimport { cva } from 'class-variance-authority';\n\nimport { Button } from './button';\nimport { PlateElement } from './plate-element';\n\nconst headingItemVariants = cva(\n 'block h-auto w-full cursor-pointer truncate rounded-none px-0.5 py-1.5 text-left font-medium text-muted-foreground underline decoration-[0.5px] underline-offset-4 hover:bg-accent hover:text-muted-foreground',\n {\n variants: {\n depth: {\n 1: 'pl-0.5',\n 2: 'pl-[26px]',\n 3: 'pl-[50px]',\n },\n },\n }\n);\n\nexport const TocElement = withRef(\n ({ children, className, ...props }, ref) => {\n const state = useTocElementState();\n\n const { props: btnProps } = useTocElement(state);\n\n const { headingList } = state;\n\n return (\n \n
\n {headingList.length > 0 ? (\n headingList.map((item) => (\n btnProps.onClick(e, item, 'smooth')}\n aria-current\n >\n {item.title}\n \n ))\n ) : (\n
\n Create a heading to display the table of contents.\n
\n )}\n
\n {children}\n \n );\n }\n);\n", "path": "plate-ui/toc-element.tsx", "target": "components/plate-ui/toc-element.tsx", "type": "registry:ui" diff --git a/apps/www/src/config/docs-examples.ts b/apps/www/src/config/docs-examples.ts index cf10d45138..4abb4ed571 100644 --- a/apps/www/src/config/docs-examples.ts +++ b/apps/www/src/config/docs-examples.ts @@ -5,6 +5,12 @@ import { registryToNav } from '@/config/registry-to-nav'; import { docExamples } from '@/registry/registry-examples'; export const docsExamples: SidebarNavItem[] = [ + { + description: 'Export a Plate document to a file.', + href: '/docs/examples/export', + label: 'New', + title: 'Export', + }, { description: "Show a diff of two different points in a Plate document's history.", diff --git a/apps/www/src/registry/default/plate-ui/editor.tsx b/apps/www/src/registry/default/plate-ui/editor.tsx index 6810bb171c..35fc5e05cb 100644 --- a/apps/www/src/registry/default/plate-ui/editor.tsx +++ b/apps/www/src/registry/default/plate-ui/editor.tsx @@ -46,7 +46,8 @@ export const EditorContainer = ({ editorContainerVariants({ variant }), className )} - role="button" + // Adding this role attribute could cause the content captured by html2canvas to be incorrectly centered. + // role="button" {...props} /> ); diff --git a/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx b/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx index 50bcee4309..8176d93db3 100644 --- a/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx +++ b/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx @@ -23,6 +23,7 @@ import { VideoPlugin, } from '@udecode/plate-media/react'; import { + ArrowUpToLineIcon, BaselineIcon, BoldIcon, Code2Icon, @@ -52,6 +53,7 @@ import { MarkToolbarButton } from './mark-toolbar-button'; import { MediaToolbarButton } from './media-toolbar-button'; import { ModeDropdownMenu } from './mode-dropdown-menu'; import { OutdentToolbarButton } from './outdent-toolbar-button'; +import { PdfToolbarButton } from './pdf-toolbar-button'; import { TableDropdownMenu } from './table-dropdown-menu'; import { ToggleToolbarButton } from './toggle-toolbar-button'; import { ToolbarGroup } from './toolbar'; @@ -75,6 +77,12 @@ export function FixedToolbarButtons() { + + + + + + diff --git a/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx b/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx new file mode 100644 index 0000000000..95e7294bd4 --- /dev/null +++ b/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx @@ -0,0 +1,54 @@ +'use client'; + +import React from 'react'; + +import { withRef } from '@udecode/cn'; +import { useEditorRef } from '@udecode/plate-core/react'; +import { toDOMNode } from '@udecode/slate-react'; + +import { ToolbarButton } from './toolbar'; + +export const PdfToolbarButton = withRef( + ({ children, ...rest }, ref) => { + const editor = useEditorRef(); + + return ( + { + const { default: html2canvas } = await import('html2canvas'); + + const canvas = await html2canvas(toDOMNode(editor, editor)!, { + onclone(document, element) { + console.log(document, element, 'fj'); + }, + }); + + const PDFLib = await import('pdf-lib'); + const pdfDoc = await PDFLib.PDFDocument.create(); + const page = pdfDoc.addPage([canvas.width, canvas.height]); + const imageEmbed = await pdfDoc.embedPng(canvas.toDataURL('PNG')); + + page.drawImage(imageEmbed, { + height: canvas.height, + width: canvas.width, + x: 0, + y: 0, + }); + const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true }); + + const element = document.createElement('a'); + element.setAttribute('href', pdfBase64); + element.setAttribute('download', 'plate.pdf'); + element.style.display = 'none'; + document.body.append(element); + element.click(); + element.remove(); + }} + > + {children} + + ); + } +); diff --git a/apps/www/src/registry/default/plate-ui/toc-element.tsx b/apps/www/src/registry/default/plate-ui/toc-element.tsx index 844b2bed28..a282c8d5b3 100644 --- a/apps/www/src/registry/default/plate-ui/toc-element.tsx +++ b/apps/www/src/registry/default/plate-ui/toc-element.tsx @@ -37,7 +37,7 @@ export const TocElement = withRef( className={cn('relative mb-1 p-0', className)} {...props} > - +
{children} ); diff --git a/apps/www/src/registry/registry-ui.ts b/apps/www/src/registry/registry-ui.ts index cff3933725..d1e85679b0 100644 --- a/apps/www/src/registry/registry-ui.ts +++ b/apps/www/src/registry/registry-ui.ts @@ -111,6 +111,20 @@ export const uiComponents: Registry = [ registryDependencies: [], type: 'registry:ui', }, + { + dependencies: ['html2canvas', 'pdf-lib'], + doc: { + description: 'A toolbar button to export editor content as PDF.', + docs: [{ route: '/docs/export', title: 'Export' }], + examples: ['basic-nodes-demo'], + label: 'New', + title: 'PDF Toolbar Button', + }, + files: ['plate-ui/pdf-toolbar-button.tsx'], + name: 'pdf-toolbar-button', + registryDependencies: ['toolbar'], + type: 'registry:ui', + }, { dependencies: ['@udecode/plate-caption'], doc: { diff --git a/apps/www/src/styles/globals.css b/apps/www/src/styles/globals.css index 327cc3a620..42ab260af0 100644 --- a/apps/www/src/styles/globals.css +++ b/apps/www/src/styles/globals.css @@ -2,6 +2,12 @@ @tailwind components; @tailwind utilities; +/* global.css */ +@layer base { + img { + @apply inline-block; + } +} @layer base { :root { --background: 0 0% 100%; @@ -24,10 +30,10 @@ --input: 240 5.9% 90%; --ring: 240 5% 64.9%; --radius: 0.5rem; - + --brand: 217.2 91.2% 59.8%; --highlight: 47.9 95.8% 53.1%; - + .prose { --tw-prose-body: var(--foreground); --tw-prose-bullets: var(--foreground); @@ -54,7 +60,7 @@ --border: 240 3.7% 25%; --input: 240 3.7% 25%; --ring: 240 3.7% 25%; - + --brand: 213.3 93.9% 67.8%; --highlight: 48 96% 53%; } diff --git a/package.json b/package.json index 19a5d7f923..0fc442ac37 100644 --- a/package.json +++ b/package.json @@ -164,5 +164,8 @@ "node": ">=18.12.0", "npm": "please-use-yarn", "yarn": ">=1.22.0" + }, + "dependencies": { + "puppeteer": "23.9.0" } } diff --git a/yarn.lock b/yarn.lock index af4870c5ba..71a3db1630 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3089,6 +3089,24 @@ __metadata: languageName: node linkType: hard +"@pdf-lib/standard-fonts@npm:^1.0.0": + version: 1.0.0 + resolution: "@pdf-lib/standard-fonts@npm:1.0.0" + dependencies: + pako: "npm:^1.0.6" + checksum: 10c0/c683adfb764cd235a8370a0c1d5a8d7e90e3499ad33cdecfb92e4d48b0d36cfd038e3a875ebd0937a5646ee1578d793ab98f9c374be360c9a05d2699c1caedf4 + languageName: node + linkType: hard + +"@pdf-lib/upng@npm:^1.0.1": + version: 1.0.1 + resolution: "@pdf-lib/upng@npm:1.0.1" + dependencies: + pako: "npm:^1.0.10" + checksum: 10c0/9c300c513c1089e561c0cccac01f396a24efb9b0e9c922a39248cb09dfced70c05b9facdfce11a7f22cbedb4129593630a18111b90a57ef34ea4c3df98f2ac1d + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -3226,6 +3244,24 @@ __metadata: languageName: node linkType: hard +"@puppeteer/browsers@npm:2.4.1": + version: 2.4.1 + resolution: "@puppeteer/browsers@npm:2.4.1" + dependencies: + debug: "npm:^4.3.7" + extract-zip: "npm:^2.0.1" + progress: "npm:^2.0.3" + proxy-agent: "npm:^6.4.0" + semver: "npm:^7.6.3" + tar-fs: "npm:^3.0.6" + unbzip2-stream: "npm:^1.4.3" + yargs: "npm:^17.7.2" + bin: + browsers: lib/cjs/main-cli.js + checksum: 10c0/025ad64d4003f1cc6c2d4a1c9c5f54e182541a816a41d8bfbe433d55affdc16fd4c52b70fe06481bcbe4c5df484293304d47c7c7fae85c223b396b48e2442f1c + languageName: node + linkType: hard + "@radix-ui/colors@npm:3.0.0": version: 3.0.0 resolution: "@radix-ui/colors@npm:3.0.0" @@ -8134,6 +8170,13 @@ __metadata: languageName: node linkType: hard +"base64-arraybuffer@npm:^1.0.2": + version: 1.0.2 + resolution: "base64-arraybuffer@npm:1.0.2" + checksum: 10c0/3acac95c70f9406e87a41073558ba85b6be9dbffb013a3d2a710e3f2d534d506c911847d5d9be4de458af6362c676de0a5c4c2d7bdf4def502d00b313368e72f + languageName: node + linkType: hard + "base64-js@npm:0.0.8": version: 0.0.8 resolution: "base64-js@npm:0.0.8" @@ -9127,6 +9170,15 @@ __metadata: languageName: node linkType: hard +"css-line-break@npm:^2.1.0": + version: 2.1.0 + resolution: "css-line-break@npm:2.1.0" + dependencies: + utrie: "npm:^1.0.2" + checksum: 10c0/b2222d99d5daf7861ecddc050244fdce296fad74b000dcff6bdfb1eb16dc2ef0b9ffe2c1c965e3239bd05ebe9eadb6d5438a91592fa8648d27a338e827cf9048 + languageName: node + linkType: hard + "css-select@npm:^4.3.0": version: 4.3.0 resolution: "css-select@npm:4.3.0" @@ -9483,6 +9535,13 @@ __metadata: languageName: node linkType: hard +"devtools-protocol@npm:0.0.1367902": + version: 0.0.1367902 + resolution: "devtools-protocol@npm:0.0.1367902" + checksum: 10c0/be4017f2bfd04474d718daca0e88e062f4afceb2f311662d717f4eae5bda3473da748a68ff1bf2326a67ce35c37af33932190fe8ef1d36c8ef22576befdc57c4 + languageName: node + linkType: hard + "didyoumean@npm:^1.2.2": version: 1.2.2 resolution: "didyoumean@npm:1.2.2" @@ -12415,6 +12474,16 @@ __metadata: languageName: node linkType: hard +"html2canvas@npm:^1.4.1": + version: 1.4.1 + resolution: "html2canvas@npm:1.4.1" + dependencies: + css-line-break: "npm:^2.1.0" + text-segmentation: "npm:^1.0.3" + checksum: 10c0/6de86f75762b00948edf2ea559f16da0a1ec3facc4a8a7d3f35fcec59bb0c5970463478988ae3d9082152e0173690d46ebf4082e7ac803dd4817bae1d355c0db + languageName: node + linkType: hard + "htmlparser2@npm:^5.0.0": version: 5.0.1 resolution: "htmlparser2@npm:5.0.1" @@ -16763,6 +16832,13 @@ __metadata: languageName: node linkType: hard +"pako@npm:^1.0.10, pako@npm:^1.0.11, pako@npm:^1.0.6": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe + languageName: node + linkType: hard + "papaparse@npm:^5.4.1": version: 5.4.1 resolution: "papaparse@npm:5.4.1" @@ -17013,6 +17089,18 @@ __metadata: languageName: node linkType: hard +"pdf-lib@npm:^1.17.1": + version: 1.17.1 + resolution: "pdf-lib@npm:1.17.1" + dependencies: + "@pdf-lib/standard-fonts": "npm:^1.0.0" + "@pdf-lib/upng": "npm:^1.0.1" + pako: "npm:^1.0.11" + tslib: "npm:^1.11.1" + checksum: 10c0/a9489a402880dacd1389a3e14ff8f6139d58e3bc82f26b0fcbd0798b841aee6ccb7fcfab0992b574e57b40404ced0330a7170b3c6467363461a9df5d9daec489 + languageName: node + linkType: hard + "pend@npm:~1.2.0": version: 1.2.0 resolution: "pend@npm:1.2.0" @@ -17181,6 +17269,7 @@ __metadata: prettier-plugin-jsdoc: "npm:^1.3.0" prettier-plugin-packagejson: "npm:^2.5.2" prettier-plugin-tailwindcss: "npm:^0.6.6" + puppeteer: "npm:23.9.0" react: "npm:^18.3.1" react-dnd-test-backend: "npm:^16.0.1" react-dom: "npm:^18.3.1" @@ -17735,6 +17824,36 @@ __metadata: languageName: node linkType: hard +"puppeteer-core@npm:23.9.0": + version: 23.9.0 + resolution: "puppeteer-core@npm:23.9.0" + dependencies: + "@puppeteer/browsers": "npm:2.4.1" + chromium-bidi: "npm:0.8.0" + debug: "npm:^4.3.7" + devtools-protocol: "npm:0.0.1367902" + typed-query-selector: "npm:^2.12.0" + ws: "npm:^8.18.0" + checksum: 10c0/1cb6e084059a94929f39ca458eec45b258f1ffbeb904ed689e2b915fd48741aa6aecf98129edf6426773316d204b3795a937da590bb65a635b6c8fd3e4feae11 + languageName: node + linkType: hard + +"puppeteer@npm:23.9.0": + version: 23.9.0 + resolution: "puppeteer@npm:23.9.0" + dependencies: + "@puppeteer/browsers": "npm:2.4.1" + chromium-bidi: "npm:0.8.0" + cosmiconfig: "npm:^9.0.0" + devtools-protocol: "npm:0.0.1367902" + puppeteer-core: "npm:23.9.0" + typed-query-selector: "npm:^2.12.0" + bin: + puppeteer: lib/cjs/puppeteer/node/cli.js + checksum: 10c0/70a2569ca517cee6a6322030972b5877276ba9efcf90dc02222757900a33703db30a0e9dbf66be129f85b8881aa5992dcf7b292dfd02ec7fb38bbed2bbbf791c + languageName: node + linkType: hard + "puppeteer@npm:^23.6.0": version: 23.6.0 resolution: "puppeteer@npm:23.6.0" @@ -20350,6 +20469,15 @@ __metadata: languageName: node linkType: hard +"text-segmentation@npm:^1.0.3": + version: 1.0.3 + resolution: "text-segmentation@npm:1.0.3" + dependencies: + utrie: "npm:^1.0.2" + checksum: 10c0/8b9ae8524e3a332371060d0ca62f10ad49a13e954719ea689a6c3a8b8c15c8a56365ede2bb91c322fb0d44b6533785f0da603e066b7554d052999967fb72d600 + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -20732,7 +20860,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1": +"tslib@npm:^1.11.1, tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 @@ -21604,6 +21732,15 @@ __metadata: languageName: node linkType: hard +"utrie@npm:^1.0.2": + version: 1.0.2 + resolution: "utrie@npm:1.0.2" + dependencies: + base64-arraybuffer: "npm:^1.0.2" + checksum: 10c0/eaffe645bd81a39e4bc3abb23df5895e9961dbdd49748ef3b173529e8b06ce9dd1163e9705d5309a1c61ee41ffcb825e2043bc0fd1659845ffbdf4b1515dfdb4 + languageName: node + linkType: hard + "uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" @@ -22231,6 +22368,7 @@ __metadata: date-fns: "npm:^3.6.0" framer-motion: "npm:^11.5.4" glob: "npm:^11.0.0" + html2canvas: "npm:^1.4.1" lodash.template: "npm:^4.5.0" lucide-react: "npm:0.460.0" match-sorter: "npm:6.3.4" @@ -22239,6 +22377,7 @@ __metadata: next-contentlayer2: "npm:^0.4.6" next-themes: "npm:^0.3.0" nuqs: "npm:^2.0.3" + pdf-lib: "npm:^1.17.1" postcss: "npm:^8.4.45" prismjs: "npm:^1.29.0" puppeteer: "npm:^23.6.0" From b59897f7cfa151f4fe95ef4585b5e5dddde7ad48 Mon Sep 17 00:00:00 2001 From: Felix Feng Date: Tue, 26 Nov 2024 17:33:46 +0800 Subject: [PATCH 2/7] fix --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index 0fc442ac37..19a5d7f923 100644 --- a/package.json +++ b/package.json @@ -164,8 +164,5 @@ "node": ">=18.12.0", "npm": "please-use-yarn", "yarn": ">=1.22.0" - }, - "dependencies": { - "puppeteer": "23.9.0" } } From f204cbf76728f0d9884f3314497fd92e1d2d0e29 Mon Sep 17 00:00:00 2001 From: Felix Feng Date: Tue, 26 Nov 2024 17:48:41 +0800 Subject: [PATCH 3/7] revert --- apps/www/src/styles/globals.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/www/src/styles/globals.css b/apps/www/src/styles/globals.css index 10261058d0..fcd6919efd 100644 --- a/apps/www/src/styles/globals.css +++ b/apps/www/src/styles/globals.css @@ -3,11 +3,6 @@ @tailwind utilities; /* global.css */ -@layer base { - img { - @apply inline-block; - } -} @layer base { :root { --background: 0 0% 100%; From 9a1899882f16e8cb3c375f6deecd49822c5675c1 Mon Sep 17 00:00:00 2001 From: Felix Feng Date: Tue, 26 Nov 2024 18:02:29 +0800 Subject: [PATCH 4/7] fix --- apps/www/content/docs/examples/export.mdx | 9 --------- .../default/plate-ui/pdf-toolbar-button.tsx | 17 ++++++++++------- apps/www/src/styles/globals.css | 3 +-- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/apps/www/content/docs/examples/export.mdx b/apps/www/content/docs/examples/export.mdx index 13047dcb2f..1bd5321f7d 100644 --- a/apps/www/content/docs/examples/export.mdx +++ b/apps/www/content/docs/examples/export.mdx @@ -17,15 +17,6 @@ title: Export Install the [PDF Toolbar Button](/docs/plate-ui/pdf-toolbar-button) component. -Note: When using Tailwind CSS, you may encounter background color issues. Please refer to [this link](https://github.com/niklasvh/html2canvas/issues/2775#issuecomment-1204988157) for a solution. - -Add the following CSS to fix background color rendering issues with html2canvas: -```css -@layer base { - img { - @apply inline-block; - } -} ``` ## Examples diff --git a/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx b/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx index 95e7294bd4..9e66c857d0 100644 --- a/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx +++ b/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx @@ -3,8 +3,7 @@ import React from 'react'; import { withRef } from '@udecode/cn'; -import { useEditorRef } from '@udecode/plate-core/react'; -import { toDOMNode } from '@udecode/slate-react'; +import { toDOMNode, useEditorRef } from '@udecode/plate-common/react'; import { ToolbarButton } from './toolbar'; @@ -19,11 +18,15 @@ export const PdfToolbarButton = withRef( onClick={async () => { const { default: html2canvas } = await import('html2canvas'); - const canvas = await html2canvas(toDOMNode(editor, editor)!, { - onclone(document, element) { - console.log(document, element, 'fj'); - }, - }); + const style = document.createElement('style'); + document.head.append(style); + style.sheet?.insertRule( + 'body > div:last-child img { display: inline-block !important; }' + ); + + const canvas = await html2canvas(toDOMNode(editor, editor)!); + + style.remove(); const PDFLib = await import('pdf-lib'); const pdfDoc = await PDFLib.PDFDocument.create(); diff --git a/apps/www/src/styles/globals.css b/apps/www/src/styles/globals.css index fcd6919efd..2b938fc049 100644 --- a/apps/www/src/styles/globals.css +++ b/apps/www/src/styles/globals.css @@ -2,7 +2,6 @@ @tailwind components; @tailwind utilities; -/* global.css */ @layer base { :root { --background: 0 0% 100%; @@ -36,7 +35,7 @@ --brand: 217.2 91.2% 59.8%; --highlight: 47.9 95.8% 53.1%; - + .prose { --tw-prose-body: var(--foreground); --tw-prose-bold: inherit; From 3cea502ce345d6d4cbd0e1eefbc63725c20d8b20 Mon Sep 17 00:00:00 2001 From: Felix Feng Date: Tue, 26 Nov 2024 19:31:02 +0800 Subject: [PATCH 5/7] toolbar --- .../plate-ui/fixed-toolbar-buttons.tsx | 6 +- .../default/plate-ui/pdf-toolbar-button.tsx | 141 +++++++++++++----- 2 files changed, 104 insertions(+), 43 deletions(-) diff --git a/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx b/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx index 8176d93db3..b0be70b8b6 100644 --- a/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx +++ b/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx @@ -53,7 +53,7 @@ import { MarkToolbarButton } from './mark-toolbar-button'; import { MediaToolbarButton } from './media-toolbar-button'; import { ModeDropdownMenu } from './mode-dropdown-menu'; import { OutdentToolbarButton } from './outdent-toolbar-button'; -import { PdfToolbarButton } from './pdf-toolbar-button'; +import { ExportToolbarButton } from './pdf-toolbar-button'; import { TableDropdownMenu } from './table-dropdown-menu'; import { ToggleToolbarButton } from './toggle-toolbar-button'; import { ToolbarGroup } from './toolbar'; @@ -78,9 +78,9 @@ export function FixedToolbarButtons() { - + - + diff --git a/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx b/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx index 9e66c857d0..1398ef2006 100644 --- a/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx +++ b/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx @@ -4,54 +4,115 @@ import React from 'react'; import { withRef } from '@udecode/cn'; import { toDOMNode, useEditorRef } from '@udecode/plate-common/react'; +import { ArrowDownToLineIcon } from 'lucide-react'; -import { ToolbarButton } from './toolbar'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuTrigger, + useOpenState, +} from './dropdown-menu'; +import { + ToolbarSplitButton, + ToolbarSplitButtonPrimary, + ToolbarSplitButtonSecondary, +} from './toolbar'; -export const PdfToolbarButton = withRef( - ({ children, ...rest }, ref) => { +export const ExportToolbarButton = withRef( + ({ children, ...props }, ref) => { const editor = useEditorRef(); + const openState = useOpenState(); + + const getCanvas = async () => { + const { default: html2canvas } = await import('html2canvas'); + + const style = document.createElement('style'); + document.head.append(style); + style.sheet?.insertRule( + 'body > div:last-child img { display: inline-block !important; }' + ); + + const canvas = await html2canvas(toDOMNode(editor, editor)!); + style.remove(); + + return canvas; + }; + + const downloadFile = (href: string, filename: string) => { + const element = document.createElement('a'); + element.setAttribute('href', href); + element.setAttribute('download', filename); + element.style.display = 'none'; + document.body.append(element); + element.click(); + element.remove(); + }; + + const exportToPdf = async () => { + const canvas = await getCanvas(); + + const PDFLib = await import('pdf-lib'); + const pdfDoc = await PDFLib.PDFDocument.create(); + const page = pdfDoc.addPage([canvas.width, canvas.height]); + const imageEmbed = await pdfDoc.embedPng(canvas.toDataURL('PNG')); + + page.drawImage(imageEmbed, { + height: canvas.height, + width: canvas.width, + x: 0, + y: 0, + }); + const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true }); + + downloadFile(pdfBase64, 'plate.pdf'); + }; + + const exportToImage = async () => { + const canvas = await getCanvas(); + downloadFile(canvas.toDataURL('image/png'), 'plate.png'); + }; return ( - { - const { default: html2canvas } = await import('html2canvas'); - - const style = document.createElement('style'); - document.head.append(style); - style.sheet?.insertRule( - 'body > div:last-child img { display: inline-block !important; }' - ); - - const canvas = await html2canvas(toDOMNode(editor, editor)!); - - style.remove(); - - const PDFLib = await import('pdf-lib'); - const pdfDoc = await PDFLib.PDFDocument.create(); - const page = pdfDoc.addPage([canvas.width, canvas.height]); - const imageEmbed = await pdfDoc.embedPng(canvas.toDataURL('PNG')); - - page.drawImage(imageEmbed, { - height: canvas.height, - width: canvas.width, - x: 0, - y: 0, - }); - const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true }); - - const element = document.createElement('a'); - element.setAttribute('href', pdfBase64); - element.setAttribute('download', 'plate.pdf'); - element.style.display = 'none'; - document.body.append(element); - element.click(); - element.remove(); + onClick={exportToPdf} + onKeyDown={(e) => { + if (e.key === 'ArrowDown') { + e.preventDefault(); + openState.onOpenChange(true); + } }} + pressed={openState.open} + tooltip="Export" + {...props} > - {children} - + + + + + + + + + + e.stopPropagation()} + align="start" + alignOffset={-32} + > + + + Export as PDF + + + Export via Image + + + + + ); } ); From ce59e1df1e0faf64abb956224d19d7173b0a6be7 Mon Sep 17 00:00:00 2001 From: Felix Feng Date: Tue, 26 Nov 2024 19:40:47 +0800 Subject: [PATCH 6/7] fix --- apps/www/public/ai-selection.png | Bin 109790 -> 0 bytes apps/www/public/r/index.json | 31 ++++++++++++++++ apps/www/public/r/styles/default/editor.json | 2 +- .../public/r/styles/default/export-demo.json | 13 ------- .../styles/default/export-toolbar-button.json | 33 ++++++++++++++++++ .../styles/default/fixed-toolbar-buttons.json | 2 +- apps/www/src/__registry__/index.tsx | 16 +++++++++ ...r-button.tsx => export-toolbar-button.tsx} | 0 .../plate-ui/fixed-toolbar-buttons.tsx | 2 +- apps/www/src/registry/registry-ui.ts | 6 ++-- 10 files changed, 87 insertions(+), 18 deletions(-) delete mode 100644 apps/www/public/ai-selection.png delete mode 100644 apps/www/public/r/styles/default/export-demo.json create mode 100644 apps/www/public/r/styles/default/export-toolbar-button.json rename apps/www/src/registry/default/plate-ui/{pdf-toolbar-button.tsx => export-toolbar-button.tsx} (100%) diff --git a/apps/www/public/ai-selection.png b/apps/www/public/ai-selection.png deleted file mode 100644 index a512f46326065a6885c97c46ea232d10c6a8eee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109790 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π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 &\n VariantProps) => {\n const editor = useEditorRef();\n const containerRef = useEditorContainerRef();\n\n return (\n \n );\n};\n\nEditorContainer.displayName = 'EditorContainer';\n\nconst editorVariants = cva(\n cn(\n 'group/editor',\n 'relative w-full overflow-x-hidden whitespace-pre-wrap break-words',\n 'rounded-md ring-offset-background placeholder:text-muted-foreground/80 focus-visible:outline-none',\n '[&_[data-slate-placeholder]]:text-muted-foreground/80 [&_[data-slate-placeholder]]:!opacity-100',\n '[&_[data-slate-placeholder]]:top-[auto_!important]',\n '[&_strong]:font-bold'\n ),\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n disabled: {\n true: 'cursor-not-allowed opacity-50',\n },\n focused: {\n true: 'ring-2 ring-ring ring-offset-2',\n },\n variant: {\n ai: 'w-full px-0 text-base md:text-sm',\n aiChat:\n 'max-h-[min(70vh,320px)] w-full max-w-[700px] overflow-y-auto px-3 py-2 text-base md:text-sm',\n default:\n 'size-full px-16 pb-72 pt-4 text-base sm:px-[max(64px,calc(50%-350px))]',\n demo: 'size-full px-16 pb-72 pt-4 text-base sm:px-[max(64px,calc(50%-350px))]',\n fullWidth: 'size-full px-16 pb-72 pt-4 text-base sm:px-24',\n none: '',\n },\n },\n }\n);\n\nexport type EditorProps = PlateContentProps &\n VariantProps;\n\nexport const Editor = React.forwardRef(\n ({ className, disabled, focused, variant, ...props }, ref) => {\n return (\n \n );\n }\n);\n\nEditor.displayName = 'Editor';\n", + "content": "'use client';\n\nimport React from 'react';\n\nimport type { PlateContentProps } from '@udecode/plate-common/react';\nimport type { VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@udecode/cn';\nimport {\n PlateContent,\n useEditorContainerRef,\n useEditorRef,\n} from '@udecode/plate-common/react';\nimport { cva } from 'class-variance-authority';\n\nconst editorContainerVariants = cva(\n 'relative w-full cursor-text overflow-y-auto caret-primary selection:bg-brand/25 [&_.slate-selection-area]:border [&_.slate-selection-area]:border-brand/25 [&_.slate-selection-area]:bg-brand/15',\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n default: 'h-full',\n demo: 'h-[650px]',\n },\n },\n }\n);\n\nexport const EditorContainer = ({\n className,\n variant,\n ...props\n}: React.HTMLAttributes &\n VariantProps) => {\n const editor = useEditorRef();\n const containerRef = useEditorContainerRef();\n\n return (\n \n );\n};\n\nEditorContainer.displayName = 'EditorContainer';\n\nconst editorVariants = cva(\n cn(\n 'group/editor',\n 'relative w-full overflow-x-hidden whitespace-pre-wrap break-words',\n 'rounded-md ring-offset-background placeholder:text-muted-foreground/80 focus-visible:outline-none',\n '[&_[data-slate-placeholder]]:text-muted-foreground/80 [&_[data-slate-placeholder]]:!opacity-100',\n '[&_[data-slate-placeholder]]:top-[auto_!important]',\n '[&_strong]:font-bold'\n ),\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n disabled: {\n true: 'cursor-not-allowed opacity-50',\n },\n focused: {\n true: 'ring-2 ring-ring ring-offset-2',\n },\n variant: {\n ai: 'w-full px-0 text-base md:text-sm',\n aiChat:\n 'max-h-[min(70vh,320px)] w-full max-w-[700px] overflow-y-auto px-3 py-2 text-base md:text-sm',\n default:\n 'size-full px-16 pb-72 pt-4 text-base sm:px-[max(64px,calc(50%-350px))]',\n demo: 'size-full px-16 pb-72 pt-4 text-base sm:px-[max(64px,calc(50%-350px))]',\n fullWidth: 'size-full px-16 pb-72 pt-4 text-base sm:px-24',\n none: '',\n },\n },\n }\n);\n\nexport type EditorProps = PlateContentProps &\n VariantProps;\n\nexport const Editor = React.forwardRef(\n ({ className, disabled, focused, variant, ...props }, ref) => {\n return (\n \n );\n }\n);\n\nEditor.displayName = 'Editor';\n", "path": "plate-ui/editor.tsx", "target": "components/plate-ui/editor.tsx", "type": "registry:ui" diff --git a/apps/www/public/r/styles/default/export-demo.json b/apps/www/public/r/styles/default/export-demo.json deleted file mode 100644 index 3545345a2a..0000000000 --- a/apps/www/public/r/styles/default/export-demo.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "files": [ - { - "content": "'use client';\n\nimport React from 'react';\n\nimport {\n Plate,\n PlateContent,\n usePlateEditor,\n} from '@udecode/plate-common/react';\n\nexport default function BasicEditorDefaultDemo() {\n const editor = usePlateEditor();\n\n return (\n \n \n \n );\n}\n", - "path": "example/export-demo.tsx", - "target": "components/export-demo.tsx", - "type": "registry:example" - } - ], - "name": "export-demo", - "registryDependencies": [], - "type": "registry:example" -} \ No newline at end of file diff --git a/apps/www/public/r/styles/default/export-toolbar-button.json b/apps/www/public/r/styles/default/export-toolbar-button.json new file mode 100644 index 0000000000..de06793503 --- /dev/null +++ b/apps/www/public/r/styles/default/export-toolbar-button.json @@ -0,0 +1,33 @@ +{ + "dependencies": [ + "html2canvas", + "pdf-lib" + ], + "doc": { + "description": "A toolbar button to export editor content as PDF.", + "docs": [ + { + "route": "/docs/export", + "title": "Export" + } + ], + "examples": [ + "basic-nodes-demo" + ], + "label": "New", + "title": "PDF Toolbar Button" + }, + "files": [ + { + "content": "'use client';\n\nimport React from 'react';\n\nimport { withRef } from '@udecode/cn';\nimport { toDOMNode, useEditorRef } from '@udecode/plate-common/react';\nimport { ArrowDownToLineIcon } from 'lucide-react';\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n useOpenState,\n} from './dropdown-menu';\nimport {\n ToolbarSplitButton,\n ToolbarSplitButtonPrimary,\n ToolbarSplitButtonSecondary,\n} from './toolbar';\n\nexport const ExportToolbarButton = withRef(\n ({ children, ...props }, ref) => {\n const editor = useEditorRef();\n const openState = useOpenState();\n\n const getCanvas = async () => {\n const { default: html2canvas } = await import('html2canvas');\n\n const style = document.createElement('style');\n document.head.append(style);\n style.sheet?.insertRule(\n 'body > div:last-child img { display: inline-block !important; }'\n );\n\n const canvas = await html2canvas(toDOMNode(editor, editor)!);\n style.remove();\n\n return canvas;\n };\n\n const downloadFile = (href: string, filename: string) => {\n const element = document.createElement('a');\n element.setAttribute('href', href);\n element.setAttribute('download', filename);\n element.style.display = 'none';\n document.body.append(element);\n element.click();\n element.remove();\n };\n\n const exportToPdf = async () => {\n const canvas = await getCanvas();\n\n const PDFLib = await import('pdf-lib');\n const pdfDoc = await PDFLib.PDFDocument.create();\n const page = pdfDoc.addPage([canvas.width, canvas.height]);\n const imageEmbed = await pdfDoc.embedPng(canvas.toDataURL('PNG'));\n\n page.drawImage(imageEmbed, {\n height: canvas.height,\n width: canvas.width,\n x: 0,\n y: 0,\n });\n const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });\n\n downloadFile(pdfBase64, 'plate.pdf');\n };\n\n const exportToImage = async () => {\n const canvas = await getCanvas();\n downloadFile(canvas.toDataURL('image/png'), 'plate.png');\n };\n\n return (\n {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n openState.onOpenChange(true);\n }\n }}\n pressed={openState.open}\n tooltip=\"Export\"\n {...props}\n >\n \n \n \n\n \n \n \n \n\n e.stopPropagation()}\n align=\"start\"\n alignOffset={-32}\n >\n \n \n Export as PDF\n \n \n Export via Image\n \n \n \n \n \n );\n }\n);\n", + "path": "plate-ui/export-toolbar-button.tsx", + "target": "components/plate-ui/export-toolbar-button.tsx", + "type": "registry:ui" + } + ], + "name": "export-toolbar-button", + "registryDependencies": [ + "toolbar" + ], + "type": "registry:ui" +} \ No newline at end of file diff --git a/apps/www/public/r/styles/default/fixed-toolbar-buttons.json b/apps/www/public/r/styles/default/fixed-toolbar-buttons.json index 56123e44d0..0b21aa2448 100644 --- a/apps/www/public/r/styles/default/fixed-toolbar-buttons.json +++ b/apps/www/public/r/styles/default/fixed-toolbar-buttons.json @@ -14,7 +14,7 @@ }, "files": [ { - "content": "'use client';\n\nimport React from 'react';\n\nimport {\n BoldPlugin,\n CodePlugin,\n ItalicPlugin,\n StrikethroughPlugin,\n UnderlinePlugin,\n} from '@udecode/plate-basic-marks/react';\nimport { useEditorReadOnly } from '@udecode/plate-common/react';\nimport {\n FontBackgroundColorPlugin,\n FontColorPlugin,\n} from '@udecode/plate-font/react';\nimport { HighlightPlugin } from '@udecode/plate-highlight/react';\nimport { ListStyleType } from '@udecode/plate-indent-list';\nimport {\n AudioPlugin,\n FilePlugin,\n ImagePlugin,\n VideoPlugin,\n} from '@udecode/plate-media/react';\nimport {\n ArrowUpToLineIcon,\n BaselineIcon,\n BoldIcon,\n Code2Icon,\n HighlighterIcon,\n ItalicIcon,\n PaintBucketIcon,\n StrikethroughIcon,\n UnderlineIcon,\n WandSparklesIcon,\n} from 'lucide-react';\n\nimport { MoreDropdownMenu } from '@/components/plate-ui/more-dropdown-menu';\n\nimport { AIToolbarButton } from './ai-toolbar-button';\nimport { AlignDropdownMenu } from './align-dropdown-menu';\nimport { ColorDropdownMenu } from './color-dropdown-menu';\nimport { CommentToolbarButton } from './comment-toolbar-button';\nimport { EmojiDropdownMenu } from './emoji-dropdown-menu';\nimport { RedoToolbarButton, UndoToolbarButton } from './history-toolbar-button';\nimport { IndentListToolbarButton } from './indent-list-toolbar-button';\nimport { IndentTodoToolbarButton } from './indent-todo-toolbar-button';\nimport { IndentToolbarButton } from './indent-toolbar-button';\nimport { InsertDropdownMenu } from './insert-dropdown-menu';\nimport { LineHeightDropdownMenu } from './line-height-dropdown-menu';\nimport { LinkToolbarButton } from './link-toolbar-button';\nimport { MarkToolbarButton } from './mark-toolbar-button';\nimport { MediaToolbarButton } from './media-toolbar-button';\nimport { ModeDropdownMenu } from './mode-dropdown-menu';\nimport { OutdentToolbarButton } from './outdent-toolbar-button';\nimport { PdfToolbarButton } from './pdf-toolbar-button';\nimport { TableDropdownMenu } from './table-dropdown-menu';\nimport { ToggleToolbarButton } from './toggle-toolbar-button';\nimport { ToolbarGroup } from './toolbar';\nimport { TurnIntoDropdownMenu } from './turn-into-dropdown-menu';\n\nexport function FixedToolbarButtons() {\n const readOnly = useEditorReadOnly();\n\n return (\n

\n {!readOnly && (\n <>\n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n\n \n \n\n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n )}\n\n
\n\n \n \n \n \n \n \n\n \n \n \n
\n );\n}\n", + "content": "'use client';\n\nimport React from 'react';\n\nimport {\n BoldPlugin,\n CodePlugin,\n ItalicPlugin,\n StrikethroughPlugin,\n UnderlinePlugin,\n} from '@udecode/plate-basic-marks/react';\nimport { useEditorReadOnly } from '@udecode/plate-common/react';\nimport {\n FontBackgroundColorPlugin,\n FontColorPlugin,\n} from '@udecode/plate-font/react';\nimport { HighlightPlugin } from '@udecode/plate-highlight/react';\nimport { ListStyleType } from '@udecode/plate-indent-list';\nimport {\n AudioPlugin,\n FilePlugin,\n ImagePlugin,\n VideoPlugin,\n} from '@udecode/plate-media/react';\nimport {\n ArrowUpToLineIcon,\n BaselineIcon,\n BoldIcon,\n Code2Icon,\n HighlighterIcon,\n ItalicIcon,\n PaintBucketIcon,\n StrikethroughIcon,\n UnderlineIcon,\n WandSparklesIcon,\n} from 'lucide-react';\n\nimport { MoreDropdownMenu } from '@/components/plate-ui/more-dropdown-menu';\n\nimport { AIToolbarButton } from './ai-toolbar-button';\nimport { AlignDropdownMenu } from './align-dropdown-menu';\nimport { ColorDropdownMenu } from './color-dropdown-menu';\nimport { CommentToolbarButton } from './comment-toolbar-button';\nimport { EmojiDropdownMenu } from './emoji-dropdown-menu';\nimport { ExportToolbarButton } from './export-toolbar-button';\nimport { RedoToolbarButton, UndoToolbarButton } from './history-toolbar-button';\nimport { IndentListToolbarButton } from './indent-list-toolbar-button';\nimport { IndentTodoToolbarButton } from './indent-todo-toolbar-button';\nimport { IndentToolbarButton } from './indent-toolbar-button';\nimport { InsertDropdownMenu } from './insert-dropdown-menu';\nimport { LineHeightDropdownMenu } from './line-height-dropdown-menu';\nimport { LinkToolbarButton } from './link-toolbar-button';\nimport { MarkToolbarButton } from './mark-toolbar-button';\nimport { MediaToolbarButton } from './media-toolbar-button';\nimport { ModeDropdownMenu } from './mode-dropdown-menu';\nimport { OutdentToolbarButton } from './outdent-toolbar-button';\nimport { TableDropdownMenu } from './table-dropdown-menu';\nimport { ToggleToolbarButton } from './toggle-toolbar-button';\nimport { ToolbarGroup } from './toolbar';\nimport { TurnIntoDropdownMenu } from './turn-into-dropdown-menu';\n\nexport function FixedToolbarButtons() {\n const readOnly = useEditorReadOnly();\n\n return (\n
\n {!readOnly && (\n <>\n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n\n \n \n\n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n )}\n\n
\n\n \n \n \n \n \n \n\n \n \n \n
\n );\n}\n", "path": "plate-ui/fixed-toolbar-buttons.tsx", "target": "components/plate-ui/fixed-toolbar-buttons.tsx", "type": "registry:ui" diff --git a/apps/www/src/__registry__/index.tsx b/apps/www/src/__registry__/index.tsx index 963a3b6c6d..ae0e0695c2 100644 --- a/apps/www/src/__registry__/index.tsx +++ b/apps/www/src/__registry__/index.tsx @@ -917,6 +917,22 @@ export const Index: Record = { subcategory: "", chunks: [] }, + "export-toolbar-button": { + name: "export-toolbar-button", + description: "", + type: "registry:ui", + registryDependencies: ["toolbar"], + files: [{ + path: "src/registry/default/plate-ui/export-toolbar-button.tsx", + type: "registry:ui", + target: "" + }], + component: React.lazy(() => import("@/registry/default/plate-ui/export-toolbar-button.tsx")), + source: "", + category: "", + subcategory: "", + chunks: [] + }, "caption": { name: "caption", description: "", diff --git a/apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx b/apps/www/src/registry/default/plate-ui/export-toolbar-button.tsx similarity index 100% rename from apps/www/src/registry/default/plate-ui/pdf-toolbar-button.tsx rename to apps/www/src/registry/default/plate-ui/export-toolbar-button.tsx diff --git a/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx b/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx index b0be70b8b6..9778dff638 100644 --- a/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx +++ b/apps/www/src/registry/default/plate-ui/fixed-toolbar-buttons.tsx @@ -42,6 +42,7 @@ import { AlignDropdownMenu } from './align-dropdown-menu'; import { ColorDropdownMenu } from './color-dropdown-menu'; import { CommentToolbarButton } from './comment-toolbar-button'; import { EmojiDropdownMenu } from './emoji-dropdown-menu'; +import { ExportToolbarButton } from './export-toolbar-button'; import { RedoToolbarButton, UndoToolbarButton } from './history-toolbar-button'; import { IndentListToolbarButton } from './indent-list-toolbar-button'; import { IndentTodoToolbarButton } from './indent-todo-toolbar-button'; @@ -53,7 +54,6 @@ import { MarkToolbarButton } from './mark-toolbar-button'; import { MediaToolbarButton } from './media-toolbar-button'; import { ModeDropdownMenu } from './mode-dropdown-menu'; import { OutdentToolbarButton } from './outdent-toolbar-button'; -import { ExportToolbarButton } from './pdf-toolbar-button'; import { TableDropdownMenu } from './table-dropdown-menu'; import { ToggleToolbarButton } from './toggle-toolbar-button'; import { ToolbarGroup } from './toolbar'; diff --git a/apps/www/src/registry/registry-ui.ts b/apps/www/src/registry/registry-ui.ts index 0049b01c40..5b7bcf1537 100644 --- a/apps/www/src/registry/registry-ui.ts +++ b/apps/www/src/registry/registry-ui.ts @@ -114,8 +114,10 @@ export const uiComponents: Registry = [ label: 'New', title: 'PDF Toolbar Button', }, - files: ['plate-ui/pdf-toolbar-button.tsx'], - name: 'pdf-toolbar-button', + files: [ + { path: 'plate-ui/export-toolbar-button.tsx', type: 'registry:ui' }, + ], + name: 'export-toolbar-button', registryDependencies: ['toolbar'], type: 'registry:ui', }, From c94b28c6a43497f666890811b7efc08497814116 Mon Sep 17 00:00:00 2001 From: Felix Feng Date: Tue, 26 Nov 2024 19:42:38 +0800 Subject: [PATCH 7/7] fix --- apps/www/src/registry/default/plate-ui/editor.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/www/src/registry/default/plate-ui/editor.tsx b/apps/www/src/registry/default/plate-ui/editor.tsx index 870a0c927e..093b79d107 100644 --- a/apps/www/src/registry/default/plate-ui/editor.tsx +++ b/apps/www/src/registry/default/plate-ui/editor.tsx @@ -46,8 +46,6 @@ export const EditorContainer = ({ editorContainerVariants({ variant }), className )} - // Adding this role attribute could cause the content captured by html2canvas to be incorrectly centered. - // role="button" {...props} /> );