dishui 0.0.97 → 0.0.101

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.
Files changed (74) hide show
  1. package/dist/.release-verified.json +2 -2
  2. package/dist/ai.js +17 -15
  3. package/dist/components/Card/Ticket.d.ts +52 -0
  4. package/dist/components/Card/Ticket2.js +218 -0
  5. package/dist/components/Card/Ticket2.js.map +1 -0
  6. package/dist/components/Card/index.d.ts +12 -0
  7. package/dist/components/Card/index.js +142 -139
  8. package/dist/components/Card/index.js.map +1 -1
  9. package/dist/components/ai/AgentRunCard/index.d.ts +38 -0
  10. package/dist/components/ai/AgentRunCard/index.js +100 -0
  11. package/dist/components/ai/AgentRunCard/index.js.map +1 -0
  12. package/dist/components/ai/IssueCard/index.d.ts +39 -0
  13. package/dist/components/ai/IssueCard/index.js +78 -0
  14. package/dist/components/ai/IssueCard/index.js.map +1 -0
  15. package/dist/components/ai/index.d.ts +4 -0
  16. package/dist/components/pro/Flow/constants.js +3 -3
  17. package/dist/components/pro/Flow/constants.js.map +1 -1
  18. package/dist/components/pro/Flow/nodes/shapes.js +3 -3
  19. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  20. package/dist/components/pro/Flow/utils/themeColor.d.ts +2 -2
  21. package/dist/components/pro/Flow/utils/themeColor.js +2 -2
  22. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  23. package/dist/components/pro/Kanban/Kanban.d.ts +3 -0
  24. package/dist/components/pro/Kanban/Kanban.js +339 -0
  25. package/dist/components/pro/Kanban/Kanban.js.map +1 -0
  26. package/dist/components/pro/Kanban/Swimlanes.d.ts +3 -0
  27. package/dist/components/pro/Kanban/Swimlanes.js +60 -0
  28. package/dist/components/pro/Kanban/Swimlanes.js.map +1 -0
  29. package/dist/components/pro/Kanban/index.d.ts +5 -0
  30. package/dist/components/pro/Kanban/types.d.ts +103 -0
  31. package/dist/components/pro/Kanban/useKanbanDrag.d.ts +17 -0
  32. package/dist/components/pro/Kanban/useKanbanDrag.js +69 -0
  33. package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -0
  34. package/dist/components/pro/Kanban/utils.d.ts +13 -0
  35. package/dist/components/pro/Kanban/utils.js +48 -0
  36. package/dist/components/pro/Kanban/utils.js.map +1 -0
  37. package/dist/components/pro/RichTextEditor/AIRewrite.js +158 -127
  38. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  39. package/dist/components/pro/RichTextEditor/BlockHandle.d.ts +2 -0
  40. package/dist/components/pro/RichTextEditor/BlockHandle.js +156 -115
  41. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  42. package/dist/components/pro/RichTextEditor/RichTextEditor.js +136 -159
  43. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  44. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +44 -41
  45. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  46. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +59 -53
  47. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  48. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +48 -44
  49. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  50. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js +67 -63
  51. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  52. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.d.ts +1 -0
  53. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +182 -129
  54. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  55. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.d.ts +1 -0
  56. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js +3 -3
  57. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  58. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.d.ts +3 -0
  59. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js +31 -0
  60. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -0
  61. package/dist/components/pro/RichTextEditor/index.d.ts +1 -1
  62. package/dist/components/pro/RichTextEditor/types.d.ts +78 -11
  63. package/dist/components/pro/RichTextEditor/types.js +11 -0
  64. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  65. package/dist/dishui.css +1 -1
  66. package/dist/index-nostyled.d.ts +1 -1
  67. package/dist/index.d.ts +4 -2
  68. package/dist/index.js +128 -122
  69. package/dist/kanban.js +5 -0
  70. package/dist/utils/i18n.js +20 -0
  71. package/dist/utils/i18n.js.map +1 -1
  72. package/dist/utils/menu.js +1 -1
  73. package/dist/utils/menu.js.map +1 -1
  74. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/Toolbar.tsx"],"sourcesContent":["import React, { useCallback, useState, useEffect, useRef } from 'react';\nimport { useEditorState, type Editor } from '@tiptap/react';\nimport type { Mark } from '@tiptap/pm/model';\nimport type { ToolbarSection, RichTextEditorLabels } from '../types';\nimport { defaultLabels } from '../types';\nimport { getNextFloatZIndex } from '../extensions/FloatingDialog';\nimport { ToolbarButton, ToolbarDivider } from './ToolbarButton';\nimport { ColorPicker } from './ColorPicker';\nimport { SelectDropdown, FONT_FAMILIES, FONT_SIZES } from './SelectDropdown';\nimport { MarkdownTemplateMenu } from './MarkdownTemplates';\nimport { FloatingDialogMenu } from './FloatingDialogMenu';\nimport { TableOpsMenu } from './TableOpsMenu';\n\n// Only visual formatting belongs to the painter, never links or comment IDs.\nconst PAINT_MARKS = new Set(['bold', 'italic', 'underline', 'strike', 'code', 'subscript', 'superscript', 'textStyle', 'highlight']);\n\ninterface ToolbarProps {\n editor: Editor;\n config?: ToolbarSection;\n labels?: RichTextEditorLabels;\n hasAI?: boolean;\n onAIClick?: () => void;\n onFormatPainterChange?: (active: boolean) => void;\n children?: React.ReactNode;\n}\n\nconst Toolbar: React.FC<ToolbarProps> = ({\n editor,\n config,\n labels: propsLabels,\n hasAI,\n onAIClick,\n onFormatPainterChange,\n children,\n}) => {\n const labels = { ...defaultLabels, ...propsLabels };\n useEditorState({ editor, selector: ({ transactionNumber }) => transactionNumber });\n const [formatPainterMarks, setFormatPainterMarks] = useState<readonly Mark[] | null>(null);\n const painterChange = useRef(onFormatPainterChange);\n useEffect(() => {\n painterChange.current = onFormatPainterChange;\n }, [onFormatPainterChange]);\n\n const cfg: Required<ToolbarSection> = {\n textFormat: config?.textFormat ?? true,\n heading: config?.heading ?? true,\n alignment: config?.alignment ?? true,\n list: config?.list ?? true,\n insert: config?.insert ?? true,\n color: config?.color ?? true,\n history: config?.history ?? true,\n ai: config?.ai ?? true,\n tableOps: config?.tableOps ?? true,\n fontStyle: config?.fontStyle ?? true,\n formatPainter: config?.formatPainter ?? true,\n };\n\n const setLink = useCallback(() => {\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt(labels.insertLinkUrl, previousUrl);\n if (url === null) return;\n if (editor.isDestroyed || !editor.isEditable) return;\n if (url.trim() === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: url.trim() }).run();\n }, [editor, labels.insertLinkUrl]);\n\n const addImage = useCallback(() => {\n const url = window.prompt(labels.insertImageUrl);\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }, [editor, labels.insertImageUrl]);\n\n const insertTable = useCallback(() => {\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();\n }, [editor]);\n\n const insertMarkdownBlock = useCallback(() => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-markdown' },\n content: [{ type: 'text', text: '# Markdown\\n\\nWrite your **markdown** here.' }],\n }).run();\n }, [editor]);\n\n const insertMarkdownTemplate = useCallback((content: string, focusEditor = true) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n const chain = editor.chain();\n if (focusEditor) chain.focus();\n chain.insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-markdown' },\n content: [{ type: 'text', text: content }],\n }).run();\n }, [editor]);\n\n const insertFloatingDialog = useCallback((layout: 'block' | 'wrap-left' | 'wrap-right' | 'float' = 'block', focusEditor = true) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n const extraAttrs = layout === 'float'\n ? { x: 40, y: 40, zIndex: getNextFloatZIndex(editor) }\n : layout === 'block'\n ? {}\n : { width: 240 };\n const chain = editor.chain();\n if (focusEditor) chain.focus();\n chain.insertContent({\n type: 'floatingDialog',\n attrs: { title: 'Note', layout, ...extraAttrs },\n content: [{ type: 'paragraph' }],\n }).run();\n }, [editor]);\n\n const handleFormatPainter = useCallback(() => {\n if (formatPainterMarks) {\n setFormatPainterMarks(null);\n return;\n }\n if (editor.isDestroyed || !editor.isEditable) return;\n const { from, to } = editor.state.selection;\n if (from === to) return;\n\n let marks: readonly Mark[] | undefined;\n editor.state.doc.nodesBetween(from, to, (node) => {\n if (!node.isText) return;\n const formatting = node.marks.filter((mark) => PAINT_MARKS.has(mark.type.name));\n marks = marks === undefined ? formatting : marks.filter((mark) => formatting.some((other) => mark.eq(other)));\n });\n if (marks === undefined) return;\n setFormatPainterMarks(marks);\n }, [editor, formatPainterMarks]);\n\n useEffect(() => {\n if (!formatPainterMarks) return;\n if (editor.isDestroyed || !editor.isEditable || !cfg.formatPainter || !cfg.textFormat) {\n setFormatPainterMarks(null);\n return;\n }\n\n painterChange.current?.(true);\n const editorEl = editor.view.dom;\n let frame: number | null = null;\n let cancelled = false;\n const cancel = () => {\n cancelled = true;\n if (frame !== null) cancelAnimationFrame(frame);\n frame = null;\n setFormatPainterMarks(null);\n };\n const onTransaction = () => {\n if (!editor.isEditable) cancel();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') cancel();\n };\n\n const applyMarks = () => {\n frame = null;\n if (cancelled || editor.isDestroyed || !editor.isEditable) return;\n const { from, to } = editor.state.selection;\n if (from === to) return;\n\n const { tr } = editor.state;\n for (const name of PAINT_MARKS) {\n const type = editor.schema.marks[name];\n if (type) tr.removeMark(from, to, type);\n }\n editor.state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText) return;\n const semantic = node.marks.filter((mark) => !PAINT_MARKS.has(mark.type.name));\n for (const mark of formatPainterMarks) {\n // Code and custom exclusions must not implicitly remove semantic marks.\n if (semantic.some((other) => mark.type.excludes(other.type) || other.type.excludes(mark.type))) continue;\n tr.addMark(Math.max(from, pos), Math.min(to, pos + node.nodeSize), mark);\n }\n });\n cancelled = true;\n editor.view.dispatch(tr);\n setFormatPainterMarks(null);\n };\n\n const onMouseUp = () => {\n if (cancelled) return;\n if (frame !== null) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(applyMarks);\n };\n\n editorEl.addEventListener('mouseup', onMouseUp);\n editorEl.ownerDocument.addEventListener('keydown', onKeyDown);\n editor.on('transaction', onTransaction);\n editor.on('destroy', cancel);\n return () => {\n cancelled = true;\n if (frame !== null) cancelAnimationFrame(frame);\n editorEl.removeEventListener('mouseup', onMouseUp);\n editorEl.ownerDocument.removeEventListener('keydown', onKeyDown);\n editor.off('transaction', onTransaction);\n editor.off('destroy', cancel);\n painterChange.current?.(false);\n };\n }, [editor, formatPainterMarks, cfg.formatPainter, cfg.textFormat]);\n\n const currentFontFamily = editor.getAttributes('textStyle').fontFamily || '';\n const currentFontSize = editor.getAttributes('textStyle').fontSize || '';\n\n return (\n <div className=\"rte-toolbar\" role=\"group\" aria-label=\"Text formatting\">\n {cfg.history && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title={labels.undo}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"1 4 1 10 7 10\" />\n <path d=\"M3.51 15a9 9 0 102.13-9.36L1 10\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title={labels.redo}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 11-2.13-9.36L23 10\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.fontStyle && (\n <>\n <SelectDropdown\n value={currentFontFamily}\n options={FONT_FAMILIES}\n onChange={(val) => {\n if (val) {\n editor.chain().focus().setFontFamily(val).run();\n } else {\n editor.chain().focus().unsetFontFamily().run();\n }\n }}\n title={labels.fontFamily}\n width={120}\n />\n <SelectDropdown\n value={currentFontSize}\n options={FONT_SIZES}\n onChange={(val) => {\n if (val) {\n (editor.chain().focus() as any).setFontSize(val).run();\n } else {\n (editor.chain().focus() as any).unsetFontSize().run();\n }\n }}\n title={labels.fontSize}\n width={80}\n />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.textFormat && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n isActive={editor.isActive('bold')}\n title={labels.bold}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 4h8a4 4 0 014 4 4 4 0 01-4 4H6z\" />\n <path d=\"M6 12h9a4 4 0 014 4 4 4 0 01-4 4H6z\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n isActive={editor.isActive('italic')}\n title={labels.italic}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n <line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n <line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n isActive={editor.isActive('underline')}\n title={labels.underline}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 3v7a6 6 0 006 6 6 6 0 006-6V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n isActive={editor.isActive('strike')}\n title={labels.strikethrough}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.3 4.9c-2.3-.6-4.4-1-6.2-.9-2.7 0-5.3.7-5.3 3.6 0 1.5 1.8 3.3 7.2 3.3\" />\n <path d=\"M13 15.1c0 2.8-2.6 3.6-5.3 3.6-1.8-.1-3.9-.5-6.2-.9\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n isActive={editor.isActive('subscript')}\n title={labels.subscript}\n >\n <span style={{ fontSize: '13px', fontWeight: 600 }}>X<sub style={{ fontSize: '9px' }}>2</sub></span>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n isActive={editor.isActive('superscript')}\n title={labels.superscript}\n >\n <span style={{ fontSize: '13px', fontWeight: 600 }}>X<sup style={{ fontSize: '9px' }}>2</sup></span>\n </ToolbarButton>\n {cfg.formatPainter && (\n <ToolbarButton\n onClick={handleFormatPainter}\n disabled={!editor.isEditable || (!formatPainterMarks && editor.state.selection.empty)}\n isActive={!!formatPainterMarks}\n title={formatPainterMarks ? labels.formatPainterActive : labels.formatPainter}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 3H5a2 2 0 00-2 2v2a2 2 0 002 2h14a2 2 0 002-2V5a2 2 0 00-2-2z\" />\n <path d=\"M10 7v4a2 2 0 01-2 2H7\" />\n <path d=\"M7 13l-3 8\" />\n <path d=\"M4 21h6\" />\n </svg>\n </ToolbarButton>\n )}\n <ToolbarDivider />\n </>\n )}\n\n {cfg.heading && (\n <>\n {([1, 2, 3, 4, 5, 6] as const).map((level) => (\n <ToolbarButton\n key={level}\n onClick={() => editor.chain().focus().toggleHeading({ level }).run()}\n isActive={editor.isActive('heading', { level })}\n title={`${labels.heading} ${level}`}\n >\n <span style={{ fontSize: '12px', fontWeight: 700 }}>H{level}</span>\n </ToolbarButton>\n ))}\n <ToolbarDivider />\n </>\n )}\n\n {cfg.alignment && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n isActive={editor.isActive({ textAlign: 'left' })}\n title={labels.alignLeft}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"17\" y1=\"10\" x2=\"3\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n isActive={editor.isActive({ textAlign: 'center' })}\n title={labels.alignCenter}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"10\" x2=\"6\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"18\" y1=\"18\" x2=\"6\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n isActive={editor.isActive({ textAlign: 'right' })}\n title={labels.alignRight}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"21\" y1=\"10\" x2=\"7\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('justify').run()}\n isActive={editor.isActive({ textAlign: 'justify' })}\n title={labels.alignJustify}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"21\" y1=\"10\" x2=\"3\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.list && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n isActive={editor.isActive('bulletList')}\n title={labels.bulletList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <circle cx=\"4\" cy=\"6\" r=\"1\" fill=\"currentColor\" /><circle cx=\"4\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"4\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n isActive={editor.isActive('orderedList')}\n title={labels.orderedList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <text x=\"2\" y=\"8\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">1</text>\n <text x=\"2\" y=\"14\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">2</text>\n <text x=\"2\" y=\"20\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">3</text>\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleTaskList().run()}\n isActive={editor.isActive('taskList')}\n title={labels.taskList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" /><path d=\"M5 8l1.5 1.5L9 6.5\" />\n <line x1=\"12\" y1=\"8\" x2=\"21\" y2=\"8\" />\n <rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" />\n <line x1=\"12\" y1=\"17\" x2=\"21\" y2=\"17\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.insert && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n isActive={editor.isActive('blockquote')}\n title={labels.blockquote}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V21z\" />\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3z\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleNode('codeBlock', 'paragraph').run()}\n isActive={editor.isActive('codeBlock')}\n title={labels.codeBlock}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\" /><polyline points=\"8 6 2 12 8 18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-mermaid' },\n content: [{ type: 'text', text: 'graph TD\\n A[Start] --> B[End]' }],\n }).run();\n }}\n title={labels.mermaidBlock}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"6\" cy=\"6\" r=\"3\" /><circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"12\" cy=\"18\" r=\"3\" />\n <line x1=\"6\" y1=\"9\" x2=\"12\" y2=\"15\" /><line x1=\"18\" y1=\"9\" x2=\"12\" y2=\"15\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={setLink} isActive={editor.isActive('link')} title={labels.link}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={addImage} title={labels.image}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" /><polyline points=\"21 15 16 10 5 21\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={insertTable} title={labels.table}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" /><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" /><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" />\n </svg>\n </ToolbarButton>\n {cfg.tableOps && <TableOpsMenu editor={editor} labels={labels} />}\n <ToolbarButton\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title={labels.horizontalRule}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={insertMarkdownBlock} title={labels.markdownBlock}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2 3h20v18H2z\" />\n <path d=\"M5 15V9l3 3.5L11 9v6\" />\n <path d=\"M17 9l-2.5 3H17v3\" />\n </svg>\n </ToolbarButton>\n <MarkdownTemplateMenu labels={labels} onSelect={insertMarkdownTemplate} />\n <FloatingDialogMenu labels={labels} onInsert={insertFloatingDialog} />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.color && (\n <>\n <ColorPicker\n value={editor.getAttributes('textStyle').color || ''}\n onChange={(color) => {\n if (color) {\n editor.chain().focus().setColor(color).run();\n } else {\n editor.chain().focus().unsetColor().run();\n }\n }}\n title={labels.color}\n kind=\"text\"\n />\n <ColorPicker\n value={editor.getAttributes('highlight').color || ''}\n onChange={(color) => {\n if (color) {\n editor.chain().focus().toggleHighlight({ color }).run();\n } else {\n editor.chain().focus().unsetHighlight().run();\n }\n }}\n title={labels.highlight}\n kind=\"highlight\"\n />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.ai && hasAI && onAIClick && (\n <ToolbarButton onClick={onAIClick} title={labels.ai}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9.5 2A2.5 2.5 0 0112 4.5v15a2.5 2.5 0 01-4.96.44 2.5 2.5 0 01-2.96-3.08 3 3 0 01-.34-5.58 2.5 2.5 0 011.32-4.24 2.5 2.5 0 011.98-3A2.5 2.5 0 019.5 2z\" />\n <path d=\"M14.5 2A2.5 2.5 0 0012 4.5v15a2.5 2.5 0 004.96.44 2.5 2.5 0 002.96-3.08 3 3 0 00.34-5.58 2.5 2.5 0 00-1.32-4.24 2.5 2.5 0 00-1.98-3A2.5 2.5 0 0014.5 2z\" />\n </svg>\n </ToolbarButton>\n )}\n\n {children}\n </div>\n );\n};\n\nexport default Toolbar;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Toolbar.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/Toolbar.tsx"],"sourcesContent":["import React, { useCallback, useState, useEffect, useRef } from 'react';\nimport { useEditorState, type Editor } from '@tiptap/react';\nimport type { Mark } from '@tiptap/pm/model';\nimport type { ToolbarButtonConfig, ToolbarSection, RichTextEditorLabels } from '../types';\nimport { defaultLabels } from '../types';\nimport { getNextFloatZIndex } from '../extensions/FloatingDialog';\nimport { ToolbarButton, ToolbarDivider } from './ToolbarButton';\nimport { ColorPicker } from './ColorPicker';\nimport { SelectDropdown, FONT_FAMILIES, FONT_SIZES } from './SelectDropdown';\nimport { MarkdownTemplateMenu } from './MarkdownTemplates';\nimport { FloatingDialogMenu } from './FloatingDialogMenu';\nimport { TableOpsMenu } from './TableOpsMenu';\n\n// Only visual formatting belongs to the painter, never links or comment IDs.\nconst PAINT_MARKS = new Set(['bold', 'italic', 'underline', 'strike', 'code', 'subscript', 'superscript', 'textStyle', 'highlight']);\n\ninterface ToolbarProps {\n editor: Editor;\n config?: ToolbarSection;\n labels?: RichTextEditorLabels;\n hasAI?: boolean;\n onAIClick?: () => void;\n onRequestAIConfig?: () => void;\n onFormatPainterChange?: (active: boolean) => void;\n children?: React.ReactNode;\n}\n\nconst Toolbar: React.FC<ToolbarProps> = ({\n editor,\n config,\n labels: propsLabels,\n hasAI,\n onAIClick,\n onRequestAIConfig,\n onFormatPainterChange,\n children,\n}) => {\n const labels = { ...defaultLabels, ...propsLabels };\n useEditorState({ editor, selector: ({ transactionNumber }) => transactionNumber });\n const [formatPainterMarks, setFormatPainterMarks] = useState<readonly Mark[] | null>(null);\n const painterChange = useRef(onFormatPainterChange);\n useEffect(() => {\n painterChange.current = onFormatPainterChange;\n }, [onFormatPainterChange]);\n\n const cfg = {\n textFormat: config?.textFormat ?? true,\n heading: config?.heading ?? true,\n alignment: config?.alignment ?? true,\n list: config?.list ?? true,\n insert: config?.insert ?? true,\n color: config?.color ?? true,\n history: config?.history ?? true,\n ai: config?.ai ?? true,\n tableOps: config?.tableOps ?? true,\n fontStyle: config?.fontStyle ?? true,\n formatPainter: config?.formatPainter ?? true,\n };\n const buttons: ToolbarButtonConfig = config?.buttons ?? {};\n const show = (button: keyof ToolbarButtonConfig, section = true) => buttons[button] ?? section;\n\n const setLink = useCallback(() => {\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt(labels.insertLinkUrl, previousUrl);\n if (url === null) return;\n if (editor.isDestroyed || !editor.isEditable) return;\n if (url.trim() === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: url.trim() }).run();\n }, [editor, labels.insertLinkUrl]);\n\n const addImage = useCallback(() => {\n const url = window.prompt(labels.insertImageUrl);\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }, [editor, labels.insertImageUrl]);\n\n const insertTable = useCallback(() => {\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();\n }, [editor]);\n\n const insertMarkdownBlock = useCallback(() => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-markdown' },\n content: [{ type: 'text', text: '# Markdown\\n\\nWrite your **markdown** here.' }],\n }).run();\n }, [editor]);\n\n const insertMarkdownTemplate = useCallback((content: string, focusEditor = true) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n const chain = editor.chain();\n if (focusEditor) chain.focus();\n chain.insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-markdown' },\n content: [{ type: 'text', text: content }],\n }).run();\n }, [editor]);\n\n const insertFloatingDialog = useCallback((layout: 'block' | 'wrap-left' | 'wrap-right' | 'float' = 'block', focusEditor = true) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n const extraAttrs = layout === 'float'\n ? { x: 40, y: 40, zIndex: getNextFloatZIndex(editor) }\n : layout === 'block'\n ? {}\n : { width: 240 };\n const chain = editor.chain();\n if (focusEditor) chain.focus();\n chain.insertContent({\n type: 'floatingDialog',\n attrs: { title: 'Note', layout, ...extraAttrs },\n content: [{ type: 'paragraph' }],\n }).run();\n }, [editor]);\n\n const handleFormatPainter = useCallback(() => {\n if (formatPainterMarks) {\n setFormatPainterMarks(null);\n return;\n }\n if (editor.isDestroyed || !editor.isEditable) return;\n const { from, to } = editor.state.selection;\n if (from === to) return;\n\n let marks: readonly Mark[] | undefined;\n editor.state.doc.nodesBetween(from, to, (node) => {\n if (!node.isText) return;\n const formatting = node.marks.filter((mark) => PAINT_MARKS.has(mark.type.name));\n marks = marks === undefined ? formatting : marks.filter((mark) => formatting.some((other) => mark.eq(other)));\n });\n if (marks === undefined) return;\n setFormatPainterMarks(marks);\n }, [editor, formatPainterMarks]);\n\n useEffect(() => {\n if (!formatPainterMarks) return;\n if (editor.isDestroyed || !editor.isEditable || !cfg.formatPainter || !cfg.textFormat) {\n setFormatPainterMarks(null);\n return;\n }\n\n painterChange.current?.(true);\n const editorEl = editor.view.dom;\n let frame: number | null = null;\n let cancelled = false;\n const cancel = () => {\n cancelled = true;\n if (frame !== null) cancelAnimationFrame(frame);\n frame = null;\n setFormatPainterMarks(null);\n };\n const onTransaction = () => {\n if (!editor.isEditable) cancel();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') cancel();\n };\n\n const applyMarks = () => {\n frame = null;\n if (cancelled || editor.isDestroyed || !editor.isEditable) return;\n const { from, to } = editor.state.selection;\n if (from === to) return;\n\n const { tr } = editor.state;\n for (const name of PAINT_MARKS) {\n const type = editor.schema.marks[name];\n if (type) tr.removeMark(from, to, type);\n }\n editor.state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText) return;\n const semantic = node.marks.filter((mark) => !PAINT_MARKS.has(mark.type.name));\n for (const mark of formatPainterMarks) {\n // Code and custom exclusions must not implicitly remove semantic marks.\n if (semantic.some((other) => mark.type.excludes(other.type) || other.type.excludes(mark.type))) continue;\n tr.addMark(Math.max(from, pos), Math.min(to, pos + node.nodeSize), mark);\n }\n });\n cancelled = true;\n editor.view.dispatch(tr);\n setFormatPainterMarks(null);\n };\n\n const onMouseUp = () => {\n if (cancelled) return;\n if (frame !== null) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(applyMarks);\n };\n\n editorEl.addEventListener('mouseup', onMouseUp);\n editorEl.ownerDocument.addEventListener('keydown', onKeyDown);\n editor.on('transaction', onTransaction);\n editor.on('destroy', cancel);\n return () => {\n cancelled = true;\n if (frame !== null) cancelAnimationFrame(frame);\n editorEl.removeEventListener('mouseup', onMouseUp);\n editorEl.ownerDocument.removeEventListener('keydown', onKeyDown);\n editor.off('transaction', onTransaction);\n editor.off('destroy', cancel);\n painterChange.current?.(false);\n };\n }, [editor, formatPainterMarks, cfg.formatPainter, cfg.textFormat]);\n\n const currentFontFamily = editor.getAttributes('textStyle').fontFamily || '';\n const currentFontSize = editor.getAttributes('textStyle').fontSize || '';\n\n return (\n <div className=\"rte-toolbar\" role=\"group\" aria-label=\"Text formatting\">\n {(show('undo', cfg.history) || show('redo', cfg.history)) && (\n <>\n {show('undo', cfg.history) && <ToolbarButton\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title={labels.undo}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"1 4 1 10 7 10\" />\n <path d=\"M3.51 15a9 9 0 102.13-9.36L1 10\" />\n </svg>\n </ToolbarButton>}\n {show('redo', cfg.history) && <ToolbarButton\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title={labels.redo}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 11-2.13-9.36L23 10\" />\n </svg>\n </ToolbarButton>}\n <ToolbarDivider />\n </>\n )}\n\n {(show('fontFamily', cfg.fontStyle) || show('fontSize', cfg.fontStyle)) && (\n <>\n {show('fontFamily', cfg.fontStyle) && <SelectDropdown\n value={currentFontFamily}\n options={FONT_FAMILIES}\n onChange={(val) => {\n if (val) {\n editor.chain().focus().setFontFamily(val).run();\n } else {\n editor.chain().focus().unsetFontFamily().run();\n }\n }}\n title={labels.fontFamily}\n width={120}\n />}\n {show('fontSize', cfg.fontStyle) && <SelectDropdown\n value={currentFontSize}\n options={FONT_SIZES}\n onChange={(val) => {\n if (val) {\n (editor.chain().focus() as any).setFontSize(val).run();\n } else {\n (editor.chain().focus() as any).unsetFontSize().run();\n }\n }}\n title={labels.fontSize}\n width={80}\n />}\n <ToolbarDivider />\n </>\n )}\n\n {(['bold', 'italic', 'underline', 'strikethrough', 'subscript', 'superscript', 'formatPainter'] as const).some((button) => show(button, button === 'formatPainter' ? cfg.formatPainter : cfg.textFormat)) && (\n <>\n {show('bold', cfg.textFormat) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n isActive={editor.isActive('bold')}\n title={labels.bold}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 4h8a4 4 0 014 4 4 4 0 01-4 4H6z\" />\n <path d=\"M6 12h9a4 4 0 014 4 4 4 0 01-4 4H6z\" />\n </svg>\n </ToolbarButton>}\n {show('italic', cfg.textFormat) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n isActive={editor.isActive('italic')}\n title={labels.italic}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n <line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n <line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n </svg>\n </ToolbarButton>}\n {show('underline', cfg.textFormat) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n isActive={editor.isActive('underline')}\n title={labels.underline}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 3v7a6 6 0 006 6 6 6 0 006-6V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </svg>\n </ToolbarButton>}\n {show('strikethrough', cfg.textFormat) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n isActive={editor.isActive('strike')}\n title={labels.strikethrough}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.3 4.9c-2.3-.6-4.4-1-6.2-.9-2.7 0-5.3.7-5.3 3.6 0 1.5 1.8 3.3 7.2 3.3\" />\n <path d=\"M13 15.1c0 2.8-2.6 3.6-5.3 3.6-1.8-.1-3.9-.5-6.2-.9\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n </ToolbarButton>}\n {show('subscript', cfg.textFormat) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n isActive={editor.isActive('subscript')}\n title={labels.subscript}\n >\n <span style={{ fontSize: '13px', fontWeight: 600 }}>X<sub style={{ fontSize: '9px' }}>2</sub></span>\n </ToolbarButton>}\n {show('superscript', cfg.textFormat) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n isActive={editor.isActive('superscript')}\n title={labels.superscript}\n >\n <span style={{ fontSize: '13px', fontWeight: 600 }}>X<sup style={{ fontSize: '9px' }}>2</sup></span>\n </ToolbarButton>}\n {show('formatPainter', cfg.formatPainter) && (\n <ToolbarButton\n onClick={handleFormatPainter}\n disabled={!editor.isEditable || (!formatPainterMarks && editor.state.selection.empty)}\n isActive={!!formatPainterMarks}\n title={formatPainterMarks ? labels.formatPainterActive : labels.formatPainter}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 3H5a2 2 0 00-2 2v2a2 2 0 002 2h14a2 2 0 002-2V5a2 2 0 00-2-2z\" />\n <path d=\"M10 7v4a2 2 0 01-2 2H7\" />\n <path d=\"M7 13l-3 8\" />\n <path d=\"M4 21h6\" />\n </svg>\n </ToolbarButton>\n )}\n <ToolbarDivider />\n </>\n )}\n\n {([1, 2, 3, 4, 5, 6] as const).some((level) => show(`heading${level}` as keyof ToolbarButtonConfig, cfg.heading)) && (\n <>\n {([1, 2, 3, 4, 5, 6] as const).filter((level) => show(`heading${level}` as keyof ToolbarButtonConfig, cfg.heading)).map((level) => (\n <ToolbarButton\n key={level}\n onClick={() => editor.chain().focus().toggleHeading({ level }).run()}\n isActive={editor.isActive('heading', { level })}\n title={`${labels.heading} ${level}`}\n >\n <span style={{ fontSize: '12px', fontWeight: 700 }}>H{level}</span>\n </ToolbarButton>\n ))}\n <ToolbarDivider />\n </>\n )}\n\n {(['alignLeft', 'alignCenter', 'alignRight', 'alignJustify'] as const).some((button) => show(button, cfg.alignment)) && (\n <>\n {show('alignLeft', cfg.alignment) && <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n isActive={editor.isActive({ textAlign: 'left' })}\n title={labels.alignLeft}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"17\" y1=\"10\" x2=\"3\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\" />\n </svg>\n </ToolbarButton>}\n {show('alignCenter', cfg.alignment) && <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n isActive={editor.isActive({ textAlign: 'center' })}\n title={labels.alignCenter}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"10\" x2=\"6\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"18\" y1=\"18\" x2=\"6\" y2=\"18\" />\n </svg>\n </ToolbarButton>}\n {show('alignRight', cfg.alignment) && <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n isActive={editor.isActive({ textAlign: 'right' })}\n title={labels.alignRight}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"21\" y1=\"10\" x2=\"7\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\" />\n </svg>\n </ToolbarButton>}\n {show('alignJustify', cfg.alignment) && <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('justify').run()}\n isActive={editor.isActive({ textAlign: 'justify' })}\n title={labels.alignJustify}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"21\" y1=\"10\" x2=\"3\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\" />\n </svg>\n </ToolbarButton>}\n <ToolbarDivider />\n </>\n )}\n\n {(['bulletList', 'orderedList', 'taskList'] as const).some((button) => show(button, cfg.list)) && (\n <>\n {show('bulletList', cfg.list) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n isActive={editor.isActive('bulletList')}\n title={labels.bulletList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <circle cx=\"4\" cy=\"6\" r=\"1\" fill=\"currentColor\" /><circle cx=\"4\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"4\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </ToolbarButton>}\n {show('orderedList', cfg.list) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n isActive={editor.isActive('orderedList')}\n title={labels.orderedList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <text x=\"2\" y=\"8\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">1</text>\n <text x=\"2\" y=\"14\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">2</text>\n <text x=\"2\" y=\"20\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">3</text>\n </svg>\n </ToolbarButton>}\n {show('taskList', cfg.list) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleTaskList().run()}\n isActive={editor.isActive('taskList')}\n title={labels.taskList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" /><path d=\"M5 8l1.5 1.5L9 6.5\" />\n <line x1=\"12\" y1=\"8\" x2=\"21\" y2=\"8\" />\n <rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" />\n <line x1=\"12\" y1=\"17\" x2=\"21\" y2=\"17\" />\n </svg>\n </ToolbarButton>}\n <ToolbarDivider />\n </>\n )}\n\n {(['blockquote', 'codeBlock', 'mermaidBlock', 'link', 'image', 'table', 'tableOps', 'horizontalRule', 'markdownBlock', 'markdownTemplates', 'floatingDialog'] as const).some((button) => show(button, button === 'tableOps' ? cfg.tableOps : cfg.insert)) && (\n <>\n {show('blockquote', cfg.insert) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n isActive={editor.isActive('blockquote')}\n title={labels.blockquote}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V21z\" />\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3z\" />\n </svg>\n </ToolbarButton>}\n {show('codeBlock', cfg.insert) && <ToolbarButton\n onClick={() => editor.chain().focus().toggleNode('codeBlock', 'paragraph').run()}\n isActive={editor.isActive('codeBlock')}\n title={labels.codeBlock}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\" /><polyline points=\"8 6 2 12 8 18\" />\n </svg>\n </ToolbarButton>}\n {show('mermaidBlock', cfg.insert) && <ToolbarButton\n onClick={() => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-mermaid' },\n content: [{ type: 'text', text: 'graph TD\\n A[Start] --> B[End]' }],\n }).run();\n }}\n title={labels.mermaidBlock}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"6\" cy=\"6\" r=\"3\" /><circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"12\" cy=\"18\" r=\"3\" />\n <line x1=\"6\" y1=\"9\" x2=\"12\" y2=\"15\" /><line x1=\"18\" y1=\"9\" x2=\"12\" y2=\"15\" />\n </svg>\n </ToolbarButton>}\n {show('link', cfg.insert) && <ToolbarButton onClick={setLink} isActive={editor.isActive('link')} title={labels.link}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71\" />\n </svg>\n </ToolbarButton>}\n {show('image', cfg.insert) && <ToolbarButton onClick={addImage} title={labels.image}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" /><polyline points=\"21 15 16 10 5 21\" />\n </svg>\n </ToolbarButton>}\n {show('table', cfg.insert) && <ToolbarButton onClick={insertTable} title={labels.table}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" /><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" /><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" />\n </svg>\n </ToolbarButton>}\n {show('tableOps', cfg.tableOps) && <TableOpsMenu editor={editor} labels={labels} />}\n {show('horizontalRule', cfg.insert) && <ToolbarButton\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title={labels.horizontalRule}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n </svg>\n </ToolbarButton>}\n {show('markdownBlock', cfg.insert) && <ToolbarButton onClick={insertMarkdownBlock} title={labels.markdownBlock}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2 3h20v18H2z\" />\n <path d=\"M5 15V9l3 3.5L11 9v6\" />\n <path d=\"M17 9l-2.5 3H17v3\" />\n </svg>\n </ToolbarButton>}\n {show('markdownTemplates', cfg.insert) && <MarkdownTemplateMenu labels={labels} onSelect={insertMarkdownTemplate} />}\n {show('floatingDialog', cfg.insert) && <FloatingDialogMenu labels={labels} onInsert={insertFloatingDialog} />}\n <ToolbarDivider />\n </>\n )}\n\n {(['textColor', 'highlight'] as const).some((button) => show(button, cfg.color)) && (\n <>\n {show('textColor', cfg.color) && <ColorPicker\n value={editor.getAttributes('textStyle').color || ''}\n onChange={(color) => {\n if (color) {\n editor.chain().focus().setColor(color).run();\n } else {\n editor.chain().focus().unsetColor().run();\n }\n }}\n title={labels.color}\n kind=\"text\"\n />}\n {show('highlight', cfg.color) && <ColorPicker\n value={editor.getAttributes('highlight').color || ''}\n onChange={(color) => {\n if (color) {\n editor.chain().focus().toggleHighlight({ color }).run();\n } else {\n editor.chain().focus().unsetHighlight().run();\n }\n }}\n title={labels.highlight}\n kind=\"highlight\"\n />}\n <ToolbarDivider />\n </>\n )}\n\n {show('ai', cfg.ai) && onAIClick && (\n <ToolbarButton\n onClick={hasAI ? onAIClick : (onRequestAIConfig || (() => {}))}\n disabled={!hasAI && !onRequestAIConfig}\n title={hasAI ? labels.ai : (onRequestAIConfig ? labels.aiConfigure : labels.aiNotConfigured)}\n className={`rte-toolbar__ai-btn ${!hasAI ? 'rte-toolbar__ai-btn--unconfigured' : ''}`}\n >\n <svg className=\"rte-toolbar__ai-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 2.75l1.14 4.11a5.5 5.5 0 003.82 3.82L21.25 12l-4.29 1.32a5.5 5.5 0 00-3.82 3.82L12 21.25l-1.14-4.11a5.5 5.5 0 00-3.82-3.82L2.75 12l4.29-1.32a5.5 5.5 0 003.82-3.82L12 2.75z\" fill=\"currentColor\" />\n <path d=\"M19 2.75l.42 1.52a2 2 0 001.31 1.31l1.52.42-1.52.42a2 2 0 00-1.31 1.31L19 9.25l-.42-1.52a2 2 0 00-1.31-1.31L15.75 6l1.52-.42a2 2 0 001.31-1.31L19 2.75z\" fill=\"currentColor\" opacity=\".68\" />\n </svg>\n <span className=\"rte-toolbar__ai-label\">AI</span>\n {!hasAI && onRequestAIConfig && <span className=\"rte-toolbar__ai-configure\">{labels.aiConfigure}</span>}\n </ToolbarButton>\n )}\n\n {children}\n </div>\n );\n};\n\nexport default Toolbar;\n"],"mappings":"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"}
