draftly 1.0.7 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +12 -0
  2. package/dist/chunk-3T55CBNZ.cjs +33 -0
  3. package/dist/chunk-3T55CBNZ.cjs.map +1 -0
  4. package/dist/chunk-5MC4T7JH.cjs +58 -0
  5. package/dist/chunk-5MC4T7JH.cjs.map +1 -0
  6. package/dist/{chunk-KBQDZ5IW.cjs → chunk-CLW73JRX.cjs} +100 -75
  7. package/dist/chunk-CLW73JRX.cjs.map +1 -0
  8. package/dist/{chunk-72ZYRGRT.cjs → chunk-EQUQHE2E.cjs} +30 -26
  9. package/dist/chunk-EQUQHE2E.cjs.map +1 -0
  10. package/dist/{chunk-HPSMS2WB.js → chunk-I563H35S.js} +101 -75
  11. package/dist/chunk-I563H35S.js.map +1 -0
  12. package/dist/chunk-IAXF4SJL.js +55 -0
  13. package/dist/chunk-IAXF4SJL.js.map +1 -0
  14. package/dist/chunk-JF3WXXMJ.js +31 -0
  15. package/dist/chunk-JF3WXXMJ.js.map +1 -0
  16. package/dist/{chunk-N3WL3XPB.js → chunk-NRPI5O6Y.js} +2603 -604
  17. package/dist/chunk-NRPI5O6Y.js.map +1 -0
  18. package/dist/{chunk-2B3A3VSQ.cjs → chunk-OMFUE4AQ.cjs} +2642 -622
  19. package/dist/chunk-OMFUE4AQ.cjs.map +1 -0
  20. package/dist/{chunk-DFQYXFOP.js → chunk-TD3L5C45.js} +28 -3
  21. package/dist/chunk-TD3L5C45.js.map +1 -0
  22. package/dist/{chunk-CG4M4TC7.js → chunk-UCHBDJ4R.js} +26 -22
  23. package/dist/chunk-UCHBDJ4R.js.map +1 -0
  24. package/dist/{chunk-KDEDLC3D.cjs → chunk-W75QUUQC.cjs} +29 -2
  25. package/dist/chunk-W75QUUQC.cjs.map +1 -0
  26. package/dist/{draftly-BLnx3uGX.d.cts → draftly-BBL-AdOl.d.cts} +5 -1
  27. package/dist/{draftly-BLnx3uGX.d.ts → draftly-BBL-AdOl.d.ts} +5 -1
  28. package/dist/editor/index.cjs +22 -14
  29. package/dist/editor/index.d.cts +2 -1
  30. package/dist/editor/index.d.ts +2 -1
  31. package/dist/editor/index.js +2 -2
  32. package/dist/index.cjs +65 -39
  33. package/dist/index.d.cts +6 -3
  34. package/dist/index.d.ts +6 -3
  35. package/dist/index.js +6 -4
  36. package/dist/lib/index.cjs +12 -0
  37. package/dist/lib/index.cjs.map +1 -0
  38. package/dist/lib/index.d.cts +16 -0
  39. package/dist/lib/index.d.ts +16 -0
  40. package/dist/lib/index.js +3 -0
  41. package/dist/lib/index.js.map +1 -0
  42. package/dist/plugins/index.cjs +27 -17
  43. package/dist/plugins/index.d.cts +180 -10
  44. package/dist/plugins/index.d.ts +180 -10
  45. package/dist/plugins/index.js +5 -3
  46. package/dist/preview/index.cjs +16 -11
  47. package/dist/preview/index.d.cts +19 -4
  48. package/dist/preview/index.d.ts +19 -4
  49. package/dist/preview/index.js +3 -2
  50. package/package.json +8 -1
  51. package/src/editor/draftly.ts +30 -27
  52. package/src/editor/plugin.ts +5 -1
  53. package/src/editor/theme.ts +1 -0
  54. package/src/editor/utils.ts +33 -0
  55. package/src/index.ts +5 -4
  56. package/src/lib/index.ts +2 -0
  57. package/src/lib/input-handler.ts +45 -0
  58. package/src/plugins/code-plugin.theme.ts +426 -0
  59. package/src/plugins/code-plugin.ts +810 -561
  60. package/src/plugins/emoji-plugin.ts +140 -0
  61. package/src/plugins/index.ts +63 -57
  62. package/src/plugins/inline-plugin.ts +305 -291
  63. package/src/plugins/math-plugin.ts +12 -0
  64. package/src/plugins/table-plugin.ts +1759 -0
  65. package/src/preview/context.ts +4 -1
  66. package/src/preview/css-generator.ts +14 -1
  67. package/src/preview/index.ts +9 -1
  68. package/src/preview/preview.ts +2 -1
  69. package/src/preview/renderer.ts +21 -20
  70. package/src/preview/syntax-theme.ts +110 -0
  71. package/src/preview/types.ts +14 -0
  72. package/dist/chunk-2B3A3VSQ.cjs.map +0 -1
  73. package/dist/chunk-72ZYRGRT.cjs.map +0 -1
  74. package/dist/chunk-CG4M4TC7.js.map +0 -1
  75. package/dist/chunk-DFQYXFOP.js.map +0 -1
  76. package/dist/chunk-HPSMS2WB.js.map +0 -1
  77. package/dist/chunk-KBQDZ5IW.cjs.map +0 -1
  78. package/dist/chunk-KDEDLC3D.cjs.map +0 -1
  79. package/dist/chunk-N3WL3XPB.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/plugins/paragraph-plugin.ts","../src/plugins/heading-plugin.ts","../src/plugins/inline-plugin.ts","../src/plugins/link-plugin.ts","../src/plugins/list-plugin.ts","../src/plugins/html-plugin.ts","../src/plugins/image-plugin.ts","../src/plugins/math-plugin.ts","../src/plugins/mermaid-plugin.ts","../src/plugins/code-plugin.ts","../src/plugins/quote-plugin.ts","../src/plugins/hr-plugin.ts","../src/plugins/index.ts"],"names":["theme","Decoration","syntaxTree","WidgetType","tags","classes"],"mappings":"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","file":"chunk-N3WL3XPB.js","sourcesContent":["import { SyntaxNode } from \"@lezer/common\";\r\nimport { DraftlyPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\n\r\n/**\r\n * ParagraphPlugin - Adds top and bottom padding to paragraphs in preview\r\n *\r\n * Applies visual spacing to markdown paragraphs for better readability\r\n */\r\nexport class ParagraphPlugin extends DraftlyPlugin {\r\n readonly name = \"paragraph\";\r\n readonly version = \"1.0.0\";\r\n override readonly requiredNodes = [\"Paragraph\"] as const;\r\n\r\n /**\r\n * Plugin theme for preview styling\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n override renderToHTML(node: SyntaxNode, children: string): string | null {\r\n if (node.name !== \"Paragraph\") {\r\n return null;\r\n }\r\n\r\n return `<p class=\"cm-draftly-paragraph\">${children}</p>`;\r\n }\r\n}\r\n\r\nconst theme = createTheme({\r\n default: {\r\n \".cm-draftly-paragraph\": {\r\n paddingTop: \"0.5em\",\r\n paddingBottom: \"0.5em\",\r\n },\r\n },\r\n});\r\n","import { Decoration } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\n\n/**\n * Node types for ATX headings in markdown\n */\nconst HEADING_TYPES = [\"ATXHeading1\", \"ATXHeading2\", \"ATXHeading3\", \"ATXHeading4\", \"ATXHeading5\", \"ATXHeading6\"];\n\n/**\n * Mark decorations for heading content\n */\nconst headingMarkDecorations = {\n \"heading-1\": Decoration.mark({ class: \"cm-draftly-h1\" }),\n \"heading-2\": Decoration.mark({ class: \"cm-draftly-h2\" }),\n \"heading-3\": Decoration.mark({ class: \"cm-draftly-h3\" }),\n \"heading-4\": Decoration.mark({ class: \"cm-draftly-h4\" }),\n \"heading-5\": Decoration.mark({ class: \"cm-draftly-h5\" }),\n \"heading-6\": Decoration.mark({ class: \"cm-draftly-h6\" }),\n \"header-mark-class\": Decoration.mark({ class: \"cm-draftly-header-mark\" }),\n \"heading-mark\": Decoration.replace({}),\n};\n\n/**\n * Line decorations for heading lines\n */\nconst headingLineDecorations = {\n \"heading-1\": Decoration.line({ class: \"cm-draftly-line-h1\" }),\n \"heading-2\": Decoration.line({ class: \"cm-draftly-line-h2\" }),\n \"heading-3\": Decoration.line({ class: \"cm-draftly-line-h3\" }),\n \"heading-4\": Decoration.line({ class: \"cm-draftly-line-h4\" }),\n \"heading-5\": Decoration.line({ class: \"cm-draftly-line-h5\" }),\n \"heading-6\": Decoration.line({ class: \"cm-draftly-line-h6\" }),\n};\n\n/**\n * HeadingPlugin - Decorates markdown headings\n *\n * Adds visual styling to ATX headings (# through ######)\n * - Line decorations for the entire heading line\n * - Mark decorations for heading content\n * - Hides # markers when cursor is not in the heading\n */\nexport class HeadingPlugin extends DecorationPlugin {\n readonly name = \"heading\";\n readonly version = \"1.0.0\";\n override decorationPriority = 10;\n override readonly requiredNodes = [\n \"ATXHeading1\",\n \"ATXHeading2\",\n \"ATXHeading3\",\n \"ATXHeading4\",\n \"ATXHeading5\",\n \"ATXHeading6\",\n \"HeaderMark\",\n ] as const;\n\n /**\n * Constructor - calls super constructor\n */\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Build heading decorations by iterating the syntax tree\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n if (!HEADING_TYPES.includes(name)) {\n return;\n }\n\n const level = parseInt(name.slice(-1), 10);\n const headingClass = `heading-${level}` as keyof typeof headingMarkDecorations;\n const lineClass = `heading-${level}` as keyof typeof headingLineDecorations;\n\n // Add line decoration\n const line = view.state.doc.lineAt(from);\n decorations.push(headingLineDecorations[lineClass].range(line.from));\n\n // Add mark decoration for the heading content\n decorations.push(headingMarkDecorations[headingClass].range(from, to));\n\n // Find and style the heading marker (#)\n // Only hide when cursor is not in the heading\n const headingMark = node.node.getChild(\"HeaderMark\");\n if (headingMark) {\n const markEnd = Math.min(headingMark.to + 1, line.to);\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\n if (!cursorInNode) {\n // Clamp to line end so replace decoration never spans a newline\n decorations.push(headingMarkDecorations[\"heading-mark\"].range(headingMark.from, markEnd));\n } else {\n decorations.push(headingMarkDecorations[\"header-mark-class\"].range(headingMark.from, markEnd));\n }\n }\n },\n });\n }\n\n override renderToHTML(node: SyntaxNode, children: string): string | null {\n if (node.name === \"HeaderMark\") {\n return \"\";\n }\n\n if (!HEADING_TYPES.includes(node.name)) {\n return null;\n }\n\n const level = parseInt(node.name.slice(-1), 10);\n const lineClass = headingLineDecorations[`heading-${level}` as keyof typeof headingLineDecorations].spec.class;\n const headingClass = headingMarkDecorations[`heading-${level}` as keyof typeof headingMarkDecorations].spec.class;\n\n return `<div class=\"${lineClass}\">\n <h${level} class=\"${headingClass}\">${children}</h${level}>\n </div>\\n`;\n }\n}\n\nconst theme = createTheme({\n default: {\n \".cm-draftly-h1\": {\n fontSize: \"2em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h2\": {\n fontSize: \"1.75em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h3\": {\n fontSize: \"1.5em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h4\": {\n fontSize: \"1.25em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h5\": {\n fontSize: \"1em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h6\": {\n fontSize: \"0.75em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n // Heading line styles\n \".cm-draftly-line-h1\": {\n paddingTop: \"1.5em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-draftly-line-h2\": {\n paddingTop: \"1.25em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-draftly-line-h3, .cm-draftly-line-h4, .cm-draftly-line-h5, .cm-draftly-line-h6\": {\n paddingTop: \"1em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-draftly-header-mark\": {\n opacity: 0.5,\n },\n },\n});\n","import { Decoration, KeyBinding } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { toggleMarkdownStyle } from \"../editor/utils\";\nimport { tags } from \"@lezer/highlight\";\nimport type { MarkdownConfig, InlineParser } from \"@lezer/markdown\";\n\n/**\n * Node types for inline styling in markdown\n */\nconst INLINE_TYPES = {\n Emphasis: \"emphasis\",\n StrongEmphasis: \"strong\",\n Strikethrough: \"strikethrough\",\n Subscript: \"subscript\",\n Superscript: \"superscript\",\n Highlight: \"highlight\",\n} as const;\n\n/**\n * Mark decorations for inline content\n */\nconst inlineMarkDecorations = {\n emphasis: Decoration.mark({ class: \"cm-draftly-emphasis\" }),\n strong: Decoration.mark({ class: \"cm-draftly-strong\" }),\n strikethrough: Decoration.mark({ class: \"cm-draftly-strikethrough\" }),\n subscript: Decoration.mark({ class: \"cm-draftly-subscript\" }),\n superscript: Decoration.mark({ class: \"cm-draftly-superscript\" }),\n highlight: Decoration.mark({ class: \"cm-draftly-highlight\" }),\n // Markers (* _ ~~ ^ ~ ==)\n \"inline-mark\": Decoration.replace({}),\n};\n\n// Character code for '='\nconst EQUALS = 61;\n\n// Punctuation regex for flanking checks (matches Unicode punctuation)\n// eslint-disable-next-line no-useless-escape\nlet Punctuation = /[!\"#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\u2010-\\u2027]/;\ntry {\n Punctuation = new RegExp(\"[\\\\p{S}|\\\\p{P}]\", \"u\");\n} catch {\n // Fallback regex is used above for environments without Unicode support\n}\n\n// Delimiter type for highlight markers — enables nested inline parsing\nconst HighlightDelim = { resolve: \"Highlight\", mark: \"HighlightMark\" };\n\n/**\n * Inline parser for highlight syntax: ==text==\n * Uses addDelimiter (like Strikethrough) so nested inline styles work.\n */\nconst highlightParser: InlineParser = {\n name: \"Highlight\",\n parse(cx, next, pos) {\n // Must start with ==\n if (next !== EQUALS || cx.char(pos + 1) !== EQUALS) return -1;\n // Don't match === (or more)\n if (cx.char(pos + 2) === EQUALS) return -1;\n\n // Flanking checks (same logic as Strikethrough)\n const before = cx.slice(pos - 1, pos);\n const after = cx.slice(pos + 2, pos + 3);\n const sBefore = /\\s|^$/.test(before),\n sAfter = /\\s|^$/.test(after);\n const pBefore = Punctuation.test(before),\n pAfter = Punctuation.test(after);\n\n return cx.addDelimiter(\n HighlightDelim,\n pos,\n pos + 2,\n !sAfter && (!pAfter || sBefore || pBefore),\n !sBefore && (!pBefore || sAfter || pAfter)\n );\n },\n};\n\n/**\n * InlinePlugin - Decorates inline markdown formatting\n *\n * Adds visual styling to inline elements:\n * - Emphasis (italic) - *text* or _text_\n * - Strong (bold) - **text** or __text__\n * - Strikethrough - ~~text~~\n * - Subscript - ~text~\n * - Superscript - ^text^\n * - Highlight - ==text==\n *\n * Hides formatting markers when cursor is not in the element\n */\nexport class InlinePlugin extends DecorationPlugin {\n readonly name = \"inline\";\n readonly version = \"1.0.0\";\n override decorationPriority = 20;\n override readonly requiredNodes = [\n \"Emphasis\",\n \"StrongEmphasis\",\n \"Strikethrough\",\n \"Subscript\",\n \"Superscript\",\n \"Highlight\",\n \"EmphasisMark\",\n \"StrikethroughMark\",\n \"SubscriptMark\",\n \"SuperscriptMark\",\n \"HighlightMark\",\n ] as const;\n marks: string[] = [];\n\n constructor() {\n super();\n\n for (const mark of Object.keys(INLINE_TYPES)) {\n this.marks.push(...this.getMarkerNames(mark));\n }\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Keyboard shortcuts for inline formatting\n */\n override getKeymap(): KeyBinding[] {\n return [\n {\n key: \"Mod-b\",\n run: toggleMarkdownStyle(\"**\"),\n preventDefault: true,\n },\n {\n key: \"Mod-i\",\n run: toggleMarkdownStyle(\"*\"),\n preventDefault: true,\n },\n {\n key: \"Mod-Shift-s\",\n run: toggleMarkdownStyle(\"~~\"),\n preventDefault: true,\n },\n {\n key: \"Mod-,\",\n run: toggleMarkdownStyle(\"~\"),\n preventDefault: true,\n },\n {\n key: \"Mod-.\",\n run: toggleMarkdownStyle(\"^\"),\n preventDefault: true,\n },\n {\n key: \"Mod-Shift-h\",\n run: toggleMarkdownStyle(\"==\"),\n preventDefault: true,\n },\n ];\n }\n\n /**\n * Return markdown parser extensions for highlight syntax (==text==)\n */\n override getMarkdownConfig(): MarkdownConfig {\n return {\n defineNodes: [\n { name: \"Highlight\", style: tags.emphasis },\n { name: \"HighlightMark\", style: tags.processingInstruction },\n ],\n parseInline: [highlightParser],\n };\n }\n\n /**\n * Build inline decorations by iterating the syntax tree\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n // Check if this is an inline type we handle\n const inlineType = INLINE_TYPES[name as keyof typeof INLINE_TYPES];\n if (!inlineType) {\n return;\n }\n\n // Add mark decoration for the content\n decorations.push(inlineMarkDecorations[inlineType].range(from, to));\n\n // Only hide markers when cursor is not in the element\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\n if (!cursorInNode) {\n // Get the appropriate marker children based on type\n const markerNames = this.getMarkerNames(name);\n for (const markerName of markerNames) {\n const marks = node.node.getChildren(markerName);\n for (const mark of marks) {\n decorations.push(inlineMarkDecorations[\"inline-mark\"].range(mark.from, mark.to));\n }\n }\n }\n },\n });\n }\n\n /**\n * Get the marker node names for a given inline type\n */\n private getMarkerNames(nodeType: string): string[] {\n switch (nodeType) {\n case \"Emphasis\":\n case \"StrongEmphasis\":\n return [\"EmphasisMark\"];\n case \"Strikethrough\":\n return [\"StrikethroughMark\"];\n case \"Subscript\":\n return [\"SubscriptMark\"];\n case \"Superscript\":\n return [\"SuperscriptMark\"];\n case \"Highlight\":\n return [\"HighlightMark\"];\n default:\n return [];\n }\n }\n\n override renderToHTML(node: SyntaxNode, children: string): string | null {\n if (this.marks.includes(node.name)) {\n return \"\";\n }\n\n const inlineType = INLINE_TYPES[node.name as keyof typeof INLINE_TYPES];\n if (!inlineType) {\n return null;\n }\n const className = inlineMarkDecorations[inlineType].spec.class as string;\n\n return `<span class=\"${className}\">${children}</span>`;\n }\n}\n\n/**\n * Theme for inline styling\n */\nconst theme = createTheme({\n default: {\n // Emphasis (italic)\n \".cm-draftly-emphasis\": {\n fontStyle: \"italic\",\n },\n\n // Strong (bold)\n \".cm-draftly-strong\": {\n fontWeight: \"bold\",\n },\n\n // Strikethrough\n \".cm-draftly-strikethrough\": {\n textDecoration: \"line-through\",\n opacity: \"0.7\",\n },\n\n // Subscript\n \".cm-draftly-subscript\": {\n fontSize: \"0.75em\",\n verticalAlign: \"sub\",\n },\n\n // Superscript\n \".cm-draftly-superscript\": {\n fontSize: \"0.75em\",\n verticalAlign: \"super\",\n },\n\n // Highlight\n \".cm-draftly-highlight\": {\n backgroundColor: \"rgba(255, 213, 0, 0.35)\",\n borderRadius: \"2px\",\n padding: \"1px 2px\",\n },\n },\n});\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n/**\r\n * Mark decorations for link syntax elements\r\n */\r\nconst linkMarkDecorations = {\r\n \"link-text\": Decoration.mark({ class: \"cm-draftly-link-text\" }),\r\n \"link-marker\": Decoration.mark({ class: \"cm-draftly-link-marker\" }),\r\n \"link-url\": Decoration.mark({ class: \"cm-draftly-link-url\" }),\r\n \"link-hidden\": Decoration.mark({ class: \"cm-draftly-link-hidden\" }),\r\n};\r\n\r\n/**\r\n * Parse link markdown to extract text and URL\r\n * Format: [text](url) or [text](url \"title\")\r\n */\r\nfunction parseLinkMarkdown(content: string): { text: string; url: string; title?: string } | null {\r\n // Regex to match: [text](url) or [text](url \"title\")\r\n const match = content.match(/^\\[([^\\]]*)\\]\\(([^\"\\s)]+)(?:\\s+\"([^\"]*)\")?\\s*\\)$/);\r\n if (!match) return null;\r\n\r\n const result: { text: string; url: string; title?: string } = {\r\n text: match[1] || \"\",\r\n url: match[2]!,\r\n };\r\n\r\n if (match[3] !== undefined) {\r\n result.title = match[3];\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Widget for displaying a tooltip with the link URL on hover\r\n */\r\nclass LinkTooltipWidget extends WidgetType {\r\n constructor(\r\n readonly url: string,\r\n readonly from: number,\r\n readonly to: number\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: LinkTooltipWidget): boolean {\r\n return other.url === this.url && other.from === this.from && other.to === this.to;\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n const wrapper = document.createElement(\"span\");\r\n wrapper.className = \"cm-draftly-link-wrapper\";\r\n wrapper.style.cursor = \"pointer\";\r\n\r\n // Tooltip element\r\n const tooltip = document.createElement(\"span\");\r\n tooltip.className = \"cm-draftly-link-tooltip\";\r\n tooltip.textContent = this.url;\r\n wrapper.appendChild(tooltip);\r\n\r\n // Show/hide tooltip on hover\r\n wrapper.addEventListener(\"mouseenter\", () => {\r\n tooltip.classList.add(\"cm-draftly-link-tooltip-visible\");\r\n });\r\n\r\n wrapper.addEventListener(\"mouseleave\", () => {\r\n tooltip.classList.remove(\"cm-draftly-link-tooltip-visible\");\r\n });\r\n\r\n // Click handler - select the raw markdown\r\n wrapper.addEventListener(\"click\", (e) => {\r\n if (e.ctrlKey || e.metaKey) {\r\n // Ctrl+Click: open in new tab\r\n e.preventDefault();\r\n e.stopPropagation();\r\n window.open(this.url, \"_blank\", \"noopener,noreferrer\");\r\n } else {\r\n // Regular click: select raw markdown\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n }\r\n });\r\n\r\n return wrapper;\r\n }\r\n\r\n override ignoreEvent(event: Event): boolean {\r\n // Allow click and mouse events to be handled by our handlers\r\n return event.type !== \"click\" && event.type !== \"mouseenter\" && event.type !== \"mouseleave\";\r\n }\r\n}\r\n\r\n/**\r\n * LinkPlugin - Decorates and provides interactivity for markdown links\r\n *\r\n * Supports the full link syntax: [text](url) and [text](url \"title\")\r\n * - Click: reveals raw markdown (selects/focuses the link syntax)\r\n * - Ctrl+Click: opens the link URL in a new browser tab\r\n * - Hover: shows tooltip with the link URL\r\n * - Hides the markdown syntax when cursor is not in range\r\n * - Shows raw markdown when cursor is within the link range\r\n */\r\nexport class LinkPlugin extends DecorationPlugin {\r\n readonly name = \"link\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 22;\r\n override readonly requiredNodes = [\"Link\"] as const;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for link formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-k\",\r\n run: (view) => this.toggleLink(view),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * URL regex pattern\r\n */\r\n private readonly urlPattern = /^(https?:\\/\\/|www\\.)[^\\s]+$/i;\r\n\r\n /**\r\n * Toggle link on selection\r\n * - If text is selected and is a URL: [](url) with cursor in brackets\r\n * - If text is selected (not URL): [text]() with cursor in parentheses\r\n * - If nothing selected: []() with cursor in brackets\r\n * - If already a link: remove syntax, leave plain text\r\n */\r\n private toggleLink(view: EditorView): boolean {\r\n const { state } = view;\r\n const { from, to, empty } = state.selection.main;\r\n const selectedText = state.sliceDoc(from, to);\r\n\r\n // Check if selection is already a link [text](url)\r\n const linkMatch = selectedText.match(/^\\[([^\\]]*)\\]\\(([^)]*)\\)$/);\r\n if (linkMatch) {\r\n // Already a link - extract just the text and replace\r\n const linkText = linkMatch[1] || \"\";\r\n view.dispatch({\r\n changes: { from, to, insert: linkText },\r\n selection: { anchor: from, head: from + linkText.length },\r\n });\r\n return true;\r\n }\r\n\r\n // Check if we're inside a link by looking at surrounding context\r\n const lineStart = state.doc.lineAt(from).from;\r\n const lineEnd = state.doc.lineAt(to).to;\r\n const lineText = state.sliceDoc(lineStart, lineEnd);\r\n\r\n // Find link pattern in line that contains the selection\r\n const linkRegex = /\\[([^\\]]*)\\]\\(([^)]*)\\)/g;\r\n let match;\r\n while ((match = linkRegex.exec(lineText)) !== null) {\r\n const matchFrom = lineStart + match.index;\r\n const matchTo = matchFrom + match[0].length;\r\n\r\n // Check if selection is within this link\r\n if (from >= matchFrom && to <= matchTo) {\r\n // Remove the link syntax, leave plain text\r\n const linkText = match[1] || \"\";\r\n view.dispatch({\r\n changes: { from: matchFrom, to: matchTo, insert: linkText },\r\n selection: { anchor: matchFrom, head: matchFrom + linkText.length },\r\n });\r\n return true;\r\n }\r\n }\r\n\r\n if (empty) {\r\n // No selection - insert []() and place cursor in brackets\r\n view.dispatch({\r\n changes: { from, insert: \"[]()\" },\r\n selection: { anchor: from + 1 },\r\n });\r\n } else if (this.urlPattern.test(selectedText)) {\r\n // Selected text is a URL - put it in parentheses, cursor in brackets\r\n const newText = `[](${selectedText})`;\r\n view.dispatch({\r\n changes: { from, to, insert: newText },\r\n selection: { anchor: from + 1 },\r\n });\r\n } else {\r\n // Selected text is not a URL - wrap as link text, cursor in parentheses\r\n const newText = `[${selectedText}]()`;\r\n view.dispatch({\r\n changes: { from, to, insert: newText },\r\n selection: { anchor: from + selectedText.length + 3 },\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n // Handle Link nodes\r\n if (name === \"Link\") {\r\n const content = view.state.sliceDoc(from, to);\r\n const parsed = parseLinkMarkdown(content);\r\n\r\n if (!parsed) return;\r\n\r\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\r\n\r\n if (cursorInRange) {\r\n // Cursor in range: show raw markdown with styling\r\n this.decorateRawLink(node.node, decorations, view);\r\n } else {\r\n // Cursor out of range: hide raw markdown, show styled link text\r\n // Hide the entire markdown syntax\r\n decorations.push(linkMarkDecorations[\"link-hidden\"].range(from, to));\r\n\r\n // Add styled link text with tooltip widget after the hidden markdown\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new LinkTooltipWidget(parsed.url, from, to),\r\n side: 1,\r\n }).range(to)\r\n );\r\n\r\n // Add replacement decoration to show styled link text\r\n decorations.push(\r\n Decoration.replace({\r\n widget: new LinkTextWidget(parsed.text, parsed.url, from, to, parsed.title),\r\n }).range(from, to)\r\n );\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Decorate raw link markdown when cursor is in range\r\n */\r\n private decorateRawLink(\r\n node: SyntaxNode,\r\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\r\n view: import(\"@codemirror/view\").EditorView\r\n ): void {\r\n const content = view.state.sliceDoc(node.from, node.to);\r\n\r\n // Style the opening bracket [\r\n decorations.push(linkMarkDecorations[\"link-marker\"].range(node.from, node.from + 1));\r\n\r\n // Find and style the link text and closing bracket + opening paren ](\r\n const bracketParen = content.indexOf(\"](\");\r\n if (bracketParen !== -1) {\r\n // Style link text\r\n if (bracketParen > 1) {\r\n decorations.push(linkMarkDecorations[\"link-text\"].range(node.from + 1, node.from + bracketParen));\r\n }\r\n // Style ]( markers\r\n decorations.push(\r\n linkMarkDecorations[\"link-marker\"].range(node.from + bracketParen, node.from + bracketParen + 2)\r\n );\r\n\r\n // Find and style the URL\r\n const urlChild = node.getChild(\"URL\");\r\n if (urlChild) {\r\n decorations.push(linkMarkDecorations[\"link-url\"].range(urlChild.from, urlChild.to));\r\n }\r\n\r\n // Style closing )\r\n decorations.push(linkMarkDecorations[\"link-marker\"].range(node.to - 1, node.to));\r\n }\r\n }\r\n\r\n /**\r\n * Render link to HTML for preview mode\r\n */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n _children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n if (node.name !== \"Link\") return null;\r\n\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const parsed = parseLinkMarkdown(content);\r\n if (!parsed) return null;\r\n\r\n const textContent = ctx.sanitize(parsed.text);\r\n const urlAttr = ctx.sanitize(parsed.url);\r\n const titleAttr = parsed.title ? ` title=\"${ctx.sanitize(parsed.title)}\"` : \"\";\r\n\r\n return `<a class=\"cm-draftly-link\" href=\"${urlAttr}\"${titleAttr} target=\"_blank\" rel=\"noopener noreferrer\">${textContent}</a>`;\r\n }\r\n}\r\n\r\n/**\r\n * Widget to display the styled link text with interactivity\r\n */\r\nclass LinkTextWidget extends WidgetType {\r\n constructor(\r\n readonly text: string,\r\n readonly url: string,\r\n readonly from: number,\r\n readonly to: number,\r\n readonly title?: string\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: LinkTextWidget): boolean {\r\n return (\r\n other.text === this.text &&\r\n other.url === this.url &&\r\n other.from === this.from &&\r\n other.to === this.to &&\r\n other.title === this.title\r\n );\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n const span = document.createElement(\"span\");\r\n span.className = \"cm-draftly-link-styled\";\r\n span.textContent = this.text;\r\n span.style.cursor = \"pointer\";\r\n\r\n if (this.title) {\r\n span.title = this.title;\r\n }\r\n\r\n // Tooltip element\r\n const tooltip = document.createElement(\"span\");\r\n tooltip.className = \"cm-draftly-link-tooltip\";\r\n tooltip.textContent = this.url;\r\n span.appendChild(tooltip);\r\n\r\n // Show/hide tooltip on hover\r\n span.addEventListener(\"mouseenter\", () => {\r\n tooltip.classList.add(\"cm-draftly-link-tooltip-visible\");\r\n });\r\n\r\n span.addEventListener(\"mouseleave\", () => {\r\n tooltip.classList.remove(\"cm-draftly-link-tooltip-visible\");\r\n });\r\n\r\n // Click handler\r\n span.addEventListener(\"click\", (e) => {\r\n if (e.ctrlKey || e.metaKey) {\r\n // Ctrl+Click: open in new tab\r\n e.preventDefault();\r\n e.stopPropagation();\r\n window.open(this.url, \"_blank\", \"noopener,noreferrer\");\r\n } else {\r\n // Regular click: select raw markdown\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n }\r\n });\r\n\r\n return span;\r\n }\r\n\r\n override ignoreEvent(event: Event): boolean {\r\n // Allow click and mouse events to be handled by our handlers\r\n return event.type !== \"click\" && event.type !== \"mouseenter\" && event.type !== \"mouseleave\";\r\n }\r\n}\r\n\r\n/**\r\n * Theme for link styling\r\n */\r\nconst theme = createTheme({\r\n default: {\r\n // Link text\r\n \".cm-draftly-link-text\": {\r\n color: \"#0366d6\",\r\n },\r\n\r\n // Link markers ([ ] ( ))\r\n \".cm-draftly-link-marker\": {\r\n color: \"#6a737d\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n // URL in raw markdown\r\n \".cm-draftly-link-url\": {\r\n color: \"#6a737d\",\r\n fontStyle: \"italic\",\r\n },\r\n\r\n // Hidden markdown syntax\r\n \".cm-draftly-link-hidden\": {\r\n display: \"none\",\r\n },\r\n\r\n // Styled link when cursor is not in range\r\n \".cm-draftly-link-styled\": {\r\n color: \"#0366d6\",\r\n textDecoration: \"underline\",\r\n position: \"relative\",\r\n cursor: \"pointer\",\r\n },\r\n\r\n \".cm-draftly-link-styled:hover\": {\r\n color: \"#0056b3\",\r\n },\r\n\r\n // Preview link styling\r\n \".cm-draftly-link\": {\r\n color: \"#0366d6\",\r\n textDecoration: \"underline\",\r\n },\r\n\r\n \".cm-draftly-link:hover\": {\r\n color: \"#0056b3\",\r\n },\r\n\r\n // Tooltip styling\r\n \".cm-draftly-link-tooltip\": {\r\n display: \"none\",\r\n position: \"absolute\",\r\n bottom: \"100%\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n backgroundColor: \"#24292e\",\r\n color: \"#ffffff\",\r\n padding: \"4px 8px\",\r\n borderRadius: \"4px\",\r\n fontSize: \"12px\",\r\n whiteSpace: \"nowrap\",\r\n zIndex: \"1000\",\r\n pointerEvents: \"none\",\r\n marginBottom: \"4px\",\r\n maxWidth: \"300px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n },\r\n\r\n \".cm-draftly-link-tooltip-visible\": {\r\n display: \"block\",\r\n },\r\n },\r\n\r\n dark: {\r\n \".cm-draftly-link-text\": {\r\n color: \"#58a6ff\",\r\n },\r\n\r\n \".cm-draftly-link-marker\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-link-url\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-link-styled\": {\r\n color: \"#58a6ff\",\r\n },\r\n\r\n \".cm-draftly-link-styled:hover\": {\r\n color: \"#79c0ff\",\r\n },\r\n\r\n \".cm-draftly-link\": {\r\n color: \"#58a6ff\",\r\n },\r\n\r\n \".cm-draftly-link:hover\": {\r\n color: \"#79c0ff\",\r\n },\r\n\r\n \".cm-draftly-link-tooltip\": {\r\n backgroundColor: \"#30363d\",\r\n color: \"#c9d1d9\",\r\n },\r\n },\r\n});\r\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { Range } from \"@codemirror/state\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n// ============================================================================\r\n// CSS Classes\r\n// ============================================================================\r\n\r\nconst classes = {\r\n // Unordered list classes\r\n lineUL: \"cm-draftly-list-line-ul\",\r\n markUL: \"cm-draftly-list-mark-ul\",\r\n\r\n // Ordered list classes\r\n lineOL: \"cm-draftly-list-line-ol\",\r\n markOL: \"cm-draftly-list-mark-ol\",\r\n\r\n // Task list classes\r\n taskLine: \"cm-draftly-task-line\",\r\n taskMarker: \"cm-draftly-task-marker\",\r\n\r\n // Common classes\r\n content: \"cm-draftly-list-content\",\r\n indent: \"cm-draftly-list-indent\",\r\n active: \" cm-draftly-active\",\r\n preview: \"cm-draftly-preview\",\r\n};\r\n\r\n// ============================================================================\r\n// Checkbox Widget\r\n// ============================================================================\r\n\r\n/**\r\n * Interactive checkbox widget for task list items.\r\n * Replaces `[ ]` or `[x]` markers with a clickable checkbox when not editing.\r\n */\r\nexport class TaskCheckboxWidget extends WidgetType {\r\n constructor(readonly checked: boolean) {\r\n super();\r\n }\r\n\r\n override eq(other: TaskCheckboxWidget): boolean {\r\n return other.checked === this.checked;\r\n }\r\n\r\n toDOM(view: EditorView): HTMLElement {\r\n const wrap = document.createElement(\"span\");\r\n wrap.className = `cm-draftly-task-checkbox ${this.checked ? \"checked\" : \"\"}`;\r\n wrap.setAttribute(\"aria-hidden\", \"true\");\r\n\r\n const checkbox = document.createElement(\"input\");\r\n checkbox.type = \"checkbox\";\r\n checkbox.checked = this.checked;\r\n checkbox.tabIndex = -1;\r\n\r\n checkbox.addEventListener(\"mousedown\", (e) => {\r\n e.preventDefault();\r\n this.toggleCheckbox(view, wrap);\r\n });\r\n\r\n wrap.appendChild(checkbox);\r\n return wrap;\r\n }\r\n\r\n override ignoreEvent(): boolean {\r\n return false;\r\n }\r\n\r\n /** Toggle the checkbox state in the document */\r\n private toggleCheckbox(view: EditorView, wrap: HTMLElement): void {\r\n const pos = view.posAtDOM(wrap);\r\n const line = view.state.doc.lineAt(pos);\r\n const match = line.text.match(/^(\\s*(?:[-*+]|\\d+\\.)\\s*)\\[([ xX])\\]/);\r\n\r\n if (match) {\r\n const markerStart = line.from + match[1]!.length + 1;\r\n const newChar = this.checked ? \" \" : \"x\";\r\n view.dispatch({\r\n changes: { from: markerStart, to: markerStart + 1, insert: newChar },\r\n });\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// List Plugin\r\n// ============================================================================\r\n\r\n/**\r\n * Decorates markdown lists with custom styling.\r\n *\r\n * Supports:\r\n * - **Unordered lists** — Replaces `*`, `-`, `+` markers with styled bullets\r\n * - **Ordered lists** — Styles numbered markers (`1.`, `2.`, etc.)\r\n * - **Task lists** — Renders `[ ]`/`[x]` as interactive checkboxes\r\n */\r\nexport class ListPlugin extends DecorationPlugin {\r\n readonly name = \"list\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 20;\r\n override readonly requiredNodes = [\r\n \"BulletList\",\r\n \"OrderedList\",\r\n \"ListItem\",\r\n \"ListMark\",\r\n \"Task\",\r\n \"TaskMarker\",\r\n ] as const;\r\n\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for list formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-Shift-8\",\r\n run: (view) => this.toggleListOnLines(view, \"- \"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-Shift-7\",\r\n run: (view) => this.toggleListOnLines(view, \"1. \"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-Shift-9\",\r\n run: (view) => this.toggleListOnLines(view, \"- [ ] \"),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Toggle list marker on current line or selected lines\r\n */\r\n private toggleListOnLines(view: EditorView, marker: string): boolean {\r\n const { state } = view;\r\n const { from, to } = state.selection.main;\r\n\r\n // Get all lines in selection\r\n const startLine = state.doc.lineAt(from);\r\n const endLine = state.doc.lineAt(to);\r\n\r\n const changes: { from: number; to: number; insert: string }[] = [];\r\n\r\n // Regex to match existing list markers\r\n const listMarkerRegex = /^(\\s*)([-*+]|\\d+\\.)\\s(\\[[ xX]\\]\\s)?/;\r\n\r\n const isOrderedMarker = marker === \"1. \";\r\n let orderNum = 1;\r\n\r\n for (let lineNum = startLine.number; lineNum <= endLine.number; lineNum++) {\r\n const line = state.doc.line(lineNum);\r\n const match = line.text.match(listMarkerRegex);\r\n\r\n // Get the actual marker to insert (incremental for ordered lists)\r\n const actualMarker = isOrderedMarker ? `${orderNum}. ` : marker;\r\n\r\n if (match) {\r\n // Line already has a list marker - check if same type\r\n const existingMarker = match[0];\r\n const indent = match[1] || \"\";\r\n\r\n // Check if this is the same marker type (toggle off)\r\n const isUnordered = /^[-*+]$/.test(match[2]!);\r\n const isOrdered = /^\\d+\\.$/.test(match[2]!);\r\n const hasTask = !!match[3];\r\n\r\n const wantUnordered = marker === \"- \";\r\n const wantOrdered = isOrderedMarker;\r\n const wantTask = marker === \"- [ ] \";\r\n\r\n if (\r\n (wantUnordered && isUnordered && !hasTask) ||\r\n (wantOrdered && isOrdered && !hasTask) ||\r\n (wantTask && hasTask)\r\n ) {\r\n // Same type - remove the marker\r\n changes.push({\r\n from: line.from,\r\n to: line.from + existingMarker.length,\r\n insert: indent,\r\n });\r\n } else {\r\n // Different type - replace the marker\r\n changes.push({\r\n from: line.from,\r\n to: line.from + existingMarker.length,\r\n insert: indent + actualMarker,\r\n });\r\n orderNum++;\r\n }\r\n } else {\r\n // No list marker - add one at start of line (after any indent)\r\n const indentMatch = line.text.match(/^(\\s*)/);\r\n const indent = indentMatch ? indentMatch[1]! : \"\";\r\n changes.push({\r\n from: line.from + indent.length,\r\n to: line.from + indent.length,\r\n insert: actualMarker,\r\n });\r\n orderNum++;\r\n }\r\n }\r\n\r\n if (changes.length > 0) {\r\n view.dispatch({ changes });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n const line = view.state.doc.lineAt(from);\r\n const cursorInLine = ctx.cursorInRange(line.from, line.to);\r\n\r\n switch (name) {\r\n case \"ListItem\":\r\n this.decorateListItem(node, line, decorations);\r\n break;\r\n\r\n case \"ListMark\":\r\n this.decorateListMark(node, line, decorations, cursorInLine);\r\n break;\r\n\r\n case \"TaskMarker\":\r\n this.decorateTaskMarker(from, to, view, decorations, cursorInLine);\r\n break;\r\n }\r\n },\r\n });\r\n }\r\n\r\n /** Add line decoration for list items with nesting depth */\r\n private decorateListItem(\r\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0],\r\n line: { from: number },\r\n decorations: Range<Decoration>[]\r\n ): void {\r\n const parent = node.node.parent;\r\n const listType = parent?.name;\r\n\r\n // Calculate nesting depth\r\n let depth = 0;\r\n let ancestor = node.node.parent;\r\n while (ancestor) {\r\n if (ancestor.name === \"ListItem\") depth++;\r\n ancestor = ancestor.parent;\r\n }\r\n\r\n // Check for task marker child\r\n const hasTask = this.hasTaskChild(node);\r\n\r\n // Determine line class based on list type\r\n let lineClass: string;\r\n if (hasTask) lineClass = classes.taskLine;\r\n else if (listType === \"OrderedList\") lineClass = classes.lineOL;\r\n else lineClass = classes.lineUL;\r\n\r\n decorations.push(\r\n Decoration.line({\r\n class: lineClass,\r\n attributes: { style: `--depth: ${depth}` },\r\n }).range(line.from)\r\n );\r\n }\r\n\r\n /** Check if a ListItem node has a Task child */\r\n private hasTaskChild(\r\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0]\r\n ): boolean {\r\n const cursor = node.node.cursor();\r\n if (cursor.firstChild()) {\r\n do {\r\n if (cursor.name === \"Task\") return true;\r\n } while (cursor.nextSibling());\r\n }\r\n return false;\r\n }\r\n\r\n /** Decorate list markers (bullets for UL, numbers for OL) */\r\n private decorateListMark(\r\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0],\r\n line: { from: number; to: number },\r\n decorations: Range<Decoration>[],\r\n cursorInLine: boolean\r\n ): void {\r\n const { from, to } = node;\r\n const parent = node.node.parent;\r\n const grandparent = parent?.parent;\r\n const listType = grandparent?.name;\r\n const activeClass = cursorInLine ? classes.active : \"\";\r\n\r\n // Add indent decoration for nested items\r\n if (from > line.from) {\r\n decorations.push(Decoration.mark({ class: classes.indent + activeClass }).range(line.from, from));\r\n }\r\n\r\n // Add marker decoration based on list type\r\n const markClass = listType === \"OrderedList\" ? classes.markOL : classes.markUL;\r\n decorations.push(Decoration.mark({ class: markClass + activeClass }).range(from, to + 1));\r\n\r\n // Wrap remaining line content\r\n const contentStart = to + 1;\r\n if (contentStart < line.to) {\r\n decorations.push(Decoration.mark({ class: classes.content }).range(contentStart, line.to));\r\n }\r\n }\r\n\r\n /** Decorate task markers - show checkbox widget or raw text based on cursor */\r\n private decorateTaskMarker(\r\n from: number,\r\n to: number,\r\n view: EditorView,\r\n decorations: Range<Decoration>[],\r\n cursorInLine: boolean\r\n ): void {\r\n const text = view.state.sliceDoc(from, to);\r\n const isChecked = text.includes(\"x\") || text.includes(\"X\");\r\n\r\n if (cursorInLine) {\r\n // Show raw marker when editing\r\n decorations.push(Decoration.mark({ class: classes.taskMarker }).range(from, to));\r\n } else {\r\n // Replace with interactive checkbox\r\n decorations.push(\r\n Decoration.replace({\r\n widget: new TaskCheckboxWidget(isChecked),\r\n }).range(from, to)\r\n );\r\n }\r\n }\r\n\r\n /** Render list nodes to HTML */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n switch (node.name) {\r\n case \"BulletList\":\r\n return `<ul class=\"${classes.lineUL} ${classes.preview}\">${children}</ul>\\n`;\r\n\r\n case \"OrderedList\":\r\n return `<ol class=\"${classes.lineOL} ${classes.preview}\">${children}</ol>\\n`;\r\n\r\n case \"ListItem\":\r\n return `<li>${children}</li>\\n`;\r\n\r\n case \"Task\":\r\n return children;\r\n\r\n case \"TaskMarker\": {\r\n const text = ctx.sliceDoc(node.from, node.to);\r\n const isChecked = text.includes(\"x\") || text.includes(\"X\");\r\n return `<input type=\"checkbox\" class=\"cm-draftly-task-checkbox\" disabled ${isChecked ? \"checked\" : \"\"} />`;\r\n }\r\n\r\n case \"ListMark\":\r\n return \"\";\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Theme\r\n// ============================================================================\r\n\r\nconst theme = createTheme({\r\n default: {\r\n // Indentation marker positioning\r\n \".cm-draftly-list-indent\": {\r\n overflow: \"hidden\",\r\n display: \"inline-block\",\r\n position: \"absolute\",\r\n left: \"calc(1rem * (var(--depth, 0) + 1))\",\r\n transform: \"translateX(-100%)\",\r\n },\r\n\r\n // List line layout (flexbox for marker alignment)\r\n \".cm-draftly-list-line-ul, .cm-draftly-list-line-ol\": {\r\n position: \"relative\",\r\n paddingLeft: \"calc(1rem * (var(--depth, 0) + 1)) !important\",\r\n display: \"flex\",\r\n alignItems: \"start\",\r\n },\r\n \".cm-draftly-list-line-ul > :first-child, .cm-draftly-list-line-ol > :first-child\": {\r\n flexShrink: 0,\r\n },\r\n\r\n // List marker sizing\r\n \".cm-draftly-list-line-ul .cm-draftly-list-mark-ul, .cm-draftly-list-line-ol .cm-draftly-list-mark-ol\": {\r\n whiteSpace: \"pre\",\r\n position: \"relative\",\r\n width: \"1rem\",\r\n flexShrink: 0,\r\n },\r\n\r\n // Hide raw marker text when not active\r\n \".cm-draftly-list-mark-ul:not(.cm-draftly-active) > span, .cm-draftly-task-line .cm-draftly-list-mark-ol:not(.cm-draftly-active) > span\":\r\n {\r\n visibility: \"hidden\",\r\n display: \"none\",\r\n },\r\n\r\n // Styled bullet for unordered lists\r\n \".cm-draftly-list-line-ul .cm-draftly-list-mark-ul:not(.cm-draftly-active)::after\": {\r\n content: '\"•\"',\r\n color: \"var(--color-link)\",\r\n fontWeight: \"bold\",\r\n pointerEvents: \"none\",\r\n },\r\n\r\n // Task marker styling (visible when editing)\r\n \".cm-draftly-task-marker\": {\r\n color: \"var(--draftly-highlight, #a4a4a4)\",\r\n fontFamily: \"monospace\",\r\n },\r\n\r\n // Task checkbox container\r\n \".cm-draftly-task-checkbox\": {\r\n display: \"inline-flex\",\r\n verticalAlign: \"middle\",\r\n marginRight: \"0.3em\",\r\n cursor: \"pointer\",\r\n userSelect: \"none\",\r\n alignItems: \"center\",\r\n height: \"1.2em\",\r\n },\r\n\r\n // Task checkbox input styling\r\n \".cm-draftly-task-checkbox input\": {\r\n cursor: \"pointer\",\r\n margin: 0,\r\n width: \"1.1em\",\r\n height: \"1.1em\",\r\n appearance: \"none\",\r\n border: \"1px solid\",\r\n borderRadius: \"0.25em\",\r\n backgroundColor: \"transparent\",\r\n position: \"relative\",\r\n },\r\n\r\n // Checkmark for completed tasks\r\n \".cm-draftly-task-checkbox.checked input::after\": {\r\n content: '\"✓\"',\r\n position: \"absolute\",\r\n left: \"1px\",\r\n top: \"-3px\",\r\n },\r\n\r\n // Preview styles (override editor-specific layout)\r\n \".cm-draftly-preview\": {\r\n display: \"block\",\r\n paddingLeft: \"1.5rem\",\r\n margin: \"0.5rem 0\",\r\n },\r\n \".cm-draftly-preview li\": {\r\n display: \"list-item\",\r\n marginBottom: \"0.25rem\",\r\n },\r\n \"ul.cm-draftly-preview\": {\r\n listStyleType: \"disc\",\r\n },\r\n \"ol.cm-draftly-preview\": {\r\n listStyleType: \"decimal\",\r\n },\r\n // Hide list marker for task items\r\n \".cm-draftly-preview li:has(.cm-draftly-task-checkbox)\": {\r\n listStyleType: \"none\",\r\n },\r\n \".cm-draftly-preview li .cm-draftly-paragraph\": {\r\n padding: \"0\",\r\n },\r\n },\r\n});\r\n","import { Decoration, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport DOMPurify from \"dompurify\";\nimport { createTheme } from \"../editor\";\n\n/**\n * Mark decorations for HTML content\n */\nconst htmlMarkDecorations = {\n \"html-tag\": Decoration.mark({ class: \"cm-draftly-html-tag\" }),\n \"html-comment\": Decoration.mark({ class: \"cm-draftly-html-comment\" }),\n};\n\n/**\n * Line decorations for HTML blocks (when visible)\n */\nconst htmlLineDecorations = {\n \"html-block\": Decoration.line({ class: \"cm-draftly-line-html-block\" }),\n \"hidden-line\": Decoration.line({ class: \"cm-draftly-hidden-line\" }),\n};\n\n/**\n * Widget to render sanitized HTML (block)\n */\nclass HTMLPreviewWidget extends WidgetType {\n constructor(readonly html: string) {\n super();\n }\n\n override eq(other: HTMLPreviewWidget): boolean {\n return other.html === this.html;\n }\n\n toDOM() {\n const div = document.createElement(\"div\");\n div.className = \"cm-draftly-html-preview\";\n div.innerHTML = DOMPurify.sanitize(this.html);\n return div;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\n/**\n * Widget to render sanitized inline HTML\n */\nclass InlineHTMLPreviewWidget extends WidgetType {\n constructor(readonly html: string) {\n super();\n }\n\n override eq(other: InlineHTMLPreviewWidget): boolean {\n return other.html === this.html;\n }\n\n toDOM() {\n const span = document.createElement(\"span\");\n span.className = \"cm-draftly-inline-html-preview\";\n span.innerHTML = DOMPurify.sanitize(this.html);\n return span;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\ninterface HTMLGroup {\n from: number;\n to: number;\n}\n\ninterface HTMLTagInfo {\n from: number;\n to: number;\n tagName: string;\n isClosing: boolean;\n isSelfClosing: boolean;\n}\n\ninterface InlineHTMLElement {\n from: number;\n to: number;\n content: string;\n}\n\n/**\n * Parse an HTML tag to extract its name and type\n */\nfunction parseHTMLTag(content: string): { tagName: string; isClosing: boolean; isSelfClosing: boolean } | null {\n const match = content.match(/^<\\s*(\\/?)([a-zA-Z][a-zA-Z0-9-]*)[^>]*(\\/?)>$/);\n if (!match) return null;\n\n return {\n tagName: match[2]!.toLowerCase(),\n isClosing: match[1] === \"/\",\n isSelfClosing:\n match[3] === \"/\" ||\n [\"br\", \"hr\", \"img\", \"input\", \"meta\", \"link\", \"area\", \"base\", \"col\", \"embed\", \"source\", \"track\", \"wbr\"].includes(\n match[2]!.toLowerCase()\n ),\n };\n}\n\n/**\n * HTMLPlugin - Decorates and Renders HTML in markdown\n */\nexport class HTMLPlugin extends DecorationPlugin {\n readonly name = \"html\";\n readonly version = \"1.0.0\";\n override decorationPriority = 30;\n\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n // Collect blocks and inline tags\n const htmlGroups: HTMLGroup[] = [];\n const htmlTags: HTMLTagInfo[] = [];\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n // Handle HTML Comments\n if (name === \"Comment\") {\n decorations.push(htmlMarkDecorations[\"html-comment\"].range(from, to));\n return;\n }\n\n // Collect inline HTML tags for pairing\n if (name === \"HTMLTag\") {\n const content = view.state.sliceDoc(from, to);\n const parsed = parseHTMLTag(content);\n if (parsed) {\n htmlTags.push({\n from,\n to,\n tagName: parsed.tagName,\n isClosing: parsed.isClosing,\n isSelfClosing: parsed.isSelfClosing,\n });\n }\n }\n\n // Handle HTML Blocks - Collect for grouping\n if (name === \"HTMLBlock\") {\n const last = htmlGroups[htmlGroups.length - 1];\n if (last) {\n const gap = view.state.sliceDoc(last.to, from);\n if (!gap.trim()) {\n last.to = to;\n return;\n }\n }\n htmlGroups.push({ from, to });\n }\n },\n });\n\n // Find complete inline HTML elements (must be on same line)\n const inlineElements: InlineHTMLElement[] = [];\n const usedTags = new Set<number>(); // Track used tag indices\n\n for (let i = 0; i < htmlTags.length; i++) {\n if (usedTags.has(i)) continue;\n\n const openTag = htmlTags[i]!;\n if (openTag.isClosing) continue;\n\n // Handle self-closing tags\n if (openTag.isSelfClosing) {\n inlineElements.push({\n from: openTag.from,\n to: openTag.to,\n content: view.state.sliceDoc(openTag.from, openTag.to),\n });\n usedTags.add(i);\n continue;\n }\n\n // Find matching closing tag (must be on same line)\n const openLine = view.state.doc.lineAt(openTag.from);\n let depth = 1;\n let closeTagIndex: number | null = null;\n\n for (let j = i + 1; j < htmlTags.length && depth > 0; j++) {\n const tag = htmlTags[j]!;\n\n // Stop if we've gone past the open tag's line\n if (tag.from > openLine.to) break;\n\n if (tag.tagName === openTag.tagName) {\n if (tag.isClosing) {\n depth--;\n if (depth === 0) {\n closeTagIndex = j;\n }\n } else if (!tag.isSelfClosing) {\n depth++;\n }\n }\n }\n\n if (closeTagIndex !== null) {\n const closeTag = htmlTags[closeTagIndex]!;\n inlineElements.push({\n from: openTag.from,\n to: closeTag.to,\n content: view.state.sliceDoc(openTag.from, closeTag.to),\n });\n\n // Mark all tags within this range as used (to handle nesting)\n for (let k = i; k <= closeTagIndex; k++) {\n usedTags.add(k);\n }\n }\n }\n\n // Sort by position and filter out overlapping elements (keep outermost)\n inlineElements.sort((a, b) => a.from - b.from);\n const filteredElements: InlineHTMLElement[] = [];\n let lastEnd = -1;\n\n for (const elem of inlineElements) {\n if (elem.from >= lastEnd) {\n filteredElements.push(elem);\n lastEnd = elem.to;\n }\n }\n\n // Apply decorations for inline elements\n for (const elem of filteredElements) {\n const cursorInRange = ctx.cursorInRange(elem.from, elem.to);\n\n if (cursorInRange) {\n // Show source - find and style the tags within this element\n for (const tag of htmlTags) {\n if (tag.from >= elem.from && tag.to <= elem.to) {\n decorations.push(htmlMarkDecorations[\"html-tag\"].range(tag.from, tag.to));\n }\n }\n } else {\n // Render preview\n decorations.push(\n Decoration.replace({\n widget: new InlineHTMLPreviewWidget(elem.content),\n }).range(elem.from, elem.to)\n );\n }\n }\n\n // Style any remaining unprocessed tags (orphan tags)\n for (let i = 0; i < htmlTags.length; i++) {\n if (!usedTags.has(i)) {\n const tag = htmlTags[i]!;\n decorations.push(htmlMarkDecorations[\"html-tag\"].range(tag.from, tag.to));\n }\n }\n\n // Process gathered HTML block groups\n for (const group of htmlGroups) {\n const { from, to } = group;\n\n const nodeLineStart = view.state.doc.lineAt(from);\n const nodeLineEnd = view.state.doc.lineAt(to);\n const cursorInRange = ctx.cursorInRange(nodeLineStart.from, nodeLineEnd.to);\n\n if (cursorInRange) {\n for (let i = nodeLineStart.number; i <= nodeLineEnd.number; i++) {\n const line = view.state.doc.line(i);\n decorations.push(htmlLineDecorations[\"html-block\"].range(line.from));\n }\n } else {\n const htmlContent = view.state.sliceDoc(from, to);\n\n decorations.push(\n Decoration.replace({\n widget: new HTMLPreviewWidget(htmlContent.trim()),\n }).range(from, nodeLineStart.to)\n );\n\n for (let i = nodeLineStart.number + 1; i <= nodeLineEnd.number; i++) {\n const line = view.state.doc.line(i);\n decorations.push(htmlLineDecorations[\"hidden-line\"].range(line.from));\n }\n }\n }\n }\n}\n\n/**\n * Theme for HTML styling\n */\nconst theme = createTheme({\n default: {\n \".cm-draftly-html-tag\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85em\",\n },\n\n \".cm-draftly-html-comment\": {\n color: \"#6a737d\",\n fontStyle: \"italic\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85em\",\n opacity: 0.5,\n },\n\n \".cm-draftly-line-html-block\": {\n backgroundColor: \"rgba(0, 0, 0, 0.02)\",\n },\n\n \".cm-draftly-hidden-line\": {\n display: \"none\",\n },\n\n \".cm-draftly-html-preview\": {\n display: \"inline-block\",\n width: \"100%\",\n verticalAlign: \"top\",\n margin: \"0\",\n whiteSpace: \"normal\",\n lineHeight: \"1.4\",\n },\n \".cm-draftly-html-preview > *:first-child\": {\n marginTop: \"0\",\n },\n \".cm-draftly-html-preview > *:last-child\": {\n marginBottom: \"0\",\n },\n\n \".cm-draftly-inline-html-preview\": {\n display: \"inline\",\n whiteSpace: \"normal\",\n },\n },\n});\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n/**\r\n * Mark decorations for image syntax elements\r\n */\r\nconst imageMarkDecorations = {\r\n \"image-block\": Decoration.line({ class: \"cm-draftly-image-block\" }),\r\n \"image-marker\": Decoration.mark({ class: \"cm-draftly-image-marker\" }),\r\n \"image-alt\": Decoration.mark({ class: \"cm-draftly-image-alt\" }),\r\n \"image-url\": Decoration.mark({ class: \"cm-draftly-image-url\" }),\r\n \"image-hidden\": Decoration.mark({ class: \"cm-draftly-image-hidden\" }),\r\n};\r\n\r\n/**\r\n * Parse image markdown to extract alt text, URL, and optional title\r\n * Format: ![alt text](url \"optional title\")\r\n */\r\nfunction parseImageMarkdown(content: string): { alt: string; url: string; title?: string } | null {\r\n // Regex to match: ![alt](url) or ![alt](url \"title\")\r\n const match = content.match(/^!\\[([^\\]]*)\\]\\(([^\"\\s)]+)(?:\\s+\"([^\"]*)\")?\\s*\\)$/);\r\n if (!match) return null;\r\n\r\n const result: { alt: string; url: string; title?: string } = {\r\n alt: match[1] || \"\",\r\n url: match[2]!,\r\n };\r\n\r\n if (match[3] !== undefined) {\r\n result.title = match[3];\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Widget to render an image with optional caption using figure/figcaption\r\n * Placed below the markdown syntax as a widget decoration\r\n */\r\nclass ImageWidget extends WidgetType {\r\n constructor(\r\n readonly url: string,\r\n readonly alt: string,\r\n readonly from: number,\r\n readonly to: number,\r\n readonly title?: string\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: ImageWidget): boolean {\r\n return (\r\n other.url === this.url &&\r\n other.alt === this.alt &&\r\n other.from === this.from &&\r\n other.to === this.to &&\r\n other.title === this.title\r\n );\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n // Create figure element for semantic image container\r\n const figure = document.createElement(\"figure\");\r\n figure.className = \"cm-draftly-image-figure\";\r\n figure.setAttribute(\"role\", \"figure\");\r\n figure.style.cursor = \"pointer\";\r\n if (this.title) {\r\n figure.setAttribute(\"aria-label\", this.title);\r\n }\r\n\r\n // Click handler to select the raw markdown text\r\n figure.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n });\r\n\r\n // Create image element with accessibility attributes\r\n const img = document.createElement(\"img\");\r\n img.className = \"cm-draftly-image\";\r\n img.src = this.url;\r\n img.alt = this.alt;\r\n img.setAttribute(\"loading\", \"lazy\");\r\n img.setAttribute(\"decoding\", \"async\");\r\n if (this.title) {\r\n img.title = this.title;\r\n }\r\n\r\n // Handle image loading error\r\n img.onerror = () => {\r\n img.style.display = \"none\";\r\n const errorSpan = document.createElement(\"span\");\r\n errorSpan.className = \"cm-draftly-image-error\";\r\n errorSpan.setAttribute(\"role\", \"alert\");\r\n errorSpan.textContent = `[Image not found: ${this.alt || this.url}]`;\r\n figure.appendChild(errorSpan);\r\n };\r\n\r\n figure.appendChild(img);\r\n\r\n // Add figcaption if title exists\r\n if (this.title) {\r\n const figcaption = document.createElement(\"figcaption\");\r\n figcaption.className = \"cm-draftly-image-caption\";\r\n figcaption.textContent = this.title;\r\n figure.appendChild(figcaption);\r\n }\r\n\r\n return figure;\r\n }\r\n\r\n override ignoreEvent(event: Event) {\r\n // Allow click events to be handled by our click handler\r\n return event.type !== \"click\";\r\n }\r\n}\r\n\r\n/**\r\n * ImagePlugin - Decorates and renders images in markdown\r\n *\r\n * Supports the full image syntax: ![alt text](url \"optional title\")\r\n * - Shows image widget below the node when cursor is not in range\r\n * - Hides the markdown syntax when cursor is not in range\r\n * - Shows raw markdown when cursor is in the image syntax\r\n * - Uses figure/figcaption for semantic HTML with accessibility attributes\r\n */\r\nexport class ImagePlugin extends DecorationPlugin {\r\n readonly name = \"image\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 25;\r\n override readonly requiredNodes = [\"Image\"] as const;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for image formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-Shift-i\",\r\n run: (view) => this.toggleImage(view),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * URL regex pattern\r\n */\r\n private readonly urlPattern = /^(https?:\\/\\/|www\\.)[^\\s]+$/i;\r\n\r\n /**\r\n * Toggle image on selection\r\n * - If text selected and is a URL: ![Alt Text](url) with cursor in brackets\r\n * - If text selected (not URL): ![text]() with cursor in parentheses\r\n * - If nothing selected: ![Alt Text]() with cursor in parentheses\r\n * - If already an image: remove syntax, leave just the URL\r\n */\r\n private toggleImage(view: EditorView): boolean {\r\n const { state } = view;\r\n const { from, to, empty } = state.selection.main;\r\n const selectedText = state.sliceDoc(from, to);\r\n\r\n // Check if selection is already an image ![alt](url)\r\n const imageMatch = selectedText.match(/^!\\[([^\\]]*)\\]\\(([^)]*)\\)$/);\r\n if (imageMatch) {\r\n // Already an image - extract just the URL and replace\r\n const imageUrl = imageMatch[2] || \"\";\r\n view.dispatch({\r\n changes: { from, to, insert: imageUrl },\r\n selection: { anchor: from, head: from + imageUrl.length },\r\n });\r\n return true;\r\n }\r\n\r\n // Check if we're inside an image by looking at surrounding context\r\n const lineStart = state.doc.lineAt(from).from;\r\n const lineEnd = state.doc.lineAt(to).to;\r\n const lineText = state.sliceDoc(lineStart, lineEnd);\r\n\r\n // Find image pattern in line that contains the selection\r\n const imageRegex = /!\\[([^\\]]*)\\]\\(([^)]*)\\)/g;\r\n let match;\r\n while ((match = imageRegex.exec(lineText)) !== null) {\r\n const matchFrom = lineStart + match.index;\r\n const matchTo = matchFrom + match[0].length;\r\n\r\n // Check if selection is within this image\r\n if (from >= matchFrom && to <= matchTo) {\r\n // Remove the image syntax, leave just the URL\r\n const imageUrl = match[2] || \"\";\r\n view.dispatch({\r\n changes: { from: matchFrom, to: matchTo, insert: imageUrl },\r\n selection: { anchor: matchFrom, head: matchFrom + imageUrl.length },\r\n });\r\n return true;\r\n }\r\n }\r\n\r\n if (empty) {\r\n // No selection - insert ![Alt Text]() and place cursor in parentheses\r\n const defaultAlt = \"Alt Text\";\r\n const newText = `![${defaultAlt}]()`;\r\n view.dispatch({\r\n changes: { from, insert: newText },\r\n selection: { anchor: from + defaultAlt.length + 4 }, // After ![Alt Text](\r\n });\r\n } else if (this.urlPattern.test(selectedText)) {\r\n // Selected text is a URL - put it in parentheses with default alt text\r\n const defaultAlt = \"Alt Text\";\r\n const newText = `![${defaultAlt}](${selectedText})`;\r\n view.dispatch({\r\n changes: { from, to, insert: newText },\r\n selection: { anchor: from + 2, head: from + 2 + defaultAlt.length }, // Select \"Alt Text\"\r\n });\r\n } else {\r\n // Selected text is not a URL - use as alt text, cursor in parentheses\r\n const newText = `![${selectedText}]()`;\r\n view.dispatch({\r\n changes: { from, to, insert: newText },\r\n selection: { anchor: from + selectedText.length + 4 }, // After ![text](\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n // Handle Image nodes\r\n if (name === \"Image\") {\r\n const content = view.state.sliceDoc(from, to);\r\n const parsed = parseImageMarkdown(content);\r\n\r\n if (!parsed) return;\r\n\r\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\r\n\r\n // Add line decoration for image\r\n decorations.push(imageMarkDecorations[\"image-block\"].range(from));\r\n\r\n // Always add the image widget below the node\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new ImageWidget(parsed.url, parsed.alt, from, to, parsed.title),\r\n side: 1, // Place after the position\r\n block: false, // Don't create a new line\r\n }).range(to)\r\n );\r\n\r\n if (cursorInRange) {\r\n // Cursor in range: show raw markdown with styling\r\n this.decorateRawImage(node.node, decorations, view);\r\n } else {\r\n // Cursor out of range: hide the raw markdown text\r\n decorations.push(imageMarkDecorations[\"image-hidden\"].range(from, to));\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Decorate raw image markdown when cursor is in range\r\n */\r\n private decorateRawImage(\r\n node: SyntaxNode,\r\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\r\n view: import(\"@codemirror/view\").EditorView\r\n ): void {\r\n // Find and style child nodes\r\n for (let child = node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"URL\") {\r\n decorations.push(imageMarkDecorations[\"image-url\"].range(child.from, child.to));\r\n }\r\n }\r\n\r\n // Style the markers (! [ ] ( ))\r\n const content = view.state.sliceDoc(node.from, node.to);\r\n const bangBracket = node.from; // Position of !\r\n if (content.startsWith(\"![\")) {\r\n decorations.push(imageMarkDecorations[\"image-marker\"].range(bangBracket, bangBracket + 2));\r\n }\r\n\r\n // Find and style closing bracket and parentheses\r\n const altEnd = content.indexOf(\"](\");\r\n if (altEnd !== -1) {\r\n const altStart = 2;\r\n // Style alt text\r\n if (altEnd > altStart) {\r\n decorations.push(imageMarkDecorations[\"image-alt\"].range(node.from + altStart, node.from + altEnd));\r\n }\r\n // Style ]( markers\r\n decorations.push(imageMarkDecorations[\"image-marker\"].range(node.from + altEnd, node.from + altEnd + 2));\r\n // Style closing )\r\n decorations.push(imageMarkDecorations[\"image-marker\"].range(node.to - 1, node.to));\r\n }\r\n }\r\n\r\n /**\r\n * Render image to HTML for preview mode using figure/figcaption\r\n */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n _children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n if (node.name !== \"Image\") return null;\r\n\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const parsed = parseImageMarkdown(content);\r\n if (!parsed) return null;\r\n\r\n const altAttr = ctx.sanitize(parsed.alt);\r\n const titleAttr = parsed.title ? ` title=\"${ctx.sanitize(parsed.title)}\"` : \"\";\r\n const ariaLabel = parsed.title ? ` aria-label=\"${ctx.sanitize(parsed.title)}\"` : \"\";\r\n\r\n let html = `<figure class=\"cm-draftly-image-figure\" role=\"figure\"${ariaLabel}>`;\r\n html += `<img class=\"cm-draftly-image\" src=\"${ctx.sanitize(parsed.url)}\" alt=\"${altAttr}\"${titleAttr} loading=\"lazy\" decoding=\"async\" />`;\r\n\r\n if (parsed.title) {\r\n html += `<figcaption class=\"cm-draftly-image-caption\">${ctx.sanitize(parsed.title)}</figcaption>`;\r\n }\r\n\r\n html += `</figure>`;\r\n return html;\r\n }\r\n}\r\n\r\n/**\r\n * Theme for image styling\r\n */\r\nconst theme = createTheme({\r\n default: {\r\n \".cm-draftly-image-block br\": {\r\n display: \"none\",\r\n },\r\n\r\n // Image markers (! [ ] ( ))\r\n \".cm-draftly-image-marker\": {\r\n color: \"#6a737d\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n // Alt text\r\n \".cm-draftly-image-alt\": {\r\n color: \"#22863a\",\r\n fontStyle: \"italic\",\r\n },\r\n\r\n // URL\r\n \".cm-draftly-image-url\": {\r\n color: \"#0366d6\",\r\n textDecoration: \"underline\",\r\n },\r\n\r\n // Hidden markdown syntax (when cursor is not in range)\r\n \".cm-draftly-image-hidden\": {\r\n display: \"none\",\r\n },\r\n\r\n // Figure container\r\n \".cm-draftly-image-figure\": {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"start\",\r\n maxWidth: \"100%\",\r\n padding: \"0\",\r\n },\r\n\r\n // Image element\r\n \".cm-draftly-image\": {\r\n maxWidth: \"100%\",\r\n maxHeight: \"800px\",\r\n height: \"auto\",\r\n borderRadius: \"4px\",\r\n },\r\n\r\n // Figcaption\r\n \".cm-draftly-image-caption\": {\r\n display: \"block\",\r\n width: \"100%\",\r\n fontSize: \"0.875em\",\r\n color: \"#6a737d\",\r\n marginTop: \"0.5em\",\r\n textAlign: \"center\",\r\n fontStyle: \"italic\",\r\n },\r\n\r\n // Error state\r\n \".cm-draftly-image-error\": {\r\n display: \"inline-block\",\r\n padding: \"0.5em 1em\",\r\n backgroundColor: \"rgba(255, 0, 0, 0.1)\",\r\n color: \"#d73a49\",\r\n borderRadius: \"4px\",\r\n fontSize: \"0.875em\",\r\n fontStyle: \"italic\",\r\n },\r\n },\r\n\r\n dark: {\r\n \".cm-draftly-image-marker\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-image-alt\": {\r\n color: \"#7ee787\",\r\n },\r\n\r\n \".cm-draftly-image-url\": {\r\n color: \"#58a6ff\",\r\n },\r\n\r\n \".cm-draftly-image-caption\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-image-error\": {\r\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\r\n color: \"#f85149\",\r\n },\r\n },\r\n});\r\n","import { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\nimport { tags } from \"@lezer/highlight\";\r\nimport type { MarkdownConfig, InlineParser, BlockParser, Line, BlockContext } from \"@lezer/markdown\";\r\nimport katex from \"katex\";\r\n// @ts-expect-error - raw import for CSS as string\r\nimport katexCss from \"katex/dist/katex.min.css?raw\";\r\n\r\n/**\r\n * Inject KaTeX CSS into the document head (only once)\r\n */\r\nfunction injectKatexStyles(): void {\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(\"draftly-katex-styles\")) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = \"draftly-katex-styles\";\r\n style.textContent = katexCss;\r\n document.head.appendChild(style);\r\n}\r\n\r\n// Inject styles when module loads\r\ninjectKatexStyles();\r\n\r\n// Character codes\r\nconst DOLLAR = 36; // '$'\r\n\r\n/**\r\n * Mark decorations for math syntax elements\r\n */\r\nconst mathMarkDecorations = {\r\n \"math-block\": Decoration.line({ class: \"cm-draftly-math-block\" }),\r\n \"math-inline\": Decoration.mark({ class: \"cm-draftly-math-inline\" }),\r\n \"math-marker\": Decoration.mark({ class: \"cm-draftly-math-marker\" }),\r\n \"math-hidden\": Decoration.mark({ class: \"cm-draftly-math-hidden\" }),\r\n};\r\n\r\n/**\r\n * Render LaTeX to HTML using KaTeX\r\n */\r\nfunction renderMath(latex: string, displayMode: boolean): { html: string; error: string | null } {\r\n try {\r\n const html = katex.renderToString(latex, {\r\n displayMode,\r\n throwOnError: false,\r\n errorColor: \"#d73a49\",\r\n trust: false,\r\n strict: false,\r\n });\r\n return { html, error: null };\r\n } catch (e) {\r\n const errorMsg = e instanceof Error ? e.message : \"Unknown error\";\r\n return { html: \"\", error: errorMsg };\r\n }\r\n}\r\n\r\n/**\r\n * Widget to render inline math\r\n */\r\nclass InlineMathWidget extends WidgetType {\r\n constructor(\r\n readonly latex: string,\r\n readonly from: number,\r\n readonly to: number\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: InlineMathWidget): boolean {\r\n return other.latex === this.latex && other.from === this.from && other.to === this.to;\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n const span = document.createElement(\"span\");\r\n span.className = \"cm-draftly-math-rendered cm-draftly-math-rendered-inline\";\r\n span.style.cursor = \"pointer\";\r\n\r\n const { html, error } = renderMath(this.latex, false);\r\n\r\n if (error) {\r\n span.className += \" cm-draftly-math-error\";\r\n span.textContent = `[Math Error: ${error}]`;\r\n } else {\r\n span.innerHTML = html;\r\n }\r\n\r\n // Click handler to select the raw math text\r\n span.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n });\r\n\r\n return span;\r\n }\r\n\r\n override ignoreEvent(event: Event) {\r\n return event.type !== \"click\";\r\n }\r\n}\r\n\r\n/**\r\n * Widget to render block math (display mode)\r\n */\r\nclass MathBlockWidget extends WidgetType {\r\n constructor(\r\n readonly latex: string,\r\n readonly from: number,\r\n readonly to: number\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: MathBlockWidget): boolean {\r\n return other.latex === this.latex && other.from === this.from && other.to === this.to;\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n const div = document.createElement(\"div\");\r\n div.className = \"cm-draftly-math-rendered cm-draftly-math-rendered-block\";\r\n div.style.cursor = \"pointer\";\r\n\r\n const { html, error } = renderMath(this.latex, true);\r\n\r\n if (error) {\r\n div.className += \" cm-draftly-math-error\";\r\n div.textContent = `[Math Error: ${error}]`;\r\n } else {\r\n div.innerHTML = html;\r\n }\r\n\r\n // Click handler to select the raw math text\r\n div.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n });\r\n\r\n return div;\r\n }\r\n\r\n override ignoreEvent(event: Event) {\r\n return event.type !== \"click\";\r\n }\r\n}\r\n\r\n/**\r\n * Inline parser for inline math: $...$\r\n * Does not match $$ (block math markers)\r\n */\r\nconst inlineMathParser: InlineParser = {\r\n name: \"InlineMath\",\r\n parse(cx, next, pos) {\r\n // Check if we are at a $ character\r\n if (next !== DOLLAR) return -1;\r\n\r\n // Don't match $$ (that's block math)\r\n if (cx.char(pos + 1) === DOLLAR) return -1;\r\n\r\n // Find the closing $\r\n let end = pos + 1;\r\n while (end < cx.end) {\r\n const char = cx.char(end);\r\n if (char === DOLLAR) {\r\n // Found closing $, but make sure it's not $$\r\n if (cx.char(end + 1) !== DOLLAR) {\r\n // Extract the math content (excluding the $ markers)\r\n const content = cx.slice(pos + 1, end);\r\n\r\n // Skip empty math\r\n if (content.trim().length === 0) return -1;\r\n\r\n // Create the element with markers\r\n const openMark = cx.elt(\"InlineMathMark\", pos, pos + 1);\r\n const closeMark = cx.elt(\"InlineMathMark\", end, end + 1);\r\n const inlineMath = cx.elt(\"InlineMath\", pos, end + 1, [openMark, closeMark]);\r\n\r\n return cx.addElement(inlineMath);\r\n }\r\n // Skip $$ for block math\r\n return -1;\r\n }\r\n // Skip escaped characters\r\n if (char === 92 /* backslash */) {\r\n end += 2;\r\n continue;\r\n }\r\n end++;\r\n }\r\n\r\n return -1;\r\n },\r\n};\r\n\r\n/**\r\n * Block parser for math blocks: $$...$$\r\n */\r\nconst mathBlockParser: BlockParser = {\r\n name: \"MathBlock\",\r\n parse(cx: BlockContext, line: Line) {\r\n // Check if line starts with $$\r\n const text = line.text;\r\n const trimmed = text.slice(line.pos).trimStart();\r\n\r\n if (!trimmed.startsWith(\"$$\")) return false;\r\n\r\n // Find the end of the math block\r\n const startLine = cx.lineStart;\r\n let endPos = -1;\r\n let lastLineEnd = startLine + line.text.length;\r\n\r\n // Move past the opening line\r\n while (cx.nextLine()) {\r\n const currentText = line.text;\r\n lastLineEnd = cx.lineStart + currentText.length;\r\n\r\n // Check if this line contains closing $$\r\n if (currentText.trimEnd().endsWith(\"$$\")) {\r\n endPos = lastLineEnd;\r\n // Move past the closing line so subsequent markdown gets parsed\r\n cx.nextLine();\r\n break;\r\n }\r\n }\r\n\r\n if (endPos === -1) {\r\n // No closing found, treat as regular paragraph\r\n return false;\r\n }\r\n\r\n // Create the math block element\r\n const openMark = cx.elt(\"MathBlockMark\", startLine, startLine + text.indexOf(\"$$\") + 2);\r\n const closeMark = cx.elt(\"MathBlockMark\", endPos - 2, endPos);\r\n cx.addElement(cx.elt(\"MathBlock\", startLine, endPos, [openMark, closeMark]));\r\n\r\n return true;\r\n },\r\n};\r\n\r\n/**\r\n * MathPlugin - Renders LaTeX math expressions using KaTeX\r\n *\r\n * Supports:\r\n * - Inline math: $E = mc^2$\r\n * - Block math (display mode):\r\n * $$\r\n * \\int_{-\\infty}^{\\infty} e^{-x^2} dx = \\sqrt{\\pi}\r\n * $$\r\n *\r\n * Behavior:\r\n * - Inline math: Show rendered output when cursor outside, raw LaTeX when inside\r\n * - Block math: Always show rendered output below, hide raw when cursor outside (like ImagePlugin)\r\n */\r\nexport class MathPlugin extends DecorationPlugin {\r\n readonly name = \"math\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 25;\r\n override readonly requiredNodes = [\"InlineMath\", \"MathBlock\", \"InlineMathMark\", \"MathBlockMark\"] as const;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Return markdown parser extensions for math syntax\r\n */\r\n override getMarkdownConfig(): MarkdownConfig {\r\n return {\r\n defineNodes: [\r\n { name: \"InlineMath\", style: tags.emphasis },\r\n { name: \"InlineMathMark\", style: tags.processingInstruction },\r\n { name: \"MathBlock\", block: true },\r\n { name: \"MathBlockMark\", style: tags.processingInstruction },\r\n ],\r\n parseInline: [inlineMathParser],\r\n parseBlock: [mathBlockParser],\r\n };\r\n }\r\n\r\n /**\r\n * Build decorations for math expressions\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n // Handle inline math\r\n if (name === \"InlineMath\") {\r\n const content = view.state.sliceDoc(from, to);\r\n // Extract LaTeX content (remove $ markers)\r\n const latex = content.slice(1, -1);\r\n\r\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\r\n\r\n if (cursorInRange) {\r\n // Show raw math with styled markers\r\n decorations.push(mathMarkDecorations[\"math-inline\"].range(from, to));\r\n\r\n // Style the $ markers\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"InlineMathMark\") {\r\n decorations.push(mathMarkDecorations[\"math-marker\"].range(child.from, child.to));\r\n }\r\n }\r\n } else {\r\n // Replace with rendered math widget\r\n decorations.push(\r\n Decoration.replace({\r\n widget: new InlineMathWidget(latex, from, to),\r\n }).range(from, to)\r\n );\r\n }\r\n }\r\n\r\n // Handle math blocks\r\n if (name === \"MathBlock\") {\r\n const content = view.state.sliceDoc(from, to);\r\n\r\n // Extract LaTeX content (remove $$ markers and trim)\r\n const lines = content.split(\"\\n\");\r\n const latex = lines\r\n .slice(1, -1) // Remove first and last lines (the $$ markers)\r\n .join(\"\\n\")\r\n .trim();\r\n\r\n // If the block is simple (everything on one line), handle differently\r\n const singleLine = !content.includes(\"\\n\");\r\n const latexContent = singleLine ? content.slice(2, -2).trim() : latex;\r\n\r\n const nodeLineStart = view.state.doc.lineAt(from);\r\n const nodeLineEnd = view.state.doc.lineAt(to);\r\n const cursorInRange = ctx.selectionOverlapsRange(nodeLineStart.from, nodeLineEnd.to);\r\n\r\n // Add line decoration for math block\r\n decorations.push(mathMarkDecorations[\"math-block\"].range(from));\r\n\r\n // Always add the math block widget below the node (like image plugin)\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new MathBlockWidget(latexContent, from, to),\r\n side: 1,\r\n block: false,\r\n }).range(to)\r\n );\r\n\r\n for (let i = nodeLineStart.number; i <= nodeLineEnd.number; i++) {\r\n const line = view.state.doc.line(i);\r\n decorations.push(mathMarkDecorations[\"math-block\"].range(line.from));\r\n }\r\n\r\n // Cursor in range: show raw LaTeX with styling\r\n if (cursorInRange) {\r\n // Style the $$ markers\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"MathBlockMark\") {\r\n decorations.push(mathMarkDecorations[\"math-marker\"].range(child.from, child.to));\r\n }\r\n }\r\n } else {\r\n // Cursor out of range: hide the raw math text\r\n decorations.push(mathMarkDecorations[\"math-hidden\"].range(from, to));\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Render math to HTML for preview mode\r\n */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n _children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n if (node.name === \"InlineMath\") {\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const latex = content.slice(1, -1);\r\n const { html, error } = renderMath(latex, false);\r\n\r\n if (error) {\r\n return `<span class=\"cm-draftly-math-error\">[Math Error: ${ctx.sanitize(error)}]</span>`;\r\n }\r\n return `<span class=\"cm-draftly-math-rendered cm-draftly-math-rendered-inline\">${html}</span>`;\r\n }\r\n\r\n if (node.name === \"MathBlock\") {\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const lines = content.split(\"\\n\");\r\n const latex = lines.length > 1 ? lines.slice(1, -1).join(\"\\n\").trim() : content.slice(2, -2).trim();\r\n const { html, error } = renderMath(latex, true);\r\n\r\n if (error) {\r\n return `<div class=\"cm-draftly-math-error\">[Math Error: ${ctx.sanitize(error)}]</div>`;\r\n }\r\n return `<div class=\"cm-draftly-math-rendered cm-draftly-math-rendered-block\">${html}</div>`;\r\n }\r\n\r\n // Hide math markers in preview\r\n if (node.name === \"InlineMathMark\" || node.name === \"MathBlockMark\") {\r\n return \"\";\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Theme for math styling\r\n */\r\nconst theme = createTheme({\r\n default: {\r\n \".cm-draftly-math-block\": {\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n \".cm-draftly-math-block br\": {\r\n display: \"none\",\r\n },\r\n\r\n // Math markers ($ $$)\r\n \".cm-draftly-math-marker\": {\r\n color: \"#6a737d\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n // Inline math styling when editing\r\n \".cm-draftly-math-inline\": {\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.9em\",\r\n },\r\n\r\n // Hidden math syntax (when cursor is not in range)\r\n \".cm-draftly-math-hidden\": {\r\n display: \"none\",\r\n },\r\n\r\n // Hidden line (for multi-line blocks)\r\n \".cm-draftly-hidden-line\": {\r\n display: \"none\",\r\n },\r\n\r\n // Rendered math container (both inline and block)\r\n \".cm-draftly-math-rendered\": {\r\n fontFamily: \"KaTeX_Main, 'Times New Roman', serif\",\r\n },\r\n\r\n // Inline rendered math\r\n \".cm-draftly-math-rendered-inline\": {\r\n display: \"inline\",\r\n verticalAlign: \"baseline\",\r\n },\r\n\r\n // Block rendered math (display mode)\r\n \".cm-draftly-math-rendered-block\": {\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: \"1em 0\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.02)\",\r\n borderRadius: \"4px\",\r\n overflow: \"auto\",\r\n },\r\n\r\n // Math error styling\r\n \".cm-draftly-math-error\": {\r\n display: \"inline-block\",\r\n padding: \"0.25em 0.5em\",\r\n backgroundColor: \"rgba(255, 0, 0, 0.1)\",\r\n color: \"#d73a49\",\r\n borderRadius: \"4px\",\r\n fontSize: \"0.875em\",\r\n fontStyle: \"italic\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n },\r\n\r\n dark: {\r\n \".cm-draftly-math-marker\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-math-rendered-block\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.02)\",\r\n },\r\n\r\n \".cm-draftly-math-error\": {\r\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\r\n color: \"#f85149\",\r\n },\r\n },\r\n});\r\n","import { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme, ThemeEnum } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { tags } from \"@lezer/highlight\";\nimport type { MarkdownConfig, BlockParser, Line, BlockContext } from \"@lezer/markdown\";\nimport mermaid from \"mermaid\";\n\n/**\n * Initialize mermaid with default configuration\n */\nmermaid.initialize({\n startOnLoad: false,\n theme: \"default\",\n suppressErrorRendering: true,\n});\n\n/**\n * Render a mermaid diagram definition to SVG\n */\nlet mermaidCounter = 0;\nasync function renderMermaid(\n definition: string,\n options: Record<string, string> = {},\n defaultTheme: string = \"default\"\n): Promise<{ svg: string; error: string | null }> {\n try {\n const id = `draftly-mermaid-${mermaidCounter++}`;\n let finalDefinition = definition;\n\n // transform theme to mermaid config\n const mermaidConfig: Record<string, string> = {};\n if (options.theme) {\n mermaidConfig.theme = options.theme;\n } else {\n mermaidConfig.theme = defaultTheme;\n }\n\n // If we have config to apply, prepend the directive\n if (Object.keys(mermaidConfig).length > 0) {\n const jsonConfig = JSON.stringify(mermaidConfig);\n // Mermaid directive format: %%{init: { ... }}%%\n finalDefinition = `%%{init: ${jsonConfig} }%%\\n${definition}`;\n }\n\n const { svg } = await mermaid.render(id, finalDefinition);\n return { svg, error: null };\n } catch (e) {\n const errorMsg = e instanceof Error ? e.message : \"Unknown error\";\n return { svg: \"\", error: errorMsg };\n }\n}\n\n/**\n * Helper to parse attributes from fence line\n * Example: ```mermaid theme=\"dark\" scale=\"2\"\n */\nfunction parseAttributes(fenceLine: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n // Match key=\"value\" or key='value'\n const regex = /(\\w+)=[\"']([^\"']*)[\"']/g;\n let match;\n while ((match = regex.exec(fenceLine)) !== null && match[1] && match[2]) {\n attributes[match[1]] = match[2];\n }\n return attributes;\n}\n\n/**\n * Mark decorations for mermaid syntax elements\n */\nconst mermaidMarkDecorations = {\n \"mermaid-block-start\": Decoration.line({ class: \"cm-draftly-mermaid-block-start\" }),\n \"mermaid-block-end\": Decoration.line({ class: \"cm-draftly-mermaid-block-end\" }),\n \"mermaid-block\": Decoration.line({ class: \"cm-draftly-mermaid-block\" }),\n \"mermaid-block-rendered\": Decoration.line({ class: \"cm-draftly-mermaid-block-rendered\" }),\n \"mermaid-marker\": Decoration.mark({ class: \"cm-draftly-mermaid-marker\" }),\n \"mermaid-hidden\": Decoration.mark({ class: \"cm-draftly-mermaid-hidden\" }),\n};\n\n/**\n * Widget to render mermaid block diagrams\n */\nclass MermaidBlockWidget extends WidgetType {\n constructor(\n readonly definition: string,\n readonly attributes: Record<string, string>,\n readonly defaultTheme: string,\n readonly from: number,\n readonly to: number\n ) {\n super();\n }\n\n override eq(other: MermaidBlockWidget): boolean {\n return (\n other.definition === this.definition &&\n JSON.stringify(other.attributes) === JSON.stringify(this.attributes) &&\n other.defaultTheme === this.defaultTheme &&\n other.from === this.from &&\n other.to === this.to\n );\n }\n\n toDOM(view: EditorView) {\n const div = document.createElement(\"div\");\n div.className = \"cm-draftly-mermaid-rendered\";\n div.style.cursor = \"pointer\";\n\n // Show loading state initially\n div.innerHTML = `<div class=\"cm-draftly-mermaid-loading\">Rendering diagram…</div>`;\n\n // Render mermaid asynchronously\n // Render mermaid asynchronously\n renderMermaid(this.definition, this.attributes, this.defaultTheme).then(({ svg, error }) => {\n if (error) {\n div.className += \" cm-draftly-mermaid-error\";\n div.innerHTML = `<span>[Mermaid Error: ${error}]</span>`;\n } else {\n div.innerHTML = svg;\n }\n });\n\n // Click handler to select the raw mermaid text\n div.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n view.dispatch({\n selection: { anchor: this.from, head: this.to },\n scrollIntoView: true,\n });\n view.focus();\n });\n\n return div;\n }\n\n override ignoreEvent(event: Event) {\n return event.type !== \"click\";\n }\n}\n\n/**\n * Block parser for mermaid blocks:\n * ```mermaid\n * graph TD\n * A --> B\n * ```\n */\nconst mermaidBlockParser: BlockParser = {\n name: \"MermaidBlock\",\n before: \"FencedCode\",\n parse(cx: BlockContext, line: Line) {\n const text = line.text;\n const trimmed = text.slice(line.pos).trimStart();\n\n // Must start with ```mermaid\n if (!trimmed.startsWith(\"```mermaid\")) return false;\n\n // Ensure nothing meaningful after ```mermaid (allow trailing whitespace)\n // We now allow attributes, so we don't strictly check for empty rest\n // const rest = trimmed.slice(10);\n // if (rest.trim().length > 0) return false;\n\n const startLine = cx.lineStart;\n let endPos = -1;\n let closeBacktickStart = -1;\n\n // Move past the opening line and find the closing ```\n while (cx.nextLine()) {\n const currentText = line.text;\n const currentLineStart = cx.lineStart;\n const lastLineEnd = currentLineStart + currentText.length;\n\n // Check if this line is a closing ``` (only backticks, possibly with whitespace)\n const trimmedLine = currentText.trim();\n if (trimmedLine === \"```\") {\n endPos = lastLineEnd;\n closeBacktickStart = currentLineStart + currentText.indexOf(\"```\");\n // Move past the closing line so subsequent markdown gets parsed\n cx.nextLine();\n break;\n }\n }\n\n if (endPos === -1) {\n // No closing found, treat as regular text\n return false;\n }\n\n // Create the mermaid block element with markers\n const openMarkEnd = startLine + text.indexOf(\"```mermaid\") + 10;\n const openMark = cx.elt(\"MermaidBlockMark\", startLine, openMarkEnd);\n const closeMark = cx.elt(\"MermaidBlockMark\", closeBacktickStart, closeBacktickStart + 3);\n\n cx.addElement(cx.elt(\"MermaidBlock\", startLine, endPos, [openMark, closeMark]));\n\n return true;\n },\n};\n\n/**\n * MermaidPlugin - Renders mermaid diagrams in the editor\n *\n * Supports block mermaid syntax:\n * ```mermaid\n * graph TD\n * A --> B\n * ```\n *\n * Behavior:\n * - Always show rendered diagram below the block\n * - Hide raw definition when cursor is outside the block\n * - Show raw definition with styled markers when cursor is inside\n */\nexport class MermaidPlugin extends DecorationPlugin {\n readonly name = \"mermaid\";\n readonly version = \"1.0.0\";\n override decorationPriority = 25;\n override readonly requiredNodes = [\"MermaidBlock\", \"MermaidBlockMark\"] as const;\n\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Return markdown parser extensions for mermaid syntax\n */\n override getMarkdownConfig(): MarkdownConfig {\n return {\n defineNodes: [\n { name: \"MermaidBlock\", block: true },\n { name: \"MermaidBlockMark\", style: tags.processingInstruction },\n ],\n parseBlock: [mermaidBlockParser],\n };\n }\n\n /**\n * Build decorations for mermaid blocks\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n const config = this.context?.config;\n const currentTheme = config?.theme === ThemeEnum.DARK ? \"dark\" : \"default\";\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n if (name === \"MermaidBlock\") {\n const content = view.state.sliceDoc(from, to);\n\n // Extract mermaid definition (remove ```mermaid and ``` markers)\n const lines = content.split(\"\\n\");\n const definition = lines\n .slice(1, -1) // Remove first and last lines (the markers)\n .join(\"\\n\")\n .trim();\n\n const docLines = content.split(\"\\n\");\n const fenceLine = docLines[0] || \"\";\n const attributes = parseAttributes(fenceLine);\n\n const nodeLineStart = view.state.doc.lineAt(from);\n const nodeLineEnd = view.state.doc.lineAt(to);\n const cursorInRange = ctx.selectionOverlapsRange(nodeLineStart.from, nodeLineEnd.to);\n\n // Calculate line number width for mermaid block\n const totalCodeLines = nodeLineEnd.number - nodeLineStart.number - 1;\n const lineNumWidth = String(totalCodeLines).length;\n let codeLineIndex = 1;\n\n // Add line decorations for mermaid block\n for (let i = nodeLineStart.number; i <= nodeLineEnd.number; i++) {\n const line = view.state.doc.line(i);\n const isFenceLine = i === nodeLineStart.number || i === nodeLineEnd.number;\n const relativeLineNum = codeLineIndex;\n\n decorations.push(mermaidMarkDecorations[\"mermaid-block\"].range(line.from));\n if (!cursorInRange) decorations.push(mermaidMarkDecorations[\"mermaid-block-rendered\"].range(line.from));\n\n if (i === nodeLineStart.number)\n decorations.push(mermaidMarkDecorations[\"mermaid-block-start\"].range(line.from));\n\n if (i === nodeLineEnd.number)\n decorations.push(mermaidMarkDecorations[\"mermaid-block-end\"].range(line.from));\n\n if (!isFenceLine) {\n decorations.push(\n Decoration.line({\n attributes: {\n \"data-line-num\": String(relativeLineNum),\n style: `--line-num-width: ${lineNumWidth}ch`,\n },\n }).range(line.from)\n );\n }\n\n // Increment code line index (only for non-fence lines)\n if (!isFenceLine) {\n codeLineIndex++;\n }\n }\n\n // Always add the rendered widget below the block\n decorations.push(\n Decoration.widget({\n widget: new MermaidBlockWidget(definition, attributes, currentTheme, from, to),\n side: 1,\n block: false,\n }).range(to)\n );\n\n if (cursorInRange) {\n // Cursor in range: show raw definition with styled markers\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"MermaidBlockMark\") {\n decorations.push(mermaidMarkDecorations[\"mermaid-marker\"].range(child.from, child.to));\n }\n }\n } else {\n // Cursor out of range: hide the raw text\n decorations.push(mermaidMarkDecorations[\"mermaid-hidden\"].range(from, to));\n }\n }\n },\n });\n }\n\n /**\n * Render mermaid to HTML for preview mode\n *\n * Renders the actual mermaid diagram to SVG HTML\n */\n override async renderToHTML(\n node: SyntaxNode,\n _children: string,\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\n ): Promise<string | null> {\n if (node.name === \"MermaidBlock\") {\n const content = ctx.sliceDoc(node.from, node.to);\n const lines = content.split(\"\\n\");\n const definition = lines.length > 1 ? lines.slice(1, -1).join(\"\\n\").trim() : \"\";\n\n const fenceLine = lines[0] || \"\";\n const attributes = parseAttributes(fenceLine);\n\n const config = this.context?.config;\n const currentTheme = config?.theme === ThemeEnum.DARK ? \"dark\" : \"default\";\n\n const { svg, error } = await renderMermaid(definition, attributes, currentTheme);\n\n if (error) {\n return `<div class=\"cm-draftly-mermaid-error\">${ctx.sanitize(`[Mermaid Error: ${error}]`)}</div>`;\n }\n\n return `<div class=\"cm-draftly-mermaid-rendered\">${svg}</div>`;\n }\n\n // Hide mermaid markers in preview\n if (node.name === \"MermaidBlockMark\") {\n return \"\";\n }\n\n return null;\n }\n}\n\n/**\n * Theme for mermaid styling\n */\nconst theme = createTheme({\n default: {\n // Raw mermaid block lines (monospace)\n \".cm-draftly-mermaid-block:not(.cm-draftly-mermaid-block-rendered)\": {\n \"--radius\": \"0.375rem\",\n position: \"relative\",\n\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.9rem\",\n backgroundColor: \"rgba(0, 0, 0, 0.03)\",\n padding: \"0 1rem !important\",\n paddingLeft: \"calc(var(--line-num-width, 2ch) + 1rem) !important\",\n lineHeight: \"1.5\",\n borderLeft: \"1px solid var(--color-border)\",\n borderRight: \"1px solid var(--color-border)\",\n },\n\n \".cm-draftly-mermaid-block-start:not(.cm-draftly-mermaid-block-rendered)\": {\n overflow: \"hidden\",\n borderTopLeftRadius: \"var(--radius)\",\n borderTopRightRadius: \"var(--radius)\",\n borderTop: \"1px solid var(--color-border)\",\n },\n\n \".cm-draftly-mermaid-block-end:not(.cm-draftly-mermaid-block-rendered)\": {\n overflow: \"hidden\",\n borderBottomLeftRadius: \"var(--radius)\",\n borderBottomRightRadius: \"var(--radius)\",\n borderBottom: \"1px solid var(--color-border)\",\n },\n\n \".cm-draftly-mermaid-block:not(.cm-draftly-mermaid-block-rendered)::before\": {\n content: \"attr(data-line-num)\",\n position: \"absolute\",\n left: \"0.5rem\",\n top: \"0.2rem\",\n width: \"var(--line-num-width, 2ch)\",\n textAlign: \"right\",\n color: \"#6a737d\",\n opacity: \"0.6\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85rem\",\n userSelect: \"none\",\n },\n\n \".cm-draftly-mermaid-block.cm-draftly-mermaid-block-rendered br\": {\n display: \"none\",\n },\n\n // Mermaid markers (```mermaid / ```)\n \".cm-draftly-mermaid-marker\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n // Hidden mermaid syntax (when cursor is not in range)\n \".cm-draftly-mermaid-hidden\": {\n display: \"none\",\n },\n\n // Rendered mermaid container\n \".cm-draftly-mermaid-rendered\": {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: \"1em 0\",\n borderRadius: \"4px\",\n overflow: \"auto\",\n },\n\n // SVG inside rendered container\n \".cm-draftly-mermaid-rendered svg\": {\n maxWidth: \"100%\",\n height: \"auto\",\n aspectRatio: \"auto\",\n },\n\n // Loading state\n \".cm-draftly-mermaid-loading\": {\n display: \"inline-block\",\n padding: \"0.5em 1em\",\n color: \"#6a737d\",\n fontSize: \"0.875em\",\n fontStyle: \"italic\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n // Error styling\n \".cm-draftly-mermaid-error\": {\n display: \"inline-block\",\n padding: \"0.25em 0.5em\",\n backgroundColor: \"rgba(255, 0, 0, 0.1)\",\n color: \"#d73a49\",\n borderRadius: \"4px\",\n fontSize: \"0.875em\",\n fontStyle: \"italic\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n },\n\n dark: {\n \".cm-draftly-mermaid-block:not(.cm-draftly-mermaid-block-rendered)\": {\n backgroundColor: \"rgba(255, 255, 255, 0.03)\",\n },\n\n \".cm-draftly-mermaid-marker\": {\n color: \"#8b949e\",\n },\n\n \".cm-draftly-mermaid-loading\": {\n color: \"#8b949e\",\n },\n\n \".cm-draftly-mermaid-error\": {\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\n color: \"#f85149\",\n },\n },\n});\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme, toggleMarkdownStyle } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\nimport { highlightCode } from \"@lezer/highlight\";\r\nimport { languages } from \"@codemirror/language-data\";\r\nimport { classHighlighter } from \"@lezer/highlight\";\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Copy icon SVG (clipboard) */\r\nconst COPY_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\r\n\r\n/** Checkmark icon SVG (success state) */\r\nconst CHECK_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\r\n\r\n/** Delay before resetting copy button state (ms) */\r\nconst COPY_RESET_DELAY = 2000;\r\n\r\n// ============================================================================\r\n// Decorations\r\n// ============================================================================\r\n\r\n/** Mark and line decorations for code elements */\r\nconst codeMarkDecorations = {\r\n // Inline code\r\n \"inline-code\": Decoration.mark({ class: \"cm-draftly-code-inline\" }),\r\n \"inline-mark\": Decoration.replace({}),\r\n\r\n // Fenced code block\r\n \"code-block-line\": Decoration.line({ class: \"cm-draftly-code-block-line\" }),\r\n \"code-block-line-start\": Decoration.line({ class: \"cm-draftly-code-block-line-start\" }),\r\n \"code-block-line-end\": Decoration.line({ class: \"cm-draftly-code-block-line-end\" }),\r\n \"code-fence\": Decoration.mark({ class: \"cm-draftly-code-fence\" }),\r\n \"code-hidden\": Decoration.replace({}),\r\n\r\n // Highlights\r\n \"code-line-highlight\": Decoration.line({ class: \"cm-draftly-code-line-highlight\" }),\r\n \"code-text-highlight\": Decoration.mark({ class: \"cm-draftly-code-text-highlight\" }),\r\n};\r\n\r\n/**\r\n * Text highlight definition\r\n * Matches text or regex patterns with optional instance selection\r\n */\r\nexport interface TextHighlight {\r\n /** The pattern to match (regex without slashes) */\r\n pattern: string;\r\n /** Specific instances to highlight (e.g., [3,5] or range [3,4,5]) */\r\n instances?: number[];\r\n}\r\n\r\n/**\r\n * Properties extracted from CodeInfo string\r\n *\r\n * Example: ```tsx line-numbers{5} title=\"hello.tsx\" caption=\"Example\" copy {2-4,5} /Hello/3-5\r\n */\r\nexport interface CodeBlockProperties {\r\n /** Language identifier (first token) */\r\n language: string;\r\n /** Show line numbers, optionally starting from a specific number */\r\n lineNumbers?: number | boolean;\r\n /** Title to display */\r\n title?: string;\r\n /** Caption to display */\r\n caption?: string;\r\n /** Show copy button */\r\n copy?: boolean;\r\n /** Lines to highlight (e.g., [2,3,4,5,9]) */\r\n highlightLines?: number[];\r\n /** Text patterns to highlight with optional instance selection */\r\n highlightText?: TextHighlight[];\r\n}\r\n\r\n// ============================================================================\r\n// Widgets\r\n// ============================================================================\r\n\r\n/**\r\n * Widget for code block header.\r\n * Displays title or language on the left, and a copy button on the right.\r\n */\r\nclass CodeBlockHeaderWidget extends WidgetType {\r\n constructor(\r\n private props: CodeBlockProperties,\r\n private codeContent: string\r\n ) {\r\n super();\r\n }\r\n\r\n /** Creates the header DOM element with title/language and optional copy button. */\r\n toDOM(): HTMLElement {\r\n const header = document.createElement(\"div\");\r\n header.className = \"cm-draftly-code-header\";\r\n\r\n // Left side: title or language\r\n const leftSide = document.createElement(\"div\");\r\n leftSide.className = \"cm-draftly-code-header-left\";\r\n\r\n if (this.props.title) {\r\n const title = document.createElement(\"span\");\r\n title.className = \"cm-draftly-code-header-title\";\r\n title.textContent = this.props.title;\r\n leftSide.appendChild(title);\r\n } else if (this.props.language) {\r\n const lang = document.createElement(\"span\");\r\n lang.className = \"cm-draftly-code-header-lang\";\r\n lang.textContent = this.props.language;\r\n leftSide.appendChild(lang);\r\n }\r\n\r\n header.appendChild(leftSide);\r\n\r\n // Right side: copy button\r\n if (this.props.copy !== false) {\r\n const rightSide = document.createElement(\"div\");\r\n rightSide.className = \"cm-draftly-code-header-right\";\r\n\r\n const copyBtn = document.createElement(\"button\");\r\n copyBtn.className = \"cm-draftly-code-copy-btn\";\r\n copyBtn.type = \"button\";\r\n copyBtn.title = \"Copy code\";\r\n copyBtn.innerHTML = COPY_ICON;\r\n\r\n copyBtn.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n navigator.clipboard.writeText(this.codeContent).then(() => {\r\n copyBtn.classList.add(\"copied\");\r\n copyBtn.innerHTML = CHECK_ICON;\r\n setTimeout(() => {\r\n copyBtn.classList.remove(\"copied\");\r\n copyBtn.innerHTML = COPY_ICON;\r\n }, COPY_RESET_DELAY);\r\n });\r\n });\r\n\r\n rightSide.appendChild(copyBtn);\r\n header.appendChild(rightSide);\r\n }\r\n\r\n return header;\r\n }\r\n\r\n /** Checks equality for widget reuse optimization. */\r\n override eq(other: CodeBlockHeaderWidget): boolean {\r\n return (\r\n this.props.title === other.props.title &&\r\n this.props.language === other.props.language &&\r\n this.props.copy === other.props.copy &&\r\n this.codeContent === other.codeContent\r\n );\r\n }\r\n\r\n /** Allow click events to propagate for copy button interaction. */\r\n override ignoreEvent(): boolean {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Widget for code block caption.\r\n * Displays descriptive text below the code block.\r\n */\r\nclass CodeBlockCaptionWidget extends WidgetType {\r\n constructor(private caption: string) {\r\n super();\r\n }\r\n\r\n /** Creates the caption DOM element. */\r\n toDOM(): HTMLElement {\r\n const captionEl = document.createElement(\"div\");\r\n captionEl.className = \"cm-draftly-code-caption\";\r\n captionEl.textContent = this.caption;\r\n return captionEl;\r\n }\r\n\r\n /** Checks equality for widget reuse optimization. */\r\n override eq(other: CodeBlockCaptionWidget): boolean {\r\n return this.caption === other.caption;\r\n }\r\n\r\n /** Allow click events to propagate for caption interaction. */\r\n override ignoreEvent(): boolean {\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Plugin\r\n// ============================================================================\r\n\r\n/**\r\n * CodePlugin - Handles inline code and fenced code blocks.\r\n *\r\n * **Inline code:** `code`\r\n * Hides backticks when cursor is not in range.\r\n *\r\n * **Fenced code blocks:**\r\n * Supports syntax highlighting, line numbers, line/text highlighting,\r\n * title, caption, and copy button via CodeInfo properties.\r\n *\r\n * @example\r\n * ```tsx line-numbers{5} title=\"example.tsx\" {2-4} /pattern/\r\n * const x = 1;\r\n * ```\r\n */\r\nexport class CodePlugin extends DecorationPlugin {\r\n readonly name = \"code\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 25;\r\n override readonly requiredNodes = [\"InlineCode\", \"FencedCode\", \"CodeMark\", \"CodeInfo\", \"CodeText\"] as const;\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for code formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-e\",\r\n run: toggleMarkdownStyle(\"`\"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-Shift-e\",\r\n run: (view) => this.toggleCodeBlock(view),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Toggle code block on current line or selected lines\r\n */\r\n private toggleCodeBlock(view: EditorView): boolean {\r\n const { state } = view;\r\n const { from, to } = state.selection.main;\r\n\r\n // Get all lines in selection\r\n const startLine = state.doc.lineAt(from);\r\n const endLine = state.doc.lineAt(to);\r\n\r\n // Check if lines are already in a code block\r\n const prevLineNum = startLine.number > 1 ? startLine.number - 1 : startLine.number;\r\n const nextLineNum = endLine.number < state.doc.lines ? endLine.number + 1 : endLine.number;\r\n\r\n const prevLine = state.doc.line(prevLineNum);\r\n const nextLine = state.doc.line(nextLineNum);\r\n\r\n const isWrapped =\r\n prevLine.text.trim().startsWith(\"```\") &&\r\n nextLine.text.trim() === \"```\" &&\r\n prevLineNum !== startLine.number &&\r\n nextLineNum !== endLine.number;\r\n\r\n if (isWrapped) {\r\n // Remove the fence lines\r\n view.dispatch({\r\n changes: [\r\n { from: prevLine.from, to: prevLine.to + 1, insert: \"\" }, // Remove opening fence + newline\r\n { from: nextLine.from - 1, to: nextLine.to, insert: \"\" }, // Remove newline + closing fence\r\n ],\r\n });\r\n } else {\r\n // Wrap with code fence\r\n const openFence = \"```\\n\";\r\n const closeFence = \"\\n```\";\r\n\r\n view.dispatch({\r\n changes: [\r\n { from: startLine.from, insert: openFence },\r\n { from: endLine.to, insert: closeFence },\r\n ],\r\n selection: { anchor: startLine.from + openFence.length, head: endLine.to + openFence.length },\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Parse CodeInfo string into structured properties\r\n *\r\n * @param codeInfo - The raw CodeInfo string (e.g., \"tsx line-numbers{5} title=\\\"hello.tsx\\\" copy {2-4,5} /Hello/3-5\")\r\n * @returns Parsed CodeBlockProperties object\r\n *\r\n * @example\r\n * ```typescript\r\n * parseCodeInfo(\"tsx line-numbers{5} title=\\\"hello.tsx\\\" copy {2-4,5} /Hello/3-5\")\r\n * ```\r\n *\r\n * Returns:\r\n * ```json\r\n * {\r\n * language: \"tsx\",\r\n * lineNumbers: 5,\r\n * title: \"hello.tsx\",\r\n * copy: true,\r\n * highlightLines: [2,3,4,5],\r\n * highlightText: [{ pattern: \"Hello\", instances: [3,4,5] }]\r\n * }\r\n * ```\r\n */\r\n parseCodeInfo(codeInfo: string): CodeBlockProperties {\r\n const props: CodeBlockProperties = { language: \"\" };\r\n\r\n if (!codeInfo || !codeInfo.trim()) {\r\n return props;\r\n }\r\n\r\n let remaining = codeInfo.trim();\r\n\r\n // Extract language (first word before any special tokens)\r\n const langMatch = remaining.match(/^(\\w+)/);\r\n if (langMatch && langMatch[1]) {\r\n props.language = langMatch[1];\r\n remaining = remaining.slice(langMatch[0].length).trim();\r\n }\r\n\r\n // Extract quoted values (title=\"...\" caption=\"...\")\r\n const quotedPattern = /(\\w+)=\"([^\"]*)\"/g;\r\n let quotedMatch;\r\n while ((quotedMatch = quotedPattern.exec(remaining)) !== null) {\r\n const key = quotedMatch[1]?.toLowerCase();\r\n const value = quotedMatch[2];\r\n\r\n if (key === \"title\" && value !== undefined) {\r\n props.title = value;\r\n } else if (key === \"caption\" && value !== undefined) {\r\n props.caption = value;\r\n }\r\n }\r\n // Remove matched quoted values\r\n remaining = remaining.replace(quotedPattern, \"\").trim();\r\n\r\n // Check for line-numbers with optional start value\r\n const lineNumbersMatch = remaining.match(/line-numbers(?:\\{(\\d+)\\})?/);\r\n if (lineNumbersMatch) {\r\n if (lineNumbersMatch[1]) {\r\n props.lineNumbers = parseInt(lineNumbersMatch[1], 10);\r\n } else {\r\n props.lineNumbers = true;\r\n }\r\n remaining = remaining.replace(lineNumbersMatch[0], \"\").trim();\r\n }\r\n\r\n // Check for copy flag\r\n if (/\\bcopy\\b/.test(remaining)) {\r\n props.copy = true;\r\n remaining = remaining.replace(/\\bcopy\\b/, \"\").trim();\r\n }\r\n\r\n // Extract line highlights {2-4,5,9}\r\n const lineHighlightMatch = remaining.match(/\\{([^}]+)\\}/);\r\n if (lineHighlightMatch && lineHighlightMatch[1]) {\r\n const highlightLines: number[] = [];\r\n const parts = lineHighlightMatch[1].split(\",\");\r\n\r\n for (const part of parts) {\r\n const trimmed = part.trim();\r\n const rangeMatch = trimmed.match(/^(\\d+)-(\\d+)$/);\r\n\r\n if (rangeMatch && rangeMatch[1] && rangeMatch[2]) {\r\n // Range: 2-4 -> [2,3,4]\r\n const start = parseInt(rangeMatch[1], 10);\r\n const end = parseInt(rangeMatch[2], 10);\r\n for (let i = start; i <= end; i++) {\r\n highlightLines.push(i);\r\n }\r\n } else if (/^\\d+$/.test(trimmed)) {\r\n // Individual number\r\n highlightLines.push(parseInt(trimmed, 10));\r\n }\r\n }\r\n\r\n if (highlightLines.length > 0) {\r\n props.highlightLines = highlightLines;\r\n }\r\n remaining = remaining.replace(lineHighlightMatch[0], \"\").trim();\r\n }\r\n\r\n // Extract text/regex highlights /pattern/ or /pattern/3-5 or /pattern/3,5\r\n const textHighlightPattern = /\\/([^/]+)\\/(?:(\\d+(?:-\\d+)?(?:,\\d+(?:-\\d+)?)*))?/g;\r\n let textMatch;\r\n const highlightText: TextHighlight[] = [];\r\n\r\n while ((textMatch = textHighlightPattern.exec(remaining)) !== null) {\r\n if (!textMatch[1]) continue;\r\n const highlight: TextHighlight = {\r\n pattern: textMatch[1],\r\n };\r\n\r\n // Parse instance selection if present\r\n if (textMatch[2]) {\r\n const instanceStr = textMatch[2];\r\n const instances: number[] = [];\r\n const instanceParts = instanceStr.split(\",\");\r\n\r\n for (const part of instanceParts) {\r\n const rangeMatch = part.match(/^(\\d+)-(\\d+)$/);\r\n if (rangeMatch && rangeMatch[1] && rangeMatch[2]) {\r\n // Range: 3-5 -> [3,4,5]\r\n const start = parseInt(rangeMatch[1], 10);\r\n const end = parseInt(rangeMatch[2], 10);\r\n for (let i = start; i <= end; i++) {\r\n instances.push(i);\r\n }\r\n } else if (/^\\d+$/.test(part)) {\r\n instances.push(parseInt(part, 10));\r\n }\r\n }\r\n\r\n if (instances.length > 0) {\r\n highlight.instances = instances;\r\n }\r\n }\r\n\r\n highlightText.push(highlight);\r\n }\r\n\r\n if (highlightText.length > 0) {\r\n props.highlightText = highlightText;\r\n }\r\n\r\n return props;\r\n }\r\n\r\n /**\r\n * Build decorations for inline code and fenced code blocks.\r\n * Handles line numbers, highlights, header/caption widgets, and fence visibility.\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n // Handle inline code\r\n if (name === \"InlineCode\") {\r\n // Add inline code styling\r\n decorations.push(codeMarkDecorations[\"inline-code\"].range(from, to));\r\n\r\n // Hide backticks when cursor is not in range\r\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\r\n if (!cursorInRange) {\r\n // Find the CodeMark children (backticks)\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"CodeMark\") {\r\n decorations.push(codeMarkDecorations[\"inline-mark\"].range(child.from, child.to));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Handle fenced code blocks\r\n if (name === \"FencedCode\") {\r\n const nodeLineStart = view.state.doc.lineAt(from);\r\n const nodeLineEnd = view.state.doc.lineAt(to);\r\n const cursorInRange = ctx.selectionOverlapsRange(nodeLineStart.from, nodeLineEnd.to);\r\n\r\n // Extract properties from CodeInfo\r\n let infoProps: CodeBlockProperties = { language: \"\" };\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"CodeInfo\") {\r\n infoProps = this.parseCodeInfo(view.state.sliceDoc(child.from, child.to).trim());\r\n break;\r\n }\r\n }\r\n\r\n // Calculate line number width for styling (if line numbers enabled)\r\n const totalCodeLines = nodeLineEnd.number - nodeLineStart.number - 1; // Exclude fence lines\r\n const startLineNum = typeof infoProps.lineNumbers === \"number\" ? infoProps.lineNumbers : 1;\r\n const maxLineNum = startLineNum + totalCodeLines - 1;\r\n const lineNumWidth = Math.max(String(maxLineNum).length, String(startLineNum).length);\r\n\r\n // Track code line index (excluding fence lines)\r\n let codeLineIndex = 0;\r\n\r\n // Extract code content for copy button\r\n let codeContent = \"\";\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"CodeText\") {\r\n codeContent = view.state.sliceDoc(child.from, child.to);\r\n break;\r\n }\r\n }\r\n\r\n const shouldShowHeader = !cursorInRange && (infoProps.title || infoProps.copy || infoProps.language);\r\n const shouldShowCaption = !cursorInRange && infoProps.caption;\r\n\r\n // Add header widget when cursor not in range and (title, copy, or language is set)\r\n if (shouldShowHeader) {\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new CodeBlockHeaderWidget(infoProps, codeContent),\r\n block: false,\r\n }).range(nodeLineStart.from)\r\n );\r\n }\r\n\r\n // Add line decorations for all lines in the block\r\n for (let i = nodeLineStart.number; i <= nodeLineEnd.number; i++) {\r\n const line = view.state.doc.line(i);\r\n const isFenceLine = i === nodeLineStart.number || i === nodeLineEnd.number;\r\n const relativeLineNum = startLineNum + codeLineIndex;\r\n\r\n // Base line decoration\r\n decorations.push(codeMarkDecorations[\"code-block-line\"].range(line.from));\r\n\r\n // Add start/end line decorations\r\n if (i === nodeLineStart.number) {\r\n decorations.push(codeMarkDecorations[\"code-block-line-start\"].range(line.from));\r\n // Add class for header presence\r\n if (shouldShowHeader) {\r\n decorations.push(\r\n Decoration.line({\r\n class: \"cm-draftly-code-block-has-header\",\r\n }).range(line.from)\r\n );\r\n }\r\n }\r\n if (i === nodeLineEnd.number) {\r\n decorations.push(codeMarkDecorations[\"code-block-line-end\"].range(line.from));\r\n // Add class for caption presence\r\n if (shouldShowCaption) {\r\n decorations.push(\r\n Decoration.line({\r\n class: \"cm-draftly-code-block-has-caption\",\r\n }).range(line.from)\r\n );\r\n }\r\n }\r\n\r\n // Line numbers (only for code lines, not fence lines)\r\n if (!isFenceLine && infoProps.lineNumbers) {\r\n decorations.push(\r\n Decoration.line({\r\n class: \"cm-draftly-code-line-numbered\",\r\n attributes: {\r\n \"data-line-num\": String(relativeLineNum),\r\n style: `--line-num-width: ${lineNumWidth}ch`,\r\n },\r\n }).range(line.from)\r\n );\r\n }\r\n\r\n // Line highlight (check if this line should be highlighted)\r\n if (!isFenceLine && infoProps.highlightLines) {\r\n if (infoProps.highlightLines.includes(codeLineIndex + 1)) {\r\n decorations.push(codeMarkDecorations[\"code-line-highlight\"].range(line.from));\r\n }\r\n }\r\n\r\n // Text highlights\r\n if (!isFenceLine && infoProps.highlightText && infoProps.highlightText.length > 0) {\r\n const lineText = view.state.sliceDoc(line.from, line.to);\r\n\r\n for (const textHighlight of infoProps.highlightText) {\r\n try {\r\n const regex = new RegExp(textHighlight.pattern, \"g\");\r\n let match;\r\n let matchIndex = 0;\r\n\r\n while ((match = regex.exec(lineText)) !== null) {\r\n matchIndex++;\r\n\r\n // Check if this instance should be highlighted\r\n const shouldHighlight = !textHighlight.instances || textHighlight.instances.includes(matchIndex);\r\n\r\n if (shouldHighlight) {\r\n const matchFrom = line.from + match.index;\r\n const matchTo = matchFrom + match[0].length;\r\n decorations.push(codeMarkDecorations[\"code-text-highlight\"].range(matchFrom, matchTo));\r\n }\r\n }\r\n } catch {\r\n // Invalid regex, skip\r\n }\r\n }\r\n }\r\n\r\n // Increment code line index (only for non-fence lines)\r\n if (!isFenceLine) {\r\n codeLineIndex++;\r\n }\r\n }\r\n\r\n // Find CodeMark and CodeInfo children\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"CodeMark\" || child.name === \"CodeInfo\") {\r\n if (cursorInRange) {\r\n // Show fence markers with styling when cursor is in range\r\n decorations.push(codeMarkDecorations[\"code-fence\"].range(child.from, child.to));\r\n } else {\r\n // Hide fence markers when cursor is not in range\r\n decorations.push(codeMarkDecorations[\"code-hidden\"].range(child.from, child.to));\r\n }\r\n }\r\n }\r\n\r\n // Add caption widget when cursor not in range and caption is set\r\n if (!cursorInRange && infoProps.caption) {\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new CodeBlockCaptionWidget(infoProps.caption),\r\n block: false,\r\n side: 1, // After the content\r\n }).range(nodeLineEnd.to)\r\n );\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Render code elements to HTML for static preview.\r\n * Applies syntax highlighting using @lezer/highlight.\r\n */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n // Hide CodeMark (backticks)\r\n if (node.name === \"CodeMark\") {\r\n return \"\";\r\n }\r\n\r\n // Inline code\r\n if (node.name === \"InlineCode\") {\r\n // Extract content without backticks\r\n let content = ctx.sliceDoc(node.from, node.to);\r\n // Remove leading and trailing backticks\r\n const match = content.match(/^`+(.+?)`+$/s);\r\n if (match && match[1]) {\r\n content = match[1];\r\n }\r\n return `<code class=\"cm-draftly-code-inline\" style=\"padding: 0.1rem 0.25rem\">${ctx.sanitize(content)}</code>`;\r\n }\r\n\r\n // Fenced code block\r\n if (node.name === \"FencedCode\") {\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const lines = content.split(\"\\n\");\r\n\r\n // Extract info string from first line (everything after ```)\r\n const firstLine = lines[0] || \"\";\r\n const infoMatch = firstLine.match(/^```(.*)$/);\r\n const infoString = infoMatch?.[1]?.trim() || \"\";\r\n\r\n // Parse properties from info string\r\n const props = this.parseCodeInfo(infoString);\r\n\r\n // Get code content (without fence lines)\r\n const codeLines = lines.slice(1, -1);\r\n const code = codeLines.join(\"\\n\");\r\n\r\n // Build HTML parts\r\n let html = \"\";\r\n\r\n // Wrapper container\r\n html += `<div class=\"cm-draftly-code-container\">`;\r\n\r\n // Header (if title, copy, or language is set)\r\n const showHeader = props.title || props.copy || props.language;\r\n if (showHeader) {\r\n html += `<div class=\"cm-draftly-code-header\">`;\r\n html += `<div class=\"cm-draftly-code-header-left\">`;\r\n if (props.title) {\r\n html += `<span class=\"cm-draftly-code-header-title\">${ctx.sanitize(props.title)}</span>`;\r\n } else if (props.language) {\r\n html += `<span class=\"cm-draftly-code-header-lang\">${ctx.sanitize(props.language)}</span>`;\r\n }\r\n html += `</div>`;\r\n if (props.copy !== false) {\r\n html += `<div class=\"cm-draftly-code-header-right\">`;\r\n // Encode code as base64 to safely store in data attribute (preserves newlines and special chars)\r\n const encodedCode =\r\n typeof btoa !== \"undefined\" ? btoa(encodeURIComponent(code)) : Buffer.from(code).toString(\"base64\");\r\n html += `<button class=\"cm-draftly-code-copy-btn\" type=\"button\" title=\"Copy code\" data-code=\"${encodedCode}\" data-encoded=\"true\">`;\r\n html += `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\r\n html += `</button>`;\r\n html += `</div>`;\r\n }\r\n html += `</div>`;\r\n }\r\n\r\n // Calculate line number info\r\n const startLineNum = typeof props.lineNumbers === \"number\" ? props.lineNumbers : 1;\r\n const lineNumWidth = String(startLineNum + codeLines.length - 1).length;\r\n\r\n // Code block with line processing\r\n const hasHeader = showHeader ? \" cm-draftly-code-block-has-header\" : \"\";\r\n const hasCaption = props.caption ? \" cm-draftly-code-block-has-caption\" : \"\";\r\n html += `<pre class=\"cm-draftly-code-block${hasHeader}${hasCaption}\"${props.language ? ` data-lang=\"${ctx.sanitize(props.language)}\"` : \"\"}>`;\r\n html += `<code>`;\r\n\r\n // Process each line\r\n codeLines.forEach((line, index) => {\r\n const lineNum = startLineNum + index;\r\n const isHighlighted = props.highlightLines?.includes(index + 1);\r\n\r\n // Line classes\r\n const lineClasses: string[] = [\"cm-draftly-code-line\"];\r\n if (isHighlighted) lineClasses.push(\"cm-draftly-code-line-highlight\");\r\n if (props.lineNumbers) lineClasses.push(\"cm-draftly-code-line-numbered\");\r\n\r\n // Line attributes\r\n const lineAttrs: string[] = [`class=\"${lineClasses.join(\" \")}\"`];\r\n if (props.lineNumbers) {\r\n lineAttrs.push(`data-line-num=\"${lineNum}\"`);\r\n lineAttrs.push(`style=\"--line-num-width: ${lineNumWidth}ch\"`);\r\n }\r\n\r\n // Highlight text content\r\n let lineContent = this.highlightCodeLine(line, props.language || \"\", ctx);\r\n\r\n // Apply text highlights\r\n if (props.highlightText && props.highlightText.length > 0) {\r\n lineContent = this.applyTextHighlights(lineContent, props.highlightText);\r\n }\r\n\r\n html += `<span ${lineAttrs.join(\" \")}>${lineContent || \" \"}</span>`;\r\n });\r\n\r\n html += `</code></pre>`;\r\n\r\n // Caption\r\n if (props.caption) {\r\n html += `<div class=\"cm-draftly-code-caption\">${ctx.sanitize(props.caption)}</div>`;\r\n }\r\n\r\n // Close wrapper container\r\n html += `</div>`;\r\n\r\n return html;\r\n }\r\n\r\n // Hide CodeInfo and CodeText - they're handled by FencedCode\r\n if (node.name === \"CodeInfo\" || node.name === \"CodeText\") {\r\n return \"\";\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Highlight a single line of code using the language's Lezer parser.\r\n * Falls back to sanitized plain text if the language is not supported.\r\n */\r\n private highlightCodeLine(line: string, lang: string, ctx: { sanitize(html: string): string }): string {\r\n if (!lang || !line) {\r\n return ctx.sanitize(line);\r\n }\r\n\r\n // Find the language description\r\n const langDesc = languages.find(\r\n (l) => l.name.toLowerCase() === lang.toLowerCase() || (l.alias && l.alias.includes(lang.toLowerCase()))\r\n );\r\n\r\n if (!langDesc || !langDesc.support) {\r\n return ctx.sanitize(line);\r\n }\r\n\r\n try {\r\n const parser = langDesc.support.language.parser;\r\n const tree = parser.parse(line);\r\n\r\n let result = \"\";\r\n\r\n highlightCode(\r\n line,\r\n tree,\r\n classHighlighter,\r\n (text, classes) => {\r\n if (classes) {\r\n result += `<span class=\"${classes}\">${ctx.sanitize(text)}</span>`;\r\n } else {\r\n result += ctx.sanitize(text);\r\n }\r\n },\r\n () => {} // No newlines for single line\r\n );\r\n\r\n return result;\r\n } catch {\r\n return ctx.sanitize(line);\r\n }\r\n }\r\n\r\n /**\r\n * Apply text highlights (regex patterns) to already syntax-highlighted HTML.\r\n * Wraps matched patterns in `<mark>` elements.\r\n */\r\n private applyTextHighlights(htmlContent: string, highlights: TextHighlight[]): string {\r\n let result = htmlContent;\r\n\r\n for (const highlight of highlights) {\r\n try {\r\n // Create regex from pattern\r\n const regex = new RegExp(`(${highlight.pattern})`, \"g\");\r\n let matchCount = 0;\r\n\r\n result = result.replace(regex, (match) => {\r\n matchCount++;\r\n // Check if this instance should be highlighted\r\n const shouldHighlight = !highlight.instances || highlight.instances.includes(matchCount);\r\n if (shouldHighlight) {\r\n return `<mark class=\"cm-draftly-code-text-highlight\">${match}</mark>`;\r\n }\r\n return match;\r\n });\r\n } catch {\r\n // Invalid regex, skip\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Theme\r\n// ============================================================================\r\n\r\n/** Theme styles for code elements (light and dark modes) */\r\nconst theme = createTheme({\r\n default: {\r\n // Inline code\r\n \".cm-draftly-code-inline\": {\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.9rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.05)\",\r\n padding: \"0.1rem 0.25rem\",\r\n border: \"1px solid var(--color-border)\",\r\n borderRadius: \"3px\",\r\n },\r\n\r\n // Fenced code block lines\r\n \".cm-draftly-code-block-line\": {\r\n \"--radius\": \"0.375rem\",\r\n\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.9rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.03)\",\r\n padding: \"0 1rem !important\",\r\n lineHeight: \"1.5\",\r\n borderLeft: \"1px solid var(--color-border)\",\r\n borderRight: \"1px solid var(--color-border)\",\r\n },\r\n\r\n // First line of code block\r\n \".cm-draftly-code-block-line-start\": {\r\n borderTopLeftRadius: \"var(--radius)\",\r\n borderTopRightRadius: \"var(--radius)\",\r\n position: \"relative\",\r\n overflow: \"hidden\",\r\n borderTop: \"1px solid var(--color-border)\",\r\n paddingBottom: \"0.5rem !important\",\r\n },\r\n\r\n // Remove top radius when header is present\r\n \".cm-draftly-code-block-has-header\": {\r\n padding: \"0 !important\",\r\n paddingBottom: \"0.5rem !important\",\r\n },\r\n\r\n // Code block header widget\r\n \".cm-draftly-code-header\": {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"0.25rem 1rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.06)\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.85rem\",\r\n },\r\n\r\n \".cm-draftly-code-header-left\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"0.5rem\",\r\n },\r\n\r\n \".cm-draftly-code-header-title\": {\r\n color: \"var(--color-text, inherit)\",\r\n fontWeight: \"500\",\r\n },\r\n\r\n \".cm-draftly-code-header-lang\": {\r\n color: \"#6a737d\",\r\n opacity: \"0.8\",\r\n },\r\n\r\n \".cm-draftly-code-header-right\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"0.5rem\",\r\n },\r\n\r\n \".cm-draftly-code-copy-btn\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"0.25rem\",\r\n backgroundColor: \"transparent\",\r\n border: \"none\",\r\n borderRadius: \"4px\",\r\n cursor: \"pointer\",\r\n color: \"#6a737d\",\r\n transition: \"color 0.2s, background-color 0.2s\",\r\n },\r\n\r\n \".cm-draftly-code-copy-btn:hover\": {\r\n backgroundColor: \"rgba(0, 0, 0, 0.1)\",\r\n color: \"var(--color-text, inherit)\",\r\n },\r\n\r\n \".cm-draftly-code-copy-btn.copied\": {\r\n color: \"#22c55e\",\r\n },\r\n\r\n // Caption (below code block)\r\n \".cm-draftly-code-block-has-caption\": {\r\n padding: \"0 !important\",\r\n paddingTop: \"0.5rem !important\",\r\n },\r\n\r\n \".cm-draftly-code-caption\": {\r\n textAlign: \"center\",\r\n fontSize: \"0.85rem\",\r\n color: \"#6a737d\",\r\n fontStyle: \"italic\",\r\n padding: \"0.25rem 1rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.06)\",\r\n },\r\n\r\n // Last line of code block\r\n \".cm-draftly-code-block-line-end\": {\r\n borderBottomLeftRadius: \"var(--radius)\",\r\n borderBottomRightRadius: \"var(--radius)\",\r\n borderBottom: \"1px solid var(--color-border)\",\r\n paddingTop: \"0.5rem !important\",\r\n },\r\n\r\n \".cm-draftly-code-block-line-end br\": {\r\n display: \"none\",\r\n },\r\n\r\n // Fence markers (```)\r\n \".cm-draftly-code-fence\": {\r\n color: \"#6a737d\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n // Line numbers\r\n \".cm-draftly-code-line-numbered\": {\r\n paddingLeft: \"calc(var(--line-num-width, 2ch) + 1rem) !important\",\r\n position: \"relative\",\r\n },\r\n\r\n \".cm-draftly-code-line-numbered::before\": {\r\n content: \"attr(data-line-num)\",\r\n position: \"absolute\",\r\n left: \"0.5rem\",\r\n top: \"0.2rem\",\r\n width: \"var(--line-num-width, 2ch)\",\r\n textAlign: \"right\",\r\n color: \"#6a737d\",\r\n opacity: \"0.6\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.85rem\",\r\n userSelect: \"none\",\r\n },\r\n\r\n // Preview: code lines (need block display for full-width highlights)\r\n \".cm-draftly-code-line\": {\r\n display: \"block\",\r\n position: \"relative\",\r\n paddingLeft: \"1rem\",\r\n paddingRight: \"1rem\",\r\n lineHeight: \"1.5\",\r\n borderLeft: \"3px solid transparent\",\r\n },\r\n\r\n // Line highlight\r\n \".cm-draftly-code-line-highlight\": {\r\n backgroundColor: \"rgba(255, 220, 100, 0.2) !important\",\r\n borderLeft: \"3px solid #f0b429 !important\",\r\n },\r\n\r\n // Text highlight\r\n \".cm-draftly-code-text-highlight\": {\r\n backgroundColor: \"rgba(255, 220, 100, 0.4)\",\r\n borderRadius: \"2px\",\r\n padding: \"0.1rem 0\",\r\n },\r\n // Preview: container wrapper\r\n \".cm-draftly-code-container\": {\r\n margin: \"1rem 0\",\r\n borderRadius: \"var(--radius)\",\r\n overflow: \"hidden\",\r\n border: \"1px solid var(--color-border)\",\r\n },\r\n\r\n // Preview: header inside container\r\n \".cm-draftly-code-container .cm-draftly-code-header\": {\r\n borderRadius: \"0\",\r\n border: \"none\",\r\n borderBottom: \"1px solid var(--color-border)\",\r\n },\r\n\r\n // Preview: code block inside container\r\n \".cm-draftly-code-container .cm-draftly-code-block\": {\r\n margin: \"0\",\r\n borderRadius: \"0\",\r\n border: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n },\r\n\r\n // Preview: caption inside container\r\n \".cm-draftly-code-container .cm-draftly-code-caption\": {\r\n borderTop: \"1px solid var(--color-border)\",\r\n },\r\n\r\n // Preview: standalone code block (not in container)\r\n \".cm-draftly-code-block\": {\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.9rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.03)\",\r\n padding: \"1rem\",\r\n overflow: \"auto\",\r\n position: \"relative\",\r\n borderRadius: \"var(--radius)\",\r\n border: \"1px solid var(--color-border)\",\r\n },\r\n\r\n // Preview: code block with header (remove top radius)\r\n \".cm-draftly-code-block.cm-draftly-code-block-has-header\": {\r\n borderTopLeftRadius: \"0\",\r\n borderTopRightRadius: \"0\",\r\n borderTop: \"none\",\r\n margin: \"0\",\r\n paddingTop: \"0.5rem !important\",\r\n },\r\n\r\n // Preview: code block with caption (remove bottom radius)\r\n \".cm-draftly-code-block.cm-draftly-code-block-has-caption\": {\r\n borderBottomLeftRadius: \"0\",\r\n borderBottomRightRadius: \"0\",\r\n borderBottom: \"none\",\r\n paddingBottom: \"0.5rem !important\",\r\n },\r\n },\r\n\r\n dark: {\r\n \".cm-draftly-code-inline\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.1)\",\r\n },\r\n\r\n \".cm-draftly-code-block-line\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.05)\",\r\n },\r\n\r\n \".cm-draftly-code-fence\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-code-block\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.05)\",\r\n },\r\n\r\n \".cm-draftly-code-header\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.08)\",\r\n },\r\n\r\n \".cm-draftly-code-header-lang\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-code-copy-btn\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-code-copy-btn:hover\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.1)\",\r\n },\r\n\r\n \".cm-draftly-code-caption\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.05)\",\r\n },\r\n\r\n \".cm-draftly-code-line-numbered::before\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-code-line-highlight\": {\r\n backgroundColor: \"rgba(255, 220, 100, 0.15) !important\",\r\n borderLeft: \"3px solid #d9a520 !important\",\r\n },\r\n\r\n \".cm-draftly-code-text-highlight\": {\r\n backgroundColor: \"rgba(255, 220, 100, 0.3)\",\r\n },\r\n },\r\n});\r\n","import { Decoration } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n/**\r\n * Mark decorations for blockquote elements\r\n */\r\nconst quoteMarkDecorations = {\r\n /** Decoration for the > marker */\r\n \"quote-mark\": Decoration.replace({}),\r\n /** Decoration for the quote content */\r\n \"quote-content\": Decoration.mark({ class: \"cm-draftly-quote-content\" }),\r\n};\r\n\r\n/**\r\n * Line decorations for blockquote lines\r\n */\r\nconst quoteLineDecorations = {\r\n /** Decoration for blockquote lines */\r\n \"quote-line\": Decoration.line({ class: \"cm-draftly-quote-line\" }),\r\n};\r\n\r\n/**\r\n * QuotePlugin - Decorates markdown blockquotes\r\n *\r\n * Adds visual styling to blockquotes (> prefixed lines)\r\n * - Line decorations for indicating quote blocks with a left border\r\n * - Mark decorations for quote content\r\n * - Hides > markers when cursor is not in the blockquote\r\n */\r\nexport class QuotePlugin extends DecorationPlugin {\r\n readonly name = \"quote\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 10;\r\n override readonly requiredNodes = [\"Blockquote\", \"QuoteMark\"] as const;\r\n\r\n /**\r\n * Constructor - calls super constructor\r\n */\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Build blockquote decorations by iterating the syntax tree\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n if (name !== \"Blockquote\") {\r\n return;\r\n }\r\n\r\n // Process each line within the blockquote\r\n const startLine = view.state.doc.lineAt(from);\r\n const endLine = view.state.doc.lineAt(to);\r\n\r\n for (let lineNum = startLine.number; lineNum <= endLine.number; lineNum++) {\r\n const line = view.state.doc.line(lineNum);\r\n\r\n // Add line decoration for the blockquote border\r\n decorations.push(quoteLineDecorations[\"quote-line\"].range(line.from));\r\n }\r\n\r\n // Add mark decoration for the entire blockquote content\r\n decorations.push(quoteMarkDecorations[\"quote-content\"].range(from, to));\r\n\r\n // Hide quote markers when cursor is not in the blockquote\r\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\r\n if (!cursorInNode) {\r\n // Find all QuoteMark children (> symbols)\r\n this.hideQuoteMarks(node.node, decorations, view);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Recursively find and hide quote marks\r\n */\r\n private hideQuoteMarks(\r\n node: SyntaxNode,\r\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\r\n view: import(\"@codemirror/view\").EditorView\r\n ): void {\r\n let child = node.firstChild;\r\n while (child) {\r\n if (child.name === \"QuoteMark\") {\r\n // Clamp to line end so replace decoration never spans a newline\r\n const line = view.state.doc.lineAt(child.from);\r\n const markEnd = Math.min(child.to + 1, line.to);\r\n decorations.push(quoteMarkDecorations[\"quote-mark\"].range(child.from, markEnd));\r\n }\r\n // Recurse into nested blockquotes\r\n if (child.name === \"Blockquote\") {\r\n this.hideQuoteMarks(child, decorations, view);\r\n }\r\n child = child.nextSibling;\r\n }\r\n }\r\n\r\n override renderToHTML(node: SyntaxNode, children: string): string | null {\r\n if (node.name === \"QuoteMark\") {\r\n return \"\";\r\n }\r\n\r\n if (node.name !== \"Blockquote\") {\r\n return null;\r\n }\r\n\r\n return `<blockquote class=\"cm-draftly-quote-line\"><div class=\"cm-draftly-quote-content\">${children}</div></blockquote>\\n`;\r\n }\r\n}\r\n\r\nconst theme = createTheme({\r\n default: {\r\n // Line styling with left border\r\n \".cm-draftly-quote-line\": {\r\n borderLeft: \"3px solid currentColor\",\r\n paddingLeft: \"1em !important\",\r\n paddingTop: \"0.25em !important\",\r\n paddingBottom: \"0.25em !important\",\r\n marginLeft: \"0.25em\",\r\n opacity: \"0.85\",\r\n },\r\n\r\n // Quote content styling\r\n \".cm-draftly-quote-content\": {\r\n fontStyle: \"italic\",\r\n },\r\n },\r\n});\r\n","import { Decoration } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n/**\r\n * Line decoration for horizontal rule lines\r\n */\r\nconst hrLineDecoration = Decoration.line({ class: \"cm-draftly-hr-line\" });\r\n\r\n/**\r\n * Mark decoration to hide raw markers (---, ***, ___) when unfocused\r\n */\r\nconst hrMarkDecoration = Decoration.replace({});\r\n\r\n/**\r\n * HRPlugin - Decorates markdown horizontal rules\r\n *\r\n * Adds visual styling to thematic breaks (---, ***, ___)\r\n * - Line decoration that renders a centered horizontal line\r\n * - Hides raw marker characters when the cursor is not on the line\r\n */\r\nexport class HRPlugin extends DecorationPlugin {\r\n readonly name = \"hr\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 10;\r\n override readonly requiredNodes = [\"HorizontalRule\"] as const;\r\n\r\n /**\r\n * Constructor - calls super constructor\r\n */\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Build horizontal rule decorations by iterating the syntax tree\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n if (name !== \"HorizontalRule\") {\r\n return;\r\n }\r\n\r\n // Add line decoration for the horizontal rule styling\r\n const line = view.state.doc.lineAt(from);\r\n decorations.push(hrLineDecoration.range(line.from));\r\n\r\n // Hide the raw markers when cursor is not on the line\r\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\r\n if (!cursorInNode) {\r\n // Clamp to line end so replace decoration never spans a newline\r\n const markEnd = Math.min(to, line.to);\r\n decorations.push(hrMarkDecoration.range(from, markEnd));\r\n }\r\n },\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n override renderToHTML(node: SyntaxNode, _children: string): string | null {\r\n if (node.name !== \"HorizontalRule\") {\r\n return null;\r\n }\r\n\r\n return `<hr class=\"cm-draftly-hr-line\" />\\n`;\r\n }\r\n}\r\n\r\nconst theme = createTheme({\r\n default: {\r\n // Line styling — displays a centered horizontal line\r\n \".cm-draftly-hr-line\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n paddingTop: \"0.75em\",\r\n paddingBottom: \"0.75em\",\r\n border: \"none\",\r\n \"&::after\": {\r\n content: '\"\"',\r\n flex: \"1\",\r\n height: \"2px\",\r\n background: \"currentColor\",\r\n opacity: \"0.3\",\r\n },\r\n },\r\n },\r\n});\r\n","// Re-export individual plugins\r\nexport { ParagraphPlugin } from \"./paragraph-plugin\";\r\nexport { HeadingPlugin } from \"./heading-plugin\";\r\nexport { InlinePlugin } from \"./inline-plugin\";\r\nexport { LinkPlugin } from \"./link-plugin\";\r\nexport { ListPlugin } from \"./list-plugin\";\r\nexport { HTMLPlugin } from \"./html-plugin\";\r\nexport { ImagePlugin } from \"./image-plugin\";\r\nexport { MathPlugin } from \"./math-plugin\";\r\nexport { MermaidPlugin } from \"./mermaid-plugin\";\r\nexport { CodePlugin } from \"./code-plugin\";\r\nexport { QuotePlugin } from \"./quote-plugin\";\r\nexport { HRPlugin } from \"./hr-plugin\";\r\n\r\n// Plugin collections\r\nimport { DraftlyPlugin } from \"../editor/plugin\";\r\nimport { ParagraphPlugin } from \"./paragraph-plugin\";\r\nimport { HeadingPlugin } from \"./heading-plugin\";\r\nimport { InlinePlugin } from \"./inline-plugin\";\r\nimport { LinkPlugin } from \"./link-plugin\";\r\nimport { ListPlugin } from \"./list-plugin\";\r\nimport { HTMLPlugin } from \"./html-plugin\";\r\nimport { ImagePlugin } from \"./image-plugin\";\r\nimport { MathPlugin } from \"./math-plugin\";\r\nimport { MermaidPlugin } from \"./mermaid-plugin\";\r\nimport { CodePlugin } from \"./code-plugin\";\r\nimport { QuotePlugin } from \"./quote-plugin\";\r\nimport { HRPlugin } from \"./hr-plugin\";\r\n\r\n/**\r\n * Default plugins\r\n *\r\n * This is the set of essential plugins\r\n */\r\nconst essentialPlugins: DraftlyPlugin[] = [\r\n new ParagraphPlugin(),\r\n new HeadingPlugin(),\r\n new InlinePlugin(),\r\n new LinkPlugin(),\r\n new ListPlugin(),\r\n new HTMLPlugin(),\r\n new ImagePlugin(),\r\n new MathPlugin(),\r\n new MermaidPlugin(),\r\n new CodePlugin(),\r\n new QuotePlugin(),\r\n new HRPlugin(),\r\n];\r\n\r\n/**\r\n * All plugins\r\n *\r\n * This is the set of all plugins available with draftly\r\n */\r\nconst allPlugins: DraftlyPlugin[] = [...essentialPlugins];\r\n\r\nexport { essentialPlugins, allPlugins };\r\n"]}