draftly 0.1.0-alpha.1 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2B3A3VSQ.cjs +3382 -0
- package/dist/chunk-2B3A3VSQ.cjs.map +1 -0
- package/dist/{chunk-ZDSZRRUY.cjs → chunk-72ZYRGRT.cjs} +48 -104
- package/dist/chunk-72ZYRGRT.cjs.map +1 -0
- package/dist/{chunk-MOG6E2LY.js → chunk-CG4M4TC7.js} +46 -103
- package/dist/chunk-CG4M4TC7.js.map +1 -0
- package/dist/{chunk-LCQALOEI.js → chunk-DFQYXFOP.js} +36 -3
- package/dist/chunk-DFQYXFOP.js.map +1 -0
- package/dist/{chunk-6LQ2VR4I.js → chunk-HPSMS2WB.js} +38 -22
- package/dist/chunk-HPSMS2WB.js.map +1 -0
- package/dist/{chunk-7Z3SRTPZ.cjs → chunk-KBQDZ5IW.cjs} +38 -22
- package/dist/chunk-KBQDZ5IW.cjs.map +1 -0
- package/dist/{chunk-RV2SYFA6.cjs → chunk-KDEDLC3D.cjs} +36 -2
- package/dist/chunk-KDEDLC3D.cjs.map +1 -0
- package/dist/chunk-N3WL3XPB.js +3360 -0
- package/dist/chunk-N3WL3XPB.js.map +1 -0
- package/dist/{draftly-Bxu_H4nw.d.ts → draftly-BLnx3uGX.d.cts} +12 -6
- package/dist/{draftly-Bxu_H4nw.d.cts → draftly-BLnx3uGX.d.ts} +12 -6
- package/dist/editor/index.cjs +20 -12
- package/dist/editor/index.d.cts +3 -2
- package/dist/editor/index.d.ts +3 -2
- package/dist/editor/index.js +2 -2
- package/dist/index.cjs +59 -27
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/plugins/index.cjs +35 -11
- package/dist/plugins/index.d.cts +321 -3
- package/dist/plugins/index.d.ts +321 -3
- package/dist/plugins/index.js +3 -3
- package/dist/preview/index.cjs +7 -7
- package/dist/preview/index.d.cts +9 -4
- package/dist/preview/index.d.ts +9 -4
- package/dist/preview/index.js +2 -2
- package/package.json +2 -1
- package/src/editor/draftly.ts +9 -13
- package/src/editor/plugin.ts +4 -1
- package/src/editor/theme.ts +34 -1
- package/src/editor/utils.ts +49 -0
- package/src/editor/view-plugin.ts +6 -131
- package/src/plugins/code-plugin.ts +1119 -0
- package/src/plugins/heading-plugin.ts +23 -11
- package/src/plugins/hr-plugin.ts +102 -0
- package/src/plugins/image-plugin.ts +96 -2
- package/src/plugins/index.ts +57 -39
- package/src/plugins/inline-plugin.ts +125 -6
- package/src/plugins/link-plugin.ts +509 -0
- package/src/plugins/list-plugin.ts +116 -2
- package/src/plugins/math-plugin.ts +5 -1
- package/src/plugins/mermaid-plugin.ts +500 -0
- package/src/plugins/paragraph-plugin.ts +38 -0
- package/src/plugins/quote-plugin.ts +146 -0
- package/src/preview/context.ts +1 -1
- package/src/preview/css-generator.ts +3 -1
- package/src/preview/default-renderers.ts +0 -5
- package/src/preview/preview.ts +2 -2
- package/src/preview/renderer.ts +34 -12
- package/src/preview/types.ts +1 -1
- package/dist/chunk-6LQ2VR4I.js.map +0 -1
- package/dist/chunk-7Z3SRTPZ.cjs.map +0 -1
- package/dist/chunk-GA6NYY77.cjs +0 -1400
- package/dist/chunk-GA6NYY77.cjs.map +0 -1
- package/dist/chunk-LCQALOEI.js.map +0 -1
- package/dist/chunk-MOG6E2LY.js.map +0 -1
- package/dist/chunk-RV2SYFA6.cjs.map +0 -1
- package/dist/chunk-TKZNKWGF.js +0 -1385
- package/dist/chunk-TKZNKWGF.js.map +0 -1
- package/dist/chunk-ZDSZRRUY.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/heading-plugin.ts","../src/plugins/inline-plugin.ts","../src/plugins/list-plugin.ts","../src/plugins/html-plugin.ts","../src/plugins/image-plugin.ts","../src/plugins/math-plugin.ts","../src/plugins/index.ts"],"names":["Decoration","theme","syntaxTree","WidgetType"],"mappings":"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","file":"chunk-TKZNKWGF.js","sourcesContent":["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 \"heading-mark\": Decoration.mark({ class: \"cm-draftly-heading-mark\" }),\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\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 + 1));\n\n // Find and style the heading marker (#)\n // Only hide when cursor is not in the heading\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\n if (!cursorInNode) {\n const headingMark = node.node.getChild(\"HeaderMark\");\n if (headingMark) {\n decorations.push(headingMarkDecorations[\"heading-mark\"].range(headingMark.from, headingMark.to + 1));\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\n // Heading mark (# symbols)\n \".cm-draftly-heading-mark\": {\n display: \"none\",\n },\n },\n});\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 inline styling in markdown\n */\nconst INLINE_TYPES = {\n Emphasis: \"emphasis\",\n StrongEmphasis: \"strong\",\n Strikethrough: \"strikethrough\",\n Subscript: \"subscript\",\n Superscript: \"superscript\",\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 // Markers (* _ ~~ ^ ~)\n \"inline-mark\": Decoration.mark({ class: \"cm-draftly-inline-mark\" }),\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 *\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 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 * 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 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 // Inline markers (* _ ~~ ^ ~) - hidden when not focused\n \".cm-draftly-inline-mark\": {\n display: \"none\",\n },\n },\n});\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 { 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\r\n override get theme() {\r\n return theme;\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))\",\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 },\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, 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: \r\n */\r\nfunction parseImageMarkdown(content: string): { alt: string; url: string; title?: string } | null {\r\n // Regex to match:  or \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: \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\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 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 boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.1)\",\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 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 = 15;\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 },\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","// Re-export individual plugins\nexport { HeadingPlugin } from \"./heading-plugin\";\nexport { InlinePlugin } from \"./inline-plugin\";\nexport { ListPlugin } from \"./list-plugin\";\nexport { HTMLPlugin } from \"./html-plugin\";\nexport { ImagePlugin } from \"./image-plugin\";\nexport { MathPlugin } from \"./math-plugin\";\n\n// Plugin collections\nimport { DraftlyPlugin } from \"../editor/plugin\";\nimport { HeadingPlugin } from \"./heading-plugin\";\nimport { InlinePlugin } from \"./inline-plugin\";\nimport { ListPlugin } from \"./list-plugin\";\nimport { HTMLPlugin } from \"./html-plugin\";\nimport { ImagePlugin } from \"./image-plugin\";\nimport { MathPlugin } from \"./math-plugin\";\n\n/**\n * Default plugins\n *\n * This is the set of essential plugins\n */\nconst essentialPlugins: DraftlyPlugin[] = [\n new HeadingPlugin(),\n new InlinePlugin(),\n new ListPlugin(),\n new HTMLPlugin(),\n new ImagePlugin(),\n new MathPlugin(),\n];\n\n/**\n * All plugins\n *\n * This is the set of all plugins available with draftly\n */\nconst allPlugins: DraftlyPlugin[] = [...essentialPlugins];\n\nexport { essentialPlugins, allPlugins };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/editor/theme.ts","../src/editor/view-plugin.ts","../src/editor/draftly.ts","../src/editor/plugin.ts"],"names":["EditorView","Decoration","Facet","RangeSetBuilder","syntaxTree","selectionOverlapsRange","cursorInRange","ViewPlugin","markdown","markdownLanguage","languages","keymap","defaultKeymap","history","historyKeymap","indentOnInput","indentWithTab","highlightActiveLine","Prec","markdownKeymap","createTheme","styleMod","StyleModule"],"mappings":"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","file":"chunk-ZDSZRRUY.cjs","sourcesContent":["import { EditorView } from \"@codemirror/view\";\n\n/**\n * Base theme for draftly styling\n * Note: Layout styles are scoped under .cm-draftly which is added by the view plugin\n */\nexport const draftlyBaseTheme = EditorView.theme({\n // Container styles - only apply when view plugin is enabled\n \"&.cm-draftly\": {\n fontSize: \"16px\",\n lineHeight: \"1.6\",\n },\n\n \"&.cm-draftly .cm-content\": {\n maxWidth: \"48rem\",\n margin: \"0 auto\",\n fontFamily: \"var(--font-sans, sans-serif)\",\n fontSize: \"16px\",\n lineHeight: \"1.6\",\n },\n\n \"&.cm-draftly .cm-content .cm-line\": {\n padding: 0,\n },\n\n \"&.cm-draftly .cm-content .cm-widgetBuffer\": {\n display: \"none !important\",\n },\n});\n","import { Decoration, DecorationSet, EditorView, ViewPlugin, ViewUpdate } from \"@codemirror/view\";\nimport { Extension, Facet, Range, RangeSetBuilder } from \"@codemirror/state\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { cursorInRange, selectionOverlapsRange, ThemeEnum } from \"./utils\";\nimport { draftlyBaseTheme } from \"./theme\";\nimport { DecorationContext, DraftlyPlugin } from \"./plugin\";\nimport { DraftlyNode } from \"./draftly\";\n\n/**\n * Mark decorations for inline styling\n */\nconst markDecorations = {\n // Inline styles\n \"inline-code\": Decoration.mark({ class: \"cm-draftly-inline-code\" }),\n\n // Links and images\n link: Decoration.mark({ class: \"cm-draftly-link\" }),\n \"link-text\": Decoration.mark({ class: \"cm-draftly-link-text\" }),\n url: Decoration.mark({ class: \"cm-draftly-url\" }),\n image: Decoration.mark({ class: \"cm-draftly-image\" }),\n\n // Emphasis markers (* _ ~~ `)\n \"emphasis-mark\": Decoration.mark({ class: \"cm-draftly-emphasis-mark\" }),\n\n // Code blocks\n \"fenced-code\": Decoration.mark({ class: \"cm-draftly-fenced-code\" }),\n \"code-mark\": Decoration.mark({ class: \"cm-draftly-code-mark\" }),\n \"code-info\": Decoration.mark({ class: \"cm-draftly-code-info\" }),\n\n // Blockquote\n blockquote: Decoration.mark({ class: \"cm-draftly-blockquote\" }),\n \"quote-mark\": Decoration.mark({ class: \"cm-draftly-quote-mark\" }),\n\n // Horizontal rule\n hr: Decoration.mark({ class: \"cm-draftly-hr\" }),\n};\n\n/**\n * Line decorations for block-level elements\n */\nconst lineDecorations = {\n blockquote: Decoration.line({ class: \"cm-draftly-line-blockquote\" }),\n \"code-block\": Decoration.line({ class: \"cm-draftly-line-code\" }),\n hr: Decoration.line({ class: \"cm-draftly-line-hr\" }),\n};\n\n/**\n * Facet to register plugins with the view plugin\n */\nexport const DraftlyPluginsFacet = Facet.define<DraftlyPlugin[], DraftlyPlugin[]>({\n combine: (values) => values.flat(),\n});\n\n/**\n * Facet to register the onNodesChange callback\n */\nexport const draftlyOnNodesChangeFacet = Facet.define<\n ((nodes: DraftlyNode[]) => void) | undefined,\n ((nodes: DraftlyNode[]) => void) | undefined\n>({\n combine: (values) => values.find((v) => v !== undefined),\n});\n\n/**\n * Facet to register the theme\n */\nexport const draftlyThemeFacet = Facet.define<ThemeEnum, ThemeEnum>({\n combine: (values) => values.find((v) => v !== undefined) || ThemeEnum.AUTO,\n});\n\n/**\n * Build decorations for the visible viewport\n * @param view - The EditorView instance\n * @param plugins - Optional array of plugins to invoke for decorations\n */\nfunction buildDecorations(view: EditorView, plugins: DraftlyPlugin[] = []): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const decorations: Range<Decoration>[] = [];\n\n const tree = syntaxTree(view.state);\n\n // Iterate through the syntax tree\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n // Skip if cursor is in this range (show raw markdown)\n const cursorInNode = selectionOverlapsRange(view, from, to);\n\n // Handle inline code\n if (name === \"InlineCode\") {\n decorations.push(markDecorations[\"inline-code\"].range(from, to));\n\n // Style the backticks\n if (!cursorInNode) {\n const marks = node.node.getChildren(\"CodeMark\");\n for (const mark of marks) {\n decorations.push(markDecorations[\"code-mark\"].range(mark.from, mark.to));\n }\n }\n }\n\n // Handle links\n if (name === \"Link\") {\n decorations.push(markDecorations.link.range(from, to));\n\n // Find the URL child\n const url = node.node.getChild(\"URL\");\n if (url) {\n decorations.push(markDecorations.url.range(url.from, url.to));\n }\n }\n\n // Handle images\n if (name === \"Image\") {\n decorations.push(markDecorations.image.range(from, to));\n }\n\n // Handle fenced code blocks\n if (name === \"FencedCode\") {\n decorations.push(markDecorations[\"fenced-code\"].range(from, to));\n\n // Add line decorations for each line in the code block\n const startLine = view.state.doc.lineAt(from);\n const endLine = view.state.doc.lineAt(to);\n for (let i = startLine.number; i <= endLine.number; i++) {\n const line = view.state.doc.line(i);\n decorations.push(lineDecorations[\"code-block\"].range(line.from));\n }\n\n // Style code info (language identifier)\n const codeInfo = node.node.getChild(\"CodeInfo\");\n if (codeInfo) {\n decorations.push(markDecorations[\"code-info\"].range(codeInfo.from, codeInfo.to));\n }\n\n // Style code marks (```)\n const codeMarks = node.node.getChildren(\"CodeMark\");\n for (const mark of codeMarks) {\n decorations.push(markDecorations[\"code-mark\"].range(mark.from, mark.to));\n }\n }\n\n // Handle blockquotes\n if (name === \"Blockquote\") {\n decorations.push(markDecorations.blockquote.range(from, to));\n\n // Add line decorations\n const startLine = view.state.doc.lineAt(from);\n const endLine = view.state.doc.lineAt(to);\n for (let i = startLine.number; i <= endLine.number; i++) {\n const line = view.state.doc.line(i);\n decorations.push(lineDecorations.blockquote.range(line.from));\n }\n\n // Style quote marks (>)\n const quoteMarks = node.node.getChildren(\"QuoteMark\");\n for (const mark of quoteMarks) {\n decorations.push(markDecorations[\"quote-mark\"].range(mark.from, mark.to));\n }\n }\n\n // Handle horizontal rules\n if (name === \"HorizontalRule\") {\n const line = view.state.doc.lineAt(from);\n decorations.push(lineDecorations.hr.range(line.from));\n decorations.push(markDecorations.hr.range(from, to));\n }\n },\n });\n\n // Allow plugins to contribute decorations\n if (plugins.length > 0) {\n const ctx: DecorationContext = {\n view,\n decorations,\n selectionOverlapsRange: (from, to) => selectionOverlapsRange(view, from, to),\n cursorInRange: (from, to) => cursorInRange(view, from, to),\n };\n\n // Sort plugins by priority and invoke each one's decoration builder\n const sortedPlugins = [...plugins].sort((a, b) => a.decorationPriority - b.decorationPriority);\n\n for (const plugin of sortedPlugins) {\n plugin.buildDecorations(ctx);\n }\n }\n\n // Sort decorations by position (required for RangeSetBuilder)\n decorations.sort((a, b) => a.from - b.from || a.value.startSide - b.value.startSide);\n\n // Build the decoration set\n for (const decoration of decorations) {\n builder.add(decoration.from, decoration.to, decoration.value);\n }\n\n return builder.finish();\n}\n\n/**\n * draftly View Plugin\n * Handles rich markdown rendering with decorations\n */\nclass draftlyViewPluginClass {\n decorations: DecorationSet;\n private plugins: DraftlyPlugin[];\n private onNodesChange: ((nodes: DraftlyNode[]) => void) | undefined;\n\n constructor(view: EditorView) {\n this.plugins = view.state.facet(DraftlyPluginsFacet);\n this.onNodesChange = view.state.facet(draftlyOnNodesChangeFacet);\n this.decorations = buildDecorations(view, this.plugins);\n\n // Notify plugins that view is ready\n for (const plugin of this.plugins) {\n plugin.onViewReady(view);\n }\n\n // Call onNodesChange callback with initial nodes\n if (this.onNodesChange && typeof this.onNodesChange === \"function\") {\n this.onNodesChange(this.buildNodes(view));\n }\n }\n\n update(update: ViewUpdate) {\n // Update plugins list if facet changed\n this.plugins = update.view.state.facet(DraftlyPluginsFacet);\n this.onNodesChange = update.view.state.facet(draftlyOnNodesChangeFacet);\n\n // Notify plugins of the update\n for (const plugin of this.plugins) {\n plugin.onViewUpdate(update);\n }\n\n // Rebuild decorations when:\n // - Document changes\n // - Selection changes (to show/hide syntax markers)\n // - Viewport changes\n if (update.docChanged || update.selectionSet || update.viewportChanged) {\n this.decorations = buildDecorations(update.view, this.plugins);\n\n // Call onNodesChange callback\n if (this.onNodesChange) {\n this.onNodesChange(this.buildNodes(update.view));\n }\n }\n }\n\n private buildNodes(view: EditorView): DraftlyNode[] {\n const tree = syntaxTree(view.state);\n const roots: DraftlyNode[] = [];\n const stack: DraftlyNode[] = [];\n\n tree.iterate({\n enter: (nodeRef) => {\n const node: DraftlyNode = {\n from: nodeRef.from,\n to: nodeRef.to,\n name: nodeRef.name,\n children: [],\n isSelected: selectionOverlapsRange(view, nodeRef.from, nodeRef.to),\n };\n\n if (stack.length > 0) {\n stack[stack.length - 1]!.children.push(node);\n } else {\n roots.push(node);\n }\n\n stack.push(node);\n },\n leave: () => {\n stack.pop();\n },\n });\n\n return roots;\n }\n}\n\n/**\n * The main draftly ViewPlugin extension\n */\nexport const draftlyViewPlugin = ViewPlugin.fromClass(draftlyViewPluginClass, {\n decorations: (v) => v.decorations,\n provide: () => [],\n});\n\n/**\n * Extension to add the cm-draftly-enabled class to the editor\n */\nconst draftlyEditorClass = EditorView.editorAttributes.of({ class: \"cm-draftly\" });\n\n/**\n * Create draftly view extension bundle with plugin support\n * @param plugins - Optional array of DraftlyPlugin instances\n * @param onNodesChange - Optional callback to receive nodes on every update\n * @returns Extension array including view plugin, theme, and plugin facet\n */\nexport function createDraftlyViewExtension(\n theme: ThemeEnum = ThemeEnum.AUTO,\n baseStyles: boolean = true,\n plugins: DraftlyPlugin[] = [],\n onNodesChange?: (nodes: DraftlyNode[]) => void\n): Extension[] {\n return [\n draftlyEditorClass,\n DraftlyPluginsFacet.of(plugins),\n draftlyOnNodesChangeFacet.of(onNodesChange),\n draftlyThemeFacet.of(theme),\n draftlyViewPlugin,\n ...(baseStyles ? [draftlyBaseTheme] : []),\n ];\n}\n","import { Extension, Prec } from \"@codemirror/state\";\nimport { EditorView, highlightActiveLine, KeyBinding, keymap } from \"@codemirror/view\";\nimport { markdown, markdownKeymap, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport type { MarkdownConfig } from \"@lezer/markdown\";\nimport { DraftlyPlugin, PluginContext } from \"./plugin\";\nimport { createDraftlyViewExtension } from \"./view-plugin\";\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from \"@codemirror/commands\";\nimport { indentOnInput } from \"@codemirror/language\";\nimport { languages } from \"@codemirror/language-data\";\nimport { ThemeEnum } from \"./utils\";\n\n/**\n * DraftlyNode: represents a node in the markdown tree\n *\n * Useful for debugging and development\n */\nexport type DraftlyNode = {\n from: number;\n to: number;\n name: string;\n children: DraftlyNode[];\n isSelected: boolean;\n};\n\n/**\n * Configuration options for the draftly editor\n */\nexport interface DraftlyConfig {\n /** Theme */\n theme?: ThemeEnum;\n\n /** ThemeStlye */\n themeStyle?: Extension;\n\n /** Weather to load base styles */\n baseStyles?: boolean;\n\n /** Plugins to load */\n plugins?: DraftlyPlugin[];\n\n /** Additional markdown extensions for the parser */\n markdown?: MarkdownConfig[];\n\n /** Additional CodeMirror extensions */\n extensions?: Extension[];\n\n /** Additional keybindings */\n keymap?: KeyBinding[];\n\n /** Disable the built-in view plugin (for raw markdown mode) */\n disableViewPlugin?: boolean;\n\n /** Enable default keybindings */\n defaultKeybindings?: boolean;\n\n /** Enable history */\n history?: boolean;\n\n /** Enable indent with tab */\n indentWithTab?: boolean;\n\n /** Highlight active line */\n highlightActiveLine?: boolean;\n\n /** Line wrapping in raw markdown mode */\n lineWrapping?: boolean;\n\n /** Callback to receive the nodes on every update */\n onNodesChange?: (nodes: DraftlyNode[]) => void;\n}\n\n/**\n * Creates a draftly editor extension bundle for CodeMirror 6\n *\n * @param config - Configuration options for the editor\n * @returns CodeMirror Extension that can be added to EditorState\n *\n * @example\n * ```ts\n * import { EditorView } from '@codemirror/view';\n * import { EditorState } from '@codemirror/state';\n * import { draftly } from 'draftly';\n *\n * const view = new EditorView({\n * state: EditorState.create({\n * doc: '# Hello draftly',\n * extensions: [draftly()]\n * }),\n * parent: document.getElementById('editor')\n * });\n * ```\n */\nexport function draftly(config: DraftlyConfig = {}): Extension[] {\n const {\n theme: configTheme = ThemeEnum.AUTO,\n themeStyle: configThemeStyle = undefined,\n baseStyles = true,\n plugins = [],\n extensions = [],\n keymap: configKeymap = [],\n disableViewPlugin = false,\n defaultKeybindings = true,\n history: configHistory = true,\n indentWithTab: configIndentWithTab = true,\n highlightActiveLine: configHighlightActiveLine = true,\n lineWrapping: configLineWrapping = true,\n onNodesChange: configOnNodesChange = undefined,\n } = config;\n\n const allPlugins = [...plugins];\n\n // Collect all extensions from plugins\n const pluginExtensions: Extension[] = [];\n const pluginKeymaps: KeyBinding[] = [];\n const markdownExtensions: MarkdownConfig[] = [];\n\n // Create plugin context for lifecycle methods\n const pluginContext: PluginContext = { config };\n\n // Process each plugin\n for (const plugin of allPlugins) {\n // Call onRegister lifecycle hook\n plugin.onRegister(pluginContext);\n\n // Collect extensions via class method\n const exts = plugin.getExtensions();\n if (exts.length > 0) {\n pluginExtensions.push(...exts);\n }\n\n // Collect keymaps via class method\n const keys = plugin.getKeymap();\n if (keys.length > 0) {\n pluginKeymaps.push(...keys);\n }\n\n // Collect theme via class method\n const theme = plugin.theme;\n if (baseStyles && theme && typeof theme === \"function\") {\n pluginExtensions.push(EditorView.theme(theme(configTheme)));\n }\n\n // Collect markdown parser extensions via class method\n const md = plugin.getMarkdownConfig();\n if (md) {\n markdownExtensions.push(md);\n }\n }\n\n // Add config-level markdown extensions\n if (config.markdown) {\n markdownExtensions.push(...config.markdown);\n }\n\n // Build the base markdown language support\n const markdownSupport = markdown({\n base: markdownLanguage,\n codeLanguages: languages,\n extensions: markdownExtensions,\n addKeymap: true,\n completeHTMLTags: true,\n });\n\n // Core CodeMirror extensions (in order)\n const baseExtensions: Extension[] = [\n ...(defaultKeybindings ? [keymap.of(defaultKeymap)] : []),\n ...(configHistory ? [history(), keymap.of(historyKeymap)] : []),\n ...(configIndentWithTab ? [indentOnInput(), keymap.of([indentWithTab])] : []),\n ...(configHighlightActiveLine && disableViewPlugin ? [highlightActiveLine()] : []),\n ];\n\n // draftly extensions (pass plugins for decoration support)\n const draftlyExtensions: Extension[] = [];\n if (!disableViewPlugin)\n draftlyExtensions.push(createDraftlyViewExtension(configTheme, baseStyles, allPlugins, configOnNodesChange));\n if (!disableViewPlugin || configLineWrapping) draftlyExtensions.push(EditorView.lineWrapping);\n\n // Compose all extensions together\n const composedExtensions: Extension[] = [\n // Core markdown support (highest priority)\n Prec.high(markdownSupport),\n Prec.high(keymap.of(markdownKeymap)),\n\n // Theme styles\n ...(configThemeStyle ? [Prec.high(configThemeStyle)] : []),\n\n // Core CodeMirror extensions\n ...baseExtensions,\n\n // draftly view plugin for rich rendering\n ...draftlyExtensions,\n\n // Plugin extensions & keymaps\n ...pluginExtensions,\n pluginKeymaps.length > 0 ? keymap.of(pluginKeymaps) : [],\n\n // Config keymaps & extensions\n configKeymap.length > 0 ? keymap.of(configKeymap) : [],\n ...extensions,\n ];\n\n return composedExtensions;\n}\n","import { Decoration, EditorView, KeyBinding, ViewUpdate } from \"@codemirror/view\";\nimport { Extension, Range } from \"@codemirror/state\";\nimport { MarkdownConfig } from \"@lezer/markdown\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { DraftlyConfig } from \"./draftly\";\nimport { createTheme, ThemeEnum, ThemeStyle } from \"./utils\";\nimport { StyleModule } from \"style-mod\";\n\n/**\n * Context passed to plugin lifecycle methods\n */\nexport interface PluginContext {\n /** Current configuration */\n readonly config: DraftlyConfig;\n}\n\n/**\n * Plugin configuration schema\n */\nexport interface PluginConfig {\n [key: string]: unknown;\n}\n\n/**\n * Decoration context passed to plugin decoration builders\n * Provides access to view state and decoration collection\n */\nexport interface DecorationContext {\n /** The EditorView instance (readonly) */\n readonly view: EditorView;\n\n /** Array to push decorations into (will be sorted automatically) */\n readonly decorations: Range<Decoration>[];\n\n /** Check if selection overlaps with a range (to show raw markdown) */\n selectionOverlapsRange(from: number, to: number): boolean;\n\n /** Check if cursor is within a range */\n cursorInRange(from: number, to: number): boolean;\n}\n\n/**\n * Abstract base class for all draftly plugins\n *\n * Implements OOP principles:\n * - Abstraction: abstract name/version must be implemented by subclasses\n * - Encapsulation: private _config, protected _context\n * - Inheritance: specialized plugin classes can extend this\n */\nexport abstract class DraftlyPlugin {\n /** Unique plugin identifier (abstract - must be implemented) */\n abstract readonly name: string;\n\n /** Plugin version (abstract - must be implemented) */\n abstract readonly version: string;\n\n /** Decoration priority (higher = applied later) */\n readonly decorationPriority: number = 100;\n\n /** Plugin dependencies - names of required plugins */\n readonly dependencies: string[] = [];\n\n /** Private configuration storage */\n private _config: PluginConfig = {};\n\n /** Protected context - accessible to subclasses */\n protected _context: PluginContext | null = null;\n\n /** Get plugin configuration */\n get config(): PluginConfig {\n return this._config;\n }\n\n /** Set plugin configuration */\n set config(value: PluginConfig) {\n this._config = value;\n }\n\n /** Get plugin context */\n get context(): PluginContext | null {\n return this._context;\n }\n\n /** Plugin theme */\n get theme(): (theme: ThemeEnum) => ThemeStyle {\n return createTheme({\n default: {},\n dark: {},\n light: {},\n });\n }\n\n // ============================================\n // EXTENSION METHODS (overridable by subclasses)\n // ============================================\n\n /**\n * Return CodeMirror extensions for this plugin\n * Override to provide custom extensions\n */\n getExtensions(): Extension[] {\n return [];\n }\n\n /**\n * Return markdown parser extensions\n * Override to extend markdown parsing\n */\n getMarkdownConfig(): MarkdownConfig | null {\n return null;\n }\n\n /**\n * Return keybindings for this plugin\n * Override to add custom keyboard shortcuts\n */\n getKeymap(): KeyBinding[] {\n return [];\n }\n\n // ============================================\n // DECORATION METHODS (overridable by subclasses)\n // ============================================\n\n /**\n * Build decorations for the current view state\n * Override to contribute decorations to the editor\n *\n * @param ctx - Decoration context with view and decoration array\n */\n buildDecorations(_ctx: DecorationContext): void {\n // Default implementation does nothing\n // Subclasses override to add decorations\n }\n\n // ============================================\n // LIFECYCLE HOOKS (overridable by subclasses)\n // ============================================\n\n /**\n * Called when plugin is registered with draftly\n * Override to perform initialization\n *\n * @param context - Plugin context with configuration\n */\n onRegister(context: PluginContext): void | Promise<void> {\n this._context = context;\n }\n\n /**\n * Called when plugin is unregistered\n * Override to perform cleanup\n */\n onUnregister(): void {\n this._context = null;\n }\n\n /**\n * Called when EditorView is created and ready\n * Override to perform view-specific initialization\n *\n * @param view - The EditorView instance\n */\n onViewReady(_view: EditorView): void {\n // Default implementation does nothing\n }\n\n /**\n * Called on view updates (document changes, selection changes, etc.)\n * Override to react to editor changes\n *\n * @param update - The ViewUpdate with change information\n */\n onViewUpdate(_update: ViewUpdate): void {\n // Default implementation does nothing\n }\n\n // ============================================\n // PROTECTED UTILITIES (for subclasses)\n // ============================================\n\n /**\n * Helper to get current editor state\n * @param view - The EditorView instance\n */\n protected getState(view: EditorView) {\n return view.state;\n }\n\n /**\n * Helper to get current document\n * @param view - The EditorView instance\n */\n protected getDocument(view: EditorView) {\n return view.state.doc;\n }\n\n // ============================================\n // PREVIEW RENDERING METHODS (for draftly/preview)\n // ============================================\n\n /**\n * Render a syntax node to HTML for preview mode\n * Override to provide custom HTML rendering for specific node types\n *\n * @param node - The syntax node to render\n * @param children - Pre-rendered children HTML\n * @param ctx - Preview context with document and utilities\n * @returns HTML string to use, or null to use default rendering\n */\n renderToHTML?(\n node: SyntaxNode,\n children: string,\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\n ): string | null;\n\n /**\n * Get CSS styles for preview mode\n * Override to provide custom CSS for preview rendering\n *\n * @param theme - Current theme enum\n * @returns CSS string for preview styles\n */\n getPreviewStyles(theme: ThemeEnum, wrapperClass: string): string {\n const themeStyles = this.theme(theme);\n return this.transformToCss(themeStyles, wrapperClass);\n }\n\n /**\n * Transform ThemeStyle object to CSS string for preview\n * Uses cssClassMap to convert CM selectors to semantic selectors\n */\n protected transformToCss(themeStyles: ThemeStyle, wrapperClass: string): string {\n const styleMod = new StyleModule(themeStyles, {\n finish: (sel) => {\n return `.${wrapperClass} ${sel}`;\n },\n });\n return styleMod.getRules();\n }\n}\n\n/**\n * Base class for plugins that primarily contribute decorations\n * Extends DraftlyPlugin with decoration-focused defaults\n */\nexport abstract class DecorationPlugin extends DraftlyPlugin {\n /**\n * Decoration priority - lower than default for decoration plugins\n * Override to customize\n */\n override decorationPriority = 50;\n\n /**\n * Subclasses must implement this to provide decorations\n * @param ctx - Decoration context\n */\n abstract override buildDecorations(ctx: DecorationContext): void;\n}\n\n/**\n * Base class for plugins that add syntax/parser extensions\n * Extends DraftlyPlugin with syntax-focused requirements\n */\nexport abstract class SyntaxPlugin extends DraftlyPlugin {\n /**\n * Subclasses must implement this to provide markdown config\n */\n abstract override getMarkdownConfig(): MarkdownConfig;\n}\n"]}
|