@@ -5,6 +5,7 @@ interface ToolbarButtonProps {
5
5
  isActive?: boolean;
6
6
  disabled?: boolean;
7
7
  title?: string;
8
+ className?: string;
8
9
  children: React.ReactNode;
9
10
  }
10
11
  export declare const ToolbarButton: React.FC<ToolbarButtonProps>;
@@ -1,13 +1,13 @@
1
1
  import "react";
2
2
  import { jsx as e } from "react/jsx-runtime";
3
3
  //#region src/components/pro/RichTextEditor/Toolbar/ToolbarButton.tsx
4
- var t = () => /* @__PURE__ */ e("div", { className: "rte-toolbar__divider" }), n = ({ onClick: t, isActive: n, disabled: r, title: i, children: a }) => /* @__PURE__ */ e("button", {
4
+ var t = () => /* @__PURE__ */ e("div", { className: "rte-toolbar__divider" }), n = ({ onClick: t, isActive: n, disabled: r, title: i, className: a, children: o }) => /* @__PURE__ */ e("button", {
5
5
  type: "button",
6
- className: `rte-toolbar__btn ${n ? "rte-toolbar__btn--active" : ""}`,
6
+ className: `rte-toolbar__btn ${n ? "rte-toolbar__btn--active" : ""} ${a || ""}`,
7
7
  onClick: t,
8
8
  disabled: r,
9
9
  title: i,
10
- children: a
10
+ children: o
11
11
  });
12
12
  //#endregion
13
13
  export { n as ToolbarButton, t as ToolbarDivider };
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButton.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/ToolbarButton.tsx"],"sourcesContent":["import React from 'react';\n\nexport const ToolbarDivider: React.FC = () => <div className=\"rte-toolbar__divider\" />;\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n isActive?: boolean;\n disabled?: boolean;\n title?: string;\n children: React.ReactNode;\n}\n\nexport const ToolbarButton: React.FC<ToolbarButtonProps> = ({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}) => (\n <button\n type=\"button\"\n className={`rte-toolbar__btn ${isActive ? 'rte-toolbar__btn--active' : ''}`}\n onClick={onClick}\n disabled={disabled}\n title={title}\n >\n {children}\n </button>\n);\n"],"mappings":";;;AAEA,IAAa,UAAiC,kBAAC,OAAD,EAAK,WAAU,uBAAwB,CAAA,GAUxE,KAA+C,EAC1D,YACA,aACA,aACA,UACA,kBAEA,kBAAC,UAAD;CACE,MAAK;CACL,WAAW,oBAAoB,IAAW,6BAA6B;CAC9D;CACC;CACH;CAEN;AACK,CAAA"}
1
+ {"version":3,"file":"ToolbarButton.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/ToolbarButton.tsx"],"sourcesContent":["import React from 'react';\n\nexport const ToolbarDivider: React.FC = () => <div className=\"rte-toolbar__divider\" />;\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n isActive?: boolean;\n disabled?: boolean;\n title?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const ToolbarButton: React.FC<ToolbarButtonProps> = ({\n onClick,\n isActive,\n disabled,\n title,\n className,\n children,\n}) => (\n <button\n type=\"button\"\n className={`rte-toolbar__btn ${isActive ? 'rte-toolbar__btn--active' : ''} ${className || ''}`}\n onClick={onClick}\n disabled={disabled}\n title={title}\n >\n {children}\n </button>\n);\n"],"mappings":";;;AAEA,IAAa,UAAiC,kBAAC,OAAD,EAAK,WAAU,uBAAwB,CAAA,GAWxE,KAA+C,EAC1D,YACA,aACA,aACA,UACA,cACA,kBAEA,kBAAC,UAAD;CACE,MAAK;CACL,WAAW,oBAAoB,IAAW,6BAA6B,GAAG,GAAG,KAAa;CACjF;CACC;CACH;CAEN;AACK,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { type CSSProperties, type RefObject } from 'react';
2
+ /** Positions a toolbar dropdown inside the viewport and flips it above when needed. */
3
+ export declare function useAnchoredDropdown(open: boolean, anchorRef: RefObject<HTMLElement | null>, dropdownRef: RefObject<HTMLElement | null>): CSSProperties;
@@ -0,0 +1,31 @@
1
+ import { useCallback as e, useLayoutEffect as t, useState as n } from "react";
2
+ //#region src/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.ts
3
+ var r = 8, i = 6;
4
+ function a(a, o, s) {
5
+ let [c, l] = n({}), u = e(() => {
6
+ let e = o.current, t = s.current;
7
+ if (!a || !e || !t) return;
8
+ let n = e.getBoundingClientRect(), c = t.scrollWidth || t.offsetWidth, u = Math.min(c, window.innerWidth - 16), d = Math.min(t.scrollHeight, window.innerHeight - 16), f = Math.max(r, Math.min(n.left, window.innerWidth - u - r)), p = window.innerHeight - n.bottom - r, m = n.top - r, h = p < Math.min(d, 240) && m > p, g = Math.max(80, h ? m : p), _ = h ? Math.max(r, n.top - Math.min(d, g) - i) : n.bottom + i;
9
+ l({
10
+ position: "fixed",
11
+ left: f,
12
+ top: _,
13
+ width: u,
14
+ maxWidth: "calc(100vw - 16px)",
15
+ maxHeight: Math.min(d, g)
16
+ });
17
+ }, [
18
+ a,
19
+ o,
20
+ s
21
+ ]);
22
+ return t(() => {
23
+ if (a) return u(), window.addEventListener("resize", u), window.addEventListener("scroll", u, !0), () => {
24
+ window.removeEventListener("resize", u), window.removeEventListener("scroll", u, !0);
25
+ };
26
+ }, [a, u]), c;
27
+ }
28
+ //#endregion
29
+ export { a as useAnchoredDropdown };
30
+
31
+ //# sourceMappingURL=useAnchoredDropdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnchoredDropdown.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, useState, type CSSProperties, type RefObject } from 'react';\n\nconst VIEWPORT_GAP = 8;\nconst DROPDOWN_GAP = 6;\n\n/** Positions a toolbar dropdown inside the viewport and flips it above when needed. */\nexport function useAnchoredDropdown(\n open: boolean,\n anchorRef: RefObject<HTMLElement | null>,\n dropdownRef: RefObject<HTMLElement | null>,\n): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({});\n\n const place = useCallback(() => {\n const anchor = anchorRef.current;\n const dropdown = dropdownRef.current;\n if (!open || !anchor || !dropdown) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n const naturalWidth = dropdown.scrollWidth || dropdown.offsetWidth;\n const width = Math.min(naturalWidth, window.innerWidth - VIEWPORT_GAP * 2);\n const height = Math.min(dropdown.scrollHeight, window.innerHeight - VIEWPORT_GAP * 2);\n const left = Math.max(\n VIEWPORT_GAP,\n Math.min(anchorRect.left, window.innerWidth - width - VIEWPORT_GAP),\n );\n const roomBelow = window.innerHeight - anchorRect.bottom - VIEWPORT_GAP;\n const roomAbove = anchorRect.top - VIEWPORT_GAP;\n const placeAbove = roomBelow < Math.min(height, 240) && roomAbove > roomBelow;\n const availableHeight = Math.max(80, placeAbove ? roomAbove : roomBelow);\n const top = placeAbove\n ? Math.max(VIEWPORT_GAP, anchorRect.top - Math.min(height, availableHeight) - DROPDOWN_GAP)\n : anchorRect.bottom + DROPDOWN_GAP;\n\n setStyle({\n position: 'fixed',\n left,\n top,\n width,\n maxWidth: `calc(100vw - ${VIEWPORT_GAP * 2}px)`,\n maxHeight: Math.min(height, availableHeight),\n });\n }, [open, anchorRef, dropdownRef]);\n\n useLayoutEffect(() => {\n if (!open) return;\n place();\n window.addEventListener('resize', place);\n window.addEventListener('scroll', place, true);\n return () => {\n window.removeEventListener('resize', place);\n window.removeEventListener('scroll', place, true);\n };\n }, [open, place]);\n\n return style;\n}\n"],"mappings":";;AAEA,IAAM,IAAe,GACf,IAAe;AAGrB,SAAgB,EACd,GACA,GACA,GACe;CACf,IAAM,CAAC,GAAO,KAAY,EAAwB,CAAC,CAAC,GAE9C,IAAQ,QAAkB;EAC9B,IAAM,IAAS,EAAU,SACnB,IAAW,EAAY;EAC7B,IAAI,CAAC,KAAQ,CAAC,KAAU,CAAC,GAAU;EAEnC,IAAM,IAAa,EAAO,sBAAsB,GAC1C,IAAe,EAAS,eAAe,EAAS,aAChD,IAAQ,KAAK,IAAI,GAAc,OAAO,aAAa,EAAgB,GACnE,IAAS,KAAK,IAAI,EAAS,cAAc,OAAO,cAAc,EAAgB,GAC9E,IAAO,KAAK,IAChB,GACA,KAAK,IAAI,EAAW,MAAM,OAAO,aAAa,IAAQ,CAAY,CACpE,GACM,IAAY,OAAO,cAAc,EAAW,SAAS,GACrD,IAAY,EAAW,MAAM,GAC7B,IAAa,IAAY,KAAK,IAAI,GAAQ,GAAG,KAAK,IAAY,GAC9D,IAAkB,KAAK,IAAI,IAAI,IAAa,IAAY,CAAS,GACjE,IAAM,IACR,KAAK,IAAI,GAAc,EAAW,MAAM,KAAK,IAAI,GAAQ,CAAe,IAAI,CAAY,IACxF,EAAW,SAAS;EAExB,EAAS;GACP,UAAU;GACV;GACA;GACA;GACA,UAAU;GACV,WAAW,KAAK,IAAI,GAAQ,CAAe;EAC7C,CAAC;CACH,GAAG;EAAC;EAAM;EAAW;CAAW,CAAC;CAajC,OAXA,QAAsB;EACf,OAIL,OAHA,EAAM,GACN,OAAO,iBAAiB,UAAU,CAAK,GACvC,OAAO,iBAAiB,UAAU,GAAO,EAAI,SAChC;GAEX,AADA,OAAO,oBAAoB,UAAU,CAAK,GAC1C,OAAO,oBAAoB,UAAU,GAAO,EAAI;EAClD;CACF,GAAG,CAAC,GAAM,CAAK,CAAC,GAET;AACT"}
@@ -14,7 +14,7 @@ export { ResizableImage } from './extensions/ResizableImage';
14
14
  export { FloatingDialogExtension, getNextFloatZIndex } from './extensions/FloatingDialog';
