@otmc/ui 0.1.5 → 0.1.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor/index.ts","../src/editor/MarkdownEditor.tsx","../src/editor/hooks/useEditor.ts","../src/editor/hooks/markdownSerializer.ts","../src/editor/extensions/CodeBlockExtension.ts","../src/editor/blocks/CodeBlock.tsx","../src/editor/components/BlockWrapper.tsx","../src/utils/commonUtils.ts","../src/contexts/ThemeProvider.tsx","../src/editor/extensions/TaskItemExtension.ts","../src/editor/blocks/TaskBlock.tsx","../src/editor/extensions/NoticeExtension.ts","../src/editor/blocks/NoticeBlock.tsx","../src/editor/extensions/TimelineExtension.ts","../src/editor/blocks/TimelineBlock.tsx","../src/editor/extensions/DiagramExtension.ts","../src/editor/blocks/DiagramBlock.tsx","../src/editor/extensions/BackgroundColor.ts","../src/editor/extensions/ImageExtension.ts","../src/editor/blocks/ImageBlock.tsx","../src/utils/debug.ts","../src/editor/components/TableOfContentsExtension.ts","../src/editor/components/TableOfContents.tsx","../src/editor/components/ReadingIndicator.tsx","../src/editor/hooks/pasteHandler.ts","../src/modals/DocumentEditor.tsx","../src/components/common/NotificationCenter.tsx","../src/api/utils.ts","../src/api/llm.ts","../src/api/instructions.ts","../src/editor/components/EditorContent.tsx","../src/editor/components/TableControls.tsx","../src/editor/components/BubbleMenu.tsx","../src/editor/components/SlashCommand.tsx","../src/editor/components/BlockRenderer.tsx","../src/editor/hooks/blockRegistry.tsx","../src/editor/extensions/createBlockNode.ts","../src/editor/utils/contentMigration.ts"],"sourcesContent":["/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nexport { default as MarkdownEditor } from './MarkdownEditor'\nexport { DocumentEditor } from '../modals/DocumentEditor'\nexport * from '../api'\nexport { useEditorWithStorage } from './hooks/useEditor'\n\nexport { EditorContent } from './components/EditorContent'\nexport { BubbleMenu } from './components/BubbleMenu'\nexport { TableControls } from './components/TableControls'\nexport { SlashCommandList, createSlashCommand } from './components/SlashCommand'\nexport { BlockRenderer } from './components/BlockRenderer'\nexport { BlockWrapper } from './components/BlockWrapper'\n\nexport { NoticeBlock } from './blocks/NoticeBlock'\nexport { TaskBlock } from './blocks/TaskBlock'\nexport { CodeBlock } from './blocks/CodeBlock'\nexport { TimelineBlock } from './blocks/TimelineBlock'\nexport { DiagramBlock } from './blocks/DiagramBlock'\n\nexport { createBlockNode, type CreateBlockNodeOptions } from './extensions/createBlockNode'\nexport { NoticeExtension } from './extensions/NoticeExtension'\nexport { TaskItemExtension } from './extensions/TaskItemExtension'\nexport { CodeBlockExtension } from './extensions/CodeBlockExtension'\nexport { TimelineExtension } from './extensions/TimelineExtension'\nexport { DiagramExtension } from './extensions/DiagramExtension'\n\nexport {\n BLOCKS,\n registerBlock,\n getBlockByType,\n filterBlocks,\n getDefaultBlockItems,\n type BlockConfig,\n type BlockNode,\n type CommandItem,\n} from './hooks/blockRegistry'\n\nexport {\n serializeToMarkdown,\n serializeSelectionToMarkdown,\n} from './hooks/markdownSerializer'\n\nexport { handlePaste } from './hooks/pasteHandler'\n\nexport {\n markdownToTiptapJSON,\n migrateToTiptapJSON,\n isTiptapJSON,\n} from './utils/contentMigration'\n\nexport {\n TableOfContentsPanel,\n type HeadingNode,\n type TableOfContentsOptions,\n} from './components/TableOfContents'\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { memo, useState, useCallback, useMemo, useEffect } from 'react'\nimport { useMantineColorScheme, useMantineTheme, Card } from '@mantine/core'\nimport { useEditorWithStorage } from './hooks/useEditor'\nimport TableOfContents from './components/TableOfContentsExtension'\nimport { TableOfContentsPanel, type HeadingNode } from './components/TableOfContents'\nimport { resolveColorScheme } from '../contexts/ThemeProvider'\nimport { handlePaste } from './hooks/pasteHandler'\nimport { EditorContent, BubbleMenu, createSlashCommand, getDefaultBlockItems } from './index'\n\ninterface EditorProps {\n initialContent?: string\n onChange?: (content: string) => void\n outputFormat?: 'html' | 'markdown' | 'json'\n showTableOfContents?: boolean\n showHeadingDividers?: boolean\n minHeight?: number\n editable?: boolean\n}\n\nconst MarkdownEditor = memo(function MarkdownEditor({\n initialContent = '<p></p>',\n onChange,\n outputFormat = 'json',\n showTableOfContents = true,\n showHeadingDividers = true,\n minHeight = 200,\n editable = true,\n}: EditorProps) {\n\n const [headings, setHeadings] = useState<HeadingNode[]>([])\n\n const handleHeadingsUpdate = useCallback((newHeadings: HeadingNode[]) => {\n setHeadings(newHeadings)\n }, [])\n\n\n const slashCommand = useMemo(() => {\n return createSlashCommand({\n char: '/',\n items: ({ editor, query }: any) => {\n const blocks = getDefaultBlockItems(editor)\n if (!query) return blocks\n return blocks.filter((item: any) =>\n item.title.toLowerCase().includes(query.toLowerCase()) ||\n item.description?.toLowerCase().includes(query.toLowerCase()) ||\n item.keywords?.some((k: string) => k.toLowerCase().includes(query.toLowerCase()))\n )\n },\n })\n }, [])\n\n const editor = useEditorWithStorage({\n initialContent,\n onContentChange: onChange,\n outputFormat,\n extensions: [\n ...(showHeadingDividers ? [] : []),\n ...(showTableOfContents ? [TableOfContents.configure({ onUpdate: handleHeadingsUpdate })] : []),\n slashCommand,\n ],\n editable,\n editorProps: {\n attributes: {\n spellCheck: 'false',\n style: 'outline:none;border:none;font-size: 15px;',\n },\n handleDOMEvents: {\n paste: (_view, event: ClipboardEvent) => {\n return handlePaste(editor, event)\n },\n },\n },\n })\n\n useEffect(() => {\n if (editor) {\n editor.setEditable(editable)\n }\n }, [editor, editable])\n\n const { colorScheme: rawColorScheme } = useMantineColorScheme()\n const theme = useMantineTheme()\n const colorScheme = resolveColorScheme(rawColorScheme)\n const bgColor = colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[0]\n\n if (!editor) return null\n\n return (\n <Card shadow=\"sm\" padding=\"md\" radius=\"18px\" bg={bgColor} withBorder style={{ position: 'relative' }}>\n {showTableOfContents && <TableOfContentsPanel headings={headings} editor={editor} />}\n <EditorContent editor={editor} minHeight={minHeight} />\n <BubbleMenu editor={editor} />\n </Card>\n )\n})\n\nMarkdownEditor.displayName = 'MarkdownEditor'\nexport default MarkdownEditor\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport type { EditorOptions } from '@tiptap/react'\nimport { useEditor } from '@tiptap/react'\nimport { useEffect, useRef } from 'react'\nimport { serializeToMarkdown } from './markdownSerializer'\nimport StarterKit from '@tiptap/starter-kit'\nimport { CodeBlockExtension } from '../extensions/CodeBlockExtension'\nimport { TaskItemExtension } from '../extensions/TaskItemExtension'\nimport { NoticeExtension } from '../extensions/NoticeExtension'\nimport { TimelineExtension } from '../extensions/TimelineExtension'\nimport { DiagramExtension } from '../extensions/DiagramExtension'\nimport { Color } from '@tiptap/extension-color'\nimport { TextStyle } from '@tiptap/extension-text-style'\nimport { BackgroundColorMark } from '../extensions/BackgroundColor'\nimport TaskList from '@tiptap/extension-task-list'\nimport { Markdown } from 'tiptap-markdown'\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table'\nimport { ImageExtension } from '../extensions/ImageExtension'\nimport BulletList from '@tiptap/extension-bullet-list'\nimport OrderedList from '@tiptap/extension-ordered-list'\nimport ListItem from '@tiptap/extension-list-item'\nimport { debug } from '../../utils/debug';\n\ninterface UseEditorWithStorageOptions extends Partial<EditorOptions> {\n initialContent?: string\n onContentChange?: (content: string) => void\n debounceDelay?: number\n outputFormat?: 'html' | 'markdown' | 'json'\n extensions?: any[]\n}\n\nexport const useEditorWithStorage = ({\n initialContent,\n onContentChange,\n debounceDelay = 500,\n outputFormat = 'html',\n extensions = [],\n ...editorOptions\n}: UseEditorWithStorageOptions) => {\n \n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const initialContentRef = useRef(initialContent)\n const hasSetInitialContent = useRef(false)\n const isUpdatingRef = useRef(false)\n const lastEmittedContentRef = useRef<string>('')\n\n const getContent = (editor: any): string => {\n if (outputFormat === 'json') {\n return JSON.stringify(editor.getJSON())\n }\n const content = outputFormat === 'markdown'\n ? serializeToMarkdown(editor)\n : editor.getHTML()\n return content\n }\n\n const editor = useEditor({\n ...editorOptions,\n extensions: [\n StarterKit.configure({\n codeBlock: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n }),\n Color,\n TextStyle,\n BackgroundColorMark,\n CodeBlockExtension,\n BulletList.configure({\n itemTypeName: 'listItem',\n }),\n OrderedList.configure({\n itemTypeName: 'listItem',\n }),\n ListItem,\n TaskList.configure({\n itemTypeName: 'taskItem',\n }),\n TaskItemExtension.configure({\n nested: true,\n }),\n NoticeExtension,\n TimelineExtension,\n DiagramExtension,\n Markdown,\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ImageExtension,\n ...extensions,\n ],\n content: (() => {\n if (initialContent) {\n try {\n const parsed = JSON.parse(initialContent);\n if (parsed.type === 'doc') {\n return parsed;\n }\n } catch {\n }\n }\n return initialContent;\n })(),\n onCreate: ({ editor }) => {\n if (outputFormat === 'json') {\n lastEmittedContentRef.current = JSON.stringify(editor.getJSON())\n } else if (outputFormat === 'markdown') {\n lastEmittedContentRef.current = serializeToMarkdown(editor)\n } else {\n lastEmittedContentRef.current = editor.getHTML()\n }\n },\n onUpdate: ({ editor }) => {\n if (!onContentChange || isUpdatingRef.current || !hasSetInitialContent.current) return\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current)\n }\n\n debounceRef.current = setTimeout(() => {\n const newContent = getContent(editor)\n\n if (newContent === lastEmittedContentRef.current) {\n debug.log('[useEditorWithStorage] Content unchanged, skipping')\n return\n }\n\n lastEmittedContentRef.current = newContent\n onContentChange(newContent)\n }, debounceDelay)\n },\n })\n\n useEffect(() => {\n if (!editor) return\n if (hasSetInitialContent.current) return\n hasSetInitialContent.current = true\n lastEmittedContentRef.current = initialContent || ''\n }, [editor])\n\n useEffect(() => {\n if (!editor || !initialContent) return\n if (hasSetInitialContent.current) return\n\n const currentContent = outputFormat === 'markdown'\n ? serializeToMarkdown(editor)\n : editor.getHTML()\n\n if (currentContent.trim() !== initialContent.trim()) {\n try {\n const jsonContent = JSON.parse(initialContent)\n editor.commands.setContent(jsonContent)\n } catch {\n editor.commands.setContent(initialContent)\n }\n hasSetInitialContent.current = true\n lastEmittedContentRef.current = initialContent\n }\n }, [editor])\n\n useEffect(() => {\n if (!editor || !initialContent) return\n if (initialContent === lastEmittedContentRef.current) return\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current)\n debounceRef.current = null\n }\n\n isUpdatingRef.current = true\n try {\n const jsonContent = JSON.parse(initialContent)\n editor.commands.setContent(jsonContent)\n } catch {\n editor.commands.setContent(initialContent)\n }\n isUpdatingRef.current = false\n initialContentRef.current = initialContent\n lastEmittedContentRef.current = initialContent\n }, [initialContent, editor])\n\n useEffect(() => {\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current)\n }\n }\n }, [])\n\n return editor\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Editor } from '@tiptap/react';\n\nexport const serializeNode = (node: any, useHtmlForMarks: boolean = false): string => {\n if (!node) return '';\n\n if (node.isText) {\n let text = node.text || '';\n const marks = node.marks || [];\n\n const bold = marks.some((m: any) => m.type.name === 'bold');\n const italic = marks.some((m: any) => m.type.name === 'italic');\n const code = marks.some((m: any) => m.type.name === 'code');\n const link = marks.find((m: any) => m.type.name === 'link');\n const textStyle = marks.find((m: any) => m.type.name === 'textStyle');\n const color = textStyle?.attrs?.color;\n const bgColorMark = marks.find((m: any) => m.type.name === 'backgroundColor');\n const backgroundColor = bgColorMark?.attrs?.color;\n\n if (code) {\n text = `\\`${text}\\``;\n } else {\n if (useHtmlForMarks) {\n if (bold) text = `<strong>${text}</strong>`;\n if (italic) text = `<em>${text}</em>`;\n if (color) text = `<span style=\"color: ${color}\">${text}</span>`;\n if (backgroundColor) text = `<span data-bg-color=\"${backgroundColor}\">${text}</span>`;\n } else {\n if (bold) text = `**${text}**`;\n if (italic) text = `*${text}*`;\n }\n if (link) text = `[${text}](${link.attrs.href})`;\n if (!useHtmlForMarks && color) {\n text = `<span style=\"color: ${color}\">${text}</span>`;\n }\n if (!useHtmlForMarks && backgroundColor) {\n text = `<span data-bg-color=\"${backgroundColor}\">${text}</span>`;\n }\n }\n\n return text;\n }\n\n let content = '';\n if (node.content && node.content.content) {\n content = node.content.content.map((child: any) => serializeNode(child)).join('');\n }\n\n switch (node.type.name) {\n case 'text':\n return content;\n\n case 'paragraph': {\n const backgroundColor = node.attrs?.backgroundColor;\n if (backgroundColor) {\n const content = node.content.content.map((child: any) => serializeNode(child, true)).join('');\n return `<p style=\"background-color: ${backgroundColor}\">${content}</p>`;\n }\n return content;\n }\n\n case 'heading': {\n const level = node.attrs?.level || 1;\n const backgroundColor = node.attrs?.backgroundColor;\n if (backgroundColor) {\n const content = node.content.content.map((child: any) => serializeNode(child, true)).join('');\n return `<h${level} style=\"background-color: ${backgroundColor}\">${content.trim()}</h${level}>`;\n }\n const prefix = '#'.repeat(level);\n return `${prefix} ${content.trim()}`;\n }\n\n case 'bulletList': {\n const items: string[] = [];\n for (const item of node.content?.content || []) {\n const itemText = serializeNode(item).trim();\n items.push(`- ${itemText}`);\n }\n return items.join('\\n');\n }\n\n case 'orderedList': {\n const items: string[] = [];\n let index = node.attrs?.start || 1;\n for (const item of node.content?.content || []) {\n const itemText = serializeNode(item).trim();\n items.push(`${index}. ${itemText}`);\n index++;\n }\n return items.join('\\n');\n }\n\n case 'taskItem': {\n const checked = node.attrs?.checked ? '[x]' : '[ ]';\n const itemText = content.trim();\n return `- ${checked} ${itemText}`;\n }\n\n case 'taskList': {\n const items: string[] = [];\n for (const item of node.content?.content || []) {\n const itemText = serializeNode(item).trim();\n items.push(itemText);\n }\n return items.join('\\n');\n }\n\n case 'blockquote': {\n const lines = content.trim().split('\\n');\n return lines.map(line => `> ${line}`).join('\\n');\n }\n\n case 'codeBlock': {\n const language = node.attrs?.language || '';\n return `\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``;\n }\n\n case 'horizontalRule':\n return '---';\n\n case 'hardBreak':\n return '\\n';\n\n case 'image':\n const src = node.attrs?.src || '';\n const alt = node.attrs?.alt || '';\n return `![${alt}](${src})`;\n\n case 'notice': {\n const variant = node.attrs?.variant || 'info';\n const title = node.attrs?.title || 'Notice';\n const backgroundColor = node.attrs?.backgroundColor;\n const contentText = node.content.content.map((child: any) => serializeNode(child, true)).join('').trim();\n\n let html = `<div data-type=\"notice\" data-variant=\"${variant}\" data-title=\"${title}\"`;\n if (backgroundColor) {\n html += ` style=\"background-color: ${backgroundColor}\"`;\n }\n html += `>${contentText}</div>`;\n return html;\n }\n\n case 'table': {\n const rows: string[] = [];\n let headerIndex = 0;\n for (const row of node.content?.content || []) {\n const cells: string[] = [];\n for (const cell of row.content?.content || []) {\n cells.push(serializeNode(cell).trim());\n }\n rows.push(`| ${cells.join(' | ')} |`);\n\n if (headerIndex === 0) {\n const separators = cells.map(() => '---');\n rows.push(`| ${separators.join(' | ')} |`);\n headerIndex++;\n }\n }\n return rows.join('\\n');\n }\n\n default:\n return content;\n }\n};\n\nexport const serializeToMarkdown = (editor: Editor): string => {\n if (!editor) return '';\n\n const nodes = editor.state.doc.content.content;\n const results: string[] = [];\n\n for (const node of nodes) {\n const serialized = serializeNode(node);\n if (serialized || node.type.name === 'paragraph') {\n results.push(serialized);\n }\n }\n\n return results.join('\\n\\n');\n};\n\nexport const serializeSelectionToMarkdown = (editor: Editor, from: number, to: number): string => {\n if (!editor) return '';\n\n const { doc } = editor.state;\n const $from = doc.resolve(from);\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n if (['bulletList', 'orderedList', 'taskList'].includes(node.type.name)) {\n return serializeNode(node);\n }\n }\n\n const selectionNode = doc.slice(from, to);\n const results: string[] = [];\n\n selectionNode.content.content.forEach((node: any) => {\n const serialized = serializeNode(node);\n if (serialized || node.type.name === 'paragraph') {\n results.push(serialized);\n }\n });\n\n return results.join('\\n\\n');\n};\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { createLowlight, common } from 'lowlight'\nimport { CodeBlock } from '../blocks/CodeBlock'\nimport { InputRule } from '@tiptap/core'\nimport { TextSelection } from '@tiptap/pm/state'\n\nconst lowlight = createLowlight(common)\n\nexport const CodeBlockExtension = CodeBlockLowlight.extend({\n addAttributes() {\n return {\n language: {\n default: '',\n parseHTML: el => el.getAttribute('data-language') || '',\n renderHTML: attrs =>\n attrs.language ? { 'data-language': attrs.language } : {},\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlock as any)\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => {\n const { state } = this.editor\n const { selection, schema } = state\n const { $from, empty } = selection\n\n if (!empty) return false\n\n const node = $from.node()\n if (node.type !== this.type) return false\n\n const isEmpty =\n !node.textContent || node.textContent === '\\u200B'\n\n if (!isEmpty) return false\n\n const pos = $from.before($from.depth)\n const tr = state.tr\n\n tr.deleteRange(pos, pos + node.nodeSize)\n\n const paragraph = schema.nodes.paragraph.create(\n null,\n schema.text('\\u200B')\n )\n\n tr.insert(pos, paragraph)\n tr.setSelection(TextSelection.create(tr.doc, pos + 1))\n\n this.editor.view.dispatch(tr)\n return true\n },\n }\n },\n\n addInputRules() {\n const type = this.type\n\n return [\n new InputRule({\n find: /^```([a-z]*)$/i,\n handler: ({ state, range, match }) => {\n const { tr } = state\n const $start = tr.doc.resolve(range.from)\n\n if (\n !$start\n .node(-1)\n .canReplaceWith($start.index(-1), $start.indexAfter(-1), type)\n ) return\n\n const lang = (match[1] || '').toLowerCase()\n\n tr.delete(range.from, range.to)\n\n const node = type.create(\n { language: lang },\n state.schema.text('\\u200B')\n )\n\n const pos = tr.mapping.map(range.from)\n\n tr.insert(pos, node)\n\n const $pos = tr.doc.resolve(pos + 1)\n tr.setSelection(TextSelection.near($pos))\n\n this.editor.view.dispatch(tr)\n },\n }),\n ]\n },\n}).configure({\n lowlight,\n HTMLAttributes: {\n class: 'code-block-custom',\n },\n})","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nimport { useState, memo, useMemo, useCallback } from 'react'\nimport { NodeViewContent, NodeViewWrapper, type ReactNodeViewProps } from '@tiptap/react'\nimport { ActionIcon, Box, Text, useMantineTheme, Select } from '@mantine/core'\nimport { IconCheck, IconCopy, IconCode, IconChevronDown } from '@tabler/icons-react'\nimport { BlockWrapper } from '../components/BlockWrapper'\nimport { copyToClipboard } from '../../utils/commonUtils'\nimport { useTheme } from '../../contexts/ThemeProvider'\n\nconst COMMON_LANGUAGES = [\n { value: '', label: 'Plain Text' },\n { value: 'bash', label: 'Bash' },\n { value: 'powershell', label: 'PowerShell' },\n { value: 'cpp', label: 'C++' },\n { value: 'c', label: 'C' },\n { value: 'go', label: 'Golang' },\n { value: 'python', label: 'Python' },\n { value: 'rust', label: 'Rust' },\n { value: 'csharp', label: 'C#' },\n { value: 'java', label: 'Java' },\n { value: 'javascript', label: 'JavaScript' },\n { value: 'typescript', label: 'TypeScript' },\n { value: 'php', label: 'PHP' },\n { value: 'ruby', label: 'Ruby' },\n { value: 'swift', label: 'Swift' },\n { value: 'kotlin', label: 'Kotlin' },\n { value: 'sql', label: 'SQL' },\n { value: 'html', label: 'HTML' },\n { value: 'css', label: 'CSS' },\n { value: 'json', label: 'JSON' },\n { value: 'xml', label: 'XML' },\n { value: 'yaml', label: 'YAML' },\n]\n\nconst CodeBlockHeader = memo(\n ({\n language,\n isDark,\n theme,\n }: {\n language: string\n isDark: boolean\n theme: any\n }) => {\n if (!language) return null\n\n return (\n <Text\n pos=\"absolute\"\n top={8}\n left={18}\n size=\"xs\"\n c={isDark ? theme.colors.dark[2] : theme.colors.gray[6]}\n style={{\n zIndex: 1,\n textTransform: 'capitalize',\n fontSize: 12,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n pointerEvents: 'none',\n gap: 4,\n }}\n >\n <IconCode size={14} />\n {language}\n </Text>\n )\n }\n)\n\nCodeBlockHeader.displayName = 'CodeBlockHeader'\n\nexport function CodeBlock({ node, updateAttributes, selected }: ReactNodeViewProps) {\n const [copied, setCopied] = useState(false)\n\n const { currentTheme } = useTheme()\n const theme = useMantineTheme()\n const isDark = currentTheme === 'dark'\n\n const language = node.attrs?.language || ''\n\n const handleCopy = useCallback(async () => {\n const success = await copyToClipboard(node.textContent)\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }\n }, [node.textContent])\n\n const handleLanguageChange = useCallback(\n (value: string | null) => {\n updateAttributes({ language: value || '' })\n },\n [updateAttributes]\n )\n\n const preStyle = useMemo<React.CSSProperties>(\n () => ({\n border: `1px solid ${isDark ? theme.colors.dark[5] : theme.colors.gray[3]}`,\n borderRadius: 10,\n padding: '8px 12px',\n overflow: 'auto',\n cursor: 'text',\n background: isDark ? '#0d1117' : '#e8f1fa',\n margin: 0,\n position: 'relative',\n }),\n [isDark, theme]\n )\n\n return (\n <NodeViewWrapper className=\"code-block-wrapper\">\n <BlockWrapper selected={selected}>\n <Box\n pos=\"relative\"\n bg={isDark ? theme.colors.dark[8] : theme.colors.gray[0]}\n style={{ borderRadius: 10 }}\n >\n <Box\n pos=\"absolute\"\n top={5}\n right={50}\n style={{\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <Select\n value={language}\n onChange={handleLanguageChange}\n data={COMMON_LANGUAGES}\n size=\"xs\"\n w={115}\n comboboxProps={{\n position: 'bottom-end',\n withinPortal: true,\n }}\n rightSection={<IconChevronDown size={14} />}\n leftSection={<IconCode size={14} color={isDark ? theme.colors.dark[2] : theme.colors.gray[6]} />}\n placeholder=\"Language\"\n clearable={false}\n searchable={false}\n styles={{\n input: {\n background: isDark ? '#292a2b' : '#f6f8fa',\n borderColor: isDark ? theme.colors.dark[5] : theme.colors.gray[3],\n height: 28,\n minHeight: 28,\n borderRadius: 12,\n },\n dropdown: {\n borderRadius: 12,\n },\n }}\n />\n </Box>\n\n <ActionIcon\n pos=\"absolute\"\n top={5}\n right={5}\n color={isDark ? 'dark' : 'gray'}\n variant=\"subtle\"\n radius=\"md\"\n onClick={handleCopy}\n style={{ zIndex: 2 }}\n title={copied ? 'Copied!' : 'Copy code'}\n >\n {copied ? <IconCheck color=\"green\" size={16} /> : <IconCopy size={16} />}\n </ActionIcon>\n\n <pre style={preStyle} className={isDark ? 'hljs-dark' : 'hljs-light'}>\n <code>\n <NodeViewContent />\n </code>\n </pre>\n </Box>\n </BlockWrapper>\n <style>{`\n .code-block-wrapper .ProseMirror-trailingBreak {\n display: none;\n }\n .hljs-light {\n color: #24292f;\n background: #f3faff !important;\n }\n .hljs-light .hljs-doctag,\n .hljs-light .hljs-keyword,\n .hljs-light .hljs-meta .hljs-keyword,\n .hljs-light .hljs-template-tag,\n .hljs-light .hljs-template-variable,\n .hljs-light .hljs-type,\n .hljs-light .hljs-variable.language_ {\n color: #d73a49;\n }\n .hljs-light .hljs-title,\n .hljs-light .hljs-title.class_,\n .hljs-light .hljs-title.class_.inherited__,\n .hljs-light .hljs-title.function_ {\n color: #6f42c1;\n }\n .hljs-light .hljs-attr,\n .hljs-light .hljs-attribute,\n .hljs-light .hljs-literal,\n .hljs-light .hljs-meta,\n .hljs-light .hljs-number,\n .hljs-light .hljs-operator,\n .hljs-light .hljs-selector-attr,\n .hljs-light .hljs-selector-class,\n .hljs-light .hljs-selector-id,\n .hljs-light .hljs-variable {\n color: #005cc5;\n }\n .hljs-light .hljs-meta .hljs-string,\n .hljs-light .hljs-regexp,\n .hljs-light .hljs-string {\n color: #0a3069;\n }\n .hljs-light .hljs-built_in,\n .hljs-light .hljs-symbol {\n color: #b56b3a;\n }\n .hljs-light .hljs-code,\n .hljs-light .hljs-comment,\n .hljs-light .hljs-formula {\n color: #6a737d;\n }\n .hljs-light .hljs-name,\n .hljs-light .hljs-quote,\n .hljs-light .hljs-selector-pseudo,\n .hljs-light .hljs-selector-tag {\n color: #22863a;\n }\n .hljs-light .hljs-subst {\n color: #24292f;\n }\n .hljs-light .hljs-section {\n color: #005cc5;\n font-weight: 700;\n }\n .hljs-light .hljs-bullet {\n color: #735c0f;\n }\n .hljs-light .hljs-emphasis {\n color: #24292f;\n font-style: italic;\n }\n .hljs-light .hljs-strong {\n color: #24292f;\n font-weight: 700;\n }\n\n .hljs-dark {\n color: #c9d1d9;\n background: #292a2b !important;\n }\n .hljs-dark .hljs-doctag,\n .hljs-dark .hljs-keyword,\n .hljs-dark .hljs-meta .hljs-keyword,\n .hljs-dark .hljs-template-tag,\n .hljs-dark .hljs-template-variable,\n .hljs-dark .hljs-type,\n .hljs-dark .hljs-variable.language_ {\n color: #ff7b72;\n }\n .hljs-dark .hljs-title,\n .hljs-dark .hljs-title.class_,\n .hljs-dark .hljs-title.class_.inherited__,\n .hljs-dark .hljs-title.function_ {\n color: #d2a8ff;\n }\n .hljs-dark .hljs-attr,\n .hljs-dark .hljs-attribute,\n .hljs-dark .hljs-literal,\n .hljs-dark .hljs-meta,\n .hljs-dark .hljs-number,\n .hljs-dark .hljs-operator,\n .hljs-dark .hljs-selector-attr,\n .hljs-dark .hljs-selector-class,\n .hljs-dark .hljs-selector-id,\n .hljs-dark .hljs-variable {\n color: #79c0ff;\n }\n .hljs-dark .hljs-meta .hljs-string,\n .hljs-dark .hljs-regexp,\n .hljs-dark .hljs-string {\n color: #a5d6ff;\n }\n .hljs-dark .hljs-built_in,\n .hljs-dark .hljs-symbol {\n color: #ffa657;\n }\n .hljs-dark .hljs-code,\n .hljs-dark .hljs-comment,\n .hljs-dark .hljs-formula {\n color: #8b949e;\n }\n .hljs-dark .hljs-name,\n .hljs-dark .hljs-quote,\n .hljs-dark .hljs-selector-pseudo,\n .hljs-dark .hljs-selector-tag {\n color: #7ee787;\n }\n .hljs-dark .hljs-subst {\n color: #c9d1d9;\n }\n .hljs-dark .hljs-section {\n color: #1f6feb;\n font-weight: 700;\n }\n .hljs-dark .hljs-bullet {\n color: #f2cc60;\n }\n .hljs-dark .hljs-emphasis {\n color: #c9d1d9;\n font-style: italic;\n }\n .hljs-dark .hljs-strong {\n color: #c9d1d9;\n font-weight: 700;\n }\n `}</style>\n </NodeViewWrapper>\n )\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Box, type BoxProps } from '@mantine/core'\n\ninterface BlockWrapperProps extends BoxProps {\n children: React.ReactNode\n selected?: boolean\n}\n\nexport function BlockWrapper({ children, selected, ...props }: BlockWrapperProps) {\n return (\n <Box\n px={0}\n py={4}\n style={{\n borderRadius: 8,\n backgroundColor: selected ? 'var(--mantine-color-blue-light)' : 'transparent',\n transition: 'background-color 0.15s ease',\n }}\n {...props}\n >\n {children}\n </Box>\n )\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nexport const copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n \n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n \n const success = document.execCommand('copy');\n document.body.removeChild(textarea);\n \n return success;\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n return false;\n }\n};\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nimport React, { createContext, useContext, useEffect, useState } from 'react';\nimport {\n useMantineColorScheme,\n type MantineColorScheme,\n} from '@mantine/core';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto' | 'time-based';\n\nexport interface TimeBasedSettings {\n lightStartTime: string;\n darkStartTime: string;\n}\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: ThemeMode;\n defaultTimeBasedSettings?: TimeBasedSettings;\n storagePrefix?: string;\n}\n\nexport interface ThemeContextType {\n theme: ThemeMode;\n currentTheme: 'light' | 'dark';\n setTheme: (theme: ThemeMode) => void;\n toggleTheme: () => void;\n timeBasedSettings: TimeBasedSettings;\n setTimeBasedSettings: (v: TimeBasedSettings) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport const useTheme = () => {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error('useTheme must be used inside ThemeProvider');\n }\n return ctx;\n};\n\nexport const resolveColorScheme = (colorScheme: 'light' | 'dark' | 'auto'): 'light' | 'dark' => {\n if (colorScheme === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return colorScheme;\n};\n\nconst resolveTimeBasedTheme = (\n settings: TimeBasedSettings\n): 'light' | 'dark' => {\n const now = new Date();\n const minutes = now.getHours() * 60 + now.getMinutes();\n\n const [lh, lm] = settings.lightStartTime.split(':').map(Number);\n const [dh, dm] = settings.darkStartTime.split(':').map(Number);\n\n const light = lh * 60 + lm;\n const dark = dh * 60 + dm;\n\n return light < dark\n ? minutes >= light && minutes < dark\n ? 'light'\n : 'dark'\n : minutes >= light || minutes < dark\n ? 'light'\n : 'dark';\n};\n\nconst resolveAutoScheme = (): 'light' | 'dark' =>\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n defaultTheme = 'auto',\n defaultTimeBasedSettings = {\n lightStartTime: '07:00',\n darkStartTime: '19:00',\n },\n storagePrefix = '',\n}) => {\n const themeStorageKey = `${storagePrefix}theme`;\n const timeStorageKey = `${storagePrefix}time-theme`;\n\n const { colorScheme, setColorScheme } = useMantineColorScheme();\n\n const [theme, setThemeState] = useState<ThemeMode>(\n () => (localStorage.getItem(themeStorageKey) as ThemeMode) ?? defaultTheme\n );\n\n const [timeBasedSettings, setTimeBasedSettings] =\n useState<TimeBasedSettings>(() =>\n JSON.parse(localStorage.getItem(timeStorageKey) || 'null') ??\n defaultTimeBasedSettings\n );\n\n const handleSetTimeBasedSettings = (settings: TimeBasedSettings) => {\n setTimeBasedSettings(settings);\n localStorage.setItem(timeStorageKey, JSON.stringify(settings));\n if (theme === 'time-based') {\n applyTheme('time-based');\n }\n };\n\n const applyTheme = (mode: ThemeMode) => {\n let scheme: MantineColorScheme;\n\n switch (mode) {\n case 'light':\n case 'dark':\n case 'auto':\n scheme = mode;\n break;\n case 'time-based':\n scheme = resolveTimeBasedTheme(timeBasedSettings);\n break;\n default:\n scheme = 'auto';\n }\n\n setColorScheme(scheme);\n };\n\n useEffect(() => {\n applyTheme(theme);\n }, [theme, timeBasedSettings]);\n\n const setTheme = (mode: ThemeMode) => {\n setThemeState(mode);\n localStorage.setItem(themeStorageKey, mode);\n applyTheme(mode);\n };\n\n const toggleTheme = () => {\n setTheme(colorScheme === 'dark' ? 'light' : 'dark');\n };\n\n const currentTheme: 'light' | 'dark' =\n theme === 'time-based'\n ? resolveTimeBasedTheme(timeBasedSettings)\n : colorScheme === 'auto'\n ? resolveAutoScheme()\n : colorScheme;\n\n return (\n <ThemeContext.Provider\n value={{\n theme,\n currentTheme,\n setTheme,\n toggleTheme,\n timeBasedSettings,\n setTimeBasedSettings: handleSetTimeBasedSettings,\n }}\n >\n {children}\n </ThemeContext.Provider>\n );\n};\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport TaskItem from '@tiptap/extension-task-item'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { TaskBlock } from '../blocks/TaskBlock'\n\nexport const TaskItemExtension = TaskItem.extend({\n addNodeView() {\n return ReactNodeViewRenderer(TaskBlock)\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { NodeViewWrapper, NodeViewContent, type ReactNodeViewProps } from '@tiptap/react'\nimport { Checkbox, useMantineTheme, useMantineColorScheme } from '@mantine/core'\nimport { memo, useCallback } from 'react'\n\ninterface TaskItemProps {\n node: any\n updateAttributes: (attrs: any) => void\n}\n\nfunction useToggle(updateAttributes: TaskItemProps['updateAttributes']) {\n return useCallback(\n (checked: boolean) => {\n updateAttributes({ checked })\n },\n [updateAttributes]\n )\n}\n\nexport const TaskBlock = memo(({ node, updateAttributes }: ReactNodeViewProps) => {\n const theme = useMantineTheme()\n const { colorScheme } = useMantineColorScheme()\n const isChecked = node.attrs.checked\n const toggle = useToggle(updateAttributes)\n\n const textColor = isChecked\n ? (colorScheme === 'dark' ? theme.colors.green[2] : theme.colors.green[9])\n : (colorScheme === 'dark' ? theme.colors.blue[2] : theme.colors.blue[9])\n\n return (\n <NodeViewWrapper\n as=\"li\"\n data-type=\"taskItem\"\n data-checked={isChecked}\n style={{\n margin: '6px 0',\n marginLeft: '-1.2em',\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n }}\n >\n <Checkbox\n checked={isChecked}\n onChange={e => toggle(e.currentTarget.checked)}\n size=\"md\"\n styles={{\n root: {\n display: 'flex',\n alignItems: 'center',\n },\n input: {\n cursor: 'pointer',\n width: 22,\n height: 22,\n },\n }}\n />\n\n <NodeViewContent\n as=\"div\"\n style={{\n flex: 1,\n color: textColor,\n fontWeight: 600,\n opacity: isChecked ? 0.7 : 0.9,\n textDecoration: isChecked ? 'line-through' : 'none',\n }}\n />\n\n <style>{`\n div[data-node-view-content] p {\n margin: 0;\n display: inline;\n line-height: 1.8;\n }\n `}</style>\n </NodeViewWrapper>\n )\n})\n\nTaskBlock.displayName = 'TaskBlock'\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { NoticeBlock } from '../blocks/NoticeBlock'\n\nexport const NoticeExtension = Node.create({\n name: 'notice',\n group: 'block',\n content: 'block+',\n defining: true,\n draggable: true,\n\n addAttributes() {\n return {\n variant: {\n default: 'info',\n parseHTML: element => element.getAttribute('data-variant'),\n renderHTML: attributes => ({ 'data-variant': attributes.variant }),\n },\n title: {\n default: 'Note',\n parseHTML: element => element.getAttribute('data-title'),\n renderHTML: attributes => ({ 'data-title': attributes.title }),\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"notice\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'notice' }), 0]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(NoticeBlock)\n },\n\n addCommands() {\n return {\n setNotice:\n (attrs?: { variant?: string; title?: string }) =>\n ({ commands }: any) => {\n return commands.insertContent({\n type: this.name,\n attrs,\n content: [{ type: 'paragraph' }],\n })\n },\n toggleNotice: () => ({ commands }: any) => {\n return commands.toggleNode(this.name, 'paragraph')\n },\n } as any\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { NodeViewWrapper, NodeViewContent, type ReactNodeViewProps } from '@tiptap/react'\nimport { Alert, ActionIcon, Menu, TextInput, Box } from '@mantine/core'\nimport {\n IconAlertCircle,\n IconInfoCircle,\n IconCheck,\n IconExclamationMark,\n IconSettings,\n IconTrash,\n} from '@tabler/icons-react'\nimport { BlockWrapper } from '../components/BlockWrapper'\n\nconst VARIANTS = [\n { value: 'info', icon: <IconInfoCircle size={18} />, color: 'blue', label: 'Thông tin' },\n { value: 'success', icon: <IconCheck size={18} />, color: 'teal', label: 'Thành công' },\n { value: 'warning', icon: <IconExclamationMark size={18} />, color: 'orange', label: 'Cảnh báo' },\n { value: 'error', icon: <IconAlertCircle size={18} />, color: 'red', label: 'Lỗi' },\n] as const\n\nexport function NoticeBlock({ node, updateAttributes, deleteNode }: ReactNodeViewProps) {\n const { variant = 'info', title = 'Note' } = (node as any).attrs || {}\n const currentVariant = VARIANTS.find(v => v.value === variant) || VARIANTS[0]\n\n return (\n <NodeViewWrapper className=\"notice-block-wrapper\">\n <BlockWrapper>\n <Box style={{ position: 'relative' }}>\n <div\n style={{\n position: 'absolute',\n top: '8px',\n right: '8px',\n zIndex: 10,\n display: 'flex',\n gap: '4px',\n }}\n >\n <Menu shadow=\"md\" width={180} position=\"bottom-end\" withArrow>\n <Menu.Target>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"sm\"\n className=\"notice-settings-btn\"\n style={{ opacity: 0.4 }}\n >\n <IconSettings size={16} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Label>Loại hiển thị</Menu.Label>\n {VARIANTS.map(v => (\n <Menu.Item\n key={v.value}\n leftSection={v.icon}\n onClick={() => updateAttributes?.({ variant: v.value })}\n style={{ iconSize: 16 }}\n >\n {v.label}\n </Menu.Item>\n ))}\n <Menu.Divider />\n <Menu.Item\n color=\"red\"\n leftSection={<IconTrash size={18} />}\n onClick={() => deleteNode?.()}\n >\n Xóa khối\n </Menu.Item>\n </Menu.Dropdown>\n </Menu>\n </div>\n\n <Alert\n variant=\"light\"\n color={currentVariant.color}\n icon={currentVariant.icon}\n radius=\"md\"\n styles={{\n root: {\n padding: '4px 10px',\n border: 'none',\n backgroundColor: `var(--mantine-color-${currentVariant.color}-light)`,\n borderLeft: `4px solid var(--mantine-color-${currentVariant.color}-filled)`,\n },\n icon: {\n marginRight: '4px',\n marginTop: '10px',\n },\n wrapper: {\n gap: '4px',\n },\n }}\n >\n <TextInput\n placeholder=\"Nhập tiêu đề...\"\n variant=\"unstyled\"\n value={title}\n onChange={e => updateAttributes?.({ title: e.target.value })}\n styles={{\n input: {\n fontWeight: 700,\n fontSize: '1.05rem',\n minHeight: 'auto',\n padding: 0,\n height: 'auto',\n color: `var(--mantine-color-${currentVariant.color}-filled)`,\n letterSpacing: '-0.01em',\n },\n }}\n />\n\n <Box style={{ marginTop: '-6px', marginBottom: '12px', fontSize: '0.95rem', lineHeight: 1.6 }}>\n <NodeViewContent className=\"notice-content-area\" />\n </Box>\n </Alert>\n </Box>\n </BlockWrapper>\n\n <style>{`\n .notice-block-wrapper:hover .notice-settings-btn {\n opacity: 1 !important;\n }\n .notice-content-area {\n min-height: 1.2em;\n }\n .notice-content-area:focus {\n outline: none;\n }\n `}</style>\n </NodeViewWrapper>\n )\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { TimelineBlock } from '../blocks/TimelineBlock'\n\nexport const TimelineExtension = Node.create({\n name: 'timeline',\n group: 'block',\n draggable: true,\n isolating: true,\n\n addAttributes() {\n return {\n items: {\n default: [],\n parseHTML: element => {\n const json = element.getAttribute('data-items')\n return json ? JSON.parse(json) : []\n },\n renderHTML: attributes => ({\n 'data-items': JSON.stringify(attributes.items),\n }),\n },\n active: {\n default: 0,\n parseHTML: element => parseInt(element.getAttribute('data-active') || '0', 10),\n renderHTML: attributes => ({\n 'data-active': attributes.active,\n }),\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"timeline\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'timeline' })]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TimelineBlock)\n },\n\n addCommands() {\n return {\n setTimeline:\n () =>\n ({ commands }: any) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n items: [],\n active: 0,\n },\n })\n },\n } as any\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { NodeViewWrapper, type ReactNodeViewProps } from '@tiptap/react'\nimport {\n Box,\n ActionIcon,\n Menu,\n TextInput,\n Textarea,\n Button,\n Timeline,\n Group,\n Text,\n Paper,\n Stack,\n Tooltip,\n Badge,\n rem,\n UnstyledButton,\n} from '@mantine/core'\nimport {\n IconSettings,\n IconTrash,\n IconPlus,\n IconCalendar,\n IconEdit,\n IconEye,\n IconCheck,\n} from '@tabler/icons-react'\nimport { BlockWrapper } from '../components/BlockWrapper'\nimport { useState, useCallback } from 'react'\n\ninterface TimelineItem {\n id: string\n title: string\n description: string\n date?: string\n}\n\ninterface TimelineData {\n items: TimelineItem[]\n active?: number\n}\n\nconst generateId = () => Math.random().toString(36).substring(7)\n\nexport function TimelineBlock({ node, updateAttributes, deleteNode }: ReactNodeViewProps) {\n const { items = [], active = 0 } = (node.attrs as TimelineData)\n const [isEditMode, setIsEditMode] = useState(false)\n const [editingItemId, setEditingItemId] = useState<string | null>(null)\n\n const handleUpdateItems = useCallback((newItems: TimelineItem[]) => {\n updateAttributes({ items: newItems })\n }, [updateAttributes])\n\n const addTimelineItem = useCallback(() => {\n const newItem: TimelineItem = {\n id: generateId(),\n title: '',\n description: '',\n date: new Date().toLocaleDateString('vi-VN'),\n }\n handleUpdateItems([...items, newItem])\n setEditingItemId(newItem.id)\n setIsEditMode(true)\n }, [items, handleUpdateItems])\n\n const updateTimelineItem = (index: number, updates: Partial<TimelineItem>) => {\n const newItems = [...items]\n newItems[index] = { ...newItems[index], ...updates }\n handleUpdateItems(newItems)\n }\n\n const deleteTimelineItem = (index: number) => {\n const newItems = items.filter((_, i) => i !== index)\n handleUpdateItems(newItems)\n setEditingItemId(null)\n }\n\n return (\n <NodeViewWrapper className=\"timeline-block\">\n <BlockWrapper>\n <Paper \n withBorder \n p=\"md\" \n radius=\"md\" \n pos=\"relative\"\n style={{ transition: 'border-color 0.2s ease' }}\n >\n <Group \n gap={5} \n pos=\"absolute\" \n top={8} \n right={8} \n style={{ zIndex: 10 }}\n >\n <Tooltip label={isEditMode ? \"Xem trước\" : \"Chỉnh sửa\"}>\n <ActionIcon \n size=\"sm\"\n variant=\"subtle\" \n color={isEditMode ? \"blue\" : \"gray\"}\n onClick={() => {\n setIsEditMode(!isEditMode)\n setEditingItemId(null)\n }}\n >\n {isEditMode ? <IconEye size={16} /> : <IconEdit size={16} />}\n </ActionIcon>\n </Tooltip>\n\n <Menu position=\"bottom-end\" withinPortal shadow=\"md\">\n <Menu.Target>\n <ActionIcon size=\"sm\" variant=\"subtle\" color=\"gray\">\n <IconSettings size={16} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Item leftSection={<IconPlus size={14}/>} onClick={addTimelineItem}>Thêm sự kiện</Menu.Item>\n <Menu.Divider />\n <Menu.Item color=\"red\" leftSection={<IconTrash size={14}/>} onClick={() => deleteNode()}>Xóa block</Menu.Item>\n </Menu.Dropdown>\n </Menu>\n </Group>\n\n <Timeline active={active} bulletSize={28} lineWidth={2}>\n {items.map((item, index) => {\n const isItemEditing = editingItemId === item.id && isEditMode;\n\n return (\n <Timeline.Item\n key={item.id}\n bullet={\n <UnstyledButton\n onClick={() => updateAttributes({ active: index })}\n style={{\n fontSize: rem(10),\n fontWeight: 800,\n textAlign: 'center',\n width: '100%'\n }}\n >\n {index + 1}\n </UnstyledButton>\n }\n >\n <Box\n p=\"xs\"\n style={{\n borderRadius: 'var(--mantine-radius-sm)',\n border: isItemEditing \n ? '1px solid var(--mantine-color-blue-light)' \n : '1px solid transparent',\n backgroundColor: isItemEditing \n ? 'var(--mantine-color-blue-light-hover)' \n : 'transparent',\n transition: 'all 0.15s ease'\n }}\n >\n {isItemEditing ? (\n <Stack gap=\"xs\">\n <TextInput\n variant=\"unstyled\"\n placeholder=\"Ngày tháng...\"\n value={item.date}\n onChange={(e) => updateTimelineItem(index, { date: e.currentTarget.value })}\n size=\"xs\"\n leftSection={<IconCalendar size={14} />}\n styles={{ input: { minHeight: 0, height: rem(20) }}}\n />\n <TextInput\n variant=\"unstyled\"\n placeholder=\"Tiêu đề...\"\n value={item.title}\n onChange={(e) => updateTimelineItem(index, { title: e.currentTarget.value })}\n fw={700}\n size=\"sm\"\n styles={{ input: { minHeight: 0, height: rem(24), fontSize: rem(15) }}}\n />\n <Textarea\n variant=\"unstyled\"\n placeholder=\"Mô tả...\"\n value={item.description}\n onChange={(e) => updateTimelineItem(index, { description: e.currentTarget.value })}\n size=\"sm\"\n autosize\n minRows={1}\n styles={{ input: { padding: 0, lineHeight: 1.4 }}}\n />\n <Group justify=\"flex-end\" gap={5}>\n <ActionIcon size=\"sm\" color=\"red\" variant=\"subtle\" onClick={() => deleteTimelineItem(index)}>\n <IconTrash size={14} />\n </ActionIcon>\n <ActionIcon size=\"sm\" color=\"blue\" variant=\"light\" onClick={() => setEditingItemId(null)}>\n <IconCheck size={14} />\n </ActionIcon>\n </Group>\n </Stack>\n ) : (\n <Box \n onClick={() => isEditMode && setEditingItemId(item.id)}\n style={{ cursor: isEditMode ? 'pointer' : 'default' }}\n >\n <Group gap={6} mb={2}>\n {item.date ? (\n <Badge size=\"xs\" variant=\"dot\" color=\"blue\">{item.date}</Badge>\n ) : isEditMode && (\n <Text size=\"xs\" c=\"dimmed\" fs=\"italic\">Thêm ngày...</Text>\n )}\n </Group>\n <Text size=\"sm\" fw={700} c={item.title ? 'inherit' : 'dimmed'}>\n {item.title || (isEditMode ? 'Nhấn để nhập tiêu đề...' : 'Sự kiện không tên')}\n </Text>\n <Text size=\"xs\" c=\"dimmed\" lineClamp={2} mt={2}>\n {item.description || (isEditMode ? 'Thêm mô tả...' : '')}\n </Text>\n </Box>\n )}\n </Box>\n </Timeline.Item>\n )\n })}\n </Timeline>\n\n {isEditMode && (\n <Button\n variant=\"subtle\"\n fullWidth\n mt=\"sm\"\n size=\"xs\"\n leftSection={<IconPlus size={14} />}\n onClick={addTimelineItem}\n color=\"blue\"\n >\n Thêm mốc thời gian\n </Button>\n )}\n </Paper>\n </BlockWrapper>\n\n <style>{`\n .timeline-block:hover .timeline-toolbar {\n opacity: 1 !important;\n }\n .timeline-block input, .timeline-block textarea {\n font-family: inherit !important;\n }\n `}</style>\n </NodeViewWrapper>\n )\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { DiagramBlock } from '../blocks/DiagramBlock'\n\nexport const DiagramExtension = Node.create({\n name: 'diagram',\n group: 'block',\n draggable: true,\n isolating: true,\n\n addAttributes() {\n return {\n code: {\n default: '',\n parseHTML: element => element.getAttribute('data-code') || '',\n renderHTML: attributes => ({\n 'data-code': attributes.code || '',\n }),\n },\n type: {\n default: 'graph',\n parseHTML: element => element.getAttribute('data-type') || 'graph',\n renderHTML: attributes => ({\n 'data-type': attributes.type || 'graph',\n }),\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"diagram\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'diagram' })]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(DiagramBlock)\n },\n\n addCommands() {\n return {\n setDiagram:\n () =>\n ({ commands }: any) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n code: '',\n type: 'graph',\n },\n })\n },\n } as any\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nimport { NodeViewWrapper, type ReactNodeViewProps } from '@tiptap/react'\nimport {\n Box,\n ActionIcon,\n Menu,\n Textarea,\n Button,\n Text,\n Select,\n Group,\n Alert,\n Paper,\n Tooltip,\n useComputedColorScheme,\n rem,\n} from '@mantine/core'\nimport {\n IconSettings,\n IconTrash,\n IconChartArea,\n IconEye,\n IconCode,\n IconAlertCircle,\n IconDeviceFloppy,\n IconRefresh,\n} from '@tabler/icons-react'\nimport { BlockWrapper } from '../components/BlockWrapper'\nimport { useState, useEffect, useRef, useCallback } from 'react'\nimport mermaid from 'mermaid'\n\nconst DIAGRAM_TYPES = [\n { value: 'graph', label: 'Flowchart', example: 'graph TD\\n A[Bắt đầu] --> B{Hợp lệ?}\\n B -->|Có| C[Xử lý]\\n B -->|Không| D[Kết thúc]' },\n { value: 'sequenceDiagram', label: 'Sequence Diagram', example: 'sequenceDiagram\\n Client->>Server: Request\\n Server-->>Client: Response' },\n { value: 'classDiagram', label: 'Class Diagram', example: 'classDiagram\\n Animal <|-- Duck\\n Animal : +int age\\n Animal: +isAlive()' },\n { value: 'stateDiagram-v2', label: 'State Diagram', example: 'stateDiagram-v2\\n [*] --> Idle\\n Idle --> Processing\\n Processing --> [*]' },\n { value: 'erDiagram', label: 'ER Diagram', example: 'erDiagram\\n USER ||--o{ POST : writes' },\n { value: 'pie', label: 'Pie Chart', example: 'pie title Thống kê\\n \"Data A\" : 45\\n \"Data B\" : 55' },\n]\n\nexport function DiagramBlock({ node, updateAttributes, deleteNode }: ReactNodeViewProps) {\n const { code = '', type = 'graph' } = node.attrs\n const [isEditing, setIsEditing] = useState(!code)\n const [previewError, setPreviewError] = useState<string | null>(null)\n const [localCode, setLocalCode] = useState(code)\n const mermaidRef = useRef<HTMLDivElement>(null)\n \n const computedColorScheme = useComputedColorScheme('light')\n\n useEffect(() => {\n mermaid.initialize({\n startOnLoad: false,\n theme: computedColorScheme === 'dark' ? 'dark' : 'default',\n securityLevel: 'loose',\n fontFamily: 'inherit',\n look: 'handDrawn',\n })\n }, [computedColorScheme])\n\n const renderMermaid = useCallback(async (codeToRender: string) => {\n if (!mermaidRef.current || !codeToRender.trim()) return\n\n try {\n setPreviewError(null)\n mermaidRef.current.innerHTML = ''\n \n const id = `mermaid-${Math.random().toString(36).substr(2, 9)}`\n const { svg } = await mermaid.render(id, codeToRender)\n \n if (mermaidRef.current) {\n mermaidRef.current.innerHTML = svg\n }\n } catch (error: any) {\n setPreviewError(error?.str || error?.message || 'Lỗi cú pháp Mermaid')\n }\n }, [])\n\n useEffect(() => {\n if (!isEditing && localCode) {\n renderMermaid(localCode)\n }\n }, [isEditing, localCode, renderMermaid, computedColorScheme])\n\n const handleSave = () => {\n updateAttributes({ code: localCode, type })\n setIsEditing(false)\n }\n\n const handleTypeChange = (newType: string | null) => {\n if (!newType) return\n const selected = DIAGRAM_TYPES.find(t => t.value === newType)\n if (selected) {\n setLocalCode(selected.example)\n updateAttributes({ code: selected.example, type: newType })\n }\n }\n\n return (\n <NodeViewWrapper className=\"diagram-block-group\">\n <BlockWrapper>\n <Paper \n withBorder \n radius=\"md\" \n shadow=\"sm\" \n pos=\"relative\"\n style={{ overflow: 'hidden' }}\n >\n <Group \n justify=\"space-between\" \n p=\"xs\" \n bg=\"var(--mantine-color-default-hover)\"\n style={{ borderBottom: '1px solid var(--mantine-color-default-border)' }}\n >\n <Group gap=\"xs\">\n <IconChartArea size={18} color=\"var(--mantine-color-blue-filled)\" />\n <Text size=\"xs\" fw={700} tt=\"uppercase\" c=\"dimmed\">\n {DIAGRAM_TYPES.find(t => t.value === type)?.label || 'Diagram'}\n </Text>\n </Group>\n\n <Group gap={4}>\n <Tooltip label={isEditing ? 'Xem trước' : 'Sửa code'}>\n <ActionIcon \n variant=\"subtle\" \n color=\"gray\" \n onClick={() => setIsEditing(!isEditing)}\n >\n {isEditing ? <IconEye size={18} /> : <IconCode size={18} />}\n </ActionIcon>\n </Tooltip>\n\n <Menu position=\"bottom-end\" withArrow shadow=\"md\">\n <Menu.Target>\n <ActionIcon variant=\"subtle\" color=\"gray\">\n <IconSettings size={18} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Label>Loại biểu đồ</Menu.Label>\n {DIAGRAM_TYPES.map(t => (\n <Menu.Item key={t.value} onClick={() => handleTypeChange(t.value)}>\n {t.label}\n </Menu.Item>\n ))}\n <Menu.Divider />\n <Menu.Item\n color=\"red\"\n leftSection={<IconTrash size={16} />}\n onClick={() => deleteNode()}\n >\n Xóa biểu đồ\n </Menu.Item>\n </Menu.Dropdown>\n </Menu>\n </Group>\n </Group>\n\n <Box p=\"md\">\n {isEditing ? (\n <Box>\n <Select\n data={DIAGRAM_TYPES}\n value={type}\n onChange={handleTypeChange}\n label=\"Kiểu biểu đồ\"\n size=\"xs\"\n mb=\"sm\"\n />\n <Textarea\n placeholder=\"Nhập code Mermaid tại đây...\"\n value={localCode}\n onChange={(e) => setLocalCode(e.currentTarget.value)}\n minRows={6}\n maxRows={20}\n autosize\n styles={{\n input: {\n fontFamily: 'var(--mantine-font-family-monospace)',\n fontSize: rem(13),\n backgroundColor: 'var(--mantine-color-body)',\n }\n }}\n />\n <Group justify=\"flex-end\" mt=\"md\">\n <Button \n variant=\"light\" \n size=\"xs\" \n leftSection={<IconRefresh size={14} />}\n onClick={() => setLocalCode(code)}\n >\n Hoàn tác\n </Button>\n <Button \n size=\"xs\" \n leftSection={<IconDeviceFloppy size={14} />}\n onClick={handleSave}\n >\n Lưu & Hiển thị\n </Button>\n </Group>\n </Box>\n ) : (\n <Box>\n {previewError ? (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Lỗi cú pháp\" color=\"red\">\n <Text size=\"xs\" style={{ whiteSpace: 'pre-wrap' }}>{previewError}</Text>\n <Button size=\"compact-xs\" color=\"red\" variant=\"light\" mt=\"sm\" onClick={() => setIsEditing(true)}>\n Sửa ngay\n </Button>\n </Alert>\n ) : (\n <Box\n ref={mermaidRef}\n className=\"mermaid-render-container\"\n style={{\n display: 'flex',\n justifyContent: 'center',\n overflowX: 'auto',\n padding: '1rem',\n borderRadius: 'var(--mantine-radius-sm)',\n backgroundColor: computedColorScheme === 'dark' ? 'transparent' : '#fff'\n }}\n />\n )}\n </Box>\n )}\n </Box>\n </Paper>\n </BlockWrapper>\n\n <style>{`\n .mermaid-render-container svg {\n max-width: 100%;\n height: auto;\n }\n .diagram-block-group {\n transition: all 0.2s ease;\n }\n `}</style>\n </NodeViewWrapper>\n )\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Mark, mergeAttributes } from '@tiptap/core'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n backgroundColor: {\n setBackgroundColor: (color: string) => ReturnType\n unsetBackgroundColor: () => ReturnType\n }\n }\n}\n\nexport const BackgroundColorMark = Mark.create({\n name: 'backgroundColor',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n addAttributes() {\n return {\n color: {\n default: null,\n parseHTML: element => element.getAttribute('data-bg-color') || null,\n renderHTML: attributes => {\n if (!attributes.color) {\n return {}\n }\n return {\n 'data-bg-color': attributes.color,\n }\n },\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'span[data-bg-color]',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes, mark }) {\n return [\n 'span',\n mergeAttributes(HTMLAttributes, { 'data-bg-color': mark.attrs.color }),\n 0,\n ]\n },\n\n addCommands() {\n return {\n setBackgroundColor:\n color =>\n ({ commands }) => {\n return commands.setMark(this.name, { color })\n },\n unsetBackgroundColor:\n () =>\n ({ commands }) => {\n return commands.unsetMark(this.name)\n },\n }\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport Image from '@tiptap/extension-image'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { ImageBlock } from '../blocks/ImageBlock'\n\nexport const ImageExtension = Image.extend({\n addNodeView() {\n return ReactNodeViewRenderer(ImageBlock as any)\n },\n\n addAttributes() {\n return {\n src: {\n default: null,\n },\n alt: {\n default: '',\n },\n title: {\n default: '',\n },\n width: {\n default: null,\n parseHTML: el => el.getAttribute('width') || null,\n renderHTML: attrs => {\n if (!attrs.width) {\n return {}\n }\n return {\n width: attrs.width,\n }\n },\n },\n }\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { useState, memo, useCallback, useRef, useEffect } from 'react'\nimport { NodeViewWrapper, type ReactNodeViewProps } from '@tiptap/react'\nimport { ActionIcon, Box, useMantineColorScheme, useMantineTheme, Text } from '@mantine/core'\nimport { IconCheck, IconCopy, IconArrowsMaximize } from '@tabler/icons-react'\nimport { copyToClipboard } from '../../utils/commonUtils'\n\nconst RESIZE_HANDLE_SIZE = 12\n\nconst ImageBlock = memo(function ImageBlock({ node, selected, updateAttributes }: ReactNodeViewProps) {\n const [copied, setCopied] = useState(false)\n const [isResizing, setIsResizing] = useState(false)\n const [resizeStart, setResizeStart] = useState({ x: 0, y: 0, width: 0 })\n const imgRef = useRef<HTMLImageElement>(null)\n const { colorScheme } = useMantineColorScheme()\n const theme = useMantineTheme()\n const isDark = colorScheme === 'dark'\n\n const src = (node as any).attrs?.src || ''\n const alt = (node as any).attrs?.alt || ''\n const width = (node as any).attrs?.width || null\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing || !imgRef.current) return\n\n const deltaX = e.clientX - resizeStart.x\n const newWidth = Math.max(100, resizeStart.width + deltaX)\n \n imgRef.current.style.width = `${newWidth}px`\n }\n\n const handleMouseUp = () => {\n if (!isResizing || !imgRef.current) return\n\n const currentWidth = imgRef.current.offsetWidth\n updateAttributes?.({ width: currentWidth })\n setIsResizing(false)\n }\n\n if (isResizing) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = 'ew-resize'\n document.body.style.userSelect = 'none'\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n }, [isResizing, resizeStart, updateAttributes])\n\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n \n if (!imgRef.current) return\n\n setIsResizing(true)\n setResizeStart({\n x: e.clientX,\n y: e.clientY,\n width: imgRef.current.offsetWidth,\n })\n }, [])\n\n const handleCopy = useCallback(async () => {\n if (!src) return\n\n try {\n const success = await copyToClipboard(src)\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }\n } catch (err) {\n console.error('Copy failed:', err)\n }\n }, [src])\n\n const handleResetSize = useCallback(() => {\n if (!imgRef.current) return\n imgRef.current.style.width = '100%'\n updateAttributes?.({ width: null })\n }, [updateAttributes])\n\n return (\n <NodeViewWrapper className=\"image-block-wrapper\">\n <Box\n pos=\"relative\"\n display=\"inline-block\"\n style={{\n maxWidth: '100%',\n borderRadius: 8,\n overflow: 'visible',\n }}\n >\n {selected && (\n <>\n <Box\n pos=\"absolute\"\n top={8}\n right={8}\n style={{\n zIndex: 2,\n display: 'flex',\n gap: 4,\n }}\n >\n <ActionIcon\n color={isDark ? 'dark' : 'gray'}\n variant=\"filled\"\n radius=\"md\"\n onClick={handleCopy}\n title={copied ? 'Copied!' : 'Copy image URL'}\n bg={isDark ? theme.colors.dark[7] : theme.white}\n style={{\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n }}\n >\n {copied ? <IconCheck color=\"green\" size={16} /> : <IconCopy size={16} />}\n </ActionIcon>\n <ActionIcon\n color={isDark ? 'dark' : 'gray'}\n variant=\"filled\"\n radius=\"md\"\n onClick={handleResetSize}\n title=\"Reset to original size\"\n bg={isDark ? theme.colors.dark[7] : theme.white}\n style={{\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n }}\n >\n <IconArrowsMaximize size={16} />\n </ActionIcon>\n </Box>\n\n <Box\n pos=\"absolute\"\n bottom={0}\n right={0}\n style={{\n zIndex: 2,\n width: RESIZE_HANDLE_SIZE,\n height: RESIZE_HANDLE_SIZE,\n cursor: 'ew-resize',\n transform: 'translate(50%, 50%)',\n }}\n onMouseDown={handleResizeStart}\n >\n <Box\n w=\"100%\"\n h=\"100%\"\n bg={theme.colors.blue[6]}\n style={{\n borderRadius: '50%',\n border: `2px solid ${theme.white}`,\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.3)',\n }}\n />\n </Box>\n </>\n )}\n\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n style={{\n display: 'block',\n maxWidth: '100%',\n width: width ? `${width}px` : '100%',\n height: 'auto',\n borderRadius: 8,\n border: selected\n ? `1px solid ${theme.colors.blue[6]}`\n : 'none',\n boxShadow: selected\n ? `0 0 0 1px ${theme.colors.blue[6]}`\n : 'none',\n cursor: isResizing ? 'ew-resize' : 'default',\n transition: isResizing ? 'none' : 'border 0.2s, box-shadow 0.2s',\n }}\n />\n\n {alt && (\n <Text\n size=\"xs\"\n c={isDark ? theme.colors.dark[2] : theme.colors.gray[6]}\n ta=\"center\"\n mt={4}\n style={{\n fontStyle: 'italic',\n }}\n >\n {alt}\n </Text>\n )}\n </Box>\n </NodeViewWrapper>\n )\n})\n\nImageBlock.displayName = 'ImageBlock'\n\nexport { ImageBlock }\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\nconst env: Record<string, string | undefined> =\r\n ((globalThis as any).process?.env as Record<string, string | undefined>) ?? {};\r\n\r\nconst shouldLog = env.NODE_ENV !== 'production';\r\n\r\nconst debugInclude = (() => {\r\n try {\r\n const envValue =\r\n (globalThis as any).__OTMC_DEBUG_INCLUDE__ ?? env.OTMC_DEBUG_INCLUDE;\r\n if (envValue) {\r\n return JSON.parse(envValue);\r\n }\r\n } catch (e) {\r\n console.warn('Failed to parse OTMC_DEBUG_INCLUDE:', e);\r\n }\r\n return [];\r\n})();\r\n\r\nconst shouldLogForFile = (fileName?: string): boolean => {\r\n if (!shouldLog) return false;\r\n if (!fileName || debugInclude.length === 0) return true;\r\n return debugInclude.some((included: string) => fileName.includes(included));\r\n};\r\n\r\nconst getCallingFile = (): string | undefined => {\r\n const stack = new Error().stack;\r\n if (!stack) return undefined;\r\n\r\n const lines = stack.split('\\n');\r\n for (let i = 3; i < lines.length; i++) {\r\n const line = lines[i];\r\n const match = line.match(/at .*?\\((.+?):\\d+:\\d+\\)|at (.+?):\\d+:\\d+/);\r\n if (match) {\r\n const filePath = match[1] || match[2];\r\n const fileName = filePath.split('/').pop();\r\n return fileName;\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const debug = {\r\n log: (...args: any[]) => {\r\n const fileName = getCallingFile();\r\n if (shouldLogForFile(fileName)) {\r\n console.log(...args);\r\n }\r\n },\r\n warn: (...args: any[]) => {\r\n const fileName = getCallingFile();\r\n if (shouldLogForFile(fileName)) {\r\n console.warn(...args);\r\n }\r\n },\r\n error: (...args: any[]) => {\r\n const fileName = getCallingFile();\r\n if (shouldLogForFile(fileName)) {\r\n console.error(...args);\r\n }\r\n },\r\n table: (...args: any[]) => {\r\n const fileName = getCallingFile();\r\n if (shouldLogForFile(fileName)) {\r\n console.table(...args);\r\n }\r\n },\r\n withFile: (fileName: string) => ({\r\n log: (...args: any[]) => {\r\n if (shouldLogForFile(fileName)) {\r\n console.log(...args);\r\n }\r\n },\r\n warn: (...args: any[]) => {\r\n if (shouldLogForFile(fileName)) {\r\n console.warn(...args);\r\n }\r\n },\r\n error: (...args: any[]) => {\r\n if (shouldLogForFile(fileName)) {\r\n console.error(...args);\r\n }\r\n },\r\n table: (...args: any[]) => {\r\n if (shouldLogForFile(fileName)) {\r\n console.table(...args);\r\n }\r\n },\r\n }),\r\n};\r\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Extension } from '@tiptap/react';\nimport { Plugin, PluginKey, Transaction } from '@tiptap/pm/state';\nimport type { HeadingNode, TableOfContentsOptions } from './TableOfContents';\n\nconst generateId = (text: string, index: number): string => {\n const base = text.trim().toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n return base ? `heading-${base}-${index}` : `heading-${index}`;\n};\n\nconst TableOfContents = Extension.create<TableOfContentsOptions>({\n name: 'tableOfContents',\n\n addOptions() {\n return {\n onUpdate: undefined,\n };\n },\n\n onBeforeCreate() {\n setTimeout(() => {\n const headings: HeadingNode[] = [];\n const { doc } = this.editor.state;\n const headingCounters: Record<number, number> = {};\n\n doc.descendants((node, pos) => {\n if (node.type.name === 'heading') {\n const level = node.attrs.level || 1;\n if (!headingCounters[level]) {\n headingCounters[level] = 0;\n }\n headingCounters[level]++;\n\n const existingId = node.attrs.id;\n const id = existingId || generateId(node.textContent, headingCounters[level]);\n\n headings.push({\n id,\n text: node.textContent,\n level,\n pos,\n });\n }\n });\n\n if (this.options.onUpdate && headings.length > 0) {\n this.options.onUpdate(headings);\n }\n }, 0);\n },\n\n addProseMirrorPlugins() {\n const { editor } = this;\n\n const getHeadings = (): HeadingNode[] => {\n const headings: HeadingNode[] = [];\n const { doc } = editor.state;\n const headingCounters: Record<number, number> = {};\n\n doc.descendants((node, pos) => {\n if (node.type.name === 'heading') {\n const level = node.attrs.level || 1;\n if (!headingCounters[level]) {\n headingCounters[level] = 0;\n }\n headingCounters[level]++;\n\n const existingId = node.attrs.id;\n const id = existingId || generateId(node.textContent, headingCounters[level]);\n\n headings.push({\n id,\n text: node.textContent,\n level,\n pos,\n });\n }\n });\n\n return headings;\n };\n\n const updateHeadings = () => {\n const headings = getHeadings();\n if (this.options.onUpdate) {\n this.options.onUpdate(headings);\n }\n };\n\n return [\n new Plugin({\n key: new PluginKey('tableOfContents'),\n onTransaction({ transaction }: { transaction: Transaction }) {\n if (transaction.docChanged || transaction.selectionSet) {\n setTimeout(updateHeadings, 0);\n }\n },\n }),\n ];\n },\n});\n\nexport default TableOfContents;\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { memo, useState, useEffect, useRef, useCallback } from 'react';\nimport { Box, Text, ScrollArea, Popover, useMantineTheme } from '@mantine/core';\nimport { IconList } from '@tabler/icons-react';\nimport { useTheme } from '../../contexts/ThemeProvider';\nimport { ReadingIndicator } from './ReadingIndicator';\n\nexport interface HeadingNode {\n id: string;\n text: string;\n level: number;\n pos: number;\n}\n\nexport interface TableOfContentsOptions {\n onUpdate?: (headings: HeadingNode[]) => void;\n}\n\ninterface TableOfContentsPanelProps {\n headings: HeadingNode[];\n editor: any;\n}\n\nexport const TableOfContentsPanel = memo(({ headings, editor }: TableOfContentsPanelProps) => {\n const theme = useMantineTheme();\n const { currentTheme } = useTheme();\n const isDark = currentTheme === 'dark';\n\n const [opened, setOpened] = useState(false);\n const [activeId, setActiveId] = useState<string | null>(null);\n const targetRef = useRef<HTMLDivElement>(null);\n\n const isProgrammaticScrollRef = useRef(false);\n const ignoreBottomDetectionRef = useRef(false);\n const lastClickedHeadingIdRef = useRef<string | null>(null);\n\n const computeActiveHeading = useCallback(() => {\n if (isProgrammaticScrollRef.current) return;\n if (!editor?.view) return;\n\n const editorDom = editor.view.dom as HTMLElement;\n const headingEls = editorDom.querySelectorAll<HTMLElement>('h1,h2,h3,h4,h5,h6');\n if (headingEls.length === 0 || headings.length === 0) return;\n\n const THRESHOLD = 80;\n\n const tops = Array.from(headingEls).map(\n el => el.getBoundingClientRect().top\n );\n\n let isAtBottom = false;\n let parent = editorDom.parentElement;\n while (parent) {\n const style = window.getComputedStyle(parent);\n const overflowY = style.overflowY;\n const isScrollable = overflowY === 'auto' || overflowY === 'scroll';\n if (isScrollable && parent.scrollHeight > parent.clientHeight + 10) {\n if (Math.ceil(parent.scrollTop + parent.clientHeight) >= parent.scrollHeight - 10) {\n isAtBottom = true;\n }\n break;\n }\n parent = parent.parentElement;\n }\n\n if (!isAtBottom || ignoreBottomDetectionRef.current) {\n const docEl = document.documentElement;\n if (docEl.scrollHeight > window.innerHeight + 10) {\n if (Math.ceil(window.innerHeight + window.scrollY) >= docEl.scrollHeight - 10) {\n isAtBottom = true;\n }\n }\n }\n\n let bestIdx = -1;\n if (isAtBottom) {\n if (lastClickedHeadingIdRef.current) {\n const clickedIdx = headings.findIndex(h => h.id === lastClickedHeadingIdRef.current);\n if (clickedIdx !== -1) {\n bestIdx = clickedIdx;\n } else {\n bestIdx = headings.length - 1;\n }\n } else {\n bestIdx = headings.length - 1;\n }\n } else {\n for (let i = tops.length - 1; i >= 0; i--) {\n if (tops[i] <= THRESHOLD) {\n bestIdx = i;\n break;\n }\n }\n\n if (bestIdx === -1) {\n const viewportH = window.innerHeight;\n let closestTop = Infinity;\n for (let i = 0; i < tops.length; i++) {\n if (tops[i] < viewportH && tops[i] < closestTop) {\n closestTop = tops[i];\n bestIdx = i;\n }\n }\n\n if (bestIdx === -1) bestIdx = 0;\n }\n }\n\n const matched = headings[bestIdx];\n if (matched) setActiveId(matched.id);\n }, [editor, headings]);\n\n const computeActiveHeadingByCursor = useCallback(() => {\n if (isProgrammaticScrollRef.current) return;\n if (!editor?.view) return;\n\n const { state } = editor;\n const cursorPos = state.selection.anchor;\n\n let bestIdx = -1;\n for (let i = headings.length - 1; i >= 0; i--) {\n if (headings[i].pos <= cursorPos) {\n bestIdx = i;\n break;\n }\n }\n\n if (bestIdx >= 0 && headings[bestIdx]) {\n setActiveId(headings[bestIdx].id);\n lastClickedHeadingIdRef.current = headings[bestIdx].id;\n }\n }, [editor, headings]);\n\n const computeActiveHeadingRef = useRef(computeActiveHeading);\n const computeActiveHeadingByCursorRef = useRef(computeActiveHeadingByCursor);\n useEffect(() => {\n computeActiveHeadingRef.current = computeActiveHeading;\n computeActiveHeadingByCursorRef.current = computeActiveHeadingByCursor;\n });\n\n useEffect(() => {\n if (!editor?.view) return;\n\n let rafId = 0;\n const onScroll = () => {\n if (rafId) return;\n rafId = requestAnimationFrame(() => {\n computeActiveHeadingRef.current();\n rafId = 0;\n });\n };\n\n window.addEventListener('scroll', onScroll, { capture: true, passive: true });\n window.addEventListener('resize', onScroll, { passive: true });\n\n const initId = setTimeout(() => {\n computeActiveHeadingRef.current();\n }, 200);\n\n return () => {\n clearTimeout(initId);\n if (rafId) cancelAnimationFrame(rafId);\n window.removeEventListener('scroll', onScroll, { capture: true });\n window.removeEventListener('resize', onScroll);\n };\n }, [editor]);\n\n useEffect(() => {\n computeActiveHeadingRef.current();\n }, [headings]);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => {\n if (!isProgrammaticScrollRef.current) {\n computeActiveHeadingByCursorRef.current();\n }\n };\n editor.on('selectionUpdate', handler);\n return () => editor.off('selectionUpdate', handler);\n }, [editor]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && opened) setOpened(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [opened]);\n\n useEffect(() => {\n const clearLastClicked = () => {\n lastClickedHeadingIdRef.current = null;\n };\n window.addEventListener('wheel', clearLastClicked, { passive: true });\n window.addEventListener('touchmove', clearLastClicked, { passive: true });\n window.addEventListener('keydown', clearLastClicked, { passive: true });\n window.addEventListener('mousedown', clearLastClicked, { passive: true });\n return () => {\n window.removeEventListener('wheel', clearLastClicked);\n window.removeEventListener('touchmove', clearLastClicked);\n window.removeEventListener('keydown', clearLastClicked);\n window.removeEventListener('mousedown', clearLastClicked);\n };\n }, []);\n\n const handleClick = useCallback((heading: HeadingNode) => {\n if (!editor) return;\n const { pos } = heading;\n\n setActiveId(heading.id);\n lastClickedHeadingIdRef.current = heading.id;\n\n isProgrammaticScrollRef.current = true;\n ignoreBottomDetectionRef.current = true;\n\n editor.chain().focus().setTextSelection(pos).run();\n\n setTimeout(() => {\n const node = editor.view.nodeDOM(pos) as HTMLElement;\n if (node) node.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\n setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n ignoreBottomDetectionRef.current = false;\n computeActiveHeadingRef.current();\n }, 650);\n }, 50);\n }, [editor]);\n\n const getIndent = (level: number) => level === 1 ? 5 : (level - 1) * 12;\n\n const getHeadingPrefix = (level: number, index: number) => {\n const previousHeadings = headings.slice(0, index);\n\n let parentIndex = -1;\n for (let i = previousHeadings.length - 1; i >= 0; i--) {\n if (previousHeadings[i].level < level) {\n parentIndex = i;\n break;\n }\n }\n\n const sameLevelAfterParent = previousHeadings\n .slice(parentIndex + 1)\n .filter(h => h.level === level).length + 1;\n\n switch (level) {\n case 1: return ' ';\n case 2: {\n const roman = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X'];\n return sameLevelAfterParent <= 10 ? `${roman[sameLevelAfterParent - 1]}.` : `${sameLevelAfterParent}.`;\n }\n case 3: return `${sameLevelAfterParent}.`;\n case 4: return '>';\n case 5: return '-';\n case 6: return '*';\n default: return `${sameLevelAfterParent}.`;\n }\n };\n\n const getHeadingColor = (level: number) => {\n const colors: Record<number, string> = {\n 1: '#cca415', 2: '#2989d8', 3: '#c7701f', 4: '#188831', 5: '#d31f1f', 6: '#149cb1',\n };\n return colors[level] || 'inherit';\n };\n\n const buttonBackground = isDark ? theme.colors.dark[9] : theme.colors.blue[0];\n const buttonBackgroundOpened = isDark ? theme.colors.blue[8] : theme.colors.blue[1];\n const borderColor = isDark ? theme.colors.dark[4] : theme.colors.gray[3];\n const iconColor = isDark ? theme.colors.blue[3] : theme.colors.dark[9];\n const iconColorOpened = isDark ? theme.colors.blue[2] : theme.colors.blue[7];\n const dropdownBackground = isDark ? '#1d1d1d' : '#ffffff';\n const activeItemBackground = isDark ? theme.colors.dark[5] : theme.colors.blue[0];\n const hoverItemBackground = isDark ? theme.colors.dark[6] : theme.colors.gray[1];\n\n const activeIndex = headings.findIndex(h => h.id === activeId);\n\n if (headings.length === 0) return null;\n\n return (\n <>\n <ReadingIndicator\n headings={headings}\n activeIndex={activeIndex}\n isDark={isDark}\n onNavigate={handleClick}\n />\n\n <Popover\n opened={opened}\n onChange={setOpened}\n position=\"left-start\"\n offset={10}\n withArrow\n shadow=\"md\"\n withinPortal\n closeOnClickOutside={true}\n styles={{\n dropdown: {\n padding: 0,\n overflow: 'hidden',\n borderRadius: theme.radius.lg,\n border: `1px solid ${borderColor}`,\n }\n }}\n >\n <Popover.Target>\n <Box\n ref={targetRef}\n onClick={(e) => {\n e.stopPropagation();\n setOpened((o) => !o);\n }}\n style={{\n position: 'fixed',\n right: 18,\n top: 65,\n width: 42,\n height: 42,\n borderRadius: '22px',\n background: opened ? buttonBackgroundOpened : buttonBackground,\n border: `1px solid ${borderColor}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n zIndex: 100,\n transition: 'all 0.2s ease',\n boxShadow: opened\n ? `0 2px 8px ${isDark ? 'rgba(0,0,0,0.3)' : 'rgba(0,0,0,0.15)'}`\n : `0 1px 3px ${isDark ? 'rgba(0,0,0,0.3)' : 'rgba(0,0,0,0.1)'}`,\n }}\n title=\"Table of contents\"\n >\n <IconList\n size={20}\n color={opened ? iconColorOpened : iconColor}\n stroke={1.5}\n />\n </Box>\n </Popover.Target>\n\n <Popover.Dropdown bg={dropdownBackground}>\n <Box\n style={{\n width: 'auto',\n minWidth: 400,\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: dropdownBackground,\n }}\n >\n <ScrollArea.Autosize\n mah={520}\n scrollbarSize={4}\n offsetScrollbars={false}\n type=\"hover\"\n styles={{\n scrollbar: {\n '&[data-orientation=\"vertical\"]': { padding: 0, right: 2 },\n },\n thumb: {\n backgroundColor: isDark ? theme.colors.dark[3] : theme.colors.gray[5],\n }\n }}\n >\n <Box px={12} py={15}>\n {headings.map((heading, index) => (\n <Box\n key={`${heading.id}-${index}`}\n style={{\n padding: '5px 5px',\n paddingLeft: `${getIndent(heading.level)}px`,\n borderRadius: theme.radius.md,\n cursor: 'pointer',\n background: activeId === heading.id ? activeItemBackground : 'transparent',\n borderLeft: activeId === heading.id\n ? `3px solid ${theme.colors.blue[6]}`\n : '3px solid transparent',\n transition: 'all 0.15s ease',\n marginBottom: 2,\n }}\n onClick={() => handleClick(heading)}\n onMouseEnter={(e) => {\n if (activeId !== heading.id) e.currentTarget.style.background = hoverItemBackground;\n }}\n onMouseLeave={(e) => {\n if (activeId !== heading.id) e.currentTarget.style.background = 'transparent';\n }}\n >\n <Text\n size=\"sm\"\n truncate\n style={{\n color: getHeadingColor(heading.level),\n fontWeight: heading.level <= 2 ? 600 : 400,\n fontSize: heading.level <= 2 ? '15px' : '13px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {getHeadingPrefix(heading.level, index) && (\n <Text\n component=\"span\"\n size=\"xs\"\n style={{\n color: getHeadingColor(heading.level),\n fontWeight: 500,\n whiteSpace: 'nowrap',\n }}\n >\n {getHeadingPrefix(heading.level, index)}\n </Text>\n )}\n {heading.text || '(Empty heading)'}\n </Text>\n </Box>\n ))}\n </Box>\n </ScrollArea.Autosize>\n </Box>\n </Popover.Dropdown>\n </Popover>\n </>\n );\n});\n\nTableOfContentsPanel.displayName = 'TableOfContentsPanel';\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport {\n memo,\n useState,\n useRef,\n useCallback,\n useEffect,\n type KeyboardEvent,\n type TouchEvent as ReactTouchEvent,\n} from 'react';\nimport { useMantineTheme } from '@mantine/core';\nimport type { HeadingNode } from './TableOfContents';\n\nconst INDICATOR_RIGHT = 22;\nconst INDICATOR_TOP = 420; \nconst INDICATOR_MAX_H = '44vh';\n\nconst BAR_WIDTH = 38;\nconst BAR_HEIGHT = 5;\nconst BAR_RADIUS = 999;\nconst BAR_GAP = 6;\n\nconst TOOLTIP_GAP = 10;\nconst TOOLTIP_MAX_WIDTH = 240;\n\n\nexport interface ReadingIndicatorProps {\n headings: HeadingNode[];\n activeIndex: number;\n isDark: boolean;\n onNavigate: (heading: HeadingNode) => void;\n}\n\ninterface TooltipState {\n visible: boolean;\n text: string;\n y: number;\n}\n\ninterface HeadingBarProps {\n heading: HeadingNode;\n isActive: boolean;\n isDark: boolean;\n onNavigate: (heading: HeadingNode) => void;\n onHoverEnter: (heading: HeadingNode, el: HTMLElement) => void;\n onHoverLeave: () => void;\n barRef?: (el: HTMLDivElement | null) => void;\n}\n\nconst HeadingBar = memo(function HeadingBar({\n heading,\n isActive,\n isDark,\n onNavigate,\n onHoverEnter,\n onHoverLeave,\n barRef,\n}: HeadingBarProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const activeColor = '#D4A017';\n const inactiveColor = isDark ? 'rgba(255,255,255,0.18)' : 'rgba(0,0,0,0.14)';\n\n const handleMouseEnter = useCallback(() => {\n if (wrapperRef.current) onHoverEnter(heading, wrapperRef.current);\n }, [heading, onHoverEnter]);\n\n const handleFocus = useCallback(() => {\n if (wrapperRef.current) onHoverEnter(heading, wrapperRef.current);\n }, [heading, onHoverEnter]);\n\n const handleTouchStart = useCallback((e: ReactTouchEvent) => {\n e.preventDefault();\n if (wrapperRef.current) onHoverEnter(heading, wrapperRef.current);\n }, [heading, onHoverEnter]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onNavigate(heading);\n }\n if (e.key === 'Escape') {\n onHoverLeave();\n (e.currentTarget as HTMLElement).blur();\n }\n }, [heading, onNavigate, onHoverLeave]);\n\n return (\n <div\n ref={(el) => {\n wrapperRef.current = el;\n barRef?.(el);\n }}\n role=\"menuitem\"\n tabIndex={0}\n aria-label={heading.text || '(Empty heading)'}\n aria-current={isActive ? 'location' : undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={onHoverLeave}\n onFocus={handleFocus}\n onBlur={onHoverLeave}\n onTouchStart={handleTouchStart}\n onClick={() => onNavigate(heading)}\n onKeyDown={handleKeyDown}\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '100%',\n padding: '4px 0',\n cursor: 'pointer',\n outline: 'none',\n WebkitTapHighlightColor: 'transparent',\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n width: BAR_WIDTH,\n height: BAR_HEIGHT,\n borderRadius: BAR_RADIUS,\n overflow: 'hidden',\n pointerEvents: 'none',\n boxShadow: isActive\n ? isDark\n ? '0 0 6px rgba(255,140,0,0.45), 0 1px 3px rgba(255,140,0,0.25)'\n : '0 0 5px rgba(255,120,0,0.35), 0 1px 2px rgba(255,120,0,0.20)'\n : 'none',\n }}\n >\n <div\n style={{\n width: '100%',\n height: '100%',\n borderRadius: BAR_RADIUS,\n backgroundColor: isActive ? activeColor : inactiveColor,\n opacity: isActive ? 1 : 0.38,\n transition: 'background-color 200ms ease, opacity 200ms ease, transform 200ms ease',\n transform: isActive ? 'scaleX(1.2)' : 'scaleX(1)',\n transformOrigin: 'center center',\n willChange: 'transform',\n }}\n />\n </div>\n </div>\n );\n});\n\nHeadingBar.displayName = 'HeadingBar';\n\nexport const ReadingIndicator = memo(function ReadingIndicator({\n headings,\n activeIndex,\n isDark,\n onNavigate,\n}: ReadingIndicatorProps) {\n const theme = useMantineTheme();\n\n const navRef = useRef<HTMLElement>(null);\n const barRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n\n const [tooltip, setTooltip] = useState<TooltipState>({ visible: false, text: '', y: 0 });\n const hideTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleHoverEnter = useCallback((heading: HeadingNode, el: HTMLElement) => {\n if (hideTimer.current) { clearTimeout(hideTimer.current); hideTimer.current = null; }\n const rect = el.getBoundingClientRect();\n setTooltip({\n visible: true,\n text: heading.text || '(Empty heading)',\n y: rect.top + rect.height / 2,\n });\n }, []);\n\n const handleHoverLeave = useCallback(() => {\n hideTimer.current = setTimeout(() => setTooltip(t => ({ ...t, visible: false })), 160);\n }, []);\n\n useEffect(() => () => {\n if (hideTimer.current) clearTimeout(hideTimer.current);\n }, []);\n\n const setBarRef = useCallback((index: number) => (el: HTMLDivElement | null) => {\n if (el) barRefs.current.set(index, el);\n else barRefs.current.delete(index);\n }, []);\n\n useEffect(() => {\n const nav = navRef.current;\n const el = barRefs.current.get(activeIndex);\n if (!nav || !el || activeIndex < 0) return;\n\n const navRect = nav.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n\n const isAbove = elRect.top < navRect.top;\n const isBelow = elRect.bottom > navRect.bottom;\n if (!isAbove && !isBelow) return;\n\n const targetScrollTop =\n nav.scrollTop + (elRect.top - navRect.top) - navRect.height / 2 + elRect.height / 2;\n\n nav.scrollTo({ top: targetScrollTop, behavior: 'smooth' });\n }, [activeIndex]);\n\n const handleContainerKeyDown = useCallback((e: KeyboardEvent<HTMLElement>) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return;\n e.preventDefault();\n const focused = document.activeElement as HTMLElement;\n const bars = navRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]');\n if (!bars) return;\n const arr = Array.from(bars);\n const idx = arr.indexOf(focused);\n if (idx === -1) return;\n const next = e.key === 'ArrowDown'\n ? arr[Math.min(idx + 1, arr.length - 1)]\n : arr[Math.max(idx - 1, 0)];\n next?.focus();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent | TouchEvent) => {\n if (navRef.current?.contains(e.target as Node)) return;\n setTooltip(t => ({ ...t, visible: false }));\n const focused = document.activeElement as HTMLElement;\n if (navRef.current?.contains(focused)) focused.blur();\n };\n document.addEventListener('mousedown', handleOutside, { passive: true });\n document.addEventListener('touchstart', handleOutside, { passive: true });\n return () => {\n document.removeEventListener('mousedown', handleOutside);\n document.removeEventListener('touchstart', handleOutside);\n };\n }, []);\n\n if (headings.length === 0) return null;\n\n const tooltipBg = isDark ? theme.colors.dark[6] : '#ffffff';\n const tooltipBorder = isDark ? theme.colors.dark[4] : theme.colors.gray[3];\n const tooltipText = isDark ? theme.colors.gray[1] : theme.colors.dark[7];\n const tooltipRight = INDICATOR_RIGHT + BAR_WIDTH + TOOLTIP_GAP;\n\n return (\n <>\n <div\n style={{\n position: 'fixed',\n right: INDICATOR_RIGHT,\n top: INDICATOR_TOP,\n width: BAR_WIDTH,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n pointerEvents: 'none',\n }}\n >\n <style>{`nav.ri-nav::-webkit-scrollbar { display: none; }`}</style>\n\n <nav\n ref={navRef}\n role=\"navigation\"\n aria-label=\"Document section navigator\"\n className=\"ri-nav\"\n onKeyDown={handleContainerKeyDown}\n style={{\n width: BAR_WIDTH,\n maxHeight: INDICATOR_MAX_H,\n overflowY: 'auto',\n overflowX: 'visible',\n overscrollBehavior: 'contain',\n pointerEvents: 'auto',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: BAR_GAP,\n paddingTop: 2,\n paddingBottom: 2,\n } as React.CSSProperties}\n >\n {headings.map((heading, index) => (\n <HeadingBar\n key={`${heading.id}-${index}`}\n heading={heading}\n isActive={index === activeIndex}\n isDark={isDark}\n onNavigate={onNavigate}\n onHoverEnter={handleHoverEnter}\n onHoverLeave={handleHoverLeave}\n barRef={setBarRef(index)}\n />\n ))}\n </nav>\n </div>\n\n <div\n role=\"tooltip\"\n aria-live=\"polite\"\n style={{\n position: 'fixed',\n right: tooltipRight,\n top: tooltip.y,\n transform: tooltip.visible\n ? 'translateY(-50%)'\n : 'translateY(-50%) translateX(6px)',\n zIndex: 400,\n pointerEvents: 'none',\n opacity: tooltip.visible ? 1 : 0,\n transition: 'opacity 160ms ease, transform 160ms ease',\n willChange: 'opacity, transform',\n maxWidth: TOOLTIP_MAX_WIDTH,\n whiteSpace: 'nowrap',\n }}\n >\n <div\n style={{\n background: tooltipBg,\n border: `1px solid ${tooltipBorder}`,\n borderRadius: 7,\n padding: '4px 10px',\n boxShadow: isDark\n ? '0 4px 16px rgba(0,0,0,0.5), 0 1px 4px rgba(0,0,0,0.3)'\n : '0 4px 16px rgba(0,0,0,0.10), 0 1px 4px rgba(0,0,0,0.07)',\n color: tooltipText,\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1.4,\n maxWidth: TOOLTIP_MAX_WIDTH,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n letterSpacing: '0.01em',\n }}\n >\n {tooltip.text}\n </div>\n </div>\n </>\n );\n});\n\nReadingIndicator.displayName = 'ReadingIndicator';\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport TurndownService from 'turndown'\nimport type { Editor } from '@tiptap/react'\n\nconst turndown = new TurndownService({\n headingStyle: 'atx',\n codeBlockStyle: 'fenced',\n hr: '---',\n})\n\nturndown.addRule('taskListCheckbox', {\n filter: (node: any) => {\n const hasCheckbox = node.querySelector('input[type=\"checkbox\"]') !== null\n return hasCheckbox\n },\n\n replacement: (content, node: any) => {\n const checkbox = node.querySelector('input[type=\"checkbox\"]')\n const checked = checkbox?.checked || checkbox?.getAttribute('checked') !== null\n const text = content.replace(/^\\s*\\[[ xX]\\]\\s*/, '').trim()\n const contentText = text || '\\u200B'\n return `- [${checked ? 'x' : ' '}] ${contentText}\\n`\n },\n})\n\nturndown.addRule('taskListText', {\n filter: (node: any) => {\n if (node.nodeName !== 'LI') return false\n const text = node.textContent || ''\n return /^\\s*\\[[ xX]\\]/.test(text)\n },\n\n replacement: (_content, node: any) => {\n const text = node.textContent || ''\n const match = text.match(/^\\s*\\[([ xX])\\]\\s*(.*)/)\n\n if (!match) return ''\n\n const checked = match[1].toLowerCase() === 'x'\n const cleanText = match[2].trim()\n\n const content = cleanText || '\\u200B'\n \n return `- [${checked ? 'x' : ' '}] ${content}\\n`\n },\n})\n\nturndown.addRule('listItem', {\n filter: (node: any) => {\n if (node.nodeName !== 'LI') return false\n \n const text = node.textContent || ''\n \n if (/^\\s*\\[[ xX]\\]/.test(text)) return false\n if (node.querySelector('input[type=\"checkbox\"]')) return false\n \n return true\n },\n\n replacement: (content, node: any) => {\n const parent = node.parentNode as HTMLElement\n if (parent.nodeName === 'OL') {\n const startAttr = parent.getAttribute('start')\n let number: number\n if (startAttr) {\n number = parseInt(startAttr, 10)\n } else {\n const items = Array.from(parent.children).filter((child: Element) => child.nodeName === 'LI')\n number = items.indexOf(node) + 1\n }\n return `${number}. ${content.trim()}\\n`\n }\n return '- ' + content.trim() + '\\n'\n },\n})\n\nturndown.addRule('table', {\n filter: 'table',\n replacement: (_content, node: any) => {\n const rows = node.querySelectorAll('tr')\n if (!rows.length) return '\\n\\n'\n\n const markdownRows: string[] = []\n let hasTh = false\n\n for (const row of rows) {\n const cells = row.querySelectorAll('th, td')\n if (!cells.length) continue\n\n const isHeader = !hasTh && row.querySelector('th') !== null\n if (isHeader) hasTh = true\n\n const cellTexts = Array.from(cells, (cell: Element) =>\n (cell.textContent || '').trim().replace(/\\|/g, '\\\\|')\n )\n\n markdownRows.push('| ' + cellTexts.join(' | ') + ' |')\n\n if (isHeader) {\n markdownRows.push('| ' + cellTexts.map(() => '---').join(' | ') + ' |')\n }\n }\n\n if (!hasTh && markdownRows.length > 0) {\n const colCount = rows[0].querySelectorAll('th, td').length\n markdownRows.splice(1, 0, '| ' + Array.from({ length: colCount }, () => '---').join(' | ') + ' |')\n }\n\n return '\\n' + markdownRows.join('\\n') + '\\n'\n },\n})\n\n;['TH', 'TD'].forEach(tag =>\n turndown.addRule(`tableCell_${tag}`, {\n filter: (node: any) => node.nodeName === tag,\n replacement: (content) => content,\n })\n)\n\n;['THEAD', 'TBODY', 'TFOOT', 'TR'].forEach(tag =>\n turndown.addRule(`tableSection_${tag}`, {\n filter: (node: any) => node.nodeName === tag,\n replacement: (content) => content,\n })\n)\n\nturndown.addRule('colorSpan', {\n filter: (node: any) => node.nodeName === 'SPAN' && !!node.style.color,\n replacement: (content, node: any) => {\n return `<span style=\"color: ${node.style.color}\">${content}</span>`\n },\n})\n\nexport const handlePaste = (editor: Editor | null, event: ClipboardEvent): boolean => {\n const clipboard = event.clipboardData\n if (!clipboard) return false\n\n const html = clipboard.getData('text/html')\n const text = clipboard.getData('text/plain')\n\n for (const item of clipboard.items) {\n if (item.type.startsWith('image')) {\n const file = item.getAsFile()\n if (file && editor) {\n const reader = new FileReader()\n reader.onload = (e) => {\n editor.chain().focus().setImage({ src: e.target?.result as string }).run()\n }\n reader.readAsDataURL(file)\n event.preventDefault()\n return true\n }\n }\n }\n\n if (html && editor) {\n const markdown = turndown.turndown(html).replace(/\\n{3,}/g, '\\n\\n')\n editor.chain().focus().insertContent(markdown).run()\n event.preventDefault()\n return true\n }\n\n if (text && editor) {\n editor.chain().focus().insertContent(text).run()\n event.preventDefault()\n return true\n }\n\n return false\n}\n\nexport { turndown }","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\nimport { useState, useEffect } from 'react'\r\nimport {\r\n Group,\r\n Text,\r\n Box,\r\n Modal,\r\n Button,\r\n Select,\r\n Stack,\r\n Textarea,\r\n Alert,\r\n useMantineTheme,\r\n useMantineColorScheme,\r\n} from '@mantine/core'\r\nimport { IconSparkles, IconAlertCircle } from '@tabler/icons-react'\r\nimport notificationCenter from '../components/common/NotificationCenter'\r\nimport type { Editor } from '@tiptap/react'\r\nimport { llmApi } from '../api/llm'\r\nimport { instructionsApi, type Instruction } from '../api/instructions'\r\nimport { serializeSelectionToMarkdown } from '../editor/hooks/markdownSerializer'\r\n\r\ninterface DocumentEditorProps {\r\n editor: Editor\r\n opened: boolean\r\n onClose: () => void\r\n}\r\n\r\nexport function DocumentEditor({ editor, opened, onClose }: DocumentEditorProps) {\r\n const theme = useMantineTheme()\r\n const { colorScheme } = useMantineColorScheme()\r\n const isDark = colorScheme === 'dark'\r\n\r\n const [aiPrompt, setAiPrompt] = useState('')\r\n const [selectedTemplate, setSelectedTemplate] = useState<string | null>(null)\r\n const [aiLoading, setAiLoading] = useState(false)\r\n const [aiError, setAiError] = useState<string | null>(null)\r\n const [selectedText, setSelectedText] = useState('')\r\n const [instructions, setInstructions] = useState<Instruction[]>([])\r\n const [templatesLoading, setTemplatesLoading] = useState(false)\r\n\r\n useEffect(() => {\r\n if (opened) {\r\n const { from, to } = editor.state.selection\r\n const markdownText = serializeSelectionToMarkdown(editor, from, to)\r\n setSelectedText(markdownText)\r\n\r\n const savedTemplate = localStorage.getItem('ai-rewrite-last-template')\r\n if (savedTemplate) {\r\n setSelectedTemplate(savedTemplate)\r\n } else if (instructions.length > 0) {\r\n const firstTemplate = instructions[0].name.toLowerCase()\r\n setSelectedTemplate(firstTemplate)\r\n }\r\n }\r\n }, [opened, editor, instructions])\r\n\r\n useEffect(() => {\r\n if (!opened) return\r\n\r\n const fetchInstructions = async () => {\r\n try {\r\n setTemplatesLoading(true)\r\n const response = await instructionsApi.getAll()\r\n if (response.success && 'data' in response) {\r\n setInstructions(response.data)\r\n }\r\n } catch (error) {\r\n console.error('Failed to fetch instructions:', error)\r\n } finally {\r\n setTemplatesLoading(false)\r\n }\r\n }\r\n\r\n fetchInstructions()\r\n }, [opened])\r\n\r\n useEffect(() => {\r\n if (selectedTemplate !== null) {\r\n localStorage.setItem('ai-rewrite-last-template', selectedTemplate)\r\n }\r\n }, [selectedTemplate])\r\n\r\n const getTemplateOptions = () => {\r\n return instructions.map(instruction => ({\r\n value: instruction.name.toLowerCase(),\r\n label: instruction.name.charAt(0).toUpperCase() + instruction.name.slice(1)\r\n }))\r\n }\r\n\r\n const handleAISubmit = async () => {\r\n const { from, to } = editor.state.selection\r\n const markdownText = serializeSelectionToMarkdown(editor, from, to)\r\n\r\n if (!markdownText.trim()) {\r\n setAiError('No text selected. Please select some text to rewrite.')\r\n return\r\n }\r\n\r\n if (!aiPrompt.trim() && !selectedTemplate) {\r\n setAiError('Please enter a prompt or select a template.')\r\n return\r\n }\r\n\r\n setAiLoading(true)\r\n setAiError(null)\r\n\r\n try {\r\n let instructionContent = aiPrompt\r\n if (selectedTemplate) {\r\n const instruction = instructions.find(inst =>\r\n inst.name.toLowerCase() === selectedTemplate.toLowerCase()\r\n )\r\n if (instruction) {\r\n instructionContent = instruction.content\r\n }\r\n }\r\n\r\n const response = await llmApi.generate({\r\n type: selectedTemplate || 'custom',\r\n prompt: instructionContent,\r\n content: markdownText,\r\n })\r\n\r\n if (response.success && 'data' in response) {\r\n const rewrittenMarkdown = response.data.response\r\n console.log('Rewritten markdown:', rewrittenMarkdown)\r\n\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from, to })\r\n .insertContent(rewrittenMarkdown || '')\r\n .run()\r\n\r\n onClose()\r\n setAiPrompt('')\r\n setSelectedTemplate(null)\r\n\r\n notificationCenter.success({\r\n title: 'Rewrote text with AI',\r\n message: 'Text rewritten successfully',\r\n })\r\n }\r\n } catch (error: any) {\r\n console.error('AI rewrite failed:', error)\r\n setAiError(error.message || 'Failed to generate AI response')\r\n notificationCenter.error({\r\n title: 'AI rewrite failed',\r\n message: error.message || 'Failed to generate AI response',\r\n })\r\n } finally {\r\n setAiLoading(false)\r\n }\r\n }\r\n\r\n const handleClose = () => {\r\n onClose()\r\n setAiPrompt('')\r\n setSelectedTemplate(null)\r\n setAiError(null)\r\n }\r\n\r\n return (\r\n <Modal\r\n opened={opened}\r\n onClose={handleClose}\r\n title={\r\n <Group gap=\"xs\">\r\n <IconSparkles size={20} />\r\n AI Rewrite\r\n </Group>\r\n }\r\n size=\"lg\"\r\n radius=\"lg\"\r\n centered\r\n >\r\n <Stack gap=\"md\">\r\n {selectedText && (\r\n <Box>\r\n <Text size=\"sm\" fw={500} mb=\"xs\">Selected Text</Text>\r\n <Box\r\n p=\"sm\"\r\n bg={isDark ? 'dark.5' : 'gray.0'}\r\n style={{\r\n borderRadius: theme.radius.md,\r\n maxHeight: 250,\r\n overflow: 'auto',\r\n borderLeft: '3px solid var(--mantine-color-gray-6)',\r\n }}\r\n >\r\n <Text size=\"sm\" c=\"blue\" style={{ whiteSpace: 'pre-wrap' }}>\r\n {selectedText.length > 200 ? `${selectedText.substring(0, 200)}...` : selectedText}\r\n </Text>\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n <Select\r\n label=\"Quick Templates\"\r\n radius=\"lg\"\r\n placeholder=\"Select a template or enter custom prompt\"\r\n value={selectedTemplate}\r\n onChange={setSelectedTemplate}\r\n data={getTemplateOptions()}\r\n clearable\r\n disabled={templatesLoading}\r\n styles={{\r\n dropdown: {\r\n borderRadius: \"12px\",\r\n },\r\n }}\r\n />\r\n\r\n <Textarea\r\n label=\"Custom Prompt (Optional)\"\r\n radius=\"lg\"\r\n placeholder=\"e.g., Make it more professional, Add more details, etc.\"\r\n value={aiPrompt}\r\n onChange={(e) => setAiPrompt(e.currentTarget.value)}\r\n minRows={3}\r\n />\r\n\r\n {aiError && (\r\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\r\n {aiError}\r\n </Alert>\r\n )}\r\n\r\n <Group justify=\"flex-end\" mt=\"md\">\r\n <Button\r\n variant=\"light\"\r\n color=\"gray\"\r\n radius=\"lg\"\r\n onClick={handleClose}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n onClick={handleAISubmit}\r\n loading={aiLoading}\r\n radius=\"lg\"\r\n leftSection={!aiLoading && <IconSparkles size={16} />}\r\n color=\"green.8\"\r\n >\r\n {aiLoading ? 'Generating...' : 'Generate'}\r\n </Button>\r\n </Group>\r\n </Stack>\r\n </Modal>\r\n )\r\n}\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\nimport { notifications } from '@mantine/notifications';\r\nimport { IconX, IconAlertCircle, IconInfoCircle, IconCheck } from '@tabler/icons-react';\r\n\r\ninterface NotificationOptions {\r\n title: string;\r\n message?: string;\r\n autoClose?: number;\r\n}\r\n\r\nconst notificationCenter = {\r\n error: ({ title, message, autoClose = 15000 }: NotificationOptions) => {\r\n notifications.show({\r\n color: 'red',\r\n title: `${title}`,\r\n message,\r\n icon: <IconX />,\r\n autoClose,\r\n radius: 'lg',\r\n });\r\n },\r\n\r\n warn: ({ title, message, autoClose = 10000 }: NotificationOptions) => {\r\n notifications.show({\r\n color: 'yellow',\r\n title: `${title}`,\r\n message,\r\n icon: <IconAlertCircle />,\r\n autoClose,\r\n radius: 'lg',\r\n });\r\n },\r\n\r\n info: ({ title, message, autoClose = 8000 }: NotificationOptions) => {\r\n notifications.show({\r\n color: 'blue',\r\n title: `${title}`,\r\n icon: <IconInfoCircle />,\r\n message,\r\n autoClose,\r\n radius: 'lg',\r\n });\r\n },\r\n\r\n success: ({ title, message, autoClose = 5000 }: NotificationOptions) => {\r\n notifications.show({\r\n color: 'green',\r\n title: `${title}`,\r\n icon: <IconCheck />,\r\n message,\r\n autoClose,\r\n radius: 'lg',\r\n });\r\n },\r\n};\r\n\r\nexport default notificationCenter;\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport notificationCenter from \"../components/common/NotificationCenter\";\r\n\r\nlet backendUrlOverride: string | undefined;\r\n\r\nexport function setBackendUrl(url: string) {\r\n backendUrlOverride = url;\r\n}\r\n\r\nexport function getBackendUrl(): string {\r\n if (backendUrlOverride) return backendUrlOverride;\r\n if (typeof window !== 'undefined' && window.location?.origin) {\r\n return window.location.origin + \"/api\";\r\n }\r\n return \"\";\r\n}\r\n\r\nexport const BACKEND_URL = getBackendUrl();\r\n\r\nlet accessTokenGetter: (() => Promise<string | null>) | null = null;\r\n\r\nexport function setAccessTokenGetter(getter: () => Promise<string | null>) {\r\n accessTokenGetter = getter;\r\n}\r\n\r\nexport interface SuccessResponse<T> {\r\n success: boolean;\r\n data: T;\r\n message?: string;\r\n}\r\n\r\nexport interface ErrorResponse {\r\n success: boolean;\r\n error: {\r\n code: number;\r\n key: string;\r\n type: string;\r\n\r\n summary: string;\r\n detail: string;\r\n file?: string;\r\n line?: number;\r\n function?: string;\r\n timestamp?: string;\r\n };\r\n}\r\n\r\nexport type ApiResponse<T> = SuccessResponse<T> | ErrorResponse;\r\n\r\nclass ApiClient {\r\n private baseUrl?: string;\r\n\r\n constructor(baseUrl?: string) {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<ApiResponse<T>> {\r\n const url = `${this.baseUrl ?? getBackendUrl()}${endpoint}`;\r\n\r\n const config: RequestInit = {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options.headers,\r\n },\r\n ...options,\r\n };\r\n\r\n const token = accessTokenGetter ? await accessTokenGetter() : null;\r\n if (token) {\r\n (config.headers as Record<string, string>).Authorization = `Bearer ${token}`;\r\n }\r\n\r\n try {\r\n const response = await fetch(url, config);\r\n\r\n if (options.method === 'DELETE') {\r\n if (response.status === 204 || response.status === 200) {\r\n return { success: true, data: undefined as unknown as T, message: 'Success' };\r\n }\r\n const text = await response.text();\r\n if (text) {\r\n const data: ApiResponse<T> = JSON.parse(text);\r\n if (!response.ok) {\r\n const error = (data as ErrorResponse).error;\r\n notificationCenter.error({\r\n title: `${error.summary}`,\r\n message: `${error.detail}`,\r\n autoClose: 15000,\r\n });\r\n throw new Error(`${error.summary}: ${error.detail}` || `Request Failed with status: ${response.status}`);\r\n }\r\n return data;\r\n } else {\r\n return { success: true, data: undefined as unknown as T, message: 'Success' };\r\n }\r\n }\r\n\r\n const responseData: ApiResponse<T> = await response.json();\r\n\r\n if (!response.ok) {\r\n const error = (responseData as ErrorResponse).error;\r\n notificationCenter.error({\r\n title: `${error.summary}`,\r\n message: `${error.detail}`,\r\n autoClose: 15000,\r\n });\r\n throw new Error(`${error.summary}: ${error.detail}` || `Request Failed with status: ${response.status}`);\r\n }\r\n\r\n return responseData;\r\n } catch (error) {\r\n console.error(`API request failed: ${endpoint}`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n get<T>(endpoint: string, params?: Record<string, string>) {\r\n const queryString = params ? `?${new URLSearchParams(params).toString()}` : '';\r\n return this.request<T>(`${endpoint}${queryString}`, { method: 'GET' });\r\n }\r\n\r\n post<T>(endpoint: string, data?: unknown) {\r\n return this.request<T>(endpoint, {\r\n method: 'POST',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n put<T>(endpoint: string, data?: unknown) {\r\n return this.request<T>(endpoint, {\r\n method: 'PUT',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n patch<T>(endpoint: string, data?: unknown) {\r\n return this.request<T>(endpoint, {\r\n method: 'PATCH',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n delete<T>(endpoint: string) {\r\n return this.request<T>(endpoint, { method: 'DELETE' });\r\n }\r\n}\r\n\r\nexport const apiClient = new ApiClient();\r\n\r\nexport const apiUtils = {\r\n handleSuccess: <T>(response: SuccessResponse<T>): T => {\r\n return response.data;\r\n },\r\n\r\n handleError: (error: unknown): void => {\r\n console.error('API Error:', error);\r\n throw error;\r\n },\r\n\r\n validateId: (id: string): boolean => {\r\n return /^[0-9A-HJKMNP-TV-Z]{26}$/.test(id);\r\n },\r\n\r\n getDataFromResponse: <T>(response: ApiResponse<T>): T | undefined => {\r\n if (response.success && 'data' in response) {\r\n return response.data;\r\n }\r\n return undefined;\r\n },\r\n};\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport { apiClient } from './utils';\r\n\r\nexport interface LLMRequest {\r\n type: string;\r\n prompt: string;\r\n content: string;\r\n}\r\n\r\nexport interface LLMResponse {\r\n type: string;\r\n response: string;\r\n}\r\n\r\nexport interface GenerateDocumentRequest {\r\n prompt: string;\r\n}\r\n\r\nexport interface GenerateDocumentResponse {\r\n content: string;\r\n}\r\n\r\nexport interface FormatDocumentRequest {\r\n doc_id?: number | null;\r\n title?: string | null;\r\n content: string;\r\n}\r\n\r\nexport interface FormatDocumentResponse {\r\n content: string;\r\n}\r\n\r\nexport interface LLMTestResponse {\r\n message: string;\r\n}\r\n\r\nexport interface LLMReloadResponse {\r\n status: string;\r\n message: string;\r\n provider: string;\r\n}\r\n\r\nexport interface LLMConfigResponse {\r\n status: string;\r\n}\r\n\r\nexport const llmApi = {\r\n generate: (data: LLMRequest) =>\r\n apiClient.post<LLMResponse & { content?: string }>('/llm/generate', data),\r\n\r\n generateDocument: (data: GenerateDocumentRequest) =>\r\n apiClient.post<GenerateDocumentResponse>('/llm/generate-document', data),\r\n\r\n formatDocument: (templateId: number, data: FormatDocumentRequest) =>\r\n apiClient.post<FormatDocumentResponse>(`/llm/format/${templateId}`, data),\r\n\r\n getConfig: () =>\r\n apiClient.get<LLMConfigResponse>('/llm/config'),\r\n\r\n testConnection: () =>\r\n apiClient.get<LLMTestResponse>('/llm/test'),\r\n\r\n reload: () =>\r\n apiClient.post<LLMReloadResponse>('/llm/reload'),\r\n};\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport { apiClient } from './utils'\r\n\r\nexport interface Instruction {\r\n id: number\r\n name: string\r\n content: string\r\n}\r\n\r\nexport const instructionsApi = {\r\n getAll: () => apiClient.get<Instruction[]>('/prompts'),\r\n\r\n getById: (id: number) => apiClient.get<Instruction>(`/prompts/${id}`),\r\n\r\n create: (instruction: Omit<Instruction, 'id'>) =>\r\n apiClient.post<Instruction>('/prompts', instruction),\r\n\r\n update: (id: number, content: string) =>\r\n apiClient.patch<Instruction>(`/prompts/${id}`, { content }),\r\n\r\n delete: (id: number) =>\r\n apiClient.delete(`/prompts/${id}`)\r\n}\r\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { EditorContent as TiptapEditorContent } from '@tiptap/react'\nimport { useMantineColorScheme, useMantineTheme } from '@mantine/core'\nimport { resolveColorScheme } from '../../contexts/ThemeProvider'\nimport { TableControls } from './TableControls'\n\ninterface EditorContentProps {\n editor: any\n minHeight?: number\n}\n\nexport function EditorContent({ editor, minHeight = 200 }: EditorContentProps) {\n const { colorScheme: rawColorScheme } = useMantineColorScheme()\n const theme = useMantineTheme()\n const colorScheme = resolveColorScheme(rawColorScheme)\n\n const tableBorderColor = colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]\n const tableHeaderBg = colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[1]\n\n const bgColors = {\n red: colorScheme === 'dark' ? theme.colors.red[8] : theme.colors.red[1],\n orange: colorScheme === 'dark' ? theme.colors.orange[8] : theme.colors.orange[1],\n yellow: colorScheme === 'dark' ? theme.colors.yellow[8] : theme.colors.yellow[1],\n green: colorScheme === 'dark' ? theme.colors.green[8] : theme.colors.green[1],\n blue: colorScheme === 'dark' ? theme.colors.blue[8] : theme.colors.blue[1],\n violet: colorScheme === 'dark' ? theme.colors.violet[8] : theme.colors.violet[1],\n pink: colorScheme === 'dark' ? theme.colors.pink[8] : theme.colors.pink[1],\n gray: colorScheme === 'dark' ? theme.colors.gray[8] : theme.colors.gray[1],\n }\n\n const h1Color = colorScheme === 'dark' ? theme.colors.yellow[5] : theme.colors.yellow[8]\n const h2Color = colorScheme === 'dark' ? theme.colors.blue[5] : theme.colors.blue[8]\n const h3Color = colorScheme === 'dark' ? theme.colors.orange[5] : theme.colors.orange[8]\n const h4Color = colorScheme === 'dark' ? theme.colors.green[5] : theme.colors.green[8]\n const h5Color = colorScheme === 'dark' ? theme.colors.red[5] : theme.colors.red[8]\n const h6Color = colorScheme === 'dark' ? theme.colors.cyan[5] : theme.colors.cyan[8]\n\n return (\n <div style={{ position: 'relative' }}>\n <TiptapEditorContent\n editor={editor}\n style={{ minHeight, lineHeight: '1.3', padding: '0 12px' }}\n >\n <style>{`\n .ProseMirror {\n --bg-red: ${bgColors.red};\n --bg-orange: ${bgColors.orange};\n --bg-yellow: ${bgColors.yellow};\n --bg-green: ${bgColors.green};\n --bg-blue: ${bgColors.blue};\n --bg-violet: ${bgColors.violet};\n --bg-pink: ${bgColors.pink};\n --bg-gray: ${bgColors.gray};\n font-family: 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n }\n .ProseMirror ul, .ProseMirror ol { line-height: 1.5; padding-left: 1.6em; margin: 0.6em 0 0.2em 0; }\n .ProseMirror ol li::marker { font-weight: 700; color: ${colorScheme === 'dark' ? theme.colors.blue[4] : theme.colors.blue[7]}; }\n .ProseMirror ol li { color: ${colorScheme === 'dark' ? theme.colors.blue[4] : theme.colors.blue[8]}; }\n .ProseMirror h1 { color: ${h1Color}; font-size: 1.4em; margin-top: 0em; margin-bottom: 0em; font-weight: 700; }\n .ProseMirror h2 { color: ${h2Color}; font-size: 1.3em; margin-top: 1.4em; margin-bottom: 0.3em; font-weight: 600; }\n .ProseMirror h3 { color: ${h3Color}; font-size: 1.2em; margin-top: 1.0em; margin-bottom: 0.2em; font-weight: 600; }\n .ProseMirror h4 { color: ${h4Color}; font-size: 1.1em; margin-top: 0.6em; margin-bottom: 0.2em; font-weight: 500; }\n .ProseMirror h5 { color: ${h5Color}; font-size: 1.0em; margin-top: 0.5em; margin-bottom: 0.1em; font-weight: 500; }\n .ProseMirror h6 { color: ${h6Color}; font-size: 1.0em; margin-top: 0.5em; margin-bottom: 0.1em; font-weight: 500; }\n .ProseMirror p { margin-top: 0.1em; margin-bottom: 0.5em; }\n .ProseMirror blockquote {\n margin: 12px 0;\n padding: 8px 16px;\n border-left: 6px solid ${colorScheme === 'dark' ? theme.colors.gray[5] : theme.colors.gray[3]};\n background-color: ${colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[1]};\n border-radius: 4px;\n font-style: normal;\n color: ${colorScheme === 'dark' ? theme.colors.gray[3] : theme.colors.gray[7]};\n }\n .ProseMirror blockquote p {\n margin: 4px 0;\n }\n .ProseMirror blockquote p:first-child {\n margin-top: 0;\n }\n .ProseMirror blockquote p:last-child {\n margin-bottom: 0;\n }\n .ProseMirror span[data-bg-color] {\n padding: 0.1em 0.3em;\n border-radius: 3px;\n box-decoration-break: clone;\n }\n .ProseMirror span[data-bg-color=\"red\"] { background-color: var(--bg-red); }\n .ProseMirror span[data-bg-color=\"orange\"] { background-color: var(--bg-orange); }\n .ProseMirror span[data-bg-color=\"yellow\"] { background-color: var(--bg-yellow); }\n .ProseMirror span[data-bg-color=\"green\"] { background-color: var(--bg-green); }\n .ProseMirror span[data-bg-color=\"blue\"] { background-color: var(--bg-blue); }\n .ProseMirror span[data-bg-color=\"violet\"] { background-color: var(--bg-violet); }\n .ProseMirror span[data-bg-color=\"pink\"] { background-color: var(--bg-pink); }\n .ProseMirror span[data-bg-color=\"gray\"] { background-color: var(--bg-gray); }\n .ProseMirror p code,\n .ProseMirror h1 code,\n .ProseMirror h2 code,\n .ProseMirror h3 code,\n .ProseMirror h4 code,\n .ProseMirror h5 code,\n .ProseMirror h6 code,\n .ProseMirror li code,\n .ProseMirror td code,\n .ProseMirror th code,\n .ProseMirror blockquote code {\n font-family: 'SFMono-Regular', 'Consolas', 'Liberation Mono', 'Menlo', monospace;\n font-size: 0.875em;\n padding: 0.2em 0.4em;\n border-radius: 6px;\n background-color: ${colorScheme === 'dark' ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.06)'};\n color: ${colorScheme === 'dark' ? theme.colors.orange[4] : theme.colors.red[7]};\n border: 1px solid ${colorScheme === 'dark' ? 'rgba(255, 255, 255, 0.06)' : 'rgba(0, 0, 0, 0.08)'};\n box-decoration-break: clone;\n white-space: pre-wrap;\n word-break: break-word;\n }\n .ProseMirror table {\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n margin: 8px 0;\n font-size: 14px;\n border: 1px solid ${tableBorderColor};\n border-radius: 8px;\n overflow: hidden;\n }\n .ProseMirror th, .ProseMirror td {\n border: 1px solid ${tableBorderColor};\n padding: 8px 12px;\n vertical-align: top;\n }\n .ProseMirror th {\n background-color: ${tableHeaderBg};\n font-weight: 600;\n text-align: left;\n }\n .ProseMirror td {\n background-color: transparent;\n }\n .ProseMirror .selectedCell {\n border: 2px solid ${theme.colors.blue[6]};\n }\n .ProseMirror hr {\n border: none;\n border-top: 1px solid ${colorScheme === 'dark' ? theme.colors.dark[3] : theme.colors.gray[4]};\n opacity: 0.4;\n margin: 16px 0;\n cursor: pointer;\n }\n .ProseMirror hr.ProseMirror-selectednode {\n opacity: 1;\n border-top: 2px solid ${theme.colors.blue[6]};\n outline: 2px solid ${theme.colors.blue[3]};\n outline-offset: 2px;\n }\n .ProseMirror img.ticket-image {\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n margin: 8px 0;\n cursor: pointer;\n }\n .ProseMirror img.ticket-image.ProseMirror-selectednode {\n outline: 2px solid ${theme.colors.blue[6]};\n outline-offset: 2px;\n }\n .code-block-wrapper .ProseMirror-trailingBreak {\n display: none;\n }\n `}</style>\n <TableControls editor={editor} />\n </TiptapEditorContent>\n </div>\n )\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { useEffect, useState, useCallback, useRef } from 'react'\nimport { Paper, Text, Group } from '@mantine/core'\nimport { IconDotsVertical, IconDots, IconCopy, IconTrash, IconArrowsRightLeft, IconArrowBadgeDown, IconArrowBadgeUp } from '@tabler/icons-react'\nimport type { Editor } from '@tiptap/react'\n\ninterface TableControlsProps {\n editor: Editor\n}\n\nexport function TableControls({ editor }: TableControlsProps) {\n const [isTableActive, setIsTableActive] = useState(false)\n const [colHeaders, setColHeaders] = useState<Array<{ top: number; left: number; width: number }>>([])\n const [rowHeaders, setRowHeaders] = useState<Array<{ top: number; left: number; height: number }>>([])\n const [activeColMenu, setActiveColMenu] = useState<{ index: number; top: number; left: number } | null>(null)\n const [activeRowMenu, setActiveRowMenu] = useState<{ index: number; top: number; left: number } | null>(null)\n const colMenuRef = useRef<HTMLDivElement>(null)\n const rowMenuRef = useRef<HTMLDivElement>(null)\n\n const updatePositions = useCallback(() => {\n if (!editor.isActive('table')) {\n setIsTableActive(false)\n setColHeaders([])\n setRowHeaders([])\n return\n }\n\n const container = document.querySelector('.ProseMirror')\n if (!container) return\n\n const containerRect = container.getBoundingClientRect()\n\n let tableNode: HTMLElement | null = null\n \n const { state } = editor\n const { selection } = state\n const resolvedPos = state.doc.resolve(selection.from)\n\n for (let depth = resolvedPos.depth; depth > 0; depth--) {\n const node = resolvedPos.node(depth)\n if (node.type.name === 'table') {\n const tableStartPos = resolvedPos.start(depth)\n \n const tables = document.querySelectorAll('.ProseMirror table')\n for (const table of tables) {\n try {\n const domPos = editor.view.posAtDOM(table, 0)\n if (domPos === tableStartPos) {\n tableNode = table as HTMLElement\n break\n }\n } catch {\n }\n }\n break\n }\n }\n\n if (!tableNode) {\n const sel = window.getSelection()\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0)\n const container = range.startContainer.parentElement?.closest('.ProseMirror table')\n if (container) {\n tableNode = container as HTMLElement\n }\n }\n }\n\n if (!tableNode) {\n tableNode = document.querySelector('.ProseMirror table')\n }\n\n if (!tableNode) {\n setIsTableActive(false)\n setColHeaders([])\n setRowHeaders([])\n return\n }\n\n setIsTableActive(true)\n\n const firstRow = tableNode.querySelector('tr')\n if (firstRow) {\n const cells = firstRow.querySelectorAll('th, td')\n const positions: Array<{ top: number; left: number; width: number }> = []\n\n cells.forEach((cell) => {\n const cellRect = cell.getBoundingClientRect()\n positions.push({\n top: cellRect.top - containerRect.top,\n left: cellRect.left - containerRect.left,\n width: cellRect.width,\n })\n })\n\n setColHeaders(positions)\n }\n\n const rows = tableNode.querySelectorAll('tr')\n if (rows.length > 0) {\n const positions: Array<{ top: number; left: number; height: number }> = []\n\n rows.forEach((row) => {\n const rowRect = row.getBoundingClientRect()\n positions.push({\n top: rowRect.top - containerRect.top,\n left: rowRect.left - containerRect.left,\n height: rowRect.height,\n })\n })\n\n setRowHeaders(positions)\n }\n }, [editor])\n\n useEffect(() => {\n updatePositions()\n\n const handler = () => updatePositions()\n \n editor.on('selectionUpdate', handler)\n editor.on('transaction', handler)\n\n const observer = new MutationObserver(handler)\n const tableNode = document.querySelector('.ProseMirror table')\n if (tableNode) {\n observer.observe(tableNode.parentElement!, { childList: true, subtree: true })\n }\n\n const handleClickOutside = (e: MouseEvent) => {\n if (colMenuRef.current && !colMenuRef.current.contains(e.target as Node)) {\n setActiveColMenu(null)\n }\n if (rowMenuRef.current && !rowMenuRef.current.contains(e.target as Node)) {\n setActiveRowMenu(null)\n }\n }\n\n if (activeColMenu || activeRowMenu) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n editor.off('selectionUpdate', handler)\n editor.off('transaction', handler)\n observer.disconnect()\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [editor, updatePositions, activeColMenu, activeRowMenu])\n\n const handleDuplicateColumn = () => {\n ;(editor.chain() as any).focus().addColumnAfter().run()\n setTimeout(updatePositions, 50)\n setActiveColMenu(null)\n }\n\n const handleDeleteColumn = () => {\n ;(editor.chain() as any).focus().deleteColumn().run()\n setActiveColMenu(null)\n }\n\n const handleInsertLeft = () => {\n ;(editor.chain() as any).focus().addColumnBefore().run()\n setTimeout(updatePositions, 50)\n setActiveColMenu(null)\n }\n\n const handleInsertRight = () => {\n ;(editor.chain() as any).focus().addColumnAfter().run()\n setTimeout(updatePositions, 50)\n setActiveColMenu(null)\n }\n\n const handleDuplicateRow = () => {\n ;(editor.chain() as any).focus().addRowAfter().run()\n setTimeout(updatePositions, 50)\n setActiveRowMenu(null)\n }\n\n const handleDeleteRow = () => {\n ;(editor.chain() as any).focus().deleteRow().run()\n setActiveRowMenu(null)\n }\n\n const handleInsertAbove = () => {\n ;(editor.chain() as any).focus().addRowBefore().run()\n setTimeout(updatePositions, 50)\n setActiveRowMenu(null)\n }\n\n const handleInsertBelow = () => {\n ;(editor.chain() as any).focus().addRowAfter().run()\n setTimeout(updatePositions, 50)\n setActiveRowMenu(null)\n }\n\n if (!isTableActive) return null\n\n if (!editor.isEditable) return null\n\n const menuButtonStyle = {\n position: 'absolute' as const,\n zIndex: 999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 4,\n backgroundColor: 'var(--mantine-color-body)',\n border: '1px solid var(--mantine-color-default-border)',\n opacity: 0.5,\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n }\n\n return (\n <>\n {rowHeaders.map((pos, index) => (\n <div\n key={index}\n style={{\n ...menuButtonStyle,\n top: `${pos.top + pos.height / 2 - 12}px`,\n left: `${pos.left - 12}px`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.5'\n }}\n onClick={(e) => {\n e.stopPropagation()\n setActiveRowMenu({\n index,\n top: pos.top + pos.height / 2 - 100,\n left: pos.left + 30,\n })\n }}\n >\n <IconDotsVertical size={14} />\n </div>\n ))}\n\n {colHeaders.map((pos, index) => (\n <div\n key={index}\n style={{\n ...menuButtonStyle,\n top: `${pos.top - 12}px`,\n left: `${pos.left + pos.width / 2 - 12}px`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.5'\n }}\n onClick={(e) => {\n e.stopPropagation()\n setActiveColMenu({\n index,\n top: pos.top + 30,\n left: pos.left + pos.width / 2 - 100,\n })\n }}\n >\n <IconDots size={14} />\n </div>\n ))}\n\n {activeColMenu && (\n <div\n ref={colMenuRef}\n style={{\n position: 'absolute',\n top: `${activeColMenu.top}px`,\n left: `${activeColMenu.left}px`,\n zIndex: 1001,\n }}\n >\n <Paper\n shadow=\"xl\"\n p=\"xs\"\n radius=\"md\"\n withBorder\n style={{\n minWidth: 200,\n backgroundColor: 'var(--mantine-color-body)',\n }}\n >\n <Group gap={4} wrap=\"nowrap\">\n <Text size=\"xs\" fw={500} style={{ flex: 1 }}>\n Column\n </Text>\n </Group>\n\n <div style={{ marginTop: 8 }}>\n <MenuItem\n icon={<IconArrowsRightLeft size={16} />}\n label=\"Insert Left\"\n onClick={handleInsertLeft}\n />\n <MenuItem\n icon={<IconArrowBadgeDown size={16} style={{ transform: 'rotate(-90deg)' }} />}\n label=\"Insert Right\"\n onClick={handleInsertRight}\n />\n <MenuItem\n icon={<IconCopy size={16} />}\n label=\"Duplicate\"\n onClick={handleDuplicateColumn}\n />\n <div style={{ height: 1, background: 'var(--mantine-color-default-border)', margin: '4px 0' }} />\n <MenuItem\n icon={<IconTrash size={16} />}\n label=\"Delete\"\n onClick={handleDeleteColumn}\n color=\"red\"\n />\n </div>\n </Paper>\n </div>\n )}\n\n {activeRowMenu && (\n <div\n ref={rowMenuRef}\n style={{\n position: 'absolute',\n top: `${activeRowMenu.top}px`,\n left: `${activeRowMenu.left}px`,\n zIndex: 1001,\n }}\n >\n <Paper\n shadow=\"xl\"\n p=\"xs\"\n radius=\"md\"\n withBorder\n style={{\n minWidth: 200,\n backgroundColor: 'var(--mantine-color-body)',\n }}\n >\n <Group gap={4} wrap=\"nowrap\">\n <Text size=\"xs\" fw={500} style={{ flex: 1 }}>\n Row\n </Text>\n </Group>\n\n <div style={{ marginTop: 8 }}>\n <MenuItem\n icon={<IconArrowBadgeUp size={16} />}\n label=\"Insert Above\"\n onClick={handleInsertAbove}\n />\n <MenuItem\n icon={<IconArrowBadgeDown size={16} />}\n label=\"Insert Below\"\n onClick={handleInsertBelow}\n />\n <MenuItem\n icon={<IconCopy size={16} />}\n label=\"Duplicate\"\n onClick={handleDuplicateRow}\n />\n <div style={{ height: 1, background: 'var(--mantine-color-default-border)', margin: '4px 0' }} />\n <MenuItem\n icon={<IconTrash size={16} />}\n label=\"Delete\"\n onClick={handleDeleteRow}\n color=\"red\"\n />\n </div>\n </Paper>\n </div>\n )}\n </>\n )\n}\n\nconst MenuItem = ({ icon, label, onClick, color }: { icon: React.ReactNode; label: string; onClick: () => void; color?: string }) => (\n <div\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 8px',\n borderRadius: 4,\n cursor: 'pointer',\n color: color || 'inherit',\n transition: 'background-color 0.1s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--mantine-color-default-hover)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent'\n }}\n >\n {icon}\n <Text size=\"sm\">{label}</Text>\n </div>\n)\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { BubbleMenu as TiptapBubbleMenu } from '@tiptap/react/menus'\nimport { useEditorState } from '@tiptap/react'\nimport {\n Group,\n ActionIcon,\n Text,\n Box,\n Menu,\n useMantineTheme,\n useMantineColorScheme,\n} from '@mantine/core'\nimport {\n IconBold,\n IconItalic,\n IconCode,\n IconColorPicker,\n IconQuote,\n IconCodeDots,\n IconHeading,\n IconCheck,\n IconListCheck,\n IconRefreshDot,\n IconPalette,\n IconSparkles,\n} from '@tabler/icons-react'\nimport type { Editor } from '@tiptap/react'\nimport { useState } from 'react'\nimport notificationCenter from '../../components/common/NotificationCenter'\nimport { serializeSelectionToMarkdown } from '../hooks/markdownSerializer'\nimport { DocumentEditor } from '../../modals/DocumentEditor'\n\ninterface BubbleMenuProps {\n editor: Editor\n}\n\nexport function BubbleMenu({ editor }: BubbleMenuProps) {\n const theme = useMantineTheme()\n const { colorScheme } = useMantineColorScheme()\n const isDark = colorScheme === 'dark'\n\n const [aiModalOpen, setAiModalOpen] = useState(false)\n\n const editorState = useEditorState({\n editor,\n selector: ({ editor }) => ({\n textAttrs: editor.getAttributes('textStyle'),\n bgAttrs: editor.getAttributes('backgroundColor'),\n isBold: editor.isActive('bold'),\n isItalic: editor.isActive('italic'),\n isCode: editor.isActive('code'),\n isCodeBlock: editor.isActive('codeBlock'),\n isQuote: editor.isActive('blockquote'),\n isTaskList: editor.isActive('taskList'),\n currentHeadingLevel: (() => {\n for (let level = 1; level <= 6; level++) {\n if (editor.isActive('heading', { level })) {\n return level\n }\n }\n return null\n })(),\n }),\n equalityFn: (a: any, b: any) => JSON.stringify(a) === JSON.stringify(b),\n })\n\n const handleHeadingChange = (level: 1 | 2 | 3 | 4 | 5 | 6) => {\n (editor.chain() as any).focus().toggleHeading({ level: level as 1 | 2 | 3 | 4 | 5 | 6 }).run()\n }\n\n const handleAIRewrite = () => {\n const { from, to } = editor.state.selection\n const markdownText = serializeSelectionToMarkdown(editor, from, to)\n\n if (!markdownText.trim()) {\n notificationCenter.warn({\n title: 'No text selected',\n message: 'Please select some text to rewrite with AI',\n })\n return\n }\n\n setAiModalOpen(true)\n }\n\n return (\n <>\n <TiptapBubbleMenu\n editor={editor}\n shouldShow={({ editor }) => {\n const { from, to } = editor.state.selection\n const hasSelection = from !== to\n\n if (editor.isActive('codeBlock')) {\n return false\n }\n\n if (editor.isActive('image')) {\n return false\n }\n\n if (!editor.isEditable) {\n return false\n }\n\n return hasSelection\n }}\n >\n <Group\n gap={4}\n p=\"xs\"\n bg=\"var(--mantine-color-body)\"\n style={bubbleStyle}\n >\n <ToolbarButton\n onClick={handleAIRewrite}\n icon={<IconSparkles size={12} />}\n color=\"green.8\"\n />\n\n <Divider />\n\n <ToolbarButton\n active={editorState.isBold}\n onClick={() => (editor.chain() as any).focus().toggleBold().run()}\n icon={<IconBold size={12} />}\n />\n\n <ToolbarButton\n active={editorState.isItalic}\n onClick={() => (editor.chain() as any).focus().toggleItalic().run()}\n icon={<IconItalic size={12} />}\n />\n\n <ToolbarButton\n active={editorState.isCode}\n onClick={() => (editor.chain() as any).focus().toggleCode().run()}\n icon={<IconCode size={12} />}\n />\n\n <Divider />\n\n <Menu shadow=\"md\" width={200} withinPortal>\n <Menu.Target>\n <ActionIcon size=\"sm\" variant={editorState.currentHeadingLevel ? 'filled' : 'light'} style={{ minWidth: 40 }}>\n {editorState.currentHeadingLevel ? (\n <Text size=\"xs\" fw={600}>\n H{editorState.currentHeadingLevel}\n </Text>\n ) : (\n <IconHeading size={12} />\n )}\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Label>Headings</Menu.Label>\n <Menu.Divider />\n {[1, 2, 3, 4, 5, 6].map(level => (\n <Menu.Item\n key={level}\n component=\"button\"\n onClick={() => handleHeadingChange(level as 1 | 2 | 3 | 4 | 5 | 6)}\n leftSection={editorState.currentHeadingLevel === level ? <IconCheck size={14} /> : null}\n >\n Heading {level}\n </Menu.Item>\n ))}\n </Menu.Dropdown>\n </Menu>\n\n <ToolbarButton\n active={editorState.isCodeBlock}\n onClick={() => (editor.chain() as any).focus().toggleCodeBlock().run()}\n icon={<IconCodeDots size={12} />}\n />\n\n <ToolbarButton\n active={editorState.isQuote}\n onClick={() => (editor.chain() as any).focus().toggleBlockquote().run()}\n icon={<IconQuote size={12} />}\n />\n\n <ToolbarButton\n active={editorState.isTaskList}\n onClick={() => (editor.chain() as any).focus().toggleTaskList().run()}\n icon={<IconListCheck size={12} />}\n />\n\n <Divider />\n\n <Menu shadow=\"md\" width={280} withinPortal>\n <Menu.Target>\n <ActionIcon\n size=\"sm\"\n variant={editorState.textAttrs.color ? 'filled' : 'light'}\n style={{ minWidth: 40 }}\n title=\"Text Color\"\n >\n <IconColorPicker size={12} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Group justify=\"space-between\" align=\"center\" pt=\"5\" pr=\"10\" gap=\"0\">\n <Menu.Label mb={0}>Text Color</Menu.Label>\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n onClick={() => editor.chain().focus().unsetColor().run()}\n title=\"Default\"\n >\n <IconRefreshDot size={16} />\n </ActionIcon>\n </Group>\n <Menu.Divider />\n <Group gap=\"xs\" wrap=\"wrap\" p=\"xs\">\n {['red', 'orange', 'yellow', 'green', 'blue', 'violet', 'pink', 'gray'].map(colorName => (\n <ActionIcon\n key={colorName}\n size=\"sm\"\n variant={editorState.textAttrs.color === theme.colors[colorName][6] ? 'filled' : 'light'}\n onClick={() => editor.chain().focus().setColor(theme.colors[colorName][6]).run()}\n color={colorName}\n title={colorName}\n >\n <IconCheck size={12} />\n </ActionIcon>\n ))}\n </Group>\n </Menu.Dropdown>\n </Menu>\n\n <Menu shadow=\"md\" width={280} withinPortal>\n <Menu.Target>\n <ActionIcon\n size=\"sm\"\n variant={editorState.bgAttrs.color ? 'filled' : 'light'}\n style={{ minWidth: 40 }}\n title=\"Highlight\"\n >\n <IconPalette size={12} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Group justify=\"space-between\" align=\"center\" pt=\"5\" pr=\"10\" gap=\"0\">\n <Menu.Label mb={0}>Background Color</Menu.Label>\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n onClick={() => editor.chain().focus().unsetBackgroundColor().run()}\n title=\"Default\"\n >\n <IconRefreshDot size={16} />\n </ActionIcon>\n </Group>\n <Menu.Divider />\n <Group gap=\"xs\" wrap=\"wrap\" p=\"xs\">\n {['red', 'orange', 'yellow', 'green', 'blue', 'violet', 'pink', 'gray'].map(colorName => (\n <ActionIcon\n key={colorName}\n size=\"sm\"\n variant={editorState.bgAttrs.color === colorName ? 'filled' : 'light'}\n onClick={() => editor.chain().focus().setBackgroundColor(colorName).run()}\n color={colorName}\n title={colorName}\n style={editorState.bgAttrs.color !== colorName ? { backgroundColor: isDark ? theme.colors[colorName][8] : theme.colors[colorName][1] } : undefined}\n >\n <IconCheck size={12} color={editorState.bgAttrs.color === colorName ? (isDark ? theme.white : 'inherit') : (isDark ? theme.white : theme.colors[colorName][9])} />\n </ActionIcon>\n ))}\n </Group>\n </Menu.Dropdown>\n </Menu>\n </Group>\n </TiptapBubbleMenu>\n\n <DocumentEditor\n editor={editor}\n opened={aiModalOpen}\n onClose={() => setAiModalOpen(false)}\n />\n </>\n )\n}\n\nconst ToolbarButton = ({ active, onClick, icon, color }: any) => (\n <ActionIcon\n size=\"sm\"\n variant={active ? 'filled' : 'subtle'}\n onClick={onClick}\n color={color}\n >\n {icon}\n </ActionIcon>\n)\n\nconst Divider = () => <Box w={1} h={16} bg=\"var(--mantine-color-default-border)\" mx={4} />\n\nconst bubbleStyle = {\n borderRadius: 4,\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Extension } from '@tiptap/core'\nimport Suggestion from '@tiptap/suggestion'\nimport { ReactRenderer } from '@tiptap/react'\nimport tippy from 'tippy.js'\nimport type { Instance as TippyInstance } from 'tippy.js'\nimport { forwardRef, useImperativeHandle, useState, useEffect, useRef } from 'react'\nimport { Box, Text, UnstyledButton } from '@mantine/core'\nimport type { CommandItem } from '../hooks/blockRegistry'\n\ninterface SlashCommandListProps {\n items: CommandItem[]\n command: (item: CommandItem) => void\n}\n\nexport const SlashCommandList = forwardRef((props: SlashCommandListProps, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n const scrollRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => setSelectedIndex(0), [props.items])\n\n const selectItem = (index: number) => {\n const item = props.items[index]\n if (item) {\n props.command(item)\n }\n }\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === 'ArrowUp') {\n setSelectedIndex(prev => (prev - 1 + props.items.length) % props.items.length)\n return true\n }\n\n if (event.key === 'ArrowDown') {\n setSelectedIndex(prev => (prev + 1) % props.items.length)\n return true\n }\n\n if (event.key === 'Enter' || event.key === 'Tab') {\n selectItem(selectedIndex)\n return true\n }\n\n return false\n },\n }))\n\n useEffect(() => {\n const activeItem = scrollRef.current?.querySelector(`[data-index=\"${selectedIndex}\"]`)\n if (activeItem) {\n activeItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' })\n }\n }, [selectedIndex])\n\n if (props.items.length === 0) {\n return (\n <Box p=\"xs\" bg=\"var(--mantine-color-body)\" style={{ borderRadius: 8, border: '1px solid var(--mantine-color-default-border)' }}>\n <Text size=\"xs\" c=\"dimmed\">\n Không tìm thấy kết quả...\n </Text>\n </Box>\n )\n }\n\n return (\n <Box\n ref={scrollRef}\n style={{\n background: 'var(--mantine-color-body)',\n backdropFilter: 'blur(12px)',\n border: '1px solid var(--mantine-color-default-border)',\n borderRadius: '12px',\n boxShadow: 'var(--mantine-shadow-xl)',\n padding: '4px',\n maxHeight: '320px',\n overflowY: 'auto',\n width: '300px',\n animation: 'slash-in 0.1s ease-out',\n }}\n >\n <style>{`\n @keyframes slash-in {\n from { opacity: 0; transform: translateY(5px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {props.items.map((item, index) => {\n const isSelected = index === selectedIndex\n return (\n <UnstyledButton\n key={item.title}\n data-index={index}\n onClick={() => selectItem(index)}\n onMouseEnter={() => setSelectedIndex(index)}\n style={{\n display: 'flex',\n width: '100%',\n padding: '8px 12px',\n borderRadius: '8px',\n gap: '12px',\n alignItems: 'center',\n backgroundColor: isSelected ? 'var(--mantine-color-blue-light)' : 'transparent',\n transition: 'background-color 0.1s ease',\n }}\n >\n <Box\n style={{\n width: '32px',\n height: '32px',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isSelected ? 'var(--mantine-color-default-hover)' : 'var(--mantine-color-default)',\n boxShadow: isSelected ? 'var(--mantine-shadow-xs)' : 'none',\n fontSize: '16px',\n color: isSelected ? 'var(--mantine-color-blue-filled)' : 'var(--mantine-color-default-color)',\n }}\n >\n {item.icon}\n </Box>\n <Box style={{ flex: 1 }}>\n <Text size=\"sm\" fw={isSelected ? 600 : 500} lh={1.2} c={isSelected ? 'var(--mantine-color-blue-filled)' : 'inherit'}>\n {item.title}\n </Text>\n <Text size=\"xs\" c=\"dimmed\" lh={1.2} mt={2}>\n {item.description}\n </Text>\n </Box>\n </UnstyledButton>\n )\n })}\n </Box>\n )\n})\n\nSlashCommandList.displayName = 'SlashCommandList'\n\nconst createSlashCommandRenderer = () => {\n let component: ReactRenderer | null = null\n let popup: TippyInstance | null = null\n\n return {\n onStart: (props: any) => {\n if (popup) {\n popup.destroy()\n popup = null\n }\n if (component) {\n component.destroy()\n component = null\n }\n\n component = new ReactRenderer(SlashCommandList, {\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 duration: [150, 0],\n })[0]\n },\n\n onUpdate(props: any) {\n component?.updateProps(props)\n\n if (props.clientRect && popup) {\n popup.setProps({\n getReferenceClientRect: props.clientRect,\n })\n }\n },\n\n onKeyDown(props: any) {\n if (props.event.key === 'Escape') {\n popup?.hide()\n return true\n }\n return (component?.ref as any)?.onKeyDown?.(props)\n },\n\n onExit() {\n popup?.destroy()\n component?.destroy()\n popup = null\n component = null\n },\n }\n}\n\nexport function createSlashCommand(options: {\n char: string\n items: (props: { editor: any; query: string }) => any[]\n}) {\n return Extension.create({\n name: 'slashCommand',\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: options.char,\n items: options.items,\n render: createSlashCommandRenderer,\n command: ({ editor, range, props }: any) => {\n editor.chain().focus().deleteRange(range).run()\n props.command({ editor, range })\n },\n }),\n ]\n },\n\n onDestroy() {\n },\n })\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { memo } from 'react'\nimport type { BlockNode } from '../hooks/blockRegistry'\nimport { getBlockByType } from '../hooks/blockRegistry'\n\ninterface BlockRendererProps {\n node: BlockNode\n editor?: any\n updateAttributes?: (attrs: any) => void\n deleteNode?: () => void\n}\n\nexport const BlockRenderer = memo(function BlockRenderer({\n node,\n editor,\n updateAttributes,\n deleteNode,\n}: BlockRendererProps) {\n const block = getBlockByType(node.type.name)\n\n if (!block) {\n return <div>{node.textContent}</div>\n }\n\n const Component = block.render\n\n return (\n <Component\n node={node}\n editor={editor}\n updateAttributes={updateAttributes}\n deleteNode={deleteNode}\n />\n )\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport type { Editor } from '@tiptap/react'\nimport type { ComponentType } from 'react'\nimport type { ReactNodeViewProps } from '@tiptap/react'\nimport {\n IconH1,\n IconH2,\n IconH3,\n IconList,\n IconListNumbers,\n IconListCheck,\n IconCode,\n IconQuote,\n IconMinus,\n IconTable,\n IconPhoto,\n IconBold,\n IconItalic,\n IconNote,\n IconTimelineEvent,\n IconChartArea,\n} from '@tabler/icons-react'\n\nexport interface BlockNode {\n type: { name: string }\n attrs: Record<string, any>\n content: any[]\n textContent: string\n}\n\nexport interface BlockConfig {\n type: string\n label: string\n description?: string\n icon: React.ReactNode\n keywords?: string[]\n command: (editor: Editor) => void\n render: ComponentType<{ node: BlockNode; editor?: Editor; updateAttributes?: (attrs: any) => void; deleteNode?: () => void }>\n group?: 'block' | 'inline' | 'mark'\n}\n\nexport type CommandItem = {\n title: string\n description: string\n icon: React.ReactNode\n keywords?: string[]\n command: (props: { editor: Editor; range: any }) => void\n}\n\nexport type BlockComponent = ComponentType<ReactNodeViewProps>\n\nexport const BLOCKS: BlockConfig[] = []\n\nexport function registerBlock(block: BlockConfig) {\n const existingIndex = BLOCKS.findIndex(b => b.type === block.type)\n if (existingIndex !== -1) {\n BLOCKS[existingIndex] = block\n } else {\n BLOCKS.push(block)\n }\n}\n\nexport function getBlockByType(type: string): BlockConfig | undefined {\n return BLOCKS.find(b => b.type === type)\n}\n\nexport function filterBlocks(query: string): BlockConfig[] {\n const lowerQuery = query.toLowerCase()\n return BLOCKS.filter(\n block =>\n block.label.toLowerCase().includes(lowerQuery) ||\n block.description?.toLowerCase().includes(lowerQuery) ||\n block.keywords?.some(keyword => keyword.toLowerCase().includes(lowerQuery))\n )\n}\n\nexport function getDefaultBlockItems(editor: Editor): CommandItem[] {\n return [\n {\n title: 'Heading 1',\n description: 'Large section heading',\n icon: <IconH1 size={20} />,\n keywords: ['heading', 'title', 'h1'],\n command: () => (editor.chain() as any).focus().toggleHeading({ level: 1 }).run(),\n },\n {\n title: 'Heading 2',\n description: 'Medium section heading',\n icon: <IconH2 size={20} />,\n keywords: ['heading', 'subtitle', 'h2'],\n command: () => (editor.chain() as any).focus().toggleHeading({ level: 2 }).run(),\n },\n {\n title: 'Heading 3',\n description: 'Small section heading',\n icon: <IconH3 size={20} />,\n keywords: ['heading', 'subtitle', 'h3'],\n command: () => (editor.chain() as any).focus().toggleHeading({ level: 3 }).run(),\n },\n {\n title: 'Bullet List',\n description: 'Create a simple bullet list',\n icon: <IconList size={20} />,\n keywords: ['bullet', 'list', 'unordered'],\n command: () => (editor.chain() as any).focus().toggleBulletList().run(),\n },\n {\n title: 'Numbered List',\n description: 'Create a numbered list',\n icon: <IconListNumbers size={20} />,\n keywords: ['number', 'ordered', 'list'],\n command: () => (editor.chain() as any).focus().toggleOrderedList().run(),\n },\n {\n title: 'Task List',\n description: 'Create a checklist with checkboxes',\n icon: <IconListCheck size={20} />,\n keywords: ['task', 'checkbox', 'todo', 'checklist'],\n command: () => (editor.chain() as any).focus().toggleTaskList().run(),\n },\n {\n title: 'Code Block',\n description: 'Insert a code block with syntax highlighting',\n icon: <IconCode size={20} />,\n keywords: ['code', 'block', 'pre'],\n command: () => (editor.chain() as any).focus().toggleCodeBlock().run(),\n },\n {\n title: 'Quote',\n description: 'Insert a blockquote',\n icon: <IconQuote size={20} />,\n keywords: ['quote', 'blockquote', 'citation'],\n command: () => (editor.chain() as any).focus().toggleBlockquote().run(),\n },\n {\n title: 'Horizontal Rule',\n description: 'Insert a horizontal divider',\n icon: <IconMinus size={20} />,\n keywords: ['horizontal', 'rule', 'divider', 'line'],\n command: () => (editor.chain() as any).focus().setHorizontalRule().run(),\n },\n {\n title: 'Table',\n description: 'Insert a table',\n icon: <IconTable size={20} />,\n keywords: ['table', 'grid'],\n command: () => (editor.chain() as any).focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(),\n },\n {\n title: 'Image',\n description: 'Insert an image from URL or file',\n icon: <IconPhoto size={20} />,\n keywords: ['image', 'picture', 'photo'],\n command: ({ editor }: { editor: Editor }) => {\n const choice = window.confirm(\n 'Click OK to select an image file, or Cancel to enter a URL.'\n )\n \n if (choice) {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = 'image/*'\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (file) {\n const reader = new FileReader()\n reader.onload = (event) => {\n const src = event.target?.result as string\n editor.chain().focus().setImage({ src, alt: file.name }).run()\n }\n reader.readAsDataURL(file)\n }\n }\n input.click()\n } else {\n const url = prompt('Enter image URL:')\n if (url) {\n editor.chain().focus().setImage({ src: url }).run()\n }\n }\n },\n },\n {\n title: 'Bold',\n description: 'Make text bold',\n icon: <IconBold size={20} />,\n keywords: ['bold', 'strong'],\n command: () => (editor.chain() as any).focus().toggleBold().run(),\n },\n {\n title: 'Italic',\n description: 'Make text italic',\n icon: <IconItalic size={20} />,\n keywords: ['italic', 'em'],\n command: () => (editor.chain() as any).focus().toggleItalic().run(),\n },\n {\n title: 'Notice',\n description: 'Insert a notice callout box',\n icon: <IconNote size={20} />,\n keywords: ['info', 'warning', 'callout', 'notice'],\n command: () => {\n (editor.chain() as any).focus().setNotice({ variant: 'warning', title: 'Notice' }).run()\n },\n },\n {\n title: 'Timeline',\n description: 'Create a visual timeline of events',\n icon: <IconTimelineEvent size={20} />,\n keywords: ['timeline', 'events', 'history', 'chronology'],\n command: () => {\n (editor.chain() as any).focus().setTimeline().run()\n },\n },\n {\n title: 'Diagram',\n description: 'Insert a Mermaid diagram (flowchart, sequence, etc.)',\n icon: <IconChartArea size={20} />,\n keywords: ['diagram', 'mermaid', 'flowchart', 'sequence', 'chart', 'graph'],\n command: () => {\n (editor.chain() as any).focus().setDiagram().run()\n },\n },\n ]\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport type { BlockComponent } from '../hooks/blockRegistry'\n\nexport interface CreateBlockNodeOptions {\n name: string\n group?: string\n content?: string\n draggable?: boolean\n defining?: boolean\n component?: BlockComponent\n}\n\nexport function createBlockNode(options: CreateBlockNodeOptions) {\n const {\n name,\n group = 'block',\n content = 'inline*',\n draggable = false,\n defining = true,\n component,\n } = options\n\n return Node.create({\n name,\n group,\n content,\n draggable,\n defining,\n\n parseHTML() {\n return [{ tag: `div[data-type=\"${name}\"]` }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': name }), 0]\n },\n\n addNodeView() {\n if (!component) {\n return null\n }\n return ReactNodeViewRenderer(component)\n },\n\n addAttributes() {\n return {\n variant: {\n default: null,\n parseHTML: element => element.getAttribute('data-variant'),\n renderHTML: attributes => ({ 'data-variant': attributes.variant }),\n },\n title: {\n default: null,\n parseHTML: element => element.getAttribute('data-title'),\n renderHTML: attributes => ({ 'data-title': attributes.title }),\n },\n checked: {\n default: false,\n parseHTML: element => element.getAttribute('data-checked') === 'true',\n renderHTML: attributes => ({ 'data-checked': attributes.checked }),\n },\n language: {\n default: null,\n parseHTML: element => element.getAttribute('data-language'),\n renderHTML: attributes => ({ 'data-language': attributes.language }),\n },\n }\n },\n\n addCommands() {\n return {\n [`set${name.charAt(0).toUpperCase() + name.slice(1)}`]:\n (attrs?: Record<string, any>) =>\n ({ commands }: any) => {\n return commands.insertContent({\n type: this.name,\n attrs,\n content: content ? [{ type: 'paragraph' }] : [],\n })\n },\n } as any\n },\n })\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport MarkdownIt from 'markdown-it';\n\nconst md = new MarkdownIt({\n html: true,\n breaks: false,\n linkify: true,\n});\n\nmd.block.ruler.before('paragraph', 'table', (state, startLine, endLine, silent) => {\n const startPos = state.bMarks[startLine] + state.tShift[startLine];\n const endPos = state.eMarks[startLine];\n const firstLine = state.src.slice(startPos, endPos).trim();\n \n if (!firstLine.startsWith('|') && !firstLine.startsWith('|-')) {\n return false;\n }\n \n let nextLine = startLine;\n const rows: string[] = [];\n \n while (nextLine < endLine) {\n const rowStart = state.bMarks[nextLine] + state.tShift[nextLine];\n const rowEnd = state.eMarks[nextLine];\n const rowText = state.src.slice(rowStart, rowEnd).trim();\n \n if (!rowText.startsWith('|')) {\n break;\n }\n \n rows.push(rowText);\n nextLine++;\n }\n \n if (rows.length < 2) {\n return false;\n }\n \n const separatorRow = rows[1].trim();\n if (!/^[\\s|:\\-]+$/.test(separatorRow)) {\n return false;\n }\n \n if (silent) {\n return true;\n }\n \n const parseCells = (row: string, cellType: string) => {\n const cells = row.split('|').filter(c => c.trim() !== '');\n cells.forEach(cellText => {\n state.push(cellType + '_open', cellType, 1);\n const inline = state.push('inline', '', 0);\n inline.content = cellText.trim();\n inline.children = [];\n state.push(cellType + '_close', cellType, -1);\n });\n };\n \n const tableOpen = state.push('table_open', 'table', 1);\n tableOpen.map = [startLine, nextLine];\n \n state.push('thead_open', 'thead', 1);\n state.push('tr_open', 'tr', 1);\n parseCells(rows[0], 'th');\n state.push('tr_close', 'tr', -1);\n state.push('thead_close', 'thead', -1);\n \n state.push('tbody_open', 'tbody', 1);\n for (let i = 2; i < rows.length; i++) {\n state.push('tr_open', 'tr', 1);\n parseCells(rows[i], 'td');\n state.push('tr_close', 'tr', -1);\n }\n state.push('tbody_close', 'tbody', -1);\n \n state.push('table_close', 'table', -1);\n \n state.line = nextLine;\n return true;\n}, { alt: ['paragraph', 'reference', 'blockquote'] });\n\nexport const markdownToTiptapJSON = (markdown: string): string => {\n if (!markdown || !markdown.trim()) {\n return JSON.stringify({ type: 'doc', content: [] });\n }\n\n try {\n const parsed = JSON.parse(markdown);\n if (parsed.type === 'doc') {\n return markdown;\n }\n } catch {\n }\n\n const tokens = md.parse(markdown, {});\n const content: any[] = convertTokensToTiptap(tokens);\n\n return JSON.stringify({ type: 'doc', content });\n};\n\nconst convertTokensToTiptap = (tokens: any[]): any[] => {\n const content: any[] = [];\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n switch (token.type) {\n case 'heading_open': {\n const level = parseInt(token.tag.replace('h', ''));\n const inline = tokens[i + 1];\n const text = inline?.content || '';\n content.push({\n type: 'heading',\n attrs: { level },\n content: text ? parseInline(text) : []\n });\n i += 3;\n break;\n }\n\n case 'paragraph_open': {\n const inline = tokens[i + 1];\n if (inline?.type === 'inline' && inline.content?.trim()) {\n content.push({\n type: 'paragraph',\n content: parseInline(inline.content)\n });\n }\n i += 3;\n break;\n }\n\n case 'table_open': {\n const tableContent: any[] = [];\n let j = i + 1;\n \n while (j < tokens.length && tokens[j].type !== 'table_close') {\n const t = tokens[j];\n \n if (t.type === 'tr_open') {\n const rowCells: any[] = [];\n let k = j + 1;\n \n while (k < tokens.length && tokens[k].type !== 'tr_close') {\n const cell = tokens[k];\n if (cell.type === 'th_open' || cell.type === 'td_open') {\n const cellType = cell.type === 'th_open' ? 'tableHeader' : 'tableCell';\n const inline = tokens[k + 1];\n const cellContent: any[] = inline?.content \n ? [{ type: 'paragraph', content: parseInline(inline.content) }]\n : [{ type: 'paragraph', content: [] }];\n \n rowCells.push({\n type: cellType,\n attrs: { colspan: 1, rowspan: 1, colwidth: null },\n content: cellContent\n });\n k += 3;\n } else {\n k++;\n }\n }\n \n tableContent.push({\n type: 'tableRow',\n content: rowCells\n });\n j = k + 1;\n } else {\n j++;\n }\n }\n \n content.push({\n type: 'table',\n content: tableContent\n });\n i = j + 1;\n break;\n }\n\n case 'bullet_list_open': {\n const items: any[] = [];\n let j = i + 1;\n let isTaskList = false;\n\n let peekJ = j;\n while (peekJ < tokens.length && tokens[peekJ].type !== 'bullet_list_close') {\n if (tokens[peekJ].type === 'list_item_open' && tokens[peekJ + 1]?.type === 'paragraph_open') {\n const inline = tokens[peekJ + 2];\n if (inline?.type === 'inline' && inline.content?.match(/^\\[[ xX]\\]/)) {\n isTaskList = true;\n break;\n }\n }\n peekJ++;\n }\n\n while (j < tokens.length && tokens[j].type !== 'bullet_list_close') {\n if (tokens[j].type === 'list_item_open') {\n const itemContent: any[] = [];\n let k = j + 1;\n\n while (k < tokens.length && tokens[k].type !== 'list_item_close') {\n if (tokens[k].type === 'paragraph_open' && tokens[k + 1]?.type === 'inline') {\n const text = tokens[k + 1].content;\n if (text?.trim()) {\n const taskMatch = text.match(/^\\[([ xX])\\]\\s*(.*)/);\n \n if (isTaskList && taskMatch) {\n const checked = taskMatch[1].toLowerCase() === 'x';\n const remainingText = taskMatch[2];\n itemContent.push({\n type: 'taskItem',\n attrs: { checked },\n content: remainingText.trim()\n ? [{ type: 'paragraph', content: parseInline(remainingText) }]\n : [{ type: 'paragraph', content: [] }]\n });\n } else {\n itemContent.push({\n type: 'listItem',\n content: [{\n type: 'paragraph',\n content: parseInline(text)\n }]\n });\n }\n }\n k += 3;\n } else {\n k++;\n }\n }\n\n items.push(...itemContent);\n j = k + 1;\n } else {\n j++;\n }\n }\n\n if (isTaskList) {\n content.push({\n type: 'taskList',\n content: items\n });\n } else {\n content.push({\n type: 'bulletList',\n attrs: { tight: true },\n content: items\n });\n }\n i = j + 1;\n break;\n }\n\n case 'ordered_list_open': {\n const items: any[] = [];\n let j = i + 1;\n \n while (j < tokens.length && tokens[j].type !== 'ordered_list_close') {\n if (tokens[j].type === 'list_item_open') {\n const itemContent: any[] = [];\n let k = j + 1;\n \n while (k < tokens.length && tokens[k].type !== 'list_item_close') {\n if (tokens[k].type === 'paragraph_open' && tokens[k + 1]?.type === 'inline') {\n const text = tokens[k + 1].content;\n if (text?.trim()) {\n itemContent.push({\n type: 'paragraph',\n content: parseInline(text)\n });\n }\n k += 3;\n } else {\n k++;\n }\n }\n \n items.push({\n type: 'listItem',\n content: itemContent.length ? itemContent : [{ type: 'paragraph', content: [] }]\n });\n j = k + 1;\n } else {\n j++;\n }\n }\n \n content.push({\n type: 'orderedList',\n attrs: { start: 1 },\n content: items\n });\n i = j + 1;\n break;\n }\n\n case 'blockquote_open': {\n const quoteContent: any[] = [];\n let j = i + 1;\n \n while (j < tokens.length && tokens[j].type !== 'blockquote_close') {\n if (tokens[j].type === 'paragraph_open' && tokens[j + 1]?.type === 'inline') {\n const text = tokens[j + 1].content;\n quoteContent.push({\n type: 'paragraph',\n content: parseInline(text)\n });\n j += 3;\n } else {\n j++;\n }\n }\n \n content.push({\n type: 'blockquote',\n content: quoteContent\n });\n i = j + 1;\n break;\n }\n\n case 'fence':\n case 'code_block': {\n const language = token.info?.trim() || '';\n content.push({\n type: 'codeBlock',\n attrs: { language },\n content: [{ type: 'text', text: token.content }]\n });\n i++;\n break;\n }\n\n case 'hr':\n content.push({ type: 'horizontalRule' });\n i++;\n break;\n\n default:\n i++;\n }\n }\n\n return content;\n};\n\nconst parseInline = (text: string): any[] => {\n const nodes: any[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n const codeMatch = remaining.match(/^`([^`]+)`/);\n if (codeMatch) {\n nodes.push({ type: 'text', text: codeMatch[1], marks: [{ type: 'code' }] });\n remaining = remaining.slice(codeMatch[0].length);\n continue;\n }\n\n const boldItalicMatch = remaining.match(/^\\*\\*\\*([^*]+)\\*\\*\\*/);\n if (boldItalicMatch) {\n nodes.push({\n type: 'text',\n text: boldItalicMatch[1],\n marks: [{ type: 'bold' }, { type: 'italic' }]\n });\n remaining = remaining.slice(boldItalicMatch[0].length);\n continue;\n }\n\n const boldMatch = remaining.match(/^\\*\\*([^*]+)\\*\\*/);\n if (boldMatch) {\n nodes.push({ type: 'text', text: boldMatch[1], marks: [{ type: 'bold' }] });\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n const italicMatch = remaining.match(/^\\*([^*]+)\\*/);\n if (italicMatch) {\n nodes.push({ type: 'text', text: italicMatch[1], marks: [{ type: 'italic' }] });\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n const linkMatch = remaining.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n nodes.push({\n type: 'text',\n text: linkMatch[1],\n marks: [{ type: 'link', attrs: { href: linkMatch[2] } }]\n });\n remaining = remaining.slice(linkMatch[0].length);\n continue;\n }\n\n const nextSpecial = remaining.match(/^[^`*\\[\\\\]+/);\n if (nextSpecial) {\n nodes.push({ type: 'text', text: nextSpecial[0] });\n remaining = remaining.slice(nextSpecial[0].length);\n } else {\n nodes.push({ type: 'text', text: remaining[0] });\n remaining = remaining.slice(1);\n }\n }\n\n return nodes.length ? nodes : [{ type: 'text', text }];\n};\n\nexport const isTiptapJSON = (content: string): boolean => {\n if (!content) return false;\n try {\n const parsed = JSON.parse(content);\n return parsed.type === 'doc';\n } catch {\n return false;\n }\n};\n\nexport const migrateToTiptapJSON = (content: string): string => {\n if (isTiptapJSON(content)) {\n return content;\n }\n return markdownToTiptapJSON(content);\n};\n"],"mappings":"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","names":["import_react","import_core","import_react","content","import_react","import_react","import_core","import_core","import_jsx_runtime","import_jsx_runtime","import_core","import_react","import_react","import_core","import_jsx_runtime","TaskItem","import_core","import_react","import_react","import_core","import_icons_react","import_jsx_runtime","import_core","import_react","import_react","import_core","import_icons_react","import_react","import_jsx_runtime","import_core","import_react","import_react","import_core","import_icons_react","import_react","import_jsx_runtime","mermaid","import_core","import_react","import_react","import_core","import_icons_react","import_jsx_runtime","ImageBlock","Image","editor","StarterKit","BulletList","OrderedList","ListItem","TaskList","import_react","import_state","generateId","import_react","import_core","import_icons_react","import_react","import_core","import_jsx_runtime","HeadingBar","ReadingIndicator","import_jsx_runtime","TurndownService","import_jsx_runtime","MarkdownEditor","editor","import_react","import_core","import_icons_react","import_icons_react","import_jsx_runtime","import_jsx_runtime","import_react","import_core","import_react","import_core","import_icons_react","import_jsx_runtime","container","import_jsx_runtime","TiptapEditorContent","import_react","import_core","import_icons_react","import_jsx_runtime","editor","TiptapBubbleMenu","import_core","import_react","import_jsx_runtime","tippy","Suggestion","import_react","import_icons_react","import_jsx_runtime","editor","import_jsx_runtime","BlockRenderer","import_core","import_react","MarkdownIt"]}