inkora 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +509 -0
- package/dist/index.cjs +4986 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +4946 -0
- package/dist/index.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.js","../src/RichTextEditor.jsx","../src/extensions/index.js","../src/extensions/FontSize.js","../src/extensions/LineHeight.js","../src/extensions/Callout.js","../src/extensions/Video.js","../src/extensions/Audio.js","../src/extensions/Hashtag.js","../src/components/CodeBlock.jsx","../src/components/ImageNodeView.jsx","../src/components/VideoNodeView.jsx","../src/components/YoutubeNodeView.jsx","../src/extensions/suggestions.jsx","../src/extensions/Math.jsx","../src/styles.js","../src/components/Toolbar.jsx","../src/components/Icons.jsx","../src/components/BubbleMenu.jsx","../src/BasicTextEditor.jsx","../src/RichTextViewer.jsx"],"sourcesContent":["// ─── Inkora Editor ────────────────────────────────────────────────────────────\n// Usage: import { InkoraEditor, InkoraBasicEditor, InkoraViewer } from 'inkora'\n\n// Full-featured editor: menu bar, media, tables, math, dark mode\nexport { InkoraEditor } from './RichTextEditor.jsx';\n\n// Lightweight editor: single toolbar, bold/italic/lists/links\nexport { InkoraBasicEditor } from './BasicTextEditor.jsx';\n\n// Read-only viewer — renders saved TipTap JSON with identical styles\nexport { InkoraViewer } from './RichTextViewer.jsx';\n\n// Extension factory — for advanced customisation / creating your own editor\nexport { createEditorExtensions } from './extensions/index.js';\n\n// Shared CSS string — inject via <style> tag or a CSS-in-JS tool if needed\nexport { editorStyles } from './styles.js';\n","'use client';\n\nimport React, { useEffect, useState, useMemo, useCallback, useRef } from 'react';\nimport { useEditor, EditorContent } from '@tiptap/react';\nimport { createEditorExtensions } from './extensions/index.js';\nimport { editorStyles } from './styles.js';\nimport Toolbar from './components/Toolbar.jsx';\nimport BubbleMenu from './components/BubbleMenu.jsx';\n\nconst LIGHT_VARS = {\n '--rte-page': '#ffffff',\n '--rte-bar': '#ffffff',\n '--rte-pill': '#f6f8fc',\n '--rte-hover': 'rgba(60,64,67,.09)',\n '--rte-border': '#e4e7eb',\n '--rte-ink': '#202124',\n '--rte-muted': '#5f6368',\n '--rte-accent': '#0b57d0',\n '--rte-accent-soft': '#d3e3fd',\n '--rte-shadow': '0 1px 2px rgba(0,0,0,.08),0 8px 28px rgba(0,0,0,.08)',\n};\n\nconst DARK_VARS = {\n '--rte-page': '#1f2023',\n '--rte-bar': '#26272b',\n '--rte-pill': '#2b2c30',\n '--rte-hover': 'rgba(255,255,255,.09)',\n '--rte-border': '#3c4043',\n '--rte-ink': '#e8eaed',\n '--rte-muted': '#9aa0a6',\n '--rte-accent': '#8ab4f8',\n '--rte-accent-soft': '#1e3a5f',\n '--rte-shadow': '0 1px 2px rgba(0,0,0,.5),0 10px 30px rgba(0,0,0,.45)',\n};\n\n/**\n * InkoraEditor — full-featured plug-and-play rich text editor.\n *\n * Props:\n * initialContent {Object} Initial content (TipTap JSON). Optional.\n * onChange {Function} Called with TipTap JSON on every keystroke.\n * onSave {Function} Called with TipTap JSON (debounced auto-save). Optional.\n * onUpload {Function} (file: File) => Promise<{ src: string }> — media upload handler.\n * resolveMediaUrl {Function} (src: string) => string — maps stored refs to URLs.\n * onToggleTheme {Function} Called when the user clicks the dark-mode toggle.\n * theme {'light'|'dark'} Default: 'light'\n * placeholder {string} Placeholder text.\n * width {string|number} CSS width. Default: '100%'\n * height {string|number} Fixed height for the scroll container. Optional.\n * minHeight {number} Min height (px) of the scroll container. Default: 420.\n *\n * Usage:\n * import { InkoraEditor } from 'inkora';\n * <InkoraEditor width=\"100%\" minHeight={500} onChange={setContent} theme={theme} />\n */\nexport function InkoraEditor({\n initialContent,\n onSave,\n onChange,\n onUpload,\n resolveMediaUrl,\n onToggleTheme,\n theme = 'light',\n placeholder = 'Start writing…',\n width = '100%',\n height,\n minHeight = 420,\n}) {\n const [isMounted, setIsMounted] = useState(false);\n const [saveStatus, setSaveStatus] = useState('saved');\n const [isFullscreen, setIsFullscreen] = useState(false);\n const editorRef = useRef(null);\n\n useEffect(() => { setIsMounted(true); }, []);\n\n // Sync fullscreen state with document events (handles Esc key exits)\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement === editorRef.current);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n const toggleFullscreen = () => {\n if (!editorRef.current) return;\n if (!document.fullscreenElement) {\n editorRef.current.requestFullscreen?.().then(() => {\n setIsFullscreen(true);\n }).catch(err => {\n console.error('Error entering fullscreen:', err);\n });\n } else {\n document.exitFullscreen?.();\n setIsFullscreen(false);\n }\n };\n\n const cssVars = theme === 'dark' ? DARK_VARS : LIGHT_VARS;\n\n const extensions = useMemo(() => createEditorExtensions({\n placeholder,\n isEditable: true,\n }), [placeholder]);\n\n const handleSave = useCallback((json) => {\n if (onSave) {\n setSaveStatus('saving');\n onSave(json);\n setTimeout(() => setSaveStatus('saved'), 700);\n }\n }, [onSave]);\n\n const editor = useEditor({\n extensions,\n content: initialContent,\n immediatelyRender: false,\n onUpdate: ({ editor }) => {\n const json = editor.getJSON();\n if (onChange) onChange(json);\n },\n editorProps: {\n attributes: {\n class: 'rte-content',\n },\n handleDrop: (view, event, slice, moved) => {\n if (!moved && event.dataTransfer?.files?.[0]) {\n const file = event.dataTransfer.files[0];\n const coords = view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (!coords) return false;\n const kind = file.type.startsWith('image/') ? 'image'\n : file.type.startsWith('video/') ? 'video'\n : file.type.startsWith('audio/') ? 'audio'\n : null;\n if (!kind) return false;\n if (onUpload) {\n onUpload(file).then(result => {\n const node = view.state.schema.nodes[kind]?.create({ src: result.src });\n if (node) view.dispatch(view.state.tr.insert(coords.pos, node));\n });\n } else if (kind === 'image') {\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n const src = readerEvent.target.result;\n const node = view.state.schema.nodes.image?.create({ src });\n if (node) view.dispatch(view.state.tr.insert(coords.pos, node));\n };\n reader.readAsDataURL(file);\n } else {\n alert(`Missing 'onUpload' adapter prop to upload ${kind} files.`);\n }\n return true;\n }\n return false;\n },\n handlePaste: (view, event) => {\n const items = Array.from(event.clipboardData?.items || []);\n const imageItem = items.find(i => i.type.startsWith('image/'));\n if (imageItem) {\n const file = imageItem.getAsFile();\n if (onUpload) {\n onUpload(file).then(result => {\n const node = view.state.schema.nodes.image?.create({ src: result.src });\n if (node) view.dispatch(view.state.tr.replaceSelectionWith(node));\n });\n } else {\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n const src = readerEvent.target.result;\n const node = view.state.schema.nodes.image?.create({ src });\n if (node) view.dispatch(view.state.tr.replaceSelectionWith(node));\n };\n reader.readAsDataURL(file);\n }\n return true;\n }\n return false;\n },\n },\n });\n\n useEffect(() => {\n if (!editor || !onSave) return;\n setSaveStatus('unsaved');\n const t = setTimeout(() => handleSave(editor.getJSON()), 1000);\n return () => clearTimeout(t);\n }, [editor?.state.doc, handleSave]);\n\n const wordCount = editor?.storage.characterCount.words() ?? 0;\n const charCount = editor?.storage.characterCount.characters() ?? 0;\n\n if (!isMounted) {\n return (\n <div style={{ ...cssVars, borderRadius: 14, border: '1px solid var(--rte-border)', overflow: 'hidden', background: 'var(--rte-bar)', boxShadow: 'var(--rte-shadow)' }}>\n <div style={{ height: 44, background: 'var(--rte-bar)', borderBottom: '1px solid var(--rte-border)' }} />\n <div style={{ height: 48, background: 'var(--rte-pill)', borderBottom: '1px solid var(--rte-border)' }} />\n <div style={{ padding: '26px 34px', minHeight: 420, background: 'var(--rte-page)' }}>\n <div style={{ height: 28, borderRadius: 4, background: 'var(--rte-border)', width: '55%', marginBottom: 18 }} />\n <div style={{ height: 15, borderRadius: 4, background: 'var(--rte-border)', width: '100%', marginBottom: 10 }} />\n <div style={{ height: 15, borderRadius: 4, background: 'var(--rte-border)', width: '85%', marginBottom: 10 }} />\n <div style={{ height: 15, borderRadius: 4, background: 'var(--rte-border)', width: '70%' }} />\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={editorRef}\n className={`inkora-editor ${theme}${isFullscreen ? ' is-fullscreen' : ''}`}\n style={{\n ...cssVars,\n fontFamily: \"'Roboto', Arial, sans-serif\",\n width: isFullscreen ? '100%' : (typeof width === 'number' ? `${width}px` : width),\n borderRadius: isFullscreen ? 0 : 14,\n border: isFullscreen ? 'none' : '1px solid var(--rte-border)',\n overflow: 'visible',\n background: 'var(--rte-bar)',\n boxShadow: isFullscreen ? 'none' : 'var(--rte-shadow)',\n position: 'relative',\n height: isFullscreen ? '100vh' : 'auto',\n display: isFullscreen ? 'flex' : 'block',\n flexDirection: isFullscreen ? 'column' : 'unset',\n }}\n >\n <style dangerouslySetInnerHTML={{ __html: editorStyles }} />\n\n <Toolbar\n editor={editor}\n onUpload={onUpload}\n onToggleTheme={onToggleTheme}\n theme={theme}\n isFullscreen={isFullscreen}\n onToggleFullscreen={toggleFullscreen}\n />\n\n {/* Editing surface */}\n <div className=\"rte-scroll-container\" style={{ background: 'var(--rte-page)', overflowY: 'auto', ...(isFullscreen ? { flex: 1 } : height ? { height: typeof height === 'number' ? `${height}px` : height } : { minHeight }) }}>\n <BubbleMenu editor={editor} />\n <div style={{ padding: '26px 34px', maxWidth: 860, margin: '0 auto' }}>\n <EditorContent editor={editor} />\n </div>\n </div>\n\n {/* Footer */}\n <div style={{\n display: 'flex', alignItems: 'center', gap: 16,\n padding: '8px 16px', borderTop: '1px solid var(--rte-border)',\n background: 'var(--rte-bar)', fontSize: 12, color: 'var(--rte-muted)',\n borderBottomLeftRadius: 13, borderBottomRightRadius: 13,\n }}>\n <span>{wordCount} {wordCount === 1 ? 'word' : 'words'}</span>\n <span>{charCount} {charCount === 1 ? 'character' : 'characters'}</span>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 5 }}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\">\n <path d=\"M8 9l-5 3 5 3M16 9l5 3-5 3M14 5l-4 14\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Type{' '}\n <span style={{ fontFamily: 'monospace', background: 'var(--rte-hover)', padding: '1px 6px', borderRadius: 4, margin: '0 2px' }}>/</span>\n {' '}for commands\n </span>\n <span style={{ marginLeft: 'auto', display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n {saveStatus === 'saving' && (\n <>\n <span style={{ width: 7, height: 7, borderRadius: '50%', background: '#f9ab00' }} />\n Saving…\n </>\n )}\n {saveStatus !== 'saving' && onSave && (\n <>\n <span style={{ width: 7, height: 7, borderRadius: '50%', background: '#1e8e3e' }} />\n Saved\n </>\n )}\n </span>\n </div>\n </div>\n );\n}\n","import { Extension, InputRule } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport Highlight from '@tiptap/extension-highlight';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport Color from '@tiptap/extension-color';\nimport FontFamily from '@tiptap/extension-font-family';\nimport TextAlign from '@tiptap/extension-text-align';\nimport TaskList from '@tiptap/extension-task-list';\nimport TaskItem from '@tiptap/extension-task-item';\nimport Link from '@tiptap/extension-link';\nimport Image from '@tiptap/extension-image';\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';\nimport Subscript from '@tiptap/extension-subscript';\nimport Superscript from '@tiptap/extension-superscript';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport CharacterCount from '@tiptap/extension-character-count';\nimport Mention from '@tiptap/extension-mention';\nimport Dropcursor from '@tiptap/extension-dropcursor';\nimport Gapcursor from '@tiptap/extension-gapcursor';\nimport CodeBlockLowlight from '@tiptap/extension-code-block-lowlight';\nimport GlobalDragHandle from 'tiptap-extension-global-drag-handle';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { common, createLowlight } from 'lowlight';\nimport { FontSize } from './FontSize.js';\nimport { LineHeight } from './LineHeight.js';\nimport { Callout } from './Callout.js';\nimport { Video } from './Video.js';\nimport { Audio } from './Audio.js';\nimport { Hashtag } from './Hashtag.js';\nimport CodeBlock from '../components/CodeBlock.jsx';\nimport { ImageNodeView } from '../components/ImageNodeView.jsx';\nimport { VideoNodeView } from '../components/VideoNodeView.jsx';\nimport { YoutubeNodeView } from '../components/YoutubeNodeView.jsx';\nimport suggestion from './suggestions.jsx';\nimport { Math } from './Math.jsx';\nimport Youtube from '@tiptap/extension-youtube';\n\nconst lowlight = createLowlight(common);\n\n// Emoji shortcodes: :heart: → ❤️ :smile: → 😊 :rocket: → 🚀 :fire: → 🔥\nconst EmojiInputRules = Extension.create({\n name: 'emojiInputRules',\n addInputRules() {\n return [\n new InputRule({ find: /:heart:$/, handler: ({ state, range }) => { state.tr.insertText('❤️', range.from, range.to); } }),\n new InputRule({ find: /:smile:$/, handler: ({ state, range }) => { state.tr.insertText('😊', range.from, range.to); } }),\n new InputRule({ find: /:rocket:$/, handler: ({ state, range }) => { state.tr.insertText('🚀', range.from, range.to); } }),\n new InputRule({ find: /:fire:$/, handler: ({ state, range }) => { state.tr.insertText('🔥', range.from, range.to); } }),\n ];\n },\n});\n\n/**\n * Shared extension factory for both Editor and Viewer.\n *\n * @param {Object} config\n * @param {string} [config.placeholder]\n * @param {Object} [config.mentionOptions]\n * @param {boolean} [config.isEditable]\n * @returns {Array}\n */\nexport const createEditorExtensions = (config = {}) => {\n const { isEditable = true } = config;\n\n const extensions = [\n StarterKit.configure({\n codeBlock: false,\n code: {\n HTMLAttributes: { class: 'rte-inline-code' },\n },\n heading: { levels: [1, 2, 3, 4, 5, 6] },\n }),\n Underline,\n EmojiInputRules,\n Highlight.configure({ multicolor: true }),\n TextStyle,\n Color,\n FontFamily,\n FontSize,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: 'rte-link',\n rel: 'noopener noreferrer',\n target: '_blank',\n },\n }),\n Image.extend({\n inline: false,\n group: 'block',\n draggable: true,\n selectable: true,\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: '100%',\n parseHTML: el => el.getAttribute('data-width') || el.style.width || '100%',\n renderHTML: attrs => ({ 'data-width': attrs.width, style: `width:${attrs.width}` }),\n },\n shape: {\n default: 'rect',\n parseHTML: el => el.getAttribute('data-shape') || 'rect',\n renderHTML: attrs => ({ 'data-shape': attrs.shape }),\n },\n frame: {\n default: 'none',\n parseHTML: el => el.getAttribute('data-frame') || 'none',\n renderHTML: attrs => ({ 'data-frame': attrs.frame }),\n },\n filters: {\n default: '',\n parseHTML: el => el.getAttribute('data-filters') || '',\n renderHTML: attrs => ({ 'data-filters': attrs.filters }),\n },\n align: {\n default: 'left',\n parseHTML: el => el.getAttribute('data-align') || 'left',\n renderHTML: attrs => ({ 'data-align': attrs.align }),\n },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(ImageNodeView);\n },\n }).configure({ allowBase64: true }),\n Table.configure({ resizable: true }),\n TableRow,\n TableHeader,\n TableCell,\n Subscript.extend({\n addKeyboardShortcuts() {\n return { 'Mod-,': () => this.editor.commands.toggleSubscript() };\n },\n }),\n Superscript.extend({\n addKeyboardShortcuts() {\n return { 'Mod-.': () => this.editor.commands.toggleSuperscript() };\n },\n }),\n Callout,\n Video.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n shape: { default: 'rect', parseHTML: el => el.getAttribute('data-shape'), renderHTML: attrs => ({ 'data-shape': attrs.shape }) },\n frame: { default: 'none', parseHTML: el => el.getAttribute('data-frame'), renderHTML: attrs => ({ 'data-frame': attrs.frame }) },\n filters: { default: '', parseHTML: el => el.getAttribute('data-filters'), renderHTML: attrs => ({ 'data-filters': attrs.filters }) },\n align: { default: 'left', parseHTML: el => el.getAttribute('data-align') || 'left', renderHTML: attrs => ({ 'data-align': attrs.align }) },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(VideoNodeView);\n },\n }),\n Audio,\n Math,\n Youtube.extend({\n addNodeView() {\n return ReactNodeViewRenderer(YoutubeNodeView);\n },\n }).configure({ width: 640, height: 360 }),\n LineHeight,\n Hashtag,\n Placeholder.configure({ placeholder: config.placeholder || 'Start writing...' }),\n CharacterCount,\n Mention.configure({\n HTMLAttributes: { class: 'rte-mention' },\n suggestion: {\n ...suggestion,\n ...config.mentionOptions?.suggestion,\n },\n }),\n Dropcursor.configure({ color: '#3b82f6', width: 2 }),\n Gapcursor,\n // CodeBlock: addNodeView MUST be in .extend(), not .configure()\n CodeBlockLowlight.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n collapsed: {\n default: false,\n parseHTML: el => el.getAttribute('data-collapsed') === 'true',\n renderHTML: attrs => ({ 'data-collapsed': attrs.collapsed }),\n },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlock);\n },\n }).configure({ lowlight }),\n ];\n\n if (isEditable) {\n extensions.push(\n GlobalDragHandle.configure({ dragHandleWidth: 20, scrollTreshold: 100 })\n );\n }\n\n return extensions;\n};\n","import { Extension } from '@tiptap/core';\r\n\r\nexport const FontSize = Extension.create({\r\n name: 'fontSize',\r\n\r\n addOptions() {\r\n return {\r\n types: ['textStyle'],\r\n };\r\n },\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: element => element.style.fontSize?.replace(/['\"]+/g, ''),\r\n renderHTML: attributes => {\r\n if (!attributes.fontSize) {\r\n return {};\r\n }\r\n\r\n return {\r\n style: `font-size: ${attributes.fontSize}`,\r\n };\r\n },\r\n },\r\n },\r\n },\r\n ];\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setFontSize: fontSize => ({ chain }) => {\r\n return chain()\r\n .setMark('textStyle', { fontSize })\r\n .run();\r\n },\r\n unsetFontSize: () => ({ chain }) => {\r\n return chain()\r\n .setMark('textStyle', { fontSize: null })\r\n .removeEmptyTextStyle()\r\n .run();\r\n },\r\n };\r\n },\r\n});\r\n","import { Extension } from '@tiptap/core';\n\nexport const LineHeight = Extension.create({\n name: 'lineHeight',\n\n addOptions() {\n return {\n types: ['paragraph', 'heading'],\n defaultLineHeight: null,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: this.options.defaultLineHeight,\n parseHTML: element => element.style.lineHeight || null,\n renderHTML: attributes => {\n if (!attributes.lineHeight) {\n return {};\n }\n\n return {\n style: `line-height: ${attributes.lineHeight}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight: lineHeight => ({ tr, state }) => {\n const { from, to } = state.selection;\n let changed = false;\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (this.options.types.includes(node.type.name)) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n lineHeight,\n });\n changed = true;\n }\n });\n return changed;\n },\n unsetLineHeight: () => ({ tr, state }) => {\n const { from, to } = state.selection;\n let changed = false;\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (this.options.types.includes(node.type.name)) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n lineHeight: null,\n });\n changed = true;\n }\n });\n return changed;\n },\n };\n },\n});\n","import { Node, mergeAttributes } from '@tiptap/core';\n\nconst COLOR_STYLES = {\n blue: { background: '#eff6ff', borderColor: '#bfdbfe' },\n amber: { background: '#fffbeb', borderColor: '#fde68a' },\n red: { background: '#fff1f2', borderColor: '#fecdd3' },\n green: { background: '#f0fdf4', borderColor: '#bbf7d0' },\n gray: { background: '#f9fafb', borderColor: '#e5e7eb' },\n};\n\nexport const Callout = Node.create({\n name: 'callout',\n group: 'block',\n content: 'block+',\n\n addAttributes() {\n return {\n emoji: { default: '💡' },\n color: { default: 'blue' },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"callout\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const c = COLOR_STYLES[HTMLAttributes.color] || COLOR_STYLES.blue;\n const style = `display:flex;gap:12px;padding:14px 16px;border:1px solid ${c.borderColor};border-radius:8px;margin:12px 0;background:${c.background}`;\n return [\n 'div',\n mergeAttributes(HTMLAttributes, { 'data-type': 'callout', style }),\n ['div', { style: 'user-select:none;padding-top:1px;flex-shrink:0' }, HTMLAttributes.emoji],\n ['div', { style: 'flex:1;min-width:0' }, 0],\n ];\n },\n\n addCommands() {\n return {\n setCallout: (attributes) => ({ commands }) => commands.setNode(this.name, attributes),\n toggleCallout: (attributes) => ({ commands }) => commands.toggleNode(this.name, 'paragraph', attributes),\n };\n },\n});\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\nexport const Video = Node.create({\r\n name: 'video',\r\n group: 'block',\r\n selectable: true,\r\n draggable: true,\r\n atom: true,\r\n\r\n addAttributes() {\r\n return {\r\n src: {\r\n default: null,\r\n },\r\n poster: {\r\n default: null,\r\n },\r\n width: {\r\n default: '100%',\r\n },\r\n controls: {\r\n default: true,\r\n },\r\n autoplay: {\r\n default: false,\r\n },\r\n loop: {\r\n default: false,\r\n },\r\n muted: {\r\n default: false,\r\n },\r\n };\r\n },\r\n\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'video',\r\n },\r\n ];\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return [\r\n 'div', \r\n { class: 'video-container my-4' }, \r\n ['video', mergeAttributes(HTMLAttributes, { class: 'rounded-lg max-w-full' })]\r\n ];\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setVideo: options => ({ commands }) => {\r\n return commands.insertContent({\r\n type: this.name,\r\n attrs: options,\r\n });\r\n },\r\n };\r\n },\r\n});\r\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\nexport const Audio = Node.create({\r\n name: 'audio',\r\n group: 'block',\r\n selectable: true,\r\n draggable: true,\r\n atom: true,\r\n\r\n addAttributes() {\r\n return {\r\n src: {\r\n default: null,\r\n },\r\n controls: {\r\n default: true,\r\n },\r\n autoplay: {\r\n default: false,\r\n },\r\n loop: {\r\n default: false,\r\n },\r\n };\r\n },\r\n\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'audio',\r\n },\r\n ];\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return [\r\n 'div', \r\n { class: 'audio-container my-4' }, \r\n ['audio', mergeAttributes(HTMLAttributes, { class: 'w-full' })]\r\n ];\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setAudio: options => ({ commands }) => {\r\n return commands.insertContent({\r\n type: this.name,\r\n attrs: options,\r\n });\r\n },\r\n };\r\n },\r\n});\r\n","import { Mark, mergeAttributes, InputRule } from '@tiptap/core';\n\nexport const Hashtag = Mark.create({\n name: 'hashtag',\n\n addOptions() {\n return {\n HTMLAttributes: { class: 'rte-hashtag' },\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-type=\"hashtag\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { 'data-type': 'hashtag' }), 0];\n },\n\n addInputRules() {\n return [\n new InputRule({\n find: /(?:^|\\s)(#[a-zA-Z0-9_]+)$/,\n handler: ({ state, range, match }) => {\n const { tr } = state;\n const start = range.from + match[0].indexOf('#');\n const end = range.to;\n if (match[1]) {\n tr.addMark(start, end, this.type.create());\n tr.insertText(' ', end);\n }\n },\n }),\n ];\n },\n});\n","'use client';\nimport React, { useState } from 'react';\nimport { NodeViewWrapper, NodeViewContent } from '@tiptap/react';\n\nexport default function CodeBlock({ node, updateAttributes, extension }) {\n const { language: defaultLanguage, collapsed } = node.attrs;\n const [isCopied, setIsCopied] = useState(false);\n\n const copyToClipboard = () => {\n navigator.clipboard.writeText(node.textContent).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n });\n };\n\n const lineCount = (node.textContent.match(/\\n/g) || []).length + 1;\n const displayLang = defaultLanguage || 'plaintext';\n\n return (\n <NodeViewWrapper style={{\n display: 'block',\n margin: '20px 0',\n borderRadius: 12,\n overflow: 'hidden',\n border: '1px solid #303030',\n background: '#1e1e1e',\n boxShadow: '0 4px 16px rgba(0,0,0,.35)',\n fontFamily: 'monospace',\n }}>\n {/* Header */}\n <div contentEditable={false} style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 14px',\n background: '#252526',\n borderBottom: '1px solid #303030',\n userSelect: 'none',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n {/* Traffic lights */}\n <div style={{ display: 'flex', gap: 5 }}>\n <div style={{ width: 12, height: 12, borderRadius: '50%', background: '#ff5f57' }} />\n <div style={{ width: 12, height: 12, borderRadius: '50%', background: '#febc2e' }} />\n <div style={{ width: 12, height: 12, borderRadius: '50%', background: '#28c840' }} />\n </div>\n {/* Language selector */}\n <select\n value={displayLang}\n onChange={e => updateAttributes({ language: e.target.value })}\n contentEditable={false}\n style={{\n background: '#3c3c3c',\n color: '#cccccc',\n fontSize: 11,\n fontFamily: 'monospace',\n padding: '2px 20px 2px 7px',\n borderRadius: 4,\n border: '1px solid #555',\n outline: 'none',\n cursor: 'pointer',\n appearance: 'none',\n backgroundImage: \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23888'/%3E%3C/svg%3E\\\")\",\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'right 6px center',\n }}\n >\n <option value=\"plaintext\">plaintext</option>\n {extension.options.lowlight.listLanguages().sort().map(lang => (\n <option key={lang} value={lang}>{lang}</option>\n ))}\n </select>\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }} contentEditable={false}>\n <button\n onClick={() => updateAttributes({ collapsed: !collapsed })}\n style={{\n background: 'transparent', border: 'none', cursor: 'pointer',\n fontSize: 11, color: '#858585', padding: '2px 7px', borderRadius: 4,\n }}\n onMouseEnter={e => { e.currentTarget.style.background = '#3c3c3c'; e.currentTarget.style.color = '#cccccc'; }}\n onMouseLeave={e => { e.currentTarget.style.background = 'transparent'; e.currentTarget.style.color = '#858585'; }}\n >\n {collapsed ? '▶ Expand' : '▼ Collapse'}\n </button>\n\n <button\n onClick={copyToClipboard}\n style={{\n display: 'flex', alignItems: 'center', gap: 5,\n background: isCopied ? 'rgba(52,211,153,.15)' : 'transparent',\n border: 'none', cursor: 'pointer',\n fontSize: 11, fontWeight: 500,\n color: isCopied ? '#34d399' : '#858585',\n padding: '3px 9px', borderRadius: 4,\n transition: 'all .15s',\n }}\n onMouseEnter={e => { if (!isCopied) { e.currentTarget.style.background = '#3c3c3c'; e.currentTarget.style.color = '#cccccc'; } }}\n onMouseLeave={e => { if (!isCopied) { e.currentTarget.style.background = 'transparent'; e.currentTarget.style.color = '#858585'; } }}\n >\n {isCopied ? (\n <>\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n Copied\n </>\n ) : (\n <>\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/>\n </svg>\n Copy\n </>\n )}\n </button>\n </div>\n </div>\n\n {/* Code body */}\n {!collapsed && (\n <div style={{ display: 'flex', fontFamily: 'monospace', fontSize: 13, lineHeight: '24px', overflowX: 'auto' }}>\n {/* Line numbers */}\n <div\n contentEditable={false}\n aria-hidden=\"true\"\n style={{\n userSelect: 'none', textAlign: 'right',\n color: '#4a4a4a', background: '#1e1e1e',\n borderRight: '1px solid #303030',\n padding: '16px 10px', minWidth: '2.8rem',\n flexShrink: 0, fontSize: 12,\n }}\n >\n {Array.from({ length: lineCount }, (_, i) => (\n <div key={i} style={{ lineHeight: '24px' }}>{i + 1}</div>\n ))}\n </div>\n {/* Code content */}\n <pre style={{ flex: 1, padding: '16px', margin: 0, background: 'transparent', overflowX: 'auto' }}>\n <NodeViewContent as=\"code\" className={`language-${displayLang}`} style={{ display: 'block' }} />\n </pre>\n </div>\n )}\n\n {collapsed && (\n <div contentEditable={false} style={{\n padding: '8px 14px', color: '#858585', fontSize: 12,\n fontFamily: 'monospace', fontStyle: 'italic',\n }}>\n {lineCount} line{lineCount !== 1 ? 's' : ''} hidden — click Expand to show\n </div>\n )}\n </NodeViewWrapper>\n );\n}\n","'use client';\nimport React, { useState, useRef, useEffect } from 'react';\nimport { NodeViewWrapper } from '@tiptap/react';\n\nconst CSS = `\n.rte-img-outer { display: block; line-height: 0; }\n.rte-img-sizer { display: block; position: relative; max-width: 100%; line-height: 0; }\n.rte-img-sizer img { display: block; width: 100%; transition: filter .2s, border-radius .2s, box-shadow .2s; }\n\n.rte-rsz {\n position: absolute; width: 10px; height: 10px;\n background: #0b57d0; border: 2px solid #fff; border-radius: 2px;\n z-index: 20; box-shadow: 0 1px 4px rgba(0,0,0,.35); user-select: none;\n}\n.rte-rsz-nw { top:-5px; left:-5px; cursor:nw-resize; }\n.rte-rsz-n { top:-5px; left:calc(50% - 5px); cursor:n-resize; }\n.rte-rsz-ne { top:-5px; right:-5px; cursor:ne-resize; }\n.rte-rsz-e { top:calc(50% - 5px); right:-5px; cursor:e-resize; }\n.rte-rsz-se { bottom:-5px; right:-5px; cursor:se-resize; }\n.rte-rsz-s { bottom:-5px; left:calc(50% - 5px); cursor:s-resize; }\n.rte-rsz-sw { bottom:-5px; left:-5px; cursor:sw-resize; }\n.rte-rsz-w { top:calc(50% - 5px); left:-5px; cursor:w-resize; }\n.rte-rsz-badge {\n position:absolute; bottom:8px; left:50%; transform:translateX(-50%);\n background:rgba(11,87,208,.85); color:#fff; font-size:11px; font-weight:700;\n padding:2px 9px; border-radius:10px; pointer-events:none;\n white-space:nowrap; font-family:monospace; z-index:21;\n}\n`;\n\nfunction buildImgStyle(attrs) {\n const { shape, frame, filters } = attrs;\n const style = { display: 'block', width: '100%', height: 'auto' };\n\n if (shape === 'rounded') {\n style.borderRadius = '14px';\n } else if (shape === 'pill') {\n style.borderRadius = '999px';\n } else if (shape === 'circle') {\n style.borderRadius = '50%'; style.aspectRatio = '1/1'; style.objectFit = 'cover';\n } else if (shape === 'square') {\n style.aspectRatio = '1/1'; style.objectFit = 'cover';\n } else if (shape === 'landscape') {\n style.aspectRatio = '16/9'; style.objectFit = 'cover';\n } else if (shape === 'portrait') {\n style.aspectRatio = '3/4'; style.objectFit = 'cover';\n }\n\n if (frame === 'shadow') { style.boxShadow = '0 6px 28px rgba(0,0,0,.22)'; }\n else if (frame === 'border') { style.boxShadow = '0 0 0 3px #e4e7eb'; if (!style.borderRadius) style.borderRadius = '4px'; }\n else if (frame === 'thick') { style.boxShadow = '0 0 0 7px #e4e7eb'; if (!style.borderRadius) style.borderRadius = '4px'; }\n else if (frame === 'glow') { style.boxShadow = '0 0 0 3px #0b57d0, 0 0 22px rgba(11,87,208,.32)'; }\n else if (frame === 'vintage') { style.boxShadow = '0 0 0 5px #c8a96e, 0 4px 14px rgba(0,0,0,.22)'; }\n else if (frame === 'dark') { style.boxShadow = '0 0 0 4px #202124'; if (!style.borderRadius) style.borderRadius = '4px'; }\n\n const f = filters ? filters.split(',').filter(Boolean) : [];\n const parts = [];\n if (f.includes('invert')) parts.push('invert(1)');\n if (f.includes('grayscale')) parts.push('grayscale(1)');\n if (f.includes('sepia')) parts.push('sepia(0.75)');\n if (f.includes('blur')) parts.push('blur(2px)');\n if (f.includes('bright')) parts.push('brightness(1.35)');\n if (f.includes('contrast')) parts.push('contrast(1.4)');\n if (parts.length) style.filter = parts.join(' ');\n\n return style;\n}\n\nconst HANDLES = [\n { cls: 'nw', side: 'w' }, { cls: 'n', side: 'e' }, { cls: 'ne', side: 'e' },\n { cls: 'e', side: 'e' }, { cls: 'se', side: 'e' }, { cls: 's', side: 'e' },\n { cls: 'sw', side: 'w' }, { cls: 'w', side: 'w' },\n];\n\nexport function ImageNodeView({ node, updateAttributes, selected }) {\n const [liveWidth, setLiveWidth] = useState(null);\n const [pendingWidth, setPendingWidth] = useState(null);\n const wrapRef = useRef(null);\n const attrs = node.attrs;\n\n useEffect(() => {\n if (pendingWidth !== null && attrs.width === pendingWidth) setPendingWidth(null);\n }, [attrs.width, pendingWidth]);\n\n const onResizeStart = (e, side) => {\n e.preventDefault(); e.stopPropagation();\n const el = wrapRef.current;\n if (!el) return;\n const startX = e.clientX;\n const startW = el.getBoundingClientRect().width;\n const containerW = el.parentElement?.getBoundingClientRect().width || startW;\n const onMove = (ev) => {\n const newW = Math.max(40, Math.min(containerW, startW + (side === 'w' ? -(ev.clientX - startX) : (ev.clientX - startX))));\n setLiveWidth(Math.round(newW));\n el.style.width = `${Math.round(newW)}px`;\n };\n const onUp = (ev) => {\n const newW = Math.max(40, Math.min(containerW, startW + (side === 'w' ? -(ev.clientX - startX) : (ev.clientX - startX))));\n const pct = `${Math.max(5, Math.min(100, Math.round((newW / containerW) * 100)))}%`;\n el.style.width = '';\n setLiveWidth(null);\n setPendingWidth(pct);\n updateAttributes({ width: pct });\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n document.body.style.cursor = side === 'w' ? 'w-resize' : 'e-resize';\n document.body.style.userSelect = 'none';\n };\n\n const sizerWidth = liveWidth !== null ? `${liveWidth}px` : pendingWidth !== null ? pendingWidth : (attrs.width || '100%');\n const align = attrs.align || 'left';\n const alignStyle = align === 'center' ? { marginLeft: 'auto', marginRight: 'auto' }\n : align === 'right' ? { marginLeft: 'auto', marginRight: 0 }\n : {};\n\n return (\n <NodeViewWrapper className=\"rte-img-outer\">\n <style>{CSS}</style>\n <div ref={wrapRef} className=\"rte-img-sizer\" style={{ width: sizerWidth, ...alignStyle }}>\n <img\n src={attrs.src} alt={attrs.alt || ''} title={attrs.title || ''}\n style={{ ...buildImgStyle(attrs), outline: selected ? '2.5px solid #0b57d0' : 'none', outlineOffset: '2px' }}\n draggable={false}\n />\n {selected && (\n <>\n {HANDLES.map(h => (\n <div key={h.cls} className={`rte-rsz rte-rsz-${h.cls}`} onMouseDown={e => onResizeStart(e, h.side)} />\n ))}\n {liveWidth !== null && <div className=\"rte-rsz-badge\">{liveWidth}px</div>}\n </>\n )}\n </div>\n </NodeViewWrapper>\n );\n}\n","'use client';\nimport React, { useState, useRef, useEffect } from 'react';\nimport { NodeViewWrapper } from '@tiptap/react';\n\nconst CSS = `\n.rte-vid-outer { display: block; line-height: 0; }\n.rte-vid-sizer { display: block; position: relative; max-width: 100%; line-height: 0; }\n.rte-vid-sizer video { display: block; width: 100%; transition: filter .2s, border-radius .2s, box-shadow .2s; }\n.rte-vid-rsz {\n position: absolute; width: 10px; height: 10px;\n background: #0b57d0; border: 2px solid #fff; border-radius: 2px;\n z-index: 20; box-shadow: 0 1px 4px rgba(0,0,0,.35); user-select: none;\n}\n.rte-vid-rsz-nw { top:-5px; left:-5px; cursor:nw-resize; }\n.rte-vid-rsz-n { top:-5px; left:calc(50% - 5px); cursor:n-resize; }\n.rte-vid-rsz-ne { top:-5px; right:-5px; cursor:ne-resize; }\n.rte-vid-rsz-e { top:calc(50% - 5px); right:-5px; cursor:e-resize; }\n.rte-vid-rsz-se { bottom:-5px; right:-5px; cursor:se-resize; }\n.rte-vid-rsz-s { bottom:-5px; left:calc(50% - 5px); cursor:s-resize; }\n.rte-vid-rsz-sw { bottom:-5px; left:-5px; cursor:sw-resize; }\n.rte-vid-rsz-w { top:calc(50% - 5px); left:-5px; cursor:w-resize; }\n.rte-vid-rsz-badge {\n position:absolute; bottom:8px; left:50%; transform:translateX(-50%);\n background:rgba(11,87,208,.85); color:#fff; font-size:11px; font-weight:700;\n padding:2px 9px; border-radius:10px; pointer-events:none;\n white-space:nowrap; font-family:monospace; z-index:21;\n}\n`;\n\nfunction buildVideoStyle(attrs) {\n const { shape, frame, filters } = attrs;\n const style = { display: 'block', width: '100%' };\n\n if (shape === 'rounded') {\n style.borderRadius = '14px';\n } else if (shape === 'pill') {\n style.borderRadius = '999px';\n } else if (shape === 'circle') {\n style.borderRadius = '50%'; style.aspectRatio = '1/1'; style.objectFit = 'cover';\n } else if (shape === 'landscape') {\n style.aspectRatio = '16/9'; style.objectFit = 'cover';\n }\n\n if (frame === 'shadow') style.boxShadow = '0 6px 28px rgba(0,0,0,.22)';\n else if (frame === 'border') { style.boxShadow = '0 0 0 3px #e4e7eb'; if (!style.borderRadius) style.borderRadius = '4px'; }\n else if (frame === 'thick') { style.boxShadow = '0 0 0 7px #e4e7eb'; if (!style.borderRadius) style.borderRadius = '4px'; }\n else if (frame === 'glow') style.boxShadow = '0 0 0 3px #0b57d0, 0 0 22px rgba(11,87,208,.32)';\n else if (frame === 'vintage') style.boxShadow = '0 0 0 5px #c8a96e, 0 4px 14px rgba(0,0,0,.22)';\n else if (frame === 'dark') { style.boxShadow = '0 0 0 4px #202124'; if (!style.borderRadius) style.borderRadius = '4px'; }\n\n const f = filters ? filters.split(',').filter(Boolean) : [];\n const parts = [];\n if (f.includes('invert')) parts.push('invert(1)');\n if (f.includes('grayscale')) parts.push('grayscale(1)');\n if (f.includes('sepia')) parts.push('sepia(0.75)');\n if (f.includes('blur')) parts.push('blur(2px)');\n if (f.includes('bright')) parts.push('brightness(1.35)');\n if (f.includes('contrast')) parts.push('contrast(1.4)');\n if (parts.length) style.filter = parts.join(' ');\n\n return style;\n}\n\nconst HANDLES = [\n { cls: 'nw', side: 'w' }, { cls: 'n', side: 'e' }, { cls: 'ne', side: 'e' },\n { cls: 'e', side: 'e' }, { cls: 'se', side: 'e' }, { cls: 's', side: 'e' },\n { cls: 'sw', side: 'w' }, { cls: 'w', side: 'w' },\n];\n\nexport function VideoNodeView({ node, updateAttributes, selected }) {\n const [liveWidth, setLiveWidth] = useState(null);\n const [pendingWidth, setPendingWidth] = useState(null);\n const wrapRef = useRef(null);\n const attrs = node.attrs;\n\n useEffect(() => {\n if (pendingWidth !== null && attrs.width === pendingWidth) setPendingWidth(null);\n }, [attrs.width, pendingWidth]);\n\n const onResizeStart = (e, side) => {\n e.preventDefault(); e.stopPropagation();\n const el = wrapRef.current;\n if (!el) return;\n const startX = e.clientX;\n const startW = el.getBoundingClientRect().width;\n const containerW = el.parentElement?.getBoundingClientRect().width || startW;\n const onMove = (ev) => {\n const newW = Math.max(80, Math.min(containerW, startW + (side === 'w' ? -(ev.clientX - startX) : (ev.clientX - startX))));\n setLiveWidth(Math.round(newW));\n el.style.width = `${Math.round(newW)}px`;\n };\n const onUp = (ev) => {\n const newW = Math.max(80, Math.min(containerW, startW + (side === 'w' ? -(ev.clientX - startX) : (ev.clientX - startX))));\n const pct = `${Math.max(10, Math.min(100, Math.round((newW / containerW) * 100)))}%`;\n el.style.width = '';\n setLiveWidth(null);\n setPendingWidth(pct);\n updateAttributes({ width: pct });\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n document.body.style.cursor = side === 'w' ? 'w-resize' : 'e-resize';\n document.body.style.userSelect = 'none';\n };\n\n const sizerWidth = liveWidth !== null ? `${liveWidth}px` : pendingWidth !== null ? pendingWidth : (attrs.width || '100%');\n const align = attrs.align || 'left';\n const alignStyle = align === 'center' ? { marginLeft: 'auto', marginRight: 'auto' }\n : align === 'right' ? { marginLeft: 'auto', marginRight: 0 }\n : {};\n\n return (\n <NodeViewWrapper className=\"rte-vid-outer\">\n <style>{CSS}</style>\n <div ref={wrapRef} className=\"rte-vid-sizer\" style={{ width: sizerWidth, ...alignStyle }}>\n <video\n src={attrs.src} poster={attrs.poster}\n controls={attrs.controls !== false}\n autoPlay={attrs.autoplay} loop={attrs.loop} muted={attrs.muted}\n style={{ ...buildVideoStyle(attrs), outline: selected ? '2.5px solid #0b57d0' : 'none', outlineOffset: '2px' }}\n />\n {selected && (\n <>\n {HANDLES.map(h => (\n <div key={h.cls} className={`rte-vid-rsz rte-vid-rsz-${h.cls}`} onMouseDown={e => onResizeStart(e, h.side)} />\n ))}\n {liveWidth !== null && <div className=\"rte-vid-rsz-badge\">{liveWidth}px</div>}\n </>\n )}\n </div>\n </NodeViewWrapper>\n );\n}\n","'use client';\nimport React from 'react';\nimport { NodeViewWrapper } from '@tiptap/react';\n\nfunction getEmbedUrl(src, start) {\n if (!src) return '';\n if (src.includes('youtube.com/embed/') || src.includes('player.vimeo.com')) return src;\n\n const ytMatch = src.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([^&?/]+)/);\n if (ytMatch) {\n let url = `https://www.youtube.com/embed/${ytMatch[1]}`;\n const params = new URLSearchParams();\n if (start) params.set('start', start);\n const qs = params.toString();\n return qs ? `${url}?${qs}` : url;\n }\n\n const vimeoMatch = src.match(/vimeo\\.com\\/(\\d+)/);\n if (vimeoMatch) return `https://player.vimeo.com/video/${vimeoMatch[1]}`;\n\n return src;\n}\n\nconst CSS = `\n.rte-yt-outer { display: block; line-height: 0; margin: 4px 0; }\n.rte-yt-sizer { display: block; position: relative; max-width: 100%; }\n.rte-yt-ratio { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; border-radius: 8px; }\n.rte-yt-ratio iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; }\n`;\n\nexport function YoutubeNodeView({ node, selected }) {\n const attrs = node.attrs;\n const embedUrl = getEmbedUrl(attrs.src, attrs.start);\n\n return (\n <NodeViewWrapper className=\"rte-yt-outer\">\n <style>{CSS}</style>\n <div className=\"rte-yt-sizer\" style={{ width: '100%' }}>\n <div\n className=\"rte-yt-ratio\"\n style={{ outline: selected ? '2.5px solid #0b57d0' : 'none', outlineOffset: '2px' }}\n >\n <iframe\n src={embedUrl}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n\n {/* Border strips — clicking selects the node; center open for playback */}\n <div style={{ position:'absolute', top:0, left:0, right:0, height:'14%', zIndex:5, cursor:'pointer' }} />\n <div style={{ position:'absolute', bottom:0, left:0, right:0, height:'14%', zIndex:5, cursor:'pointer' }} />\n <div style={{ position:'absolute', top:'14%', left:0, width:'12%', bottom:'14%', zIndex:5, cursor:'pointer' }} />\n <div style={{ position:'absolute', top:'14%', right:0,width:'12%', bottom:'14%', zIndex:5, cursor:'pointer' }} />\n\n {!selected && (\n <div style={{\n position:'absolute', top:'50%', left:'50%', transform:'translate(-50%,-50%)',\n pointerEvents:'none', zIndex:6,\n width:48, height:48, borderRadius:'50%',\n background:'rgba(0,0,0,.45)', display:'flex', alignItems:'center', justifyContent:'center',\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"><polygon points=\"4,2 16,9 4,16\" fill=\"white\"/></svg>\n </div>\n )}\n </div>\n </div>\n </NodeViewWrapper>\n );\n}\n","import React from 'react';\nimport { ReactRenderer } from '@tiptap/react';\nimport tippy from 'tippy.js';\n\n// ─── Mention dropdown UI ──────────────────────────────────────────────────────\n// MentionList MUST be defined before the suggestion object that references it.\n\nconst MentionList = React.forwardRef((props, ref) => {\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n\n const selectItem = index => {\n const item = props.items[index];\n if (item) props.command({ id: item });\n };\n\n React.useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }) => {\n if (event.key === 'ArrowUp') {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length);\n return true;\n }\n if (event.key === 'ArrowDown') {\n setSelectedIndex((selectedIndex + 1) % props.items.length);\n return true;\n }\n if (event.key === 'Enter') {\n selectItem(selectedIndex);\n return true;\n }\n return false;\n },\n }));\n\n return (\n <div style={{\n background: '#fff',\n border: '1px solid #e4e7eb',\n borderRadius: 8,\n boxShadow: '0 8px 26px rgba(0,0,0,.18)',\n overflow: 'hidden',\n minWidth: 180,\n padding: '4px 0',\n fontFamily: 'inherit',\n }}>\n {props.items.length ? (\n props.items.map((item, index) => (\n <button\n key={index}\n onClick={() => selectItem(index)}\n style={{\n display: 'block',\n width: '100%',\n textAlign: 'left',\n padding: '7px 14px',\n fontSize: 13,\n border: 'none',\n cursor: 'pointer',\n background: index === selectedIndex ? '#0b57d0' : 'transparent',\n color: index === selectedIndex ? '#fff' : '#202124',\n transition: 'background .1s',\n }}\n >\n {item}\n </button>\n ))\n ) : (\n <div style={{ padding: '8px 14px', fontSize: 13, color: '#9aa0a6', fontStyle: 'italic' }}>\n No results\n </div>\n )}\n </div>\n );\n});\n\nMentionList.displayName = 'MentionList';\n\n// ─── Suggestion config ────────────────────────────────────────────────────────\n// `items` returns an empty array by default — consumers pass their own list via\n// mentionOptions.suggestion.items in the editor props.\n\nexport default {\n items: ({ query }) => {\n // Default: no built-in items. Override via editor prop:\n // <ProEditor mentionOptions={{ suggestion: { items: ({ query }) => myUsers.filter(...) } }} />\n return [];\n },\n\n render: () => {\n let component;\n let popup;\n\n return {\n onStart: props => {\n component = new ReactRenderer(MentionList, {\n props,\n editor: props.editor,\n });\n\n if (!props.clientRect) return;\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start',\n });\n },\n\n onUpdate(props) {\n component.updateProps(props);\n if (!props.clientRect) return;\n popup[0].setProps({ getReferenceClientRect: props.clientRect });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n popup[0].hide();\n return true;\n }\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n popup[0].destroy();\n component.destroy();\n },\n };\n },\n};\n","import { Node, mergeAttributes } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport React, { useState, useEffect, useRef } from 'react';\nimport katex from 'katex';\n// Consumers must add katex CSS themselves: import 'katex/dist/katex.min.css'\n\nfunction MathNodeView({ node, updateAttributes, selected }) {\n const [isEditing, setIsEditing] = useState(false);\n const [latexInput, setLatexInput] = useState(node.attrs.latex || 'e = mc^2');\n const containerRef = useRef(null);\n\n useEffect(() => {\n setLatexInput(node.attrs.latex);\n }, [node.attrs.latex]);\n\n useEffect(() => {\n if (containerRef.current && !isEditing) {\n try {\n katex.render(node.attrs.latex || '\\\\text{empty}', containerRef.current, {\n throwOnError: false,\n displayMode: true,\n });\n } catch (err) {\n containerRef.current.innerHTML = `<span style=\"color: #ef4444; font-size: 14px;\">Error: ${err.message}</span>`;\n }\n }\n }, [node.attrs.latex, isEditing]);\n\n const handleBlur = () => {\n setIsEditing(false);\n updateAttributes({ latex: latexInput });\n };\n\n const handleKeyDown = (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleBlur();\n }\n };\n\n if (isEditing) {\n return (\n <div\n contentEditable={false}\n style={{ userSelect: 'none', margin: '12px 0', padding: 12, border: '1px solid var(--rte-border)', borderRadius: 8, background: 'var(--rte-pill)' }}\n >\n <div style={{ fontSize: 11, color: 'var(--rte-muted)', marginBottom: 6, fontWeight: 600, textTransform: 'uppercase' }}>Edit LaTeX Formula</div>\n <input \n type=\"text\" \n value={latexInput}\n onChange={e => setLatexInput(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n autoFocus\n style={{\n width: '100%',\n padding: '8px 12px',\n fontSize: 14,\n fontFamily: 'var(--font-mono)',\n background: 'var(--rte-page)',\n color: 'var(--rte-ink)',\n border: '1.5px solid var(--rte-border)',\n borderRadius: 6,\n outline: 'none',\n }}\n />\n <div style={{ fontSize: 10, color: 'var(--rte-muted)', marginTop: 4 }}>Press Enter to save, or click outside.</div>\n </div>\n );\n }\n\n return (\n <div \n onClick={() => setIsEditing(true)}\n contentEditable={false}\n style={{\n display: 'flex', justifyContent: 'center', minHeight: '2.5em', alignItems: 'center',\n margin: '16px 0', padding: 8, borderRadius: 8, cursor: 'pointer',\n background: selected ? 'var(--rte-accent-soft, #d3e3fd)' : 'rgba(120,120,150,.05)',\n outline: selected ? '2px solid var(--rte-accent, #0b57d0)' : 'none',\n outlineOffset: 2, transition: 'background .15s',\n }}\n >\n <div ref={containerRef} style={{ fontSize: 18 }} />\n </div>\n );\n}\n\nexport const Math = Node.create({\n name: 'mathFormula',\n group: 'block',\n selectable: true,\n draggable: true,\n atom: true,\n\n addAttributes() {\n return {\n latex: {\n default: 'e = mc^2',\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"math-formula\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, { 'data-type': 'math-formula', class: 'math-formula' }),\n HTMLAttributes.latex\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(MathNodeView);\n },\n\n addCommands() {\n return {\n setMathFormula: options => ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n });\n },\n };\n },\n});\n","export const editorStyles = `\n .rte-content {\n outline: none;\n min-height: 100px;\n font-family: Arial, sans-serif;\n font-size: 14.67px;\n line-height: 1.25;\n color: var(--rte-ink, #202124);\n }\n\n .rte-content p.is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n float: left;\n color: var(--rte-muted, #9ca3af);\n pointer-events: none;\n height: 0;\n font-style: italic;\n }\n\n /* Headings */\n .rte-content h1 {\n font-size: 24px;\n font-weight: 600;\n line-height: 1.25;\n letter-spacing: -0.01em;\n margin: 0.4em 0 0.2em;\n }\n .rte-content h2 {\n font-size: 19px;\n font-weight: 600;\n line-height: 1.3;\n margin: 0.7em 0 0.2em;\n }\n .rte-content h3 {\n font-size: 15px;\n font-weight: 600;\n line-height: 1.35;\n margin: 0.7em 0 0.2em;\n color: var(--rte-muted, #5f6368);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .rte-content h4 { font-size: 14px; font-weight: 600; margin: 0.6em 0 0.2em; }\n .rte-content h5 { font-size: 13px; font-weight: 600; margin: 0.5em 0 0.15em; }\n .rte-content h6 { font-size: 12px; font-weight: 600; margin: 0.5em 0 0.15em; color: var(--rte-muted, #5f6368); }\n\n .rte-content h1:first-child,\n .rte-content h2:first-child,\n .rte-content h3:first-child { margin-top: 0; }\n\n .rte-content p { margin: 0 0 0.5em; }\n .rte-content p:last-child { margin-bottom: 0; }\n\n /* Links */\n .rte-content a, .rte-link {\n color: var(--rte-accent, #0b57d0);\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n .rte-content a:hover, .rte-link:hover { opacity: 0.8; }\n\n /* Inline code */\n .rte-content code:not(pre code), .rte-inline-code {\n display: inline;\n background: var(--rte-pill, #f3f4f6);\n color: #dc2626;\n border-radius: 4px;\n padding: 1px 5px;\n font-family: 'Roboto Mono', 'Fira Code', Consolas, monospace;\n font-size: 0.875em;\n border: 1px solid var(--rte-border, #e5e7eb);\n }\n\n /* Mention chip */\n .rte-mention {\n background: var(--rte-accent-soft, #d3e3fd);\n color: var(--rte-accent, #0b57d0);\n border-radius: 4px;\n padding: 1px 5px;\n font-weight: 500;\n }\n\n /* Hashtag */\n .rte-hashtag {\n color: var(--rte-accent, #0b57d0);\n cursor: pointer;\n }\n .rte-hashtag:hover { text-decoration: underline; }\n\n /* Lists */\n .rte-content ul {\n list-style-type: disc;\n padding-left: 1.5em;\n margin: 0 0 0.7em;\n }\n .rte-content ol {\n list-style-type: decimal;\n padding-left: 1.5em;\n margin: 0 0 0.7em;\n }\n .rte-content li { margin: 0.18em 0; line-height: 1.6; }\n .rte-content li > p { margin-bottom: 0.18em; }\n .rte-content ul ul, .rte-content ol ol,\n .rte-content ul ol, .rte-content ol ul {\n margin-top: 0.1em;\n margin-bottom: 0.1em;\n }\n\n /* Task Lists */\n .rte-content ul[data-type=\"taskList\"] {\n list-style: none;\n padding-left: 0.2em;\n margin: 0 0 0.7em;\n }\n .rte-content ul[data-type=\"taskList\"] li {\n display: flex;\n gap: 0.5rem;\n align-items: flex-start;\n margin: 0.3em 0;\n }\n .rte-content ul[data-type=\"taskList\"] li > label { flex-shrink: 0; margin-top: 2px; }\n .rte-content ul[data-type=\"taskList\"] input[type=\"checkbox\"] {\n cursor: pointer; width: 15px; height: 15px; border-radius: 3px;\n accent-color: var(--rte-accent, #0b57d0);\n }\n .rte-content ul[data-type=\"taskList\"] li[data-checked=\"true\"] > div {\n color: var(--rte-muted, #9ca3af); text-decoration: line-through;\n }\n\n /* Blockquote */\n .rte-content blockquote {\n border-left: 3px solid var(--rte-accent, #0b57d0);\n margin: 0 0 0.8em;\n padding: 0.25em 0 0.25em 1.1em;\n color: var(--rte-muted, #5f6368);\n font-style: italic;\n }\n\n /* Horizontal Rule */\n .rte-content hr {\n border: none;\n border-top: 1px solid var(--rte-border, #e4e7eb);\n margin: 1.1em 0;\n }\n\n /* Callout (custom node) */\n .rte-content [data-type=\"callout\"],\n .rte-content .callout {\n background: var(--rte-accent-soft, #d3e3fd);\n border: 1px solid var(--rte-accent, #0b57d0);\n border-left: 4px solid var(--rte-accent, #0b57d0);\n border-radius: 6px;\n padding: 0.75rem 1rem;\n margin: 0.8em 0;\n }\n\n /* Images */\n .rte-content img {\n max-width: 100%;\n height: auto;\n border-radius: 6px;\n margin: 0.5em 0;\n display: block;\n }\n .rte-content img.ProseMirror-selectednode {\n outline: 2px solid var(--rte-accent, #0b57d0);\n outline-offset: 2px;\n }\n\n /* Code Blocks - VS Code Dark Theme */\n .code-block-wrapper {\n position: relative;\n margin: 1.25rem 0;\n }\n .code-block-wrapper pre {\n background: #1e1e1e !important;\n color: #d4d4d4;\n font-family: 'Fira Code', 'Cascadia Code', Consolas, Monaco, monospace;\n font-size: 0.875rem;\n tab-size: 2;\n }\n\n /* Syntax highlighting - VS Code Dark theme */\n .hljs-comment, .hljs-quote { color: #6a9955; font-style: italic; }\n .hljs-keyword, .hljs-selector-tag, .hljs-literal { color: #569cd6; }\n .hljs-number { color: #b5cea8; }\n .hljs-string, .hljs-subst { color: #ce9178; }\n .hljs-function, .hljs-title { color: #dcdcaa; }\n .hljs-variable, .hljs-attribute, .hljs-tag, .hljs-name, .hljs-selector-id, .hljs-selector-class { color: #9cdcfe; }\n .hljs-built_in, .hljs-params { color: #ce9178; }\n .hljs-type { color: #4ec9b0; }\n .hljs-operator, .hljs-punctuation { color: #d4d4d4; }\n .hljs-attr { color: #9cdcfe; }\n\n /* Tables */\n .rte-content table {\n border-collapse: collapse;\n table-layout: fixed;\n width: 100%;\n margin: 0.5em 0 0.8em;\n border: 1px solid var(--rte-border, #e4e7eb);\n border-radius: 6px;\n overflow: hidden;\n }\n .rte-content td, .rte-content th {\n min-width: 3em;\n border: 1px solid var(--rte-border, #e4e7eb);\n padding: 7px 11px;\n vertical-align: top;\n box-sizing: border-box;\n position: relative;\n }\n .rte-content th {\n font-weight: 600;\n text-align: left;\n background: var(--rte-pill, #f6f8fc);\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--rte-muted, #5f6368);\n }\n .rte-content .selectedCell:after {\n z-index: 2; position: absolute; content: \"\";\n left: 0; right: 0; top: 0; bottom: 0;\n background: rgba(11,87,208,.1);\n pointer-events: none;\n }\n .rte-content .column-resize-handle {\n position: absolute; right: -2px; top: 0; bottom: -2px;\n width: 4px; background: var(--rte-accent, #0b57d0);\n pointer-events: none;\n }\n .rte-content.resize-cursor { cursor: col-resize; }\n\n /* Highlight Mark style */\n .rte-content mark,\n .viewer-inner mark {\n background-color: #fff475;\n color: #202124 !important;\n border-radius: 4px;\n padding: 1px 4px;\n margin: 0 1px;\n }\n\n /* Mention */\n .mention {\n background: var(--rte-accent-soft, #d3e3fd);\n color: var(--rte-accent, #0b57d0);\n border-radius: 4px;\n padding: 0 4px;\n font-weight: 500;\n }\n\n /* Hashtag */\n .hashtag {\n color: #7b34d6;\n font-weight: 500;\n }\n\n /* Drag handle */\n .drag-handle {\n position: fixed;\n opacity: 1;\n transition: opacity 0.2s;\n border-radius: 0.25rem;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(0,0,0,0.35)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7.55228475,8 8,8.44771525 8,9 C8,9.55228475 7.55228475,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E\");\n background-size: calc(0.5em + 0.375rem) calc(0.5em + 0.375rem);\n background-repeat: no-repeat;\n background-position: center;\n width: 1.2rem;\n height: 1.5rem;\n z-index: 50;\n cursor: grab;\n }\n .drag-handle:hover { background-color: rgba(0, 0, 0, 0.06); }\n .drag-handle:active { cursor: grabbing; }\n .drag-handle.hide { opacity: 0; pointer-events: none; }\n\n /* Dark mode overrides */\n .dark .rte-content code:not(pre code) {\n background: #2b2c30;\n color: #f87171;\n border-color: #3c4043;\n }\n .dark .rte-content mark,\n .dark .viewer-inner mark {\n background-color: #d1b01c;\n color: #1f2023 !important;\n }\n\n .dark .drag-handle {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(255,255,255,0.3)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z'%3E%3C/path%3E%3C/svg%3E\");\n }\n .dark .drag-handle:hover { background-color: rgba(255, 255, 255, 0.08); }\n`;\n","'use client';\nimport React, { useState, useRef, useEffect } from 'react';\nimport katex from 'katex';\nimport {\n BoldIcon, ItalicIcon, UnderlineIcon, StrikeIcon, CodeBlockIcon,\n LinkIcon, AlignLeftIcon, AlignCenterIcon, AlignRightIcon, AlignJustifyIcon,\n BulletListIcon, OrderedListIcon, TaskListIcon, QuoteIcon, HrIcon,\n ImageIcon, VideoIcon, AudioIcon, UndoIcon, RedoIcon,\n SubIcon, SupIcon, ChevronDownIcon, SunIcon, MoonIcon,\n PlusRowIcon, PlusColIcon, MinusRowIcon, MinusColIcon, MergeCellsIcon, CalloutIcon,\n MaximizeIcon, MinimizeIcon,\n} from './Icons.jsx';\n\nconst TOOLBAR_CSS = `\n.rte-toolbar { font-family: 'Roboto', Arial, sans-serif; }\n.rte-toolbar * { box-sizing: border-box; }\n.rte-btn {\n display: inline-flex; align-items: center; justify-content: center;\n height: 32px; min-width: 32px; padding: 0 5px; border: none;\n background: transparent; color: var(--rte-ink); border-radius: 7px;\n cursor: pointer; transition: background 0.1s, color 0.1s; flex-shrink: 0;\n}\n.rte-btn:hover { background: var(--rte-hover); }\n.rte-btn.is-active { background: var(--rte-accent-soft); color: var(--rte-accent); }\n.rte-btn:disabled { opacity: 0.38; cursor: not-allowed; pointer-events: none; }\n.rte-menu-btn {\n padding: 5px 10px; border: none; background: transparent;\n color: var(--rte-ink); font-family: 'Roboto', Arial, sans-serif;\n font-size: 13.5px; border-radius: 6px; cursor: pointer;\n transition: background 0.1s; white-space: nowrap;\n}\n.rte-menu-btn:hover, .rte-menu-btn.open { background: var(--rte-hover); }\n.rte-drop-panel {\n position: absolute; top: calc(100% + 5px); left: 0; min-width: 220px;\n background: var(--rte-bar); border: 1px solid var(--rte-border);\n border-radius: 10px; box-shadow: 0 8px 28px rgba(0,0,0,.18);\n padding: 6px; z-index: 200;\n}\n.rte-drop-item {\n display: flex; width: 100%; align-items: center; gap: 10px;\n padding: 7px 12px; background: transparent; border: none;\n color: var(--rte-ink); font-family: 'Roboto', Arial, sans-serif;\n font-size: 13px; text-align: left; border-radius: 6px; cursor: pointer;\n transition: background 0.1s;\n}\n.rte-drop-item:hover { background: var(--rte-hover); }\n.rte-drop-sep { height: 1px; background: var(--rte-border); margin: 5px 6px; }\n.rte-kbd { margin-left: auto; color: var(--rte-muted); font-size: 12px; white-space: nowrap; }\n.rte-swatch {\n width: 22px; height: 22px; border-radius: 50%;\n border: 1.5px solid var(--rte-border); cursor: pointer;\n transition: transform 0.1s, border-color 0.1s; flex-shrink: 0;\n}\n.rte-swatch:hover { transform: scale(1.15); border-color: var(--rte-muted); }\n.rte-swatch.active { border-color: var(--rte-accent); border-width: 2.5px; }\n\n.rte-drop-item-container {\n position: relative;\n width: 100%;\n}\n.rte-submenu-panel {\n position: absolute;\n top: -6px;\n left: calc(100% - 2px);\n min-width: 195px;\n background: var(--rte-bar);\n border: 1px solid var(--rte-border);\n border-radius: 10px;\n box-shadow: 0 8px 28px rgba(0,0,0,.18);\n padding: 6px;\n z-index: 250;\n}\n\n.rte-modal-overlay {\n position: fixed;\n top: 0; left: 0; right: 0; bottom: 0;\n background: rgba(15, 23, 42, 0.45);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n display: flex; align-items: center; justify-content: center;\n z-index: 500;\n animation: rte-fade-in 0.2s ease-out;\n}\n.rte-modal {\n background: var(--rte-bar);\n border: 1px solid var(--rte-border);\n border-radius: 12px;\n width: 90%; max-width: 460px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.15), 0 10px 10px -5px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n animation: rte-scale-up 0.2s cubic-bezier(0.16, 1, 0.3, 1);\n}\n.rte-modal-header {\n display: flex; align-items: center; justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--rte-border);\n}\n.rte-modal-title {\n font-size: 15px; font-weight: 600; color: var(--rte-ink);\n}\n.rte-modal-close {\n background: transparent; border: none; cursor: pointer; color: var(--rte-muted);\n display: inline-flex; align-items: center; justify-content: center;\n padding: 4px; border-radius: 6px; transition: background 0.1s;\n}\n.rte-modal-close:hover {\n background: var(--rte-hover); color: var(--rte-ink);\n}\n.rte-modal-body {\n padding: 18px;\n}\n.rte-modal-footer {\n padding: 12px 18px; border-top: 1px solid var(--rte-border);\n display: flex; justify-content: flex-end; gap: 8px;\n background: var(--rte-pill);\n}\n.rte-input {\n width: 100%; padding: 8px 12px; font-size: 13.5px; border-radius: 6px;\n border: 1.5px solid var(--rte-border); background: var(--rte-page); color: var(--rte-ink);\n outline: none; transition: border-color 0.15s;\n}\n.rte-input:focus {\n border-color: var(--rte-accent);\n}\n.rte-btn-primary {\n background: var(--rte-accent); color: white; border: none; padding: 7px 16px;\n font-size: 13px; font-weight: 500; border-radius: 6px; cursor: pointer; transition: opacity 0.1s;\n}\n.rte-btn-primary:hover { opacity: 0.9; }\n.rte-btn-secondary {\n background: transparent; color: var(--rte-ink); border: 1px solid var(--rte-border);\n padding: 7px 16px; font-size: 13px; font-weight: 500; border-radius: 6px; cursor: pointer;\n transition: background 0.1s;\n}\n.rte-btn-secondary:hover { background: var(--rte-hover); }\n.rte-modal-btn {\n background: var(--rte-pill); color: var(--rte-ink); border: 1px solid var(--rte-border);\n padding: 7px 14px; font-size: 13px; font-weight: 500; border-radius: 6px; cursor: pointer;\n transition: background 0.1s;\n}\n.rte-modal-btn:hover { background: var(--rte-hover); }\n.rte-modal-btn-primary {\n background: var(--rte-accent) !important; color: #fff !important; border-color: transparent !important;\n}\n.rte-modal-btn-primary:hover { opacity: 0.9; }\n\n.rte-gif-grid {\n display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; max-height: 200px; overflow-y: auto; margin-top: 12px;\n}\n.rte-gif-item {\n border-radius: 6px; overflow: hidden; height: 70px; border: 1.5px solid transparent; cursor: pointer; position: relative;\n}\n.rte-gif-item img {\n width: 100%; height: 100%; object-fit: cover; transition: transform 0.2s;\n}\n.rte-gif-item:hover img {\n transform: scale(1.08);\n}\n.rte-gif-item:hover {\n border-color: var(--rte-accent);\n}\n.rte-gif-label {\n position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.6); color: white; font-size: 9px; text-align: center; padding: 2px 0; font-weight: 500;\n}\n\n.rte-shape-grid {\n display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 14px;\n}\n.rte-shape-item {\n aspect-ratio: 1; border: 1px solid var(--rte-border); border-radius: 8px; display: flex; align-items: center; justify-content: center; cursor: pointer; background: var(--rte-page); transition: transform 0.1s, border-color 0.1s;\n}\n.rte-shape-item:hover {\n transform: scale(1.05); border-color: var(--rte-accent);\n}\n.rte-shape-item.active {\n border-color: var(--rte-accent); border-width: 2px; background: var(--rte-accent-soft);\n}\n\n@keyframes rte-fade-in {\n from { opacity: 0; } to { opacity: 1; }\n}\n@keyframes rte-scale-up {\n from { transform: scale(0.96); opacity: 0; } to { transform: scale(1); opacity: 1; }\n}\n`;\n\nconst TEXT_COLORS = [\n '#202124','#5f6368','#9aa0a6','#d93025','#e8710a','#f9ab00','#1e8e3e',\n '#188038','#1a73e8','#0b57d0','#7b34d6','#a142f4','#e52592','#ffffff',\n];\n\nconst HIGHLIGHT_COLORS = [\n '#fff475','#ccff90','#a7ffeb','#cbf0f8','#fdcfe8',\n '#ffc8aa','#d7aefb','#fdd663','#ffffff', null,\n];\n\nconst FONTS = [\n { label: 'Default', value: '' },\n { label: 'Arial', value: 'Arial' },\n { label: 'Georgia', value: 'Georgia' },\n { label: 'Times New Roman', value: 'Times New Roman' },\n { label: 'Roboto', value: 'Roboto' },\n { label: 'Verdana', value: 'Verdana' },\n { label: 'Courier New', value: 'Courier New' },\n];\n\nfunction Sep() {\n return <div style={{ width: 1, height: 22, background: 'var(--rte-border)', margin: '0 5px', flexShrink: 0 }} />;\n}\nfunction DropSep() {\n return <div className=\"rte-drop-sep\" />;\n}\n\nfunction DropItem({ children, kbd, onAction, style }) {\n return (\n <button\n className=\"rte-drop-item\"\n style={style}\n onMouseDown={e => { e.preventDefault(); onAction && onAction(); }}\n >\n {children}\n {kbd && <span className=\"rte-kbd\">{kbd}</span>}\n </button>\n );\n}\n\nfunction MenuBarMenu({ label, name, open, onToggle, children, panelStyle }) {\n return (\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-menu-btn${open === name ? ' open' : ''}`}\n onMouseDown={e => { e.preventDefault(); onToggle(name); }}\n >\n {label}\n </button>\n {open === name && (\n <div className=\"rte-drop-panel\" style={panelStyle}>{children}</div>\n )}\n </div>\n );\n}\n\n// ─── Table Grid Picker (inline, no overflow) ──────────────────────────────────\n\nfunction TableGridPicker({ editor, label, tableHover, setTableHover, subOpen, setSubOpen, onClose }) {\n return (\n <div\n onMouseEnter={() => setSubOpen('table')}\n onMouseLeave={() => { setSubOpen(null); setTableHover({ rows: 0, cols: 0 }); }}\n >\n <button\n className=\"rte-drop-item\"\n style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', width: '100%' }}\n onMouseDown={e => e.preventDefault()}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <span style={{ fontSize: 12 }}>⊞</span>\n {label}\n </span>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\">\n <path d={subOpen === 'table' ? 'M2 7l3-4 3 4' : 'M2 3l3 4 3-4'} />\n </svg>\n </button>\n {subOpen === 'table' && (\n <div style={{ padding: '6px 6px 8px', borderTop: '1px solid var(--rte-border)', marginTop: 2 }}>\n <div style={{\n fontSize: 11, fontWeight: 600, textAlign: 'center', marginBottom: 6,\n color: tableHover.rows > 0 ? 'var(--rte-accent)' : 'var(--rte-muted)',\n }}>\n {tableHover.rows > 0 ? `${tableHover.rows} × ${tableHover.cols} Table` : 'Hover to select size'}\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(10, 1fr)', gap: 2 }}>\n {Array.from({ length: 100 }, (_, i) => {\n const r = Math.floor(i / 10);\n const c = i % 10;\n const active = r < tableHover.rows && c < tableHover.cols;\n return (\n <div\n key={i}\n onMouseEnter={() => setTableHover({ rows: r + 1, cols: c + 1 })}\n onMouseDown={e => {\n e.preventDefault();\n editor?.chain().focus().insertTable({ rows: r + 1, cols: c + 1, withHeaderRow: true }).run();\n onClose();\n setSubOpen(null);\n setTableHover({ rows: 0, cols: 0 });\n }}\n style={{\n aspectRatio: '1', borderRadius: 2, cursor: 'pointer',\n background: active ? 'var(--rte-accent)' : 'var(--rte-pill)',\n border: `1.5px solid ${active ? 'var(--rte-accent)' : 'var(--rte-border)'}`,\n transition: 'background .05s, border-color .05s',\n }}\n />\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ─── Row 1: Menu Bar ───────────────────────────────────────────────────────────\n\nfunction MenuBar({ editor, open, onToggle, onClose, onToggleTheme, theme, imageRef, videoRef, audioRef, onSelectModal, isFullscreen, onToggleFullscreen }) {\n const [subOpen, setSubOpen] = useState(null);\n const [tableHover, setTableHover] = useState({ rows: 0, cols: 0 });\n const isInTable = editor?.isActive('table') || editor?.isActive('tableCell') || editor?.isActive('tableHeader');\n\n const insertLink = () => { onClose(); onSelectModal('link'); };\n\n const insertImage = () => { onClose(); imageRef.current?.click(); };\n const insertVideo = () => { onClose(); videoRef.current?.click(); };\n const insertAudio = () => { onClose(); audioRef.current?.click(); };\n\n const insertTable = () => {\n onClose();\n editor?.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();\n };\n\n const exportHtml = () => { onClose(); onSelectModal('html_editor'); };\n\n const newDoc = () => { onClose(); onSelectModal('confirm_clear'); };\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 1, padding: '5px 8px', borderBottom: '1px solid var(--rte-border)', position: 'relative', zIndex: 100, borderTopLeftRadius: 13, borderTopRightRadius: 13 }}>\n\n <MenuBarMenu label=\"File\" name=\"file\" open={open} onToggle={onToggle}>\n <DropItem onAction={newDoc}>New File</DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().clearContent().run(); }}>Clear</DropItem>\n <DropSep />\n <DropItem onAction={exportHtml}>Export HTML</DropItem>\n <DropItem onAction={() => { onClose(); window.print(); }} kbd=\"⌘P\">Print</DropItem>\n </MenuBarMenu>\n\n <MenuBarMenu label=\"Edit\" name=\"edit\" open={open} onToggle={onToggle}>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().undo().run(); }} kbd=\"⌘Z\">Undo</DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().redo().run(); }} kbd=\"⌘Y\">Redo</DropItem>\n <DropSep />\n <DropItem onAction={() => {\n onClose();\n const text = window.getSelection()?.toString() || '';\n if (text) {\n navigator.clipboard?.writeText(text).then(() => {\n editor?.chain().focus().deleteSelection().run();\n }).catch(() => document.execCommand('cut'));\n }\n }}>Cut</DropItem>\n <DropItem onAction={() => {\n onClose();\n const text = window.getSelection()?.toString() || '';\n if (text) navigator.clipboard?.writeText(text).catch(() => document.execCommand('copy'));\n }}>Copy</DropItem>\n <DropSep />\n <DropItem onAction={() => { onClose(); editor?.commands.selectAll(); }} kbd=\"⌘A\">Select all</DropItem>\n </MenuBarMenu>\n\n <MenuBarMenu label=\"View\" name=\"view\" open={open} onToggle={onToggle}>\n <DropItem onAction={() => { onClose(); onToggleTheme && onToggleTheme(); }}>Toggle dark mode</DropItem>\n <DropItem onAction={() => { onClose(); onSelectModal('html_editor'); }}>HTML Editor</DropItem>\n <DropItem onAction={() => {\n onClose();\n if (!document.fullscreenElement) document.documentElement.requestFullscreen?.();\n else document.exitFullscreen?.();\n }}>Full screen</DropItem>\n </MenuBarMenu>\n\n <MenuBarMenu label=\"Insert\" name=\"insert\" open={open} onToggle={onToggle}>\n {/* Upload File Submenu */}\n <div\n className=\"rte-drop-item-container\"\n onMouseEnter={() => setSubOpen('upload')}\n onMouseLeave={() => setSubOpen(null)}\n >\n <button className=\"rte-drop-item\" style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', width: '100%' }} onMouseDown={e => e.preventDefault()}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <span style={{ fontSize: 13 }}>📤</span>\n Upload File\n </span>\n <span style={{ fontSize: 9, color: 'var(--rte-muted)' }}>▶</span>\n </button>\n {subOpen === 'upload' && (\n <div className=\"rte-submenu-panel\">\n <DropItem onAction={insertImage}>\n <ImageIcon size={14} />\n Image\n </DropItem>\n <DropItem onAction={insertVideo}>\n <VideoIcon size={14} />\n Video\n </DropItem>\n <DropItem onAction={insertAudio}>\n <AudioIcon size={14} />\n Audio\n </DropItem>\n </div>\n )}\n </div>\n\n {/* Media Embed Submenu */}\n <div\n className=\"rte-drop-item-container\"\n onMouseEnter={() => setSubOpen('media')}\n onMouseLeave={() => setSubOpen(null)}\n >\n <button className=\"rte-drop-item\" style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', width: '100%' }} onMouseDown={e => e.preventDefault()}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <span style={{ fontSize: 13 }}>🌐</span>\n Media Embed\n </span>\n <span style={{ fontSize: 9, color: 'var(--rte-muted)' }}>▶</span>\n </button>\n {subOpen === 'media' && (\n <div className=\"rte-submenu-panel\">\n <DropItem onAction={() => { onClose(); onSelectModal('image_url'); }}>\n <span style={{ fontSize: 12 }}>🖼️</span> Image URL\n </DropItem>\n <DropItem onAction={() => { onClose(); onSelectModal('video_url'); }}>\n <span style={{ fontSize: 12 }}>📹</span> Video URL\n </DropItem>\n <DropItem onAction={() => { onClose(); onSelectModal('audio_url'); }}>\n <span style={{ fontSize: 12 }}>🎵</span> Audio URL\n </DropItem>\n <DropItem onAction={() => { onClose(); onSelectModal('gif'); }}>\n <span style={{ fontSize: 12 }}>🎬</span> Animated GIF\n </DropItem>\n <DropItem onAction={() => { onClose(); onSelectModal('video_embed'); }}>\n <span style={{ fontSize: 12 }}>📺</span> Video Embed (YouTube)\n </DropItem>\n </div>\n )}\n </div>\n\n <DropSep />\n\n <DropItem onAction={() => { onClose(); onSelectModal('shape'); }}>\n <span style={{ display: 'inline-flex', width: 14, justifyContent: 'center', fontSize: 12 }}>⬡</span>\n Vector Shape\n </DropItem>\n <DropItem onAction={() => { onClose(); onSelectModal('math'); }}>\n <span style={{ display: 'inline-flex', width: 14, justifyContent: 'center', fontSize: 12 }}>∑</span>\n Math Formula (LaTeX)\n </DropItem>\n <DropSep />\n <TableGridPicker\n editor={editor}\n label=\"Table\"\n tableHover={tableHover}\n setTableHover={setTableHover}\n subOpen={subOpen}\n setSubOpen={setSubOpen}\n onClose={onClose}\n />\n <DropItem onAction={insertLink}>\n <LinkIcon size={14} />\n Link\n <span className=\"rte-kbd\">⌘K</span>\n </DropItem>\n <DropSep />\n <DropItem onAction={() => { onClose(); editor?.chain().focus().setHorizontalRule().run(); }}>\n <span style={{ fontSize: 13 }}>—</span>\n Horizontal line\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().setCodeBlock().run(); }}>\n <span style={{ fontFamily: 'monospace', fontSize: 12 }}><></span>\n Code block\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().setCallout().run(); }}>\n <CalloutIcon size={14} />\n Callout\n </DropItem>\n </MenuBarMenu>\n\n <MenuBarMenu label=\"Format\" name=\"format\" open={open} onToggle={onToggle}>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().toggleBold().run(); }} kbd=\"⌘B\">\n <span style={{ fontWeight: 700 }}>Bold</span>\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().toggleItalic().run(); }} kbd=\"⌘I\">\n <span style={{ fontStyle: 'italic' }}>Italic</span>\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().toggleUnderline().run(); }} kbd=\"⌘U\">\n <span style={{ textDecoration: 'underline' }}>Underline</span>\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().toggleStrike().run(); }}>\n <span style={{ textDecoration: 'line-through' }}>Strikethrough</span>\n </DropItem>\n <DropSep />\n <DropItem onAction={() => { onClose(); editor?.chain().focus().toggleHeading({ level: 1 }).run(); }}\n style={{ fontSize: 18, fontWeight: 600 }}>Heading 1</DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().toggleHeading({ level: 2 }).run(); }}\n style={{ fontSize: 15, fontWeight: 600 }}>Heading 2</DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().toggleHeading({ level: 3 }).run(); }}\n style={{ fontSize: 13, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '.04em', color: 'var(--rte-muted)' }}>HEADING 3</DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().setParagraph().run(); }}>Normal text</DropItem>\n <DropSep />\n <DropItem onAction={() => { onClose(); editor?.chain().focus().unsetAllMarks().clearNodes().run(); }} kbd=\"⌘\\\">\n Clear formatting\n </DropItem>\n </MenuBarMenu>\n\n <MenuBarMenu label=\"Tools\" name=\"tools\" open={open} onToggle={onToggle}>\n <DropItem onAction={() => { onClose(); onSelectModal('word_count'); }}>Word count</DropItem>\n <DropItem onAction={() => {\n onClose();\n editor?.commands.toggleSubscript();\n }}>Subscript</DropItem>\n <DropItem onAction={() => {\n onClose();\n editor?.commands.toggleSuperscript();\n }}>Superscript</DropItem>\n </MenuBarMenu>\n\n <MenuBarMenu label=\"Table\" name=\"table\" open={open} onToggle={onToggle} panelStyle={{ minWidth: 260 }}>\n <TableGridPicker\n editor={editor}\n label=\"Insert table\"\n tableHover={tableHover}\n setTableHover={setTableHover}\n subOpen={subOpen}\n setSubOpen={setSubOpen}\n onClose={onClose}\n />\n {isInTable && <>\n <DropSep />\n <DropItem onAction={() => { onClose(); editor?.chain().focus().addRowAfter().run(); }}>\n <PlusRowIcon size={14} /> Insert row below\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().addRowBefore().run(); }}>\n <PlusRowIcon size={14} /> Insert row above\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().deleteRow().run(); }}>\n <MinusRowIcon size={14} /> Delete row\n </DropItem>\n <DropSep />\n <DropItem onAction={() => { onClose(); editor?.chain().focus().addColumnAfter().run(); }}>\n <PlusColIcon size={14} /> Insert column right\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().addColumnBefore().run(); }}>\n <PlusColIcon size={14} /> Insert column left\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().deleteColumn().run(); }}>\n <MinusColIcon size={14} /> Delete column\n </DropItem>\n <DropSep />\n <DropItem onAction={() => { onClose(); editor?.chain().focus().mergeCells().run(); }}>\n <MergeCellsIcon size={14} /> Merge cells\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().splitCell().run(); }}>\n Split cell\n </DropItem>\n <DropItem onAction={() => { onClose(); editor?.chain().focus().deleteTable().run(); }}>\n Delete table\n </DropItem>\n </>}\n </MenuBarMenu>\n\n <MenuBarMenu label=\"Help\" name=\"help\" open={open} onToggle={onToggle}>\n <DropItem onAction={() => { onClose(); onSelectModal('shortcuts'); }}>Keyboard shortcuts</DropItem>\n <DropItem onAction={onClose}>About Inkora</DropItem>\n </MenuBarMenu>\n\n <div style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 2 }}>\n <button\n className=\"rte-btn\"\n title={isFullscreen ? 'Minimize screen' : 'Full screen'}\n onMouseDown={e => { e.preventDefault(); onToggleFullscreen && onToggleFullscreen(); }}\n >\n {isFullscreen ? <MinimizeIcon size={17} /> : <MaximizeIcon size={17} />}\n </button>\n <button\n className=\"rte-btn\"\n title={theme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'}\n onMouseDown={e => { e.preventDefault(); onToggleTheme && onToggleTheme(); }}\n >\n {theme === 'dark' ? <SunIcon size={17} /> : <MoonIcon size={17} />}\n </button>\n </div>\n </div>\n );\n}\n\n// ─── Row 2: Format Bar ─────────────────────────────────────────────────────────\n\nfunction StylesDropdown({ editor, open, onToggle, onClose }) {\n const current = editor?.isActive('heading', { level: 1 }) ? 'Heading 1'\n : editor?.isActive('heading', { level: 2 }) ? 'Heading 2'\n : editor?.isActive('heading', { level: 3 }) ? 'Heading 3'\n : editor?.isActive('blockquote') ? 'Quote'\n : editor?.isActive('codeBlock') ? 'Code block'\n : 'Normal text';\n\n return (\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-menu-btn${open === 'styles' ? ' open' : ''}`}\n style={{ display: 'inline-flex', alignItems: 'center', gap: 5, minWidth: 108, fontSize: 13.5 }}\n onMouseDown={e => { e.preventDefault(); onToggle('styles'); }}\n >\n <span style={{ flex: 1, textAlign: 'left' }}>{current}</span>\n <ChevronDownIcon size={13} />\n </button>\n {open === 'styles' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 200 }}>\n <DropItem onAction={() => { editor?.chain().focus().setParagraph().run(); onClose(); }}>Normal text</DropItem>\n <DropItem style={{ fontSize: 21, fontWeight: 600 }} onAction={() => { editor?.chain().focus().toggleHeading({ level: 1 }).run(); onClose(); }}>Heading 1</DropItem>\n <DropItem style={{ fontSize: 17, fontWeight: 600 }} onAction={() => { editor?.chain().focus().toggleHeading({ level: 2 }).run(); onClose(); }}>Heading 2</DropItem>\n <DropItem style={{ fontSize: 13, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '.04em', color: 'var(--rte-muted)' }} onAction={() => { editor?.chain().focus().toggleHeading({ level: 3 }).run(); onClose(); }}>HEADING 3</DropItem>\n <DropItem style={{ fontStyle: 'italic', color: 'var(--rte-muted)' }} onAction={() => { editor?.chain().focus().toggleBlockquote().run(); onClose(); }}>Quote</DropItem>\n <DropItem style={{ fontFamily: \"'Roboto Mono', monospace\", fontSize: 13 }} onAction={() => { editor?.chain().focus().setCodeBlock().run(); onClose(); }}>Code block</DropItem>\n </div>\n )}\n </div>\n );\n}\n\nfunction FontDropdown({ editor, open, onToggle, onClose }) {\n const current = editor?.getAttributes('textStyle').fontFamily || 'Default';\n const label = FONTS.find(f => f.value === current)?.label || 'Default';\n\n return (\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-menu-btn${open === 'font' ? ' open' : ''}`}\n style={{ display: 'inline-flex', alignItems: 'center', gap: 5, minWidth: 84, fontSize: 13.5 }}\n onMouseDown={e => { e.preventDefault(); onToggle('font'); }}\n >\n <span style={{ flex: 1, textAlign: 'left' }}>{label}</span>\n <ChevronDownIcon size={13} />\n </button>\n {open === 'font' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 180 }}>\n {FONTS.map(f => (\n <DropItem\n key={f.value}\n style={{ fontFamily: f.value || 'inherit', fontSize: 14 }}\n onAction={() => {\n if (f.value) editor?.chain().focus().setFontFamily(f.value).run();\n else editor?.chain().focus().unsetFontFamily().run();\n onClose();\n }}\n >\n {f.label}\n </DropItem>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ColorDropdown({ editor, open, onToggle, onClose, textColor, onTextColorChange }) {\n return (\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-btn${open === 'color' ? ' is-active' : ''}`}\n title=\"Text color\"\n onMouseDown={e => { e.preventDefault(); onToggle('color'); }}\n style={{ flexDirection: 'column', gap: 1 }}\n >\n <span style={{ fontSize: 13, fontWeight: 700, lineHeight: 1 }}>A</span>\n <span style={{ width: 16, height: 3, borderRadius: 2, background: textColor }} />\n </button>\n {open === 'color' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 'auto', width: 'auto' }}>\n <div style={{ fontSize: 11, color: 'var(--rte-muted)', marginBottom: 8, padding: '0 4px' }}>Text color</div>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 22px)', gap: 7, padding: '0 4px 4px' }}>\n {TEXT_COLORS.map(c => (\n <button\n key={c}\n className={`rte-swatch${textColor === c ? ' active' : ''}`}\n style={{ background: c }}\n onMouseDown={e => {\n e.preventDefault();\n editor?.chain().focus().setColor(c).run();\n onTextColorChange(c);\n onClose();\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction HiliteDropdown({ editor, open, onToggle, onClose }) {\n return (\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-btn${open === 'hilite' ? ' is-active' : ''}`}\n title=\"Highlight color\"\n onMouseDown={e => { e.preventDefault(); onToggle('hilite'); }}\n >\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 15l-4 4-3-3 4-4\"/><path d=\"M14.5 4.5l5 5L11 18l-5-5 8.5-8.5Z\"/><path d=\"M4 21h7\"/>\n </svg>\n </button>\n {open === 'hilite' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 'auto', width: 'auto' }}>\n <div style={{ fontSize: 11, color: 'var(--rte-muted)', marginBottom: 8, padding: '0 4px' }}>Highlight</div>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, 22px)', gap: 7, padding: '0 4px 4px' }}>\n {HIGHLIGHT_COLORS.map((c, i) => (\n <button\n key={i}\n className=\"rte-swatch\"\n title={c === null ? 'None' : c}\n style={{\n background: c || 'var(--rte-bar)',\n position: 'relative', overflow: 'hidden',\n }}\n onMouseDown={e => {\n e.preventDefault();\n if (c === null) editor?.chain().focus().unsetHighlight().run();\n else editor?.chain().focus().setHighlight({ color: c }).run();\n onClose();\n }}\n >\n {c === null && (\n <span style={{ position: 'absolute', left: 1, top: 9, width: 20, height: 1.5, background: '#d93025', transform: 'rotate(-45deg)' }} />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction AlignDropdown({ editor, open, onToggle, onClose }) {\n const currentAlign = editor?.isActive({ textAlign: 'center' }) ? 'center'\n : editor?.isActive({ textAlign: 'right' }) ? 'right'\n : editor?.isActive({ textAlign: 'justify' }) ? 'justify'\n : 'left';\n\n const icons = {\n left: <AlignLeftIcon size={17} />,\n center: <AlignCenterIcon size={17} />,\n right: <AlignRightIcon size={17} />,\n justify: <AlignJustifyIcon size={17} />,\n };\n\n return (\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-btn${open === 'align' ? ' is-active' : ''}`}\n title=\"Alignment\"\n onMouseDown={e => { e.preventDefault(); onToggle('align'); }}\n style={{ gap: 2 }}\n >\n {icons[currentAlign]}\n <ChevronDownIcon size={11} />\n </button>\n {open === 'align' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 'auto', display: 'flex', gap: 2, padding: 6 }}>\n {Object.entries(icons).map(([align, icon]) => (\n <button\n key={align}\n className={`rte-btn${currentAlign === align ? ' is-active' : ''}`}\n title={align.charAt(0).toUpperCase() + align.slice(1)}\n onMouseDown={e => {\n e.preventDefault();\n editor?.chain().focus().setTextAlign(align).run();\n onClose();\n }}\n >\n {icon}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction SpacingDropdown({ editor, open, onToggle, onClose }) {\n const spacings = [\n { label: 'Single', value: '1' },\n { label: '1.15', value: '1.15' },\n { label: '1.5', value: '1.5' },\n { label: 'Double', value: '2' },\n { label: '2.5', value: '2.5' },\n { label: 'Triple', value: '3' },\n ];\n\n return (\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-btn${open === 'space' ? ' is-active' : ''}`}\n title=\"Line spacing\"\n onMouseDown={e => { e.preventDefault(); onToggle('space'); }}\n style={{ gap: 2 }}\n >\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 6H8M21 12H8M21 18H8M4 4v16M4 4l-2 2M4 4l2 2M4 20l-2-2M4 20l2-2\"/>\n </svg>\n <ChevronDownIcon size={11} />\n </button>\n {open === 'space' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 110 }}>\n {spacings.map(s => (\n <DropItem\n key={s.value}\n onAction={() => {\n editor?.chain().focus().setLineHeight(s.value).run();\n onClose();\n }}\n >\n {s.label}\n </DropItem>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ListDropdown({ editor, open, onToggle, onClose }) {\n const isTask = editor?.isActive('taskList');\n const isBullet = editor?.isActive('bulletList');\n const isOrdered = editor?.isActive('orderedList');\n\n const currentIcon = isTask ? (\n <TaskListIcon size={17} />\n ) : isOrdered ? (\n <OrderedListIcon size={17} />\n ) : (\n <BulletListIcon size={17} />\n );\n\n return (\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-btn${(isTask || isBullet || isOrdered) ? ' is-active' : ''}${open === 'list' ? ' is-active' : ''}`}\n title=\"Lists & indent\"\n onMouseDown={e => { e.preventDefault(); onToggle('list'); }}\n style={{ gap: 2 }}\n >\n {currentIcon}\n <ChevronDownIcon size={11} />\n </button>\n {open === 'list' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 'auto', padding: 6, display: 'flex', flexDirection: 'column', gap: 2 }}>\n {/* List type row */}\n <div style={{ display: 'flex', gap: 2 }}>\n <button\n className={`rte-btn${isTask ? ' is-active' : ''}`}\n title=\"Task list\"\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleTaskList().run(); onClose(); }}\n >\n <TaskListIcon size={17} />\n </button>\n <button\n className={`rte-btn${isBullet ? ' is-active' : ''}`}\n title=\"Bullet list\"\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleBulletList().run(); onClose(); }}\n >\n <BulletListIcon size={17} />\n </button>\n <button\n className={`rte-btn${isOrdered ? ' is-active' : ''}`}\n title=\"Numbered list\"\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleOrderedList().run(); onClose(); }}\n >\n <OrderedListIcon size={17} />\n </button>\n </div>\n {/* Indent row */}\n <div style={{ display: 'flex', gap: 2, borderTop: '1px solid var(--rte-border)', paddingTop: 4, marginTop: 2 }}>\n <button\n className=\"rte-btn\"\n title=\"Decrease indent\"\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().liftListItem('listItem').run(); onClose(); }}\n >\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 6H10M21 12H10M21 18H3M7 9l-4 3 4 3\"/>\n </svg>\n </button>\n <button\n className=\"rte-btn\"\n title=\"Increase indent\"\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().sinkListItem('listItem').run(); onClose(); }}\n >\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 6H10M21 12H10M21 18H3M3 9l4 3-4 3\"/>\n </svg>\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction FormatBar({ editor, open, onToggle, onClose, imageRef, videoRef, audioRef, fontSize, onFontSizeChange, textColor, onTextColorChange, onHtmlEditor, onSelectModal }) {\n const changeFontSize = (dir) => {\n const next = Math.max(8, Math.min(96, fontSize + (dir === 'up' ? 1 : -1)));\n onFontSizeChange(next);\n editor?.chain().focus().setFontSize(`${Math.round(next * 1.333)}px`).run();\n };\n\n const insertLink = () => { onClose(); onSelectModal('link'); };\n\n return (\n <div style={{\n display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 2,\n padding: '6px 8px', borderBottom: '1px solid var(--rte-border)',\n background: 'var(--rte-pill)', position: 'relative', zIndex: 50,\n }}>\n\n {/* Undo / Redo */}\n <button className=\"rte-btn\" title=\"Undo ⌘Z\" disabled={!editor?.can().undo()}\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().undo().run(); }}>\n <UndoIcon size={17} />\n </button>\n <button className=\"rte-btn\" title=\"Redo ⌘Y\" disabled={!editor?.can().redo()}\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().redo().run(); }}>\n <RedoIcon size={17} />\n </button>\n\n <Sep />\n\n {/* Paragraph styles */}\n <StylesDropdown editor={editor} open={open} onToggle={onToggle} onClose={onClose} />\n\n <Sep />\n\n {/* Font family */}\n <FontDropdown editor={editor} open={open} onToggle={onToggle} onClose={onClose} />\n\n <Sep />\n\n {/* Font size */}\n <div style={{ display: 'inline-flex', alignItems: 'center', gap: 2 }}>\n <button className=\"rte-btn\" title=\"Decrease font size\" style={{ fontSize: 18, minWidth: 26, height: 28 }}\n onMouseDown={e => { e.preventDefault(); changeFontSize('down'); }}>−</button>\n <span style={{\n minWidth: 30, height: 28, display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n fontSize: 13, border: '1px solid var(--rte-border)', borderRadius: 6, background: 'var(--rte-bar)',\n padding: '0 4px',\n }}>{fontSize}</span>\n <button className=\"rte-btn\" title=\"Increase font size\" style={{ fontSize: 18, minWidth: 26, height: 28 }}\n onMouseDown={e => { e.preventDefault(); changeFontSize('up'); }}>+</button>\n </div>\n\n <Sep />\n\n {/* Bold / Italic / Underline / Strike */}\n <button className={`rte-btn${editor?.isActive('bold') ? ' is-active' : ''}`} title=\"Bold ⌘B\"\n style={{ fontWeight: 700, fontSize: 15 }}\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleBold().run(); }}>B</button>\n <button className={`rte-btn${editor?.isActive('italic') ? ' is-active' : ''}`} title=\"Italic ⌘I\"\n style={{ fontStyle: 'italic', fontSize: 15, fontFamily: 'Georgia, serif' }}\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleItalic().run(); }}>I</button>\n <button className={`rte-btn${editor?.isActive('underline') ? ' is-active' : ''}`} title=\"Underline ⌘U\"\n style={{ textDecoration: 'underline', fontSize: 15 }}\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleUnderline().run(); }}>U</button>\n <button className={`rte-btn${editor?.isActive('strike') ? ' is-active' : ''}`} title=\"Strikethrough\"\n style={{ textDecoration: 'line-through', fontSize: 15 }}\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleStrike().run(); }}>S</button>\n\n {/* Text color & Highlight */}\n <ColorDropdown editor={editor} open={open} onToggle={onToggle} onClose={onClose} textColor={textColor} onTextColorChange={onTextColorChange} />\n <HiliteDropdown editor={editor} open={open} onToggle={onToggle} onClose={onClose} />\n\n <Sep />\n\n {/* Link / Image */}\n <button className={`rte-btn${editor?.isActive('link') ? ' is-active' : ''}`} title=\"Insert link ⌘K\"\n onMouseDown={e => { e.preventDefault(); insertLink(); }}>\n <LinkIcon size={17} />\n </button>\n <button className=\"rte-btn\" title=\"Insert image\"\n onMouseDown={e => { e.preventDefault(); imageRef.current?.click(); }}>\n <ImageIcon size={17} />\n </button>\n <button className=\"rte-btn\" title=\"Insert video\"\n onMouseDown={e => { e.preventDefault(); videoRef.current?.click(); }}>\n <VideoIcon size={17} />\n </button>\n <button className=\"rte-btn\" title=\"Insert audio\"\n onMouseDown={e => { e.preventDefault(); audioRef.current?.click(); }}>\n <AudioIcon size={17} />\n </button>\n\n <Sep />\n\n {/* Alignment */}\n <AlignDropdown editor={editor} open={open} onToggle={onToggle} onClose={onClose} />\n\n {/* Line spacing */}\n <SpacingDropdown editor={editor} open={open} onToggle={onToggle} onClose={onClose} />\n\n {/* Lists & Indent dropdown */}\n <ListDropdown editor={editor} open={open} onToggle={onToggle} onClose={onClose} />\n\n <Sep />\n\n {/* Subscript / Superscript */}\n <button className={`rte-btn${editor?.isActive('subscript') ? ' is-active' : ''}`} title=\"Subscript\"\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleSubscript().run(); }}>\n <SubIcon size={15} />\n </button>\n <button className={`rte-btn${editor?.isActive('superscript') ? ' is-active' : ''}`} title=\"Superscript\"\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().toggleSuperscript().run(); }}>\n <SupIcon size={15} />\n </button>\n\n <Sep />\n\n {/* Clear formatting */}\n <button className=\"rte-btn\" title=\"Clear formatting ⌘\\\"\n onMouseDown={e => { e.preventDefault(); editor?.chain().focus().unsetAllMarks().clearNodes().run(); }}>\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 7V5h13v2\"/><path d=\"M11 5l-2 14M14 12l6 6M20 12l-6 6\"/>\n </svg>\n </button>\n\n <Sep />\n\n {/* HTML Editor */}\n <button className=\"rte-btn\" title=\"HTML Editor\"\n onMouseDown={e => { e.preventDefault(); onHtmlEditor && onHtmlEditor(); }}>\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/>\n </svg>\n </button>\n </div>\n );\n}\n\n// ─── Toolbar Modal Component ──────────────────────────────────────────────────\n\nfunction ToolbarModal({ type, editor, onClose, theme }) {\n const [inputVal, setInputVal] = useState('');\n const [selectedShape, setSelectedShape] = useState('circle');\n const [shapeColor, setShapeColor] = useState('#1a73e8');\n const [katexError, setKatexError] = useState('');\n const mathPreviewRef = useRef(null);\n\n // Curated GIFs list\n const CURATED_GIFS = [\n { label: 'Success', src: 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExM3BndjI5dWZobXl4ZXp3ZW51bzh3bTdxb3J0dzhsb24wa2Rwcml3MCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3oz8xAFtqoOUUrEl8c/giphy.gif' },\n { label: 'Mind Blown', src: 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWdzZHJ3NndwdXJhMXN1cGN3MmZ3cGdtc2E2djdhdHJidm5lZnprMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2zqzd8h2bHjdm/giphy.gif' },\n { label: 'Thumbs Up', src: 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExanJtdDNhZDNrMGFoOG1jMG82aTFibnZnaTA2cDFnaGNlZXZicjM5dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tIeCLkB8geYtW/giphy.gif' },\n { label: 'Coding', src: 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdzB0dHpxMWo0YWNnY3p3NXl2ZXZtZGx2MDZ5OHhndGFmaXZoamxtdiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QuxqWk7m9ffxyfoa0a/giphy.gif' },\n { label: 'Celebration', src: 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYnl2ZHptbzRyNzR3eGNzMDd0cW1oZmtxZHk5ODdyczI3NDM0OW8xbiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l3q2zVr6cu95nF6O4/giphy.gif' },\n { label: 'Confused', src: 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExMzQ1czNqdnp3OGFvOXJ4bzU1OWF4NHp6a3JmbGRvN2d5dWFpMHd4dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26gR0YFZxW5Y1jOfC/giphy.gif' },\n ];\n\n const SHAPES = [\n { id: 'circle', name: 'Circle', draw: (color) => `<circle cx=\"50\" cy=\"50\" r=\"45\" fill=\"${color}\" stroke=\"${theme === 'dark' ? '#555' : '#ccc'}\" stroke-width=\"2\"/>` },\n { id: 'square', name: 'Square', draw: (color) => `<rect x=\"8\" y=\"8\" width=\"84\" height=\"84\" rx=\"6\" fill=\"${color}\" stroke=\"${theme === 'dark' ? '#555' : '#ccc'}\" stroke-width=\"2\"/>` },\n { id: 'triangle', name: 'Triangle', draw: (color) => `<polygon points=\"50,6 94,88 6,88\" fill=\"${color}\" stroke=\"${theme === 'dark' ? '#555' : '#ccc'}\" stroke-width=\"2\"/>` },\n { id: 'star', name: 'Star', draw: (color) => `<polygon points=\"50,6 64,36 97,36 70,56 81,89 50,69 19,89 30,56 3,36 36,36\" fill=\"${color}\" stroke=\"${theme === 'dark' ? '#555' : '#ccc'}\" stroke-width=\"2\"/>` },\n { id: 'arrow-right', name: 'Arrow Right', draw: (color) => `<path d=\"M10,35 L60,35 L60,18 L90,50 L60,82 L60,65 L10,65 Z\" fill=\"${color}\" stroke=\"${theme === 'dark' ? '#555' : '#ccc'}\" stroke-width=\"2\"/>` },\n { id: 'arrow-left', name: 'Arrow Left', draw: (color) => `<path d=\"M90,35 L40,35 L40,18 L10,50 L40,82 L40,65 L90,65 Z\" fill=\"${color}\" stroke=\"${theme === 'dark' ? '#555' : '#ccc'}\" stroke-width=\"2\"/>` },\n { id: 'arrow-up', name: 'Arrow Up', draw: (color) => `<path d=\"M35,90 L35,40 L18,40 L50,10 L82,40 L65,40 L65,90 Z\" fill=\"${color}\" stroke=\"${theme === 'dark' ? '#555' : '#ccc'}\" stroke-width=\"2\"/>` },\n { id: 'arrow-down', name: 'Arrow Down', draw: (color) => `<path d=\"M35,10 L35,60 L18,60 L50,90 L82,60 L65,60 L65,10 Z\" fill=\"${color}\" stroke=\"${theme === 'dark' ? '#555' : '#ccc'}\" stroke-width=\"2\"/>` },\n ];\n\n const SHAPE_COLORS = [\n { label: 'Blue', value: '#1a73e8' },\n { label: 'Green', value: '#1e8e3e' },\n { label: 'Red', value: '#d93025' },\n { label: 'Yellow', value: '#f9ab00' },\n { label: 'Purple', value: '#7b34d6' },\n { label: 'Slate', value: '#5f6368' },\n { label: 'Ink', value: '#202124' },\n { label: 'White', value: '#ffffff' },\n ];\n\n // Render latex preview\n useEffect(() => {\n if (type === 'math' && mathPreviewRef.current) {\n const latex = inputVal || 'e = mc^2';\n try {\n katex.render(latex, mathPreviewRef.current, {\n throwOnError: false,\n displayMode: true,\n });\n setKatexError('');\n } catch (err) {\n setKatexError(err.message);\n }\n }\n }, [inputVal, type]);\n\n const handleSubmit = (e) => {\n e.preventDefault();\n if (!editor) return;\n\n if (type === 'image_url') {\n if (inputVal) editor.chain().focus().setImage({ src: inputVal }).run();\n } else if (type === 'video_url') {\n if (inputVal) editor.commands.setVideo({ src: inputVal });\n } else if (type === 'audio_url') {\n if (inputVal) editor.commands.setAudio({ src: inputVal });\n } else if (type === 'gif') {\n if (inputVal) editor.chain().focus().setImage({ src: inputVal, alt: 'GIF' }).run();\n } else if (type === 'video_embed') {\n if (inputVal) {\n // Simple YouTube/Vimeo embedding\n editor.commands.setYoutubeVideo({ src: inputVal });\n }\n } else if (type === 'math') {\n const latex = inputVal || 'e = mc^2';\n editor.chain().focus().setMathFormula({ latex }).run();\n } else if (type === 'shape') {\n const shapeObj = SHAPES.find(s => s.id === selectedShape);\n if (shapeObj) {\n const svgContent = shapeObj.draw(shapeColor);\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">${svgContent}</svg>`;\n const src = `data:image/svg+xml;base64,${btoa(svg)}`;\n editor.chain().focus().setImage({ src, alt: shapeObj.name }).run();\n }\n }\n onClose();\n };\n\n const titles = {\n image_url: 'Insert Image from URL',\n video_url: 'Insert Video from URL',\n audio_url: 'Insert Audio from URL',\n gif: 'Insert Animated GIF',\n video_embed: 'Insert Embedded Video',\n shape: 'Insert Vector Shape',\n math: 'Insert Mathematical Equation (LaTeX)',\n };\n\n return (\n <div className=\"rte-modal-overlay\" onMouseDown={onClose}>\n <div className=\"rte-modal\" onMouseDown={e => e.stopPropagation()}>\n <div className=\"rte-modal-header\">\n <div className=\"rte-modal-title\">{titles[type]}</div>\n <button className=\"rte-modal-close\" onClick={onClose} type=\"button\">✕</button>\n </div>\n <form onSubmit={handleSubmit}>\n <div className=\"rte-modal-body\">\n {(type === 'image_url' || type === 'video_url' || type === 'audio_url') && (\n <div>\n <label style={{ display: 'block', fontSize: 12, color: 'var(--rte-muted)', marginBottom: 6 }}>Source URL</label>\n <input \n type=\"url\" \n className=\"rte-input\" \n placeholder=\"https://\" \n value={inputVal} \n onChange={e => setInputVal(e.target.value)} \n autoFocus \n required\n />\n </div>\n )}\n\n {type === 'video_embed' && (\n <div>\n <label style={{ display: 'block', fontSize: 12, color: 'var(--rte-muted)', marginBottom: 6 }}>YouTube or Vimeo URL</label>\n <input\n type=\"url\"\n className=\"rte-input\"\n placeholder=\"https://www.youtube.com/watch?v=...\"\n value={inputVal}\n onChange={e => setInputVal(e.target.value)}\n autoFocus\n required\n />\n <div style={{ fontSize: 11, color: 'var(--rte-muted)', marginTop: 6 }}>\n Paste a YouTube or Vimeo link. Once inserted, drag the handles to resize.\n </div>\n </div>\n )}\n\n {type === 'gif' && (\n <div>\n <label style={{ display: 'block', fontSize: 12, color: 'var(--rte-muted)', marginBottom: 6 }}>GIF URL</label>\n <input \n type=\"url\" \n className=\"rte-input\" \n placeholder=\"https://media.giphy.com/media/.../giphy.gif\" \n value={inputVal} \n onChange={e => setInputVal(e.target.value)} \n autoFocus \n />\n \n <div style={{ display: 'flex', alignItems: 'center', margin: '14px 0 8px' }}>\n <div style={{ height: 1, background: 'var(--rte-border)', flex: 1 }} />\n <span style={{ fontSize: 10, color: 'var(--rte-muted)', padding: '0 8px', textTransform: 'uppercase', fontWeight: 600 }}>Curated Quick-Insert GIFs</span>\n <div style={{ height: 1, background: 'var(--rte-border)', flex: 1 }} />\n </div>\n\n <div className=\"rte-gif-grid\">\n {CURATED_GIFS.map((g, i) => (\n <div \n key={i} \n className=\"rte-gif-item\" \n onClick={() => {\n editor?.chain().focus().setImage({ src: g.src, alt: g.label }).run();\n onClose();\n }}\n >\n <img src={g.src} alt={g.label} loading=\"lazy\" />\n <div className=\"rte-gif-label\">{g.label}</div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {type === 'math' && (\n <div>\n <label style={{ display: 'block', fontSize: 12, color: 'var(--rte-muted)', marginBottom: 6 }}>LaTeX Expression</label>\n <textarea \n className=\"rte-input\" \n style={{ fontFamily: 'monospace', minHeight: 80, resize: 'vertical' }}\n placeholder=\"e = mc^2 \\quad \\text{or} \\quad \\int_{a}^{b} f(x)dx\" \n value={inputVal} \n onChange={e => setInputVal(e.target.value)} \n autoFocus \n required\n />\n \n <label style={{ display: 'block', fontSize: 12, color: 'var(--rte-muted)', margin: '14px 0 6px' }}>Render Preview</label>\n <div \n style={{ \n padding: 12, \n borderRadius: 6, \n background: 'var(--rte-pill)', \n border: '1px dashed var(--rte-border)',\n minHeight: 60,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflowX: 'auto',\n }}\n >\n {katexError ? (\n <div style={{ color: '#ef4444', fontSize: 12 }}>{katexError}</div>\n ) : (\n <div ref={mathPreviewRef} style={{ fontSize: 16 }} />\n )}\n </div>\n </div>\n )}\n\n {type === 'shape' && (\n <div>\n <label style={{ display: 'block', fontSize: 12, color: 'var(--rte-muted)', marginBottom: 8 }}>Select Vector Shape</label>\n <div className=\"rte-shape-grid\">\n {SHAPES.map(s => {\n const svgMarkup = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\" width=\"36\" height=\"36\">${s.draw(shapeColor)}</svg>`;\n return (\n <button\n key={s.id}\n type=\"button\"\n className={`rte-shape-item${selectedShape === s.id ? ' active' : ''}`}\n onClick={() => setSelectedShape(s.id)}\n title={s.name}\n >\n <div dangerouslySetInnerHTML={{ __html: svgMarkup }} />\n </button>\n );\n })}\n </div>\n\n <label style={{ display: 'block', fontSize: 12, color: 'var(--rte-muted)', marginBottom: 8 }}>Shape Fill Color</label>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(8, 1fr)', gap: 8 }}>\n {SHAPE_COLORS.map(c => (\n <button\n key={c.value}\n type=\"button\"\n className={`rte-swatch${shapeColor === c.value ? ' active' : ''}`}\n style={{ background: c.value, width: 28, height: 28 }}\n onClick={() => setShapeColor(c.value)}\n title={c.label}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n <div className=\"rte-modal-footer\">\n <button type=\"button\" className=\"rte-btn-secondary\" onClick={onClose}>Cancel</button>\n <button type=\"submit\" className=\"rte-btn-primary\">Insert</button>\n </div>\n </form>\n </div>\n </div>\n );\n}\n\n// ─── HTML Editor Modal ────────────────────────────────────────────────────────\n\nfunction LinkModal({ editor, onClose }) {\n const [url, setUrl] = useState(() => editor?.getAttributes('link').href || '');\n const inputRef = useRef(null);\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const apply = () => {\n if (!editor) return;\n if (!url.trim()) { editor.chain().focus().unsetLink().run(); }\n else { editor.chain().focus().setLink({ href: url.trim() }).run(); }\n onClose();\n };\n\n return (\n <div className=\"rte-modal-overlay\" onMouseDown={onClose}>\n <div className=\"rte-modal\" style={{ maxWidth: 420, width: '96%' }} onMouseDown={e => e.stopPropagation()}>\n <div className=\"rte-modal-header\">\n <span className=\"rte-modal-title\">Insert link</span>\n <button className=\"rte-modal-close\" onClick={onClose} type=\"button\">✕</button>\n </div>\n <div className=\"rte-modal-body\" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <input\n ref={inputRef}\n type=\"url\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={e => setUrl(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); apply(); } if (e.key === 'Escape') onClose(); }}\n style={{ width: '100%', padding: '9px 12px', fontSize: 14, borderRadius: 7, border: '1.5px solid var(--rte-border)', background: 'var(--rte-page)', color: 'var(--rte-ink)', outline: 'none', boxSizing: 'border-box' }}\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>\n {editor?.isActive('link') && (\n <button className=\"rte-modal-btn\" onClick={() => { editor.chain().focus().unsetLink().run(); onClose(); }} style={{ background: 'transparent', color: 'var(--rte-muted)' }}>\n Remove link\n </button>\n )}\n <button className=\"rte-modal-btn\" onClick={onClose} style={{ background: 'transparent', color: 'var(--rte-muted)' }}>Cancel</button>\n <button className=\"rte-modal-btn rte-modal-btn-primary\" onClick={apply}>Apply</button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ConfirmModal({ message, onConfirm, onClose }) {\n return (\n <div className=\"rte-modal-overlay\" onMouseDown={onClose}>\n <div className=\"rte-modal\" style={{ maxWidth: 340, width: '96%' }} onMouseDown={e => e.stopPropagation()}>\n <div className=\"rte-modal-header\">\n <span className=\"rte-modal-title\">Confirm</span>\n <button className=\"rte-modal-close\" onClick={onClose} type=\"button\">✕</button>\n </div>\n <div className=\"rte-modal-body\" style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <p style={{ margin: 0, fontSize: 14, color: 'var(--rte-ink)' }}>{message}</p>\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>\n <button className=\"rte-modal-btn\" onClick={onClose} style={{ background: 'transparent', color: 'var(--rte-muted)' }}>Cancel</button>\n <button className=\"rte-modal-btn rte-modal-btn-primary\" onClick={() => { onConfirm(); onClose(); }}>Clear</button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction WordCountModal({ editor, onClose }) {\n const text = editor?.getText() || '';\n const words = text.trim() ? text.trim().split(/\\s+/).length : 0;\n const chars = text.length;\n const charsNoSpace = text.replace(/\\s/g, '').length;\n const paragraphs = (editor?.getJSON()?.content || []).filter(n => n.type === 'paragraph').length;\n return (\n <div className=\"rte-modal-overlay\" onMouseDown={onClose}>\n <div className=\"rte-modal\" style={{ maxWidth: 300, width: '96%' }} onMouseDown={e => e.stopPropagation()}>\n <div className=\"rte-modal-header\">\n <span className=\"rte-modal-title\">Word count</span>\n <button className=\"rte-modal-close\" onClick={onClose} type=\"button\">✕</button>\n </div>\n <div className=\"rte-modal-body\" style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {[['Words', words], ['Characters', chars], ['Characters (no spaces)', charsNoSpace], ['Paragraphs', paragraphs]].map(([label, val]) => (\n <div key={label} style={{ display: 'flex', justifyContent: 'space-between', fontSize: 14 }}>\n <span style={{ color: 'var(--rte-muted)' }}>{label}</span>\n <strong style={{ color: 'var(--rte-ink)' }}>{val}</strong>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction ShortcutsModal({ onClose }) {\n const shortcuts = [\n ['Bold', '⌘ B'], ['Italic', '⌘ I'], ['Underline', '⌘ U'],\n ['Strikethrough', '⌘ Shift S'], ['Link', '⌘ K'],\n ['Undo', '⌘ Z'], ['Redo', '⌘ Y'], ['Select all', '⌘ A'],\n ['Subscript', '⌘ ,'], ['Superscript', '⌘ .'],\n ['Inline code', '⌘ E'], ['Clear formatting', '⌘ \\\\'],\n ];\n return (\n <div className=\"rte-modal-overlay\" onMouseDown={onClose}>\n <div className=\"rte-modal\" style={{ maxWidth: 360, width: '96%' }} onMouseDown={e => e.stopPropagation()}>\n <div className=\"rte-modal-header\">\n <span className=\"rte-modal-title\">Keyboard shortcuts</span>\n <button className=\"rte-modal-close\" onClick={onClose} type=\"button\">✕</button>\n </div>\n <div className=\"rte-modal-body\" style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {shortcuts.map(([label, kbd]) => (\n <div key={label} style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', fontSize: 13 }}>\n <span style={{ color: 'var(--rte-ink)' }}>{label}</span>\n <kbd style={{ background: 'var(--rte-pill)', border: '1px solid var(--rte-border)', borderRadius: 5, padding: '2px 8px', fontSize: 12, fontFamily: 'monospace', color: 'var(--rte-muted)' }}>{kbd}</kbd>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction HtmlEditorModal({ editor, onClose }) {\n const [html, setHtml] = useState(() => {\n const raw = editor?.getHTML() || '';\n // Basic pretty-print: add newlines after closing block tags\n return raw\n .replace(/></g, '>\\n<')\n .replace(/^\\n/, '');\n });\n const textareaRef = useRef(null);\n\n useEffect(() => { textareaRef.current?.focus(); }, []);\n\n const handleApply = () => {\n if (editor) editor.commands.setContent(html, false);\n onClose();\n };\n\n const handleKeyDown = (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n const el = e.target;\n const start = el.selectionStart;\n const end = el.selectionEnd;\n const next = html.substring(0, start) + ' ' + html.substring(end);\n setHtml(next);\n requestAnimationFrame(() => { el.selectionStart = el.selectionEnd = start + 2; });\n }\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n }\n };\n\n return (\n <div className=\"rte-modal-overlay\" onMouseDown={onClose}>\n <div\n className=\"rte-modal\"\n style={{ maxWidth: 860, width: '96%', display: 'flex', flexDirection: 'column', maxHeight: '90vh' }}\n onMouseDown={e => e.stopPropagation()}\n >\n <div className=\"rte-modal-header\">\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/>\n </svg>\n <span className=\"rte-modal-title\">HTML Editor</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <span style={{ fontSize: 11, color: 'var(--rte-muted)' }}>⌘↵ to apply</span>\n <button className=\"rte-modal-close\" onClick={onClose} type=\"button\">✕</button>\n </div>\n </div>\n\n <div className=\"rte-modal-body\" style={{ flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column', gap: 8 }}>\n <div style={{ fontSize: 11, color: 'var(--rte-muted)' }}>\n Edit the raw HTML source. Click <strong>Apply</strong> to update the editor.\n </div>\n <textarea\n ref={textareaRef}\n value={html}\n onChange={e => setHtml(e.target.value)}\n onKeyDown={handleKeyDown}\n className=\"rte-input\"\n style={{\n fontFamily: \"'Roboto Mono', 'Courier New', monospace\",\n fontSize: 12.5,\n lineHeight: 1.65,\n flex: 1,\n minHeight: 420,\n resize: 'none',\n whiteSpace: 'pre',\n overflowX: 'auto',\n overflowY: 'auto',\n tabSize: 2,\n background: 'var(--rte-page)',\n }}\n spellCheck={false}\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n />\n </div>\n\n <div className=\"rte-modal-footer\">\n <div style={{ marginRight: 'auto', fontSize: 11, color: 'var(--rte-muted)' }}>\n {html.length} chars · Tab inserts 2 spaces\n </div>\n <button type=\"button\" className=\"rte-btn-secondary\" onClick={onClose}>Cancel</button>\n <button type=\"button\" className=\"rte-btn-primary\" onClick={handleApply}>Apply</button>\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Media Format Bar (shown when image/video is selected) ────────────────────\n\nconst IMG_SHAPES = [\n { id: 'rect', label: 'Original' },\n { id: 'rounded', label: 'Rounded' },\n { id: 'pill', label: 'Pill' },\n { id: 'circle', label: 'Circle' },\n { id: 'square', label: 'Square' },\n { id: 'landscape', label: 'Landscape' },\n { id: 'portrait', label: 'Portrait' },\n];\nconst VID_SHAPES = [\n { id: 'rect', label: 'Original' },\n { id: 'rounded', label: 'Rounded' },\n { id: 'pill', label: 'Pill' },\n { id: 'circle', label: 'Circle' },\n { id: 'landscape', label: 'Landscape' },\n];\n\nfunction ShapeIcon({ id, active }) {\n const c = active ? 'var(--rte-accent)' : 'var(--rte-muted)';\n const s = { fill: 'none', stroke: c, strokeWidth: 1.5 };\n const icons = {\n rect: <svg width=\"32\" height=\"22\" viewBox=\"0 0 32 22\"><rect x=\"1\" y=\"1\" width=\"30\" height=\"20\" rx=\"1.5\" {...s}/></svg>,\n rounded: <svg width=\"32\" height=\"22\" viewBox=\"0 0 32 22\"><rect x=\"1\" y=\"1\" width=\"30\" height=\"20\" rx=\"7\" {...s}/></svg>,\n pill: <svg width=\"32\" height=\"22\" viewBox=\"0 0 32 22\"><rect x=\"1\" y=\"1\" width=\"30\" height=\"20\" rx=\"10\" {...s}/></svg>,\n circle: <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\"><circle cx=\"11\" cy=\"11\" r=\"10\" {...s}/></svg>,\n square: <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\"><rect x=\"1\" y=\"1\" width=\"20\" height=\"20\" rx=\"1.5\" {...s}/></svg>,\n landscape: <svg width=\"32\" height=\"20\" viewBox=\"0 0 32 20\"><rect x=\"1\" y=\"1\" width=\"30\" height=\"18\" rx=\"1.5\" {...s}/></svg>,\n portrait: <svg width=\"18\" height=\"26\" viewBox=\"0 0 18 26\"><rect x=\"1\" y=\"1\" width=\"16\" height=\"24\" rx=\"1.5\" {...s}/></svg>,\n };\n return icons[id] || icons.rect;\n}\nconst MEDIA_FRAMES = [\n { id: 'none', label: 'None' },\n { id: 'shadow', label: 'Shadow' },\n { id: 'border', label: 'Border' },\n { id: 'thick', label: 'Thick' },\n { id: 'glow', label: 'Glow' },\n { id: 'vintage', label: 'Vintage' },\n { id: 'dark', label: 'Dark' },\n];\nconst MEDIA_FILTERS = [\n { id: 'invert', label: 'Invert' },\n { id: 'grayscale', label: 'Grayscale' },\n { id: 'sepia', label: 'Sepia' },\n { id: 'blur', label: 'Blur' },\n { id: 'bright', label: 'Brighten' },\n { id: 'contrast', label: 'Contrast' },\n];\n\nfunction MediaFormatBar({ editor, mediaType, open, onToggle, onClose, onHtmlEditor }) {\n const attrs = editor?.getAttributes(mediaType) || {};\n const filtersArr = attrs.filters ? attrs.filters.split(',').filter(Boolean) : [];\n const align = attrs.align || 'left';\n const frame = attrs.frame || 'none';\n const shape = attrs.shape || 'rect';\n\n const update = (patch) => editor.chain().focus().updateAttributes(mediaType, patch).run();\n const toggleFilter = (f) => {\n const next = filtersArr.includes(f) ? filtersArr.filter(x => x !== f) : [...filtersArr, f];\n update({ filters: next.join(',') });\n };\n\n const shapes = mediaType === 'image' ? IMG_SHAPES : VID_SHAPES;\n const shapeLabel = shapes.find(s => s.id === shape)?.label || 'Free';\n const frameLabel = MEDIA_FRAMES.find(f => f.id === frame)?.label || 'None';\n const filtersLabel = filtersArr.length === 0 ? 'Filters' : `Filters (${filtersArr.length})`;\n\n return (\n <div style={{\n display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 2,\n padding: '5px 10px', borderBottom: '1px solid var(--rte-border)',\n background: 'var(--rte-pill)', position: 'relative', zIndex: 50,\n }}>\n\n {/* Media badge */}\n <span style={{\n fontSize: 11, fontWeight: 600, color: 'var(--rte-accent)',\n background: 'var(--rte-accent-soft)', borderRadius: 6,\n padding: '2px 8px', marginRight: 4, userSelect: 'none',\n }}>\n {mediaType === 'image' ? '🖼 Image' : '🎬 Video'}\n </span>\n\n <Sep />\n\n {/* Layout */}\n <span style={{ fontSize: 11, color: 'var(--rte-muted)', marginRight: 2 }}>Layout</span>\n <button className={`rte-btn${align === 'left' ? ' is-active' : ''}`} title=\"Align left\"\n onMouseDown={e => { e.preventDefault(); update({ align: 'left' }); }}\n ><AlignLeftIcon size={17} /></button>\n <button className={`rte-btn${align === 'center' ? ' is-active' : ''}`} title=\"Align center\"\n onMouseDown={e => { e.preventDefault(); update({ align: 'center' }); }}\n ><AlignCenterIcon size={17} /></button>\n <button className={`rte-btn${align === 'right' ? ' is-active' : ''}`} title=\"Align right\"\n onMouseDown={e => { e.preventDefault(); update({ align: 'right' }); }}\n ><AlignRightIcon size={17} /></button>\n\n <Sep />\n\n {/* Shape — dropdown */}\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-menu-btn${open === 'media-shape' ? ' open' : ''}`}\n style={{ display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 12.5 }}\n onMouseDown={e => { e.preventDefault(); onToggle('media-shape'); }}\n >\n Shape: <strong>{shapeLabel}</strong>\n <ChevronDownIcon size={11} />\n </button>\n {open === 'media-shape' && (\n <div className=\"rte-drop-panel\" style={{\n display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)',\n gap: 4, padding: 8, minWidth: 200,\n }}>\n {shapes.map(s => (\n <button\n key={s.id}\n onMouseDown={e => { e.preventDefault(); update({ shape: s.id }); onClose(); }}\n style={{\n display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',\n gap: 5, padding: '8px 4px', border: 'none', borderRadius: 8, cursor: 'pointer',\n background: shape === s.id ? 'var(--rte-accent-soft)' : 'transparent',\n outline: shape === s.id ? '1.5px solid var(--rte-accent)' : '1.5px solid transparent',\n transition: 'background .1s',\n }}\n onMouseEnter={e => { if (shape !== s.id) e.currentTarget.style.background = 'var(--rte-hover)'; }}\n onMouseLeave={e => { if (shape !== s.id) e.currentTarget.style.background = 'transparent'; }}\n >\n <ShapeIcon id={s.id} active={shape === s.id} />\n <span style={{\n fontSize: 10.5, fontWeight: shape === s.id ? 600 : 400,\n color: shape === s.id ? 'var(--rte-accent)' : 'var(--rte-ink)',\n whiteSpace: 'nowrap',\n }}>{s.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n <Sep />\n\n {/* Frame — dropdown */}\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-menu-btn${open === 'media-frame' ? ' open' : ''}`}\n style={{ display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 12.5 }}\n onMouseDown={e => { e.preventDefault(); onToggle('media-frame'); }}\n >\n Frame: <strong>{frameLabel}</strong>\n <ChevronDownIcon size={11} />\n </button>\n {open === 'media-frame' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 130 }}>\n {MEDIA_FRAMES.map(fr => (\n <DropItem\n key={fr.id}\n onAction={() => { update({ frame: fr.id }); onClose(); }}\n style={{ fontWeight: frame === fr.id ? 700 : 400, color: frame === fr.id ? 'var(--rte-accent)' : undefined }}\n >{fr.label}</DropItem>\n ))}\n </div>\n )}\n </div>\n\n <Sep />\n\n {/* Filters — multi-select dropdown */}\n <div style={{ position: 'relative' }}>\n <button\n className={`rte-menu-btn${open === 'media-filters' ? ' open' : ''}`}\n style={{\n display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 12.5,\n color: filtersArr.length > 0 ? 'var(--rte-accent)' : undefined,\n }}\n onMouseDown={e => { e.preventDefault(); onToggle('media-filters'); }}\n >\n <strong>{filtersLabel}</strong>\n <ChevronDownIcon size={11} />\n </button>\n {open === 'media-filters' && (\n <div className=\"rte-drop-panel\" style={{ minWidth: 150 }}>\n {MEDIA_FILTERS.map(f => (\n <button\n key={f.id}\n className=\"rte-drop-item\"\n style={{\n fontWeight: filtersArr.includes(f.id) ? 700 : 400,\n color: filtersArr.includes(f.id) ? 'var(--rte-accent)' : undefined,\n }}\n onMouseDown={e => { e.preventDefault(); toggleFilter(f.id); }}\n >\n <span style={{\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n width: 16, height: 16, borderRadius: 4,\n border: `1.5px solid ${filtersArr.includes(f.id) ? 'var(--rte-accent)' : 'var(--rte-border)'}`,\n background: filtersArr.includes(f.id) ? 'var(--rte-accent)' : 'transparent',\n marginRight: 2, flexShrink: 0,\n }}>\n {filtersArr.includes(f.id) && (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 12 12\" fill=\"white\"><path d=\"M2 6l3 3 5-5\" stroke=\"white\" strokeWidth=\"1.8\" fill=\"none\" strokeLinecap=\"round\"/></svg>\n )}\n </span>\n {f.label}\n </button>\n ))}\n {filtersArr.length > 0 && (\n <>\n <div className=\"rte-drop-sep\" />\n <DropItem\n onAction={() => { update({ filters: '' }); onClose(); }}\n style={{ color: '#d93025' }}\n >✕ Reset all</DropItem>\n </>\n )}\n </div>\n )}\n </div>\n\n <Sep />\n\n {/* HTML Editor */}\n <button className=\"rte-btn\" title=\"HTML Editor\"\n onMouseDown={e => { e.preventDefault(); onHtmlEditor && onHtmlEditor(); }}>\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/>\n </svg>\n </button>\n </div>\n );\n}\n\n// ─── Main Export ───────────────────────────────────────────────────────────────\n\nexport default function Toolbar({ editor, onUpload, onToggleTheme, theme, isFullscreen, onToggleFullscreen }) {\n const [open, setOpen] = useState(null);\n const [activeModal, setActiveModal] = useState(null);\n const [fontSize, setFontSize] = useState(11);\n const [textColor, setTextColor] = useState('#202124');\n const toolbarRef = useRef(null);\n const imageInputRef = useRef(null);\n const videoInputRef = useRef(null);\n const audioInputRef = useRef(null);\n\n useEffect(() => {\n const handler = (e) => {\n if (toolbarRef.current && !toolbarRef.current.contains(e.target)) {\n setOpen(null);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n // Force re-render on every transaction so isActive checks stay in sync\n const [, setSelectionTime] = useState(0);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => {\n setSelectionTime(Date.now());\n\n const currentFontSizeAttr = editor.getAttributes('textStyle').fontSize;\n if (currentFontSizeAttr) {\n const sizePx = parseInt(currentFontSizeAttr, 10);\n if (!isNaN(sizePx)) {\n setFontSize(Math.round(sizePx / 1.333));\n }\n } else {\n setFontSize(11);\n }\n\n const currentTextColorAttr = editor.getAttributes('textStyle').color;\n if (currentTextColorAttr) {\n setTextColor(currentTextColorAttr);\n } else {\n setTextColor('#202124');\n }\n };\n editor.on('transaction', handler);\n return () => {\n editor.off('transaction', handler);\n };\n }, [editor]);\n\n const toggle = (name) => setOpen(prev => prev === name ? null : name);\n const close = () => setOpen(null);\n\n const handleUpload = (type) => async (e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n if (onUpload) {\n try {\n const result = await onUpload(file);\n if (result?.src) {\n if (type === 'image') editor?.chain().focus().setImage({ src: result.src }).run();\n else if (type === 'video') editor?.commands.setVideo({ src: result.src });\n else if (type === 'audio') editor?.commands.setAudio({ src: result.src });\n }\n } catch (err) {\n console.error('Upload failed:', err);\n }\n } else if (type === 'image') {\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n const src = readerEvent.target.result;\n editor?.chain().focus().setImage({ src }).run();\n };\n reader.readAsDataURL(file);\n } else {\n console.warn(`[Inkora] Missing 'onUpload' prop — cannot upload ${type} files.`);\n }\n e.target.value = '';\n };\n\n return (\n <div ref={toolbarRef} className=\"rte-toolbar\" style={{ background: 'var(--rte-bar)', borderTopLeftRadius: 13, borderTopRightRadius: 13, position: 'sticky', top: -32, zIndex: 100 }}>\n <style>{TOOLBAR_CSS}</style>\n\n <MenuBar\n editor={editor}\n open={open}\n onToggle={toggle}\n onClose={close}\n onToggleTheme={onToggleTheme}\n theme={theme}\n imageRef={imageInputRef}\n videoRef={videoInputRef}\n audioRef={audioInputRef}\n onSelectModal={setActiveModal}\n isFullscreen={isFullscreen}\n onToggleFullscreen={onToggleFullscreen}\n />\n\n {(() => {\n const mediaType = editor?.isActive('image') ? 'image' : editor?.isActive('video') ? 'video' : null;\n return mediaType ? (\n <MediaFormatBar\n editor={editor}\n mediaType={mediaType}\n open={open}\n onToggle={toggle}\n onClose={close}\n onHtmlEditor={() => setActiveModal('html_editor')}\n />\n ) : (\n <FormatBar\n editor={editor}\n open={open}\n onToggle={toggle}\n onClose={close}\n imageRef={imageInputRef}\n videoRef={videoInputRef}\n audioRef={audioInputRef}\n fontSize={fontSize}\n onFontSizeChange={setFontSize}\n textColor={textColor}\n onTextColorChange={setTextColor}\n onHtmlEditor={() => setActiveModal('html_editor')}\n onSelectModal={setActiveModal}\n />\n );\n })()}\n\n <input ref={imageInputRef} type=\"file\" accept=\"image/*\" style={{ display: 'none' }} onChange={handleUpload('image')} />\n <input ref={videoInputRef} type=\"file\" accept=\"video/*\" style={{ display: 'none' }} onChange={handleUpload('video')} />\n <input ref={audioInputRef} type=\"file\" accept=\"audio/*\" style={{ display: 'none' }} onChange={handleUpload('audio')} />\n\n {activeModal === 'link' && <LinkModal editor={editor} onClose={() => setActiveModal(null)} />}\n {activeModal === 'confirm_clear' && <ConfirmModal message=\"Clear all content? This cannot be undone.\" onConfirm={() => editor?.commands.clearContent(true)} onClose={() => setActiveModal(null)} />}\n {activeModal === 'word_count' && <WordCountModal editor={editor} onClose={() => setActiveModal(null)} />}\n {activeModal === 'shortcuts' && <ShortcutsModal onClose={() => setActiveModal(null)} />}\n {activeModal === 'html_editor' && <HtmlEditorModal editor={editor} onClose={() => setActiveModal(null)} />}\n {activeModal && !['link','confirm_clear','word_count','shortcuts','html_editor'].includes(activeModal) && (\n <ToolbarModal type={activeModal} editor={editor} onClose={() => setActiveModal(null)} theme={theme} />\n )}\n </div>\n );\n}\n","import React from 'react';\n\nconst Svg = ({ children, size = 16, strokeWidth = 2 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" strokeWidth={strokeWidth}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {children}\n </svg>\n);\n\nexport const BoldIcon = () => <Svg><path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/><path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/></Svg>;\nexport const ItalicIcon = () => <Svg><line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\"/><line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\"/><line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\"/></Svg>;\nexport const UnderlineIcon = () => <Svg><path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\"/><line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\"/></Svg>;\nexport const StrikeIcon = () => <Svg><path d=\"M16 4H9a3 3 0 0 0-2.83 4\"/><path d=\"M14 12a4 4 0 0 1 0 8H6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/></Svg>;\nexport const CodeIcon = () => <Svg><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></Svg>;\nexport const CodeBlockIcon = () => <Svg><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"m10 9-3 3 3 3\"/><path d=\"m14 9 3 3-3 3\"/></Svg>;\nexport const LinkIcon = () => <Svg><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></Svg>;\nexport const UnlinkIcon = () => <Svg><path d=\"m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71\"/><path d=\"m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"5\"/><line x1=\"2\" y1=\"8\" x2=\"5\" y2=\"8\"/><line x1=\"16\" y1=\"19\" x2=\"16\" y2=\"22\"/><line x1=\"19\" y1=\"16\" x2=\"22\" y2=\"16\"/></Svg>;\nexport const AlignLeftIcon = () => <Svg><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"15\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"18\" y2=\"18\"/></Svg>;\nexport const AlignCenterIcon = () => <Svg><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/></Svg>;\nexport const AlignRightIcon = () => <Svg><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"6\" y1=\"18\" x2=\"21\" y2=\"18\"/></Svg>;\nexport const AlignJustifyIcon = () => <Svg><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"/></Svg>;\nexport const BulletListIcon = () => <Svg><line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\"/><circle cx=\"4\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/></Svg>;\nexport const OrderedListIcon = () => <Svg><line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\"/><path d=\"M4 6h1v4\" strokeWidth=\"1.5\"/><path d=\"M4 10h2\" strokeWidth=\"1.5\"/><path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" strokeWidth=\"1.5\"/></Svg>;\nexport const TaskListIcon = () => <Svg><rect x=\"3\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\"/><polyline points=\"5.5 7.5 6.5 8.5 8.5 6.5\"/><line x1=\"13\" y1=\"8\" x2=\"21\" y2=\"8\"/><line x1=\"13\" y1=\"15\" x2=\"21\" y2=\"15\"/><rect x=\"3\" y=\"11\" width=\"7\" height=\"7\" rx=\"1\"/></Svg>;\nexport const QuoteIcon = () => <Svg><path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 2v7c0 1.25.756 2.017 2 2h2c1.25 0 2 .75 2 2v3\"/><path d=\"M14 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2h-3c-1.25 0-2 .75-2 2v7c0 1.25.756 2.017 2 2h2c1.25 0 2 .75 2 2v3\"/></Svg>;\nexport const HrIcon = () => <Svg><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"/><polyline points=\"8 8 12 4 16 8\"/><polyline points=\"16 16 12 20 8 16\"/></Svg>;\nexport const ImageIcon = () => <Svg><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></Svg>;\nexport const VideoIcon = () => <Svg><polygon points=\"23 7 16 12 23 17 23 7\"/><rect x=\"1\" y=\"5\" width=\"15\" height=\"14\" rx=\"2\" ry=\"2\"/></Svg>;\nexport const AudioIcon = () => <Svg><path d=\"M9 18V5l12-2v13\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><circle cx=\"18\" cy=\"16\" r=\"3\"/></Svg>;\nexport const TableIcon = () => <Svg><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/></Svg>;\nexport const UndoIcon = () => <Svg><polyline points=\"9 14 4 9 9 4\"/><path d=\"M20 20v-7a4 4 0 0 0-4-4H4\"/></Svg>;\nexport const RedoIcon = () => <Svg><polyline points=\"15 14 20 9 15 4\"/><path d=\"M4 20v-7a4 4 0 0 1 4-4h12\"/></Svg>;\nexport const HighlightIcon = () => <Svg><path d=\"m9 11-6 6v3h9l3-3\"/><path d=\"m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4\"/></Svg>;\nexport const ColorIcon = () => <Svg><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z\"/><circle cx=\"7\" cy=\"10\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10\" cy=\"7\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"14\" cy=\"6.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"17\" cy=\"9\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/></Svg>;\nexport const SubIcon = () => <Svg><path d=\"m4 5 8 8\"/><path d=\"m12 5-8 8\"/><path d=\"M20 19h-4c0-1.5.44-2 1.5-2.5S20 15.33 20 14c0-.47-.17-.93-.48-1.29a2.11 2.11 0 0 0-2.62-.44c-.42.24-.74.62-.9 1.07\"/></Svg>;\nexport const SupIcon = () => <Svg><path d=\"m4 19 8-8\"/><path d=\"m12 19-8-8\"/><path d=\"M20 12h-4c0-1.5.44-2 1.5-2.5S20 8.33 20 7c0-.47-.17-.93-.48-1.29a2.11 2.11 0 0 0-2.62-.44c-.42.24-.74.62-.9 1.07\"/></Svg>;\nexport const CalloutIcon = () => <Svg><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" strokeWidth=\"3\"/></Svg>;\nexport const ChevronDownIcon = () => <Svg size={12}><polyline points=\"6 9 12 15 18 9\"/></Svg>;\nexport const SunIcon = () => <Svg><circle cx=\"12\" cy=\"12\" r=\"5\"/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/></Svg>;\nexport const MoonIcon = () => <Svg><path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/></Svg>;\nexport const PlusRowIcon = () => <Svg size={14}><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"21\"/><line x1=\"9\" y1=\"16.5\" x2=\"15\" y2=\"16.5\"/><line x1=\"12\" y1=\"13.5\" x2=\"12\" y2=\"19.5\"/></Svg>;\nexport const PlusColIcon = () => <Svg size={14}><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\"/><line x1=\"12\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"16.5\" y1=\"9\" x2=\"16.5\" y2=\"15\"/><line x1=\"13.5\" y1=\"12\" x2=\"19.5\" y2=\"12\"/></Svg>;\nexport const MinusRowIcon = () => <Svg size={14}><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"8\" y1=\"15\" x2=\"16\" y2=\"15\"/></Svg>;\nexport const MinusColIcon = () => <Svg size={14}><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/><line x1=\"15\" y1=\"8\" x2=\"15\" y2=\"16\"/></Svg>;\nexport const MergeCellsIcon = () => <Svg size={14}><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"/><polyline points=\"8 9 12 12 8 15\"/><polyline points=\"16 9 12 12 16 15\"/></Svg>;\nexport const CheckIcon = () => <Svg size={14}><polyline points=\"20 6 9 17 4 12\"/></Svg>;\nexport const TypeIcon = () => <Svg><polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/></Svg>;\nexport const MaximizeIcon = ({ size = 16 }) => <Svg size={size}><path d=\"M15 3h6v6M9 21H3v-6M21 15v6h-6M3 9V3h6\"/></Svg>;\nexport const MinimizeIcon = ({ size = 16 }) => <Svg size={size}><path d=\"M4 14h6v6m10-6h-6v6M4 10h6V4m10 6h-6V4\"/></Svg>;\n","'use client';\nimport React, { useState, useEffect } from 'react';\nimport { BubbleMenu as TiptapBubbleMenu } from '@tiptap/react/menus';\nimport { LinkIcon } from './Icons.jsx';\n\nconst BUBBLE_CSS = `\n.rte-bubble {\n display: flex; align-items: center; gap: 1px;\n background: var(--rte-bar, #fff);\n border: 1px solid var(--rte-border, #e4e7eb);\n border-radius: 10px;\n box-shadow: var(--rte-shadow, 0 8px 26px rgba(0,0,0,.22));\n padding: 4px;\n z-index: 300;\n font-family: 'Outfit', 'Inter', Arial, sans-serif;\n}\n.rte-bubble .bb {\n display: inline-flex; align-items: center; justify-content: center;\n height: 32px; min-width: 30px; padding: 0 4px;\n border: none; background: transparent;\n color: var(--rte-ink, #202124);\n border-radius: 6px; cursor: pointer; transition: background 0.15s, transform 0.1s;\n}\n.rte-bubble .bb:hover { background: var(--rte-hover, rgba(60,64,67,.09)); }\n.rte-bubble .bb.active {\n background: var(--rte-accent-soft, #d3e3fd);\n color: var(--rte-accent, #0b57d0);\n}\n.rte-bubble .bb-sep {\n width: 1px; height: 20px;\n background: var(--rte-border, #e4e7eb);\n margin: 0 4px; flex-shrink: 0;\n}\n/* Color Picker Styles */\n.rte-bubble-panel {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 6px;\n}\n.rte-swatch-list {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.rte-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n cursor: pointer;\n border: 1.5px solid var(--rte-border, #e4e7eb);\n transition: transform 0.15s ease, border-color 0.15s ease;\n position: relative;\n}\n.rte-swatch:hover {\n transform: scale(1.2);\n border-color: var(--rte-accent, #0b57d0);\n}\n.rte-swatch.active-swatch {\n border-color: var(--rte-accent, #0b57d0);\n box-shadow: 0 0 0 1px var(--rte-accent, #0b57d0);\n}\n.rte-swatch.swatch-clear {\n background: var(--bg-tertiary, #f3f4f6);\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ef4444;\n font-size: 10px;\n font-weight: 700;\n}\n.rte-swatch.swatch-clear::after {\n content: \"\";\n position: absolute;\n width: 14px;\n height: 1.5px;\n background: #ef4444;\n transform: rotate(45deg);\n}\n`;\n\nconst HIGHLIGHT_COLORS = [\n { name: 'Yellow', value: '#ffe066' },\n { name: 'Green', value: '#a9e08f' },\n { name: 'Blue', value: '#96f2d7' },\n { name: 'Sky', value: '#a5d8ff' },\n { name: 'Pink', value: '#ffc9c9' },\n { name: 'Purple', value: '#eebefa' },\n];\n\nconst TEXT_COLORS = [\n { name: 'Ink', value: '#202124' },\n { name: 'Blue', value: '#0b57d0' },\n { name: 'Red', value: '#dc2626' },\n { name: 'Green', value: '#16a34a' },\n { name: 'Purple', value: '#7c3aed' },\n { name: 'Orange', value: '#ea580c' },\n];\n\nexport default function BubbleMenu({ editor }) {\n const [activePanel, setActivePanel] = useState(null); // null, 'highlight', 'color'\n\n // Return the editor wrapper lazily. Tippy calls appendTo() when it first shows\n // the bubble (not on mount), so the element is guaranteed to be in the DOM.\n // Appending inside the editor wrapper avoids CSS transform clipping that\n // affects position:fixed elements when an ancestor has a transform (e.g. animated sidebars).\n const getEditorEl = () =>\n editor?.options?.element?.closest?.('.inkora-editor') ?? document.body;\n\n useEffect(() => {\n if (!editor) return;\n // Reset panel when selection changes\n const handleSelection = () => {\n setActivePanel(null);\n };\n editor.on('selectionUpdate', handleSelection);\n return () => {\n editor.off('selectionUpdate', handleSelection);\n };\n }, [editor]);\n\n const [showLinkModal, setShowLinkModal] = useState(false);\n\n if (!editor) return null;\n\n const insertLink = (e) => { e.preventDefault(); setShowLinkModal(true); };\n\n const handleSelectHighlight = (color) => {\n if (color) {\n editor.chain().focus().setHighlight({ color }).run();\n } else {\n editor.chain().focus().unsetHighlight().run();\n }\n setActivePanel(null);\n };\n\n const handleSelectColor = (color) => {\n if (color) {\n editor.chain().focus().setColor(color).run();\n } else {\n editor.chain().focus().unsetColor().run();\n }\n setActivePanel(null);\n };\n\n const currentHighlightColor = editor.getAttributes('highlight').color;\n const currentTextColor = editor.getAttributes('textStyle').color;\n\n return (\n <>\n <style>{BUBBLE_CSS}</style>\n <TiptapBubbleMenu\n editor={editor}\n tippyOptions={{\n duration: 120,\n placement: 'top',\n interactive: true,\n // Append inside the editor wrapper so the bubble is not affected by\n // CSS transforms on ancestor elements (which break position:fixed).\n appendTo: getEditorEl,\n popperOptions: {\n // absolute strategy positions relative to the nearest positioned\n // ancestor (the editor wrapper with position:relative), so it's\n // immune to ancestor transform/filter contexts.\n strategy: 'absolute',\n modifiers: [\n {\n name: 'preventOverflow',\n options: {\n boundary: getEditorEl(),\n padding: 8,\n altAxis: true,\n },\n },\n {\n name: 'flip',\n options: {\n boundary: getEditorEl(),\n padding: 8,\n },\n },\n ],\n },\n }}\n shouldShow={({ editor, from, to }) =>\n from !== to &&\n !editor.isActive('codeBlock') &&\n !editor.isActive('image') &&\n !editor.isActive('video')\n }\n >\n <div className=\"rte-bubble\">\n {/* Main Formatting Panel */}\n {activePanel === null && (\n <>\n <button\n className={`bb${editor.isActive('bold') ? ' active' : ''}`}\n title=\"Bold ⌘B\"\n onMouseDown={e => { e.preventDefault(); editor.chain().focus().toggleBold().run(); }}\n style={{ fontSize: 15, fontWeight: 700 }}\n >B</button>\n\n <button\n className={`bb${editor.isActive('italic') ? ' active' : ''}`}\n title=\"Italic ⌘I\"\n onMouseDown={e => { e.preventDefault(); editor.chain().focus().toggleItalic().run(); }}\n style={{ fontSize: 15, fontStyle: 'italic', fontFamily: 'Georgia, serif' }}\n >I</button>\n\n <button\n className={`bb${editor.isActive('underline') ? ' active' : ''}`}\n title=\"Underline ⌘U\"\n onMouseDown={e => { e.preventDefault(); editor.chain().focus().toggleUnderline().run(); }}\n style={{ fontSize: 15, textDecoration: 'underline' }}\n >U</button>\n\n <div className=\"bb-sep\" />\n\n {/* Highlight Trigger */}\n <button\n className={`bb${editor.isActive('highlight') ? ' active' : ''}`}\n title=\"Highlight Options\"\n onMouseDown={e => { e.preventDefault(); setActivePanel('highlight'); }}\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 15l-4 4-3-3 4-4\"/><path d=\"M14.5 4.5l5 5L11 18l-5-5 8.5-8.5Z\"/><path d=\"M4 21h7\"/>\n </svg>\n </button>\n\n {/* Color Trigger */}\n <button\n className={`bb${editor.isActive('textStyle', { color: currentTextColor }) ? ' active' : ''}`}\n title=\"Text Color Options\"\n onMouseDown={e => { e.preventDefault(); setActivePanel('color'); }}\n style={{ flexDirection: 'column', gap: 1 }}\n >\n <span style={{ fontSize: 12, fontWeight: 700, lineHeight: 1 }}>A</span>\n <span style={{ width: 14, height: 3, borderRadius: 2, background: currentTextColor || 'var(--rte-ink, #202124)' }} />\n </button>\n\n <div className=\"bb-sep\" />\n\n <button\n className={`bb${editor.isActive('link') ? ' active' : ''}`}\n title=\"Link ⌘K\"\n onMouseDown={insertLink}\n >\n <LinkIcon size={16} />\n </button>\n\n <button\n className={`bb${editor.isActive('strike') ? ' active' : ''}`}\n title=\"Strikethrough\"\n onMouseDown={e => { e.preventDefault(); editor.chain().focus().toggleStrike().run(); }}\n style={{ fontSize: 14, textDecoration: 'line-through' }}\n >S</button>\n\n <button\n className={`bb${editor.isActive('code') ? ' active' : ''}`}\n title=\"Inline code\"\n onMouseDown={e => { e.preventDefault(); editor.chain().focus().toggleCode().run(); }}\n style={{ fontFamily: 'monospace', fontSize: 13 }}\n >{'<>'}</button>\n </>\n )}\n\n {/* Highlight Color Picker Panel */}\n {activePanel === 'highlight' && (\n <div className=\"rte-bubble-panel\">\n <button \n className=\"bb\" \n title=\"Back\"\n onMouseDown={e => { e.preventDefault(); setActivePanel(null); }}\n style={{ minWidth: 26, padding: 0 }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <polyline points=\"15 18 9 12 15 6\"/>\n </svg>\n </button>\n \n <div className=\"rte-swatch-list\">\n {/* Clear Swatch */}\n <div \n className={`rte-swatch swatch-clear`}\n title=\"No Highlight\"\n onMouseDown={e => { e.preventDefault(); handleSelectHighlight(null); }}\n />\n \n {HIGHLIGHT_COLORS.map(c => (\n <div \n key={c.value}\n className={`rte-swatch${currentHighlightColor === c.value ? ' active-swatch' : ''}`}\n style={{ backgroundColor: c.value }}\n title={c.name}\n onMouseDown={e => { e.preventDefault(); handleSelectHighlight(c.value); }}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Text Color Picker Panel */}\n {activePanel === 'color' && (\n <div className=\"rte-bubble-panel\">\n <button \n className=\"bb\" \n title=\"Back\"\n onMouseDown={e => { e.preventDefault(); setActivePanel(null); }}\n style={{ minWidth: 26, padding: 0 }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <polyline points=\"15 18 9 12 15 6\"/>\n </svg>\n </button>\n\n <div className=\"rte-swatch-list\">\n {/* Clear Swatch */}\n <div \n className={`rte-swatch swatch-clear`}\n title=\"Default Color\"\n onMouseDown={e => { e.preventDefault(); handleSelectColor(null); }}\n />\n\n {TEXT_COLORS.map(c => (\n <div \n key={c.value}\n className={`rte-swatch${currentTextColor === c.value ? ' active-swatch' : ''}`}\n style={{ backgroundColor: c.value }}\n title={c.name}\n onMouseDown={e => { e.preventDefault(); handleSelectColor(c.value); }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n </TiptapBubbleMenu>\n {showLinkModal && <BubbleLinkModal editor={editor} onClose={() => setShowLinkModal(false)} />}\n </>\n );\n}\n\nfunction BubbleLinkModal({ editor, onClose }) {\n const [url, setUrl] = React.useState(() => editor?.getAttributes('link').href || '');\n const inputRef = React.useRef(null);\n React.useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n const apply = () => {\n if (!url.trim()) { editor.chain().focus().unsetLink().run(); }\n else { editor.chain().focus().setLink({ href: url.trim() }).run(); }\n onClose();\n };\n return (\n <div\n style={{ position: 'fixed', inset: 0, zIndex: 9999, display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'rgba(0,0,0,.3)' }}\n onMouseDown={onClose}\n >\n <div\n style={{ background: 'var(--rte-bar, #fff)', border: '1px solid var(--rte-border, #e4e7eb)', borderRadius: 10, padding: '18px 20px', width: 340, display: 'flex', flexDirection: 'column', gap: 12, boxShadow: '0 8px 32px rgba(0,0,0,.18)' }}\n onMouseDown={e => e.stopPropagation()}\n >\n <div style={{ fontWeight: 600, fontSize: 14, color: 'var(--rte-ink, #202124)' }}>Insert link</div>\n <input\n ref={inputRef}\n type=\"url\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={e => setUrl(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); apply(); } if (e.key === 'Escape') onClose(); }}\n style={{ width: '100%', padding: '8px 12px', fontSize: 14, borderRadius: 7, border: '1.5px solid var(--rte-border, #e4e7eb)', background: 'var(--rte-page, #fff)', color: 'var(--rte-ink, #202124)', outline: 'none', boxSizing: 'border-box' }}\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>\n {editor?.isActive('link') && (\n <button onClick={() => { editor.chain().focus().unsetLink().run(); onClose(); }} style={{ padding: '6px 12px', fontSize: 13, border: 'none', borderRadius: 6, cursor: 'pointer', background: 'transparent', color: 'var(--rte-muted, #5f6368)' }}>Remove</button>\n )}\n <button onClick={onClose} style={{ padding: '6px 12px', fontSize: 13, border: 'none', borderRadius: 6, cursor: 'pointer', background: 'transparent', color: 'var(--rte-muted, #5f6368)' }}>Cancel</button>\n <button onClick={apply} style={{ padding: '6px 14px', fontSize: 13, border: 'none', borderRadius: 6, cursor: 'pointer', background: 'var(--rte-accent, #0b57d0)', color: '#fff', fontWeight: 600 }}>Apply</button>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useMemo, useRef, useState } from 'react';\nimport { useEditor, EditorContent } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport Link from '@tiptap/extension-link';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { editorStyles } from './styles.js';\n\nconst LIGHT_VARS = {\n '--rte-page': '#ffffff',\n '--rte-bar': '#ffffff',\n '--rte-pill': '#f6f8fc',\n '--rte-hover': 'rgba(60,64,67,.09)',\n '--rte-border': '#e4e7eb',\n '--rte-ink': '#202124',\n '--rte-muted': '#5f6368',\n '--rte-accent': '#0b57d0',\n '--rte-accent-soft': '#d3e3fd',\n '--rte-shadow': '0 1px 2px rgba(0,0,0,.08),0 8px 28px rgba(0,0,0,.08)',\n};\n\nconst DARK_VARS = {\n '--rte-page': '#1f2023',\n '--rte-bar': '#26272b',\n '--rte-pill': '#2b2c30',\n '--rte-hover': 'rgba(255,255,255,.09)',\n '--rte-border': '#3c4043',\n '--rte-ink': '#e8eaed',\n '--rte-muted': '#9aa0a6',\n '--rte-accent': '#8ab4f8',\n '--rte-accent-soft': '#1e3a5f',\n '--rte-shadow': '0 1px 2px rgba(0,0,0,.5),0 10px 30px rgba(0,0,0,.45)',\n};\n\nconst TOOLBAR_CSS = `\n.bte-toolbar * { box-sizing: border-box; }\n.bte-btn {\n display: inline-flex; align-items: center; justify-content: center;\n height: 30px; min-width: 30px; padding: 0 6px; border: none;\n background: transparent; color: var(--rte-ink); border-radius: 6px;\n cursor: pointer; transition: background 0.1s; flex-shrink: 0;\n font-family: 'Roboto', Arial, sans-serif;\n}\n.bte-btn:hover { background: var(--rte-hover); }\n.bte-btn.is-active { background: var(--rte-accent-soft); color: var(--rte-accent); }\n.bte-btn:disabled { opacity: 0.35; cursor: not-allowed; pointer-events: none; }\n.bte-sep { width: 1px; height: 20px; background: var(--rte-border); margin: 0 3px; flex-shrink: 0; }\n`;\n\nfunction Btn({ active, title, disabled, onClick, children, style }) {\n return (\n <button\n className={`bte-btn${active ? ' is-active' : ''}`}\n title={title}\n disabled={disabled}\n style={style}\n onMouseDown={e => { e.preventDefault(); onClick?.(); }}\n >\n {children}\n </button>\n );\n}\n\nfunction Sep() {\n return <div className=\"bte-sep\" />;\n}\n\n/**\n * InkoraBasicEditor — lightweight plug-and-play rich text editor.\n *\n * Props:\n * value {Object} Initial content (TipTap JSON). Optional.\n * onChange {Function} Called with TipTap JSON on every change.\n * onSave {Function} Called with TipTap JSON (debounced, 1s). Optional.\n * placeholder {string} Placeholder text.\n * theme {'light'|'dark'} Default: 'light'\n * width {string|number} CSS width. Default: '100%'\n * height {string|number} Fixed height for the content area. Optional.\n * minHeight {number} Min height (px) for the content area. Default: 150.\n * readOnly {boolean} Hides toolbar and disables editing. Default: false.\n *\n * Usage:\n * import { InkoraBasicEditor } from 'inkora';\n * <InkoraBasicEditor width=\"100%\" minHeight={200} onChange={setContent} />\n */\nexport function InkoraBasicEditor({\n value,\n onChange,\n onSave,\n placeholder = 'Start writing…',\n theme = 'light',\n width = '100%',\n height,\n minHeight = 150,\n readOnly = false,\n}) {\n const cssVars = theme === 'dark' ? DARK_VARS : LIGHT_VARS;\n const saveTimerRef = useRef(null);\n\n const extensions = useMemo(() => [\n StarterKit.configure({ heading: { levels: [1, 2, 3] } }),\n Underline,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n Placeholder.configure({ placeholder }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n ], [placeholder]);\n\n const editor = useEditor({\n extensions,\n content: value,\n editable: !readOnly,\n immediatelyRender: false,\n onUpdate: ({ editor }) => {\n const json = editor.getJSON();\n onChange?.(json);\n if (onSave) {\n clearTimeout(saveTimerRef.current);\n saveTimerRef.current = setTimeout(() => onSave(json), 1000);\n }\n },\n editorProps: {\n attributes: { class: 'rte-content' },\n },\n });\n\n const [showLinkModal, setShowLinkModal] = useState(false);\n const insertLink = () => setShowLinkModal(true);\n\n const contentStyle = {\n background: 'var(--rte-page)',\n overflowY: 'auto',\n ...(height ? { height: typeof height === 'number' ? `${height}px` : height } : { minHeight }),\n };\n\n return (\n <div\n className={`inkora-basic-editor ${theme}`}\n style={{\n ...cssVars,\n width: typeof width === 'number' ? `${width}px` : width,\n borderRadius: 10,\n border: '1px solid var(--rte-border)',\n background: 'var(--rte-bar)',\n overflow: 'hidden',\n boxShadow: 'var(--rte-shadow)',\n fontFamily: \"'Roboto', Arial, sans-serif\",\n }}\n >\n <style dangerouslySetInnerHTML={{ __html: editorStyles + TOOLBAR_CSS }} />\n\n {!readOnly && (\n <div\n className=\"bte-toolbar\"\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n padding: '5px 8px',\n borderBottom: '1px solid var(--rte-border)',\n background: 'var(--rte-pill)',\n }}\n >\n {/* Undo / Redo */}\n <Btn title=\"Undo (⌘Z)\" disabled={!editor?.can().undo()} onClick={() => editor?.chain().focus().undo().run()}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 7v6h6\"/><path d=\"M3 13C5 7.333 9.333 4.667 14 4.667c4.667 0 7.333 2.667 7 8\"/>\n </svg>\n </Btn>\n <Btn title=\"Redo (⌘Y)\" disabled={!editor?.can().redo()} onClick={() => editor?.chain().focus().redo().run()}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 7v6h-6\"/><path d=\"M21 13c-2-5.667-6.333-8.333-11-8.333C5.333 4.667 2.667 7.333 3 13\"/>\n </svg>\n </Btn>\n\n <Sep />\n\n {/* Block style */}\n <Btn\n title=\"Normal text\"\n active={editor?.isActive('paragraph')}\n style={{ fontSize: 12, fontWeight: 600, minWidth: 28 }}\n onClick={() => editor?.chain().focus().setParagraph().run()}\n >¶</Btn>\n <Btn\n title=\"Heading 1\"\n active={editor?.isActive('heading', { level: 1 })}\n style={{ fontSize: 12, fontWeight: 700 }}\n onClick={() => editor?.chain().focus().toggleHeading({ level: 1 }).run()}\n >H1</Btn>\n <Btn\n title=\"Heading 2\"\n active={editor?.isActive('heading', { level: 2 })}\n style={{ fontSize: 12, fontWeight: 700 }}\n onClick={() => editor?.chain().focus().toggleHeading({ level: 2 }).run()}\n >H2</Btn>\n <Btn\n title=\"Heading 3\"\n active={editor?.isActive('heading', { level: 3 })}\n style={{ fontSize: 12, fontWeight: 700 }}\n onClick={() => editor?.chain().focus().toggleHeading({ level: 3 }).run()}\n >H3</Btn>\n\n <Sep />\n\n {/* Inline marks */}\n <Btn title=\"Bold (⌘B)\" active={editor?.isActive('bold')} style={{ fontWeight: 700, fontSize: 15 }} onClick={() => editor?.chain().focus().toggleBold().run()}>B</Btn>\n <Btn title=\"Italic (⌘I)\" active={editor?.isActive('italic')} style={{ fontStyle: 'italic', fontFamily: 'Georgia, serif', fontSize: 15 }} onClick={() => editor?.chain().focus().toggleItalic().run()}>I</Btn>\n <Btn title=\"Underline (⌘U)\" active={editor?.isActive('underline')} style={{ textDecoration: 'underline', fontSize: 15 }} onClick={() => editor?.chain().focus().toggleUnderline().run()}>U</Btn>\n <Btn title=\"Strikethrough\" active={editor?.isActive('strike')} style={{ textDecoration: 'line-through', fontSize: 15 }} onClick={() => editor?.chain().focus().toggleStrike().run()}>S</Btn>\n\n <Sep />\n\n {/* Link */}\n <Btn title=\"Link (⌘K)\" active={editor?.isActive('link')} onClick={insertLink}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/>\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\n </svg>\n </Btn>\n\n <Sep />\n\n {/* Lists */}\n <Btn title=\"Bullet list\" active={editor?.isActive('bulletList')} onClick={() => editor?.chain().focus().toggleBulletList().run()}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\"/>\n <circle cx=\"4\" cy=\"6\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"4\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"4\" cy=\"18\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>\n </svg>\n </Btn>\n <Btn title=\"Numbered list\" active={editor?.isActive('orderedList')} onClick={() => editor?.chain().focus().toggleOrderedList().run()}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\"/>\n <path d=\"M4 6h1v4\"/><path d=\"M4 10H6\"/><path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\"/>\n </svg>\n </Btn>\n\n <Sep />\n\n {/* Blockquote */}\n <Btn title=\"Blockquote\" active={editor?.isActive('blockquote')} onClick={() => editor?.chain().focus().toggleBlockquote().run()}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z\"/>\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z\"/>\n </svg>\n </Btn>\n\n <Sep />\n\n {/* Clear formatting */}\n <Btn title=\"Clear formatting\" onClick={() => editor?.chain().focus().unsetAllMarks().clearNodes().run()}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 7V5h13v2\"/><path d=\"M11 5l-2 14M14 12l6 6M20 12l-6 6\"/>\n </svg>\n </Btn>\n </div>\n )}\n\n <div style={contentStyle}>\n <div style={{ padding: '14px 18px' }}>\n <EditorContent editor={editor} />\n </div>\n </div>\n {showLinkModal && <BasicLinkModal editor={editor} onClose={() => setShowLinkModal(false)} />}\n </div>\n );\n}\n\nfunction BasicLinkModal({ editor, onClose }) {\n const [url, setUrl] = useState(() => editor?.getAttributes('link').href || '');\n const inputRef = useRef(null);\n React.useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n const apply = () => {\n if (!url.trim()) { editor?.chain().focus().unsetLink().run(); }\n else { editor?.chain().focus().setLink({ href: url.trim() }).run(); }\n onClose();\n };\n return (\n <div style={{ position: 'fixed', inset: 0, zIndex: 9999, display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'rgba(0,0,0,.3)' }} onMouseDown={onClose}>\n <div style={{ background: 'var(--rte-bar, #fff)', border: '1px solid var(--rte-border, #e4e7eb)', borderRadius: 10, padding: '18px 20px', width: 340, display: 'flex', flexDirection: 'column', gap: 12, boxShadow: '0 8px 32px rgba(0,0,0,.18)' }} onMouseDown={e => e.stopPropagation()}>\n <div style={{ fontWeight: 600, fontSize: 14, color: 'var(--rte-ink, #202124)' }}>Insert link</div>\n <input ref={inputRef} type=\"url\" placeholder=\"https://example.com\" value={url} onChange={e => setUrl(e.target.value)} onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); apply(); } if (e.key === 'Escape') onClose(); }} style={{ width: '100%', padding: '8px 12px', fontSize: 14, borderRadius: 7, border: '1.5px solid var(--rte-border, #e4e7eb)', background: 'var(--rte-page, #fff)', color: 'var(--rte-ink, #202124)', outline: 'none', boxSizing: 'border-box' }} />\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>\n {editor?.isActive('link') && <button onClick={() => { editor?.chain().focus().unsetLink().run(); onClose(); }} style={{ padding: '6px 12px', fontSize: 13, border: 'none', borderRadius: 6, cursor: 'pointer', background: 'transparent', color: 'var(--rte-muted, #5f6368)' }}>Remove</button>}\n <button onClick={onClose} style={{ padding: '6px 12px', fontSize: 13, border: 'none', borderRadius: 6, cursor: 'pointer', background: 'transparent', color: 'var(--rte-muted, #5f6368)' }}>Cancel</button>\n <button onClick={apply} style={{ padding: '6px 14px', fontSize: 13, border: 'none', borderRadius: 6, cursor: 'pointer', background: 'var(--rte-accent, #0b57d0)', color: '#fff', fontWeight: 600 }}>Apply</button>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useEffect, useState, useMemo } from 'react';\nimport { useEditor, EditorContent } from '@tiptap/react';\nimport { createEditorExtensions } from './extensions/index.js';\nimport { editorStyles } from './styles.js';\n\nexport function InkoraViewer({ content, theme = 'light' }) {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => { setIsMounted(true); }, []);\n\n const extensions = useMemo(() => createEditorExtensions({ isEditable: false }), []);\n\n const editor = useEditor({\n extensions,\n content,\n editable: false,\n immediatelyRender: false,\n editorProps: {\n attributes: { class: 'rte-content' },\n },\n });\n\n useEffect(() => {\n if (editor && content && !editor.isDestroyed) {\n editor.commands.setContent(content);\n }\n }, [content, editor]);\n\n if (!isMounted) {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12, padding: '16px 0' }}>\n {[['55%', 28], ['100%', 14], ['83%', 14], ['70%', 14]].map(([w, h], i) => (\n <div key={i} style={{\n width: w, height: h, borderRadius: 4,\n background: 'linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%)',\n backgroundSize: '200% 100%',\n animation: 'rte-shimmer 1.4s infinite',\n }} />\n ))}\n <style>{`@keyframes rte-shimmer { 0% { background-position: 200% 0 } 100% { background-position: -200% 0 } }`}</style>\n </div>\n );\n }\n\n return (\n <div className={`inkora-viewer ${theme}`} style={{ width: '100%' }}>\n <style dangerouslySetInnerHTML={{ __html: editorStyles }} />\n <div className=\"viewer-inner\" style={{ padding: '16px 20px', maxWidth: 860, margin: '0 auto' }}>\n <EditorContent editor={editor} />\n </div>\n </div>\n );\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["import_react","import_core","import_react","import_core","import_core","import_core","import_core","import_core","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","CSS","HANDLES","import_react","import_jsx_runtime","CSS","import_react","import_jsx_runtime","React","tippy","import_core","import_react","import_jsx_runtime","katex","Math","StarterKit","Underline","Highlight","Color","FontFamily","TextAlign","TaskList","TaskItem","Link","Image","_a","Subscript","Superscript","Math","Youtube","Placeholder","CharacterCount","Mention","Dropcursor","Gapcursor","CodeBlockLowlight","GlobalDragHandle","import_react","import_katex","import_react","import_jsx_runtime","import_jsx_runtime","katex","import_react","import_jsx_runtime","HIGHLIGHT_COLORS","TEXT_COLORS","TiptapBubbleMenu","editor","React","import_jsx_runtime","editor","_a","import_react","import_starter_kit","import_extension_underline","import_extension_link","import_extension_placeholder","import_extension_text_align","import_jsx_runtime","LIGHT_VARS","DARK_VARS","TOOLBAR_CSS","Sep","StarterKit","Underline","Link","Placeholder","TextAlign","editor","React","import_react","import_jsx_runtime"]}
|