15
15
  export { CommentMark } from './extensions/CommentMark';
16
16
  export { default as RichTextToolbar } from './Toolbar';
17
- export type { RichTextEditorProps, AIConfig, AIAction, ToolbarSection, RichTextEditorLabels, } from './types';
17
+ export type { RichTextEditorProps, AIConfig, AIRequest, AIEditMode, AIAction, ToolbarSection, ToolbarButtonConfig, RichTextEditorLabels, } from './types';
18
18
  export type { CommentThread, CommentItem } from './extensions/CommentMark';
19
19
  export type { CommentPanelHandle } from './CommentPanel';
20
20
  export { defaultLabels as richTextDefaultLabels } from './types';
@@ -1,19 +1,73 @@
1
1
  import type { Editor } from '@tiptap/react';
2
+ export type AIEditMode = 'replace' | 'insert';
3
+ export interface AIRequest {
4
+ /** Text sent to the provider. For insert mode this is the user's prompt. */
5
+ text: string;
6
+ /** The instruction entered by the user, when provided. */
7
+ prompt: string;
8
+ /** Selected editor text. Empty when generating at the cursor. */
9
+ selectedText: string;
10
+ /** Replace a selection or insert at the captured cursor position. */
11
+ mode: AIEditMode;
12
+ action: AIAction;
13
+ systemPrompt: string;
14
+ signal: AbortSignal;
15
+ }
2
16
  export interface AIConfig {
3
- gateway: string;
17
+ /** Required by built-in OpenAI and Anthropic protocols. */
18
+ gateway?: string;
4
19
  protocol: 'openai' | 'anthropic' | 'custom';
5
- model: string;
20
+ /** Required by built-in OpenAI and Anthropic protocols. */
21
+ model?: string;
6
22
  apiKey?: string;
7
23
  headers?: Record<string, string>;
24
+ /** Base system instruction applied to every AI edit request. */
8
25
  systemPrompt?: string;
9
- /** Custom fetch handler for 'custom' protocol */
10
- customHandler?: (params: {
11
- text: string;
12
- action: AIAction;
13
- signal: AbortSignal;
14
- }) => AsyncIterable<string>;
26
+ /** Custom handler; useful for keeping provider credentials outside the browser. */
27
+ customHandler?: (params: AIRequest) => AsyncIterable<string>;
15
28
  }
