diff --git a/client/src/components/RichTextEditor.jsx b/client/src/components/RichTextEditor.jsx index e9289f4..0f81773 100644 --- a/client/src/components/RichTextEditor.jsx +++ b/client/src/components/RichTextEditor.jsx @@ -25,7 +25,13 @@ function escapeHtml(s) { return String(s).replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]) } -export default function RichTextEditor({ value, onChange, pages = [] }) { +// Toolbar variants: +// 'full' — every control, incl. the internal wiki-page link picker (wiki use). +// 'post' — full minus the wiki-page picker (no page-list context in posts). +// 'minimal' — image upload only; text formatting stripped (Screenshots captions). +export default function RichTextEditor({ value, onChange, pages = [], variant = 'full' }) { + const showText = variant !== 'minimal' // bold/italic/strike, headings, lists, quotes, links + const showWikiLink = variant === 'full' && pages.length > 0 const fileRef = useRef(null) const [uploading, setUploading] = useState(false) const [linkMenu, setLinkMenu] = useState(false) @@ -90,45 +96,51 @@ export default function RichTextEditor({ value, onChange, pages = [] }) { return (
- editor.chain().focus().toggleBold().run()}> - B - - editor.chain().focus().toggleItalic().run()}> - I - - editor.chain().focus().toggleStrike().run()}> - S - - - editor.chain().focus().toggleHeading({ level: 2 }).run()}> - H2 - - editor.chain().focus().toggleHeading({ level: 3 }).run()}> - H3 - - - editor.chain().focus().toggleBulletList().run()}> - • List - - editor.chain().focus().toggleOrderedList().run()}> - 1. List - - editor.chain().focus().toggleBlockquote().run()}> - ❝ - - editor.chain().focus().toggleCodeBlock().run()}> - {''} - - editor.chain().focus().setHorizontalRule().run()}> - — - - - - 🔗 - - setLinkMenu((v) => !v)}> - 📄 - + {showText && ( + <> + editor.chain().focus().toggleBold().run()}> + B + + editor.chain().focus().toggleItalic().run()}> + I + + editor.chain().focus().toggleStrike().run()}> + S + + + editor.chain().focus().toggleHeading({ level: 2 }).run()}> + H2 + + editor.chain().focus().toggleHeading({ level: 3 }).run()}> + H3 + + + editor.chain().focus().toggleBulletList().run()}> + • List + + editor.chain().focus().toggleOrderedList().run()}> + 1. List + + editor.chain().focus().toggleBlockquote().run()}> + ❝ + + editor.chain().focus().toggleCodeBlock().run()}> + {''} + + editor.chain().focus().setHorizontalRule().run()}> + — + + + + 🔗 + + {showWikiLink && ( + setLinkMenu((v) => !v)}> + 📄 + + )} + + )} fileRef.current?.click()}> {uploading ? '…' : '🖼'} diff --git a/client/src/routes/admin/views/PostEditor.jsx b/client/src/routes/admin/views/PostEditor.jsx index 5d1df24..5747b45 100644 --- a/client/src/routes/admin/views/PostEditor.jsx +++ b/client/src/routes/admin/views/PostEditor.jsx @@ -1,7 +1,9 @@ -import { useState } from 'react' +import { lazy, Suspense, useState } from 'react' import Modal from '../../../components/Modal.jsx' import { api } from '../../../api/client.js' +const RichTextEditor = lazy(() => import('../../../components/RichTextEditor.jsx')) + const CATEGORIES = [ { v: 'news', l: 'News' }, { v: 'five-on-friday', l: 'Five on Friday' }, @@ -146,10 +148,16 @@ export default function PostEditor({ post, onClose, onSaved }) { )} -