draftly 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1144 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +257 -0
- package/dist/index.d.ts +257 -0
- package/dist/index.js +1128 -0
- package/dist/index.js.map +1 -0
- package/package.json +65 -0
- package/src/draftly.ts +198 -0
- package/src/index.ts +7 -0
- package/src/plugin.ts +245 -0
- package/src/plugins/heading-plugin.ts +163 -0
- package/src/plugins/html-plugin.ts +347 -0
- package/src/plugins/inline-plugin.ts +152 -0
- package/src/plugins/list-plugin.ts +211 -0
- package/src/plugins/plugins.ts +9 -0
- package/src/theme.ts +86 -0
- package/src/utils.ts +21 -0
- package/src/view-plugin.ts +304 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/theme.ts","../src/view-plugin.ts","../src/plugin.ts","../src/plugins/heading-plugin.ts","../src/plugins/inline-plugin.ts","../src/plugins/list-plugin.ts","../src/plugins/html-plugin.ts","../src/plugins/plugins.ts","../src/draftly.ts","../src/index.ts"],"names":["EditorView","Decoration","syntaxTree","WidgetType","cursorInRange"],"mappings":"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","file":"index.js","sourcesContent":["import { EditorView } from \"@codemirror/view\";\n\n/**\n * Check if cursor is within the given range\n */\nexport function cursorInRange(view: EditorView, from: number, to: number): boolean {\n const selection = view.state.selection.main;\n return selection.from <= to && selection.to >= from;\n}\n\n/**\n * Check if any selection overlaps with the given range\n */\nexport function selectionOverlapsRange(view: EditorView, from: number, to: number): boolean {\n for (const range of view.state.selection.ranges) {\n if (range.from <= to && range.to >= from) {\n return true;\n }\n }\n return false;\n}\n","import { EditorView } from \"@codemirror/view\";\nimport { HighlightStyle } from \"@codemirror/language\";\n\nexport const highlightStyle = HighlightStyle.define([]);\n\n/**\n * Base theme for draftly styling\n * Note: Layout styles are scoped under .cm-draftly-enabled which is added by the view plugin\n */\nexport const draftlyBaseTheme = EditorView.baseTheme({\n // Container styles - only apply when view plugin is enabled\n \"&.cm-draftly-enabled\": {\n fontSize: \"16px\",\n lineHeight: \"1.6\",\n },\n\n \"&.cm-draftly-enabled .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 // Inline code\n \".cm-draftly-inline-code\": {\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: \"0.9em\",\n backgroundColor: \"rgba(175, 184, 193, 0.2)\",\n padding: \"0.1em 0.3em\",\n borderRadius: \"4px\",\n },\n \".cm-draftly-code-mark\": {\n opacity: \"0.4\",\n },\n\n // Links\n \".cm-draftly-link\": {\n color: \"#0969da\",\n textDecoration: \"none\",\n },\n \".cm-draftly-link:hover\": {\n textDecoration: \"underline\",\n },\n \".cm-draftly-url\": {\n opacity: \"0.6\",\n fontSize: \"0.9em\",\n },\n\n // Images (placeholder styling)\n \".cm-draftly-image\": {\n color: \"#8250df\",\n },\n\n // Code blocks\n \".cm-draftly-fenced-code\": {\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: \"0.9em\",\n },\n \".cm-draftly-line-code\": {\n backgroundColor: \"rgba(175, 184, 193, 0.15)\",\n borderRadius: \"0\",\n },\n \".cm-draftly-code-info\": {\n color: \"#6e7781\",\n fontStyle: \"italic\",\n },\n\n // Blockquote\n \".cm-draftly-line-blockquote\": {\n borderLeft: \"3px solid #d0d7de\",\n paddingLeft: \"1em\",\n color: \"#656d76\",\n },\n \".cm-draftly-quote-mark\": {\n opacity: \"0.4\",\n },\n\n // Horizontal rule\n \".cm-draftly-line-hr\": {\n textAlign: \"center\",\n },\n \".cm-draftly-hr\": {\n opacity: \"0.4\",\n },\n});\n","import { Decoration, DecorationSet, EditorView, ViewPlugin, ViewUpdate } from \"@codemirror/view\";\nimport { Extension, Facet, Range, RangeSetBuilder } from \"@codemirror/state\";\nimport { syntaxHighlighting, syntaxTree } from \"@codemirror/language\";\nimport { cursorInRange, selectionOverlapsRange } from \"./utils\";\nimport { highlightStyle, 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 * 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;\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) {\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: () => [syntaxHighlighting(highlightStyle)],\n});\n\n/**\n * Extension to add the cm-draftly-enabled class to the editor\n */\nconst draftlyEditorClass = EditorView.editorAttributes.of({ class: \"cm-draftly-enabled\" });\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 plugins: DraftlyPlugin[] = [],\n onNodesChange?: (nodes: DraftlyNode[]) => void\n): Extension[] {\n return [\n DraftlyPluginsFacet.of(plugins),\n draftlyOnNodesChangeFacet.of(onNodesChange),\n draftlyViewPlugin,\n draftlyBaseTheme,\n draftlyEditorClass,\n ];\n}\n","import { Decoration, EditorView, KeyBinding, ViewUpdate, WidgetType } from \"@codemirror/view\";\nimport { Extension, Range } from \"@codemirror/state\";\nimport { MarkdownConfig } from \"@lezer/markdown\";\nimport { DraftlyConfig } from \"./draftly\";\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 /** 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 // ============================================\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 * Decoration priority (higher = applied later)\n * Override to customize priority. Default: 100\n */\n get decorationPriority(): number {\n return 100;\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 // ACCESSIBILITY METHODS (overridable by subclasses)\n // ============================================\n\n /**\n * Return ARIA attributes to add to the editor\n * Override to improve accessibility\n */\n getAriaAttributes(): Record<string, string> {\n return {};\n }\n\n // ============================================\n // VIEW CONTRIBUTIONS (overridable by subclasses)\n // ============================================\n\n /**\n * Return widget types this plugin provides\n * Override to contribute custom widgets\n */\n getWidgets(): WidgetType[] {\n return [];\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/**\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 get decorationPriority(): number {\n return 50;\n }\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","import { Decoration, EditorView } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../plugin\";\nimport { Extension } from \"@codemirror/state\";\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\n /**\n * Higher priority to ensure headings are styled first\n */\n override get decorationPriority(): number {\n return 10;\n }\n\n /**\n * Get the extensions for this plugin\n */\n getExtensions(): Extension[] {\n return [headingTheme];\n }\n\n /**\n * Build heading decorations by iterating the syntax tree\n */\n override 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\nconst headingTheme = EditorView.theme({\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","import { Decoration, EditorView } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../plugin\";\nimport { Extension } from \"@codemirror/state\";\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\n /**\n * Moderate priority for inline styling\n */\n override get decorationPriority(): number {\n return 20;\n }\n\n /**\n * Get the extensions for this plugin (theme)\n */\n override getExtensions(): Extension[] {\n return [inlineTheme];\n }\n\n /**\n * Build inline decorations by iterating the syntax tree\n */\n override 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\n/**\n * Theme for inline styling\n */\nconst inlineTheme = EditorView.theme({\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","import { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { Extension } from \"@codemirror/state\";\nimport { DecorationContext, DecorationPlugin } from \"../plugin\";\n\n/**\n * Mark decorations for list items\n */\nconst listMarkDecorations = {\n \"list-mark-ul\": Decoration.mark({ class: \"cm-draftly-list-mark-ul\" }),\n \"list-mark-ol\": Decoration.mark({ class: \"cm-draftly-list-mark-ol\" }),\n \"task-marker\": Decoration.mark({ class: \"cm-draftly-task-marker\" }),\n};\n\n/**\n * Task checkbox widget\n */\nexport class TaskCheckboxWidget extends WidgetType {\n constructor(readonly checked: boolean) {\n super();\n }\n\n eq(other: TaskCheckboxWidget): boolean {\n return other.checked === this.checked;\n }\n\n toDOM(view: EditorView): HTMLElement {\n const wrap = document.createElement(\"span\");\n wrap.className = `cm-draftly-task-checkbox ${this.checked ? \"checked\" : \"\"}`;\n wrap.setAttribute(\"aria-hidden\", \"true\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = this.checked;\n checkbox.tabIndex = -1;\n\n checkbox.addEventListener(\"mousedown\", (e) => {\n e.preventDefault();\n const pos = view.posAtDOM(wrap);\n // Find the task marker in the document and toggle it\n const line = view.state.doc.lineAt(pos);\n const match = line.text.match(/^(\\s*[-*+]\\s*)\\[([ xX])\\]/);\n if (match) {\n const markerStart = line.from + match[1]!.length + 1;\n const newChar = this.checked ? \" \" : \"x\";\n view.dispatch({\n changes: { from: markerStart, to: markerStart + 1, insert: newChar },\n });\n }\n });\n\n wrap.appendChild(checkbox);\n\n // Add a label for better accessibility and click area\n // const label = document.createElement(\"span\");\n // wrap.appendChild(label);\n\n return wrap;\n }\n\n ignoreEvent(): boolean {\n return false;\n }\n}\n\n/**\n * ListPlugin - Decorates markdown lists\n *\n * Handles:\n * - Unordered lists (bullet points) - Auto-styles markers (*, -, +)\n * - Ordered lists (numbered) - Auto-styles numbers (1., 2.)\n * - Task lists (checkboxes) - Replaces [ ]/[x] with interactive widget when not editing\n */\nexport class ListPlugin extends DecorationPlugin {\n readonly name = \"list\";\n readonly version = \"1.0.0\";\n\n /**\n * Moderate priority\n */\n override get decorationPriority(): number {\n return 20;\n }\n\n /**\n * Get the extensions for this plugin (theme)\n */\n override getExtensions(): Extension[] {\n return [listTheme];\n }\n\n /**\n * Build list decorations by iterating the syntax tree\n */\n override 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 const line = view.state.doc.lineAt(from);\n const cursorInLine = ctx.cursorInRange(line.from, line.to);\n\n // Handle list markers (bullets, numbers)\n if (name === \"ListMark\") {\n // Determine list type by checking grandparent (BulletList vs OrderedList)\n // Parent is ListItem, Grandparent is the list container\n const parent = node.node.parent;\n const grandparent = parent?.parent;\n const listType = grandparent?.name;\n\n if (!cursorInLine) {\n if (listType === \"OrderedList\") {\n decorations.push(listMarkDecorations[\"list-mark-ol\"].range(from, to));\n } else {\n // Default to generic/unordered for BulletList or others\n decorations.push(listMarkDecorations[\"list-mark-ul\"].range(from, to));\n }\n }\n }\n\n // Handle task lists\n if (name === \"TaskMarker\") {\n const text = view.state.sliceDoc(from, to);\n const isChecked = text.includes(\"x\") || text.includes(\"X\");\n\n if (cursorInLine) {\n // If editing the line, just style the marker text\n decorations.push(listMarkDecorations[\"task-marker\"].range(from, to));\n } else {\n // If not editing, REPLACE the marker text with the widget\n decorations.push(\n Decoration.replace({\n widget: new TaskCheckboxWidget(isChecked),\n }).range(from, to)\n );\n }\n }\n },\n });\n }\n}\n\n/**\n * Theme for list styling\n */\nconst listTheme = EditorView.theme({\n // Unordered List markers (*, -, +)\n \".cm-draftly-list-mark-ul\": {\n position: \"relative\",\n },\n\n \".cm-draftly-list-mark-ul > span\": {\n visibility: \"hidden\",\n },\n\n \".cm-draftly-list-mark-ul::after\": {\n content: '\"•\"',\n position: \"absolute\",\n left: \"50%\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n color: \"var(--color-link)\",\n fontWeight: \"bold\",\n pointerEvents: \"none\",\n },\n\n // Ordered List markers (1., 2.)\n \".cm-draftly-list-mark-ol\": {\n color: \"var(--draftly-highlight, #a4a4a4)\",\n fontFamily: \"monospace\",\n marginRight: \"2px\",\n },\n\n // Task markers text ([ ] or [x]) - visible only when editing\n \".cm-draftly-task-marker\": {\n color: \"var(--draftly-highlight, #a4a4a4)\",\n fontFamily: \"monospace\",\n },\n\n // Task Checkbox Widget\n \".cm-draftly-task-checkbox\": {\n display: \"inline-flex\",\n verticalAlign: \"middle\",\n marginRight: \"0.3em\",\n cursor: \"pointer\",\n userSelect: \"none\",\n alignItems: \"center\",\n height: \"1.2em\",\n },\n\n \".cm-draftly-task-checkbox input\": {\n cursor: \"pointer\",\n margin: 0,\n width: \"1.1em\",\n height: \"1.1em\",\n appearance: \"none\",\n border: \"1px solid\",\n borderRadius: \"0.25em\",\n backgroundColor: \"transparent\",\n position: \"relative\",\n },\n\n \".cm-draftly-task-checkbox.checked input::after\": {\n content: '\"✓\"',\n position: \"absolute\",\n left: \"1px\",\n top: \"-3px\",\n },\n});\n","import { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { Extension } from \"@codemirror/state\";\nimport { DecorationContext, DecorationPlugin } from \"../plugin\";\nimport DOMPurify from \"dompurify\";\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 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 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 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 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\n override get decorationPriority(): number {\n return 30;\n }\n\n override getExtensions(): Extension[] {\n return [htmlTheme];\n }\n\n override 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 htmlTheme = EditorView.theme({\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","import { DraftlyPlugin } from \"../plugin\";\nimport { HeadingPlugin } from \"./heading-plugin\";\nimport { InlinePlugin } from \"./inline-plugin\";\nimport { ListPlugin } from \"./list-plugin\";\nimport { HTMLPlugin } from \"./html-plugin\";\n\nconst defaultPlugins: DraftlyPlugin[] = [new HeadingPlugin(), new InlinePlugin(), new ListPlugin(), new HTMLPlugin()];\n\nexport { defaultPlugins };\n","import { Extension, Prec } from \"@codemirror/state\";\nimport {\n drawSelection,\n EditorView,\n highlightActiveLine,\n KeyBinding,\n keymap,\n rectangularSelection,\n} 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 { defaultPlugins } from \"./plugins/plugins\";\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 /** 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 /** Draw selection */\n drawSelection?: boolean;\n\n /** Highlight active line */\n highlightActiveLine?: boolean;\n\n /** Rectangular selection */\n rectangularSelection?: 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 plugins = [],\n extensions = [],\n keymap: configKeymap = [],\n disableViewPlugin = false,\n defaultKeybindings = true,\n history: configHistory = true,\n indentWithTab: configIndentWithTab = true,\n drawSelection: configDrawSelection = true,\n highlightActiveLine: configHighlightActiveLine = true,\n rectangularSelection: configRectangularSelection = true,\n lineWrapping: configLineWrapping = true,\n onNodesChange: configOnNodesChange = undefined,\n } = config;\n\n const allPlugins = [...defaultPlugins, ...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 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 ...(configDrawSelection ? [drawSelection()] : []),\n ...(configHighlightActiveLine && disableViewPlugin ? [highlightActiveLine()] : []),\n ...(configRectangularSelection ? [rectangularSelection()] : []),\n ];\n\n // draftly extensions (pass plugins for decoration support)\n const draftlyExtensions: Extension[] = [];\n if (!disableViewPlugin) draftlyExtensions.push(createDraftlyViewExtension(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 // 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 { draftly } from \"./draftly\";\n\nexport default draftly;\n\nexport * from \"./draftly\";\nexport * from \"./plugin\";\nexport * from \"./view-plugin\";\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "draftly",
|
|
3
|
+
"version": "0.1.0-alpha.0",
|
|
4
|
+
"description": "Core library for draftly",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/neuronexul/draftly.git",
|
|
9
|
+
"directory": "packages/draftly"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.cjs",
|
|
13
|
+
"module": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsup",
|
|
17
|
+
"dev": "tsup --watch",
|
|
18
|
+
"lint": "eslint src/",
|
|
19
|
+
"typecheck": "tsc --noEmit"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@turbo/gen": "^2.7.6",
|
|
23
|
+
"@types/dompurify": "^3.2.0",
|
|
24
|
+
"@types/node": "^25.0.10",
|
|
25
|
+
"@workspace/eslint-config": "workspace:*",
|
|
26
|
+
"@workspace/typescript-config": "workspace:*",
|
|
27
|
+
"eslint": "^9.39.2",
|
|
28
|
+
"tsup": "^8.5.1",
|
|
29
|
+
"typescript": "^5.9.3"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@lezer/common": "^1.5.0",
|
|
33
|
+
"@lezer/highlight": "^1.2.3",
|
|
34
|
+
"@lezer/markdown": "^1.6.3",
|
|
35
|
+
"dompurify": "^3.3.1",
|
|
36
|
+
"zod": "^4.3.6"
|
|
37
|
+
},
|
|
38
|
+
"exports": {
|
|
39
|
+
".": {
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"import": "./dist/index.js",
|
|
42
|
+
"require": "./dist/index.cjs",
|
|
43
|
+
"default": "./dist/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./src": {
|
|
46
|
+
"types": "./src/index.ts",
|
|
47
|
+
"default": "./src/index.ts"
|
|
48
|
+
},
|
|
49
|
+
"./src/*": "./src/*"
|
|
50
|
+
},
|
|
51
|
+
"files": [
|
|
52
|
+
"dist",
|
|
53
|
+
"src",
|
|
54
|
+
"README.md",
|
|
55
|
+
"LICENSE"
|
|
56
|
+
],
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"@codemirror/commands": "^6.10.1",
|
|
59
|
+
"@codemirror/lang-markdown": "^6.5.0",
|
|
60
|
+
"@codemirror/language": "^6.12.1",
|
|
61
|
+
"@codemirror/language-data": "^6.5.2",
|
|
62
|
+
"@codemirror/state": "^6.5.4",
|
|
63
|
+
"@codemirror/view": "^6.39.11"
|
|
64
|
+
}
|
|
65
|
+
}
|
package/src/draftly.ts
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { Extension, Prec } from "@codemirror/state";
|
|
2
|
+
import {
|
|
3
|
+
drawSelection,
|
|
4
|
+
EditorView,
|
|
5
|
+
highlightActiveLine,
|
|
6
|
+
KeyBinding,
|
|
7
|
+
keymap,
|
|
8
|
+
rectangularSelection,
|
|
9
|
+
} from "@codemirror/view";
|
|
10
|
+
import { markdown, markdownKeymap, markdownLanguage } from "@codemirror/lang-markdown";
|
|
11
|
+
import type { MarkdownConfig } from "@lezer/markdown";
|
|
12
|
+
import { DraftlyPlugin, PluginContext } from "./plugin";
|
|
13
|
+
import { createDraftlyViewExtension } from "./view-plugin";
|
|
14
|
+
import { defaultKeymap, history, historyKeymap, indentWithTab } from "@codemirror/commands";
|
|
15
|
+
import { indentOnInput } from "@codemirror/language";
|
|
16
|
+
import { languages } from "@codemirror/language-data";
|
|
17
|
+
import { defaultPlugins } from "./plugins/plugins";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* DraftlyNode: represents a node in the markdown tree
|
|
21
|
+
*
|
|
22
|
+
* Useful for debugging and development
|
|
23
|
+
*/
|
|
24
|
+
export type DraftlyNode = {
|
|
25
|
+
from: number;
|
|
26
|
+
to: number;
|
|
27
|
+
name: string;
|
|
28
|
+
children: DraftlyNode[];
|
|
29
|
+
isSelected: boolean;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Configuration options for the draftly editor
|
|
34
|
+
*/
|
|
35
|
+
export interface DraftlyConfig {
|
|
36
|
+
/** Plugins to load */
|
|
37
|
+
plugins?: DraftlyPlugin[];
|
|
38
|
+
|
|
39
|
+
/** Additional markdown extensions for the parser */
|
|
40
|
+
markdown?: MarkdownConfig[];
|
|
41
|
+
|
|
42
|
+
/** Additional CodeMirror extensions */
|
|
43
|
+
extensions?: Extension[];
|
|
44
|
+
|
|
45
|
+
/** Additional keybindings */
|
|
46
|
+
keymap?: KeyBinding[];
|
|
47
|
+
|
|
48
|
+
/** Disable the built-in view plugin (for raw markdown mode) */
|
|
49
|
+
disableViewPlugin?: boolean;
|
|
50
|
+
|
|
51
|
+
/** Enable default keybindings */
|
|
52
|
+
defaultKeybindings?: boolean;
|
|
53
|
+
|
|
54
|
+
/** Enable history */
|
|
55
|
+
history?: boolean;
|
|
56
|
+
|
|
57
|
+
/** Enable indent with tab */
|
|
58
|
+
indentWithTab?: boolean;
|
|
59
|
+
|
|
60
|
+
/** Draw selection */
|
|
61
|
+
drawSelection?: boolean;
|
|
62
|
+
|
|
63
|
+
/** Highlight active line */
|
|
64
|
+
highlightActiveLine?: boolean;
|
|
65
|
+
|
|
66
|
+
/** Rectangular selection */
|
|
67
|
+
rectangularSelection?: boolean;
|
|
68
|
+
|
|
69
|
+
/** Line wrapping in raw markdown mode */
|
|
70
|
+
lineWrapping?: boolean;
|
|
71
|
+
|
|
72
|
+
/** Callback to receive the nodes on every update */
|
|
73
|
+
onNodesChange?: (nodes: DraftlyNode[]) => void;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Creates a draftly editor extension bundle for CodeMirror 6
|
|
78
|
+
*
|
|
79
|
+
* @param config - Configuration options for the editor
|
|
80
|
+
* @returns CodeMirror Extension that can be added to EditorState
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* import { EditorView } from '@codemirror/view';
|
|
85
|
+
* import { EditorState } from '@codemirror/state';
|
|
86
|
+
* import { draftly } from 'draftly';
|
|
87
|
+
*
|
|
88
|
+
* const view = new EditorView({
|
|
89
|
+
* state: EditorState.create({
|
|
90
|
+
* doc: '# Hello draftly',
|
|
91
|
+
* extensions: [draftly()]
|
|
92
|
+
* }),
|
|
93
|
+
* parent: document.getElementById('editor')
|
|
94
|
+
* });
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export function draftly(config: DraftlyConfig = {}): Extension[] {
|
|
98
|
+
const {
|
|
99
|
+
plugins = [],
|
|
100
|
+
extensions = [],
|
|
101
|
+
keymap: configKeymap = [],
|
|
102
|
+
disableViewPlugin = false,
|
|
103
|
+
defaultKeybindings = true,
|
|
104
|
+
history: configHistory = true,
|
|
105
|
+
indentWithTab: configIndentWithTab = true,
|
|
106
|
+
drawSelection: configDrawSelection = true,
|
|
107
|
+
highlightActiveLine: configHighlightActiveLine = true,
|
|
108
|
+
rectangularSelection: configRectangularSelection = true,
|
|
109
|
+
lineWrapping: configLineWrapping = true,
|
|
110
|
+
onNodesChange: configOnNodesChange = undefined,
|
|
111
|
+
} = config;
|
|
112
|
+
|
|
113
|
+
const allPlugins = [...defaultPlugins, ...plugins];
|
|
114
|
+
|
|
115
|
+
// Collect all extensions from plugins
|
|
116
|
+
const pluginExtensions: Extension[] = [];
|
|
117
|
+
const pluginKeymaps: KeyBinding[] = [];
|
|
118
|
+
const markdownExtensions: MarkdownConfig[] = [];
|
|
119
|
+
|
|
120
|
+
// Create plugin context for lifecycle methods
|
|
121
|
+
const pluginContext: PluginContext = { config };
|
|
122
|
+
|
|
123
|
+
// Process each plugin
|
|
124
|
+
for (const plugin of allPlugins) {
|
|
125
|
+
// Call onRegister lifecycle hook
|
|
126
|
+
plugin.onRegister(pluginContext);
|
|
127
|
+
|
|
128
|
+
// Collect extensions via class method
|
|
129
|
+
const exts = plugin.getExtensions();
|
|
130
|
+
if (exts.length > 0) {
|
|
131
|
+
pluginExtensions.push(...exts);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Collect keymaps via class method
|
|
135
|
+
const keys = plugin.getKeymap();
|
|
136
|
+
if (keys.length > 0) {
|
|
137
|
+
pluginKeymaps.push(...keys);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Collect markdown parser extensions via class method
|
|
141
|
+
const md = plugin.getMarkdownConfig();
|
|
142
|
+
if (md) {
|
|
143
|
+
markdownExtensions.push(md);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Add config-level markdown extensions
|
|
148
|
+
if (config.markdown) {
|
|
149
|
+
markdownExtensions.push(...config.markdown);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Build the base markdown language support
|
|
153
|
+
const markdownSupport = markdown({
|
|
154
|
+
base: markdownLanguage,
|
|
155
|
+
codeLanguages: languages,
|
|
156
|
+
extensions: markdownExtensions,
|
|
157
|
+
addKeymap: true,
|
|
158
|
+
completeHTMLTags: true,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// Core CodeMirror extensions (in order)
|
|
162
|
+
const baseExtensions: Extension[] = [
|
|
163
|
+
...(defaultKeybindings ? [keymap.of(defaultKeymap)] : []),
|
|
164
|
+
...(configHistory ? [history(), keymap.of(historyKeymap)] : []),
|
|
165
|
+
...(configIndentWithTab ? [indentOnInput(), keymap.of([indentWithTab])] : []),
|
|
166
|
+
...(configDrawSelection ? [drawSelection()] : []),
|
|
167
|
+
...(configHighlightActiveLine && disableViewPlugin ? [highlightActiveLine()] : []),
|
|
168
|
+
...(configRectangularSelection ? [rectangularSelection()] : []),
|
|
169
|
+
];
|
|
170
|
+
|
|
171
|
+
// draftly extensions (pass plugins for decoration support)
|
|
172
|
+
const draftlyExtensions: Extension[] = [];
|
|
173
|
+
if (!disableViewPlugin) draftlyExtensions.push(createDraftlyViewExtension(allPlugins, configOnNodesChange));
|
|
174
|
+
if (!disableViewPlugin || configLineWrapping) draftlyExtensions.push(EditorView.lineWrapping);
|
|
175
|
+
|
|
176
|
+
// Compose all extensions together
|
|
177
|
+
const composedExtensions: Extension[] = [
|
|
178
|
+
// Core markdown support (highest priority)
|
|
179
|
+
Prec.high(markdownSupport),
|
|
180
|
+
Prec.high(keymap.of(markdownKeymap)),
|
|
181
|
+
|
|
182
|
+
// Core CodeMirror extensions
|
|
183
|
+
...baseExtensions,
|
|
184
|
+
|
|
185
|
+
// draftly view plugin for rich rendering
|
|
186
|
+
...draftlyExtensions,
|
|
187
|
+
|
|
188
|
+
// Plugin extensions & keymaps
|
|
189
|
+
...pluginExtensions,
|
|
190
|
+
pluginKeymaps.length > 0 ? keymap.of(pluginKeymaps) : [],
|
|
191
|
+
|
|
192
|
+
// Config keymaps & extensions
|
|
193
|
+
configKeymap.length > 0 ? keymap.of(configKeymap) : [],
|
|
194
|
+
...extensions,
|
|
195
|
+
];
|
|
196
|
+
|
|
197
|
+
return composedExtensions;
|
|
198
|
+
}
|