16
29
  export type AIAction = 'rewrite' | 'shorten' | 'expand' | 'fix_grammar' | 'translate_en' | 'translate_zh' | 'professional' | 'casual';
30
+ export interface ToolbarButtonConfig {
31
+ undo?: boolean;
32
+ redo?: boolean;
33
+ fontFamily?: boolean;
34
+ fontSize?: boolean;
35
+ bold?: boolean;
36
+ italic?: boolean;
37
+ underline?: boolean;
38
+ strikethrough?: boolean;
39
+ subscript?: boolean;
40
+ superscript?: boolean;
41
+ formatPainter?: boolean;
42
+ heading1?: boolean;
43
+ heading2?: boolean;
44
+ heading3?: boolean;
45
+ heading4?: boolean;
46
+ heading5?: boolean;
47
+ heading6?: boolean;
48
+ alignLeft?: boolean;
49
+ alignCenter?: boolean;
50
+ alignRight?: boolean;
51
+ alignJustify?: boolean;
52
+ bulletList?: boolean;
53
+ orderedList?: boolean;
54
+ taskList?: boolean;
55
+ blockquote?: boolean;
56
+ codeBlock?: boolean;
57
+ mermaidBlock?: boolean;
58
+ link?: boolean;
59
+ image?: boolean;
60
+ table?: boolean;
61
+ tableOps?: boolean;
62
+ horizontalRule?: boolean;
63
+ markdownBlock?: boolean;
64
+ markdownTemplates?: boolean;
65
+ floatingDialog?: boolean;
66
+ textColor?: boolean;
67
+ highlight?: boolean;
68
+ ai?: boolean;
69
+ comments?: boolean;
70
+ }
17
71
  export interface ToolbarSection {
18
72
  textFormat?: boolean;
19
73
  heading?: boolean;
@@ -26,6 +80,8 @@ export interface ToolbarSection {
26
80
  tableOps?: boolean;
27
81
  fontStyle?: boolean;
28
82
  formatPainter?: boolean;
83
+ /** Fine-grained visibility overrides for every toolbar control. */
84
+ buttons?: ToolbarButtonConfig;
29
85
  }
30
86
  export interface RichTextEditorProps {
31
87
  /** Initial HTML content */
@@ -40,8 +96,10 @@ export interface RichTextEditorProps {
40
96
  placeholder?: string;
41
97
  /** Whether the editor is read-only */
42
98
  editable?: boolean;
43
- /** AI rewrite configuration */
99
+ /** AI editing configuration. May be supplied or updated by the consuming app. */
44
100
  aiConfig?: AIConfig;
101
+ /** Called when the AI button is clicked without aiConfig. Open your configuration UI here. */
102
+ onRequestAIConfig?: () => void;
45
103
  /** Toggle toolbar sections (all enabled by default) */
46
104
  toolbarConfig?: ToolbarSection;
47
105
  /** Minimum editor height */
@@ -56,8 +114,6 @@ export interface RichTextEditorProps {
56
114
  labels?: RichTextEditorLabels;
57
115
  /** Ref to access the Tiptap editor instance */
58
116
  editorRef?: React.MutableRefObject<Editor | null>;
59
- /** Enable Notion-style mode by default */
60
- notionMode?: boolean;
61
117
  /** Show comment panel by default */
62
118
  showComments?: boolean;
63
119
  /** Controlled comment threads */
@@ -104,6 +160,17 @@ export interface RichTextEditorLabels {
104
160
  aiProcessing?: string;
105
161
  aiAccept?: string;
106
162
  aiReject?: string;
163
+ aiPromptLabel?: string;
164
+ aiPromptPlaceholder?: string;
165
+ aiSelectedText?: string;
166
+ aiInsertHint?: string;
167
+ aiResult?: string;
168
+ aiGenerate?: string;
169
+ aiCancel?: string;
170
+ aiClose?: string;
171
+ aiDismiss?: string;
172
+ aiNotConfigured?: string;
173
+ aiConfigure?: string;
107
174
  markdownEditMode?: string;
108
175
  markdownPreviewMode?: string;
109
176
  insertLinkUrl?: string;
@@ -36,6 +36,17 @@ var e = {
36
36
  aiProcessing: "AI Processing...",
37
37
  aiAccept: "Accept",
38
38
  aiReject: "Reject",
39
+ aiPromptLabel: "Prompt",
40
+ aiPromptPlaceholder: "Describe what AI should write… (Ctrl+Enter to generate)",
41
+ aiSelectedText: "Selected text",
42
+ aiInsertHint: "No text selected. The result will be inserted at the cursor.",
43
+ aiResult: "Result",
44
+ aiGenerate: "Generate",
45
+ aiCancel: "Cancel",
46
+ aiClose: "Close AI assistant",
47
+ aiDismiss: "Dismiss",
48
+ aiNotConfigured: "AI is not configured",
49
+ aiConfigure: "Configure AI",
39
50
  markdownEditMode: "Edit",
40
51
  markdownPreviewMode: "Preview",
41
52
  insertLinkUrl: "Enter URL",
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/components/pro/RichTextEditor/types.ts"],"sourcesContent":["import type { Editor } from '@tiptap/react';\n\nexport interface AIConfig {\n gateway: string;\n protocol: 'openai' | 'anthropic' | 'custom';\n model: string;\n apiKey?: string;\n headers?: Record<string, string>;\n systemPrompt?: string;\n /** Custom fetch handler for 'custom' protocol */\n customHandler?: (params: {\n text: string;\n action: AIAction;\n signal: AbortSignal;\n }) => AsyncIterable<string>;\n}\n\nexport type AIAction =\n | 'rewrite'\n | 'shorten'\n | 'expand'\n | 'fix_grammar'\n | 'translate_en'\n | 'translate_zh'\n | 'professional'\n | 'casual';\n\nexport interface ToolbarSection {\n textFormat?: boolean;\n heading?: boolean;\n alignment?: boolean;\n list?: boolean;\n insert?: boolean;\n color?: boolean;\n history?: boolean;\n ai?: boolean;\n tableOps?: boolean;\n fontStyle?: boolean;\n formatPainter?: boolean;\n}\n\nexport interface RichTextEditorProps {\n /** Initial HTML content */\n content?: string;\n /** Controlled content (HTML string) */\n value?: string;\n /** Called when content changes, returns HTML */\n onChange?: (html: string) => void;\n /** Called when content changes, returns JSON */\n onChangeJSON?: (json: Record<string, unknown>) => void;\n /** Editor placeholder text */\n placeholder?: string;\n /** Whether the editor is read-only */\n editable?: boolean;\n /** AI rewrite configuration */\n aiConfig?: AIConfig;\n /** Toggle toolbar sections (all enabled by default) */\n toolbarConfig?: ToolbarSection;\n /** Minimum editor height */\n minHeight?: string | number;\n /** Maximum editor height */\n maxHeight?: string | number;\n /** Additional CSS class for the root container */\n className?: string;\n /** Whether to autofocus on mount */\n autofocus?: boolean;\n /** Labels for i18n */\n labels?: RichTextEditorLabels;\n /** Ref to access the Tiptap editor instance */\n editorRef?: React.MutableRefObject<Editor | null>;\n /** Enable Notion-style mode by default */\n notionMode?: boolean;\n /** Show comment panel by default */\n showComments?: boolean;\n /** Controlled comment threads */\n commentThreads?: import('./extensions/CommentMark').CommentThread[];\n /** Callback when comment threads change */\n onCommentThreadsChange?: (threads: import('./extensions/CommentMark').CommentThread[]) => void;\n /** Current user name for comments */\n currentUser?: string;\n}\n\nexport interface RichTextEditorLabels {\n bold?: string;\n italic?: string;\n underline?: string;\n strikethrough?: string;\n subscript?: string;\n superscript?: string;\n heading?: string;\n alignLeft?: string;\n alignCenter?: string;\n alignRight?: string;\n alignJustify?: string;\n bulletList?: string;\n orderedList?: string;\n taskList?: string;\n blockquote?: string;\n codeBlock?: string;\n link?: string;\n image?: string;\n table?: string;\n markdownBlock?: string;\n undo?: string;\n redo?: string;\n color?: string;\n highlight?: string;\n ai?: string;\n aiRewrite?: string;\n aiShorten?: string;\n aiExpand?: string;\n aiFixGrammar?: string;\n aiTranslateEn?: string;\n aiTranslateZh?: string;\n aiProfessional?: string;\n aiCasual?: string;\n aiProcessing?: string;\n aiAccept?: string;\n aiReject?: string;\n markdownEditMode?: string;\n markdownPreviewMode?: string;\n insertLinkUrl?: string;\n insertImageUrl?: string;\n horizontalRule?: string;\n tableAddColumnBefore?: string;\n tableAddColumnAfter?: string;\n tableDeleteColumn?: string;\n tableAddRowBefore?: string;\n tableAddRowAfter?: string;\n tableDeleteRow?: string;\n tableMergeCells?: string;\n tableSplitCell?: string;\n tableDelete?: string;\n tableOps?: string;\n fontFamily?: string;\n fontSize?: string;\n formatPainter?: string;\n formatPainterActive?: string;\n mermaidBlock?: string;\n mdTemplates?: string;\n mdTplFlowchart?: string;\n mdTplSequence?: string;\n mdTplPieChart?: string;\n mdTplGantt?: string;\n mdTplBarChart?: string;\n mdTplPython?: string;\n mdTplTypeScript?: string;\n mdTplRust?: string;\n mdTplMath?: string;\n mdTplMixed?: string;\n floatingDialog?: string;\n layoutBlock?: string;\n layoutWrapLeft?: string;\n layoutWrapRight?: string;\n layoutFloat?: string;\n}\n\nexport const defaultLabels: RichTextEditorLabels = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n subscript: 'Subscript',\n superscript: 'Superscript',\n heading: 'Heading',\n alignLeft: 'Align Left',\n alignCenter: 'Align Center',\n alignRight: 'Align Right',\n alignJustify: 'Justify',\n bulletList: 'Bullet List',\n orderedList: 'Ordered List',\n taskList: 'Task List',\n blockquote: 'Blockquote',\n codeBlock: 'Code Block',\n link: 'Link',\n image: 'Image',\n table: 'Table',\n markdownBlock: 'Markdown Block',\n undo: 'Undo',\n redo: 'Redo',\n color: 'Text Color',\n highlight: 'Highlight',\n ai: 'AI',\n aiRewrite: 'Rewrite',\n aiShorten: 'Shorten',\n aiExpand: 'Expand',\n aiFixGrammar: 'Fix Grammar',\n aiTranslateEn: 'Translate to English',\n aiTranslateZh: 'Translate to Chinese',\n aiProfessional: 'Professional Tone',\n aiCasual: 'Casual Tone',\n aiProcessing: 'AI Processing...',\n aiAccept: 'Accept',\n aiReject: 'Reject',\n markdownEditMode: 'Edit',\n markdownPreviewMode: 'Preview',\n insertLinkUrl: 'Enter URL',\n insertImageUrl: 'Enter image URL',\n horizontalRule: 'Horizontal Rule',\n tableAddColumnBefore: 'Add Column Before',\n tableAddColumnAfter: 'Add Column After',\n tableDeleteColumn: 'Delete Column',\n tableAddRowBefore: 'Add Row Before',\n tableAddRowAfter: 'Add Row After',\n tableDeleteRow: 'Delete Row',\n tableMergeCells: 'Merge Cells',\n tableSplitCell: 'Split Cell',\n tableDelete: 'Delete Table',\n tableOps: 'Table Operations',\n fontFamily: 'Font Family',\n fontSize: 'Font Size',\n formatPainter: 'Format Painter',\n formatPainterActive: 'Format Painter (click target)',\n mermaidBlock: 'Mermaid Diagram',\n mdTemplates: 'Markdown Templates',\n mdTplFlowchart: 'Flowchart',\n mdTplSequence: 'Sequence Diagram',\n mdTplPieChart: 'Pie Chart',\n mdTplGantt: 'Gantt Chart',\n mdTplBarChart: 'Bar Chart (xychart)',\n mdTplPython: 'Python Code',\n mdTplTypeScript: 'TypeScript Code',\n mdTplRust: 'Rust Code',\n mdTplMath: 'Math Formulas (TeX)',\n mdTplMixed: 'Mixed Example',\n floatingDialog: 'Floating Dialog',\n layoutBlock: 'Block (Full Width)',\n layoutWrapLeft: 'Wrap Left',\n layoutWrapRight: 'Wrap Right',\n layoutFloat: 'Float (Overlay)',\n};\n"],"mappings":";AA6JA,IAAa,IAAsC;CACjD,MAAM;CACN,QAAQ;CACR,WAAW;CACX,eAAe;CACf,WAAW;CACX,aAAa;CACb,SAAS;CACT,WAAW;CACX,aAAa;CACb,YAAY;CACZ,cAAc;CACd,YAAY;CACZ,aAAa;CACb,UAAU;CACV,YAAY;CACZ,WAAW;CACX,MAAM;CACN,OAAO;CACP,OAAO;CACP,eAAe;CACf,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,UAAU;CACV,cAAc;CACd,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,cAAc;CACd,UAAU;CACV,UAAU;CACV,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,gBAAgB;CAChB,gBAAgB;CAChB,sBAAsB;CACtB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,UAAU;CACV,YAAY;CACZ,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf,eAAe;CACf,YAAY;CACZ,eAAe;CACf,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;AACf"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/components/pro/RichTextEditor/types.ts"],"sourcesContent":["import type { Editor } from '@tiptap/react';\n\nexport type AIEditMode = 'replace' | 'insert';\n\nexport interface AIRequest {\n /** Text sent to the provider. For insert mode this is the user's prompt. */\n text: string;\n /** The instruction entered by the user, when provided. */\n prompt: string;\n /** Selected editor text. Empty when generating at the cursor. */\n selectedText: string;\n /** Replace a selection or insert at the captured cursor position. */\n mode: AIEditMode;\n action: AIAction;\n systemPrompt: string;\n signal: AbortSignal;\n}\n\nexport interface AIConfig {\n /** Required by built-in OpenAI and Anthropic protocols. */\n gateway?: string;\n protocol: 'openai' | 'anthropic' | 'custom';\n /** Required by built-in OpenAI and Anthropic protocols. */\n model?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n /** Base system instruction applied to every AI edit request. */\n systemPrompt?: string;\n /** Custom handler; useful for keeping provider credentials outside the browser. */\n customHandler?: (params: AIRequest) => AsyncIterable<string>;\n}\n\nexport type AIAction =\n | 'rewrite'\n | 'shorten'\n | 'expand'\n | 'fix_grammar'\n | 'translate_en'\n | 'translate_zh'\n | 'professional'\n | 'casual';\n\nexport interface ToolbarButtonConfig {\n undo?: boolean;\n redo?: boolean;\n fontFamily?: boolean;\n fontSize?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n subscript?: boolean;\n superscript?: boolean;\n formatPainter?: boolean;\n heading1?: boolean;\n heading2?: boolean;\n heading3?: boolean;\n heading4?: boolean;\n heading5?: boolean;\n heading6?: boolean;\n alignLeft?: boolean;\n alignCenter?: boolean;\n alignRight?: boolean;\n alignJustify?: boolean;\n bulletList?: boolean;\n orderedList?: boolean;\n taskList?: boolean;\n blockquote?: boolean;\n codeBlock?: boolean;\n mermaidBlock?: boolean;\n link?: boolean;\n image?: boolean;\n table?: boolean;\n tableOps?: boolean;\n horizontalRule?: boolean;\n markdownBlock?: boolean;\n markdownTemplates?: boolean;\n floatingDialog?: boolean;\n textColor?: boolean;\n highlight?: boolean;\n ai?: boolean;\n comments?: boolean;\n}\n\nexport interface ToolbarSection {\n textFormat?: boolean;\n heading?: boolean;\n alignment?: boolean;\n list?: boolean;\n insert?: boolean;\n color?: boolean;\n history?: boolean;\n ai?: boolean;\n tableOps?: boolean;\n fontStyle?: boolean;\n formatPainter?: boolean;\n /** Fine-grained visibility overrides for every toolbar control. */\n buttons?: ToolbarButtonConfig;\n}\n\nexport interface RichTextEditorProps {\n /** Initial HTML content */\n content?: string;\n /** Controlled content (HTML string) */\n value?: string;\n /** Called when content changes, returns HTML */\n onChange?: (html: string) => void;\n /** Called when content changes, returns JSON */\n onChangeJSON?: (json: Record<string, unknown>) => void;\n /** Editor placeholder text */\n placeholder?: string;\n /** Whether the editor is read-only */\n editable?: boolean;\n /** AI editing configuration. May be supplied or updated by the consuming app. */\n aiConfig?: AIConfig;\n /** Called when the AI button is clicked without aiConfig. Open your configuration UI here. */\n onRequestAIConfig?: () => void;\n /** Toggle toolbar sections (all enabled by default) */\n toolbarConfig?: ToolbarSection;\n /** Minimum editor height */\n minHeight?: string | number;\n /** Maximum editor height */\n maxHeight?: string | number;\n /** Additional CSS class for the root container */\n className?: string;\n /** Whether to autofocus on mount */\n autofocus?: boolean;\n /** Labels for i18n */\n labels?: RichTextEditorLabels;\n /** Ref to access the Tiptap editor instance */\n editorRef?: React.MutableRefObject<Editor | null>;\n /** Show comment panel by default */\n showComments?: boolean;\n /** Controlled comment threads */\n commentThreads?: import('./extensions/CommentMark').CommentThread[];\n /** Callback when comment threads change */\n onCommentThreadsChange?: (threads: import('./extensions/CommentMark').CommentThread[]) => void;\n /** Current user name for comments */\n currentUser?: string;\n}\n\nexport interface RichTextEditorLabels {\n bold?: string;\n italic?: string;\n underline?: string;\n strikethrough?: string;\n subscript?: string;\n superscript?: string;\n heading?: string;\n alignLeft?: string;\n alignCenter?: string;\n alignRight?: string;\n alignJustify?: string;\n bulletList?: string;\n orderedList?: string;\n taskList?: string;\n blockquote?: string;\n codeBlock?: string;\n link?: string;\n image?: string;\n table?: string;\n markdownBlock?: string;\n undo?: string;\n redo?: string;\n color?: string;\n highlight?: string;\n ai?: string;\n aiRewrite?: string;\n aiShorten?: string;\n aiExpand?: string;\n aiFixGrammar?: string;\n aiTranslateEn?: string;\n aiTranslateZh?: string;\n aiProfessional?: string;\n aiCasual?: string;\n aiProcessing?: string;\n aiAccept?: string;\n aiReject?: string;\n aiPromptLabel?: string;\n aiPromptPlaceholder?: string;\n aiSelectedText?: string;\n aiInsertHint?: string;\n aiResult?: string;\n aiGenerate?: string;\n aiCancel?: string;\n aiClose?: string;\n aiDismiss?: string;\n aiNotConfigured?: string;\n aiConfigure?: string;\n markdownEditMode?: string;\n markdownPreviewMode?: string;\n insertLinkUrl?: string;\n insertImageUrl?: string;\n horizontalRule?: string;\n tableAddColumnBefore?: string;\n tableAddColumnAfter?: string;\n tableDeleteColumn?: string;\n tableAddRowBefore?: string;\n tableAddRowAfter?: string;\n tableDeleteRow?: string;\n tableMergeCells?: string;\n tableSplitCell?: string;\n tableDelete?: string;\n tableOps?: string;\n fontFamily?: string;\n fontSize?: string;\n formatPainter?: string;\n formatPainterActive?: string;\n mermaidBlock?: string;\n mdTemplates?: string;\n mdTplFlowchart?: string;\n mdTplSequence?: string;\n mdTplPieChart?: string;\n mdTplGantt?: string;\n mdTplBarChart?: string;\n mdTplPython?: string;\n mdTplTypeScript?: string;\n mdTplRust?: string;\n mdTplMath?: string;\n mdTplMixed?: string;\n floatingDialog?: string;\n layoutBlock?: string;\n layoutWrapLeft?: string;\n layoutWrapRight?: string;\n layoutFloat?: string;\n}\n\nexport const defaultLabels: RichTextEditorLabels = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n subscript: 'Subscript',\n superscript: 'Superscript',\n heading: 'Heading',\n alignLeft: 'Align Left',\n alignCenter: 'Align Center',\n alignRight: 'Align Right',\n alignJustify: 'Justify',\n bulletList: 'Bullet List',\n orderedList: 'Ordered List',\n taskList: 'Task List',\n blockquote: 'Blockquote',\n codeBlock: 'Code Block',\n link: 'Link',\n image: 'Image',\n table: 'Table',\n markdownBlock: 'Markdown Block',\n undo: 'Undo',\n redo: 'Redo',\n color: 'Text Color',\n highlight: 'Highlight',\n ai: 'AI',\n aiRewrite: 'Rewrite',\n aiShorten: 'Shorten',\n aiExpand: 'Expand',\n aiFixGrammar: 'Fix Grammar',\n aiTranslateEn: 'Translate to English',\n aiTranslateZh: 'Translate to Chinese',\n aiProfessional: 'Professional Tone',\n aiCasual: 'Casual Tone',\n aiProcessing: 'AI Processing...',\n aiAccept: 'Accept',\n aiReject: 'Reject',\n aiPromptLabel: 'Prompt',\n aiPromptPlaceholder: 'Describe what AI should write… (Ctrl+Enter to generate)',\n aiSelectedText: 'Selected text',\n aiInsertHint: 'No text selected. The result will be inserted at the cursor.',\n aiResult: 'Result',\n aiGenerate: 'Generate',\n aiCancel: 'Cancel',\n aiClose: 'Close AI assistant',\n aiDismiss: 'Dismiss',\n aiNotConfigured: 'AI is not configured',\n aiConfigure: 'Configure AI',\n markdownEditMode: 'Edit',\n markdownPreviewMode: 'Preview',\n insertLinkUrl: 'Enter URL',\n insertImageUrl: 'Enter image URL',\n horizontalRule: 'Horizontal Rule',\n tableAddColumnBefore: 'Add Column Before',\n tableAddColumnAfter: 'Add Column After',\n tableDeleteColumn: 'Delete Column',\n tableAddRowBefore: 'Add Row Before',\n tableAddRowAfter: 'Add Row After',\n tableDeleteRow: 'Delete Row',\n tableMergeCells: 'Merge Cells',\n tableSplitCell: 'Split Cell',\n tableDelete: 'Delete Table',\n tableOps: 'Table Operations',\n fontFamily: 'Font Family',\n fontSize: 'Font Size',\n formatPainter: 'Format Painter',\n formatPainterActive: 'Format Painter (click target)',\n mermaidBlock: 'Mermaid Diagram',\n mdTemplates: 'Markdown Templates',\n mdTplFlowchart: 'Flowchart',\n mdTplSequence: 'Sequence Diagram',\n mdTplPieChart: 'Pie Chart',\n mdTplGantt: 'Gantt Chart',\n mdTplBarChart: 'Bar Chart (xychart)',\n mdTplPython: 'Python Code',\n mdTplTypeScript: 'TypeScript Code',\n mdTplRust: 'Rust Code',\n mdTplMath: 'Math Formulas (TeX)',\n mdTplMixed: 'Mixed Example',\n floatingDialog: 'Floating Dialog',\n layoutBlock: 'Block (Full Width)',\n layoutWrapLeft: 'Wrap Left',\n layoutWrapRight: 'Wrap Right',\n layoutFloat: 'Float (Overlay)',\n};\n"],"mappings":";AAmOA,IAAa,IAAsC;CACjD,MAAM;CACN,QAAQ;CACR,WAAW;CACX,eAAe;CACf,WAAW;CACX,aAAa;CACb,SAAS;CACT,WAAW;CACX,aAAa;CACb,YAAY;CACZ,cAAc;CACd,YAAY;CACZ,aAAa;CACb,UAAU;CACV,YAAY;CACZ,WAAW;CACX,MAAM;CACN,OAAO;CACP,OAAO;CACP,eAAe;CACf,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,UAAU;CACV,cAAc;CACd,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,cAAc;CACd,UAAU;CACV,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,gBAAgB;CAChB,cAAc;CACd,UAAU;CACV,YAAY;CACZ,UAAU;CACV,SAAS;CACT,WAAW;CACX,iBAAiB;CACjB,aAAa;CACb,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,gBAAgB;CAChB,gBAAgB;CAChB,sBAAsB;CACtB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,UAAU;CACV,YAAY;CACZ,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf,eAAe;CACf,YAAY;CACZ,eAAe;CACf,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;AACf"}