moondown 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/editor/config/normalize-editor-config.ts", "../src/editor/runtime/editor-runtime.ts", "../src/extensions/default-extensions.ts", "../src/extensions/correct-list/index.ts", "../src/extensions/correct-list/list-keymap.ts", "../src/extensions/correct-list/update-list-effect.ts", "../src/extensions/correct-list/list-functions.ts", "../src/extensions/correct-list/constants.ts", "../src/extensions/correct-list/list-plugins.ts", "../src/extensions/correct-list/bullet-widget.ts", "../src/extensions/mark-parser/mark-parser-extension.ts", "../src/extensions/mark-parser/index.ts", "../src/extensions/underline-parser/underline-parser-extension.ts", "../src/extensions/underline-parser/index.ts", "../src/extensions/strikethrough-parser/strikethrough-parser-extension.ts", "../src/extensions/strikethrough-parser/index.ts", "../src/extensions/final-new-line/final-new-line.ts", "../src/extensions/final-new-line/index.ts", "../src/extensions/slash-command/index.ts", "../src/extensions/slash-command/keymap.ts", "../src/extensions/slash-command/fields.ts", "../src/extensions/slash-command/slash-command.ts", "../src/core/constants.ts", "../src/core/utils/editor-utils.ts", "../src/extensions/slash-command/ghost-writer.ts", "../src/extensions/runtime/editor-runtime-state.ts", "../src/core/utils/string-utils.ts", "../src/extensions/slash-command/commands.ts", "../src/core/utils/dom-utils.ts", "../src/extensions/image/index.ts", "../src/extensions/image/fields.ts", "../src/extensions/image/types.ts", "../src/extensions/image/image-renderer.ts", "../src/extensions/image/image-widgets.ts", "../src/extensions/image/image-widget-helpers.ts", "../src/extensions/image/image-drag-n-drop.ts", "../src/extensions/fenced-code/fenced-code-plugin.ts", "../src/extensions/fenced-code/decorations.ts", "../src/extensions/fenced-code/language-autocomplete.ts", "../src/extensions/fenced-code/index.ts", "../src/extensions/blockquote/keymaps.ts", "../src/extensions/blockquote/index.ts", "../src/extensions/bubble-menu/index.ts", "../src/extensions/bubble-menu/fields.ts", "../src/extensions/bubble-menu/bubble-menu.ts", "../src/extensions/bubble-menu/ai-polish-panel.ts", "../src/extensions/bubble-menu/ai-polish-prompts.ts", "../src/extensions/bubble-menu/content-block-actions.ts", "../src/extensions/bubble-menu/content-inline-actions.ts", "../src/extensions/bubble-menu/content-active-state.ts", "../src/extensions/bubble-menu/bubble-menu-items.ts", "../src/extensions/bubble-menu/bubble-menu-dom.ts", "../src/extensions/bubble-menu/bubble-menu-positioning.ts", "../src/extensions/widget-edit-bubble/widget-edit-bubble.ts", "../src/extensions/widget-edit-bubble/selection-target.ts", "../src/extensions/widget-edit-bubble/index.ts", "../src/extensions/cross-boundary-delete.ts", "../src/theme/base-theme.ts", "../src/theme/theme-highlight-style.ts", "../src/theme/theme-palette.ts", "../src/theme/theme-editor-styles.ts", "../src/extensions/latex/latex-renderer.ts", "../src/extensions/table/table-widget-rendering.ts", "../src/extensions/latex/index.ts", "../src/extensions/markdown-syntax-hiding/markdown-syntax-hiding-field.ts", "../src/extensions/markdown-syntax-hiding/node-structural-handlers.ts", "../src/extensions/markdown-syntax-hiding/node-inline-handlers.ts", "../src/extensions/markdown-syntax-hiding/link-widget.ts", "../src/extensions/markdown-syntax-hiding/highlight-effects.ts", "../src/extensions/markdown-syntax-hiding/widgets.ts", "../src/extensions/markdown-syntax-hiding/footnote-handlers.ts", "../src/extensions/markdown-syntax-hiding/link-definition-handlers.ts", "../src/extensions/markdown-syntax-hiding/index.ts", "../src/extensions/mermaid/mermaid-renderer.ts", "../src/extensions/mermaid/index.ts", "../src/extensions/table/index.ts", "../src/extensions/table/table-position.ts", "../src/extensions/table/render-tables.ts", "../src/extensions/table/table-widget-save.ts", "../src/extensions/table/table-widget-position.ts", "../src/extensions/table/calculate-col-sizes.ts", "../src/extensions/table/build-pipe.ts", "../src/extensions/table/table-helper-styles.ts", "../src/extensions/table/compute-css.ts", "../src/extensions/table/generic-text-node.ts", "../src/extensions/table/table-functions.ts", "../src/extensions/table/parse-children.ts", "../src/extensions/table/parse-table-node.ts", "../src/extensions/table/table-ast.ts", "../src/extensions/table/markdown-to-html.ts", "../src/extensions/table/constants.ts", "../src/extensions/table/table-editor-actions-popover.ts", "../src/extensions/table/table-editor-edge-buttons.ts", "../src/extensions/table/table-editor-model.ts", "../src/extensions/table/table-editor-navigation.ts", "../src/extensions/table/table-editor-container.ts", "../src/extensions/table/select-in-element.ts", "../src/extensions/table/table-editor-dom.ts", "../src/extensions/table/table-editor.ts", "../src/extensions/table/table-widget-editor-factory.ts", "../src/extensions/runtime/wysiwyg-extensions.ts", "../src/editor/theme/resolve-theme.ts", "../src/editor/runtime/editor-lifecycle-listener.ts", "../src/editor/runtime/editor-plugin-runtime.ts", "../src/editor/moondown-editor.ts", "../src/moondown.ts", "../src/plugins/define-plugin.ts"],
4
+ "sourcesContent": ["import Moondown from './moondown';\n\nexport { Moondown };\nexport default Moondown;\nexport * from './core';\nexport * from './plugins';\n", "import type { EditorConfig, ResolvedEditorConfig } from '../../core';\n\nconst DEFAULT_LOCALE = 'en';\n\nexport function resolveInitialDocument(initialDoc: string | undefined, config?: EditorConfig): string {\n if (typeof initialDoc === 'string' && initialDoc.length > 0) {\n return initialDoc;\n }\n return config?.initialDoc ?? '';\n}\n\nexport function normalizeEditorConfig(config?: EditorConfig): ResolvedEditorConfig {\n return {\n theme: config?.theme ?? 'light',\n syntaxHiding: config?.syntaxHiding ?? true,\n placeholder: config?.placeholder ?? '',\n readOnly: config?.readOnly ?? false,\n onChange: config?.onChange,\n onFocus: config?.onFocus,\n onBlur: config?.onBlur,\n translations: { ...(config?.translations ?? {}) },\n locale: normalizeLocale(config?.locale),\n onAIStream: config?.onAIStream ?? null,\n plugins: normalizePlugins(config?.plugins),\n };\n}\n\nfunction normalizeLocale(locale: string | undefined): string {\n const normalizedLocale = locale?.trim();\n return normalizedLocale && normalizedLocale.length > 0 ? normalizedLocale : DEFAULT_LOCALE;\n}\n\nfunction normalizePlugins(plugins: EditorConfig['plugins']): ResolvedEditorConfig['plugins'] {\n if (!plugins || plugins.length === 0) {\n return [];\n }\n return [...plugins];\n}\n", "import { EditorState, Transaction, type Extension } from '@codemirror/state';\nimport { EditorView, placeholder as viewPlaceholder } from '@codemirror/view';\nimport type {\n AIStreamHandler,\n MoondownTranslations,\n ResolvedEditorConfig,\n Theme,\n} from '../../core';\nimport { createDefaultExtensions } from '../../extensions/default-extensions';\nimport {\n placeholderCompartment,\n readOnlyCompartment,\n setLocale,\n setOnAIStream,\n setPluginSlashCommands,\n setTranslations,\n themeCompartment,\n wysiwygCompartment,\n} from '../../extensions/runtime/editor-runtime-state';\nimport { resolveWysiwygExtensions } from '../../extensions/runtime/wysiwyg-extensions';\nimport { resolveThemeExtension } from '../theme/resolve-theme';\nimport { createEditorLifecycleListener } from './editor-lifecycle-listener';\nimport { EditorPluginRuntime } from './editor-plugin-runtime';\n\ninterface EditorRuntimeOptions {\n element: HTMLElement;\n initialDoc: string;\n config: ResolvedEditorConfig;\n}\n\nfunction resolvePlaceholderExtension(placeholder: string): Extension {\n if (placeholder.length === 0) {\n return [];\n }\n return viewPlaceholder(placeholder);\n}\n\nexport class EditorRuntime {\n private readonly view: EditorView;\n private readonly pluginRuntime: EditorPluginRuntime;\n private readonly config: ResolvedEditorConfig;\n\n constructor({ element, initialDoc, config }: EditorRuntimeOptions) {\n this.config = {\n ...config,\n translations: { ...config.translations },\n plugins: [...config.plugins],\n };\n\n this.pluginRuntime = new EditorPluginRuntime({\n plugins: this.config.plugins,\n config: this.config,\n initialDoc,\n });\n\n const extensions: Extension[] = [\n ...this.pluginRuntime.preRuntimeExtensions,\n ...createDefaultExtensions(),\n ...this.pluginRuntime.postRuntimeExtensions,\n readOnlyCompartment.of(EditorState.readOnly.of(config.readOnly)),\n placeholderCompartment.of(resolvePlaceholderExtension(config.placeholder)),\n createEditorLifecycleListener({\n onChange: config.onChange,\n onFocus: config.onFocus,\n onBlur: config.onBlur,\n }),\n ];\n\n const state = EditorState.create({\n doc: initialDoc,\n extensions,\n });\n\n this.view = new EditorView({\n state,\n parent: element,\n });\n this.pluginRuntime.bindView(this.view, this.config);\n this.view.dispatch({\n effects: setPluginSlashCommands.of(this.pluginRuntime.runtimeSlashCommands),\n });\n\n this.setTheme(this.config.theme);\n this.toggleSyntaxHiding(this.config.syntaxHiding);\n this.setTranslations(this.config.translations);\n this.setLocale(this.config.locale);\n\n if (this.config.onAIStream) {\n this.setAIStreamHandler(this.config.onAIStream);\n }\n }\n\n get editorView(): EditorView {\n return this.view;\n }\n\n getValue(): string {\n return this.view.state.doc.toString();\n }\n\n setValue(value: string): void {\n this.view.dispatch({\n changes: {\n from: 0,\n to: this.view.state.doc.length,\n insert: value,\n },\n annotations: Transaction.addToHistory.of(false),\n });\n }\n\n toggleSyntaxHiding(enabled: boolean): void {\n this.config.syntaxHiding = enabled;\n this.view.dispatch({\n effects: wysiwygCompartment.reconfigure(resolveWysiwygExtensions(enabled)),\n });\n }\n\n setTheme(theme: Theme): void {\n this.config.theme = theme;\n this.view.dispatch({\n effects: themeCompartment.reconfigure(resolveThemeExtension(theme)),\n });\n }\n\n setReadOnly(enabled: boolean): void {\n this.config.readOnly = enabled;\n this.view.dispatch({\n effects: readOnlyCompartment.reconfigure(EditorState.readOnly.of(enabled)),\n });\n }\n\n setPlaceholder(placeholder: string): void {\n this.config.placeholder = placeholder;\n this.view.dispatch({\n effects: placeholderCompartment.reconfigure(resolvePlaceholderExtension(placeholder)),\n });\n }\n\n setAIStreamHandler(handler: AIStreamHandler): void {\n this.config.onAIStream = handler;\n this.view.dispatch({ effects: setOnAIStream.of(handler) });\n }\n\n setTranslations(translations: MoondownTranslations): void {\n const normalizedTranslations = { ...translations };\n this.config.translations = normalizedTranslations;\n this.view.dispatch({ effects: setTranslations.of(normalizedTranslations) });\n }\n\n setLocale(locale: string): void {\n const normalizedLocale = locale || 'en';\n this.config.locale = normalizedLocale;\n this.view.dispatch({ effects: setLocale.of(normalizedLocale) });\n }\n\n focus(): void {\n this.view.focus();\n }\n\n destroy(): void {\n this.pluginRuntime.destroy();\n this.view.destroy();\n }\n}\n", "import { Prec, type Extension } from '@codemirror/state';\nimport { EditorView, keymap, rectangularSelection } from '@codemirror/view';\nimport { indentOnInput } from '@codemirror/language';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { defaultKeymap, history, historyKeymap, indentWithTab, redo, undo } from \"@codemirror/commands\";\nimport { closeBracketsKeymap, completionKeymap } from \"@codemirror/autocomplete\";\nimport { languages } from \"@codemirror/language-data\";\nimport { GFM } from \"@lezer/markdown\";\n\n// Import custom extensions\nimport { correctList } from \"./correct-list\";\nimport { Mark } from \"./mark-parser\";\nimport { Underline } from \"./underline-parser\";\nimport { Strikethrough } from \"./strikethrough-parser\";\nimport { finalNewLine } from \"./final-new-line\";\nimport { slashCommand } from \"./slash-command\";\nimport { imageKeymap } from \"./image\";\nimport { fencedCode } from \"./fenced-code\";\nimport { blockquote } from \"./blockquote\";\nimport { bubbleMenu } from \"./bubble-menu\";\nimport { widgetEditBubble } from './widget-edit-bubble';\nimport { crossBoundaryDeleteKeymap } from './cross-boundary-delete';\nimport { lightTheme } from \"../theme/base-theme\";\nimport {\n localeState,\n onAIStreamState,\n placeholderCompartment,\n pluginSlashCommandsState,\n readOnlyCompartment,\n setLocale,\n setOnAIStream,\n setPluginSlashCommands,\n setTranslations,\n themeCompartment,\n translationsState,\n wysiwygCompartment,\n} from './runtime/editor-runtime-state';\nimport { wysiwygExtensions } from './runtime/wysiwyg-extensions';\n\nexport function createDefaultExtensions(): Extension[] {\n return [\n history({ minDepth: 200 }),\n Prec.highest(keymap.of([\n { key: 'Mod-z', run: undo, preventDefault: true },\n { key: 'Ctrl-z', run: undo, preventDefault: true },\n { key: 'Mod-Shift-z', run: redo, preventDefault: true },\n { key: 'Ctrl-Shift-z', run: redo, preventDefault: true },\n { key: 'Ctrl-y', run: redo, preventDefault: true },\n ])),\n rectangularSelection(),\n indentOnInput(),\n\n slashCommand(),\n correctList(),\n fencedCode(),\n blockquote(),\n bubbleMenu(),\n widgetEditBubble(),\n\n onAIStreamState,\n translationsState,\n localeState,\n pluginSlashCommandsState,\n imageKeymap,\n crossBoundaryDeleteKeymap,\n\n keymap.of([\n indentWithTab,\n ...defaultKeymap,\n ...completionKeymap,\n ...historyKeymap,\n ...closeBracketsKeymap,\n ]),\n\n EditorView.lineWrapping,\n wysiwygCompartment.of(wysiwygExtensions),\n\n markdown({\n codeLanguages: languages,\n extensions: [GFM, Mark, Underline, Strikethrough],\n addKeymap: false,\n }),\n\n finalNewLine,\n themeCompartment.of(lightTheme),\n ];\n}\n\nexport const defaultExtensions: Extension[] = createDefaultExtensions();\n\nexport {\n localeState,\n onAIStreamState,\n placeholderCompartment,\n pluginSlashCommandsState,\n readOnlyCompartment,\n setLocale,\n setOnAIStream,\n setPluginSlashCommands,\n setTranslations,\n themeCompartment,\n translationsState,\n wysiwygCompartment,\n wysiwygExtensions,\n};\n", "import type {Extension} from \"@codemirror/state\";\nimport { keymap } from \"@codemirror/view\";\nimport { listKeymap } from \"./list-keymap.ts\";\nimport { bulletListPlugin, updateListPlugin } from \"./list-plugins\";\n\n/**\n * Returns a CodeMirror extension for enhanced list editing.\n * This includes keymaps for indentation and automatic numbering,\n * and view plugins for list updates and custom bullet rendering.\n */\nexport function correctList(): Extension {\n return [\n keymap.of(listKeymap),\n updateListPlugin,\n bulletListPlugin,\n ];\n}", "import { EditorView, type KeyBinding } from \"@codemirror/view\";\nimport { indentLess, indentMore, deleteCharBackward, deleteCharForward } from \"@codemirror/commands\";\nimport { updateListEffect } from \"./update-list-effect\";\nimport { getListInfo, generateListItem } from \"./list-functions\";\nimport { LIST_INDENT, LIST_UPDATE_DELAY } from \"./constants\";\n\n/**\n * Keymap for list editing functionality.\n * Handles Tab, Shift-Tab, Enter, Backspace, and Delete keys to provide\n * intuitive list management.\n */\nexport const listKeymap: KeyBinding[] = [\n {\n key: 'Tab',\n run: (view: EditorView) => {\n const { state } = view;\n const { selection } = state;\n const pos = selection.main.head;\n const listInfo = getListInfo(state, pos);\n\n if (listInfo) {\n // Indent the list item\n indentMore(view);\n\n // Defer list number update to ensure the indent operation completes\n setTimeout(() => {\n view.dispatch({\n effects: updateListEffect.of({ from: 0, to: state.doc.length }),\n });\n }, LIST_UPDATE_DELAY);\n\n return true;\n }\n return false;\n },\n },\n {\n key: 'Shift-Tab',\n run: (view: EditorView) => {\n const { state } = view;\n const { selection } = state;\n const pos = selection.main.head;\n const listInfo = getListInfo(state, pos);\n\n if (listInfo && listInfo.indent > LIST_INDENT.MIN) {\n // Decrease indentation\n indentLess(view);\n\n // Defer list number update\n setTimeout(() => {\n view.dispatch({\n effects: updateListEffect.of({ from: 0, to: state.doc.length }),\n });\n }, LIST_UPDATE_DELAY);\n\n return true;\n }\n return false;\n },\n },\n {\n key: 'Enter',\n run: (view: EditorView) => {\n const { state } = view;\n const { selection } = state;\n const pos = selection.main.head;\n const listInfo = getListInfo(state, pos);\n\n if (listInfo) {\n const line = state.doc.lineAt(pos);\n\n if (listInfo.content.trim() === '') {\n // If the current list item is empty, de-indent or exit the list\n if (listInfo.indent === LIST_INDENT.MIN) {\n // At the top level, so exit the list\n const transaction = state.update({\n changes: {\n from: line.from,\n to: line.to,\n insert: '',\n },\n selection: { anchor: line.from }\n });\n view.dispatch(transaction);\n } else {\n // De-indent to the previous level\n const newIndent = Math.max(LIST_INDENT.MIN, listInfo.indent - LIST_INDENT.SIZE);\n const newListItem = generateListItem(listInfo.type, newIndent);\n\n const transaction = state.update({\n changes: {\n from: line.from,\n to: line.to,\n insert: newListItem,\n },\n selection: { anchor: line.from + newListItem.length }\n });\n view.dispatch(transaction);\n\n setTimeout(() => {\n view.dispatch({\n effects: updateListEffect.of({ from: 0, to: state.doc.length }),\n });\n }, LIST_UPDATE_DELAY);\n }\n } else {\n // Create a new list item at the same level\n const newListItem = generateListItem(listInfo.type, listInfo.indent);\n const insertText = `\\n${newListItem}`;\n\n const transaction = state.update({\n changes: {\n from: pos,\n to: pos,\n insert: insertText,\n },\n selection: { anchor: pos + insertText.length }\n });\n view.dispatch(transaction);\n\n setTimeout(() => {\n view.dispatch({\n effects: updateListEffect.of({ from: 0, to: state.doc.length }),\n });\n }, LIST_UPDATE_DELAY);\n }\n\n return true;\n }\n\n return false;\n },\n },\n {\n key: 'Backspace',\n run: (view: EditorView) => {\n const { state } = view;\n const { selection } = state;\n const pos = selection.main.head;\n const currentLine = state.doc.lineAt(pos);\n const currentListInfo = getListInfo(state, pos);\n\n let previousLineListInfo = null;\n if (currentLine.number > 1) {\n const previousLine = state.doc.line(currentLine.number - 1);\n previousLineListInfo = getListInfo(state, previousLine.from);\n }\n\n // If the deletion might affect list numbering, run default action and then trigger an update.\n if (currentListInfo || previousLineListInfo) {\n const result = deleteCharBackward(view);\n\n setTimeout(() => {\n view.dispatch({\n effects: updateListEffect.of({ from: 0, to: view.state.doc.length }),\n });\n }, LIST_UPDATE_DELAY);\n\n return result;\n }\n\n return false;\n },\n },\n {\n key: 'Delete',\n run: (view: EditorView) => {\n const { state } = view;\n const { selection } = state;\n const pos = selection.main.head;\n const currentLine = state.doc.lineAt(pos);\n const currentListInfo = getListInfo(state, pos);\n\n let nextLineListInfo = null;\n if (currentLine.number < state.doc.lines) {\n const nextLine = state.doc.line(currentLine.number + 1);\n nextLineListInfo = getListInfo(state, nextLine.from);\n }\n\n if (currentListInfo || nextLineListInfo) {\n const result = deleteCharForward(view);\n\n setTimeout(() => {\n view.dispatch({\n effects: updateListEffect.of({ from: 0, to: view.state.doc.length }),\n });\n }, LIST_UPDATE_DELAY);\n\n return result;\n }\n\n return false;\n },\n },\n];", "import { StateEffect } from \"@codemirror/state\";\n\n/**\n * A CodeMirror StateEffect used to explicitly trigger an update of list numbering.\n * This is useful after operations like indentation where the change needs to be\n * processed before the list can be correctly re-numbered.\n */\nexport const updateListEffect = StateEffect.define<{ from: number; to: number }>({});", "import { EditorView } from \"@codemirror/view\";\nimport { EditorState, Transaction } from \"@codemirror/state\";\n\ninterface ListLevel {\n indent: number;\n number: number;\n type: 'ordered' | 'unordered';\n}\n\n/**\n * Updates the numbering of multi-level ordered lists throughout the document.\n * This function iterates through all lines, maintains a stack of list levels,\n * and corrects the numbers as needed.\n * @param view - The CodeMirror EditorView instance.\n */\nexport function updateLists(view: EditorView) {\n const { state } = view;\n const doc = state.doc;\n const lines = doc.toString().split('\\n');\n const changes = [];\n\n let listStack: ListLevel[] = [];\n\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber++) {\n const line = lines[lineNumber];\n const lineStart = doc.line(lineNumber + 1).from;\n\n const orderedMatch = line.match(/^(\\s*)(\\d+(?:\\.\\d+)*)\\.\\s/);\n const unorderedMatch = line.match(/^(\\s*)([-*+])\\s/);\n\n if (orderedMatch || unorderedMatch) {\n const indentation = (orderedMatch || unorderedMatch)![1];\n const currentIndent = indentation.length;\n const isOrdered = !!orderedMatch;\n const currentType = isOrdered ? 'ordered' : 'unordered';\n\n // Pop levels from stack that are deeper than the current indent\n while (listStack.length > 0 && listStack[listStack.length - 1].indent > currentIndent) {\n listStack.pop();\n }\n\n const topLevel = listStack.length > 0 ? listStack[listStack.length - 1] : null;\n\n if (topLevel && topLevel.indent === currentIndent && topLevel.type === currentType) {\n // Same level and type: increment the number\n topLevel.number++;\n } else {\n // New level (deeper indent) or type switch at the same indent\n if (topLevel && topLevel.indent === currentIndent) {\n // Type switch, replace the top level of the stack\n listStack.pop();\n }\n listStack.push({\n indent: currentIndent,\n number: 1,\n type: currentType,\n });\n }\n\n if (isOrdered) {\n // Construct the new multi-level number string (e.g., \"1.2.3\")\n const newNumber = listStack\n .filter(level => level.type === 'ordered')\n .map(level => level.number)\n .join('.');\n\n const currentNumber = orderedMatch![2];\n if (currentNumber !== newNumber) {\n const numberStart = lineStart + indentation.length;\n const numberEnd = numberStart + currentNumber.length;\n changes.push({\n from: numberStart,\n to: numberEnd,\n insert: newNumber,\n });\n }\n }\n } else if (line.trim().length > 0) {\n // Non-list content line resets the stack\n listStack = [];\n }\n // Empty lines do not reset the stack, allowing for space between list items.\n }\n\n if (changes.length > 0) {\n view.dispatch({\n changes,\n annotations: Transaction.addToHistory.of(false),\n });\n }\n}\n\n/**\n * Gets information about the list item at a given position.\n * @param state - The editor state.\n * @param pos - The position in the document.\n * @returns An object with list info, or null if it's not a list item.\n */\nexport function getListInfo(state: EditorState, pos: number) {\n const line = state.doc.lineAt(pos);\n const lineText = line.text;\n\n const orderedMatch = lineText.match(/^(\\s*)(\\d+(?:\\.\\d+)*)\\.\\s/);\n if (orderedMatch) {\n return {\n type: 'ordered' as const,\n indent: orderedMatch[1].length,\n marker: orderedMatch[2] + '.',\n content: lineText.slice(orderedMatch[0].length),\n markerEnd: line.from + orderedMatch[0].length\n };\n }\n\n const unorderedMatch = lineText.match(/^(\\s*)([-*+])\\s/);\n if (unorderedMatch) {\n return {\n type: 'unordered' as const,\n indent: unorderedMatch[1].length,\n marker: unorderedMatch[2],\n content: lineText.slice(unorderedMatch[0].length),\n markerEnd: line.from + unorderedMatch[0].length\n };\n }\n\n return null;\n}\n\n/**\n * Generates the text for a new list item.\n * @param type - 'ordered' or 'unordered'.\n * @param indent - The indentation level in spaces.\n * @param number - The number for an ordered list item.\n * @returns The full list item marker string.\n */\nexport function generateListItem(type: 'ordered' | 'unordered', indent: number, number?: string): string {\n const indentation = ' '.repeat(indent);\n if (type === 'ordered') {\n return `${indentation}${number || '1'}. `;\n } else {\n const markers = ['-', '*', '+'];\n const markerIndex = Math.floor(indent / 2) % markers.length;\n return `${indentation}${markers[markerIndex]} `;\n }\n}\n", "/**\n * Constants for list functionality in the editor.\n */\n\n/**\n * List indentation settings.\n */\nexport const LIST_INDENT = {\n /** Size of one indent level in spaces */\n SIZE: 2,\n /** Minimum indent level */\n MIN: 0,\n /** Maximum indent level */\n MAX: 10,\n} as const;\n\n/**\n * List types.\n */\nexport const LIST_TYPES = {\n ORDERED: 'ordered',\n UNORDERED: 'unordered',\n} as const;\n\n/**\n * List markers.\n */\nexport const LIST_MARKERS = {\n /** Unordered list marker */\n UNORDERED: '- ',\n /** Ordered list marker template (number will be substituted) */\n ORDERED_TEMPLATE: (num: number) => `${num}. `,\n} as const;\n\n/**\n * Timeout for deferred list updates (in milliseconds).\n * A value of 0 defers the update to the next event loop cycle.\n */\nexport const LIST_UPDATE_DELAY = 0;\n\n/**\n * Regular expressions for list detection.\n */\nexport const LIST_PATTERNS = {\n /** Matches an ordered list item (e.g., \" 1. \"). */\n ORDERED: /^(\\s*)(\\d+)\\.\\s/,\n /** Matches an unordered list item (e.g., \" - \"). */\n UNORDERED: /^(\\s*)[-*+]\\s/,\n /** Matches any list item. */\n ANY: /^(\\s*)([-*+]|\\d+\\.)\\s/,\n} as const;", "import { Decoration, type DecorationSet, EditorView, ViewPlugin, ViewUpdate } from \"@codemirror/view\";\nimport { updateListEffect } from \"./update-list-effect\";\nimport { updateLists } from \"./list-functions\";\nimport { type Text, RangeSetBuilder } from \"@codemirror/state\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { BulletWidget } from \"./bullet-widget\";\nimport { LIST_INDENT, LIST_PATTERNS } from \"./constants\";\n\n/**\n * Maximum number of unique bullet styles to cycle through before repeating.\n */\nconst BULLET_STYLE_COUNT = 6;\n\nfunction textHasListMarker(text: string): boolean {\n return LIST_PATTERNS.ANY.test(text) ||\n new RegExp('\\n' + LIST_PATTERNS.ANY.source.slice(1)).test(text);\n}\n\nfunction touchesListMarker(doc: Text, from: number, to: number): boolean {\n if (doc.length === 0) return false;\n\n const safeFrom = Math.max(0, Math.min(from, doc.length));\n const safeTo = Math.max(safeFrom, Math.min(to, doc.length));\n const line = doc.lineAt(safeFrom);\n const markerMatch = line.text.match(/^(\\s*)(?:\\d[\\d.]*\\.?|[-*+])\\s+/);\n\n if (!markerMatch) return false;\n\n const markerEnd = line.from + markerMatch[0].length;\n return safeFrom <= markerEnd && safeTo <= markerEnd;\n}\n\n/**\n * A ViewPlugin that listens for document changes or specific effects to trigger\n * automatic list number and structure updates.\n */\nexport const updateListPlugin = EditorView.updateListener.of((update) => {\n // Check for a manual update trigger via `updateListEffect`.\n let hasManualUpdate = false;\n for (const tr of update.transactions) {\n for (const e of tr.effects) {\n if (e.is(updateListEffect)) {\n hasManualUpdate = true;\n updateLists(update.view);\n return;\n }\n }\n }\n\n // If no manual trigger, check if document changes warrant an update.\n if (!hasManualUpdate && update.docChanged) {\n let needsUpdate = false;\n\n for (const tr of update.transactions) {\n tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n const deletedText = update.startState.doc.sliceString(fromA, toA);\n const insertedText = inserted.toString();\n\n const containsLineBreak = deletedText.includes('\\n') || insertedText.includes('\\n');\n const editingMarkerOnly = !containsLineBreak && (\n touchesListMarker(update.startState.doc, fromA, toA) ||\n touchesListMarker(update.state.doc, fromB, toB)\n );\n\n if (editingMarkerOnly) {\n return;\n }\n\n // Re-numbering is only needed for structural list changes. Plain\n // content edits inside a list must not inject transactions into\n // the user's undo chain.\n if (containsLineBreak || textHasListMarker(deletedText) || textHasListMarker(insertedText)) {\n needsUpdate = true;\n }\n });\n\n if (needsUpdate) break;\n }\n\n if (needsUpdate) {\n updateLists(update.view);\n }\n }\n});\n\n/**\n * A ViewPlugin that replaces standard unordered list markers (e.g., `-`, `*`)\n * with custom, styled bullet points using a Decoration Widget.\n */\nexport const bulletListPlugin = ViewPlugin.fromClass(class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = this.buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = this.buildDecorations(update.view);\n }\n }\n\n buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(view.state).iterate({\n from,\n to,\n enter: (node) => {\n if (node.name === 'ListItem' || node.name.includes('ListItem')) {\n const line = view.state.doc.lineAt(node.from);\n const blockquoteMatch = line.text.match(/^((?:>\\s*)*)/);\n const blockquotePrefix = blockquoteMatch ? blockquoteMatch[1] : '';\n const remainingText = line.text.slice(blockquotePrefix.length);\n const unorderedMatch = remainingText.match(/^(\\s*)([-*+])(\\s+)/);\n\n if (unorderedMatch) {\n const indentation = unorderedMatch[1] || '';\n const marker = unorderedMatch[2];\n const spaceAfter = unorderedMatch[3];\n\n const indentLevel = Math.floor(indentation.length / LIST_INDENT.SIZE);\n const levelClass = `cm-bullet-list-l${indentLevel % BULLET_STYLE_COUNT}`;\n\n const bulletStart = line.from + blockquotePrefix.length + indentation.length;\n const bulletEnd = bulletStart + marker.length + spaceAfter.length;\n\n builder.add(\n bulletStart,\n bulletEnd,\n Decoration.replace({\n widget: new BulletWidget(levelClass, indentLevel, indentation),\n })\n );\n }\n }\n }\n });\n }\n return builder.finish();\n }\n}, {\n decorations: v => v.decorations,\n});\n", "import { WidgetType } from \"@codemirror/view\";\n\n/**\n * A CodeMirror Widget that renders a custom bullet point for unordered lists.\n * This allows for different bullet styles based on the indentation level.\n */\nexport class BulletWidget extends WidgetType {\n constructor(private className: string, private level: number, private indentation: string) {\n super();\n }\n\n toDOM() {\n const span = document.createElement(\"span\");\n const bulletSymbol = this.getBulletSymbol(this.level);\n // The HTML structure renders the indentation and a styled bullet symbol.\n span.innerHTML = `${this.indentation}<span class=\"bullet-symbol\" style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; font-weight: bold; transform: scale(0.6); display: inline-block;\">${bulletSymbol}</span> `;\n span.className = `cm-bullet-list ${this.className}`;\n span.style.display = 'inline-block';\n return span;\n }\n\n /**\n * Determines the bullet symbol based on the indentation level.\n * Cycles through a predefined set of symbols.\n * @param level The indentation level (0-indexed).\n * @returns The character to use as the bullet point.\n */\n private getBulletSymbol(level: number): string {\n const symbols = [\n \"\u25CF\", // Solid circle (Level 0)\n \"\u25CB\", // Hollow circle (Level 1)\n \"\u25A0\", // Solid square (Level 2)\n \"\u25A1\", // Hollow square (Level 3)\n \"\u25B6\", // Triangle (Level 4)\n \"\u25B7\" // Hollow triangle (Level 5+)\n ];\n\n const symbolIndex = level % symbols.length;\n return symbols[symbolIndex];\n }\n\n eq(other: BulletWidget) {\n return other.className === this.className &&\n other.level === this.level &&\n other.indentation === this.indentation;\n }\n}", "/**\n * A Lezer markdown parser extension for `==highlight==` (mark) syntax.\n * This is a common extension supported by GFM and other markdown flavors.\n */\nimport {InlineContext, type MarkdownExtension} from \"@lezer/markdown\";\n\n/**\n * Delimiter configuration for mark (highlight) parsing.\n * Defines how the parser should handle `==` markers.\n */\nexport const MarkDelim = { resolve: \"Mark\", mark: \"MarkMarker\" };\n\n/**\n * The MarkdownExtension object for mark/highlight formatting.\n * It defines the new AST nodes and the inline parsing logic.\n */\nexport const MarkExtension: MarkdownExtension = {\n defineNodes: [\"Mark\", \"MarkMarker\"],\n parseInline: [\n {\n name: \"Mark\",\n parse(cx: InlineContext, next: number, pos: number) {\n // 61 is the ASCII code for '='. Check for `==`.\n if (next != 61 || cx.char(pos + 1) != 61) return -1;\n\n // Register a delimiter pair for mark formatting.\n // The delimiter spans 2 characters (`==`).\n return cx.addDelimiter(MarkDelim, pos, pos + 2, true, true);\n },\n },\n ],\n};", "import {MarkExtension} from \"./mark-parser-extension.ts\";\n\n/**\n * Exports the Lezer markdown extension to add support for `==highlight==` syntax.\n */\nexport const Mark = MarkExtension;", "/**\n * A Lezer markdown parser extension for `~underline~` syntax.\n * This is a non-standard markdown feature but is included for enhanced formatting.\n */\nimport {InlineContext, type MarkdownExtension} from \"@lezer/markdown\";\n\n/**\n * Delimiter configuration for underline parsing.\n * Defines how the parser should handle `~` markers.\n */\nexport const UnderlineDelim = {resolve: \"Underline\", mark: \"UnderlineMarker\"};\n\n/**\n * The MarkdownExtension object for underline formatting.\n * It defines the new AST nodes and the inline parsing logic.\n */\nexport const UnderlineExtension: MarkdownExtension = {\n defineNodes: [\"Underline\", \"UnderlineMarker\"],\n parseInline: [\n {\n name: \"Underline\",\n parse(cx: InlineContext, next: number, pos: number) {\n // 126 is the ASCII code for '~'. Check for a single tilde.\n if (next != 126) return -1;\n // Ensure it's not part of a double tilde (strikethrough).\n if (cx.char(pos + 1) === 126) return -1;\n\n // Register a delimiter pair for underline formatting.\n return cx.addDelimiter(UnderlineDelim, pos, pos + 1, true, true);\n },\n },\n ],\n};", "import {UnderlineExtension} from \"./underline-parser-extension.ts\";\n\n/**\n * Exports the Lezer markdown extension to add support for `~underline~` syntax.\n */\nexport const Underline = UnderlineExtension;", "/**\n * A Lezer markdown parser extension for `~~strikethrough~~` syntax.\n * This is a common extension supported by GFM and other markdown flavors.\n */\nimport {InlineContext, type MarkdownExtension} from \"@lezer/markdown\";\n\n/**\n * Delimiter configuration for strikethrough parsing.\n * Defines how the parser should handle `~~` markers.\n */\nexport const StrikethroughDelim = { resolve: \"Strikethrough\", mark: \"StrikethroughMarker\" };\n\n/**\n * The MarkdownExtension object for strikethrough formatting.\n * It defines the new AST nodes and the inline parsing logic.\n */\nexport const StrikethroughExtension: MarkdownExtension = {\n defineNodes: [\"Strikethrough\", \"StrikethroughMarker\"],\n parseInline: [\n {\n name: \"Strikethrough\",\n parse(cx: InlineContext, next: number, pos: number) {\n // 126 is the ASCII code for '~'. Check for `~~`.\n if (next != 126 || cx.char(pos + 1) != 126) return -1;\n\n // Register a delimiter pair for strikethrough formatting.\n return cx.addDelimiter(StrikethroughDelim, pos, pos + 2, true, true);\n },\n },\n ],\n};", "import {StrikethroughExtension} from \"./strikethrough-parser-extension.ts\";\n\n/**\n * Exports the Lezer markdown extension to add support for `~~strikethrough~~` syntax.\n */\nexport const Strikethrough = StrikethroughExtension;", "import {EditorView, type PluginValue, ViewPlugin, ViewUpdate} from \"@codemirror/view\";\nimport {Text, Transaction} from \"@codemirror/state\";\n\n/**\n * A CodeMirror ViewPlugin that ensures the document always ends with a newline.\n * This is a common convention for text files and can prevent issues with some tools.\n */\nexport class FinalNewLinePlugin implements PluginValue {\n constructor(private readonly view: EditorView) {\n // Ensure a final newline on initialization.\n setTimeout(() => {\n this.ensureFinalNewLine(true);\n }, 0);\n }\n\n private ensureFinalNewLine(newLine = false) {\n const endLine = this.view.state.doc.line(this.view.state.doc.lines);\n\n // If the last line is not empty, add a newline.\n if (endLine.length) {\n const hasSelection = this.view.state.selection.ranges.some((range) => range.from !== range.to);\n\n this.view.dispatch({\n changes: {\n from: endLine.to,\n insert: Text.of(['', '']), // Inserts a newline\n },\n annotations: Transaction.addToHistory.of(false),\n selection: newLine && !hasSelection ? {\n anchor: endLine.to + 1,\n head: endLine.to + 1,\n } : undefined,\n },\n );\n }\n }\n\n update(update: ViewUpdate) {\n // Re-check when the editor gains focus.\n if (update.focusChanged) {\n setTimeout(() => {\n this.ensureFinalNewLine();\n }, 0);\n }\n }\n}\n\nexport const finalNewLinePlugin = ViewPlugin.fromClass(FinalNewLinePlugin);\n", "import {finalNewLinePlugin} from \"./final-new-line.ts\";\n\n/**\n * The CodeMirror extension that ensures a final newline at the end of the document.\n */\nexport const finalNewLine = finalNewLinePlugin;", "import {EditorState, type Extension} from \"@codemirror/state\";\nimport {EditorView} from \"@codemirror/view\";\nimport { handleKeyDown, slashCommandKeymap } from './keymap';\nimport { newTextState, scrollIntoView } from './ghost-writer';\nimport { slashCommandState, toggleSlashCommand } from './fields';\nimport { slashCommandPlugin } from './slash-command';\n\n/**\n * Returns a CodeMirror extension for the slash command feature.\n * This bundles the state management, view plugin for the menu, keymaps,\n * and event handlers necessary for triggering and controlling the command menu.\n */\nexport function slashCommand(): Extension {\n return [\n slashCommandState,\n slashCommandPlugin,\n newTextState,\n slashCommandKeymap,\n EditorView.domEventHandlers({\n keydown(event, view) {\n if (event.key === \"/\" && !view.state.facet(EditorState.readOnly)) {\n view.dispatch({\n effects: toggleSlashCommand.of(true)\n })\n }\n // Handle Escape key globally\n if (event.key === \"Escape\") {\n return handleKeyDown(view, event)\n }\n }\n }),\n EditorView.updateListener.of(update => {\n if (update.transactions.length > 0) {\n for (const transaction of update.transactions) {\n for (const effect of transaction.effects) {\n if (effect.is(scrollIntoView)) {\n update.view.dispatch({\n effects: EditorView.scrollIntoView(effect.value)\n })\n }\n }\n }\n }\n }),\n ]\n}\n", "import { EditorView, keymap } from '@codemirror/view';\nimport { EditorState } from '@codemirror/state';\nimport { slashCommandState, toggleSlashCommand, updateSelectedIndex } from './fields';\nimport { slashCommandPlugin } from './slash-command';\nimport {\n findSelectableSlashCommandIndex,\n isSelectableSlashCommand,\n normalizeSelectedSlashCommandIndex,\n resolveFilteredSlashCommands,\n} from './commands';\nimport { pluginSlashCommandsState, translationsState } from '../runtime/editor-runtime-state';\n\n/**\n * Handles keydown events when the slash command menu is active.\n * @param view The CodeMirror EditorView instance.\n * @param event The keyboard event.\n * @returns `true` if the event was handled, `false` otherwise.\n */\nexport function handleKeyDown(view: EditorView, event: KeyboardEvent): boolean {\n const state = view.state.field(slashCommandState);\n const translations = view.state.field(translationsState);\n const pluginCommands = view.state.field(pluginSlashCommandsState);\n const plugin = view.plugin(slashCommandPlugin);\n\n if (view.state.facet(EditorState.readOnly)) {\n if (state.active) {\n view.dispatch({\n effects: toggleSlashCommand.of(false),\n });\n }\n return event.key === 'Escape';\n }\n\n // Globally handle Escape to close menu or abort AI\n if (event.key === 'Escape') {\n if (state.active) {\n view.dispatch({\n effects: toggleSlashCommand.of(false),\n });\n }\n if (plugin) {\n plugin.abortAIContinuation();\n }\n return true;\n }\n\n if (!state.active) return false;\n\n const filteredCommands = resolveFilteredSlashCommands(pluginCommands, state.filterText, translations);\n const selectedIndex = normalizeSelectedSlashCommandIndex(filteredCommands, state.selectedIndex);\n\n if (selectedIndex !== state.selectedIndex) {\n view.dispatch({\n effects: updateSelectedIndex.of(selectedIndex),\n });\n }\n\n if (filteredCommands.length === 0) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter') {\n return true;\n }\n return false;\n }\n\n switch (event.key) {\n case 'ArrowDown': {\n const startIndex = (selectedIndex + 1) % filteredCommands.length;\n const nextIndex = findSelectableSlashCommandIndex(filteredCommands, startIndex, 1);\n if (nextIndex >= 0) {\n view.dispatch({\n effects: updateSelectedIndex.of(nextIndex),\n });\n }\n return true;\n }\n case 'ArrowUp': {\n const startIndex = (selectedIndex - 1 + filteredCommands.length) % filteredCommands.length;\n const prevIndex = findSelectableSlashCommandIndex(filteredCommands, startIndex, -1);\n if (prevIndex >= 0) {\n view.dispatch({\n effects: updateSelectedIndex.of(prevIndex),\n });\n }\n return true;\n }\n case 'Enter':\n if (filteredCommands.length > 0) {\n const selectedCommand = filteredCommands[selectedIndex];\n if (!isSelectableSlashCommand(selectedCommand)) {\n return true;\n }\n if (plugin) {\n plugin.executeCommand(view, selectedCommand);\n } else {\n view.dispatch({\n changes: { from: state.pos, to: view.state.selection.main.from, insert: '' },\n effects: toggleSlashCommand.of(false),\n });\n selectedCommand.execute(view);\n view.focus();\n }\n }\n return true;\n }\n\n return false;\n}\n\n/**\n * The keymap for navigating and selecting items in the slash command menu.\n * It takes precedence for arrow keys, Enter, and Escape when the menu is active.\n */\nexport const slashCommandKeymap = keymap.of([\n {\n key: 'ArrowDown',\n run: (view) => handleKeyDown(view, { key: 'ArrowDown' } as KeyboardEvent),\n preventDefault: true,\n },\n {\n key: 'ArrowUp',\n run: (view) => handleKeyDown(view, { key: 'ArrowUp' } as KeyboardEvent),\n preventDefault: true,\n },\n {\n key: 'Enter',\n run: (view) => handleKeyDown(view, { key: 'Enter' } as KeyboardEvent),\n preventDefault: true,\n },\n {\n key: 'Escape',\n run: (view) => handleKeyDown(view, { key: 'Escape' } as KeyboardEvent),\n preventDefault: true,\n },\n]);\n", "import {StateEffect, StateField} from \"@codemirror/state\";\n\nexport const SLASH_COMMAND_FILTER_REGEX = /\\/([^\\s/]*)$/u;\n\n/**\n * A StateEffect used to explicitly toggle the visibility of the slash command menu.\n */\nexport const toggleSlashCommand = StateEffect.define<boolean>()\n\n/**\n * A StateEffect to update the index of the currently selected item in the slash command menu.\n */\nexport const updateSelectedIndex = StateEffect.define<number>()\n\n/**\n * A StateField that holds the state for the slash command feature.\n * It tracks whether the menu is active, the text used for filtering commands,\n * the position where the command was triggered, and the currently selected item index.\n */\nexport const slashCommandState = StateField.define<{\n active: boolean,\n filterText: string,\n pos: number,\n selectedIndex: number\n}>({\n create: () => ({active: false, filterText: \"\", pos: 0, selectedIndex: 0}),\n update(value, tr) {\n // Handle explicit state changes via effects (e.g., closing the menu).\n for (let e of tr.effects) {\n if (e.is(toggleSlashCommand)) {\n return {active: e.value, filterText: \"\", pos: tr.selection?.main.from ?? 0, selectedIndex: 0}\n }\n if (e.is(updateSelectedIndex)) {\n return {...value, selectedIndex: e.value}\n }\n }\n\n // Automatically detect slash command activation based on text input and selection.\n if (tr.selection) {\n const line = tr.state.doc.lineAt(tr.selection.main.from)\n const lineText = line.text.slice(0, tr.selection.main.from - line.from)\n const match = SLASH_COMMAND_FILTER_REGEX.exec(lineText)\n const cursorPos = tr.selection.main.from - line.from\n\n if (match && (cursorPos === line.text.length || (cursorPos === 0 && lineText.trim() === \"\"))) {\n return {\n active: true,\n filterText: match[1],\n pos: tr.selection.main.from - match[0].length,\n selectedIndex: value.selectedIndex // Preserve selection while filtering\n }\n } else {\n return {active: false, filterText: \"\", pos: 0, selectedIndex: 0}\n }\n }\n return value\n },\n})\n", "import { EditorView, ViewPlugin, ViewUpdate } from \"@codemirror/view\";\nimport { EditorState } from \"@codemirror/state\";\nimport { createIcons, icons } from 'lucide';\nimport { SLASH_COMMAND_FILTER_REGEX, slashCommandState, toggleSlashCommand, updateSelectedIndex } from \"./fields\";\nimport {\n getSlashCommandTitle,\n normalizeSelectedSlashCommandIndex,\n resolveFilteredSlashCommands,\n type SlashCommandOption,\n} from \"./commands\";\nimport { CSS_CLASSES, ICON_SIZES, TIMING } from \"../../core/constants\";\nimport { createElement, createIconElement, debounce, scrollIntoView as scrollElementIntoView } from \"../../core/utils/dom-utils\";\nimport { pluginSlashCommandsState, translationsState } from '../runtime/editor-runtime-state';\nimport {MoondownTranslations} from \"../../core\";\n\n/**\n * A CodeMirror ViewPlugin that manages the rendering and interaction of the slash command menu.\n */\nexport const slashCommandPlugin = ViewPlugin.fromClass(class {\n editorDom: HTMLElement;\n menu: HTMLElement;\n currentAbortController: AbortController | null;\n debouncedUpdate: (update: ViewUpdate) => void;\n handleEditorClick: () => void;\n handleDocumentClick: (event: MouseEvent) => void;\n destroyed: boolean;\n\n constructor(view: EditorView) {\n this.editorDom = view.dom;\n this.menu = createElement('div', CSS_CLASSES.SLASH_COMMAND_MENU);\n view.dom.appendChild(this.menu);\n this.currentAbortController = null;\n this.destroyed = false;\n this.debouncedUpdate = debounce(\n (update: ViewUpdate) => this.updateMenu(update),\n TIMING.DEBOUNCE_DELAY\n );\n this.handleEditorClick = () => {\n this.abortAIContinuation();\n };\n this.handleDocumentClick = (e: MouseEvent) => {\n if (this.destroyed) {\n return;\n }\n if (!this.menu.contains(e.target as Node) && !view.dom.contains(e.target as Node)) {\n view.dispatch({\n effects: toggleSlashCommand.of(false)\n });\n this.abortAIContinuation();\n }\n };\n\n view.dom.addEventListener('click', this.handleEditorClick);\n document.addEventListener('click', this.handleDocumentClick);\n }\n\n update(update: ViewUpdate): void {\n if (this.destroyed) {\n return;\n }\n this.debouncedUpdate(update);\n }\n\n updateMenu(update: ViewUpdate): void {\n if (this.destroyed) {\n return;\n }\n\n const state = update.state.field(slashCommandState);\n const translations = update.state.field(translationsState);\n const pluginCommands = update.state.field(pluginSlashCommandsState);\n\n if (!state.active) {\n this.hide();\n return;\n }\n\n this.show();\n\n requestAnimationFrame(() => {\n if (this.destroyed || !this.menu.isConnected) {\n return;\n }\n\n const pos = update.view.coordsAtPos(state.pos);\n if (pos) {\n const editorRect = update.view.dom.getBoundingClientRect();\n const menuRect = this.menu.getBoundingClientRect();\n\n if (pos.top + menuRect.height > editorRect.bottom) {\n this.menu.style.top = `${pos.top - editorRect.top - menuRect.height}px`;\n } else {\n this.menu.style.top = `${pos.top - editorRect.top + 20}px`;\n }\n\n this.menu.style.left = `${pos.left - editorRect.left}px`;\n }\n });\n\n const filteredCommands = resolveFilteredSlashCommands(pluginCommands, state.filterText, translations);\n const selectedIndex = normalizeSelectedSlashCommandIndex(filteredCommands, state.selectedIndex);\n\n if (selectedIndex !== state.selectedIndex) {\n update.view.dispatch({\n effects: updateSelectedIndex.of(selectedIndex),\n });\n }\n\n this.renderCommands(filteredCommands, selectedIndex, update.view, translations);\n }\n\n renderCommands(\n commands: SlashCommandOption[],\n selectedIndex: number,\n view: EditorView,\n translations: MoondownTranslations\n ): void {\n requestAnimationFrame(() => {\n if (this.destroyed || !this.menu.isConnected) {\n return;\n }\n\n const fragment = document.createDocumentFragment();\n\n commands.forEach((cmd, index) => {\n if (cmd.isDivider) {\n const divider = createElement(\"hr\", CSS_CLASSES.SLASH_COMMAND_DIVIDER);\n fragment.appendChild(divider);\n return;\n }\n\n const isSelected = index === selectedIndex;\n const itemClass = `${CSS_CLASSES.SLASH_COMMAND_ITEM} ${\n isSelected ? CSS_CLASSES.SLASH_COMMAND_SELECTED : ''\n }`;\n const item = createElement(\"div\", itemClass);\n const titleText = getSlashCommandTitle(cmd, translations);\n\n const icon = createIconElement(cmd.icon, \"cm-slash-command-icon\");\n const title = createElement(\"span\", \"cm-slash-command-title\");\n title.textContent = titleText;\n\n item.appendChild(icon);\n item.appendChild(title);\n\n item.addEventListener(\"mousedown\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.executeCommand(view, cmd);\n });\n\n fragment.appendChild(item);\n });\n\n this.menu.innerHTML = '';\n this.menu.appendChild(fragment);\n\n createIcons({\n icons,\n attrs: ICON_SIZES.MEDIUM,\n });\n\n this.scrollSelectedIntoView();\n });\n }\n\n scrollSelectedIntoView(): void {\n const selectedItem = this.menu.querySelector(\n `.${CSS_CLASSES.SLASH_COMMAND_ITEM}.${CSS_CLASSES.SLASH_COMMAND_SELECTED}`\n ) as HTMLElement;\n\n if (selectedItem) {\n scrollElementIntoView(selectedItem, this.menu);\n }\n }\n\n executeCommand(view: EditorView, cmd: SlashCommandOption): void {\n if (view.state.facet(EditorState.readOnly)) {\n view.dispatch({\n effects: toggleSlashCommand.of(false)\n });\n view.focus();\n return;\n }\n\n const state = view.state;\n const currentPos = state.selection.main.from;\n const line = state.doc.lineAt(currentPos);\n const lineStart = line.from;\n const lineText = line.text;\n const cursorInLine = currentPos - lineStart;\n\n const beforeCursor = lineText.slice(0, cursorInLine);\n const slashMatch = beforeCursor.match(SLASH_COMMAND_FILTER_REGEX);\n\n if (slashMatch) {\n const slashStart = lineStart + beforeCursor.lastIndexOf(slashMatch[0]);\n const slashEnd = currentPos;\n\n view.dispatch({\n changes: { from: slashStart, to: slashEnd, insert: \"\" },\n effects: toggleSlashCommand.of(false)\n });\n } else {\n view.dispatch({\n effects: toggleSlashCommand.of(false)\n });\n }\n\n const result = cmd.execute(view);\n if (result instanceof Promise) {\n result\n .then(controller => {\n if (controller instanceof AbortController) {\n this.currentAbortController = controller;\n }\n })\n .catch((error) => {\n console.error('[MoondownSlashCommand] command execution failed', error);\n });\n }\n\n view.focus();\n }\n\n show(): void {\n this.menu.style.display = \"block\";\n }\n\n hide(): void {\n this.menu.style.display = \"none\";\n }\n\n setCurrentAbortController(controller: AbortController): void {\n this.currentAbortController = controller;\n }\n\n clearCurrentAbortController(): void {\n this.currentAbortController = null;\n }\n\n abortAIContinuation(): void {\n if (this.currentAbortController) {\n this.currentAbortController.abort();\n this.currentAbortController = null;\n }\n }\n\n destroy(): void {\n this.destroyed = true;\n this.editorDom.removeEventListener('click', this.handleEditorClick);\n document.removeEventListener('click', this.handleDocumentClick);\n this.menu.remove();\n this.abortAIContinuation();\n }\n});\n", "/**\n * Core constants for the Moondown editor\n */\n\n// ============================================\n// Markdown Syntax Constants\n// ============================================\n\n/** Markdown inline style markers */\nexport const MARKDOWN_MARKERS = {\n BOLD: '**',\n ITALIC: '*',\n STRIKETHROUGH: '~~',\n HIGHLIGHT: '==',\n UNDERLINE: '~',\n INLINE_CODE: '`',\n} as const;\n\n/** Markdown block patterns */\nexport const MARKDOWN_PATTERNS = {\n HEADING_PREFIX: '#',\n ORDERED_LIST: /^\\d+\\.\\s/,\n UNORDERED_LIST: /^-\\s/,\n BLOCKQUOTE: /^>\\s/,\n IMAGE: /^!\\[.*?\\]\\(.*?\\)$/,\n SLASH_COMMAND: /\\/(\\w*)$/,\n} as const;\n\n/** Markdown text templates */\nexport const MARKDOWN_TEMPLATES = {\n TABLE: \"\\n| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |\\n\",\n LINK: \"[Link text](url)\",\n CODE_BLOCK: \"```\\n\\n```\",\n MERMAID_BLOCK: \"```mermaid\\nflowchart TD\\n A --> B\\n```\",\n LATEX_BLOCK: \"```latex\\n\\\\\\\\frac{a}{b}\\n```\",\n} as const;\n\n// ============================================\n// UI Constants\n// ============================================\n\n/** CSS class names */\nexport const CSS_CLASSES = {\n // Bubble menu\n BUBBLE_MENU: 'cm-bubble-menu',\n BUBBLE_MENU_ITEM: 'cm-bubble-menu-item',\n BUBBLE_MENU_DROPDOWN: 'cm-bubble-menu-dropdown',\n BUBBLE_MENU_SUB_ITEM: 'cm-bubble-menu-sub-item',\n BUBBLE_MENU_ACTIVE: 'active',\n\n // Slash command\n SLASH_COMMAND_MENU: 'cm-slash-command-menu',\n SLASH_COMMAND_ITEM: 'cm-slash-command-item',\n SLASH_COMMAND_SELECTED: 'selected',\n SLASH_COMMAND_DIVIDER: 'cm-slash-command-divider',\n\n // Image widget\n IMAGE_WIDGET: 'cm-image-widget',\n IMAGE_ERROR: 'cm-image-error',\n IMAGE_PLACEHOLDER: 'cm-image-placeholder',\n MERMAID_WIDGET: 'cm-mermaid-widget',\n MERMAID_CANVAS: 'cm-mermaid-canvas',\n MERMAID_HINT: 'cm-mermaid-hint',\n MERMAID_LOADING: 'cm-mermaid-loading',\n MERMAID_ERROR: 'cm-mermaid-error',\n LATEX_WIDGET: 'cm-latex-widget',\n LATEX_CANVAS: 'cm-latex-canvas',\n LATEX_HINT: 'cm-latex-hint',\n LATEX_LOADING: 'cm-latex-loading',\n LATEX_ERROR: 'cm-latex-error',\n WIDGET_EDIT_BUBBLE: 'cm-widget-edit-bubble',\n WIDGET_EDIT_BUBBLE_TITLE: 'cm-widget-edit-bubble-title',\n WIDGET_EDIT_BUBBLE_INPUT: 'cm-widget-edit-bubble-input',\n WIDGET_EDIT_BUBBLE_ACTIONS: 'cm-widget-edit-bubble-actions',\n WIDGET_EDIT_BUBBLE_BUTTON: 'cm-widget-edit-bubble-button',\n WIDGET_EDIT_BUBBLE_BUTTON_PRIMARY: 'cm-widget-edit-bubble-button-primary',\n WIDGET_EDIT_BUBBLE_MULTILINE: 'cm-widget-edit-bubble-multiline',\n\n // Markdown syntax hiding\n HIDDEN_MARKDOWN: 'cm-hidden-markdown',\n VISIBLE_MARKDOWN: 'cm-visible-markdown',\n\n // Code blocks\n FENCED_CODE: 'cm-fenced-code',\n\n // Blockquote\n BLOCKQUOTE_LINE: 'cm-blockquote-line',\n\n // Loading states\n LOADING_WIDGET: 'cm-loading-widget',\n LOADING_SPINNER: 'cm-loading-spinner',\n NEW_TEXT: 'cm-new-text',\n\n // AI Polish Panel\n AI_POLISH_PANEL: 'cm-ai-polish-panel',\n AI_POLISH_INPUT_SECTION: 'cm-ai-polish-input-section',\n AI_POLISH_INPUT_ROW: 'cm-ai-polish-input-row',\n AI_POLISH_INPUT: 'cm-ai-polish-input',\n AI_POLISH_RESPONSE_SECTION: 'cm-ai-polish-response-section',\n AI_POLISH_RESPONSE_BUBBLE: 'cm-ai-polish-response-bubble',\n} as const;\n\n/** Icon sizes */\nexport const ICON_SIZES = {\n SMALL: { width: '12', height: '12' },\n MEDIUM: { width: '16', height: '16' },\n LARGE: { width: '20', height: '20' },\n} as const;\n\n/** Timing constants (in milliseconds) */\nexport const TIMING = {\n DEBOUNCE_DELAY: 10,\n CLICK_TIMEOUT: 200,\n ANIMATION_DURATION: 2000,\n} as const;\n\n/** Popper.js configuration */\nexport const POPPER_CONFIG = {\n PLACEMENT: 'top',\n OFFSET: [0, 8],\n} as const;\n\n/** Custom DOM event names used across widgets/extensions. */\nexport const CUSTOM_EVENTS = {\n WIDGET_EDIT_REQUEST: 'moondown-widget-edit-request',\n} as const;\n\n// ============================================\n// Editor Behavior Constants\n// ============================================\n\n/** Selection and cursor behavior */\nexport const SELECTION = {\n /** Extra characters to check around selection for style markers */\n MARKER_CONTEXT_LENGTH: 3,\n} as const;\n\n/** AI-related constants */\nexport const AI_CONFIG = {\n MODEL: 'glm-4-flash',\n FILL_PLACEHOLDER: '{FILL_ME}',\n DEFAULT_COMPLETION_LENGTH: 200,\n} as const;\n\n// ============================================\n// Type Guards\n// ============================================\n\nexport type MarkdownMarker = typeof MARKDOWN_MARKERS[keyof typeof MARKDOWN_MARKERS];\nexport type CSSClass = typeof CSS_CLASSES[keyof typeof CSS_CLASSES];\n", "\nimport { EditorState, type ChangeSpec } from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SELECTION } from \"../constants\";\n\n/**\n * Utility functions for editor operations\n */\n\n// Re-export for convenience\nexport { SELECTION };\n\n/**\n * Gets the current line at the cursor position\n * @param state - Editor state\n * @returns The line object at cursor position\n */\nexport function getCurrentLine(state: EditorState) {\n const { from } = state.selection.main;\n return state.doc.lineAt(from);\n}\n\n/**\n * Gets all lines in a selection range\n * @param state - Editor state\n * @param from - Start position\n * @param to - End position\n * @returns Array of line objects\n */\nexport function getLinesInRange(state: EditorState, from: number, to: number) {\n const lines = [];\n let pos = from;\n \n while (pos <= to) {\n const line = state.doc.lineAt(pos);\n lines.push(line);\n \n if (line.to + 1 > to) break;\n pos = line.to + 1;\n }\n \n return lines;\n}\n\n/**\n * Applies changes to the editor\n * @param view - Editor view\n * @param changes - Array of change specifications\n */\nexport function applyChanges(view: EditorView, changes: ChangeSpec[]) {\n if (changes.length === 0) return;\n \n view.dispatch({ changes });\n}\n\n/**\n * Gets text in a range with extra context around it\n * @param state - Editor state\n * @param from - Start position\n * @param to - End position\n * @param contextLength - Number of extra characters to include on each side\n * @returns Object with text, start position, and end position\n */\nexport function getTextWithContext(\n state: EditorState,\n from: number,\n to: number,\n contextLength: number\n) {\n const start = Math.max(0, from - contextLength);\n const end = Math.min(state.doc.length, to + contextLength);\n \n return {\n text: state.doc.sliceString(start, end),\n start,\n end,\n };\n}\n\n/**\n * Checks if the current selection is empty (cursor position)\n * @param state - Editor state\n * @returns True if selection is empty\n */\nexport function isSelectionEmpty(state: EditorState): boolean {\n const { from, to } = state.selection.main;\n return from === to;\n}\n\n/**\n * Gets the selected text\n * @param state - Editor state\n * @returns Selected text or empty string\n */\nexport function getSelectedText(state: EditorState): string {\n const { from, to } = state.selection.main;\n return state.doc.sliceString(from, to);\n}\n\n/**\n * Replaces the current selection with text\n * @param view - Editor view\n * @param text - Text to insert\n * @param selectInserted - Whether to select the inserted text\n */\nexport function replaceSelection(\n view: EditorView,\n text: string,\n selectInserted: boolean = false\n) {\n const { from, to } = view.state.selection.main;\n \n const changes = { from, to, insert: text };\n const newCursorPos = from + text.length;\n \n view.dispatch({\n changes,\n selection: selectInserted\n ? { anchor: from, head: newCursorPos }\n : { anchor: newCursorPos },\n });\n}\n\n/**\n * Inserts text at a specific position\n * @param view - Editor view\n * @param pos - Position to insert at\n * @param text - Text to insert\n */\nexport function insertAt(view: EditorView, pos: number, text: string) {\n view.dispatch({\n changes: { from: pos, insert: text },\n });\n}\n\n/**\n * Gets coordinates for a position in the editor\n * @param view - Editor view\n * @param pos - Position to get coordinates for\n * @returns Coordinates or null if position is invalid\n */\nexport function getCoordsAtPos(view: EditorView, pos: number) {\n return view.coordsAtPos(pos);\n}\n\n/**\n * Gets position from coordinates\n * @param view - Editor view\n * @param x - X coordinate\n * @param y - Y coordinate\n * @returns Position or null if coordinates are invalid\n */\nexport function getPosAtCoords(view: EditorView, x: number, y: number) {\n return view.posAtCoords({ x, y });\n}\n", "import { Decoration, type DecorationSet, EditorView, WidgetType } from \"@codemirror/view\";\nimport { EditorSelection, EditorState, StateEffect, StateField, Transaction } from \"@codemirror/state\";\nimport { slashCommandPlugin } from \"./slash-command\";\nimport { CSS_CLASSES, TIMING } from \"../../core/constants\";\nimport { onAIStreamState, translationsState } from '../runtime/editor-runtime-state';\nimport { stripBase64Images } from \"../../core/utils/string-utils\";\n\n/**\n * Loading widget displayed during AI text generation\n */\nclass LoadingWidget extends WidgetType {\n /** Flag to identify this widget type */\n readonly isLoadingWidget = true;\n\n constructor(private text: string) {\n super();\n }\n\n toDOM(): HTMLElement {\n const div = document.createElement(\"div\");\n div.className = CSS_CLASSES.LOADING_WIDGET;\n div.innerHTML = `\n <div class=\"${CSS_CLASSES.LOADING_SPINNER}\"></div>\n <span>${this.text}</span>\n `;\n return div;\n }\n}\n\n/**\n * State effects for ghost writer\n */\nconst addLoadingEffect = StateEffect.define<{ pos: number, text: string }>();\nconst removeLoadingEffect = StateEffect.define<null>();\nconst markNewText = StateEffect.define<{ from: number; to: number }>();\nconst unmarkNewText = StateEffect.define<{ from: number; to: number }>();\n\n/**\n * State field for managing new text decorations and loading widget\n */\nexport const newTextState = StateField.define<DecorationSet>({\n create() {\n return Decoration.none;\n },\n update(value, tr) {\n value = value.map(tr.changes);\n\n for (const e of tr.effects) {\n if (e.is(markNewText)) {\n value = value.update({\n add: [newTextMark.range(e.value.from, e.value.to)]\n });\n } else if (e.is(addLoadingEffect)) {\n value = value.update({\n add: [Decoration.widget({\n widget: new LoadingWidget(e.value.text),\n side: 1\n }).range(e.value.pos)]\n });\n } else if (e.is(removeLoadingEffect)) {\n value = value.update({\n filter: (_from, _to, decoration) => {\n return !(decoration.spec.widget && (decoration.spec.widget as LoadingWidget).isLoadingWidget);\n }\n });\n } else if (e.is(unmarkNewText)) {\n value = value.update({\n filter: (from, to, decoration) => {\n const isTargetDecoration = decoration.spec.class === CSS_CLASSES.NEW_TEXT;\n const isInRange = from >= e.value.from && to <= e.value.to;\n return !(isTargetDecoration && isInRange);\n }\n });\n }\n }\n\n return value;\n },\n provide: f => EditorView.decorations.from(f)\n});\n\n/** Effect to scroll editor view to a specific position */\nexport const scrollIntoView = StateEffect.define<number>();\n\n/** Decoration mark for newly generated text */\nconst newTextMark = Decoration.mark({ class: CSS_CLASSES.NEW_TEXT });\n\n/**\n * Executes AI-powered ghost writer to continue text\n * @param view - Editor view instance\n * @returns Promise that resolves to AbortController for cancellation\n */\nexport async function ghostWriterExecutor(view: EditorView): Promise<AbortController> {\n if (view.state.facet(EditorState.readOnly)) {\n return new AbortController();\n }\n\n const { state, dispatch } = view;\n const { from, to } = state.selection.ranges[0];\n const text = state.doc.toString();\n\n // Get raw prefix and suffix\n const rawPrefix = text.slice(0, to);\n const rawSuffix = text.slice(from);\n\n // Sanitize Base64 images to avoid token overflow\n const prefix = stripBase64Images(rawPrefix);\n const suffix = stripBase64Images(rawSuffix);\n\n const pos = state.selection.main.from;\n\n const onAIStream = state.field(onAIStreamState);\n const translations = state.field(translationsState);\n\n const completionPrompt = translations['moondown.prompts.textContinuation'] || `You are a writing assistant embedded in a Markdown editor.\nYour task is to continue writing text at the cursor position.\n\n### CRITICAL RULES:\n1. Output ONLY the new text that should be inserted at the cursor position.\n2. Do NOT repeat or include any part of the existing text (prefix or suffix).\n3. Do NOT wrap your output in quotes, code blocks, or any markup.\n4. Continue naturally from where the prefix ends, maintaining consistent style, tone, and language.\n5. If the prefix is in Chinese, continue in Chinese. If in English, continue in English.\n6. Keep markdown formatting consistent with the existing document.`;\n\n const abortController = new AbortController();\n const plugin = view.plugin(slashCommandPlugin);\n\n if (plugin) {\n plugin.setCurrentAbortController(abortController);\n }\n\n if (!onAIStream) {\n console.error(\"AI stream handler is not configured for the Moondown editor.\");\n if (plugin) plugin.clearCurrentAbortController();\n return abortController;\n }\n\n const startPos = pos;\n let endPos = pos;\n const loadingText = translations['moondown.ai.thinking'] || 'AI is thinking...';\n\n // Show loading indicator\n dispatch({\n effects: addLoadingEffect.of({ pos, text: loadingText })\n });\n\n try {\n const userPrompt = `<text_before_cursor>\n${prefix}\n</text_before_cursor>\n\n<text_after_cursor>\n${suffix}\n</text_after_cursor>\n\nContinue writing from where the cursor is. Output ONLY the new continuation text. Do NOT repeat any existing text.`;\n\n const stream = await onAIStream(\n completionPrompt,\n userPrompt,\n abortController.signal\n );\n\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n\n while (true) {\n if (abortController.signal.aborted) {\n console.log('Stream aborted by user.');\n if (reader) await reader.cancel();\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n const content = typeof value === 'string' ? value : decoder.decode(value);\n\n if (content) {\n const insertPos = endPos;\n endPos += content.length;\n\n // Annotate all AI chunks with the same userEvent so CodeMirror's\n // history module groups them into a single undo entry.\n dispatch({\n changes: { from: insertPos, insert: content },\n effects: [\n markNewText.of({ from: insertPos, to: insertPos + content.length }),\n scrollIntoView.of(insertPos + content.length)\n ],\n annotations: Transaction.userEvent.of('input.ai-continue')\n });\n }\n }\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('AI continuation aborted');\n } else {\n console.error('Error during AI continuation:', error);\n }\n } finally {\n // Remove loading indicator\n dispatch({\n effects: removeLoadingEffect.of(null)\n });\n\n // Move cursor to end of generated text\n view.dispatch(view.state.update({\n selection: EditorSelection.cursor(endPos)\n }));\n\n // Remove highlight after animation completes\n const finalEndPos = endPos;\n setTimeout(() => {\n view.dispatch({\n effects: unmarkNewText.of({ from: startPos, to: finalEndPos })\n });\n }, TIMING.ANIMATION_DURATION);\n\n if (plugin) {\n plugin.clearCurrentAbortController();\n }\n }\n\n return abortController;\n}\n", "import {\n Compartment,\n StateEffect,\n StateField,\n type StateEffectType,\n} from '@codemirror/state';\nimport type {\n AIStreamHandler,\n MoondownSlashCommand,\n MoondownTranslations,\n} from '../../core';\n\n/**\n * Creates a StateField whose value is replaced only when a specific effect appears.\n * This keeps dynamic runtime settings (AI handler, locale, translations) predictable.\n */\nfunction createEffectBackedStateField<T>(\n effect: StateEffectType<T>,\n initialValue: T\n): StateField<T> {\n return StateField.define<T>({\n create: () => initialValue,\n update: (value, transaction) => {\n for (const currentEffect of transaction.effects) {\n if (currentEffect.is(effect)) {\n return currentEffect.value;\n }\n }\n return value;\n },\n });\n}\n\n/** Compartment for dynamically switching light/dark theme. */\nexport const themeCompartment = new Compartment();\n\n/** Compartment for toggling WYSIWYG features (table/image/syntax hiding). */\nexport const wysiwygCompartment = new Compartment();\n\n/** Compartment for read-only mode. */\nexport const readOnlyCompartment = new Compartment();\n\n/** Compartment for placeholder text. */\nexport const placeholderCompartment = new Compartment();\n\n/** Effect + StateField for runtime AI stream handler injection. */\nexport const setOnAIStream = StateEffect.define<AIStreamHandler | null>();\nexport const onAIStreamState = createEffectBackedStateField<AIStreamHandler | null>(setOnAIStream, null);\n\n/** Effect + StateField for runtime translation overrides. */\nexport const setTranslations = StateEffect.define<MoondownTranslations>();\nexport const translationsState = createEffectBackedStateField<MoondownTranslations>(setTranslations, {});\n\n/** Effect + StateField for locale switching (defaults to en). */\nexport const setLocale = StateEffect.define<string>();\nexport const localeState = createEffectBackedStateField<string>(setLocale, 'en');\n\n/** Effect + StateField for plugin-contributed slash commands. */\nexport const setPluginSlashCommands = StateEffect.define<ReadonlyArray<MoondownSlashCommand>>();\nexport const pluginSlashCommandsState = createEffectBackedStateField<ReadonlyArray<MoondownSlashCommand>>(\n setPluginSlashCommands,\n []\n);\n", "/**\n * Utility functions for string manipulation\n */\n\n/**\n * Escapes special regex characters in a string\n * @param str - String to escape\n * @returns Escaped string safe for use in RegExp\n */\nexport function escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport interface ParsedMarkdownImage {\n alt: string;\n src: string;\n}\n\nfunction isEscaped(text: string, index: number): boolean {\n let backslashes = 0;\n for (let pos = index - 1; pos >= 0 && text[pos] === '\\\\'; pos -= 1) {\n backslashes += 1;\n }\n return backslashes % 2 === 1;\n}\n\n/**\n * Parses a complete Markdown image token.\n * Supports URLs that contain balanced parentheses, e.g. `![x](a_(b).png)`.\n */\nexport function parseMarkdownImage(text: string): ParsedMarkdownImage | null {\n const source = text.trim();\n if (!source.startsWith('![')) {\n return null;\n }\n\n let index = 2;\n let altEnd = -1;\n while (index < source.length) {\n if (source[index] === ']' && !isEscaped(source, index)) {\n altEnd = index;\n break;\n }\n index += 1;\n }\n\n if (altEnd < 0 || source[altEnd + 1] !== '(') {\n return null;\n }\n\n index = altEnd + 2;\n const srcStart = index;\n let depth = 1;\n let srcEnd = -1;\n\n while (index < source.length) {\n const char = source[index];\n if (!isEscaped(source, index)) {\n if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n if (depth === 0) {\n srcEnd = index;\n break;\n }\n }\n }\n index += 1;\n }\n\n if (srcEnd < 0 || srcEnd !== source.length - 1) {\n return null;\n }\n\n const src = source.slice(srcStart, srcEnd);\n if (src.length === 0) {\n return null;\n }\n\n return {\n alt: source.slice(2, altEnd),\n src,\n };\n}\n\n/**\n * Checks if a string matches Markdown image syntax\n * @param text - Text to check\n * @returns True if text is an image markdown\n */\nexport function isMarkdownImage(text: string): boolean {\n return parseMarkdownImage(text) !== null;\n}\n\n/**\n * Creates a heading prefix with the specified level\n * @param level - Heading level (1-6)\n * @returns Heading prefix string (e.g., \"# \", \"## \")\n */\nexport function createHeadingPrefix(level: number): string {\n if (level < 1 || level > 6) {\n throw new Error('Heading level must be between 1 and 6');\n }\n return '#'.repeat(level) + ' ';\n}\n\n/**\n * Extracts heading level from a line of text\n * @param text - Line text to check\n * @returns Heading level (1-6) or null if not a heading\n */\nexport function getHeadingLevel(text: string): number | null {\n const match = text.match(/^(#{1,6})\\s/);\n return match ? match[1].length : null;\n}\n\n/**\n * Checks if a line is an ordered list item\n * @param text - Line text to check\n * @returns True if the line is an ordered list item\n */\nexport function isOrderedListItem(text: string): boolean {\n return /^\\d+\\.\\s/.test(text);\n}\n\n/**\n * Checks if a line is an unordered list item\n * @param text - Line text to check\n * @returns True if the line is an unordered list item\n */\nexport function isUnorderedListItem(text: string): boolean {\n return /^-\\s/.test(text);\n}\n\n/**\n * Extracts the number from an ordered list item\n * @param text - Ordered list item text\n * @returns The list number or null if not an ordered list item\n */\nexport function extractListNumber(text: string): number | null {\n const match = text.match(/^(\\d+)\\.\\s/);\n return match ? parseInt(match[1], 10) : null;\n}\n\n/**\n * Strips Base64 image data from markdown text to save tokens for AI processing.\n * Replaces `![Alt](data:image/...)` with `[Image: Alt]`.\n * @param text - The raw markdown text\n * @returns The sanitized text with Base64 data removed\n */\nexport function stripBase64Images(text: string): string {\n if (!text) return '';\n // Matches markdown images where the URL starts with \"data:\"\n // Captures the Alt text ($1) and replaces the whole thing with a placeholder\n return text.replace(/!\\[([^\\]]*)\\]\\((data:[^)]+)\\)/g, (_match, alt) => {\n return `[Image${alt ? ': ' + alt : ''}]`;\n });\n}\n", "import { EditorView } from '@codemirror/view';\nimport {\n MARKDOWN_TEMPLATES,\n} from '../../core/constants';\nimport {\n type MoondownSlashCommand,\n type MoondownTranslations,\n} from '../../core';\nimport { getCurrentLine } from '../../core/utils/editor-utils';\nimport { ghostWriterExecutor } from './ghost-writer';\n\n/**\n * Defines the structure for a slash command option in the menu.\n */\nexport interface SlashCommandOption {\n id: string;\n title: string;\n titleKey?: string;\n icon: string;\n keywords?: ReadonlyArray<string>;\n isDivider?: boolean;\n execute: (view: EditorView) => void | Promise<void | AbortController>;\n}\n\nexport type SlashCommandNavigationStep = 1 | -1;\n\nconst dividerCommand: SlashCommandOption = {\n id: 'divider',\n title: 'divider',\n titleKey: 'divider',\n icon: '',\n isDivider: true,\n execute: () => {},\n};\n\n/**\n * Helper function to insert text at the beginning of the current line.\n */\nfunction insertAtLineStart(view: EditorView, text: string, cursorOffset: number = 0): void {\n const line = getCurrentLine(view.state);\n view.dispatch({\n changes: { from: line.from, to: line.from, insert: text },\n selection: { anchor: line.from + text.length + cursorOffset },\n });\n}\n\n/**\n * Helper function to insert text at the current cursor position, with an optional selection.\n */\nfunction insertAtCursor(\n view: EditorView,\n text: string,\n selectionStart?: number,\n selectionEnd?: number\n): void {\n const pos = view.state.selection.main.from;\n const changes = { from: pos, insert: text };\n\n if (selectionStart !== undefined && selectionEnd !== undefined) {\n view.dispatch({\n changes,\n selection: { anchor: pos + selectionStart, head: pos + selectionEnd },\n });\n } else {\n view.dispatch({\n changes,\n selection: { anchor: pos + text.length },\n });\n }\n}\n\n/**\n * Built-in slash commands.\n */\nexport const builtinSlashCommands: ReadonlyArray<SlashCommandOption> = [\n {\n id: 'ai-continue',\n title: 'AI Continue',\n titleKey: 'moondown.slash.aiContinue',\n icon: 'bot',\n keywords: ['ai', 'continue', 'write'],\n execute: async (view: EditorView) => ghostWriterExecutor(view),\n },\n {\n id: 'heading-1',\n title: 'Heading 1',\n titleKey: 'moondown.slash.heading1',\n icon: 'heading-1',\n keywords: ['h1', 'heading'],\n execute: (view: EditorView) => insertAtLineStart(view, '# ', 0),\n },\n {\n id: 'heading-2',\n title: 'Heading 2',\n titleKey: 'moondown.slash.heading2',\n icon: 'heading-2',\n keywords: ['h2', 'heading'],\n execute: (view: EditorView) => insertAtLineStart(view, '## ', 0),\n },\n {\n id: 'heading-3',\n title: 'Heading 3',\n titleKey: 'moondown.slash.heading3',\n icon: 'heading-3',\n keywords: ['h3', 'heading'],\n execute: (view: EditorView) => insertAtLineStart(view, '### ', 0),\n },\n {\n id: 'heading-4',\n title: 'Heading 4',\n titleKey: 'moondown.slash.heading4',\n icon: 'heading-4',\n keywords: ['h4', 'heading'],\n execute: (view: EditorView) => insertAtLineStart(view, '#### ', 0),\n },\n dividerCommand,\n {\n id: 'insert-table',\n title: 'Insert Table',\n titleKey: 'moondown.slash.insertTable',\n icon: 'table',\n keywords: ['table', 'grid'],\n execute: (view: EditorView) => insertAtCursor(view, MARKDOWN_TEMPLATES.TABLE),\n },\n {\n id: 'insert-link',\n title: 'Insert Link',\n titleKey: 'moondown.slash.insertLink',\n icon: 'link',\n keywords: ['link', 'url'],\n execute: (view: EditorView) => insertAtCursor(view, MARKDOWN_TEMPLATES.LINK, 1, 10),\n },\n {\n id: 'quote-block',\n title: 'Quote Block',\n titleKey: 'moondown.slash.quoteBlock',\n icon: 'quote',\n keywords: ['quote', 'blockquote'],\n execute: (view: EditorView) => insertAtLineStart(view, '> ', 0),\n },\n {\n id: 'ordered-list',\n title: 'Ordered List',\n titleKey: 'moondown.slash.orderedList',\n icon: 'list-ordered',\n keywords: ['ordered', 'list', 'numbered'],\n execute: (view: EditorView) => insertAtLineStart(view, '1. ', 0),\n },\n {\n id: 'unordered-list',\n title: 'Unordered List',\n titleKey: 'moondown.slash.unorderedList',\n icon: 'list',\n keywords: ['unordered', 'list', 'bullet'],\n execute: (view: EditorView) => insertAtLineStart(view, '- ', 0),\n },\n {\n id: 'code-block',\n title: 'Code Block',\n titleKey: 'moondown.slash.codeBlock',\n icon: 'code',\n keywords: ['code', 'fenced'],\n execute: (view: EditorView) => insertAtCursor(view, MARKDOWN_TEMPLATES.CODE_BLOCK, 4, 4),\n },\n {\n id: 'insert-mermaid',\n title: 'Insert Mermaid',\n titleKey: 'moondown.slash.insertMermaid',\n icon: 'git-branch',\n keywords: ['mermaid', 'diagram', 'flowchart'],\n execute: (view: EditorView) => insertAtCursor(view, MARKDOWN_TEMPLATES.MERMAID_BLOCK, 12, 12),\n },\n {\n id: 'insert-latex',\n title: 'Insert LaTeX',\n titleKey: 'moondown.slash.insertLatex',\n icon: 'sigma',\n keywords: ['latex', 'math', 'formula', 'equation'],\n execute: (view: EditorView) => insertAtCursor(view, MARKDOWN_TEMPLATES.LATEX_BLOCK, 10, 10),\n },\n];\n\nfunction normalizePluginCommand(command: MoondownSlashCommand): SlashCommandOption {\n return {\n id: command.id,\n title: command.title,\n titleKey: command.titleKey,\n icon: command.icon || 'puzzle',\n keywords: command.keywords,\n execute: command.execute,\n };\n}\n\nfunction dedupeSlashCommands(commands: ReadonlyArray<SlashCommandOption>): SlashCommandOption[] {\n const seen = new Set<string>();\n const deduped: SlashCommandOption[] = [];\n\n for (const command of commands) {\n if (command.isDivider) {\n deduped.push(command);\n continue;\n }\n\n if (seen.has(command.id)) {\n continue;\n }\n seen.add(command.id);\n deduped.push(command);\n }\n\n return deduped;\n}\n\n/**\n * Returns the merged slash command list (built-ins + plugin commands).\n */\nexport function resolveSlashCommands(\n pluginCommands: ReadonlyArray<MoondownSlashCommand>\n): SlashCommandOption[] {\n const mappedPluginCommands = pluginCommands.map(normalizePluginCommand);\n const merged = mappedPluginCommands.length > 0\n ? [...builtinSlashCommands, dividerCommand, ...mappedPluginCommands]\n : [...builtinSlashCommands];\n\n return dedupeSlashCommands(merged);\n}\n\n/**\n * Resolves the full slash command list and applies filter text.\n */\nexport function resolveFilteredSlashCommands(\n pluginCommands: ReadonlyArray<MoondownSlashCommand>,\n filterText: string,\n translations: MoondownTranslations\n): SlashCommandOption[] {\n const allCommands = resolveSlashCommands(pluginCommands);\n return filterSlashCommands(allCommands, filterText, translations);\n}\n\nexport function getSlashCommandTitle(\n command: SlashCommandOption,\n translations: MoondownTranslations\n): string {\n if (command.titleKey) {\n const translatedTitle = translations[command.titleKey];\n if (translatedTitle) {\n return translatedTitle;\n }\n }\n return command.title;\n}\n\nfunction matchesSlashCommand(\n command: SlashCommandOption,\n filterText: string,\n translations: MoondownTranslations\n): boolean {\n if (command.isDivider) {\n return true;\n }\n\n const normalizedFilter = filterText.trim().toLowerCase();\n if (normalizedFilter.length === 0) {\n return true;\n }\n\n const title = getSlashCommandTitle(command, translations).toLowerCase();\n if (title.includes(normalizedFilter)) {\n return true;\n }\n\n return (command.keywords ?? []).some((keyword) => keyword.toLowerCase().includes(normalizedFilter));\n}\n\nfunction trimDividers(commands: ReadonlyArray<SlashCommandOption>): SlashCommandOption[] {\n const normalized: SlashCommandOption[] = [];\n let previousWasDivider = true;\n\n for (const command of commands) {\n if (command.isDivider) {\n if (previousWasDivider) {\n continue;\n }\n previousWasDivider = true;\n normalized.push(command);\n continue;\n }\n\n previousWasDivider = false;\n normalized.push(command);\n }\n\n while (normalized.length > 0 && normalized[normalized.length - 1].isDivider) {\n normalized.pop();\n }\n\n return normalized;\n}\n\n/**\n * Filters slash commands by user input while preserving divider structure.\n */\nexport function filterSlashCommands(\n commands: ReadonlyArray<SlashCommandOption>,\n filterText: string,\n translations: MoondownTranslations\n): SlashCommandOption[] {\n const filtered = commands.filter((command) => matchesSlashCommand(command, filterText, translations));\n return trimDividers(filtered);\n}\n\nexport function findFirstSelectableSlashCommandIndex(commands: ReadonlyArray<SlashCommandOption>): number {\n for (let index = 0; index < commands.length; index += 1) {\n if (!commands[index].isDivider) {\n return index;\n }\n }\n return -1;\n}\n\nexport function findSelectableSlashCommandIndex(\n commands: ReadonlyArray<SlashCommandOption>,\n startIndex: number,\n step: SlashCommandNavigationStep\n): number {\n if (commands.length === 0) {\n return -1;\n }\n\n let index = ((startIndex % commands.length) + commands.length) % commands.length;\n for (let i = 0; i < commands.length; i += 1) {\n if (isSelectableSlashCommand(commands[index])) {\n return index;\n }\n index = (index + step + commands.length) % commands.length;\n }\n\n return -1;\n}\n\nexport function normalizeSelectedSlashCommandIndex(\n commands: ReadonlyArray<SlashCommandOption>,\n selectedIndex: number\n): number {\n if (commands.length === 0) {\n return 0;\n }\n\n if (selectedIndex < 0 || selectedIndex >= commands.length || !isSelectableSlashCommand(commands[selectedIndex])) {\n return findFirstSelectableSlashCommandIndex(commands);\n }\n\n return selectedIndex;\n}\n\nexport function isSelectableSlashCommand(command: SlashCommandOption | undefined): boolean {\n return Boolean(command && !command.isDivider);\n}\n", "\n/**\n * Utility functions for DOM manipulation\n */\n\n/**\n * Creates a DOM element with class names and attributes\n * @param tag - HTML tag name\n * @param className - CSS class names (space-separated)\n * @param attributes - Object of attribute key-value pairs\n * @returns Created HTML element\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n attributes?: Record<string, string>\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tag);\n \n if (className) {\n element.className = className;\n }\n \n if (attributes) {\n Object.entries(attributes).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n }\n \n return element;\n}\n\n/**\n * Creates a Lucide icon element\n * @param iconName - Name of the Lucide icon\n * @param className - Optional CSS class\n * @returns Span element containing the icon\n */\nexport function createIconElement(iconName: string, className?: string): HTMLSpanElement {\n const wrapper = createElement('span', className);\n wrapper.innerHTML = `<i data-lucide=\"${iconName}\"></i>`;\n return wrapper;\n}\n\n/**\n * Safely removes an element from the DOM\n * @param element - Element to remove\n */\nexport function removeElement(element: HTMLElement | null): void {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\n/**\n * Checks if an element is visible in the viewport\n * @param element - Element to check\n * @param container - Container element (optional)\n * @returns True if element is visible\n */\nexport function isElementVisible(\n element: HTMLElement,\n container?: HTMLElement\n): boolean {\n const elementRect = element.getBoundingClientRect();\n const containerRect = container\n ? container.getBoundingClientRect()\n : { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth };\n \n return (\n elementRect.top >= containerRect.top &&\n elementRect.bottom <= containerRect.bottom &&\n elementRect.left >= containerRect.left &&\n elementRect.right <= containerRect.right\n );\n}\n\n/**\n * Scrolls an element into view within a container\n * @param element - Element to scroll into view\n * @param container - Container element\n */\nexport function scrollIntoView(element: HTMLElement, container: HTMLElement): void {\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n \n if (elementRect.top < containerRect.top) {\n container.scrollTop = element.offsetTop;\n } else if (elementRect.bottom > containerRect.bottom) {\n container.scrollTop = element.offsetTop + element.offsetHeight - container.clientHeight;\n }\n}\n\n/**\n * Gets all data attributes from an element\n * @param element - HTML element\n * @returns Object with data attributes\n */\nexport function getDataAttributes(element: HTMLElement): Record<string, string> {\n const data: Record<string, string> = {};\n \n Array.from(element.attributes).forEach(attr => {\n if (attr.name.startsWith('data-')) {\n const key = attr.name.slice(5); // Remove 'data-' prefix\n data[key] = attr.value;\n }\n });\n \n return data;\n}\n\n/**\n * Prevents default event behavior and stops propagation\n * @param event - Event to prevent\n */\nexport function preventDefault(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n}\n\n/**\n * Debounces a function call\n * @param fn - Function to debounce\n * @param delay - Delay in milliseconds\n * @returns Debounced function\n */\nexport function debounce<TThis, TArgs extends unknown[]>(\n fn: (this: TThis, ...args: TArgs) => unknown,\n delay: number\n): (this: TThis, ...args: TArgs) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n \n return function(this: TThis, ...args: TArgs) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n \n timeoutId = setTimeout(() => {\n fn.apply(this, args);\n timeoutId = null;\n }, delay);\n };\n}\n", "import {EditorSelection, type Extension} from \"@codemirror/state\";\nimport {syntaxTree} from \"@codemirror/language\";\nimport {EditorView, ViewUpdate, keymap} from \"@codemirror/view\";\nimport {imageSizeField, placeholderField} from \"./fields.ts\";\nimport {imageWidgetPlugin} from \"./image-renderer.ts\";\nimport {imageDragAndDropPlugin} from \"./image-drag-n-drop.ts\";\nimport { parseMarkdownImage } from \"../../core/utils/string-utils\";\n\n/**\n * Checks if the position is at the boundary of an image markdown\n */\nfunction getImageAtPosition(view: EditorView, pos: number): {from: number, to: number} | null {\n const doc = view.state.doc;\n const line = doc.lineAt(pos);\n let imageRange: {from: number, to: number} | null = null;\n\n syntaxTree(view.state).iterate({\n from: line.from,\n to: line.to,\n enter: (node) => {\n if (node.type.name !== 'Image') {\n return;\n }\n if (pos !== node.from && pos !== node.to) {\n return;\n }\n if (parseMarkdownImage(view.state.sliceDoc(node.from, node.to))) {\n imageRange = {from: node.from, to: node.to};\n }\n },\n });\n\n return imageRange;\n}\n\n/**\n * Handles backspace key to select image before deleting\n */\nfunction handleBackspace(view: EditorView): boolean {\n const {from, to} = view.state.selection.main;\n\n // If there's a selection, let default behavior handle it\n if (from !== to) {\n return false;\n }\n\n // Check if cursor is at the end of an image markdown\n const imageRange = getImageAtPosition(view, from);\n if (imageRange && from === imageRange.to) {\n // Select the entire image\n view.dispatch({\n selection: EditorSelection.single(imageRange.from, imageRange.to),\n scrollIntoView: true\n });\n return true;\n }\n\n return false;\n}\n\n/**\n * Handles delete key to select image before deleting\n */\nfunction handleDelete(view: EditorView): boolean {\n const {from, to} = view.state.selection.main;\n\n // If there's a selection, let default behavior handle it\n if (from !== to) {\n return false;\n }\n\n // Check if cursor is at the start of an image markdown\n const imageRange = getImageAtPosition(view, from);\n if (imageRange && from === imageRange.from) {\n // Select the entire image\n view.dispatch({\n selection: EditorSelection.single(imageRange.from, imageRange.to),\n scrollIntoView: true\n });\n return true;\n }\n\n return false;\n}\n\n/**\n * Keymap for image-specific keyboard shortcuts\n * This needs to be loaded BEFORE default keymaps to take precedence\n */\nexport const imageKeymap = keymap.of([\n {\n key: \"Backspace\",\n run: handleBackspace\n },\n {\n key: \"Delete\",\n run: handleDelete\n }\n]);\n\n/**\n * Returns a CodeMirror extension that provides comprehensive image handling.\n * This includes rendering markdown images as interactive widgets, handling\n * drag-and-drop/paste of image files, and managing selection styles.\n */\nexport function imageExtension(): Extension {\n return [\n imageSizeField,\n placeholderField,\n imageWidgetPlugin,\n imageDragAndDropPlugin,\n // Update listener to add a 'selected' class to image widgets when they are part of the selection.\n EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.selectionSet || update.viewportChanged) {\n const {from, to} = update.state.selection.main\n update.view.dom.querySelectorAll(\".cm-image-widget\").forEach((el: Element) => {\n const pos = update.view.posAtDOM(el as HTMLElement)\n if (pos !== null && pos >= from && pos < to) {\n el.classList.add(\"selected\")\n } else {\n el.classList.remove(\"selected\")\n }\n })\n }\n }),\n // Input handler to allow typing on a new line *before* an image widget.\n EditorView.inputHandler.of((view, from, _to, text) => {\n const doc = view.state.doc;\n const line = doc.lineAt(from);\n const lineContent = line.text;\n let isImageLine = false;\n\n if (parseMarkdownImage(lineContent.trim())) {\n isImageLine = true;\n }\n\n // If typing at the very beginning of a line that only contains an image.\n if (from === line.from && isImageLine) {\n // Insert a new line before the image.\n view.dispatch({\n changes: [{from: line.from, insert: '\\n'}],\n selection: EditorSelection.cursor(line.from),\n scrollIntoView: true\n });\n\n // Then, insert the typed text on the newly created line.\n view.dispatch({\n changes: [{from: line.from, insert: text}],\n selection: EditorSelection.cursor(line.from + text.length),\n scrollIntoView: true\n });\n\n return true; // Indicate we have handled this input.\n }\n\n return false; // Let CodeMirror handle other cases.\n })\n ]\n}\n", "import {StateField} from \"@codemirror/state\";\nimport {Decoration, type DecorationSet, EditorView, WidgetType} from \"@codemirror/view\";\nimport {imageLoadedEffect, type ImageSizes, updateImagePlaceholder} from \"./types.ts\";\n\n/**\n * A StateField to store the calculated line heights of rendered images.\n * This helps the editor layout account for the vertical space taken by images.\n */\nexport const imageSizeField = StateField.define<ImageSizes>({\n create: () => ({}),\n update(sizes, tr) {\n const newSizes = {...sizes}\n for (const e of tr.effects) {\n if (e.is(imageLoadedEffect)) {\n newSizes[e.value.from] = e.value.lines\n }\n }\n return newSizes\n }\n})\n\n/**\n * A StateField to manage the placeholder decoration shown during image drag-and-drop.\n */\nexport const placeholderField = StateField.define<DecorationSet>({\n create: () => Decoration.none,\n update(decorations, tr) {\n decorations = decorations.map(tr.changes);\n for (let e of tr.effects) {\n if (e.is(updateImagePlaceholder)) {\n if (e.value === null) {\n decorations = Decoration.none;\n } else {\n const {pos} = e.value;\n const line = tr.state.doc.lineAt(pos);\n const placeholderPos = line.to;\n decorations = Decoration.set(\n Decoration.widget({\n widget: new class extends WidgetType {\n toDOM() {\n const el = document.createElement('div');\n el.className = 'cm-image-placeholder';\n el.style.height = `1em`;\n return el;\n }\n },\n side: 1\n }).range(placeholderPos)\n );\n }\n }\n }\n return decorations;\n },\n provide: f => EditorView.decorations.from(f)\n});", "import {StateEffect} from \"@codemirror/state\";\nimport {ImageWidget} from \"./image-widgets.ts\";\n\n/**\n * Type definitions for the image handling extension.\n */\n\n/** Defines the payload for the effect dispatched when an image has loaded. */\nexport interface ImageLoadedEffect {\n from: number;\n to: number;\n lines: number;\n}\n\n/** Defines the payload for the effect to update the drag-and-drop placeholder. */\nexport interface ImagePlaceholderEffect {\n pos: number;\n}\n\n/** A map from an image's start position to its height in editor lines. */\nexport interface ImageSizes {\n [key: number]: number;\n}\n\n/** StateEffect to signal that an image has loaded and its size is known. */\nexport const imageLoadedEffect = StateEffect.define<ImageLoadedEffect>()\n/** StateEffect to show, move, or hide the drag-and-drop placeholder. */\nexport const updateImagePlaceholder = StateEffect.define<ImagePlaceholderEffect | null>()\n\n/** A global cache for ImageWidget instances to improve performance by avoiding re-creation. */\nexport const imageWidgetCache = new Map<string, ImageWidget>()", "import {RangeSetBuilder} from \"@codemirror/state\"\nimport {\n EditorView,\n Decoration,\n type DecorationSet,\n ViewPlugin,\n ViewUpdate,\n WidgetType\n} from \"@codemirror/view\"\nimport {syntaxTree} from \"@codemirror/language\"\nimport {imageSizeField} from \"./fields.ts\";\nimport {imageWidgetCache} from \"./types.ts\";\nimport {ImageWidget} from \"./image-widgets.ts\";\nimport { parseMarkdownImage } from \"../../core/utils/string-utils\";\n\n/**\n * A ViewPlugin that replaces image markdown syntax with a rendered ImageWidget.\n * It uses a cache to avoid re-creating widgets unnecessarily.\n */\nexport const imageWidgetPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet\n\n constructor(view: EditorView) {\n this.decorations = this.buildDecorations(view)\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.buildDecorations(update.view)\n }\n }\n\n buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const imageSizes = view.state.field(imageSizeField);\n const decorationsToAdd: { from: number, to: number, decoration: Decoration }[] = [];\n\n for (const {from, to} of view.visibleRanges) {\n syntaxTree(view.state).iterate({\n from,\n to,\n enter: (node) => {\n if (node.type.name === \"Image\") {\n const text = view.state.doc.sliceString(node.from, node.to);\n const parsed = parseMarkdownImage(text);\n\n if (parsed) {\n const { alt, src } = parsed;\n const cacheKey = `${src}|${alt}`;\n let widget = imageWidgetCache.get(cacheKey);\n\n if (!widget) {\n widget = new ImageWidget(alt, src, node.from, node.to, view);\n imageWidgetCache.set(cacheKey, widget);\n } else {\n widget.updatePosition(node.from, node.to);\n }\n\n decorationsToAdd.push({\n from: node.from,\n to: node.to,\n decoration: Decoration.replace({\n widget: widget,\n inclusive: true\n })\n });\n\n // Add an empty widget if size info is available, to preserve layout spacing.\n if (imageSizes[node.from]) {\n decorationsToAdd.push({\n from: node.to,\n to: node.to,\n decoration: Decoration.widget({\n widget: new class extends WidgetType {\n toDOM() {\n const el = document.createElement('div');\n el.style.height = '0';\n return el;\n }\n },\n side: 1\n })\n });\n }\n }\n }\n }\n });\n }\n\n decorationsToAdd.sort((a, b) => a.from - b.from);\n\n for (const {from, to, decoration} of decorationsToAdd) {\n builder.add(from, to, decoration);\n }\n\n // Clean up cache for widgets that are no longer in the document.\n for (const [key, widget] of imageWidgetCache) {\n if (!view.state.doc.sliceString(widget.from, widget.to).includes(widget.src)) {\n imageWidgetCache.delete(key);\n }\n }\n\n return builder.finish();\n }\n },\n {\n decorations: v => v.decorations\n }\n)\n", "import { EditorView, WidgetType } from \"@codemirror/view\";\nimport { EditorSelection, EditorState, type EditorState as CodeMirrorEditorState } from \"@codemirror/state\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport errorImageGeneric from \"./error-image-generic.png\";\nimport { imageLoadedEffect, updateImagePlaceholder } from \"./types\";\nimport { CSS_CLASSES, CUSTOM_EVENTS } from \"../../core/constants\";\nimport { parseMarkdownImage } from \"../../core/utils/string-utils\";\nimport {\n applyDraggingVisual,\n buildImageMoveChanges,\n createImageWidgetElements,\n resetDraggingVisual,\n} from './image-widget-helpers';\n\ninterface ImageSourceRange {\n from: number;\n to: number;\n}\n\ninterface ParsedImage {\n alt: string;\n src: string;\n}\n\nfunction parseImageNode(state: CodeMirrorEditorState, from: number, to: number): ParsedImage | null {\n if (from < 0 || to > state.doc.length || from >= to) {\n return null;\n }\n\n return parseMarkdownImage(state.sliceDoc(from, to));\n}\n\nfunction findImageRangeAt(state: CodeMirrorEditorState, from: number, to: number): ImageSourceRange | null {\n if (from < 0 || to > state.doc.length || from >= to) {\n return null;\n }\n\n let matchedRange: ImageSourceRange | null = null;\n syntaxTree(state).iterate({\n from: Math.max(0, from - 1),\n to: Math.min(state.doc.length, to + 1),\n enter: (node) => {\n if (node.type.name !== 'Image' || node.from !== from || node.to !== to) {\n return;\n }\n\n if (parseImageNode(state, node.from, node.to)) {\n matchedRange = {\n from: node.from,\n to: node.to,\n };\n }\n },\n });\n\n return matchedRange;\n}\n\nfunction resolveImageSourceRange(\n state: CodeMirrorEditorState,\n fallbackFrom: number,\n fallbackTo: number,\n alt: string,\n src: string\n): ImageSourceRange {\n const directMatch = findImageRangeAt(state, fallbackFrom, fallbackTo);\n if (directMatch) {\n return directMatch;\n }\n\n const nearestRangeRef: {\n current: (ImageSourceRange & { distance: number; matchesSignature: boolean }) | null;\n } = { current: null };\n syntaxTree(state).iterate({\n from: 0,\n to: state.doc.length,\n enter: (node) => {\n if (node.type.name !== 'Image') {\n return;\n }\n\n const parsed = parseImageNode(state, node.from, node.to);\n if (!parsed) {\n return;\n }\n\n const distance = Math.abs(node.from - fallbackFrom);\n const matchesSignature = parsed.alt === alt && parsed.src === src;\n if (\n !nearestRangeRef.current ||\n (matchesSignature && !nearestRangeRef.current.matchesSignature) ||\n (matchesSignature === nearestRangeRef.current.matchesSignature && distance < nearestRangeRef.current.distance)\n ) {\n nearestRangeRef.current = {\n from: node.from,\n to: node.to,\n distance,\n matchesSignature,\n };\n }\n },\n });\n\n if (nearestRangeRef.current) {\n return {\n from: nearestRangeRef.current.from,\n to: nearestRangeRef.current.to,\n };\n }\n\n const safeFrom = Math.max(0, Math.min(fallbackFrom, state.doc.length));\n const safeTo = Math.max(safeFrom, Math.min(fallbackTo, state.doc.length));\n return {\n from: safeFrom,\n to: safeTo,\n };\n}\n\n/**\n * A CodeMirror Widget for rendering and managing images within the editor.\n * It handles image loading, error states, and drag-and-drop functionality for repositioning.\n */\nexport class ImageWidget extends WidgetType {\n private loaded = false;\n private errorSrc: string | null = null;\n private isError = false;\n private isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private isMouseDownOnImage = false;\n private currentDraggingImg: HTMLImageElement | null = null;\n private static readonly DRAG_THRESHOLD_PX = 4;\n\n constructor(\n public alt: string,\n public src: string,\n public from: number,\n public to: number,\n private view: EditorView\n ) {\n super();\n }\n\n toDOM(): HTMLElement {\n const { wrapper, img, altText } = createImageWidgetElements({\n alt: this.alt,\n src: this.src,\n errorSrc: this.errorSrc,\n isError: this.isError,\n });\n\n this.attachEventListeners(wrapper, img, altText);\n\n return wrapper;\n }\n\n /**\n * Attaches event listeners to the widget's elements.\n * @param wrapper The main wrapper element.\n * @param img The `<img>` element.\n * @param altText The alt text element.\n */\n private attachEventListeners(\n wrapper: HTMLElement,\n img: HTMLImageElement,\n altText: HTMLElement\n ): void {\n wrapper.addEventListener('mousedown', this.handleMouseDown);\n wrapper.addEventListener('click', this.handleClick);\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n\n if (!this.loaded) {\n img.addEventListener('load', () => this.handleImageLoad(wrapper));\n img.addEventListener('error', () => this.handleImageError(wrapper, img, altText));\n }\n }\n\n /**\n * Handles the successful loading of the image. Dispatches an effect to inform\n * the editor of the image's height in lines, allowing the layout to adjust.\n * @param wrapper The main widget wrapper element.\n */\n private handleImageLoad(wrapper: HTMLElement): void {\n this.loaded = true;\n const sourceRange = resolveImageSourceRange(this.view.state, this.from, this.to, this.alt, this.src);\n this.from = sourceRange.from;\n this.to = sourceRange.to;\n const lineHeight = this.view.defaultLineHeight;\n const lines = Math.ceil(wrapper.offsetHeight / lineHeight);\n\n this.view.dispatch({\n effects: imageLoadedEffect.of({ from: sourceRange.from, to: sourceRange.to, lines })\n });\n }\n\n /**\n * Handles image loading errors by replacing the src with a fallback image\n * and applying an error style.\n * @param wrapper The main widget wrapper element.\n * @param img The `<img>` element.\n * @param altText The alt text element.\n */\n private handleImageError(\n wrapper: HTMLElement,\n img: HTMLImageElement,\n altText: HTMLElement\n ): void {\n this.isError = true;\n wrapper.classList.add(CSS_CLASSES.IMAGE_ERROR);\n this.errorSrc = errorImageGeneric;\n img.src = this.errorSrc;\n altText.textContent = this.alt;\n }\n\n /**\n * Handles the mouse down event on the widget.\n * It initiates a timer to distinguish between a click (for selection) and a drag.\n */\n private handleMouseDown = (event: MouseEvent): void => {\n event.preventDefault();\n if (this.isReadOnly()) {\n return;\n }\n this.isMouseDownOnImage = true;\n this.isDragging = false;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.currentDraggingImg = event.target as HTMLImageElement;\n }\n\n /**\n * Handles the mouse move event during a drag operation.\n */\n private handleMouseMove = (event: MouseEvent): void => {\n if (this.isReadOnly()) {\n return;\n }\n if (!this.isMouseDownOnImage) return;\n\n if (!this.isDragging) {\n const deltaX = Math.abs(event.clientX - this.dragStartX);\n const deltaY = Math.abs(event.clientY - this.dragStartY);\n if (Math.max(deltaX, deltaY) < ImageWidget.DRAG_THRESHOLD_PX) {\n return;\n }\n\n this.isDragging = true;\n document.body.style.cursor = 'move';\n }\n\n this.updatePlaceholder(event);\n this.updateDragVisuals(event);\n }\n\n private handleClick = (event: MouseEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n if (this.isDragging) {\n return;\n }\n this.selectImage(event.target instanceof HTMLElement ? event.target : null);\n }\n\n /**\n * Updates the position of the drop placeholder decoration in the editor.\n * @param event The MouseEvent.\n */\n private updatePlaceholder(event: MouseEvent): void {\n const pos = this.view.posAtCoords({ x: event.clientX, y: event.clientY });\n\n if (pos !== null) {\n const line = this.view.state.doc.lineAt(pos);\n this.view.dispatch({\n effects: updateImagePlaceholder.of({ pos: line.to })\n });\n }\n }\n\n /**\n * Updates the visual style of the image element being dragged.\n * @param event The MouseEvent.\n */\n private updateDragVisuals(event: MouseEvent): void {\n if (!this.currentDraggingImg) return;\n\n const deltaX = event.clientX - this.dragStartX;\n const deltaY = event.clientY - this.dragStartY;\n applyDraggingVisual(this.currentDraggingImg, deltaX, deltaY);\n }\n\n /**\n * Handles the mouse up event, completing either a selection or a drag operation.\n */\n private handleMouseUp = (event: MouseEvent): void => {\n if (this.isReadOnly()) {\n this.isMouseDownOnImage = false;\n return;\n }\n if (!this.isDragging && this.isMouseDownOnImage) {\n this.selectImage(event.target instanceof HTMLElement ? event.target : null);\n } else if (this.isDragging) {\n this.completeDrag(event);\n }\n\n this.isMouseDownOnImage = false;\n }\n\n /**\n * Selects the underlying markdown text for the image.\n */\n private selectImage(anchorElement: HTMLElement | null): void {\n const sourceRange = resolveImageSourceRange(this.view.state, this.from, this.to, this.alt, this.src);\n this.from = sourceRange.from;\n this.to = sourceRange.to;\n\n this.view.dispatch({\n selection: EditorSelection.single(sourceRange.from, sourceRange.to),\n scrollIntoView: true\n });\n\n const target = anchorElement ?? this.view.dom;\n target.dispatchEvent(new CustomEvent(CUSTOM_EVENTS.WIDGET_EDIT_REQUEST, {\n bubbles: true,\n detail: {\n from: sourceRange.from,\n to: sourceRange.to,\n },\n }));\n }\n\n /**\n * Finalizes the drag operation by moving the image markdown to the new position.\n * @param event The MouseEvent.\n */\n private completeDrag(event: MouseEvent): void {\n if (this.isReadOnly()) {\n this.resetDragVisuals();\n return;\n }\n this.isDragging = false;\n document.body.style.cursor = 'default';\n\n const pos = this.view.posAtCoords({ x: event.clientX, y: event.clientY });\n if (pos !== null) {\n this.moveTo(pos);\n }\n\n this.view.dispatch({\n effects: updateImagePlaceholder.of(null)\n });\n\n this.resetDragVisuals();\n }\n\n /**\n * Resets the visual styles of the dragged image element.\n */\n private resetDragVisuals(): void {\n if (this.currentDraggingImg) {\n resetDraggingVisual(this.currentDraggingImg);\n this.currentDraggingImg = null;\n }\n }\n\n /**\n * Dispatches a transaction to move the image's markdown text to a new position.\n * @param pos The target position in the document.\n */\n private moveTo(pos: number): void {\n if (this.isReadOnly()) {\n return;\n }\n const sourceRange = resolveImageSourceRange(this.view.state, this.from, this.to, this.alt, this.src);\n this.from = sourceRange.from;\n this.to = sourceRange.to;\n\n this.view.dispatch({\n changes: buildImageMoveChanges({\n doc: this.view.state.doc,\n pos,\n from: sourceRange.from,\n to: sourceRange.to,\n alt: this.alt,\n src: this.src,\n }),\n });\n }\n\n /**\n * Updates the widget's internal `from` and `to` positions.\n * This is called by the renderer when the document changes.\n */\n updatePosition(from: number, to: number): void {\n this.from = from;\n this.to = to;\n }\n\n private isReadOnly(): boolean {\n return this.view.state.facet(EditorState.readOnly);\n }\n\n ignoreEvent(): boolean {\n return false;\n }\n\n eq(other: ImageWidget): boolean {\n const isSameImage = other.alt === this.alt && other.src === this.src;\n // CodeMirror may preserve previous widget instance when eq is true.\n // Keep source range updated so interactions don't use stale coordinates.\n this.from = other.from;\n this.to = other.to;\n return isSameImage;\n }\n\n destroy(): void {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n }\n}\n", "import type { ChangeSpec, EditorState } from '@codemirror/state';\nimport { CSS_CLASSES } from '../../core/constants';\nimport { createElement } from '../../core/utils/dom-utils';\n\ninterface CreateImageWidgetElementsOptions {\n alt: string;\n src: string;\n errorSrc: string | null;\n isError: boolean;\n}\n\ninterface ImageWidgetElements {\n wrapper: HTMLElement;\n img: HTMLImageElement;\n altText: HTMLElement;\n}\n\nexport function createImageWidgetElements(options: CreateImageWidgetElementsOptions): ImageWidgetElements {\n const { alt, src, errorSrc, isError } = options;\n const className = isError\n ? `${CSS_CLASSES.IMAGE_WIDGET} ${CSS_CLASSES.IMAGE_ERROR}`\n : CSS_CLASSES.IMAGE_WIDGET;\n const wrapper = createElement('div', className);\n const imageWrapper = createElement('div', 'cm-image-wrapper');\n const img = document.createElement('img');\n const overlay = createElement('div', 'cm-image-overlay');\n const altText = createElement('div', 'cm-image-alt');\n\n img.src = errorSrc || src;\n img.alt = alt;\n img.style.transform = 'scale(0.9)';\n altText.textContent = alt;\n\n imageWrapper.appendChild(img);\n imageWrapper.appendChild(overlay);\n wrapper.appendChild(imageWrapper);\n wrapper.appendChild(altText);\n\n return { wrapper, img, altText };\n}\n\nexport function applyDraggingVisual(img: HTMLImageElement, deltaX: number, deltaY: number): void {\n img.style.transform = `scale(0.8) translate(${deltaX}px, ${deltaY}px)`;\n img.style.opacity = '0.7';\n}\n\nexport function resetDraggingVisual(img: HTMLImageElement): void {\n img.style.transform = '';\n img.style.opacity = '1';\n}\n\ninterface BuildImageMoveChangesOptions {\n doc: EditorState['doc'];\n pos: number;\n from: number;\n to: number;\n alt: string;\n src: string;\n}\n\nexport function buildImageMoveChanges(options: BuildImageMoveChangesOptions): ChangeSpec[] {\n const { doc, pos, from, to, alt, src } = options;\n const line = doc.lineAt(pos);\n let insertFrom = line.to;\n let insert = `\\n![${alt}](${src})`;\n\n if (line.length === 0) {\n insertFrom = line.from;\n insert = insert.slice(1);\n }\n\n return [\n { from, to, insert: '' },\n { from: insertFrom, insert },\n ];\n}\n", "import {EditorState} from '@codemirror/state';\nimport {EditorView, ViewPlugin, type PluginValue, ViewUpdate} from '@codemirror/view';\n\n/**\n * A ViewPlugin that handles pasting and dragging-and-dropping images into the editor.\n * It reads the image file, converts it to a Base64 data URL, and inserts it as markdown.\n */\nclass ImagePastePlugin implements PluginValue {\n private view: EditorView;\n\n constructor(view: EditorView) {\n this.view = view;\n this.setupListeners();\n }\n\n private setupListeners() {\n this.view.dom.addEventListener('dragover', this.handleDragOver);\n this.view.dom.addEventListener('drop', this.handleDrop);\n this.view.dom.addEventListener('paste', this.handlePaste);\n }\n\n update(_update: ViewUpdate) {\n // No action needed on editor updates for this plugin.\n }\n\n destroy() {\n this.view.dom.removeEventListener('dragover', this.handleDragOver);\n this.view.dom.removeEventListener('drop', this.handleDrop);\n this.view.dom.removeEventListener('paste', this.handlePaste);\n }\n\n private handleDragOver = (e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'copy';\n }\n };\n\n private handleDrop = (e: DragEvent) => {\n e.preventDefault();\n if (this.isReadOnly()) {\n return;\n }\n const files = e.dataTransfer?.files;\n if (files && files.length > 0) {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n if (this.isImageFile(file)) {\n let pos = this.view.posAtCoords({x: e.clientX, y: e.clientY});\n if (pos === null) {\n pos = this.view.state.selection.main.head;\n }\n this.processImage(file, pos);\n }\n }\n }\n };\n\n private handlePaste = (e: ClipboardEvent) => {\n if (this.isReadOnly()) {\n return;\n }\n const items = e.clipboardData?.items;\n if (items) {\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile();\n if (file) {\n e.preventDefault();\n this.processImage(file, this.view.state.selection.main.head);\n }\n }\n }\n }\n };\n\n private isImageFile(file: File): boolean {\n return file.type.startsWith('image/') || /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(file.name);\n }\n\n private isReadOnly(): boolean {\n return this.view.state.facet(EditorState.readOnly);\n }\n\n /**\n * Reads an image file, converts it to Base64, and inserts it into the editor at the given position.\n * @param file The image file to process.\n * @param pos The position in the document to insert the image markdown.\n */\n private processImage(file: File, pos: number | null) {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64Data = e.target?.result as string;\n if (pos !== null) {\n const markdownImage = `![${this.getFileNameWithoutExtension(file.name)}](${base64Data})`;\n const transaction = this.view.state.update({\n changes: {from: pos, to: pos, insert: markdownImage},\n selection: {anchor: pos + markdownImage.length},\n });\n this.view.dispatch(transaction);\n }\n };\n reader.readAsDataURL(file);\n }\n\n /**\n * Extracts the file name from a full file path, without the extension.\n * @param fileName The full name of the file (e.g., \"my-image.png\").\n * @returns The file name without the extension (e.g., \"my-image\").\n */\n private getFileNameWithoutExtension(fileName: string): string {\n return fileName.replace(/\\.[^/.]+$/, \"\");\n }\n}\n\nexport const imageDragAndDropPlugin = ViewPlugin.fromClass(ImagePastePlugin);\n", "import {Decoration, EditorView, ViewPlugin, type ViewUpdate} from \"@codemirror/view\"\nimport {RangeSetBuilder} from \"@codemirror/state\"\nimport {syntaxTree} from \"@codemirror/language\"\nimport {fencedCodeDecoration} from \"./decorations.ts\";\n\n/**\n * Builds visible line decorations for fenced code blocks.\n */\nfunction buildFencedCodeDecorations(view: EditorView) {\n const state = view.state\n const ranges: { from: number, to: number, decoration: Decoration }[] = []\n const seenNodes = new Set<string>()\n\n for (const visibleRange of view.visibleRanges) {\n syntaxTree(state).iterate({\n from: visibleRange.from,\n to: visibleRange.to,\n enter: (node) => {\n if (node.type.name !== \"FencedCode\") {\n return\n }\n const nodeKey = `${node.from}:${node.to}`\n if (seenNodes.has(nodeKey)) {\n return\n }\n seenNodes.add(nodeKey)\n\n const start = node.from\n const end = node.to\n\n const startLine = state.doc.lineAt(start)\n const endLine = state.doc.lineAt(end)\n\n let pos = startLine.from\n while (pos <= endLine.from) {\n const line = state.doc.lineAt(pos)\n ranges.push({\n from: line.from,\n to: line.from,\n decoration: fencedCodeDecoration\n })\n pos = line.to + 1\n }\n },\n })\n }\n\n ranges.sort((a, b) => a.from - b.from)\n\n const builder = new RangeSetBuilder<Decoration>()\n for (const {from, to, decoration} of ranges) {\n builder.add(from, to, decoration)\n }\n\n return builder.finish()\n}\n\nexport const fencedCodeBackgroundPlugin = ViewPlugin.fromClass(\n class {\n decorations = Decoration.none\n\n constructor(view: EditorView) {\n this.decorations = buildFencedCodeDecorations(view)\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = buildFencedCodeDecorations(update.view)\n }\n }\n },\n {\n decorations: (plugin) => plugin.decorations,\n }\n)\n\n/**\n * An input handler that automatically creates a complete code block\n * when the user types three backticks (```).\n */\nexport const codeBlockInputHandler = EditorView.inputHandler.of((view, _from, _to, text) => {\n if (text === \"`\") {\n const state = view.state\n const selection = state.selection.main\n const beforeCursor = state.doc.sliceString(Math.max(0, selection.from - 2), selection.from)\n\n // Check if previous two characters are also backticks, forming three backticks\n if (beforeCursor === \"``\") {\n // Insert a newline, empty line and closing ```\n const insertText = \"\\n\\n```\"\n // Calculate new cursor position, after first ```\n const cursorPos = selection.from + 1\n\n // Execute replacement\n view.dispatch({\n changes: {from: selection.from - 2, to: selection.from, insert: \"```\" + insertText},\n selection: {anchor: cursorPos}\n })\n\n // Prevent default input handling\n return true\n }\n }\n\n // Use default input handler\n return false\n})\n", "import {Decoration} from \"@codemirror/view\";\n\n/**\n * A line decoration to apply a background and styling to fenced code block lines.\n */\nexport const fencedCodeDecoration = Decoration.line({\n attributes: {class: \"cm-fenced-code\"}\n})\n\n/**\n * A line decoration used to hide lines, such as the opening and closing\n * backtick lines of a fenced code block in WYSIWYG mode.\n * Note: This specific implementation might be superseded by Decoration.replace,\n * but is kept for potential alternative styling.\n */\nexport const hideLineDecoration = Decoration.line({\n attributes: {class: \"cm-hide-line\"}\n})", "/**\n * Language identifier autocompletion for fenced code blocks.\n *\n * This module provides autocompletion for programming language\n * identifiers in markdown fenced code blocks (e.g., ```javascript).\n */\n\nimport {autocompletion, CompletionContext} from \"@codemirror/autocomplete\";\n\n/**\n * A list of common programming languages for syntax highlighting suggestions.\n */\nconst languageNames = [\n {label: \"javascript\", type: \"keyword\"},\n {label: \"python\", type: \"keyword\"},\n {label: \"java\", type: \"keyword\"},\n {label: \"csharp\", type: \"keyword\"},\n {label: \"cpp\", type: \"keyword\"},\n {label: \"ruby\", type: \"keyword\"},\n {label: \"go\", type: \"keyword\"},\n {label: \"typescript\", type: \"keyword\"},\n {label: \"html\", type: \"keyword\"},\n {label: \"css\", type: \"keyword\"},\n {label: \"json\", type: \"keyword\"},\n {label: \"yaml\", type: \"keyword\"},\n {label: \"markdown\", type: \"keyword\"},\n {label: \"sql\", type: \"keyword\"},\n {label: \"shell\", type: \"keyword\"},\n {label: \"bash\", type: \"keyword\"},\n {label: \"rust\", type: \"keyword\"},\n {label: \"c\", type: \"keyword\"},\n {label: \"cpp\", type: \"keyword\"}\n]\n\n/**\n * The completion source function for language identifiers.\n * It activates when the cursor is right after ``` and provides language suggestions.\n * @param context - The completion context provided by CodeMirror.\n * @returns A completion result with language options, or null if not applicable.\n */\nfunction languageIdentifierCompletion(context: CompletionContext) {\n const {state, pos} = context\n const line = state.doc.lineAt(pos)\n const lineStart = line.from\n const beforeCursor = state.doc.sliceString(lineStart, pos)\n\n // Match if the line starts with ``` followed by zero or more non-space characters.\n const tripleBacktickMatch = /^```([^\\s`]*)$/.exec(beforeCursor)\n if (tripleBacktickMatch) {\n const word = tripleBacktickMatch[1]\n\n return {\n from: lineStart + 3, // Start replacing after the ```\n to: pos,\n options: languageNames.filter(lang => lang.label.startsWith(word)),\n validFor: /^([^\\s`]*)$/ // Keep the completion active as the user types the identifier\n }\n }\n\n return null\n}\n\n/**\n * The CodeMirror extension that enables language identifier autocompletion.\n */\nexport const languageIdentifierAutocomplete = autocompletion({\n override: [languageIdentifierCompletion]\n})", "import {type Extension} from \"@codemirror/state\";\nimport {codeBlockInputHandler, fencedCodeBackgroundPlugin} from \"./fenced-code-plugin.ts\";\nimport {languageIdentifierAutocomplete} from \"./language-autocomplete.ts\";\n\n/**\n * Returns a CodeMirror extension for enhanced fenced code block functionality.\n * This includes background styling, language autocompletion, and an input helper\n * for creating code blocks.\n */\nexport function fencedCode(): Extension{\n return [\n fencedCodeBackgroundPlugin,\n languageIdentifierAutocomplete,\n codeBlockInputHandler\n ]\n}", "import {type Extension} from \"@codemirror/state\";\nimport {EditorView, keymap} from \"@codemirror/view\";\n\nexport const blockquoteKeymapExtension: Extension = keymap.of([\n {\n key: 'Enter',\n run: (view: EditorView) => {\n const { state } = view;\n const line = state.doc.lineAt(state.selection.main.from);\n const lineText = line.text;\n\n // Match one or more blockquote markers at the start of the line\n const match = lineText.match(/^(\\s*(?:>\\s*)+)/);\n\n if (match) {\n const prefix = match[1];\n const content = lineText.slice(prefix.length);\n\n if (content.trim() === '') {\n const newPrefix = prefix.replace(/(\\s*>\\s*)$/, '');\n\n view.dispatch({\n changes: { from: line.from, to: line.to, insert: newPrefix },\n selection: { anchor: line.from + newPrefix.length }\n });\n } else {\n view.dispatch({\n changes: { from: state.selection.main.from, to: state.selection.main.to, insert: '\\n' + prefix },\n selection: { anchor: state.selection.main.from + 1 + prefix.length }\n });\n }\n return true;\n }\n return false;\n }\n }\n]);", "import { blockquoteKeymapExtension } from './keymaps.ts';\n\nexport function blockquote() {\n return [\n blockquoteKeymapExtension\n ]\n}", "import {ViewPlugin} from \"@codemirror/view\";\nimport { bubbleMenuField } from './fields';\nimport { BubbleMenu } from './bubble-menu';\n\n/**\n * The main ViewPlugin that brings the BubbleMenu functionality to the editor.\n */\nconst bubbleMenuPlugin = ViewPlugin.fromClass(BubbleMenu);\n\n/**\n * Returns the CodeMirror extension for the bubble menu.\n * This includes the StateField for managing menu state and the ViewPlugin for rendering.\n */\nexport function bubbleMenu() {\n return [bubbleMenuField, bubbleMenuPlugin];\n}\n", "import {StateEffect, StateField} from \"@codemirror/state\";\nimport {type BubbleMenuItem} from \"./types.ts\";\n\n/**\n * A StateEffect used to signal that the bubble menu should be shown.\n * It carries the position and item configuration for the menu.\n */\nexport const showBubbleMenu = StateEffect.define<{ pos: number, items: BubbleMenuItem[] }>()\n\n/**\n * A StateField that holds the state for the bubble menu.\n * It tracks the menu's position and item configuration, or null if the menu should be hidden.\n */\nexport const bubbleMenuField = StateField.define<{ pos: number, items: BubbleMenuItem[] } | null>({\n create: () => null,\n update(value, tr) {\n // If a `showBubbleMenu` effect is present, update the state with its value.\n for (const effect of tr.effects) {\n if (effect.is(showBubbleMenu)) {\n return effect.value\n }\n }\n // If the selection changes, hide the menu by returning null.\n if (tr.selection) {\n return null\n }\n // Otherwise, keep the current state.\n return value\n }\n})", "import { type PluginValue, EditorView, type ViewUpdate } from '@codemirror/view';\nimport { EditorState } from '@codemirror/state';\nimport { createPopper, type Instance as PopperInstance } from '@popperjs/core';\nimport { CSS_CLASSES, POPPER_CONFIG } from '../../core';\nimport { createElement } from '../../core';\nimport { AIPolishPanel } from './ai-polish-panel';\nimport { bubbleMenuField, showBubbleMenu } from './fields';\nimport type { BubbleMenuItem } from './types';\nimport {\n localeState,\n onAIStreamState,\n translationsState,\n} from '../runtime/editor-runtime-state';\nimport { createBubbleMenuItems } from './bubble-menu-items';\nimport {\n renderBubbleMenuDom,\n updateBubbleMenuActiveStates,\n} from './bubble-menu-dom';\nimport {\n createSelectionVirtualElement,\n isImageSelection,\n positionAIPolishPanel,\n} from './bubble-menu-positioning';\nimport { isWidgetEditableSelection } from '../widget-edit-bubble';\n\nexport class BubbleMenu implements PluginValue {\n private readonly dom: HTMLElement;\n private readonly items: BubbleMenuItem[];\n private readonly view: EditorView;\n private popper: PopperInstance | null;\n private readonly boundHandleMouseUp: (event: MouseEvent) => void;\n private aiPolishPanel: AIPolishPanel | null = null;\n private aiPolishAnchorFrom: number = 0;\n private aiPolishAnchorTo: number = 0;\n /** The original text that was selected when AI Polish was triggered. */\n private aiPolishOriginalText: string = '';\n\n constructor(view: EditorView) {\n this.view = view;\n this.dom = createElement('div', CSS_CLASSES.BUBBLE_MENU);\n this.items = createBubbleMenuItems({\n onAIPolish: (targetView) => this.handleAIPolish(targetView),\n });\n\n this.buildMenu();\n document.body.appendChild(this.dom);\n\n this.popper = null;\n this.boundHandleMouseUp = this.handleMouseUp.bind(this);\n document.addEventListener('mouseup', this.boundHandleMouseUp);\n }\n\n update(update: ViewUpdate): void {\n // Orphaned AI Polish panel detection.\n // If any document change touches the original anchor range, destroy the panel.\n if (this.aiPolishPanel && update.docChanged) {\n let touches = false;\n update.changes.iterChangedRanges((fromA, toA) => {\n if (toA >= this.aiPolishAnchorFrom && fromA <= this.aiPolishAnchorTo) {\n touches = true;\n }\n });\n if (touches) {\n this.destroyAIPolishPanel();\n }\n }\n\n const menu = update.state.field(bubbleMenuField);\n if (!menu || update.state.facet(EditorState.readOnly)) {\n this.hide();\n if (update.state.facet(EditorState.readOnly)) {\n this.destroyAIPolishPanel();\n }\n return;\n }\n\n const { from, to } = update.state.selection.main;\n if (\n from === to ||\n isImageSelection(update.state, from, to) ||\n isWidgetEditableSelection(update.state, from, to)\n ) {\n this.hide();\n return;\n }\n\n this.show(from, to);\n }\n\n destroy(): void {\n this.destroyPopper();\n this.destroyAIPolishPanel();\n this.dom.remove();\n document.removeEventListener('mouseup', this.boundHandleMouseUp);\n }\n\n private hide(): void {\n this.dom.style.display = 'none';\n this.destroyPopper();\n }\n\n private destroyPopper(): void {\n if (this.popper) {\n this.popper.destroy();\n this.popper = null;\n }\n }\n\n private show(from: number, to: number): void {\n requestAnimationFrame(() => {\n this.dom.style.display = 'flex';\n\n const virtualElement = createSelectionVirtualElement(this.view, from, to);\n if (!virtualElement) {\n return;\n }\n\n this.destroyPopper();\n\n this.popper = createPopper(virtualElement, this.dom, {\n placement: POPPER_CONFIG.PLACEMENT,\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: POPPER_CONFIG.OFFSET,\n },\n },\n ],\n });\n\n updateBubbleMenuActiveStates(this.dom, this.items, this.view.state);\n this.popper.update();\n });\n }\n\n private handleMouseUp(_event: MouseEvent): void {\n const { state } = this.view;\n const { from, to } = state.selection.main;\n\n if (state.facet(EditorState.readOnly)) {\n this.hide();\n this.destroyAIPolishPanel();\n return;\n }\n\n if (\n from !== to &&\n !isImageSelection(state, from, to) &&\n !isWidgetEditableSelection(state, from, to)\n ) {\n this.view.dispatch({\n effects: showBubbleMenu.of({\n pos: Math.max(from, to),\n items: this.items,\n }),\n });\n return;\n }\n\n this.hide();\n }\n\n private clearSelectionAndFocus(): void {\n requestAnimationFrame(() => {\n const currentPos = this.view.state.selection.main.head;\n this.view.dispatch({\n selection: { anchor: currentPos, head: currentPos },\n });\n this.view.focus();\n });\n }\n\n private buildMenu(): void {\n renderBubbleMenuDom({\n dom: this.dom,\n items: this.items,\n view: this.view,\n onActionFinished: () => {\n this.hide();\n this.clearSelectionAndFocus();\n },\n });\n }\n\n private handleAIPolish(view: EditorView): boolean {\n if (view.state.facet(EditorState.readOnly)) {\n return false;\n }\n\n const { from, to } = view.state.selection.main;\n const selectedText = view.state.sliceDoc(from, to);\n\n if (!selectedText.trim()) {\n return false;\n }\n\n const onAIStream = view.state.field(onAIStreamState, false);\n if (!onAIStream) {\n alert('AI stream handler is not configured. Please provide config.onAIStream when creating Moondown.');\n return false;\n }\n\n const translations = view.state.field(translationsState);\n const locale = view.state.field(localeState);\n\n this.destroyAIPolishPanel();\n\n this.aiPolishPanel = new AIPolishPanel({\n selectedText,\n from,\n to,\n view,\n onClose: () => {\n this.destroyAIPolishPanel();\n },\n onInsert: (polishedText: string) => {\n if (view.state.facet(EditorState.readOnly)) {\n return;\n }\n view.dispatch({\n changes: { from, to, insert: polishedText },\n selection: { anchor: from + polishedText.length },\n });\n view.focus();\n },\n onAIStream,\n locale,\n translations,\n });\n\n // Record anchor range and original text for orphan detection\n this.aiPolishAnchorFrom = from;\n this.aiPolishAnchorTo = to;\n this.aiPolishOriginalText = selectedText;\n\n this.positionAIPolishPanel();\n document.body.appendChild(this.aiPolishPanel.getDOM());\n return true;\n }\n\n private positionAIPolishPanel(): void {\n if (!this.aiPolishPanel) {\n return;\n }\n\n requestAnimationFrame(() => {\n positionAIPolishPanel(this.dom, this.aiPolishPanel!.getDOM());\n });\n }\n\n private destroyAIPolishPanel(): void {\n if (this.aiPolishPanel) {\n this.aiPolishPanel.destroy();\n this.aiPolishPanel = null;\n }\n }\n}\n", "import {EditorView} from \"@codemirror/view\";\nimport {createIcons, icons} from 'lucide';\nimport {createElement, createIconElement} from \"../../core\";\nimport {CSS_CLASSES} from \"../../core\";\nimport type {AIStreamHandler, MoondownTranslations} from \"../../core\";\nimport {\n buildAIPolishSystemPrompt,\n buildAIPolishUserPrompt,\n type AIPolishConversationMessage,\n} from './ai-polish-prompts';\n\nexport interface AIPolishPanelOptions {\n selectedText: string;\n from: number;\n to: number;\n view: EditorView;\n onClose: () => void;\n onInsert: (text: string) => void;\n onAIStream: AIStreamHandler;\n locale?: string;\n translations?: MoondownTranslations;\n}\n\nexport class AIPolishPanel {\n private dom: HTMLElement;\n private inputContainer: HTMLElement;\n private responseContainer: HTMLElement;\n private inputField: HTMLTextAreaElement;\n private sendButton: HTMLButtonElement;\n private options: AIPolishPanelOptions;\n private isGenerating: boolean = false;\n private currentResponse: string = '';\n private abortController: AbortController | null = null;\n private conversationHistory: AIPolishConversationMessage[] = [];\n private readonly locale: string;\n\n constructor(options: AIPolishPanelOptions) {\n this.options = options;\n this.locale = options.locale || 'en';\n this.dom = createElement('div', CSS_CLASSES.AI_POLISH_PANEL);\n\n const closeBtn = this.createIconButton('x', this.t('moondown.ai.polish.buttons.close', 'Close'), 'ai-polish-close-btn');\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.options.onClose();\n });\n this.dom.appendChild(closeBtn);\n\n this.inputContainer = this.createInputSection();\n this.dom.appendChild(this.inputContainer);\n\n this.responseContainer = createElement('div', CSS_CLASSES.AI_POLISH_RESPONSE_SECTION);\n this.dom.appendChild(this.responseContainer);\n\n this.inputField = this.inputContainer.querySelector('textarea') as HTMLTextAreaElement;\n this.sendButton = this.inputContainer.querySelector('.ai-polish-send-btn') as HTMLButtonElement;\n\n setTimeout(() => this.inputField.focus(), 50);\n document.addEventListener('keydown', this.handleKeyDown);\n\n this.initializeIcons();\n }\n\n private initializeIcons(): void {\n requestAnimationFrame(() => {\n createIcons({\n icons,\n attrs: {width: '14', height: '14', \"stroke-width\": \"2.5\"},\n });\n });\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && !this.isGenerating) {\n this.options.onClose();\n }\n };\n\n private createInputSection(): HTMLElement {\n const container = createElement('div', CSS_CLASSES.AI_POLISH_INPUT_SECTION);\n const wrapper = createElement('div', 'ai-polish-input-wrapper');\n\n const textarea = document.createElement('textarea');\n textarea.className = CSS_CLASSES.AI_POLISH_INPUT;\n textarea.placeholder = this.t('moondown.ai.polish.placeholder', 'Tell AI how to polish this text...');\n textarea.rows = 1;\n\n textarea.addEventListener('input', () => this.adjustTextareaHeight(textarea));\n textarea.addEventListener('keydown', (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n this.handleGenerate();\n }\n });\n\n wrapper.appendChild(textarea);\n\n const sendBtn = document.createElement('button');\n sendBtn.className = 'ai-polish-send-btn';\n sendBtn.type = 'button';\n sendBtn.title = `${this.t('moondown.ai.polish.buttons.send', 'Send')} (Cmd+Enter)`;\n sendBtn.appendChild(createIconElement('arrow-up'));\n sendBtn.addEventListener('click', () => this.handleGenerate());\n\n wrapper.appendChild(sendBtn);\n container.appendChild(wrapper);\n\n const hint = createElement('div', 'ai-polish-hint');\n hint.innerHTML = `<span>${this.t('moondown.ai.polish.hint', 'Press Cmd/Ctrl + Enter to send')}</span>`;\n container.appendChild(hint);\n\n return container;\n }\n\n private adjustTextareaHeight(textarea: HTMLTextAreaElement) {\n textarea.style.height = 'auto';\n textarea.style.height = Math.min(textarea.scrollHeight, 150) + 'px';\n }\n\n private createIconButton(iconName: string, tooltip: string, extraClass: string = ''): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = `ai-polish-icon-btn ${extraClass}`.trim();\n btn.type = 'button';\n btn.title = tooltip;\n btn.appendChild(createIconElement(iconName));\n return btn;\n }\n\n private async handleGenerate(manualInstruction?: string, isRetry: boolean = false): Promise<void> {\n const instruction = manualInstruction || this.inputField.value.trim();\n if (this.isGenerating) return;\n\n this.isGenerating = true;\n this.currentResponse = '';\n\n this.dom.classList.add('is-generating');\n this.inputField.disabled = true;\n this.sendButton.disabled = true;\n\n if (!isRetry) {\n this.inputField.value = '';\n this.adjustTextareaHeight(this.inputField);\n\n const userHistoryContent = instruction || \"General Polish\";\n this.conversationHistory.push({ role: 'user', content: userHistoryContent });\n\n this.responseContainer.classList.add('visible');\n if (instruction) {\n this.appendUserBubble(instruction);\n }\n }\n\n const responseBubble = this.createResponseBubble();\n this.responseContainer.appendChild(responseBubble);\n const responseText = responseBubble.querySelector('.ai-polish-response-text') as HTMLElement;\n this.scrollToBottom();\n\n try {\n this.abortController = new AbortController();\n\n const systemPrompt = buildAIPolishSystemPrompt();\n const userPrompt = buildAIPolishUserPrompt({\n locale: this.locale,\n selectedText: this.options.selectedText,\n instruction: instruction || 'Polish this text.',\n conversationHistory: this.conversationHistory,\n });\n\n const stream = await this.options.onAIStream(\n systemPrompt,\n userPrompt,\n this.abortController.signal\n );\n\n const reader = stream.getReader();\n\n while (true) {\n const {done, value} = await reader.read();\n if (done) break;\n if (value) {\n this.currentResponse += value;\n responseText.textContent = this.currentResponse;\n this.scrollToBottom();\n }\n }\n\n this.conversationHistory.push({ role: 'assistant', content: this.currentResponse });\n\n this.showActionButtons(responseBubble);\n\n } catch (error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n responseText.textContent += ' [Cancelled]';\n } else {\n console.error('AI Polish error:', error);\n const message = error instanceof Error ? error.message : 'Generation failed';\n responseText.textContent = `Error: ${message}`;\n responseBubble.classList.add('error');\n }\n } finally {\n this.isGenerating = false;\n this.sendButton.disabled = false;\n this.inputField.disabled = false;\n this.inputField.focus();\n this.abortController = null;\n this.dom.classList.remove('is-generating');\n this.initializeIcons();\n }\n }\n\n private handleRegenerate(): void {\n if (this.isGenerating) return;\n if (this.conversationHistory.length < 2) return;\n\n const lastIndex = this.conversationHistory.length - 1;\n const lastMsg = this.conversationHistory[lastIndex];\n\n if (lastMsg.role === 'assistant') {\n this.conversationHistory.pop();\n if (this.responseContainer.lastElementChild) {\n this.responseContainer.lastElementChild.remove();\n }\n }\n\n const userMsg = this.conversationHistory[this.conversationHistory.length - 1];\n if (userMsg && userMsg.role === 'user') {\n const retryContent = userMsg.content === \"General Polish\" ? \"\" : userMsg.content;\n this.handleGenerate(retryContent, true);\n }\n }\n\n private appendUserBubble(text: string): void {\n const bubble = createElement('div', 'ai-polish-user-bubble');\n bubble.textContent = text;\n this.responseContainer.appendChild(bubble);\n }\n\n private scrollToBottom(): void {\n if (this.responseContainer) {\n this.responseContainer.scrollTop = this.responseContainer.scrollHeight;\n }\n }\n\n private createResponseBubble(): HTMLElement {\n const bubble = createElement('div', CSS_CLASSES.AI_POLISH_RESPONSE_BUBBLE);\n const responseText = createElement('div', 'ai-polish-response-text');\n const typingIndicator = createElement('div', 'ai-polish-typing-indicator');\n typingIndicator.innerHTML = '<span></span><span></span><span></span>';\n\n bubble.appendChild(responseText);\n bubble.appendChild(typingIndicator);\n return bubble;\n }\n\n private showActionButtons(bubble: HTMLElement): void {\n const typingIndicator = bubble.querySelector('.ai-polish-typing-indicator');\n if (typingIndicator) typingIndicator.remove();\n\n const actionBar = createElement('div', 'ai-polish-action-bar');\n\n const createAction = (iconName: string, label: string, onClick: () => void, isPrimary = false) => {\n const btn = document.createElement('button');\n btn.className = 'ai-polish-action-btn';\n btn.type = 'button';\n if (isPrimary) btn.classList.add('primary-action');\n\n const icon = createIconElement(iconName);\n const span = document.createElement('span');\n span.textContent = label;\n\n btn.appendChild(icon);\n btn.appendChild(span);\n btn.onclick = onClick;\n return btn;\n };\n\n actionBar.appendChild(createAction('refresh-cw', this.t('moondown.ai.polish.buttons.retry', 'Retry'), () => this.handleRegenerate()));\n\n const copyBtn = createAction('copy', this.t('moondown.ai.polish.buttons.copy', 'Copy'), () => this.handleCopy(copyBtn));\n actionBar.appendChild(copyBtn);\n\n const insertBtn = createAction('check', this.t('moondown.ai.polish.buttons.insert', 'Insert'), () => this.handleInsert(), true);\n actionBar.appendChild(insertBtn);\n\n bubble.appendChild(actionBar);\n setTimeout(() => this.scrollToBottom(), 0);\n }\n\n private handleCopy(btn: HTMLButtonElement): void {\n if (this.currentResponse) {\n navigator.clipboard.writeText(this.currentResponse).then(() => {\n const originalContent = btn.innerHTML;\n const span = btn.querySelector('span');\n if (span) span.textContent = this.t('moondown.ai.polish.buttons.copied', 'Copied');\n\n setTimeout(() => {\n btn.innerHTML = originalContent;\n this.initializeIcons();\n }, 1500);\n });\n }\n }\n\n private handleInsert(): void {\n if (this.currentResponse) {\n this.options.onInsert(this.currentResponse);\n this.options.onClose();\n }\n }\n\n private t(key: string, fallback: string): string {\n return this.options.translations?.[key] ?? fallback;\n }\n\n public getDOM(): HTMLElement { return this.dom; }\n public destroy(): void {\n document.removeEventListener('keydown', this.handleKeyDown);\n if (this.abortController) this.abortController.abort();\n this.dom.remove();\n }\n}\n", "export interface AIPolishConversationMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport interface BuildAIPolishUserPromptOptions {\n locale: string;\n selectedText: string;\n instruction: string;\n conversationHistory: AIPolishConversationMessage[];\n}\n\nexport function resolveAIPolishTargetLanguage(locale: string): string {\n return locale.startsWith('zh') ? 'Simplified Chinese' : 'English';\n}\n\nexport function buildAIPolishSystemPrompt(): string {\n return `You are an expert AI Editor embedded in a Markdown editor.\nYour goal is to refine the user's text based on their instructions.\n\n### SYSTEM RULES (CRITICAL):\n\n1. **MARKDOWN PRESERVATION**:\n - The input is Markdown. You MUST preserve all formatting (e.g., **bold**, [links](), \\`code\\`).\n - Do NOT wrap the output in \\`\\`\\`markdown code blocks\\`\\`\\`. Output raw text only.\n\n2. **LANGUAGE CONSISTENCY**:\n - You will receive a <target_language> tag.\n - You MUST write the output in that specific language.\n - Exception: If the user explicitly asks to \"Translate to English\", follow the user's instruction.\n\n3. **NO CONVERSATIONAL FILLER**:\n - Output ONLY the result.\n - Do NOT say \"Here is the polished text\" or \"I have improved it\".\n\n4. **INSTRUCTION FOLLOWING**:\n - If <user_instruction> is empty or generic, improve grammar, flow, and clarity while keeping the original meaning.\n`;\n}\n\nexport function buildAIPolishUserPrompt(options: BuildAIPolishUserPromptOptions): string {\n const { locale, selectedText, instruction, conversationHistory } = options;\n const targetLanguage = resolveAIPolishTargetLanguage(locale);\n const sections: string[] = [];\n\n if (conversationHistory.length > 0) {\n const history = conversationHistory\n .map((message) => `<message role=\"${message.role}\">\\n${message.content}\\n</message>`)\n .join('\\n');\n sections.push(`<conversation_history>\\n${history}\\n</conversation_history>`);\n }\n\n sections.push(`<context_data>\n <target_language>${targetLanguage}</target_language>\n <source_text>\n${selectedText}\n </source_text>\n</context_data>`);\n\n sections.push(`<user_instruction>\n${instruction}\n</user_instruction>`);\n\n return `${sections.join('\\n\\n')}\\n\\nOutput:`;\n}\n", "import { type ChangeSpec } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { applyChanges, createHeadingPrefix, extractListNumber, getLinesInRange, isUnorderedListItem } from '../../core';\n\n/**\n * Sets or toggles the heading level for the selected lines.\n */\nexport function setHeader(view: EditorView, level: number): boolean {\n const { state } = view;\n const { from, to } = state.selection.main;\n const headerPrefix = createHeadingPrefix(level);\n const lines = getLinesInRange(state, from, to);\n\n const changes: ChangeSpec[] = lines.map((line) => {\n // Toggle off if already this heading level.\n if (line.text.startsWith(headerPrefix)) {\n return {\n from: line.from,\n to: line.from + headerPrefix.length,\n insert: '',\n };\n }\n\n // Replace existing heading with new level.\n const existingHeaderMatch = line.text.match(/^#+\\s/);\n if (existingHeaderMatch) {\n return {\n from: line.from,\n to: line.from + existingHeaderMatch[0].length,\n insert: headerPrefix,\n };\n }\n\n // Add new heading.\n return { from: line.from, insert: headerPrefix };\n });\n\n applyChanges(view, changes);\n return true;\n}\n\n/**\n * Toggles ordered or unordered list formatting for the selected lines.\n */\nexport function toggleList(view: EditorView, ordered: boolean): boolean {\n const { state } = view;\n const { from, to } = state.selection.main;\n const lines = getLinesInRange(state, from, to);\n\n // Determine starting number for ordered lists.\n let currentNumber = 1;\n const fromLine = state.doc.lineAt(from);\n if (fromLine.number > 1 && ordered) {\n const prevLine = state.doc.line(fromLine.number - 1);\n const prevNumber = extractListNumber(prevLine.text);\n if (prevNumber !== null) {\n currentNumber = prevNumber + 1;\n }\n }\n\n const changes: ChangeSpec[] = lines.map((line) => {\n const lineText = line.text;\n\n if (ordered) {\n const existingNumber = extractListNumber(lineText);\n if (existingNumber !== null) {\n // Remove ordered list marker.\n const match = lineText.match(/^(\\d+)\\.\\s/);\n return {\n from: line.from,\n to: line.from + match![0].length,\n insert: '',\n };\n }\n // Add ordered list marker.\n const insert = `${currentNumber}. `;\n currentNumber += 1;\n return { from: line.from, insert };\n }\n\n if (isUnorderedListItem(lineText)) {\n // Remove unordered list marker.\n return { from: line.from, to: line.from + 2, insert: '' };\n }\n // Add unordered list marker.\n return { from: line.from, insert: '- ' };\n });\n\n applyChanges(view, changes);\n return true;\n}\n", "import { type ChangeSpec, type EditorState } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { applyChanges, escapeRegExp, getTextWithContext, SELECTION } from '../../core';\n\n/**\n * Toggles an inline markdown style (e.g., bold, italic) around the current selection.\n */\nexport function toggleInlineStyle(view: EditorView, mark: string): boolean {\n const { state } = view;\n const { from, to } = state.selection.main;\n\n // Get text with context around the selection to find surrounding markers.\n const contextLength = mark.length * SELECTION.MARKER_CONTEXT_LENGTH;\n const { text: textToCheck, start } = getTextWithContext(state, from, to, contextLength);\n\n const escapedMark = escapeRegExp(mark);\n const regex = new RegExp(`(${escapedMark}+)([\\\\s\\\\S]*?)\\\\1`, 'g');\n\n const markerLength = mark.length;\n const changes: ChangeSpec[] = [];\n let match: RegExpExecArray | null;\n let found = false;\n\n // Check special case of bold/italic conversions.\n if (mark === '*') {\n const boldOrBoldItalicRegex = /(\\*{2,3})([^*]+)\\1/g;\n while ((match = boldOrBoldItalicRegex.exec(textToCheck)) !== null) {\n const matchStart = start + match.index;\n const matchEnd = matchStart + match[0].length;\n if (matchStart <= from && to <= matchEnd) {\n const existingMarkers = match[1];\n if (existingMarkers === '**') {\n // Convert bold to bold-italic.\n changes.push(\n { from: matchStart, to: matchStart + 2, insert: '***' },\n { from: matchEnd - 2, to: matchEnd, insert: '***' }\n );\n } else if (existingMarkers === '***') {\n // Convert bold-italic to bold.\n changes.push(\n { from: matchStart, to: matchStart + 3, insert: '**' },\n { from: matchEnd - 3, to: matchEnd, insert: '**' }\n );\n }\n found = true;\n break;\n }\n }\n }\n\n if (!found) {\n while ((match = regex.exec(textToCheck)) !== null) {\n const fullMarkerLength = match[1].length;\n if (fullMarkerLength % markerLength !== 0) {\n continue;\n }\n const matchStart = start + match.index;\n const matchEnd = matchStart + match[0].length;\n\n if (matchStart <= from && to <= matchEnd) {\n // Remove one layer of markers.\n changes.push(\n { from: matchStart, to: matchStart + markerLength, insert: '' },\n { from: matchEnd - markerLength, to: matchEnd, insert: '' }\n );\n found = true;\n break;\n }\n }\n }\n\n // If no existing style was found to remove, handle combined style cases.\n if (!found) {\n const combinedRegex = /(\\*{1,3}|_{1,3}|~~|==)([^*_~=]+)\\1/g;\n while ((match = combinedRegex.exec(textToCheck)) !== null) {\n const matchStart = start + match.index;\n const matchEnd = matchStart + match[0].length;\n\n if (matchStart <= from && to <= matchEnd) {\n const existingMarkers = match[1];\n if (existingMarkers.includes(mark)) {\n // Remove the mark from existing markers.\n const newMarkers = existingMarkers.replace(mark, '');\n changes.push(\n { from: matchStart, to: matchStart + existingMarkers.length, insert: newMarkers },\n { from: matchEnd - existingMarkers.length, to: matchEnd, insert: newMarkers }\n );\n } else {\n // Add the mark to existing markers.\n changes.push(\n { from: matchStart, to: matchStart + existingMarkers.length, insert: existingMarkers + mark },\n { from: matchEnd - existingMarkers.length, to: matchEnd, insert: mark + existingMarkers }\n );\n }\n found = true;\n break;\n }\n }\n }\n\n if (!found) {\n // Add new markers.\n changes.push(\n { from, insert: mark },\n { from: to, insert: mark }\n );\n }\n\n applyChanges(view, changes);\n return true;\n}\n\n/**\n * Checks if an inline style is active within the current selection.\n */\nexport function isInlineStyleActive(state: EditorState, marker: string): boolean {\n const { from, to } = state.selection.main;\n\n const contextLength = marker.length * SELECTION.MARKER_CONTEXT_LENGTH;\n const { text: textToCheck, start } = getTextWithContext(state, from, to, contextLength);\n\n const escapedMarker = escapeRegExp(marker);\n // Regex to find a valid markdown style block.\n const regex = new RegExp(\n `(?<!\\\\${marker[0]})${escapedMarker}([^${escapedMarker}]+)${escapedMarker}(?!\\\\${marker[0]})`,\n 'g'\n );\n\n let match: RegExpExecArray | null;\n while ((match = regex.exec(textToCheck)) !== null) {\n const matchStart = start + match.index;\n const matchEnd = matchStart + match[0].length;\n\n if (matchStart <= from && to <= matchEnd) {\n return true;\n }\n }\n\n // Special handling for combined bold/italic styles.\n if (marker === '**' || marker === '*') {\n const boldItalicRegex = /\\*{3}([^*]+)\\*{3}/g;\n while ((match = boldItalicRegex.exec(textToCheck)) !== null) {\n const matchStart = start + match.index;\n const matchEnd = matchStart + match[0].length;\n\n if (matchStart <= from && to <= matchEnd) {\n return true;\n }\n }\n }\n\n return false;\n}\n", "import type { EditorState } from '@codemirror/state';\nimport { createHeadingPrefix, extractListNumber, isUnorderedListItem } from '../../core';\n\n/**\n * Checks if a specific heading level is active at the cursor's current line.\n */\nexport function isHeaderActive(state: EditorState, level: number): boolean {\n const { from } = state.selection.main;\n const line = state.doc.lineAt(from);\n const headerPrefix = createHeadingPrefix(level);\n return line.text.startsWith(headerPrefix);\n}\n\n/**\n * Checks if a list style is active at the cursor's current line.\n */\nexport function isListActive(state: EditorState, ordered: boolean): boolean {\n const { from } = state.selection.main;\n const line = state.doc.lineAt(from);\n\n if (ordered) {\n return extractListNumber(line.text) !== null;\n }\n\n return isUnorderedListItem(line.text);\n}\n", "import type { EditorView } from '@codemirror/view';\nimport { MARKDOWN_MARKERS } from '../../core';\nimport {\n isHeaderActive,\n isInlineStyleActive,\n isListActive,\n setHeader,\n toggleInlineStyle,\n toggleList,\n} from './content-functions';\nimport type { BubbleMenuItem } from './types';\n\ninterface BubbleMenuItemFactoryOptions {\n onAIPolish: (view: EditorView) => boolean;\n}\n\nexport function createBubbleMenuItems({ onAIPolish }: BubbleMenuItemFactoryOptions): BubbleMenuItem[] {\n return [\n {\n name: 'Heading',\n icon: 'Heading',\n type: 'dropdown',\n subItems: [\n {\n name: 'H1',\n icon: 'Heading1',\n action: (view) => setHeader(view, 1),\n isActive: (state) => isHeaderActive(state, 1),\n },\n {\n name: 'H2',\n icon: 'Heading2',\n action: (view) => setHeader(view, 2),\n isActive: (state) => isHeaderActive(state, 2),\n },\n {\n name: 'H3',\n icon: 'Heading3',\n action: (view) => setHeader(view, 3),\n isActive: (state) => isHeaderActive(state, 3),\n },\n ],\n },\n {\n name: 'List',\n icon: 'List',\n type: 'dropdown',\n subItems: [\n {\n name: 'Ordered List',\n icon: 'list-ordered',\n action: (view) => toggleList(view, true),\n isActive: (state) => isListActive(state, true),\n },\n {\n name: 'Unordered List',\n icon: 'List',\n action: (view) => toggleList(view, false),\n isActive: (state) => isListActive(state, false),\n },\n ],\n },\n {\n name: 'bold',\n icon: 'Bold',\n type: 'button',\n action: (view) => toggleInlineStyle(view, MARKDOWN_MARKERS.BOLD),\n isActive: (state) => isInlineStyleActive(state, MARKDOWN_MARKERS.BOLD),\n },\n {\n name: 'italic',\n icon: 'Italic',\n type: 'button',\n action: (view) => toggleInlineStyle(view, MARKDOWN_MARKERS.ITALIC),\n isActive: (state) => isInlineStyleActive(state, MARKDOWN_MARKERS.ITALIC),\n },\n {\n name: 'Decoration',\n icon: 'Paintbrush',\n type: 'dropdown',\n subItems: [\n {\n name: 'highlight',\n icon: 'Highlighter',\n action: (view) => toggleInlineStyle(view, MARKDOWN_MARKERS.HIGHLIGHT),\n isActive: (state) => isInlineStyleActive(state, MARKDOWN_MARKERS.HIGHLIGHT),\n },\n {\n name: 'Strikethrough',\n icon: 'Strikethrough',\n action: (view) => toggleInlineStyle(view, MARKDOWN_MARKERS.STRIKETHROUGH),\n isActive: (state) => isInlineStyleActive(state, MARKDOWN_MARKERS.STRIKETHROUGH),\n },\n {\n name: 'Underline',\n icon: 'Underline',\n action: (view) => toggleInlineStyle(view, MARKDOWN_MARKERS.UNDERLINE),\n isActive: (state) => isInlineStyleActive(state, MARKDOWN_MARKERS.UNDERLINE),\n },\n {\n name: 'Inline Code',\n icon: 'Code',\n action: (view) => toggleInlineStyle(view, MARKDOWN_MARKERS.INLINE_CODE),\n isActive: (state) => isInlineStyleActive(state, MARKDOWN_MARKERS.INLINE_CODE),\n },\n ],\n },\n {\n name: 'AI Polish',\n icon: 'Sparkles',\n type: 'button',\n action: onAIPolish,\n },\n ];\n}\n", "import { createIcons, icons } from 'lucide';\nimport type { EditorState } from '@codemirror/state';\nimport type { EditorView } from '@codemirror/view';\nimport { CSS_CLASSES, ICON_SIZES } from '../../core';\nimport { createElement, createIconElement } from '../../core';\nimport type { BubbleMenuItem } from './types';\n\ninterface BubbleMenuDomRenderOptions {\n dom: HTMLElement;\n items: BubbleMenuItem[];\n view: EditorView;\n onActionFinished: () => void;\n}\n\nfunction createMenuButton(item: BubbleMenuItem): HTMLButtonElement {\n const button = createElement('button', CSS_CLASSES.BUBBLE_MENU_ITEM, {\n 'data-name': item.name,\n 'data-type': item.type || 'button',\n title: item.name,\n });\n\n const iconWrapper = createIconElement(item.icon, 'cm-bubble-menu-icon');\n button.appendChild(iconWrapper);\n return button;\n}\n\nfunction createSubMenuButton(\n parentItemName: string,\n subItem: NonNullable<BubbleMenuItem['subItems']>[number]\n): HTMLButtonElement {\n const subButton = createElement('button', CSS_CLASSES.BUBBLE_MENU_SUB_ITEM, {\n 'data-name': subItem.name,\n 'data-parent': parentItemName,\n });\n\n if (subItem.icon) {\n const subIconWrapper = createIconElement(subItem.icon, 'cm-bubble-menu-sub-icon');\n subButton.appendChild(subIconWrapper);\n }\n\n const subLabel = createElement('span', 'cm-bubble-menu-sub-label');\n subLabel.textContent = subItem.name;\n subButton.appendChild(subLabel);\n\n return subButton;\n}\n\nfunction mountIcons(): void {\n setTimeout(() => {\n createIcons({\n icons,\n attrs: ICON_SIZES.MEDIUM,\n });\n }, 0);\n}\n\nexport function updateBubbleMenuActiveStates(\n dom: HTMLElement,\n items: BubbleMenuItem[],\n state: EditorState\n): void {\n for (const item of items) {\n if (item.isActive) {\n const button = dom.querySelector(`[data-name=\"${item.name}\"]`) as HTMLButtonElement | null;\n if (button) {\n button.classList.toggle(CSS_CLASSES.BUBBLE_MENU_ACTIVE, item.isActive(state));\n }\n }\n\n for (const subItem of item.subItems ?? []) {\n if (!subItem.isActive) {\n continue;\n }\n const subButton = dom.querySelector(\n `[data-name=\"${subItem.name}\"][data-parent=\"${item.name}\"]`\n ) as HTMLButtonElement | null;\n if (subButton) {\n subButton.classList.toggle(CSS_CLASSES.BUBBLE_MENU_ACTIVE, subItem.isActive(state));\n }\n }\n }\n}\n\nexport function renderBubbleMenuDom({\n dom,\n items,\n view,\n onActionFinished,\n}: BubbleMenuDomRenderOptions): void {\n dom.innerHTML = '';\n\n for (const item of items) {\n const button = createMenuButton(item);\n\n if (item.type === 'dropdown') {\n const dropdownIcon = createIconElement('chevron-down', 'cm-bubble-menu-dropdown-icon');\n button.appendChild(dropdownIcon);\n\n const dropdown = createElement('div', CSS_CLASSES.BUBBLE_MENU_DROPDOWN);\n\n for (const subItem of item.subItems ?? []) {\n const subButton = createSubMenuButton(item.name, subItem);\n subButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await subItem.action(view);\n onActionFinished();\n });\n dropdown.appendChild(subButton);\n }\n\n button.appendChild(dropdown);\n } else if (item.action) {\n button.addEventListener('click', async (event) => {\n event.preventDefault();\n await item.action?.(view);\n onActionFinished();\n });\n }\n\n dom.appendChild(button);\n }\n\n mountIcons();\n}\n", "import type { EditorState } from '@codemirror/state';\nimport type { EditorView } from '@codemirror/view';\nimport type { VirtualElement } from '@popperjs/core';\nimport { isMarkdownImage } from '../../core';\n\nexport function isImageSelection(state: EditorState, from: number, to: number): boolean {\n return isMarkdownImage(state.sliceDoc(from, to));\n}\n\nexport function createSelectionVirtualElement(\n view: EditorView,\n from: number,\n to: number\n): VirtualElement | null {\n const startPos = view.coordsAtPos(from);\n const endPos = view.coordsAtPos(to);\n if (!startPos || !endPos) {\n return null;\n }\n\n return {\n getBoundingClientRect: (): DOMRect =>\n new DOMRect(\n startPos.left,\n startPos.top,\n endPos.left - startPos.left,\n startPos.bottom - startPos.top\n ),\n };\n}\n\nexport function positionAIPolishPanel(menuDom: HTMLElement, panelDom: HTMLElement): void {\n const menuRect = menuDom.getBoundingClientRect();\n panelDom.style.top = `${menuRect.bottom + 12}px`;\n panelDom.style.left = `${menuRect.left}px`;\n}\n", "import { EditorSelection, EditorState } from '@codemirror/state';\nimport type { PluginValue, ViewUpdate } from '@codemirror/view';\nimport { EditorView, ViewPlugin } from '@codemirror/view';\nimport { createPopper, type Instance as PopperInstance } from '@popperjs/core';\nimport { CSS_CLASSES, CUSTOM_EVENTS, POPPER_CONFIG } from '../../core/constants';\nimport { createElement } from '../../core/utils/dom-utils';\nimport { createSelectionVirtualElement } from '../bubble-menu/bubble-menu-positioning';\nimport { resolveWidgetEditTarget, type WidgetEditTarget } from './selection-target';\n\nfunction isSameTarget(\n previous: WidgetEditTarget | null,\n next: WidgetEditTarget | null\n): boolean {\n if (!previous || !next) {\n return false;\n }\n\n return (\n previous.kind === next.kind &&\n previous.from === next.from &&\n previous.to === next.to &&\n previous.originalMarkdown === next.originalMarkdown\n );\n}\n\nexport class WidgetEditBubble implements PluginValue {\n private readonly view: EditorView;\n private readonly dom: HTMLElement;\n private readonly title: HTMLElement;\n private readonly textarea: HTMLTextAreaElement;\n private readonly cancelButton: HTMLButtonElement;\n private readonly applyButton: HTMLButtonElement;\n private readonly actions: HTMLElement;\n private popper: PopperInstance | null = null;\n private activeTarget: WidgetEditTarget | null = null;\n private anchorElement: Element | null = null;\n private textareaHadUserInput = false;\n private readonly boundHandleDocumentMouseDown: (event: MouseEvent) => void;\n private readonly boundHandleWidgetEditRequest: (event: Event) => void;\n private readonly boundHandleTextareaKeyDown: (event: KeyboardEvent) => void;\n\n constructor(view: EditorView) {\n this.view = view;\n this.dom = createElement('div', CSS_CLASSES.WIDGET_EDIT_BUBBLE);\n this.title = createElement('div', CSS_CLASSES.WIDGET_EDIT_BUBBLE_TITLE);\n this.textarea = createElement('textarea', CSS_CLASSES.WIDGET_EDIT_BUBBLE_INPUT);\n this.actions = createElement('div', CSS_CLASSES.WIDGET_EDIT_BUBBLE_ACTIONS);\n this.cancelButton = createElement('button', CSS_CLASSES.WIDGET_EDIT_BUBBLE_BUTTON);\n this.applyButton = createElement(\n 'button',\n `${CSS_CLASSES.WIDGET_EDIT_BUBBLE_BUTTON} ${CSS_CLASSES.WIDGET_EDIT_BUBBLE_BUTTON_PRIMARY}`\n );\n\n this.cancelButton.type = 'button';\n this.cancelButton.textContent = 'Cancel';\n this.applyButton.type = 'button';\n this.applyButton.textContent = 'Apply';\n\n this.actions.append(this.cancelButton, this.applyButton);\n this.dom.append(this.title, this.textarea, this.actions);\n this.dom.style.display = 'none';\n\n this.cancelButton.addEventListener('click', () => {\n this.hide(true);\n });\n this.applyButton.addEventListener('click', () => {\n this.applyChanges();\n });\n this.textarea.addEventListener('input', () => {\n this.textareaHadUserInput = true;\n });\n\n this.boundHandleDocumentMouseDown = (event: MouseEvent) => {\n const target = event.target as Node | null;\n if (!target) {\n return;\n }\n if (this.dom.contains(target)) {\n return;\n }\n if (this.view.dom.contains(target)) {\n return;\n }\n this.hide(false);\n };\n this.boundHandleWidgetEditRequest = (event: Event) => {\n if (this.isReadOnly()) {\n this.hide(false);\n return;\n }\n\n const customEvent = event as CustomEvent<{ from?: number; to?: number }>;\n const from = customEvent.detail?.from;\n const to = customEvent.detail?.to;\n if (typeof from !== 'number' || typeof to !== 'number') {\n return;\n }\n\n const resolvedTarget = resolveWidgetEditTarget(this.view.state, from, to);\n if (!resolvedTarget) {\n this.hide(false);\n return;\n }\n\n this.activeTarget = resolvedTarget;\n this.anchorElement = event.target instanceof Element ? event.target : null;\n this.applyTargetMeta(resolvedTarget);\n this.show(resolvedTarget);\n };\n this.boundHandleTextareaKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.hide(false);\n this.view.focus();\n return;\n }\n\n if (\n (event.key === 'Backspace' || event.key === 'Delete') &&\n !this.textareaHadUserInput &&\n this.isEntireInputSelected()\n ) {\n event.preventDefault();\n event.stopPropagation();\n this.deleteActiveTarget();\n }\n };\n this.textarea.addEventListener('keydown', this.boundHandleTextareaKeyDown);\n document.addEventListener('mousedown', this.boundHandleDocumentMouseDown);\n this.view.dom.addEventListener(CUSTOM_EVENTS.WIDGET_EDIT_REQUEST, this.boundHandleWidgetEditRequest as EventListener);\n document.body.appendChild(this.dom);\n }\n\n update(update: ViewUpdate): void {\n if (!this.activeTarget) {\n return;\n }\n\n const { from, to } = update.state.selection.main;\n const nextTarget = resolveWidgetEditTarget(update.state, from, to);\n if (!nextTarget) {\n this.hide(false);\n return;\n }\n\n if (isSameTarget(this.activeTarget, nextTarget)) {\n this.updatePosition(nextTarget, this.anchorElement);\n return;\n }\n\n this.activeTarget = nextTarget;\n this.applyTargetMeta(nextTarget);\n this.show(nextTarget);\n }\n\n destroy(): void {\n document.removeEventListener('mousedown', this.boundHandleDocumentMouseDown);\n this.view.dom.removeEventListener(CUSTOM_EVENTS.WIDGET_EDIT_REQUEST, this.boundHandleWidgetEditRequest as EventListener);\n this.textarea.removeEventListener('keydown', this.boundHandleTextareaKeyDown);\n this.destroyPopper();\n this.dom.remove();\n }\n\n private show(target: WidgetEditTarget): void {\n this.dom.style.display = 'flex';\n this.updatePosition(target, this.anchorElement);\n this.textarea.focus({ preventScroll: true });\n this.textarea.select();\n requestAnimationFrame(() => {\n this.textarea.focus({ preventScroll: true });\n this.textarea.select();\n });\n }\n\n private updatePosition(target: WidgetEditTarget, anchorElement: Element | null): void {\n this.destroyPopper();\n if (anchorElement instanceof HTMLElement && anchorElement.isConnected) {\n this.popper = createPopper(anchorElement, this.dom, {\n placement: POPPER_CONFIG.PLACEMENT,\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: [0, 10],\n },\n },\n ],\n });\n this.popper.update();\n return;\n }\n\n const virtualElement = createSelectionVirtualElement(this.view, target.from, target.to);\n if (!virtualElement) {\n this.hide(false);\n return;\n }\n\n this.popper = createPopper(virtualElement, this.dom, {\n placement: POPPER_CONFIG.PLACEMENT,\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: [0, 10],\n },\n },\n ],\n });\n this.popper.update();\n }\n\n private hide(clearSelection: boolean): void {\n if (clearSelection) {\n const currentPos = this.view.state.selection.main.head;\n this.view.dispatch({\n selection: EditorSelection.cursor(currentPos),\n });\n this.view.focus();\n }\n\n this.activeTarget = null;\n this.anchorElement = null;\n this.dom.style.display = 'none';\n this.destroyPopper();\n }\n\n private destroyPopper(): void {\n if (this.popper) {\n this.popper.destroy();\n this.popper = null;\n }\n }\n\n private applyChanges(): void {\n if (!this.activeTarget || this.isReadOnly()) {\n return;\n }\n\n const rawValue = this.textarea.value;\n const nextValue = this.activeTarget.kind === 'image' ? rawValue.trim() : rawValue;\n if (nextValue.length === 0) {\n return;\n }\n\n const updatedMarkdown = this.activeTarget.buildUpdatedMarkdown(nextValue);\n const { from, to } = this.activeTarget;\n this.view.dispatch({\n changes: {\n from,\n to,\n insert: updatedMarkdown,\n },\n selection: EditorSelection.cursor(from + updatedMarkdown.length),\n scrollIntoView: true,\n });\n\n this.hide(false);\n this.view.focus();\n }\n\n private applyTargetMeta(target: WidgetEditTarget): void {\n this.title.textContent = target.title;\n this.textarea.value = target.value;\n this.textareaHadUserInput = false;\n this.textarea.placeholder = target.placeholder;\n this.textarea.rows = target.multiline ? 8 : 1;\n\n if (target.multiline) {\n this.dom.classList.add(CSS_CLASSES.WIDGET_EDIT_BUBBLE_MULTILINE);\n } else {\n this.dom.classList.remove(CSS_CLASSES.WIDGET_EDIT_BUBBLE_MULTILINE);\n }\n\n this.applyButton.textContent = target.applyLabel;\n }\n\n private deleteActiveTarget(): void {\n if (!this.activeTarget || this.isReadOnly()) {\n return;\n }\n\n const { from, to } = this.activeTarget;\n this.view.dispatch({\n changes: { from, to, insert: '' },\n selection: EditorSelection.cursor(from),\n scrollIntoView: true,\n });\n this.hide(false);\n this.view.focus();\n }\n\n private isEntireInputSelected(): boolean {\n return (\n this.textarea.selectionStart === 0 &&\n this.textarea.selectionEnd === this.textarea.value.length\n );\n }\n\n private isReadOnly(): boolean {\n return this.view.state.facet(EditorState.readOnly);\n }\n}\n\nexport const widgetEditBubblePlugin = ViewPlugin.fromClass(WidgetEditBubble);\n", "import type { EditorState } from '@codemirror/state';\nimport { parseMarkdownImage } from '../../core/utils/string-utils';\n\nconst latexLanguages = new Set(['latex', 'katex', 'tex', 'math']);\n\nexport type WidgetEditTargetKind = 'image' | 'mermaid' | 'latex';\n\nexport interface WidgetEditTarget {\n kind: WidgetEditTargetKind;\n from: number;\n to: number;\n originalMarkdown: string;\n value: string;\n title: string;\n placeholder: string;\n multiline: boolean;\n applyLabel: string;\n buildUpdatedMarkdown: (nextValue: string) => string;\n}\n\ninterface ParsedFencedCodeBlock {\n openingLine: string;\n closingLine: string;\n language: string;\n body: string;\n}\n\nfunction parseFencedCodeBlock(markdown: string): ParsedFencedCodeBlock | null {\n const normalized = markdown.replace(/\\r\\n/g, '\\n');\n const lines = normalized.split('\\n');\n if (lines.length < 2) {\n return null;\n }\n\n const openingLine = lines[0];\n const closingLine = lines[lines.length - 1];\n if (!openingLine.startsWith('```') || !closingLine.startsWith('```')) {\n return null;\n }\n\n const infoString = openingLine.slice(3).trim();\n const language = infoString.split(/\\s+/)[0]?.toLowerCase() ?? '';\n const body = lines.slice(1, -1).join('\\n');\n\n return {\n openingLine,\n closingLine,\n language,\n body,\n };\n}\n\nfunction buildFencedCodeBlock(openingLine: string, closingLine: string, nextValue: string): string {\n const normalizedBody = nextValue.replace(/\\r\\n/g, '\\n').replace(/\\n$/, '');\n if (normalizedBody.length === 0) {\n return `${openingLine}\\n${closingLine}`;\n }\n return `${openingLine}\\n${normalizedBody}\\n${closingLine}`;\n}\n\nfunction resolveImageTarget(markdown: string, from: number, to: number): WidgetEditTarget | null {\n const image = parseMarkdownImage(markdown);\n if (!image) {\n return null;\n }\n\n return {\n kind: 'image',\n from,\n to,\n originalMarkdown: markdown,\n value: image.src,\n title: 'Edit Image URL',\n placeholder: 'https://example.com/image.png',\n multiline: false,\n applyLabel: 'Apply',\n buildUpdatedMarkdown: (nextValue: string) => `![${image.alt}](${nextValue.trim()})`,\n };\n}\n\nfunction resolveFencedCodeTarget(markdown: string, from: number, to: number): WidgetEditTarget | null {\n const block = parseFencedCodeBlock(markdown);\n if (!block) {\n return null;\n }\n\n if (block.language === 'mermaid') {\n return {\n kind: 'mermaid',\n from,\n to,\n originalMarkdown: markdown,\n value: block.body,\n title: 'Edit Mermaid Source',\n placeholder: 'flowchart TD\\n A --> B',\n multiline: true,\n applyLabel: 'Apply',\n buildUpdatedMarkdown: (nextValue: string) =>\n buildFencedCodeBlock(block.openingLine, block.closingLine, nextValue),\n };\n }\n\n if (latexLanguages.has(block.language)) {\n return {\n kind: 'latex',\n from,\n to,\n originalMarkdown: markdown,\n value: block.body,\n title: 'Edit LaTeX Source',\n placeholder: '\\\\frac{a}{b}',\n multiline: true,\n applyLabel: 'Apply',\n buildUpdatedMarkdown: (nextValue: string) =>\n buildFencedCodeBlock(block.openingLine, block.closingLine, nextValue),\n };\n }\n\n return null;\n}\n\nexport function resolveWidgetEditTarget(\n state: EditorState,\n from: number,\n to: number\n): WidgetEditTarget | null {\n if (from === to) {\n return null;\n }\n\n const markdown = state.sliceDoc(from, to);\n return resolveImageTarget(markdown, from, to) ?? resolveFencedCodeTarget(markdown, from, to);\n}\n\nexport function isWidgetEditableSelection(\n state: EditorState,\n from: number,\n to: number\n): boolean {\n return resolveWidgetEditTarget(state, from, to) !== null;\n}\n", "import { widgetEditBubblePlugin } from './widget-edit-bubble';\n\nexport function widgetEditBubble() {\n return widgetEditBubblePlugin;\n}\n\nexport {\n resolveWidgetEditTarget,\n isWidgetEditableSelection,\n type WidgetEditTarget,\n type WidgetEditTargetKind,\n} from './selection-target';\n", "/**\n * Cross-Boundary Delete Extension\n *\n * Fixes Bug 1 (P1): When a user selects across a widget boundary (e.g., from\n * inside a Table to outside it), pressing Backspace/Delete should delete the\n * entire selection consistently, including full widget nodes that are partially\n * covered by the selection.\n *\n * Two-layer strategy:\n * 1. Check CM's state selection and expand across widget boundaries.\n * 2. If CM's selection is empty/doesn't help, fall back to the native DOM\n * selection (window.getSelection) and use view.posAtDOM() to convert\n * browser-level selection endpoints to document positions. This handles\n * the case where a table widget's `ignoreEvent: true` prevents CM from\n * capturing the cross-boundary selection.\n */\n\nimport { EditorView, keymap } from '@codemirror/view';\nimport { EditorSelection } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\n/** Syntax node names that are rendered as replacement widgets. */\nconst WIDGET_NODE_NAMES = new Set(['Table', 'FencedCode']);\n\n/**\n * Expands a [from, to] range so that any widget node (Table, FencedCode)\n * that overlaps with the range is fully included.\n * Returns the expanded range, or null if nothing changed.\n */\nfunction expandAcrossWidgets(\n view: EditorView,\n selFrom: number,\n selTo: number\n): { from: number; to: number } | null {\n if (selFrom === selTo) return null;\n\n let expandedFrom = selFrom;\n let expandedTo = selTo;\n let didExpand = false;\n\n syntaxTree(view.state).iterate({\n from: selFrom,\n to: selTo,\n enter: (node) => {\n if (!WIDGET_NODE_NAMES.has(node.name)) return;\n\n const overlapsStart = selFrom > node.from && selFrom < node.to;\n const overlapsEnd = selTo > node.from && selTo < node.to;\n const fullyContained = selFrom <= node.from && selTo >= node.to;\n\n if (overlapsStart || overlapsEnd || fullyContained) {\n expandedFrom = Math.min(expandedFrom, node.from);\n expandedTo = Math.max(expandedTo, node.to);\n didExpand = true;\n }\n },\n });\n\n return didExpand ? { from: expandedFrom, to: expandedTo } : null;\n}\n\n/**\n * Resolves the effective deletion range from the native DOM selection.\n *\n * When a table widget uses `ignoreEvent: true`, CM's state selection doesn't\n * capture the full cross-boundary extent. The browser's native Selection API\n * does reflect the visual selection, so we convert its endpoints to CM\n * document positions via `view.posAtDOM()`.\n */\nfunction resolveNativeDeletionRange(\n view: EditorView\n): { from: number; to: number } | null {\n const nativeSel = window.getSelection();\n if (!nativeSel || nativeSel.isCollapsed || nativeSel.rangeCount === 0) {\n return null;\n }\n\n const range = nativeSel.getRangeAt(0);\n\n let startPos: number;\n let endPos: number;\n try {\n startPos = view.posAtDOM(range.startContainer, range.startOffset);\n endPos = view.posAtDOM(range.endContainer, range.endOffset);\n } catch {\n // posAtDOM throws if the node is not part of the editor DOM tree\n return null;\n }\n\n if (startPos === endPos) return null;\n\n const from = Math.min(startPos, endPos);\n const to = Math.max(startPos, endPos);\n\n // Clamp to document bounds\n const docLen = view.state.doc.length;\n return {\n from: Math.max(0, Math.min(from, docLen)),\n to: Math.max(0, Math.min(to, docLen)),\n };\n}\n\n/**\n * Handles cross-boundary deletion:\n * 1. Try CM state selection first.\n * 2. Fall back to native DOM selection if CM doesn't detect cross-boundary.\n * 3. Expand across any overlapping widget nodes.\n * 4. Dispatch a single clean deletion.\n */\nfunction handleCrossBoundaryDelete(view: EditorView): boolean {\n const { from: cmFrom, to: cmTo } = view.state.selection.main;\n\n // --- Layer 1: CM state selection ---\n if (cmFrom !== cmTo) {\n const expanded = expandAcrossWidgets(view, cmFrom, cmTo);\n if (expanded) {\n view.dispatch({\n changes: { from: expanded.from, to: expanded.to, insert: '' },\n selection: EditorSelection.cursor(expanded.from),\n });\n return true;\n }\n }\n\n // --- Layer 2: Native DOM selection (handles table ignoreEvent: true) ---\n const nativeRange = resolveNativeDeletionRange(view);\n if (!nativeRange || nativeRange.from === nativeRange.to) {\n return false;\n }\n\n // Merge CM selection with native selection for maximum coverage\n const mergedFrom = cmFrom !== cmTo\n ? Math.min(cmFrom, nativeRange.from)\n : nativeRange.from;\n const mergedTo = cmFrom !== cmTo\n ? Math.max(cmTo, nativeRange.to)\n : nativeRange.to;\n\n if (mergedFrom === mergedTo) return false;\n\n // Expand across any widget nodes in the merged range\n const expanded = expandAcrossWidgets(view, mergedFrom, mergedTo);\n const finalFrom = expanded ? expanded.from : mergedFrom;\n const finalTo = expanded ? expanded.to : mergedTo;\n\n if (finalFrom === finalTo) return false;\n\n // Clear the native selection first to prevent browser's default action\n // from also modifying contentEditable cells\n window.getSelection()?.removeAllRanges();\n\n view.dispatch({\n changes: { from: finalFrom, to: finalTo, insert: '' },\n selection: EditorSelection.cursor(finalFrom),\n });\n\n return true;\n}\n\n/**\n * Keymap extension: intercepts Backspace/Delete for cross-boundary handling.\n */\nexport const crossBoundaryDeleteKeymap = keymap.of([\n {\n key: 'Backspace',\n run: handleCrossBoundaryDelete,\n },\n {\n key: 'Delete',\n run: handleCrossBoundaryDelete,\n },\n]);\n", "import { syntaxHighlighting } from '@codemirror/language';\nimport { EditorView } from '@codemirror/view';\nimport { createHighlightStyle } from './theme-highlight-style';\nimport { buildEditorStyles } from './theme-editor-styles';\nimport {\n darkThemeColors,\n lightThemeColors,\n type ThemeColors,\n} from './theme-palette';\n\n// --- Base Theme Structure ---\nconst createEditorTheme = (colors: ThemeColors, isDark: boolean) => {\n const animationName = isDark ? 'colorChangeDark' : 'colorChangeLight';\n const visibleMarkdownColor = isDark\n ? 'hsl(var(--color-primary-light-hsl) / 0.6)'\n : 'hsl(var(--color-primary-hsl) / 0.5)';\n\n return EditorView.theme(\n buildEditorStyles({\n colors,\n isDark,\n animationName,\n visibleMarkdownColor,\n }),\n { dark: isDark }\n );\n}\n\n// --- Export Light Theme ---\nexport const editorLightTheme = createEditorTheme(lightThemeColors, false);\nexport const lightHighlightStyle = createHighlightStyle(lightThemeColors);\nexport const lightTheme = [\n editorLightTheme,\n syntaxHighlighting(lightHighlightStyle)\n];\n\n// --- Export Dark Theme ---\nexport const editorDarkTheme = createEditorTheme(darkThemeColors, true);\nexport const darkHighlightStyle = createHighlightStyle(darkThemeColors);\nexport const darkTheme = [\n editorDarkTheme,\n syntaxHighlighting(darkHighlightStyle)\n];\n", "import { HighlightStyle } from '@codemirror/language';\nimport { tags } from '@lezer/highlight';\nimport { codeFont, type ThemeColors } from './theme-palette';\n\nexport function createHighlightStyle(colors: ThemeColors): HighlightStyle {\n return HighlightStyle.define([\n { tag: tags.heading1, fontWeight: '700', fontSize: '2em', color: colors.primaryText },\n { tag: tags.heading2, fontWeight: '650', fontSize: '1.55em', color: colors.primaryText },\n { tag: tags.heading3, fontWeight: '600', fontSize: '1.25em', color: colors.primaryText },\n { tag: tags.link, color: colors.lightBlue },\n { tag: tags.emphasis, fontStyle: 'italic' },\n { tag: tags.strong, fontWeight: 'bold' },\n { tag: tags.keyword, color: colors.codeKeyword, fontFamily: codeFont },\n { tag: tags.atom, color: colors.codeNumber, fontFamily: codeFont },\n { tag: tags.bool, color: colors.codeNumber, fontFamily: codeFont },\n { tag: tags.url, color: colors.codeString, fontFamily: codeFont },\n { tag: tags.labelName, color: colors.codeTag, fontFamily: codeFont },\n { tag: tags.inserted, color: colors.codeString, fontFamily: codeFont },\n { tag: tags.deleted, color: colors.codeTag, fontFamily: codeFont },\n { tag: tags.literal, color: colors.codeNumber, fontFamily: codeFont },\n { tag: tags.string, color: colors.codeString, fontFamily: codeFont },\n { tag: tags.number, color: colors.codeNumber, fontFamily: codeFont },\n { tag: [tags.regexp, tags.escape, tags.special(tags.string)], color: colors.codeNumber, fontFamily: codeFont },\n { tag: tags.definition(tags.propertyName), color: colors.codeAttribute, fontFamily: codeFont },\n { tag: tags.function(tags.variableName), color: colors.codeFunction, fontFamily: codeFont },\n { tag: tags.typeName, color: colors.codeType, fontFamily: codeFont },\n { tag: tags.className, color: colors.codeType, fontFamily: codeFont },\n { tag: tags.comment, color: colors.codeComment, fontStyle: 'italic', fontFamily: codeFont },\n { tag: tags.invalid, color: colors.codeTag, fontFamily: codeFont },\n { tag: tags.variableName, color: colors.codeVariable, fontFamily: codeFont },\n { tag: tags.operator, color: colors.codeOperator, fontFamily: codeFont },\n { tag: tags.punctuation, color: colors.codeOperator, fontFamily: codeFont },\n { tag: tags.bracket, color: colors.codeOperator, fontFamily: codeFont },\n { tag: tags.tagName, color: colors.codeTag, fontFamily: codeFont },\n { tag: tags.attributeName, color: colors.codeAttribute, fontFamily: codeFont },\n { tag: tags.attributeValue, color: colors.codeString, fontFamily: codeFont },\n\n { tag: tags.meta, class: 'cm-meta' },\n { tag: tags.processingInstruction, class: 'cm-meta' },\n ]);\n}\n", "export interface ThemeColors {\n rose: string;\n lightBlue: string;\n purple: string;\n green: string;\n orange: string;\n red: string;\n yellow: string;\n primaryText: string;\n secondaryText: string;\n background: string;\n lineHighlight: string;\n selection: string;\n pink: string;\n teal: string;\n indigo: string;\n marker: string;\n codeBackground: string;\n codeText: string;\n codeSecondaryText: string;\n codeKeyword: string;\n codeString: string;\n codeNumber: string;\n codeComment: string;\n codeFunction: string;\n codeVariable: string;\n codeOperator: string;\n codeTag: string;\n codeAttribute: string;\n codeType: string;\n inlineCodeBg: string;\n inlineCodeColor: string;\n inlineCodeBorder: string;\n highlightBg: string;\n highlightColor: string;\n slashCommandBg: string;\n slashCommandBorder: string;\n slashCommandHoverBg: string;\n slashCommandSelectedBg: string;\n slashCommandText: string;\n slashCommandIcon: string;\n}\n\nexport const lightThemeColors: ThemeColors = {\n rose: '#ff2d55',\n lightBlue: 'hsl(var(--color-primary-hsl))',\n purple: '#af52de',\n green: '#34c759',\n orange: '#ff9500',\n red: '#ff3b30',\n yellow: '#ffcc00',\n primaryText: '#1d1d1f',\n secondaryText: '#6e6e73',\n background: '#ffffff',\n lineHighlight: '#f5f5f7',\n selection: 'hsl(var(--color-primary-hsl) / 0.22)',\n pink: '#ff375f',\n teal: '#30b0c7',\n indigo: '#5856d6',\n marker: '#8e8e93',\n codeBackground: '#f5f5f7',\n codeText: '#1d1d1f',\n codeSecondaryText: '#6e6e73',\n\n // Code syntax highlighting colors\n codeKeyword: '#0057d9',\n codeString: '#248a3d',\n codeNumber: '#c2410c',\n codeComment: '#8e8e93',\n codeFunction: '#9b59b6',\n codeVariable: '#1d1d1f',\n codeOperator: '#424245',\n codeTag: '#d70015',\n codeAttribute: '#0f7f94',\n codeType: '#9a6700',\n\n // --- Styles aligned with table formatting ---\n inlineCodeBg: '#f2f2f7',\n inlineCodeColor: '#d70015',\n inlineCodeBorder: '#d1d1d6',\n highlightBg: '#fff2b2',\n highlightColor: '#5f4b00',\n\n slashCommandBg: 'rgba(255, 255, 255, 0.92)',\n slashCommandBorder: 'rgba(0, 0, 0, 0.12)',\n slashCommandHoverBg: '#f5f5f7',\n slashCommandSelectedBg: 'hsl(var(--color-primary-hsl) / 0.12)',\n slashCommandText: '#1d1d1f',\n slashCommandIcon: '#6e6e73',\n};\n\nexport const darkThemeColors: ThemeColors = {\n rose: '#ff6482',\n lightBlue: 'hsl(var(--color-primary-light-hsl))',\n purple: '#bf5af2',\n green: '#30d158',\n orange: '#ff9f0a',\n red: '#ff453a',\n yellow: '#ffd60a',\n primaryText: '#f5f5f7',\n secondaryText: '#a1a1a6',\n background: '#1c1c1e',\n lineHighlight: '#2c2c2e',\n selection: 'hsl(var(--color-primary-light-hsl) / 0.24)',\n pink: '#ff375f',\n teal: '#40c8e0',\n indigo: '#5e5ce6',\n marker: '#8e8e93',\n codeBackground: '#2c2c2e',\n codeText: '#f5f5f7',\n codeSecondaryText: '#a1a1a6',\n\n // Code syntax highlighting colors (Dark theme)\n codeKeyword: '#64d2ff',\n codeString: '#63e6a1',\n codeNumber: '#ffb340',\n codeComment: '#8e8e93',\n codeFunction: '#d9a6ff',\n codeVariable: '#f5f5f7',\n codeOperator: '#d1d1d6',\n codeTag: '#ff6961',\n codeAttribute: '#5ac8fa',\n codeType: '#ffd60a',\n\n // --- Styles aligned with table formatting ---\n inlineCodeBg: '#2c2c2e',\n inlineCodeColor: '#ff6482',\n inlineCodeBorder: '#3a3a3c',\n highlightBg: '#5f4b00',\n highlightColor: '#fff2b2',\n\n slashCommandBg: 'rgba(28, 28, 30, 0.92)',\n slashCommandBorder: 'rgba(255, 255, 255, 0.16)',\n slashCommandHoverBg: '#2c2c2e',\n slashCommandSelectedBg: 'hsl(var(--color-primary-light-hsl) / 0.18)',\n slashCommandText: '#f5f5f7',\n slashCommandIcon: '#a1a1a6',\n};\n\nexport const codeFont = \"'SF Mono', ui-monospace, Menlo, Monaco, Consolas, monospace\";\n", "import { codeFont, type ThemeColors } from './theme-palette';\nimport { EditorView } from '@codemirror/view';\n\ninterface BuildEditorStylesOptions {\n colors: ThemeColors;\n isDark: boolean;\n animationName: string;\n visibleMarkdownColor: string;\n}\n\ntype EditorThemeSpec = Parameters<typeof EditorView.theme>[0];\n\nfunction accentAlpha(isDark: boolean, alpha: number): string {\n return `hsl(var(${isDark ? '--color-primary-light-hsl' : '--color-primary-hsl'}) / ${alpha})`;\n}\n\nfunction buildBlockquoteLevelStyles(): EditorThemeSpec {\n const styles: Record<string, unknown> = {};\n const MAX_UNIQUE_COLORS = 3;\n for (let i = 1; i <= 10; i++) {\n const gradients = [];\n const positions = [];\n for (let j = 1; j <= i; j++) {\n const colorVar = j <= MAX_UNIQUE_COLORS ? `var(--bq-color-${j})` : 'var(--bq-color-deep)';\n gradients.push(`linear-gradient(${colorVar}, ${colorVar})`);\n\n const position = j === 1\n ? 'var(--bq-padding-base) 0'\n : `calc(var(--bq-padding-base) + (${j - 1}) * (var(--bq-bar-width) + var(--bq-bar-gap))) 0`;\n positions.push(position);\n }\n styles[`.cm-blockquote-line[data-bq-level='${i}']`] = {\n '--data-bq-level': i,\n backgroundImage: gradients.join(', '),\n backgroundSize: Array(i).fill('var(--bq-bar-width) 100%').join(', '),\n backgroundPosition: positions.join(', '),\n };\n }\n return styles as EditorThemeSpec;\n}\n\nexport function buildEditorStyles(options: BuildEditorStylesOptions): EditorThemeSpec {\n const { colors, isDark, animationName, visibleMarkdownColor } = options;\n\n return {\n '&': {\n color: colors.primaryText,\n backgroundColor: colors.background,\n height: '100%',\n '--bq-bar-width': '3px',\n '--bq-bar-gap': '12px',\n '--bq-padding-base': '16px',\n '--bq-text-gap': '16px',\n '--bq-border-radius': '6px',\n '--bq-color-1': accentAlpha(isDark, 0.55),\n '--bq-color-2': accentAlpha(isDark, 0.7),\n '--bq-color-3': accentAlpha(isDark, 0.85),\n '--bq-color-deep': isDark ? 'hsl(var(--color-primary-hsl))' : 'hsl(var(--color-primary-dark-hsl))',\n '-webkit-font-smoothing': 'antialiased',\n '-moz-osx-font-smoothing': 'grayscale',\n },\n '.cm-scroller': {\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', system-ui, sans-serif\",\n fontSize: '15.5px',\n lineHeight: '1.7',\n overflow: 'auto !important',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-content': {\n minHeight: '100%',\n padding: '40px 28px 64px',\n maxWidth: '780px',\n margin: '0 auto',\n },\n '.cm-content.cm-focused': {\n outline: 'none',\n },\n '.cm-line': {\n padding: '0 4px',\n },\n '.cm-cursor': {\n borderLeftColor: colors.lightBlue,\n borderLeftWidth: '2px',\n },\n '.cm-selectionBackground': {\n backgroundColor: colors.selection,\n },\n '.cm-gutters': {\n backgroundColor: colors.background,\n color: colors.secondaryText,\n border: 'none',\n borderRight: `0.5px solid ${isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.08)'}`,\n },\n '.cm-gutterElement': {\n padding: '0 8px 0 16px',\n fontSize: '12px',\n fontFamily: codeFont,\n },\n '.cm-foldGutter': {\n color: colors.secondaryText,\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: colors.primaryText,\n },\n '.cm-activeLine': {\n backgroundColor: isDark ? 'rgba(255,255,255,0.025)' : 'rgba(0,0,0,0.018)',\n borderRadius: '4px',\n },\n '.cm-searchMatch': {\n backgroundColor: colors.yellow,\n outline: `1px solid ${colors.orange}`,\n },\n '.cm-selectionMatch': {\n backgroundColor: colors.selection,\n },\n '.cm-matchingBracket, .cm-nonmatchingBracket': {\n backgroundColor: accentAlpha(isDark, 0.16),\n outline: `1px solid ${colors.lightBlue}`,\n },\n\n // Syntax hiding\n '.cm-hidden-markdown': { display: 'none' },\n '.cm-visible-markdown, .cm-meta': {\n color: visibleMarkdownColor,\n opacity: '1',\n },\n\n '.cm-link-definition-widget': {\n color: colors.secondaryText,\n fontFamily: codeFont,\n fontSize: '0.9em',\n padding: '2px 7px',\n borderRadius: '6px',\n background: colors.inlineCodeBg,\n border: `1px solid ${colors.inlineCodeBorder}`,\n cursor: 'pointer',\n transition: 'background-color 0.16s ease, color 0.16s ease, border-color 0.16s ease',\n '&:hover': {\n background: accentAlpha(isDark, 0.12),\n color: colors.lightBlue,\n },\n },\n\n // Footnote styles\n '.cm-footnote-widget': {\n color: colors.lightBlue,\n fontSize: '0.8em',\n fontWeight: '500',\n cursor: 'pointer',\n padding: '1px 2px',\n borderRadius: '2px',\n transition: 'all 0.2s ease',\n '&:hover': {\n background: accentAlpha(isDark, 0.12),\n },\n },\n\n '.cm-footnote-definition-widget': {\n color: colors.secondaryText,\n fontFamily: codeFont,\n fontSize: '0.9em',\n padding: '2px 7px',\n borderRadius: '6px',\n background: colors.inlineCodeBg,\n border: `1px solid ${colors.inlineCodeBorder}`,\n cursor: 'pointer',\n transition: 'background-color 0.16s ease, color 0.16s ease, border-color 0.16s ease',\n '&:hover': {\n background: accentAlpha(isDark, 0.12),\n color: colors.lightBlue,\n },\n },\n\n '.cm-footnote-definition-line': {\n paddingLeft: '8px',\n },\n\n '.cm-footnote-definition-content': {\n color: colors.primaryText,\n },\n\n '.cm-reference-highlight': {\n animation: `${isDark ? 'referenceHighlightDark' : 'referenceHighlightLight'} 2s cubic-bezier(0.4, 0, 0.2, 1) forwards`,\n borderRadius: '6px',\n padding: '2px 0',\n },\n\n '@keyframes referenceHighlightLight': {\n '0%': {\n backgroundColor: `${colors.yellow}80`,\n boxShadow: `0 0 0 3px ${colors.yellow}50`,\n transform: 'scale(1.02)',\n },\n '50%': {\n backgroundColor: `${colors.yellow}60`,\n boxShadow: `0 0 0 2px ${colors.yellow}30`,\n },\n '100%': {\n backgroundColor: 'transparent',\n boxShadow: '0 0 0 0 transparent',\n transform: 'scale(1)',\n },\n },\n\n '@keyframes referenceHighlightDark': {\n '0%': {\n backgroundColor: `${colors.yellow}60`,\n boxShadow: `0 0 0 3px ${colors.yellow}40`,\n transform: 'scale(1.02)',\n },\n '50%': {\n backgroundColor: `${colors.yellow}40`,\n boxShadow: `0 0 0 2px ${colors.yellow}20`,\n },\n '100%': {\n backgroundColor: 'transparent',\n boxShadow: '0 0 0 0 transparent',\n transform: 'scale(1)',\n },\n },\n\n // Horizontal Rule Styling\n '.cm-hr-line': {\n position: 'relative',\n margin: '1.5em 0',\n height: '2px',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '8px',\n right: '8px',\n top: '50%',\n transform: 'translateY(-50%)',\n height: '1px',\n backgroundColor: colors.secondaryText,\n opacity: 0.22,\n borderRadius: '1px',\n },\n },\n '.cm-hr-line-selected .cm-visible-markdown': { color: colors.secondaryText },\n\n '.cm-blockquote-line': {\n backgroundRepeat: 'no-repeat',\n position: 'relative',\n },\n\n '.cm-blockquote-first-line::before, .cm-blockquote-last-line::after': {\n content: 'none',\n display: 'none',\n },\n\n '.cm-blockquote-line[data-bq-level]': {\n paddingLeft: 'calc(var(--bq-padding-base) + (var(--data-bq-level, 1) - 1) * (var(--bq-bar-width) + var(--bq-bar-gap)) + var(--bq-bar-width) + var(--bq-text-gap))',\n },\n ...buildBlockquoteLevelStyles(),\n\n // Code block styling\n '.cm-fenced-code': {\n backgroundColor: 'transparent',\n position: 'relative',\n color: colors.codeText,\n fontFamily: codeFont,\n padding: '4px 16px',\n fontSize: '13px',\n lineHeight: '1.7',\n },\n '.cm-fenced-code::before': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n backgroundColor: colors.codeBackground,\n borderRadius: '8px',\n zIndex: -1,\n },\n '.cm-fenced-code:has(.cm-mermaid-widget)::before, .cm-fenced-code:has(.cm-latex-widget)::before': {\n content: 'none',\n display: 'none',\n },\n\n '.cm-blockquote-line[data-bq-level].cm-fenced-code::before': {\n left: 'calc(var(--bq-padding-base) + (var(--data-bq-level, 1) - 1) * (var(--bq-bar-width) + var(--bq-bar-gap)) + var(--bq-bar-width) + var(--bq-text-gap))',\n right: '8px',\n top: 0,\n bottom: 0,\n },\n\n // List styling\n '.cm-bullet-list': { color: visibleMarkdownColor, fontWeight: 'bold' },\n '.cm-ordered-list-marker, .cm-ordered-list-marker > span': {\n color: `${colors.lightBlue} !important`,\n fontFamily: 'inherit !important',\n },\n\n // Widget styles\n '.cm-inline-code-widget': {\n fontFamily: codeFont,\n background: colors.inlineCodeBg,\n color: colors.inlineCodeColor,\n padding: '2px 6px',\n borderRadius: '6px',\n border: `0.5px solid ${colors.inlineCodeBorder}`,\n fontSize: '0.92em',\n },\n '.cm-link-widget': {\n textDecoration: 'none',\n color: colors.lightBlue,\n borderBottom: `1px solid ${accentAlpha(isDark, 0.4)}`,\n cursor: 'pointer',\n transition: 'border-color 160ms ease, color 160ms ease',\n },\n '.cm-link-widget:hover': {\n borderBottomColor: colors.lightBlue,\n },\n '.cm-image-widget': {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n margin: '1.6em 0',\n position: 'relative',\n transition: 'opacity 0.2s ease, transform 0.2s ease',\n },\n '.cm-image-widget img': {\n width: 'auto',\n height: 'auto',\n maxWidth: 'min(100%, 720px)',\n objectFit: 'contain',\n borderRadius: '12px',\n border: `0.5px solid ${isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.08)'}`,\n boxShadow: isDark ? '0 20px 42px rgba(0, 0, 0, 0.42)' : '0 20px 42px rgba(0, 0, 0, 0.10)',\n margin: '0.5em',\n transition: 'box-shadow 0.2s ease, border-color 0.2s ease',\n },\n '.cm-image-widget .cm-image-alt': {\n marginTop: '0.85em',\n color: colors.secondaryText,\n fontSize: '0.78em',\n fontWeight: '500',\n letterSpacing: '0.005em',\n },\n '.cm-image-widget.selected': {\n outline: `3px solid ${accentAlpha(isDark, 0.26)}`,\n outlineOffset: '3px',\n borderRadius: '14px',\n },\n '.cm-image-placeholder': {\n background: colors.lineHighlight,\n border: `1px dashed ${colors.secondaryText}`,\n borderRadius: '12px',\n color: colors.secondaryText,\n },\n '.cm-image-error': {\n padding: '0.75em',\n color: colors.red,\n fontSize: '0.9em',\n background: `${colors.red}20`,\n border: `0.5px solid ${colors.red}33`,\n borderRadius: '8px',\n marginTop: '0.5em',\n },\n '.cm-mermaid-widget': {\n margin: '1.5em 0',\n border: `0.5px solid ${isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.08)'}`,\n borderRadius: '12px',\n background: isDark ? '#1f1f21' : '#fbfbfd',\n boxShadow: isDark ? '0 18px 36px rgba(0, 0, 0, 0.28)' : '0 18px 36px rgba(0, 0, 0, 0.06)',\n overflow: 'hidden',\n cursor: 'pointer',\n },\n '.cm-mermaid-canvas': {\n padding: '16px',\n minHeight: '72px',\n },\n '.cm-mermaid-canvas > svg': {\n display: 'block',\n maxWidth: '100%',\n height: 'auto',\n margin: '0 auto',\n },\n '.cm-mermaid-hint': {\n color: colors.secondaryText,\n borderTop: `1px solid ${isDark ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.07)'}`,\n fontSize: '11px',\n fontWeight: '600',\n padding: '7px 12px',\n background: colors.background,\n },\n '.cm-mermaid-loading': {\n color: colors.secondaryText,\n fontFamily: codeFont,\n fontSize: '12px',\n padding: '8px 0',\n },\n '.cm-mermaid-error': {\n color: colors.red,\n fontFamily: codeFont,\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n background: `${colors.red}14`,\n border: `1px solid ${colors.red}33`,\n borderRadius: '8px',\n padding: '8px 10px',\n },\n '.cm-latex-widget': {\n margin: '1.35em 0',\n border: `1px solid ${isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.09)'}`,\n borderRadius: '10px',\n background: isDark ? '#1f1f21' : '#fbfbfd',\n boxShadow: isDark ? '0 14px 30px rgba(0, 0, 0, 0.24)' : '0 14px 30px rgba(0, 0, 0, 0.06)',\n overflow: 'visible',\n cursor: 'pointer',\n },\n '.cm-latex-canvas': {\n padding: '16px',\n minHeight: '56px',\n display: 'flex',\n flexDirection: 'column',\n gap: '10px',\n overflow: 'visible',\n },\n '.cm-latex-line': {\n maxWidth: '100%',\n overflow: 'visible',\n whiteSpace: 'normal',\n overflowWrap: 'anywhere',\n },\n '.cm-latex-line math': {\n display: 'block',\n maxWidth: '100%',\n overflow: 'visible',\n },\n '.cm-latex-hint': {\n color: colors.secondaryText,\n borderTop: `1px solid ${isDark ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.07)'}`,\n fontSize: '11px',\n fontWeight: '600',\n padding: '7px 12px',\n background: colors.background,\n },\n '.cm-latex-loading': {\n color: colors.secondaryText,\n fontFamily: codeFont,\n fontSize: '12px',\n padding: '8px 0',\n },\n '.cm-latex-error': {\n color: colors.red,\n fontFamily: codeFont,\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n background: `${colors.red}14`,\n border: `1px solid ${colors.red}33`,\n borderRadius: '8px',\n padding: '8px 10px',\n },\n '.cm-strikethrough-widget': {\n textDecoration: 'line-through',\n opacity: '0.6',\n },\n '.cm-highlight-widget': {\n background: colors.highlightBg,\n color: colors.highlightColor,\n padding: '2px 5px',\n borderRadius: '6px',\n },\n '.cm-underline-widget': {\n textDecoration: 'underline',\n textDecorationColor: isDark ? 'hsl(var(--color-primary-light-hsl))' : 'hsl(var(--color-primary-hsl))',\n textDecorationThickness: '2px',\n textUnderlineOffset: '2px',\n },\n\n // Slash Command\n '.cm-slash-command-menu': {\n position: 'absolute',\n zIndex: 100,\n backgroundColor: colors.slashCommandBg,\n border: `0.5px solid ${colors.slashCommandBorder}`,\n borderRadius: '14px',\n boxShadow: isDark ? '0 28px 64px rgba(0, 0, 0, 0.56)' : '0 28px 64px rgba(0, 0, 0, 0.14)',\n padding: '5px',\n maxHeight: '320px',\n overflow: 'hidden auto',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', system-ui, sans-serif\",\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n backdropFilter: 'blur(40px) saturate(180%)',\n WebkitBackdropFilter: 'blur(40px) saturate(180%)',\n '&::-webkit-scrollbar': { display: 'none' },\n },\n '.cm-slash-command-item': {\n minHeight: '36px',\n padding: '7px 10px',\n borderRadius: '8px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n transition: 'background-color 0.14s ease, color 0.14s ease',\n '&:hover': { backgroundColor: colors.slashCommandHoverBg },\n '&.selected': { backgroundColor: colors.slashCommandSelectedBg },\n },\n '.cm-slash-command-icon': {\n marginRight: '11px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n '& svg': { width: '16px', height: '16px', color: colors.slashCommandIcon },\n },\n '.cm-slash-command-title': { fontSize: '13.5px', fontWeight: '500', color: colors.slashCommandText, letterSpacing: '-0.005em' },\n '.cm-slash-command-divider': { margin: '5px 6px', border: 'none', borderTop: `0.5px solid ${colors.slashCommandBorder}` },\n\n // AI Ghost Writer\n '.cm-new-text': { animation: `${animationName} 2s forwards` },\n '.cm-loading-widget': {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '3px 7px',\n backgroundColor: colors.lineHighlight,\n borderRadius: '999px',\n fontSize: '12px',\n color: colors.secondaryText,\n },\n '.cm-loading-spinner': {\n display: 'inline-block',\n width: '12px',\n height: '12px',\n marginRight: '5px',\n border: `2px solid ${colors.secondaryText}`,\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n },\n\n [`@keyframes ${animationName}`]: {\n '0%, 99%': { color: colors.rose, opacity: 0.7 },\n '100%': { color: colors.primaryText, opacity: 1 },\n },\n '@keyframes spin': {\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' },\n },\n };\n}\n", "import type { SyntaxNodeRef } from '@lezer/common';\nimport { syntaxTree } from '@codemirror/language';\nimport { EditorSelection, type EditorState } from '@codemirror/state';\nimport { EditorView, WidgetType } from '@codemirror/view';\nimport { CSS_CLASSES, CUSTOM_EVENTS } from '../../core/constants';\nimport { renderBlockWidgets } from '../table/table-widget-rendering.ts';\n\ninterface KatexRenderOptions {\n displayMode?: boolean;\n throwOnError?: boolean;\n strict?: string;\n output?: 'htmlAndMathml' | 'html' | 'mathml';\n trust?: boolean;\n}\n\ninterface KatexRuntime {\n renderToString?: (expression: string, options?: KatexRenderOptions) => string;\n render?: (expression: string, element: HTMLElement, options?: KatexRenderOptions) => void;\n}\n\ninterface SourceRange {\n from: number;\n to: number;\n}\n\nconst latexLanguages = new Set(['latex', 'katex', 'tex', 'math']);\nlet katexRuntimePromise: Promise<KatexRuntime | null> | null = null;\n\nfunction splitLatexLines(definition: string): string[] {\n return definition\n .replace(/\\r\\n?/g, '\\n')\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nfunction normalizeLanguageTag(raw: string): string {\n const firstToken = raw.trim().split(/\\s+/)[0] ?? '';\n return firstToken.toLowerCase();\n}\n\nfunction parseLatexDefinition(state: EditorState, node: SyntaxNodeRef): string | null {\n if (node.name !== 'FencedCode') {\n return null;\n }\n\n const infoNode = node.node.getChild('CodeInfo');\n if (!infoNode) {\n return null;\n }\n\n const language = normalizeLanguageTag(state.sliceDoc(infoNode.from, infoNode.to));\n if (!latexLanguages.has(language)) {\n return null;\n }\n\n const textNode = node.node.getChild('CodeText');\n if (!textNode) {\n return '';\n }\n\n return state.sliceDoc(textNode.from, textNode.to);\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n\nfunction renderStatus(target: HTMLElement, className: string, message: string): void {\n target.innerHTML = '';\n const status = document.createElement('div');\n status.className = className;\n status.textContent = message;\n target.append(status);\n}\n\nasync function getKatexRuntime(): Promise<KatexRuntime | null> {\n if (katexRuntimePromise) {\n return katexRuntimePromise;\n }\n\n katexRuntimePromise = (async () => {\n try {\n const imported = await import('katex');\n const runtimeCandidate = (imported.default ?? imported) as KatexRuntime;\n if (!runtimeCandidate || (typeof runtimeCandidate.renderToString !== 'function' && typeof runtimeCandidate.render !== 'function')) {\n return null;\n }\n return runtimeCandidate;\n } catch (error) {\n console.error('[MoondownLatex] Failed to load KaTeX runtime', error);\n return null;\n }\n })();\n\n return katexRuntimePromise;\n}\n\nasync function renderLatexInto(target: HTMLElement, definition: string): Promise<void> {\n renderStatus(target, CSS_CLASSES.LATEX_LOADING, 'Rendering LaTeX...');\n\n if (definition.trim().length === 0) {\n renderStatus(target, CSS_CLASSES.LATEX_ERROR, 'LaTeX code block is empty.');\n return;\n }\n\n const runtime = await getKatexRuntime();\n if (!target.isConnected) {\n return;\n }\n\n if (!runtime) {\n renderStatus(target, CSS_CLASSES.LATEX_ERROR, 'KaTeX runtime is unavailable in this environment.');\n return;\n }\n\n const renderOptions: KatexRenderOptions = {\n displayMode: true,\n throwOnError: false,\n strict: 'warn',\n output: 'mathml',\n trust: false,\n };\n\n try {\n const lines = splitLatexLines(definition);\n if (lines.length === 0) {\n renderStatus(target, CSS_CLASSES.LATEX_ERROR, 'LaTeX code block is empty.');\n return;\n }\n\n target.innerHTML = '';\n\n for (const line of lines) {\n const lineTarget = document.createElement('div');\n lineTarget.className = 'cm-latex-line';\n target.append(lineTarget);\n\n if (!target.isConnected) {\n return;\n }\n\n if (typeof runtime.renderToString === 'function') {\n lineTarget.innerHTML = runtime.renderToString(line, renderOptions);\n continue;\n }\n\n if (typeof runtime.render === 'function') {\n runtime.render(line, lineTarget, renderOptions);\n continue;\n }\n\n renderStatus(target, CSS_CLASSES.LATEX_ERROR, 'KaTeX runtime does not support rendering API.');\n return;\n }\n\n return;\n } catch (error) {\n if (!target.isConnected) {\n return;\n }\n\n const message = toErrorMessage(error);\n renderStatus(target, CSS_CLASSES.LATEX_ERROR, `LaTeX render failed: ${message}`);\n }\n}\n\nfunction selectSourceBlock(view: EditorView, from: number, to: number): void {\n view.dispatch({\n selection: EditorSelection.single(from, to),\n scrollIntoView: true,\n });\n view.focus();\n}\n\nfunction findLatexRangeAt(\n state: EditorState,\n from: number,\n to: number,\n): SourceRange | null {\n if (from < 0 || to > state.doc.length || from >= to) {\n return null;\n }\n\n let matchedRange: SourceRange | null = null;\n syntaxTree(state).iterate({\n from: Math.max(0, from - 1),\n to: Math.min(state.doc.length, to + 1),\n enter: (node) => {\n if (node.name !== 'FencedCode' || node.from !== from || node.to !== to) {\n return;\n }\n\n const parsed = parseLatexDefinition(state, node);\n if (parsed !== null) {\n matchedRange = { from, to };\n }\n },\n });\n\n return matchedRange;\n}\n\nfunction resolveLatexSourceRange(\n state: EditorState,\n fallbackFrom: number,\n fallbackTo: number,\n definition: string\n): SourceRange {\n const directMatch = findLatexRangeAt(state, fallbackFrom, fallbackTo);\n if (directMatch) {\n return directMatch;\n }\n\n const normalizedDefinition = definition.replace(/\\r\\n/g, '\\n').replace(/\\n+$/g, '');\n const nearestRangeRef: {\n current: (SourceRange & { distance: number; matchesDefinition: boolean }) | null;\n } = { current: null };\n syntaxTree(state).iterate({\n from: 0,\n to: state.doc.length,\n enter: (node) => {\n if (node.name !== 'FencedCode') {\n return;\n }\n\n const parsed = parseLatexDefinition(state, node);\n if (parsed === null) {\n return;\n }\n\n const normalizedParsed = parsed.replace(/\\r\\n/g, '\\n').replace(/\\n+$/g, '');\n const distance = Math.abs(node.from - fallbackFrom);\n const matchesDefinition = normalizedParsed === normalizedDefinition;\n if (\n !nearestRangeRef.current ||\n (matchesDefinition && !nearestRangeRef.current.matchesDefinition) ||\n (matchesDefinition === nearestRangeRef.current.matchesDefinition && distance < nearestRangeRef.current.distance)\n ) {\n nearestRangeRef.current = {\n from: node.from,\n to: node.to,\n distance,\n matchesDefinition,\n };\n }\n },\n });\n\n if (nearestRangeRef.current) {\n return {\n from: nearestRangeRef.current.from,\n to: nearestRangeRef.current.to,\n };\n }\n\n const safeFrom = Math.max(0, Math.min(fallbackFrom, state.doc.length));\n const safeTo = Math.max(safeFrom, Math.min(fallbackTo, state.doc.length));\n return {\n from: safeFrom,\n to: safeTo,\n };\n}\n\nclass LatexWidget extends WidgetType {\n constructor(\n readonly definition: string,\n private from: number,\n private to: number\n ) {\n super();\n }\n\n eq(other: LatexWidget): boolean {\n const isSameDefinition = this.definition === other.definition;\n // CodeMirror may preserve the previous widget instance when eq returns true.\n // Keep source range in sync so click handlers never use stale positions.\n this.from = other.from;\n this.to = other.to;\n return isSameDefinition;\n }\n\n toDOM(view: EditorView): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = CSS_CLASSES.LATEX_WIDGET;\n\n const canvas = document.createElement('div');\n canvas.className = CSS_CLASSES.LATEX_CANVAS;\n\n const hint = document.createElement('div');\n hint.className = CSS_CLASSES.LATEX_HINT;\n hint.textContent = 'LaTeX preview (click to select source).';\n\n wrapper.append(canvas, hint);\n\n wrapper.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n const sourceRange = resolveLatexSourceRange(view.state, this.from, this.to, this.definition);\n this.from = sourceRange.from;\n this.to = sourceRange.to;\n selectSourceBlock(view, sourceRange.from, sourceRange.to);\n wrapper.dispatchEvent(new CustomEvent(CUSTOM_EVENTS.WIDGET_EDIT_REQUEST, {\n bubbles: true,\n detail: {\n from: sourceRange.from,\n to: sourceRange.to,\n },\n }));\n });\n\n void renderLatexInto(canvas, this.definition);\n return wrapper;\n }\n\n ignoreEvent(): boolean {\n return true;\n }\n}\n\nfunction shouldHandleNode(node: SyntaxNodeRef): boolean {\n return node.name === 'FencedCode';\n}\n\nfunction createWidget(state: EditorState, node: SyntaxNodeRef): LatexWidget | undefined {\n const definition = parseLatexDefinition(state, node);\n if (definition === null) {\n return undefined;\n }\n\n return new LatexWidget(definition, node.from, node.to);\n}\n\nexport const renderLatex = renderBlockWidgets(shouldHandleNode, createWidget);\n", "import type { SyntaxNodeRef } from '@lezer/common';\nimport { syntaxTree } from '@codemirror/language';\nimport {\n EditorState,\n StateField,\n type Transaction,\n type Range as StateRange,\n} from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type WidgetType,\n} from '@codemirror/view';\n\ntype WidgetBuilder = (state: EditorState, node: SyntaxNodeRef) => WidgetType | undefined;\ntype NodePredicate = (node: SyntaxNodeRef) => boolean;\n\ninterface RenderRange {\n from: number;\n to: number;\n}\n\nfunction renderWidgets(\n state: EditorState,\n ranges: ReadonlyArray<RenderRange>,\n shouldHandleNode: NodePredicate,\n createWidget: WidgetBuilder\n): DecorationSet {\n const widgets: StateRange<Decoration>[] = [];\n const seenNodes = new Set<string>();\n const renderRanges = ranges.length > 0 ? ranges : [{ from: 0, to: state.doc.length }];\n\n for (const { from, to } of renderRanges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (!shouldHandleNode(node)) {\n return;\n }\n\n const nodeKey = `${node.from}:${node.to}`;\n if (seenNodes.has(nodeKey)) {\n return;\n }\n seenNodes.add(nodeKey);\n\n const widget = createWidget(state, node);\n if (!widget) {\n return;\n }\n\n const replacement = Decoration.replace({\n widget,\n inclusive: false,\n });\n widgets.push(replacement.range(node.from, node.to));\n },\n });\n }\n\n return Decoration.set(widgets, true);\n}\n\nfunction expandToLineRanges(state: EditorState, ranges: ReadonlyArray<RenderRange>): RenderRange[] {\n const expanded: RenderRange[] = [];\n for (const range of ranges) {\n const from = Math.max(0, Math.min(range.from, state.doc.length));\n const to = Math.max(from, Math.min(range.to, state.doc.length));\n const fromLine = state.doc.lineAt(from);\n const toLine = state.doc.lineAt(to);\n expanded.push({ from: fromLine.from, to: toLine.to });\n }\n return expanded;\n}\n\nfunction rangesContainHandledNode(\n state: EditorState,\n ranges: ReadonlyArray<RenderRange>,\n shouldHandleNode: NodePredicate\n): boolean {\n for (const range of ranges) {\n let found = false;\n syntaxTree(state).iterate({\n from: range.from,\n to: range.to,\n enter: (node) => {\n if (shouldHandleNode(node)) {\n found = true;\n return false;\n }\n return undefined;\n },\n });\n if (found) {\n return true;\n }\n }\n return false;\n}\n\nfunction transactionTouchesHandledNode(\n transaction: Transaction,\n shouldHandleNode: NodePredicate\n): boolean {\n const oldRanges: RenderRange[] = [];\n const newRanges: RenderRange[] = [];\n\n transaction.changes.iterChangedRanges((fromA, toA, fromB, toB) => {\n oldRanges.push({ from: fromA, to: toA });\n newRanges.push({ from: fromB, to: toB });\n });\n\n return (\n rangesContainHandledNode(transaction.startState, expandToLineRanges(transaction.startState, oldRanges), shouldHandleNode) ||\n rangesContainHandledNode(transaction.state, expandToLineRanges(transaction.state, newRanges), shouldHandleNode)\n );\n}\n\nexport function renderBlockWidgets(\n shouldHandleNode: NodePredicate,\n createWidget: WidgetBuilder\n): StateField<DecorationSet> {\n return StateField.define<DecorationSet>({\n create: (state) => renderWidgets(state, [], shouldHandleNode, createWidget),\n update: (decorations, transaction) => {\n const readOnlyChanged =\n transaction.startState.facet(EditorState.readOnly) !== transaction.state.facet(EditorState.readOnly);\n const mappedDecorations = decorations.map(transaction.changes);\n\n if (!transaction.docChanged && !readOnlyChanged) {\n return mappedDecorations;\n }\n\n if (transaction.docChanged && !readOnlyChanged && !transactionTouchesHandledNode(transaction, shouldHandleNode)) {\n return mappedDecorations;\n }\n\n return renderWidgets(transaction.state, [], shouldHandleNode, createWidget);\n },\n provide: (field) => EditorView.decorations.from(field),\n });\n}\n", "import type { Extension } from '@codemirror/state';\nimport { renderLatex } from './latex-renderer.ts';\n\nexport function latexExtension(): Extension {\n return renderLatex;\n}\n", "import { RangeSetBuilder, StateEffect, StateField } from '@codemirror/state';\nimport { EditorView, Decoration, type DecorationSet, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport {\n type DecorationItem,\n type HandlerContext,\n handleFencedCode,\n handleBlockquote,\n handleHorizontalRule,\n handleOrderedListLineMarker,\n handleListItem,\n handleEmphasis,\n handleInlineCode,\n handleHeading,\n handleLink,\n handleStrikethrough,\n handleMark,\n handleUnderline,\n handleImage,\n handleLinkDefinition,\n handleFootnoteDefinition\n} from \"./node-handlers\";\n\n/**\n * StateEffect to toggle the syntax hiding feature.\n */\nexport const toggleSyntaxHidingEffect = StateEffect.define<boolean>();\n\n/**\n * StateField to hold the current enabled/disabled state of syntax hiding.\n */\nexport const syntaxHidingState = StateField.define<boolean>({\n create: () => true, // Enabled by default\n update(value, tr) {\n for (const e of tr.effects) {\n if (e.is(toggleSyntaxHidingEffect)) {\n return e.value;\n }\n }\n return value;\n },\n});\n\n/**\n * Mapping of Lezer syntax node names to their corresponding decoration handlers.\n */\ntype NodeHandler = (ctx: HandlerContext, node: SyntaxNodeRef) => DecorationItem[];\nconst NODE_HANDLERS: Record<string, NodeHandler> = {\n 'FencedCode': (ctx) => handleFencedCode(ctx),\n 'Blockquote': (ctx) => handleBlockquote(ctx),\n 'HorizontalRule': (ctx) => handleHorizontalRule(ctx),\n 'ListItem': (ctx, node) => handleListItem(ctx, node),\n 'Emphasis': (ctx) => handleEmphasis(ctx, false),\n 'StrongEmphasis': (ctx) => handleEmphasis(ctx, true),\n 'InlineCode': (ctx) => handleInlineCode(ctx),\n 'Link': (ctx) => handleLink(ctx),\n 'Strikethrough': (ctx) => handleStrikethrough(ctx),\n 'Mark': (ctx) => handleMark(ctx),\n 'Underline': (ctx) => handleUnderline(ctx),\n 'Image': (ctx) => handleImage(ctx),\n 'LinkReference': (ctx) => handleLink(ctx),\n};\n\n/**\n * Special handler for ATX heading nodes (e.g., ATXHeading1, ATXHeading2).\n */\nfunction handleATXHeading(ctx: HandlerContext, nodeName: string): DecorationItem[] {\n const headerLevel = parseInt(nodeName.slice(-1));\n return handleHeading(ctx, headerLevel);\n}\n\n/**\n * Builds visible decorations for hiding markdown syntax.\n */\nfunction buildMarkdownSyntaxHidingDecorations(view: EditorView): DecorationSet {\n const decorations: DecorationItem[] = [];\n const { state } = view;\n const selection = state.selection.main;\n const isHidingEnabled = state.field(syntaxHidingState);\n\n const processedBlockquotes = new Set<string>();\n const processedDefinitionLines = new Set<number>();\n const seenNodes = new Set<string>();\n const seenLines = new Set<number>();\n\n for (const visibleRange of view.visibleRanges) {\n const firstLine = state.doc.lineAt(visibleRange.from);\n const lastLine = state.doc.lineAt(visibleRange.to);\n\n for (let lineNum = firstLine.number; lineNum <= lastLine.number; lineNum++) {\n if (seenLines.has(lineNum)) {\n continue;\n }\n seenLines.add(lineNum);\n\n const line = state.doc.line(lineNum);\n const lineText = line.text;\n\n if (/^\\[\\^([^\\]]+)\\]:\\s*/.test(lineText)) {\n processedDefinitionLines.add(lineNum);\n const ctx: HandlerContext = {\n state,\n selection,\n isHidingEnabled,\n isSelected: selection.from <= line.to && selection.to >= line.from,\n start: line.from,\n end: line.to\n };\n decorations.push(...handleFootnoteDefinition(ctx));\n } else if (/^\\[([^\\]]+)\\]:\\s*\\S+/.test(lineText)) {\n processedDefinitionLines.add(lineNum);\n const ctx: HandlerContext = {\n state,\n selection,\n isHidingEnabled,\n isSelected: selection.from <= line.to && selection.to >= line.from,\n start: line.from,\n end: line.to\n };\n decorations.push(...handleLinkDefinition(ctx));\n } else {\n const ctx: HandlerContext = {\n state,\n selection,\n isHidingEnabled,\n isSelected: selection.from <= line.to && selection.to >= line.from,\n start: line.from,\n end: line.to\n };\n decorations.push(...handleOrderedListLineMarker(ctx));\n }\n }\n }\n\n for (const visibleRange of view.visibleRanges) {\n syntaxTree(state).iterate({\n from: visibleRange.from,\n to: visibleRange.to,\n enter: (node) => {\n const nodeKey = `${node.from}:${node.to}:${node.type.name}`;\n if (seenNodes.has(nodeKey)) {\n return;\n }\n seenNodes.add(nodeKey);\n\n const start = node.from;\n const end = node.to;\n const isSelected = selection.from <= end && selection.to >= start;\n\n const startLine = state.doc.lineAt(start);\n if (processedDefinitionLines.has(startLine.number)) {\n return false;\n }\n\n const ctx: HandlerContext = { state, selection, isHidingEnabled, isSelected, start, end };\n\n if (node.type.name.startsWith('ATXHeading')) {\n decorations.push(...handleATXHeading(ctx, node.type.name));\n return;\n }\n\n if (node.type.name === 'Blockquote') {\n const key = `${start}-${end}`;\n if (!processedBlockquotes.has(key)) {\n processedBlockquotes.add(key);\n decorations.push(...handleBlockquote(ctx));\n }\n return;\n }\n\n const handler = NODE_HANDLERS[node.type.name];\n if (handler) {\n decorations.push(...handler(ctx, node));\n }\n },\n });\n }\n\n decorations.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n if (a.to !== b.to) return a.to - b.to;\n\n const aStartSide = a.decoration.spec.startSide ?? 0;\n const bStartSide = b.decoration.spec.startSide ?? 0;\n return aStartSide - bStartSide;\n });\n\n const builder = new RangeSetBuilder<Decoration>();\n for (const { from, to, decoration } of decorations) {\n builder.add(from, to, decoration);\n }\n return builder.finish();\n}\n\nexport const markdownSyntaxHidingField = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildMarkdownSyntaxHidingDecorations(view);\n }\n\n update(update: ViewUpdate): void {\n const syntaxHidingChanged =\n update.startState.field(syntaxHidingState) !== update.state.field(syntaxHidingState);\n\n if (update.docChanged || update.viewportChanged || update.selectionSet || syntaxHidingChanged) {\n this.decorations = buildMarkdownSyntaxHidingDecorations(update.view);\n }\n }\n },\n {\n decorations: (plugin) => plugin.decorations,\n }\n);\n", "import type { SyntaxNodeRef } from '@lezer/common';\nimport { Decoration } from '@codemirror/view';\nimport { CSS_CLASSES } from '../../core';\nimport type { DecorationItem, HandlerContext } from './types';\n\n/**\n * Decoration types with explicit startSide values.\n */\nconst hiddenMarkdown = Decoration.mark({ class: CSS_CLASSES.HIDDEN_MARKDOWN });\nconst visibleMarkdown = Decoration.mark({ class: CSS_CLASSES.VISIBLE_MARKDOWN });\nconst orderedListMarker = Decoration.mark({ class: 'cm-ordered-list-marker' });\n\n// Line decorations with explicit startSide to avoid conflicts.\nconst hrLine = Decoration.line({ class: 'cm-hr-line' });\nconst hrLineSelected = Decoration.line({ class: 'cm-hr-line-selected' });\n\nexport function handleOrderedListLineMarker(ctx: HandlerContext): DecorationItem[] {\n const { state, start } = ctx;\n const line = state.doc.lineAt(start);\n const markerMatch = line.text.match(/^(\\s*)(\\d+(?:\\.\\d+)+\\.)\\s/);\n\n if (!markerMatch) {\n return [];\n }\n\n const markerFrom = line.from + markerMatch[1].length;\n const markerTo = markerFrom + markerMatch[2].length;\n\n return [{\n from: markerFrom,\n to: markerTo,\n decoration: orderedListMarker,\n }];\n}\n\n/**\n * Handles FencedCode nodes.\n */\nexport function handleFencedCode(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, isHidingEnabled, start, end } = ctx;\n\n if (isSelected || !isHidingEnabled) {\n return [];\n }\n\n const decorations: DecorationItem[] = [];\n const fencedCodeStart = state.doc.lineAt(start);\n const fencedCodeEnd = state.doc.lineAt(end);\n\n if (fencedCodeStart.number === fencedCodeEnd.number) {\n return [];\n }\n\n const openingMatch = fencedCodeStart.text.match(/^(\\s*(?:>\\s*)?)(```+)(\\w*)/);\n if (openingMatch) {\n const prefix = openingMatch[1] || '';\n const backticks = openingMatch[2];\n const language = openingMatch[3];\n\n const replaceStart = fencedCodeStart.from + prefix.length;\n const replaceEnd = replaceStart + backticks.length + language.length;\n\n decorations.push({\n from: replaceStart,\n to: replaceEnd,\n decoration: Decoration.replace({}),\n });\n }\n\n const closingMatch = fencedCodeEnd.text.match(/^(\\s*(?:>\\s*)?)(```+)/);\n if (closingMatch) {\n const prefix = closingMatch[1] || '';\n const backticks = closingMatch[2];\n\n const replaceStart = fencedCodeEnd.from + prefix.length;\n const replaceEnd = replaceStart + backticks.length;\n\n decorations.push({\n from: replaceStart,\n to: replaceEnd,\n decoration: Decoration.replace({}),\n });\n }\n\n return decorations;\n}\n\n/**\n * Handles Blockquote nodes.\n */\nexport function handleBlockquote(ctx: HandlerContext): DecorationItem[] {\n const { state, start, end } = ctx;\n const decorations: DecorationItem[] = [];\n\n const blockquoteStartLine = state.doc.lineAt(start);\n const blockquoteEndLine = state.doc.lineAt(end);\n\n for (let lineNum = blockquoteStartLine.number; lineNum <= blockquoteEndLine.number; lineNum++) {\n const line = state.doc.line(lineNum);\n const lineText = line.text;\n\n const prefixMatch = lineText.match(/^(\\s*(?:>\\s*)+)/);\n if (!prefixMatch) continue;\n\n const prefix = prefixMatch[0];\n const level = (prefix.match(/>/g) || []).length;\n\n let lineClasses = 'cm-blockquote-line';\n if (lineNum === blockquoteStartLine.number) {\n lineClasses += ' cm-blockquote-first-line';\n }\n if (lineNum === blockquoteEndLine.number) {\n lineClasses += ' cm-blockquote-last-line';\n }\n\n decorations.push({\n from: line.from,\n to: line.from,\n decoration: Decoration.line({\n attributes: {\n class: lineClasses,\n 'data-bq-level': String(level),\n },\n }),\n });\n\n for (let i = 0; i < prefix.length; i++) {\n if (prefix[i] === '>') {\n const markerPos = line.from + i;\n decorations.push({\n from: markerPos,\n to: markerPos + 1,\n decoration: Decoration.replace({}),\n });\n }\n }\n }\n\n return decorations;\n}\n\n/**\n * Handles HorizontalRule nodes.\n */\nexport function handleHorizontalRule(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, isHidingEnabled, start, end } = ctx;\n const line = state.doc.lineAt(start);\n\n if (isSelected || !isHidingEnabled) {\n return [\n { from: line.from, to: line.from, decoration: hrLineSelected },\n { from: start, to: end, decoration: visibleMarkdown },\n ];\n }\n\n return [\n { from: line.from, to: line.from, decoration: hrLine },\n { from: start, to: end, decoration: hiddenMarkdown },\n ];\n}\n\n/**\n * Handles ListItem nodes.\n */\nexport function handleListItem(ctx: HandlerContext, node: SyntaxNodeRef): DecorationItem[] {\n const { state } = ctx;\n const listMarkNode = node.node.getChild('ListMark');\n\n if (listMarkNode) {\n const line = state.doc.lineAt(listMarkNode.from);\n const lineOffset = Math.max(0, listMarkNode.from - line.from);\n const markerMatch = line.text.slice(lineOffset).match(/^(\\d+(?:\\.\\d+)*)\\./);\n const markerFrom = listMarkNode.from;\n const markerTo = markerMatch ? markerFrom + markerMatch[0].length : listMarkNode.to;\n const markText = state.doc.sliceString(markerFrom, markerTo);\n\n if (/\\d/.test(markText)) {\n return [\n {\n from: markerFrom,\n to: markerTo,\n decoration: orderedListMarker,\n },\n ];\n }\n }\n\n return [];\n}\n\n/**\n * Handles ATXHeading nodes.\n */\nexport function handleHeading(ctx: HandlerContext, headerLevel: number): DecorationItem[] {\n const { isSelected, isHidingEnabled, start } = ctx;\n const decorationType = isSelected || !isHidingEnabled ? visibleMarkdown : hiddenMarkdown;\n\n return [\n {\n from: start,\n to: start + headerLevel + 1,\n decoration: decorationType,\n },\n ];\n}\n", "import { Decoration } from '@codemirror/view';\nimport { CSS_CLASSES } from '../../core';\nimport { LinkWidget } from './link-widget';\nimport { InlineCodeWidget, StrikethroughWidget, HighlightWidget, UnderlineWidget } from './widgets';\nimport { handleFootnote } from './reference-handlers';\nimport type { DecorationItem, HandlerContext } from './types';\n\n/**\n * Decoration types with explicit startSide values.\n */\nconst hiddenMarkdown = Decoration.mark({ class: CSS_CLASSES.HIDDEN_MARKDOWN });\nconst visibleMarkdown = Decoration.mark({ class: CSS_CLASSES.VISIBLE_MARKDOWN });\n\n/**\n * Determines decoration type based on selection and hiding state.\n */\nfunction getDecorationType(isSelected: boolean, isHidingEnabled: boolean): Decoration {\n return isSelected || !isHidingEnabled ? visibleMarkdown : hiddenMarkdown;\n}\n\n/**\n * Handles Emphasis and StrongEmphasis nodes.\n */\nexport function handleEmphasis(ctx: HandlerContext, isStrong: boolean): DecorationItem[] {\n const { isSelected, isHidingEnabled, start, end } = ctx;\n const decorationType = getDecorationType(isSelected, isHidingEnabled);\n const markerLength = isStrong ? 2 : 1;\n\n return [\n { from: start, to: start + markerLength, decoration: decorationType },\n { from: end - markerLength, to: end, decoration: decorationType },\n ];\n}\n\n/**\n * Handles InlineCode nodes.\n */\nexport function handleInlineCode(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, start, end } = ctx;\n\n if (!isSelected) {\n const inlineCodeContent = state.doc.sliceString(start, end);\n const content = inlineCodeContent.slice(1, -1);\n\n return [\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new InlineCodeWidget(content, inlineCodeContent, start),\n inclusive: true,\n }),\n },\n ];\n }\n\n return [\n { from: start, to: start + 1, decoration: visibleMarkdown },\n { from: end - 1, to: end, decoration: visibleMarkdown },\n ];\n}\n\n/**\n * Handles Link nodes.\n */\nexport function handleLink(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, start, end } = ctx;\n const linkText = state.doc.sliceString(start, end);\n\n // Check if this is a footnote reference first.\n const footnoteMatch = linkText.match(/^\\[\\^([^\\]]+)\\]$/);\n if (footnoteMatch) {\n return handleFootnote(ctx);\n }\n\n // Try inline link first: [text](url).\n const inlineMatch = linkText.match(/\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (inlineMatch) {\n const decorationType = getDecorationType(isSelected, true);\n const displayText = inlineMatch[1] || inlineMatch[2];\n\n if (!isSelected) {\n return [\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new LinkWidget(displayText, linkText, start),\n inclusive: true,\n }),\n },\n ];\n }\n\n const linkStart = start + linkText.indexOf('[');\n const linkEnd = start + linkText.indexOf(']') + 1;\n const urlStart = start + linkText.indexOf('(');\n const urlEnd = start + linkText.indexOf(')') + 1;\n\n return [\n { from: linkStart, to: linkEnd, decoration: decorationType },\n { from: urlStart, to: urlEnd, decoration: decorationType },\n ];\n }\n\n // Try reference-style link: [text][ref-id].\n const refMatch = linkText.match(/\\[([^\\]]+)\\]\\[([^\\]]+)\\]/);\n if (refMatch) {\n const displayText = refMatch[1];\n const refId = refMatch[2];\n const decorationType = getDecorationType(isSelected, true);\n\n if (!isSelected) {\n return [\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new LinkWidget(displayText, linkText, start, refId),\n inclusive: true,\n }),\n },\n ];\n }\n\n const textStart = start;\n const textEnd = start + refMatch[1].length + 2; // [text]\n const refStart = textEnd;\n const refEnd = end;\n\n return [\n { from: textStart, to: textEnd, decoration: decorationType },\n { from: refStart, to: refEnd, decoration: decorationType },\n ];\n }\n\n return [];\n}\n\n/**\n * Handles Strikethrough nodes.\n */\nexport function handleStrikethrough(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, start, end } = ctx;\n const fullText = state.doc.sliceString(start, end);\n\n if (fullText.length < 4) return [];\n\n const content = fullText.slice(2, -2);\n\n if (!isSelected) {\n return [\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new StrikethroughWidget(content, fullText, start),\n inclusive: true,\n }),\n },\n ];\n }\n\n return [\n { from: start, to: start + 2, decoration: visibleMarkdown },\n { from: end - 2, to: end, decoration: visibleMarkdown },\n ];\n}\n\n/**\n * Handles Mark (highlight) nodes.\n */\nexport function handleMark(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, start, end } = ctx;\n const fullText = state.doc.sliceString(start, end);\n\n if (fullText.length < 4) return [];\n\n const content = fullText.slice(2, -2);\n\n if (!isSelected) {\n return [\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new HighlightWidget(content, fullText, start),\n inclusive: true,\n }),\n },\n ];\n }\n\n return [\n { from: start, to: start + 2, decoration: visibleMarkdown },\n { from: end - 2, to: end, decoration: visibleMarkdown },\n ];\n}\n\n/**\n * Handles Underline nodes.\n */\nexport function handleUnderline(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, start, end } = ctx;\n const fullText = state.doc.sliceString(start, end);\n\n if (fullText.length < 2) return [];\n\n const content = fullText.slice(1, -1);\n\n if (!isSelected) {\n return [\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new UnderlineWidget(content, fullText, start),\n inclusive: true,\n }),\n },\n ];\n }\n\n return [\n { from: start, to: start + 1, decoration: visibleMarkdown },\n { from: end - 1, to: end, decoration: visibleMarkdown },\n ];\n}\n\n/**\n * Handles Image nodes.\n */\nexport function handleImage(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, isHidingEnabled, start, end } = ctx;\n const imageText = state.doc.sliceString(start, end);\n const imageMatch = imageText.match(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/);\n\n if (!imageMatch) return [];\n\n const decorationType = getDecorationType(isSelected, isHidingEnabled);\n const alt = imageMatch[1];\n\n return [\n { from: start, to: start + 2, decoration: decorationType },\n { from: start + 2 + alt.length, to: end, decoration: decorationType },\n ];\n}\n", "import { EditorView, WidgetType } from \"@codemirror/view\";\nimport { EditorSelection } from \"@codemirror/state\";\nimport { addHighlightEffect } from \"./highlight-effects\";\nimport { escapeRegExp } from \"../../core\";\n\n/**\n * A CodeMirror Widget that renders a styled, clickable link in place of\n * the full markdown syntax `[text](url)` or `[text][ref]`.\n */\nexport class LinkWidget extends WidgetType {\n constructor(\n private displayText: string,\n private fullLink: string,\n private start: number,\n private refId?: string\n ) {\n super();\n }\n\n toDOM(view: EditorView): HTMLElement {\n const span = document.createElement(\"span\");\n span.className = \"cm-link-widget\";\n span.textContent = this.displayText;\n\n span.addEventListener('mousedown', (event) => {\n event.preventDefault();\n\n // If it's a reference link, find and jump to its definition.\n if (this.refId) {\n const docText = view.state.doc.toString();\n // A definition must be at the start of a line.\n const defPattern = new RegExp(`^\\\\[${escapeRegExp(this.refId)}\\\\]:`, 'm');\n const match = defPattern.exec(docText);\n\n if (match) {\n const defPos = match.index;\n const line = view.state.doc.lineAt(defPos);\n const targetEnd = line.to;\n\n // Move cursor, scroll, and temporarily highlight the definition.\n view.dispatch({\n selection: EditorSelection.cursor(targetEnd),\n effects: [\n EditorView.scrollIntoView(targetEnd, { y: \"center\" }),\n addHighlightEffect.of({ from: line.from, to: targetEnd, timestamp: Date.now() })\n ]\n });\n } else {\n // Fallback: if definition is not found, just select the link usage.\n const end = this.start + this.fullLink.length;\n view.dispatch({\n selection: EditorSelection.single(this.start, end)\n });\n }\n } else {\n // For regular inline links, select the markdown text.\n const end = this.start + this.fullLink.length;\n view.dispatch({\n selection: EditorSelection.single(this.start, end)\n });\n }\n });\n\n return span;\n }\n\n eq(other: LinkWidget) {\n return other.displayText === this.displayText &&\n other.fullLink === this.fullLink &&\n other.start === this.start &&\n other.refId === this.refId;\n }\n\n ignoreEvent(event: Event): boolean {\n // Intercept mousedown to handle selection and jumping.\n return event.type === 'mousedown';\n }\n}", "import { StateEffect, StateField } from '@codemirror/state';\nimport { Decoration, EditorView } from '@codemirror/view';\n\n/**\n * A StateEffect used to add a temporary highlight to a range of text.\n * This is primarily for providing visual feedback when jumping to a link or footnote definition.\n */\nexport const addHighlightEffect = StateEffect.define<{from: number, to: number, timestamp: number}>();\n\nexport interface HighlightInfo {\n from: number;\n to: number;\n timestamp: number;\n}\n\n/**\n * A StateField to manage the temporary highlight decoration.\n * It holds information about the highlighted range and its start time,\n * automatically clearing the highlight after a set duration.\n */\nexport const referenceHighlightField = StateField.define<HighlightInfo | null>({\n create() {\n return null;\n },\n update(highlight, tr) {\n // Apply new highlight effect\n for (const effect of tr.effects) {\n if (effect.is(addHighlightEffect)) {\n return effect.value;\n }\n }\n\n if (highlight) {\n // Check if the highlight has expired\n const elapsed = Date.now() - highlight.timestamp;\n if (elapsed >= 2000) {\n return null;\n }\n }\n if (highlight && tr.docChanged) {\n return {\n from: tr.changes.mapPos(highlight.from),\n to: tr.changes.mapPos(highlight.to),\n timestamp: highlight.timestamp\n };\n }\n return highlight;\n },\n provide: f => EditorView.decorations.from(f, highlight => {\n if (!highlight) return Decoration.none;\n const elapsed = Date.now() - highlight.timestamp;\n if (elapsed >= 2000) {\n return Decoration.none;\n }\n const deco = Decoration.mark({\n class: \"cm-reference-highlight\"\n }).range(highlight.from, highlight.to);\n return Decoration.set([deco]);\n })\n});\n\n/**\n * A ViewPlugin that ensures the expired highlight decoration is removed from the view.\n * It dispatches an empty transaction to trigger a view update if the highlight has just expired.\n */\nexport const highlightCleanupPlugin = EditorView.updateListener.of((update) => {\n const highlight = update.state.field(referenceHighlightField, false);\n if (highlight) {\n const elapsed = Date.now() - highlight.timestamp;\n // If the highlight has just expired, trigger a redraw.\n if (elapsed >= 2000 && elapsed < 2100) {\n setTimeout(() => {\n // Check if the highlight still exists before dispatching\n if (update.view.state.field(referenceHighlightField, false)) {\n update.view.dispatch({});\n }\n }, 100);\n }\n }\n});", "import { EditorView, WidgetType } from \"@codemirror/view\";\nimport { EditorSelection } from \"@codemirror/state\";\n\n/**\n * An abstract base class for inline style widgets (like code, strikethrough, etc.).\n * It provides common functionality for rendering styled content and handling clicks\n * to reveal the underlying markdown syntax by selecting it.\n */\nabstract class SelectableInlineWidget extends WidgetType {\n constructor(\n protected content: string,\n protected fullText: string,\n protected start: number,\n protected className: string\n ) {\n super();\n }\n\n toDOM(view: EditorView): HTMLElement {\n const span = document.createElement(\"span\");\n span.className = this.className;\n span.textContent = this.content;\n\n // When the widget is clicked, select the full markdown text.\n span.addEventListener('mousedown', (event) => {\n event.preventDefault();\n const end = this.start + this.fullText.length;\n view.dispatch({\n selection: EditorSelection.single(this.start, end)\n });\n });\n\n return span;\n }\n\n eq(other: SelectableInlineWidget): boolean {\n return (\n other.content === this.content &&\n other.fullText === this.fullText &&\n other.start === this.start &&\n other.className === this.className\n );\n }\n\n ignoreEvent(event: Event): boolean {\n // Intercept mousedown events to handle the custom selection behavior.\n return event.type === 'mousedown';\n }\n}\n\n/**\n * Widget for rendering inline code (`code`).\n */\nexport class InlineCodeWidget extends SelectableInlineWidget {\n constructor(content: string, fullText: string, start: number) {\n super(content, fullText, start, \"cm-inline-code-widget\");\n }\n}\n\n/**\n * Widget for rendering strikethrough text (~~text~~).\n */\nexport class StrikethroughWidget extends SelectableInlineWidget {\n constructor(content: string, fullText: string, start: number) {\n super(content, fullText, start, \"cm-strikethrough-widget\");\n }\n}\n\n/**\n * Widget for rendering highlighted text (==text==).\n */\nexport class HighlightWidget extends SelectableInlineWidget {\n constructor(content: string, fullText: string, start: number) {\n super(content, fullText, start, \"cm-highlight-widget\");\n }\n}\n\n/**\n * Widget for rendering underlined text (~text~).\n */\nexport class UnderlineWidget extends SelectableInlineWidget {\n constructor(content: string, fullText: string, start: number) {\n super(content, fullText, start, \"cm-underline-widget\");\n }\n}", "import { EditorSelection } from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\nimport { CSS_CLASSES, escapeRegExp } from '../../core';\nimport { addHighlightEffect } from './highlight-effects';\nimport type { DecorationItem, HandlerContext } from './types';\n\nconst visibleMarkdown = Decoration.mark({ class: CSS_CLASSES.VISIBLE_MARKDOWN });\n\n/**\n * Widget for footnote references (like [^1])\n */\nexport class FootnoteWidget extends WidgetType {\n constructor(\n private footnoteId: string,\n private fullText: string,\n private start: number\n ) {\n super();\n }\n\n toDOM(view: EditorView): HTMLElement {\n const sup = document.createElement('sup');\n sup.className = 'cm-footnote-widget';\n sup.textContent = this.footnoteId;\n\n sup.addEventListener('mousedown', (event) => {\n event.preventDefault();\n\n // Find the footnote definition in the document\n const docText = view.state.doc.toString();\n const defPattern = new RegExp(`^\\\\[\\\\^${escapeRegExp(this.footnoteId)}\\\\]:`, 'm');\n const match = defPattern.exec(docText);\n\n if (match) {\n const defPos = match.index;\n const line = view.state.doc.lineAt(defPos);\n const targetEnd = line.to;\n\n view.dispatch({\n selection: EditorSelection.cursor(targetEnd),\n effects: [\n EditorView.scrollIntoView(targetEnd, { y: 'center' }),\n addHighlightEffect.of({ from: line.from, to: targetEnd, timestamp: Date.now() }),\n ],\n });\n } else {\n // Fallback: select the footnote reference\n const end = this.start + this.fullText.length;\n view.dispatch({\n selection: EditorSelection.single(this.start, end),\n });\n }\n });\n\n return sup;\n }\n\n eq(other: FootnoteWidget): boolean {\n return (\n other.footnoteId === this.footnoteId &&\n other.fullText === this.fullText &&\n other.start === this.start\n );\n }\n\n ignoreEvent(event: Event): boolean {\n return event.type === 'mousedown';\n }\n}\n\n/**\n * Widget for footnote definitions (the [^id]: content part)\n */\nexport class FootnoteDefinitionWidget extends WidgetType {\n constructor(\n private footnoteId: string,\n private content: string,\n private fullText: string,\n private start: number\n ) {\n super();\n }\n\n toDOM(view: EditorView): HTMLElement {\n const container = document.createElement('span');\n container.className = 'cm-footnote-definition-widget';\n\n // Create the footnote ID part\n const idSpan = document.createElement('span');\n idSpan.textContent = this.footnoteId;\n idSpan.style.fontWeight = '600';\n\n // Create the content part\n const contentSpan = document.createElement('span');\n contentSpan.style.marginLeft = '8px';\n contentSpan.textContent = this.content;\n\n container.appendChild(idSpan);\n container.appendChild(contentSpan);\n\n // Set title for hover\n container.title = `Jump to footnote reference: ${this.footnoteId}`;\n\n container.addEventListener('mousedown', (event) => {\n event.preventDefault();\n\n // Find the footnote reference in the document\n const docText = view.state.doc.toString();\n const refPattern = new RegExp(`\\\\[\\\\^${escapeRegExp(this.footnoteId)}\\\\]`, 'g');\n const match = refPattern.exec(docText);\n\n if (match) {\n const targetPos = match.index;\n const targetEnd = targetPos + match[0].length;\n\n view.dispatch({\n selection: EditorSelection.cursor(targetEnd),\n effects: [\n EditorView.scrollIntoView(targetEnd, { y: 'center' }),\n addHighlightEffect.of({ from: targetPos, to: targetEnd, timestamp: Date.now() }),\n ],\n });\n }\n });\n\n // Allow double-click to select the definition itself\n container.addEventListener('click', (event) => {\n if (event.detail === 2) {\n event.preventDefault();\n const end = this.start + this.fullText.length;\n view.dispatch({\n selection: EditorSelection.single(this.start, end),\n });\n }\n });\n\n return container;\n }\n\n eq(other: FootnoteDefinitionWidget): boolean {\n return (\n other.footnoteId === this.footnoteId &&\n other.content === this.content &&\n other.fullText === this.fullText &&\n other.start === this.start\n );\n }\n\n ignoreEvent(event: Event): boolean {\n return event.type === 'mousedown' || event.type === 'click';\n }\n}\n\n/**\n * Handles footnote references like [^1]\n */\nexport function handleFootnote(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, start, end } = ctx;\n const footnoteText = state.doc.sliceString(start, end);\n const footnoteMatch = footnoteText.match(/^\\[\\^([^\\]]+)\\]$/);\n\n if (!footnoteMatch) return [];\n\n const footnoteId = footnoteMatch[1];\n\n if (!isSelected) {\n return [\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new FootnoteWidget(footnoteId, footnoteText, start),\n inclusive: true,\n }),\n },\n ];\n }\n\n return [\n {\n from: start,\n to: end,\n decoration: visibleMarkdown,\n },\n ];\n}\n\n/**\n * Handles footnote definition lines: [^id]: content\n */\nexport function handleFootnoteDefinition(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, start, end } = ctx;\n const line = state.doc.lineAt(start);\n const lineText = line.text;\n\n // Match footnote definition: [^id]: content\n const match = lineText.match(/^\\[\\^([^\\]]+)\\]:\\s*(.*)/);\n\n if (!match) return [];\n\n const footnoteId = match[1];\n const content = match[2];\n const fullText = lineText;\n\n const decorations: DecorationItem[] = [];\n\n // Add line decoration for visual distinction\n decorations.push({\n from: line.from,\n to: line.from,\n decoration: Decoration.line({\n class: 'cm-footnote-definition-line',\n }),\n });\n\n if (!isSelected) {\n // Replace the entire line with a nicely styled widget\n return [\n ...decorations,\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new FootnoteDefinitionWidget(footnoteId, content, fullText, start),\n inclusive: true,\n }),\n },\n ];\n }\n\n // When selected, show syntax with highlighting\n const colonPos = line.from + lineText.indexOf(':');\n const contentMatch = lineText.slice(lineText.indexOf(':') + 1).match(/\\s*(.*)/);\n\n if (contentMatch) {\n const contentStartOffset = lineText.indexOf(':', lineText.indexOf(']')) + 1;\n const contentEnd = line.to;\n\n decorations.push(\n // Highlight the [^id]: part\n {\n from: line.from,\n to: colonPos + 1,\n decoration: Decoration.mark({\n class: 'cm-visible-markdown',\n }),\n },\n // Style the content part\n {\n from: line.from + contentStartOffset,\n to: contentEnd,\n decoration: Decoration.mark({\n class: 'cm-footnote-definition-content',\n }),\n }\n );\n }\n\n return decorations;\n}\n", "import { EditorSelection } from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\nimport { escapeRegExp } from '../../core';\nimport { addHighlightEffect } from './highlight-effects';\nimport type { DecorationItem, HandlerContext } from './types';\n\n/**\n * Widget for link definitions (the [id]: url part)\n */\nexport class LinkDefinitionWidget extends WidgetType {\n constructor(\n private refId: string,\n private url: string,\n private fullText: string,\n private start: number\n ) {\n super();\n }\n\n toDOM(view: EditorView): HTMLElement {\n const container = document.createElement('span');\n container.className = 'cm-link-definition-widget';\n\n // Create the reference ID part\n const refSpan = document.createElement('span');\n refSpan.textContent = this.refId;\n refSpan.style.fontWeight = '600';\n\n // Create a small URL preview (shortened if too long)\n const urlPreview = document.createElement('span');\n urlPreview.style.fontSize = '0.85em';\n urlPreview.style.opacity = '0.6';\n urlPreview.style.marginLeft = '8px';\n\n // Shorten URL for display\n let displayUrl = this.url;\n if (displayUrl.length > 40) {\n displayUrl = displayUrl.substring(0, 37) + '...';\n }\n urlPreview.textContent = `(${displayUrl})`;\n\n container.appendChild(refSpan);\n container.appendChild(urlPreview);\n\n // Set title for full URL on hover\n container.title = `Jump to reference: ${this.refId}\\nURL: ${this.url}`;\n\n container.addEventListener('mousedown', (event) => {\n event.preventDefault();\n\n // Find the reference usage in the document\n const docText = view.state.doc.toString();\n const refPattern = new RegExp(`\\\\[([^\\\\]]+)\\\\]\\\\[${escapeRegExp(this.refId)}\\\\]`, 'gi');\n const match = refPattern.exec(docText);\n\n if (match) {\n const targetPos = match.index;\n const targetEnd = targetPos + match[0].length;\n\n // Move cursor to the END of the reference (not select it)\n view.dispatch({\n selection: EditorSelection.cursor(targetEnd),\n effects: [\n EditorView.scrollIntoView(targetEnd, { y: 'center' }),\n // Add a special effect to mark this as a programmatic jump\n addHighlightEffect.of({ from: targetPos, to: targetEnd, timestamp: Date.now() }),\n ],\n });\n }\n });\n\n // Allow double-click to select the definition itself\n container.addEventListener('click', (event) => {\n if (event.detail === 2) {\n event.preventDefault();\n const end = this.start + this.fullText.length;\n view.dispatch({\n selection: EditorSelection.single(this.start, end),\n });\n }\n });\n\n return container;\n }\n\n eq(other: LinkDefinitionWidget): boolean {\n return (\n other.refId === this.refId &&\n other.url === this.url &&\n other.fullText === this.fullText &&\n other.start === this.start\n );\n }\n\n ignoreEvent(event: Event): boolean {\n return event.type === 'mousedown' || event.type === 'click';\n }\n}\n\n/**\n * Handles link definition lines: [id]: url\n */\nexport function handleLinkDefinition(ctx: HandlerContext): DecorationItem[] {\n const { state, isSelected, start, end } = ctx;\n const line = state.doc.lineAt(start);\n const lineText = line.text;\n\n // Match link definition: [ref-id]: url (optional \"title\")\n const match = lineText.match(/^\\[([^\\]]+)\\]:\\s*(\\S+)(?:\\s+\"([^\"]*)\")?/);\n\n if (!match) return [];\n\n const refId = match[1];\n const url = match[2];\n const fullText = lineText;\n\n const decorations: DecorationItem[] = [];\n\n // Add line decoration for visual distinction\n decorations.push({\n from: line.from,\n to: line.from,\n decoration: Decoration.line({\n class: 'cm-link-definition-line',\n }),\n });\n\n if (!isSelected) {\n // Replace the entire line with a nicely styled widget\n return [\n ...decorations,\n {\n from: start,\n to: end,\n decoration: Decoration.replace({\n widget: new LinkDefinitionWidget(refId, url, fullText, start),\n inclusive: true,\n }),\n },\n ];\n }\n\n // When selected, show syntax with highlighting\n const colonPos = line.from + lineText.indexOf(':');\n const urlMatch = lineText.slice(lineText.indexOf(':') + 1).match(/\\s*(\\S+)/);\n\n if (urlMatch) {\n const urlStartOffset = lineText.indexOf(':', lineText.indexOf(']')) + 1 + urlMatch.index!;\n const urlEnd = line.from + urlStartOffset + urlMatch[1].length;\n\n decorations.push(\n // Highlight the [ref-id]: part\n {\n from: line.from,\n to: colonPos + 1,\n decoration: Decoration.mark({\n class: 'cm-visible-markdown',\n }),\n },\n // Style the URL part\n {\n from: line.from + urlStartOffset,\n to: urlEnd,\n decoration: Decoration.mark({\n class: 'cm-link-definition-url',\n }),\n }\n );\n }\n\n return decorations;\n}\n", "import {markdownSyntaxHidingField, syntaxHidingState} from './markdown-syntax-hiding-field';\nimport {highlightCleanupPlugin, referenceHighlightField} from \"./highlight-effects\";\n\n/**\n * Returns a CodeMirror extension that provides markdown syntax hiding.\n * This creates a more WYSIWYG-like editing experience by visually collapsing\n * markdown markers (e.g., `**`, `## `) when the cursor is not inside them.\n * It also includes effects for temporarily highlighting jumped-to definitions.\n */\nexport function markdownSyntaxHiding() {\n return [\n syntaxHidingState,\n markdownSyntaxHidingField,\n referenceHighlightField,\n highlightCleanupPlugin\n ];\n}", "import type { SyntaxNodeRef } from '@lezer/common';\nimport { syntaxTree } from '@codemirror/language';\nimport { EditorSelection, type EditorState } from '@codemirror/state';\nimport { EditorView, WidgetType } from '@codemirror/view';\nimport { CSS_CLASSES, CUSTOM_EVENTS } from '../../core/constants';\nimport { renderBlockWidgets } from '../table/table-widget-rendering.ts';\n\ninterface MermaidRenderResult {\n svg: string;\n bindFunctions?: (element: Element) => void;\n}\n\ninterface MermaidRuntime {\n initialize: (config: Record<string, unknown>) => void;\n render: (id: string, definition: string) => Promise<MermaidRenderResult> | MermaidRenderResult;\n}\n\ninterface SourceRange {\n from: number;\n to: number;\n}\n\nlet mermaidRuntimePromise: Promise<MermaidRuntime | null> | null = null;\nlet mermaidInitialized = false;\nlet renderIdCounter = 0;\n\nfunction normalizeLanguageTag(raw: string): string {\n const firstToken = raw.trim().split(/\\s+/)[0] ?? '';\n return firstToken.toLowerCase();\n}\n\nfunction parseMermaidDefinition(state: EditorState, node: SyntaxNodeRef): string | null {\n if (node.name !== 'FencedCode') {\n return null;\n }\n\n const infoNode = node.node.getChild('CodeInfo');\n if (!infoNode) {\n return null;\n }\n\n const language = normalizeLanguageTag(state.sliceDoc(infoNode.from, infoNode.to));\n if (language !== 'mermaid') {\n return null;\n }\n\n const textNode = node.node.getChild('CodeText');\n if (!textNode) {\n return '';\n }\n\n return state.sliceDoc(textNode.from, textNode.to);\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n\nfunction renderStatus(target: HTMLElement, className: string, message: string): void {\n target.innerHTML = '';\n const status = document.createElement('div');\n status.className = className;\n status.textContent = message;\n target.append(status);\n}\n\nasync function getMermaidRuntime(): Promise<MermaidRuntime | null> {\n if (mermaidRuntimePromise) {\n return mermaidRuntimePromise;\n }\n\n mermaidRuntimePromise = (async () => {\n try {\n const imported = await import('mermaid');\n const runtimeCandidate = (imported.default ?? imported) as Partial<MermaidRuntime>;\n\n if (!runtimeCandidate || typeof runtimeCandidate.initialize !== 'function' || typeof runtimeCandidate.render !== 'function') {\n return null;\n }\n\n if (!mermaidInitialized) {\n runtimeCandidate.initialize({\n startOnLoad: false,\n securityLevel: 'strict',\n suppressErrorRendering: true,\n });\n mermaidInitialized = true;\n }\n\n return runtimeCandidate as MermaidRuntime;\n } catch (error) {\n console.error('[MoondownMermaid] Failed to load Mermaid runtime', error);\n return null;\n }\n })();\n\n return mermaidRuntimePromise;\n}\n\nasync function renderMermaidInto(target: HTMLElement, definition: string): Promise<void> {\n renderStatus(target, CSS_CLASSES.MERMAID_LOADING, 'Rendering Mermaid diagram...');\n\n if (definition.trim().length === 0) {\n renderStatus(target, CSS_CLASSES.MERMAID_ERROR, 'Mermaid code block is empty.');\n return;\n }\n\n const runtime = await getMermaidRuntime();\n if (!target.isConnected) {\n return;\n }\n\n if (!runtime) {\n renderStatus(target, CSS_CLASSES.MERMAID_ERROR, 'Mermaid runtime is unavailable in this environment.');\n return;\n }\n\n try {\n const renderId = `moondown-mermaid-${renderIdCounter++}`;\n const result = await runtime.render(renderId, definition);\n if (!target.isConnected) {\n return;\n }\n\n target.innerHTML = result.svg;\n\n if (typeof result.bindFunctions === 'function') {\n result.bindFunctions(target);\n }\n } catch (error) {\n if (!target.isConnected) {\n return;\n }\n\n const message = toErrorMessage(error);\n renderStatus(target, CSS_CLASSES.MERMAID_ERROR, `Mermaid render failed: ${message}`);\n }\n}\n\nfunction selectSourceBlock(view: EditorView, from: number, to: number): void {\n view.dispatch({\n selection: EditorSelection.single(from, to),\n scrollIntoView: true,\n });\n view.focus();\n}\n\nfunction findMermaidRangeAt(\n state: EditorState,\n from: number,\n to: number,\n): SourceRange | null {\n if (from < 0 || to > state.doc.length || from >= to) {\n return null;\n }\n\n let matchedRange: SourceRange | null = null;\n syntaxTree(state).iterate({\n from: Math.max(0, from - 1),\n to: Math.min(state.doc.length, to + 1),\n enter: (node) => {\n if (node.name !== 'FencedCode' || node.from !== from || node.to !== to) {\n return;\n }\n\n const parsed = parseMermaidDefinition(state, node);\n if (parsed !== null) {\n matchedRange = { from, to };\n }\n },\n });\n\n return matchedRange;\n}\n\nfunction resolveMermaidSourceRange(\n state: EditorState,\n fallbackFrom: number,\n fallbackTo: number,\n definition: string\n): SourceRange {\n const directMatch = findMermaidRangeAt(state, fallbackFrom, fallbackTo);\n if (directMatch) {\n return directMatch;\n }\n\n const normalizedDefinition = definition.replace(/\\r\\n/g, '\\n').replace(/\\n+$/g, '');\n const nearestRangeRef: {\n current: (SourceRange & { distance: number; matchesDefinition: boolean }) | null;\n } = { current: null };\n syntaxTree(state).iterate({\n from: 0,\n to: state.doc.length,\n enter: (node) => {\n if (node.name !== 'FencedCode') {\n return;\n }\n\n const parsed = parseMermaidDefinition(state, node);\n if (parsed === null) {\n return;\n }\n\n const normalizedParsed = parsed.replace(/\\r\\n/g, '\\n').replace(/\\n+$/g, '');\n const distance = Math.abs(node.from - fallbackFrom);\n const matchesDefinition = normalizedParsed === normalizedDefinition;\n if (\n !nearestRangeRef.current ||\n (matchesDefinition && !nearestRangeRef.current.matchesDefinition) ||\n (matchesDefinition === nearestRangeRef.current.matchesDefinition && distance < nearestRangeRef.current.distance)\n ) {\n nearestRangeRef.current = {\n from: node.from,\n to: node.to,\n distance,\n matchesDefinition,\n };\n }\n },\n });\n\n if (nearestRangeRef.current) {\n return {\n from: nearestRangeRef.current.from,\n to: nearestRangeRef.current.to,\n };\n }\n\n const safeFrom = Math.max(0, Math.min(fallbackFrom, state.doc.length));\n const safeTo = Math.max(safeFrom, Math.min(fallbackTo, state.doc.length));\n return {\n from: safeFrom,\n to: safeTo,\n };\n}\n\nclass MermaidWidget extends WidgetType {\n constructor(\n readonly definition: string,\n private from: number,\n private to: number\n ) {\n super();\n }\n\n eq(other: MermaidWidget): boolean {\n const isSameDefinition = this.definition === other.definition;\n // CodeMirror may preserve the previous widget instance when eq returns true.\n // Keep source range in sync so click handlers never use stale positions.\n this.from = other.from;\n this.to = other.to;\n return isSameDefinition;\n }\n\n toDOM(view: EditorView): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = CSS_CLASSES.MERMAID_WIDGET;\n\n const canvas = document.createElement('div');\n canvas.className = CSS_CLASSES.MERMAID_CANVAS;\n\n const hint = document.createElement('div');\n hint.className = CSS_CLASSES.MERMAID_HINT;\n hint.textContent = 'Mermaid diagram preview (click to select source).';\n\n wrapper.append(canvas, hint);\n\n wrapper.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n const sourceRange = resolveMermaidSourceRange(view.state, this.from, this.to, this.definition);\n this.from = sourceRange.from;\n this.to = sourceRange.to;\n selectSourceBlock(view, sourceRange.from, sourceRange.to);\n wrapper.dispatchEvent(new CustomEvent(CUSTOM_EVENTS.WIDGET_EDIT_REQUEST, {\n bubbles: true,\n detail: {\n from: sourceRange.from,\n to: sourceRange.to,\n },\n }));\n });\n\n void renderMermaidInto(canvas, this.definition);\n return wrapper;\n }\n\n ignoreEvent(): boolean {\n return true;\n }\n}\n\nfunction shouldHandleNode(node: SyntaxNodeRef): boolean {\n return node.name === 'FencedCode';\n}\n\nfunction createWidget(state: EditorState, node: SyntaxNodeRef): MermaidWidget | undefined {\n const definition = parseMermaidDefinition(state, node);\n if (definition === null) {\n return undefined;\n }\n\n return new MermaidWidget(definition, node.from, node.to);\n}\n\nexport const renderMermaid = renderBlockWidgets(shouldHandleNode, createWidget);\n", "import type { Extension } from '@codemirror/state';\nimport { renderMermaid } from './mermaid-renderer.ts';\n\nexport function mermaidExtension(): Extension {\n return renderMermaid;\n}\n", "import {Compartment, type Extension} from \"@codemirror/state\";\nimport {tablePositions} from \"./table-position.ts\";\nimport {renderTables} from \"./render-tables.ts\";\n\nexport function tableExtension(): Extension {\n return [\n tablePositions,\n (new Compartment()).of(renderTables)\n ];\n}", "\n/**\n * Table position tracking for CodeMirror state management\n *\n * This module manages the positions of tables within the editor document,\n * allowing for efficient tracking and updating of table locations as the\n * document content changes. It uses CodeMirror's state effects and fields\n * to maintain accurate position information.\n */\n\nimport {StateEffect, StateField} from \"@codemirror/state\";\n\n/**\n * State effect for updating table position information\n *\n * This effect is dispatched when a table's position in the document changes,\n * carrying the table's unique ID and its new start/end positions.\n */\nexport const updateTablePosition = StateEffect.define<{id: number, from: number, to: number}>()\n\n/**\n * State field that tracks all table positions in the document\n *\n * Maintains a map of table IDs to their corresponding position ranges.\n * Updates automatically when tables are added, removed, or moved within\n * the document.\n */\nexport const tablePositions = StateField.define<Map<number, {from: number, to: number}>>({\n /**\n * Initialize the table positions map\n * @returns Empty Map to store table positions\n */\n create: () => new Map(),\n\n /**\n * Update table positions based on state transaction effects\n * @param value - Current map of table positions\n * @param tr - CodeMirror transaction containing effects\n * @returns Updated map with new table positions\n */\n update(value, tr) {\n let nextPositions: Map<number, {from: number, to: number}>;\n\n if (tr.docChanged) {\n nextPositions = new Map<number, {from: number, to: number}>();\n value.forEach((pos, id) => {\n const newFrom = tr.changes.mapPos(pos.from);\n const newTo = tr.changes.mapPos(pos.to);\n nextPositions.set(id, {from: newFrom, to: newTo});\n });\n } else {\n nextPositions = new Map(value);\n }\n\n for (const effect of tr.effects) {\n if (effect.is(updateTablePosition)) {\n nextPositions.set(effect.value.id, {from: effect.value.from, to: effect.value.to});\n }\n }\n\n return nextPositions\n }\n})\n", "import { EditorState as CodeMirrorState } from '@codemirror/state';\nimport type { SyntaxNodeRef, SyntaxNode } from '@lezer/common';\nimport { EditorView, WidgetType } from '@codemirror/view';\nimport TableEditor from './table-editor.ts';\nimport { renderBlockWidgets } from './table-widget-rendering.ts';\nimport { TableWidgetSaveController } from './table-widget-save.ts';\nimport { createTableEditorFromSyntaxNode } from './table-widget-editor-factory.ts';\n\nclass TableWidget extends WidgetType {\n private static nextId = 0;\n\n private readonly widgetId: number;\n private domElement: HTMLElement | null = null;\n private readonly saveController = new TableWidgetSaveController();\n\n constructor(\n readonly table: string,\n readonly readOnly: boolean,\n readonly node: SyntaxNode,\n readonly originalFrom: number,\n readonly originalTo: number\n ) {\n super();\n this.widgetId = TableWidget.nextId++;\n }\n\n eq(other: TableWidget): boolean {\n return this.table === other.table && this.readOnly === other.readOnly;\n }\n\n toDOM(view: EditorView): HTMLElement {\n try {\n const editor = createTableEditorFromSyntaxNode(this.node, view.state.sliceDoc(), {\n readOnly: this.readOnly,\n onBlur: (instance) => {\n this.saveContent(view, instance);\n },\n saveIntent: (instance) => {\n this.saveContent(view, instance);\n },\n container: view.scrollDOM,\n });\n\n this.domElement = editor.domElement;\n this.domElement.dataset.widgetId = String(this.widgetId);\n this.domElement.dataset.originalFrom = String(this.originalFrom);\n this.domElement.dataset.originalTo = String(this.originalTo);\n\n return this.domElement;\n } catch (error) {\n console.error('Error in TableWidget.toDOM:', error);\n return document.createElement('div');\n }\n }\n\n ignoreEvent(event: Event): boolean {\n if (event.type === 'keydown') {\n const key = (event as KeyboardEvent).key;\n if (key === 'Backspace' || key === 'Delete') {\n const nativeSel = window.getSelection();\n if (nativeSel && !nativeSel.isCollapsed && nativeSel.rangeCount > 0) {\n const range = nativeSel.getRangeAt(0);\n if (this.domElement && (!this.domElement.contains(range.startContainer) || !this.domElement.contains(range.endContainer))) {\n return false; // Let CM handle cross-boundary delete\n }\n }\n }\n }\n return true;\n }\n\n private saveContent(view: EditorView, editor: TableEditor): void {\n this.saveController.save(view, editor, {\n widgetId: this.widgetId,\n originalRange: {\n from: this.originalFrom,\n to: this.originalTo,\n },\n tableDom: this.domElement,\n });\n }\n}\n\nfunction shouldHandleNode(node: SyntaxNodeRef): boolean {\n return node.name === 'Table';\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction createWidget(state: CodeMirrorState, node: SyntaxNodeRef): TableWidget | undefined {\n const table = state.sliceDoc(node.from, node.to);\n try {\n return new TableWidget(table, state.facet(CodeMirrorState.readOnly), node.node, node.from, node.to);\n } catch (error: unknown) {\n console.error(`Could not instantiate TableEditor widget: ${getErrorMessage(error)}`);\n return undefined;\n }\n}\n\nexport const renderTables = renderBlockWidgets(shouldHandleNode, createWidget);\n", "import type { EditorView } from '@codemirror/view';\nimport { EditorState } from '@codemirror/state';\nimport type TableEditor from './table-editor.ts';\nimport { tablePositions, updateTablePosition } from './table-position.ts';\nimport {\n findTableRangeByDom,\n isDocumentRangeInside,\n isTableRangeValid,\n type TableRange,\n} from './table-widget-position.ts';\n\ninterface TableWidgetSaveContext {\n widgetId: number;\n originalRange: TableRange;\n tableDom: HTMLElement | null;\n}\n\nexport class TableWidgetSaveController {\n private saveInProgress = false;\n\n save(view: EditorView, editor: TableEditor, context: TableWidgetSaveContext): void {\n if (this.saveInProgress || view.state.facet(EditorState.readOnly)) {\n return;\n }\n\n this.saveInProgress = true;\n\n try {\n const content = editor.getMarkdownTable();\n const range = this.resolveRange(view, context);\n if (!range) {\n return;\n }\n\n view.dispatch({\n changes: {\n from: range.from,\n to: range.to,\n insert: content,\n },\n effects: updateTablePosition.of({\n id: context.widgetId,\n from: range.from,\n to: range.from + content.length,\n }),\n });\n\n editor.markClean();\n } catch (error) {\n console.error('Error saving table content:', error);\n } finally {\n this.saveInProgress = false;\n }\n }\n\n private resolveRange(view: EditorView, context: TableWidgetSaveContext): TableRange | null {\n const rangeFromState = this.readRangeFromState(view, context.widgetId) ?? context.originalRange;\n if (isTableRangeValid(view.state, rangeFromState)) {\n return rangeFromState;\n }\n\n if (!context.tableDom) {\n console.error('Cannot resolve table position without DOM element.', { widgetId: context.widgetId });\n return null;\n }\n\n const fallbackRange = findTableRangeByDom(view, context.tableDom);\n if (!fallbackRange) {\n console.error('Cannot find table position from DOM fallback.', { widgetId: context.widgetId });\n return null;\n }\n\n if (!isDocumentRangeInside(view.state, fallbackRange)) {\n console.error('Resolved table range is outside document bounds.', {\n widgetId: context.widgetId,\n range: fallbackRange,\n docLength: view.state.doc.length,\n });\n return null;\n }\n\n return fallbackRange;\n }\n\n private readRangeFromState(view: EditorView, widgetId: number): TableRange | null {\n const positions = view.state.field(tablePositions, false);\n if (!positions) {\n return null;\n }\n\n const position = positions.get(widgetId);\n if (!position) {\n return null;\n }\n\n return {\n from: position.from,\n to: position.to,\n };\n }\n}\n", "import type { EditorState } from '@codemirror/state';\nimport type { EditorView } from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\n\nexport interface TableRange {\n from: number;\n to: number;\n}\n\nconst DOM_COORD_MATCH_THRESHOLD = 50;\n\nfunction isDocumentRangeValid(state: EditorState, range: TableRange): boolean {\n return !(range.from < 0 || range.to > state.doc.length || range.from >= range.to);\n}\n\nexport function isTableRangeValid(state: EditorState, range: TableRange): boolean {\n if (!isDocumentRangeValid(state, range)) {\n return false;\n }\n\n let isValid = false;\n syntaxTree(state).iterate({\n from: range.from,\n to: range.to,\n enter: (node) => {\n if (node.name === 'Table' && node.from === range.from && node.to === range.to) {\n isValid = true;\n return false;\n }\n },\n });\n\n return isValid;\n}\n\nexport function collectTableRanges(state: EditorState): TableRange[] {\n const tableRanges: TableRange[] = [];\n syntaxTree(state).iterate({\n enter: (nodeRef) => {\n if (nodeRef.name === 'Table') {\n tableRanges.push({\n from: nodeRef.from,\n to: nodeRef.to,\n });\n }\n },\n });\n\n return tableRanges;\n}\n\nexport function findTableRangeByDom(view: EditorView, tableDom: HTMLElement): TableRange | null {\n const tableRanges = collectTableRanges(view.state);\n if (tableRanges.length === 0) {\n return null;\n }\n\n if (tableRanges.length === 1) {\n return tableRanges[0];\n }\n\n const domRect = tableDom.getBoundingClientRect();\n for (const range of tableRanges) {\n const coords = view.coordsAtPos(range.from);\n if (!coords) {\n continue;\n }\n\n const distance = Math.abs(coords.top - domRect.top);\n if (distance < DOM_COORD_MATCH_THRESHOLD) {\n return range;\n }\n }\n\n return null;\n}\n\nexport function isDocumentRangeInside(state: EditorState, range: TableRange): boolean {\n return isDocumentRangeValid(state, range);\n}\n", "/**\n * Calculates the optimal width for each column in a table based on its content.\n * It handles both single-line and multi-line cells.\n */\n\n/**\n * Calculates the maximum width required for each column in a table AST.\n * @param ast A 2D string array representing the table structure.\n * @returns An array of numbers, where each number is the required width for that column.\n */\nexport default function calculateColSizes (ast: string[][]): number[] {\n const sizes: number[] = [];\n\n for (let col = 0; col < ast[0].length; col++) {\n let colSize = 0;\n for (let row = 0; row < ast.length; row++) {\n const cell = ast[row][col] || '';\n let cellLength = cell.length;\n if (cell.includes('\\n')) {\n // For multi-line cells, the width is determined by the longest line.\n cellLength = Math.max(...cell.split('\\n').map(x => x.length));\n }\n\n if (cellLength > colSize) {\n colSize = cellLength;\n }\n }\n sizes.push(colSize);\n }\n return sizes;\n}", "/**\n * Pipe table builder for converting a table AST into a formatted markdown string.\n * It handles column alignment, cell padding, and delimiter row generation.\n */\nimport calculateColSizes from './calculate-col-sizes.ts'\nimport type { ColAlignment } from './types.ts'\n\n/**\n * Builds a markdown pipe table string from a 2D array of cell contents.\n * @param ast A 2D string array representing the table (header and rows).\n * @param colAlignment An array specifying the alignment for each column.\n * @returns A formatted markdown table string.\n */\nexport default function buildPipeTable (ast: string[][], colAlignment: ColAlignment[]): string {\n if (ast.length < 2) {\n throw new Error('Cannot build pipe table: Must have at least two rows.')\n }\n\n // calculate the column sizes\n const colSizes = calculateColSizes(ast)\n\n // build the table in a quick MapReduce fashion\n const rows = ast.map(row => {\n const rowContents = row.map((col, idx) => {\n if (colAlignment[idx] === 'right') {\n return col.padStart(colSizes[idx], ' ')\n } else {\n return col.padEnd(colSizes[idx], ' ')\n }\n }).join(' | ')\n return `| ${rowContents} |`\n })\n\n // insert the required header row at index 2\n const headerRowContents = colSizes.map((size, idx) => {\n if (colAlignment[idx] === 'left') {\n return '-'.repeat(size + 2)\n } else if (colAlignment[idx] === 'center') {\n return ':' + '-'.repeat(size) + ':'\n } else {\n return '-'.repeat(size + 1) + ':'\n }\n }).join('|')\n\n const headerRow = `|${headerRowContents}|`\n rows.splice(1, 0, headerRow)\n\n return rows.join('\\n')\n}", "export function buildTableHelperStyles(edgeButtonSize: number): string {\n return `\n table.table-helper {\n width: 100%;\n display: inline-table;\n border: 0.5px solid rgba(60, 60, 67, 0.18);\n border-collapse: separate;\n border-spacing: 0;\n border-radius: 12px;\n overflow: hidden;\n background: #ffffff;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.02), 0 18px 38px rgba(0, 0, 0, 0.05);\n transition: border-color 0.18s ease, box-shadow 0.18s ease;\n }\n\n table.table-helper:hover {\n border-color: hsl(var(--color-primary-hsl) / 0.24);\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.02), 0 22px 44px rgba(0, 0, 0, 0.07);\n }\n\n table.table-helper tr:first-child {\n background: #f5f5f7;\n color: #1d1d1f;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: -0.005em;\n }\n\n table.table-helper tr:first-child td {\n border-right: 0.5px solid rgba(60, 60, 67, 0.10);\n }\n\n table.table-helper tr:first-child td:last-child {\n border-right: none;\n }\n\n table.table-helper tr:not(:first-child) {\n transition: background-color 0.14s ease;\n }\n\n table.table-helper tr:not(:first-child):hover {\n background: rgba(60, 60, 67, 0.025);\n }\n\n table.table-helper td {\n min-width: 150px;\n height: ${edgeButtonSize * 1.5}px;\n padding: 12px 16px;\n position: relative;\n border-bottom: 0.5px solid rgba(60, 60, 67, 0.10);\n border-right: 0.5px solid rgba(60, 60, 67, 0.10);\n color: #1d1d1f;\n caret-color: hsl(var(--color-primary-hsl));\n line-height: 1.55;\n transition: background-color 0.14s ease, box-shadow 0.14s ease;\n }\n\n table.table-helper td:last-child {\n border-right: none;\n }\n\n table.table-helper tr:last-child td {\n border-bottom: none;\n }\n\n table.table-helper td:focus {\n z-index: 1;\n outline: none;\n background: hsl(var(--color-primary-hsl) / 0.08);\n box-shadow:\n inset 0 0 0 1px hsl(var(--color-primary-hsl)),\n 0 0 0 3px hsl(var(--color-primary-hsl) / 0.14);\n }\n\n table.table-helper tr:first-child td:first-child {\n border-top-left-radius: 11px;\n }\n\n table.table-helper tr:first-child td:last-child {\n border-top-right-radius: 11px;\n }\n\n table.table-helper tr:last-child td:first-child {\n border-bottom-left-radius: 11px;\n }\n\n table.table-helper tr:last-child td:last-child {\n border-bottom-right-radius: 11px;\n }\n\n table.table-helper td em {\n font-style: italic;\n }\n\n table.table-helper td strong {\n color: #1d1d1f;\n font-weight: 600;\n }\n\n table.table-helper td code {\n padding: 2px 6px;\n border: 0.5px solid #d1d1d6;\n border-radius: 6px;\n background: #f2f2f7;\n color: #d70015;\n font-family: \"SF Mono\", ui-monospace, Menlo, Monaco, Consolas, monospace;\n font-size: 0.9em;\n }\n\n table.table-helper td del {\n text-decoration: line-through;\n opacity: 0.55;\n }\n\n table.table-helper td mark {\n padding: 2px 6px;\n border-radius: 6px;\n background: #fff2b2;\n color: #5f4b00;\n }\n\n table.table-helper td u {\n text-decoration: underline;\n text-decoration-color: hsl(var(--color-primary-hsl));\n text-decoration-thickness: 2px;\n text-underline-offset: 3px;\n }\n\n .table-helper-operate-button {\n z-index: 3;\n opacity: 0;\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 0.5px solid rgba(60, 60, 67, 0.18);\n background: rgba(255, 255, 255, 0.92);\n color: #6e6e73;\n box-shadow: 0 12px 28px rgba(0, 0, 0, 0.10);\n backdrop-filter: blur(24px) saturate(180%);\n -webkit-backdrop-filter: blur(24px) saturate(180%);\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n text-align: center;\n transition: opacity 0.18s ease, transform 0.18s cubic-bezier(0.16, 1, 0.3, 1), color 0.14s ease, border-color 0.14s ease, background-color 0.14s ease;\n }\n\n table.table-helper:hover .table-helper-operate-button,\n .table-helper-operate-button:hover {\n opacity: 1;\n }\n\n .table-helper-operate-button:hover {\n color: hsl(var(--color-primary-hsl));\n border-color: hsl(var(--color-primary-hsl) / 0.45);\n background: rgba(255, 255, 255, 1);\n transform: scale(1.06);\n }\n\n .table-helper-operate-button:active {\n transform: scale(0.94);\n }\n\n .table-helper-operate-button.top,\n .table-helper-operate-button.bottom {\n width: ${edgeButtonSize * 1.2}px;\n height: ${edgeButtonSize * 0.6}px;\n border-radius: ${edgeButtonSize * 0.3}px;\n }\n\n .table-helper-operate-button.left,\n .table-helper-operate-button.right {\n width: ${edgeButtonSize * 0.6}px;\n height: ${edgeButtonSize * 1.2}px;\n border-radius: ${edgeButtonSize * 0.3}px;\n }\n\n .dark table.table-helper {\n border-color: rgba(84, 84, 88, 0.5);\n background: #1c1c1e;\n box-shadow: 0 1px 0 rgba(255, 255, 255, 0.04), 0 22px 44px rgba(0, 0, 0, 0.42);\n }\n\n .dark table.table-helper:hover {\n border-color: hsl(var(--color-primary-light-hsl) / 0.34);\n box-shadow: 0 1px 0 rgba(255, 255, 255, 0.04), 0 26px 52px rgba(0, 0, 0, 0.5);\n }\n\n .dark table.table-helper tr:first-child {\n background: #2c2c2e;\n color: #f5f5f7;\n }\n\n .dark table.table-helper tr:first-child td,\n .dark table.table-helper td {\n border-right-color: rgba(84, 84, 88, 0.28);\n border-bottom-color: rgba(84, 84, 88, 0.28);\n }\n\n .dark table.table-helper tr:not(:first-child):hover {\n background: rgba(255, 255, 255, 0.025);\n }\n\n .dark table.table-helper td {\n color: #f5f5f7;\n caret-color: hsl(var(--color-primary-light-hsl));\n }\n\n .dark table.table-helper td:focus {\n background: hsl(var(--color-primary-light-hsl) / 0.16);\n box-shadow:\n inset 0 0 0 1px hsl(var(--color-primary-light-hsl)),\n 0 0 0 3px hsl(var(--color-primary-light-hsl) / 0.22);\n }\n\n .dark table.table-helper td strong {\n color: #ffffff;\n }\n\n .dark table.table-helper td code {\n border-color: #3a3a3c;\n background: #2c2c2e;\n color: #ff6482;\n }\n\n .dark table.table-helper td mark {\n background: #5f4b00;\n color: #fff2b2;\n }\n\n .dark table.table-helper td u {\n text-decoration-color: hsl(var(--color-primary-light-hsl));\n }\n\n .dark .table-helper-operate-button {\n border-color: rgba(84, 84, 88, 0.5);\n background: rgba(44, 44, 46, 0.94);\n color: #a1a1a6;\n box-shadow: 0 14px 32px rgba(0, 0, 0, 0.5);\n }\n\n .dark .table-helper-operate-button:hover {\n color: hsl(var(--color-primary-light-hsl));\n border-color: hsl(var(--color-primary-light-hsl) / 0.54);\n background: rgba(44, 44, 46, 1);\n }\n\n .tippy-box[data-theme~='custom'] {\n border: 0.5px solid rgba(60, 60, 67, 0.18);\n border-radius: 13px;\n background: rgba(255, 255, 255, 0.86);\n color: #1d1d1f;\n box-shadow: 0 24px 60px rgba(0, 0, 0, 0.14);\n backdrop-filter: blur(40px) saturate(180%);\n -webkit-backdrop-filter: blur(40px) saturate(180%);\n font-size: 13px;\n padding: 4px;\n }\n\n .tippy-box[data-theme~='custom'][data-placement^='bottom'] > .tippy-arrow::before {\n border-bottom-color: rgba(255, 255, 255, 0.86);\n }\n\n .tippy-box[data-theme~='custom'][data-placement^='top'] > .tippy-arrow::before {\n border-top-color: rgba(255, 255, 255, 0.86);\n }\n\n .tippy-box[data-theme~='custom'][data-placement^='right'] > .tippy-arrow::before {\n border-right-color: rgba(255, 255, 255, 0.86);\n }\n\n .tippy-box[data-theme~='custom'][data-placement^='left'] > .tippy-arrow::before {\n border-left-color: rgba(255, 255, 255, 0.86);\n }\n\n .tippy-box[data-theme~='custom'] .tippy-content {\n padding: 4px;\n }\n\n .tippy-button {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 34px;\n min-height: 34px;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: #6e6e73;\n cursor: pointer;\n padding: 8px 10px;\n font-size: 14px;\n transition: background-color 0.14s ease, color 0.14s ease, transform 0.12s ease;\n }\n\n .tippy-button:hover {\n background: rgba(60, 60, 67, 0.08);\n color: hsl(var(--color-primary-hsl));\n }\n\n .tippy-button:active {\n transform: scale(0.96);\n }\n\n .tippy-button i {\n display: block;\n width: 18px;\n height: 18px;\n }\n\n .alignment-options {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 4px;\n padding: 4px;\n }\n\n .alignment-options .tippy-button {\n aspect-ratio: 1;\n }\n\n .dark .tippy-box[data-theme~='custom'] {\n border-color: rgba(84, 84, 88, 0.5);\n background: rgba(28, 28, 30, 0.86);\n color: #f5f5f7;\n box-shadow: 0 28px 64px rgba(0, 0, 0, 0.56);\n }\n\n .dark .tippy-box[data-theme~='custom'][data-placement^='bottom'] > .tippy-arrow::before {\n border-bottom-color: rgba(28, 28, 30, 0.86);\n }\n\n .dark .tippy-box[data-theme~='custom'][data-placement^='top'] > .tippy-arrow::before {\n border-top-color: rgba(28, 28, 30, 0.86);\n }\n\n .dark .tippy-box[data-theme~='custom'][data-placement^='right'] > .tippy-arrow::before {\n border-right-color: rgba(28, 28, 30, 0.86);\n }\n\n .dark .tippy-box[data-theme~='custom'][data-placement^='left'] > .tippy-arrow::before {\n border-left-color: rgba(28, 28, 30, 0.86);\n }\n\n .dark .tippy-button {\n color: #a1a1a6;\n }\n\n .dark .tippy-button:hover {\n background: rgba(255, 255, 255, 0.08);\n color: hsl(var(--color-primary-light-hsl));\n }\n `;\n}\n", "import { buildTableHelperStyles } from './table-helper-styles';\n\n/**\n * Generates CSS styles for table helper interface.\n *\n * @param edgeButtonSize - Base size for table operation buttons (affects button dimensions and border radius)\n * @returns Style element containing all table helper CSS rules\n */\nexport default function computeCSS(edgeButtonSize: number): Element {\n const styleNode = document.createElement('style');\n styleNode.setAttribute('id', 'tableHelperCSS');\n styleNode.setAttribute('type', 'text/css');\n styleNode.textContent = buildTableHelperStyles(edgeButtonSize);\n\n return styleNode;\n}\n", "import { type TextNode } from './table-ast.ts'\n\n/**\n * Creates a generic text node; this is used to represent textual contents of\n * SyntaxNodes.\n *\n * @param {number} from The absolute start offset\n * @param {number} to The absolute end offset\n * @param {string} value The actual text\n * @param {string} whitespaceBefore Potential whitespace before the node\n *\n * @return {TextNode} The rendered TextNode\n */\nexport function genericTextNode (from: number, to: number, value: string, whitespaceBefore = ''): TextNode {\n return { type: 'Text', name: 'text', from, to, value, whitespaceBefore }\n}", "import {EditorState} from \"@codemirror/state\";\nimport {type SyntaxNode} from \"@lezer/common\";\nimport {parseNode as parse} from \"./table-ast.ts\";\nimport {type ParsedTable} from \"./types.ts\";\n\n/**\n * Checks if any of the selections within the given EditorState has overlap with\n * the provided range.\n *\n * @param {EditorState} state The state to draw selections from\n * @param {number} rangeFrom The start position of the range\n * @param {number} rangeTo The end position of the range\n *\n * @return {boolean} True if any selection overlaps\n */\nexport function rangeInSelection (state: EditorState, rangeFrom: number, rangeTo: number): boolean {\n return state.selection.ranges\n .map(range => [ range.from, range.to ])\n .filter(([ from, to ]) => !(to <= rangeFrom || from >= rangeTo))\n .length > 0\n}\n\n/**\n * Parses a syntax node of type \"Table\" into an AST & column alignments ready\n * for a TableEditor instance.\n *\n * @param {SyntaxNode} tableNode The table node\n * @param {string} markdown The full Markdown source to read the\n * contents from\n *\n * @return {ParsedTable} The parsed AST.\n */\nexport function parseNode (tableNode: SyntaxNode, markdown: string): ParsedTable | undefined {\n const ast = parse(tableNode, markdown)\n if (ast.type === 'Table') {\n const tableEditorAst = ast.rows.map(row => row.cells.map(cell => markdown.substring(cell.from, cell.to).trim()))\n\n if (tableEditorAst.length === 0) {\n throw new Error('Cannot instantiate TableEditor: Table had zero rows.')\n }\n\n return {\n ast: tableEditorAst,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n colAlignments: ast.alignment ?? tableEditorAst[0].map(_cell => 'left')\n }\n }\n}\n\n/**\n * Extracts any amount of whitespace (\\t\\s\\n\\r\\f\\v, etc.) that occurs before\n * this node.\n *\n * @param {SyntaxNode} node The node to extract whitespace for\n * @param {string} markdown The Markdown source to extract the whitespace\n *\n * @return {string} The whitespace string\n */\nexport function getWhitespaceBeforeNode (node: SyntaxNode, markdown: string): string {\n if (node.prevSibling !== null) {\n const sliceBefore = markdown.substring(node.prevSibling.to, node.from)\n const onlyWhitespace = /(\\s*)$/m.exec(sliceBefore) // NOTE the \"m\" flag\n return onlyWhitespace !== null ? onlyWhitespace[1] : ''\n } else if (node.parent !== null) {\n const sliceBefore = markdown.substring(node.parent.from, node.from)\n const onlyWhitespace = /(\\s*)$/m.exec(sliceBefore) // NOTE the \"m\" flag\n return onlyWhitespace !== null ? onlyWhitespace[1] : ''\n } else {\n return ''\n }\n}", "import type {SyntaxNode} from '@lezer/common'\nimport {type ASTNode, parseNode, type MDNode} from './table-ast.ts'\nimport {genericTextNode} from './generic-text-node.ts'\nimport {getWhitespaceBeforeNode} from \"./table-functions.ts\";\n\n/**\n * This list contains all Node names that do not themselves have any content.\n * These are either purely formatting nodes (such as heading marks or link\n * marks) who can be reconstructed without the verbatim value, as well as larger\n * container nodes (whose contents is represented via their children).\n *\n * @var {string[]}\n */\nconst EMPTY_NODES = [\n 'HeaderMark',\n 'CodeMark',\n 'EmphasisMark',\n 'SuperscriptMark',\n 'SubscriptMark',\n 'QuoteMark',\n 'ListMark',\n 'YAMLFrontmatterStart',\n 'YAMLFrontmatterEnd',\n 'Document',\n 'List',\n 'ListItem',\n 'PandocAttribute'\n]\n\n/**\n * Parses the children of ASTNodes who can have children.\n *\n * @param {T} astNode The AST node that must support children\n * @param {SyntaxNode} node The original Lezer SyntaxNode\n * @param {string} markdown The Markdown source\n *\n * @return {T} Returns the same astNode with children.\n */\nexport function parseChildren<T extends {\n children: ASTNode[]\n} & MDNode>(astNode: T, node: SyntaxNode, markdown: string): T {\n if (node.firstChild === null) {\n if (!EMPTY_NODES.includes(node.name)) {\n const textNode = genericTextNode(node.from, node.to, markdown.substring(node.from, node.to), getWhitespaceBeforeNode(node, markdown))\n astNode.children = [textNode]\n }\n return astNode // We're done\n }\n\n astNode.children = []\n\n let currentChild: SyntaxNode | null = node.firstChild\n let currentIndex = node.from\n while (currentChild !== null) {\n // NOTE: We have to account for \"gaps\" where a node has children that do not\n // completely cover the node's contents. In that case, we have to add text\n // nodes that just contain those strings.\n if (currentChild.from > currentIndex && !EMPTY_NODES.includes(node.name)) {\n const gap = markdown.substring(currentIndex, currentChild.from)\n const onlyWhitespace = /^(\\s*)/m.exec(gap)\n const whitespaceBefore = onlyWhitespace !== null ? onlyWhitespace[1] : ''\n const textNode = genericTextNode(\n currentIndex,\n currentChild.from,\n gap.substring(whitespaceBefore.length),\n whitespaceBefore\n )\n astNode.children.push(textNode)\n }\n astNode.children.push(parseNode(currentChild, markdown))\n currentIndex = currentChild.to // Must happen before the nextSibling assignment\n currentChild = currentChild.nextSibling\n }\n\n if (currentIndex < node.to && !EMPTY_NODES.includes(node.name)) {\n // One final text node\n const textNode = genericTextNode(currentIndex, node.to, markdown.substring(currentIndex, node.to))\n astNode.children.push(textNode)\n }\n\n return astNode\n}", "\n/**\n * Table node parser for markdown table AST conversion\n *\n * This module provides functionality to parse Lezer SyntaxNodes representing\n * markdown tables into a structured AST (Abstract Syntax Tree) format. It handles\n * both pipe tables and grid tables, extracting cell contents, determining column\n * alignments, and organizing table structure for further processing.\n *\n * Key features:\n * - Extracts table header and row data from syntax nodes\n * - Determines column alignment from delimiter rows\n * - Handles empty cells and table delimiters\n * - Creates structured AST representation with position information\n */\nimport {type SyntaxNode} from '@lezer/common'\nimport type {Table, TableRow, TableCell} from './table-ast.ts'\nimport {genericTextNode} from './generic-text-node.ts'\nimport {getWhitespaceBeforeNode} from \"./table-functions.ts\";\nimport {parseChildren} from \"./parse-children.ts\";\n\n/**\n * Parses a SyntaxNode of name \"Table\"\n *\n * @param {SyntaxNode} node The node to parse\n * @param {string} markdown The original Markdown source\n *\n * @return {Table} The parsed Table AST node\n */\nexport function parseTableNode(node: SyntaxNode, markdown: string): Table {\n const astNode: Table = {\n type: 'Table',\n name: 'Table',\n from: node.from,\n to: node.to,\n whitespaceBefore: getWhitespaceBeforeNode(node, markdown),\n rows: []\n }\n\n const header = node.getChildren('TableHeader')\n const rows = node.getChildren('TableRow')\n\n // The parser cannot reliably extract the table delimiters, but we need\n // those for the column alignment. Thus, we need to see if we can find the\n // header row (pipe tables) or a delimiter row (grid tables) in order to\n // determine the column alignments.\n for (const line of markdown.substring(node.from, node.to).split('\\n')) {\n if (!/^[|+:-]+$/.test(line)) {\n continue\n }\n\n // The plus indicates a special Pandoc-type of pipe table\n const splitter = line.includes('+') ? '+' : '|'\n astNode.alignment = line.split(splitter)\n // NOTE: |-|-| will result in ['', '-', '-', ''] -> filter out\n .filter(c => c.length > 0)\n .map(c => {\n if (c.startsWith('|')) {\n c = c.substring(1)\n }\n if (c.endsWith('|')) {\n c = c.substring(0, c.length - 1)\n }\n if (c.startsWith(':') && c.endsWith(':')) {\n return 'center'\n } else if (c.endsWith(':')) {\n return 'right'\n } else {\n return 'left'\n }\n })\n break\n } // Else: Couldn't determine either column alignment nor table type\n\n // Now, transform the rows.\n for (const row of [...header, ...rows]) {\n const rowNode: TableRow = {\n type: 'TableRow',\n name: row.name,\n from: row.from,\n to: row.to,\n whitespaceBefore: '',\n isHeaderOrFooter: row.name === 'TableHeader',\n cells: []\n }\n\n let next = row.firstChild\n let lastDelimPos = -1 // Track the position of the last delimiter\n while (next !== null) {\n if (next.name === 'TableDelimiter') {\n if (lastDelimPos !== -1) {\n // Create an empty cell for each delimiter we encounter after the first\n const cellNode: TableCell = {\n type: 'TableCell',\n name: 'TableCell',\n from: lastDelimPos,\n to: next.from,\n whitespaceBefore: '',\n children: [\n genericTextNode(lastDelimPos, next.from, markdown.slice(lastDelimPos, next.from))\n ]\n }\n rowNode.cells.push(cellNode)\n }\n lastDelimPos = next.to\n } else if (next.name === 'TableCell') {\n // Reset lastDelimPos as we've encountered a non-empty cell\n lastDelimPos = -1\n const cellNode: TableCell = {\n type: 'TableCell',\n name: 'TableCell',\n from: next.from,\n to: next.to,\n whitespaceBefore: '',\n children: []\n }\n parseChildren(cellNode, next, markdown)\n rowNode.cells.push(cellNode)\n } else {\n console.warn(`Could not fully parse Table node: Unexpected node \"${next.name}\" in row.`)\n }\n next = next.nextSibling\n }\n\n // Handle case where the row ends with empty cells\n if (lastDelimPos !== -1 && row.to > lastDelimPos) {\n const cellNode: TableCell = {\n type: 'TableCell',\n name: 'TableCell',\n from: lastDelimPos,\n to: row.to,\n whitespaceBefore: '',\n children: [\n genericTextNode(lastDelimPos, row.to, markdown.slice(lastDelimPos, row.to))\n ]\n }\n rowNode.cells.push(cellNode)\n }\n\n astNode.rows.push(rowNode)\n }\n return astNode\n}", "import { type SyntaxNode } from '@lezer/common'\nimport { parseTableNode } from './parse-table-node.ts'\nimport { parseChildren } from './parse-children.ts'\nimport { getWhitespaceBeforeNode } from \"./table-functions.ts\"\nimport { markdown } from \"@codemirror/lang-markdown\"\nimport { languages } from \"@codemirror/language-data\"\nimport { GFM } from \"@lezer/markdown\"\nimport { Mark } from \"../mark-parser\"\nimport { Underline } from \"../underline-parser\"\nimport { Strikethrough } from \"../strikethrough-parser\"\n\n/**\n * Basic info every ASTNode needs to provide\n */\nexport interface MDNode {\n /**\n * The node.name property (may differ from the type; significant mainly for\n * generics)\n */\n name: string\n /**\n * The start offset of this node in the original source\n */\n from: number\n /**\n * The end offset of this node in the original source\n */\n to: number\n /**\n * This property contains the whitespace before this node; required to\n * determine appropriate significant whitespace portions for some elements\n * upon converting to HTML.\n */\n whitespaceBefore: string\n /**\n * Can be used to store arbitrary attributes (e.g. Pandoc-style attributes\n * such as {.className})\n */\n attributes?: Record<string, string>\n}\n\n/**\n * Represents a single table cell\n */\nexport interface TableCell extends MDNode {\n type: 'TableCell'\n /**\n * The text content of the cell TODO: Arbitrary children!\n */\n children: ASTNode[]\n}\n\n/**\n * Represents a table row.\n */\nexport interface TableRow extends MDNode {\n type: 'TableRow'\n /**\n * This is set to true if the row is a header.\n */\n isHeaderOrFooter: boolean\n /**\n * A list of cells within this row\n */\n cells: TableCell[]\n}\n\nexport interface TableHeader extends MDNode {\n type: 'TableHeader'\n /**\n * This is set to true if the row is a header.\n */\n isHeaderOrFooter: boolean\n /**\n * A list of cells within this row\n */\n cells: TableCell[]\n}\n\n/**\n * Represents a table element.\n */\nexport interface Table extends MDNode {\n type: 'Table'\n /**\n * A list of rows of this table\n */\n rows: TableRow[]\n /**\n * A list of column alignments in the table. May be undefined; the default is\n * for all columns to be left-aligned.\n */\n alignment?: Array<'left'|'center'|'right'>\n}\n\n/**\n * A generic text node that can represent a string of content. Most nodes\n * contain at least one TextNode as its content (e.g. emphasis).\n */\nexport interface TextNode extends MDNode {\n type: 'Text'\n /**\n * The string value of the text node.\n */\n value: string\n}\n\n/**\n * This generic node represents any Lezer node that has no specific role (or can\n * be handled without additional care). This ensures that new nodes will always\n * end up in the resulting AST, even if we forgot to add the node specifically.\n */\nexport interface GenericNode extends MDNode {\n type: 'Generic'\n /**\n * Each generic node may have children\n */\n children: ASTNode[]\n}\n\n/**\n * Any node that can be part of the AST is an ASTNode.\n */\nexport type ASTNode = Table | TableCell | TableRow | TextNode | GenericNode\n\n/**\n * Parses a single Lezer style SyntaxNode to an ASTNode.\n *\n * @param {SyntaxNode} node The node to convert\n * @param {string} markdown The Markdown source, required to extract the\n * actual text content of the SyntaxNodes,\n * which isn't stored in the nodes themselves.\n *\n * @return {ASTNode} The root node of a Markdown AST\n */\nexport function parseNode (node: SyntaxNode, markdown: string): ASTNode {\n if (node.name === 'Table') {\n return parseTableNode(node, markdown)\n } else {\n const astNode: GenericNode = {\n type: 'Generic',\n name: node.name,\n from: node.from,\n to: node.to,\n whitespaceBefore: getWhitespaceBeforeNode(node, markdown),\n children: []\n }\n return parseChildren(astNode, node, markdown)\n }\n}\n\n// Create a markdown parser with all extensions enabled\nconst markdownWithExtensions = markdown({\n codeLanguages: languages,\n extensions: [GFM, Mark, Underline, Strikethrough],\n addKeymap: false,\n})\n\nexport function markdownToAST (markdown: string): ASTNode {\n const { parser } = markdownWithExtensions.language\n const tree = parser.parse(markdown)\n return parseNode(tree.topNode, markdown)\n}", "import { markdownToAST } from './table-ast.ts'\nimport { type ASTNode, type GenericNode } from './table-ast.ts'\n\n/**\n * Represents an HTML tag. This is a purposefully shallow representation\n */\ninterface HTMLTag {\n /**\n * The tag name for the resulting HTML tag\n */\n tagName: string\n /**\n * Self closing are, e.g., <hr>\n */\n selfClosing: boolean\n /**\n * A simple map of attributes (e.g., ['class', 'my-class'])\n */\n attributes: Array<[ string, string ]>\n}\n\n/**\n * This function looks at a GenericNode and returns information regarding the\n * tag that the node should result in.\n *\n * @param {GenericNode} node The input node\n *\n * @return {HTMLTag} The HTML tag information\n */\nfunction getTagInfo (node: GenericNode): HTMLTag {\n const ret: HTMLTag = {\n tagName: 'div',\n selfClosing: false,\n attributes: []\n }\n\n if (node.name === 'HorizontalRule') {\n ret.tagName = 'hr'\n ret.selfClosing = true\n } else if (node.name === 'Paragraph') {\n ret.tagName = 'p'\n } else if (node.name === 'FencedCode' || node.name === 'InlineCode') {\n ret.tagName = 'code'\n } else if (node.name === 'Emphasis') {\n ret.tagName = 'em'\n } else if (node.name === 'StrongEmphasis') {\n ret.tagName = 'strong'\n } else if (node.name === 'Strikethrough') {\n ret.tagName = 'del'\n } else if (node.name === 'Mark') {\n ret.tagName = 'mark'\n } else if (node.name === 'Underline') {\n ret.tagName = 'u'\n } else if (node.children.length === 1) {\n ret.tagName = 'span'\n }\n\n if ([ 'span', 'div', 'p' ].includes(ret.tagName)) {\n ret.attributes.push([ 'class', node.name ])\n }\n\n return ret\n}\n\n/**\n * Takes a Markdown AST node and turns it to an HTML string\n *\n * @param {ASTNode} node The node\n * @param {number} indent The indentation for this node\n *\n * @return {string} The HTML string\n */\nfunction nodeToHTML (node: ASTNode|ASTNode[], indent: number = 0): string {\n // Convenience to convert a list of child nodes to HTML\n if (Array.isArray(node)) {\n const body: string[] = []\n for (const child of node) {\n body.push(nodeToHTML(child, indent))\n }\n return body.join('')\n } else if (node.type === 'Generic' && node.name === 'Document') {\n // This ensures there's no outer div class=Document\n return nodeToHTML(node.children, indent)\n } else if (node.type === 'Table') {\n const rows: string[] = []\n let maxCells = 0\n\n // First calculate the maximum number of columns\n for (const row of node.rows) {\n maxCells = Math.max(maxCells, row.cells.length)\n }\n\n for (const row of node.rows) {\n const cells: string[] = []\n for (let i = 0; i < maxCells; i++) {\n if (i < row.cells.length) {\n cells.push(nodeToHTML(row.cells[i].children, indent))\n } else {\n cells.push('') // Add empty content for missing cells\n }\n }\n const tag = row.isHeaderOrFooter ? 'th' : 'td'\n const content = cells.map(c => `<${tag}>${c}</${tag}>`).join('\\n')\n if (row.isHeaderOrFooter) {\n rows.push(`${row.whitespaceBefore}<thead>\\n<tr>\\n${content}\\n</tr>\\n</thead>`)\n } else {\n rows.push(`${row.whitespaceBefore}<tr>\\n${content}\\n</tr>`)\n }\n }\n return `${node.whitespaceBefore}<table>\\n${rows.join('\\n')}\\n</table>`\n } else if (node.type === 'Text') {\n return node.whitespaceBefore + node.value // Plain text\n } else if (node.type === 'Generic') {\n // Skip rendering marker nodes (StrikethroughMarker, MarkMarker, UnderlineMarker)\n if (node.name === 'StrikethroughMarker' || node.name === 'MarkMarker' || node.name === 'UnderlineMarker') {\n return '' // Don't render the markers themselves\n }\n\n // Generic nodes are differentiated by name. There are a few we can support,\n // but most we wrap in a div.\n const tagInfo = getTagInfo(node)\n\n if ([ 'div', 'span' ].includes(tagInfo.tagName) && node.children.length === 0) {\n return '' // Simplify the resulting HTML by removing empty elements\n }\n\n const attr = tagInfo.attributes.length > 0\n ? ' ' + tagInfo.attributes.map(a => `${a[0]}=\"${a[1]}\"`).join(' ')\n : ''\n\n const open = `${node.whitespaceBefore}<${tagInfo.tagName}${attr}${tagInfo.selfClosing ? '/' : ''}>`\n const close = tagInfo.selfClosing ? '' : `</${tagInfo.tagName}>`\n const body = tagInfo.selfClosing ? '' : nodeToHTML(node.children)\n return `${open}${body}${close}`\n }\n\n return ''\n}\n\n/**\n * Takes Markdown source and turns it into a valid HTML fragment. The citeLibrary\n * will be used to resolve citations.\n *\n * @param {string} markdown The Markdown source\n *\n * @return {string} The resulting HTML\n */\nexport function md2html (markdown: string): string {\n const ast = markdownToAST(markdown)\n return nodeToHTML(ast)\n}", "\n/**\n * Constants for table editor functionality\n */\n\n/**\n * Table sizing constants\n */\nexport const TABLE_SIZING = {\n /** Default edge button size in pixels */\n EDGE_BUTTON_SIZE: 30,\n /** Minimum column width in pixels */\n MIN_COLUMN_WIDTH: 50,\n /** Default column width in pixels */\n DEFAULT_COLUMN_WIDTH: 150,\n /** Maximum column width in pixels */\n MAX_COLUMN_WIDTH: 800,\n} as const;\n\n/**\n * CSS class names for table elements\n */\nexport const TABLE_CSS_CLASSES = {\n /** Main table helper class */\n HELPER: 'table-helper',\n /** Operate button class */\n OPERATE_BUTTON: 'table-helper-operate-button',\n /** Top button class */\n TOP_BUTTON: 'top',\n /** Left button class */\n LEFT_BUTTON: 'left',\n /** Right button class */\n RIGHT_BUTTON: 'right',\n /** Bottom button class */\n BOTTOM_BUTTON: 'bottom',\n /** Active cell class */\n ACTIVE_CELL: 'active',\n /** Header row class */\n HEADER_ROW: 'header-row',\n} as const;\n\n/**\n * HTML entities and symbols\n */\nexport const TABLE_SYMBOLS = {\n /** Vertical ellipsis (\u22EE) */\n VERTICAL_ELLIPSIS: '&#8942;',\n /** Horizontal ellipsis (\u22EF) */\n HORIZONTAL_ELLIPSIS: '&#8943;',\n} as const;\n\n/**\n * Column alignment types\n */\nexport const COLUMN_ALIGNMENTS = {\n LEFT: 'left',\n CENTER: 'center',\n RIGHT: 'right',\n NONE: 'none',\n} as const;\n", "import tippy, { type Instance as TippyInstance } from 'tippy.js';\nimport {\n createIcons,\n type Icons,\n AlignCenter,\n AlignLeft,\n AlignRight,\n ArrowDownToLine,\n ArrowLeftToLine,\n ArrowRightToLine,\n ArrowUpToLine,\n Trash2,\n} from 'lucide';\nimport type { ColAlignment } from './types';\n\nconst ICON_SIZE = {\n width: '16',\n height: '16',\n};\n\ninterface TableActionPopoverHandlers {\n prependRow: () => void;\n appendRow: () => void;\n pluckRow: () => void;\n prependCol: () => void;\n appendCol: () => void;\n pluckCol: () => void;\n changeColAlignment: (alignment: ColAlignment) => void;\n}\n\ninterface TableActionPopoverOptions {\n rowAnchor: HTMLElement;\n columnAnchor: HTMLElement;\n handlers: TableActionPopoverHandlers;\n onCommit: () => void;\n}\n\ninterface ActionConfig {\n icon: string;\n title: string;\n action: (event: MouseEvent) => void;\n}\n\nfunction createActionButton(action: ActionConfig): HTMLButtonElement {\n const button = document.createElement('button');\n button.innerHTML = `<i data-lucide=\"${action.icon}\"></i>`;\n button.title = action.title;\n button.className = 'tippy-button';\n button.addEventListener('click', action.action);\n return button;\n}\n\nfunction createPopoverContainer(): HTMLDivElement {\n const container = document.createElement('div');\n container.style.display = 'flex';\n container.style.gap = '5px';\n container.style.padding = '5px';\n return container;\n}\n\nfunction mountIcons(iconSet: Icons): void {\n setTimeout(() => {\n createIcons({\n icons: iconSet,\n attrs: ICON_SIZE,\n });\n }, 0);\n}\n\nexport class TableEditorActionsPopover {\n private tippyInstance: TippyInstance | null = null;\n\n constructor(private readonly options: TableActionPopoverOptions) {}\n\n destroy(): void {\n this.tippyInstance?.destroy();\n this.tippyInstance = null;\n }\n\n showRowActions(): void {\n this.destroy();\n const content = this.createRowActionsContent();\n this.tippyInstance = tippy(this.options.rowAnchor, {\n content,\n interactive: true,\n theme: 'custom',\n placement: 'right',\n trigger: 'manual',\n arrow: true,\n });\n this.tippyInstance.show();\n }\n\n showColumnActions(): void {\n this.destroy();\n const content = this.createColumnActionsContent();\n this.tippyInstance = tippy(this.options.columnAnchor, {\n content,\n interactive: true,\n theme: 'custom',\n placement: 'bottom',\n trigger: 'manual',\n arrow: true,\n });\n this.tippyInstance.show();\n }\n\n private createRowActionsContent(): HTMLElement {\n const container = createPopoverContainer();\n const actions: ActionConfig[] = [\n {\n icon: 'arrow-up-to-line',\n title: 'Insert row above',\n action: () => {\n this.options.handlers.prependRow();\n this.tippyInstance?.hide();\n this.options.onCommit();\n },\n },\n {\n icon: 'arrow-down-to-line',\n title: 'Insert row below',\n action: () => {\n this.options.handlers.appendRow();\n this.tippyInstance?.hide();\n this.options.onCommit();\n },\n },\n {\n icon: 'trash-2',\n title: 'Delete this row',\n action: () => {\n this.options.handlers.pluckRow();\n this.tippyInstance?.hide();\n this.options.onCommit();\n },\n },\n ];\n\n for (const action of actions) {\n container.appendChild(createActionButton(action));\n }\n\n mountIcons({ ArrowUpToLine, ArrowDownToLine, Trash2 });\n return container;\n }\n\n private createColumnActionsContent(): HTMLElement {\n const container = createPopoverContainer();\n const actions: ActionConfig[] = [\n {\n icon: 'arrow-left-to-line',\n title: 'Insert column to the left',\n action: () => {\n this.options.handlers.prependCol();\n this.tippyInstance?.hide();\n this.options.onCommit();\n },\n },\n {\n icon: 'arrow-right-to-line',\n title: 'Insert column to the right',\n action: () => {\n this.options.handlers.appendCol();\n this.tippyInstance?.hide();\n this.options.onCommit();\n },\n },\n {\n icon: 'trash-2',\n title: 'Delete this column',\n action: () => {\n this.options.handlers.pluckCol();\n this.tippyInstance?.hide();\n this.options.onCommit();\n },\n },\n {\n icon: 'align-center',\n title: 'Alignment',\n action: (event) => this.showAlignmentOptions(event.currentTarget as HTMLElement),\n },\n ];\n\n for (const action of actions) {\n container.appendChild(createActionButton(action));\n }\n\n mountIcons({ ArrowLeftToLine, ArrowRightToLine, Trash2, AlignCenter });\n return container;\n }\n\n private showAlignmentOptions(target: HTMLElement): void {\n const alignmentContainer = createPopoverContainer();\n alignmentContainer.className = 'alignment-options';\n\n const alignments: Array<{\n icon: string;\n title: string;\n alignment: ColAlignment;\n }> = [\n {\n icon: 'align-left',\n title: 'Align left',\n alignment: 'left',\n },\n {\n icon: 'align-center',\n title: 'Align center',\n alignment: 'center',\n },\n {\n icon: 'align-right',\n title: 'Align right',\n alignment: 'right',\n },\n ];\n\n for (const alignOption of alignments) {\n const button = createActionButton({\n icon: alignOption.icon,\n title: alignOption.title,\n action: () => {\n this.options.handlers.changeColAlignment(alignOption.alignment);\n this.tippyInstance?.hide();\n this.options.onCommit();\n },\n });\n alignmentContainer.appendChild(button);\n }\n\n const instance = tippy(target, {\n content: alignmentContainer,\n interactive: true,\n theme: 'custom',\n placement: 'bottom',\n trigger: 'manual',\n arrow: true,\n });\n instance.show();\n\n mountIcons({ AlignLeft, AlignCenter, AlignRight });\n }\n}\n", "import { TABLE_CSS_CLASSES, TABLE_SYMBOLS } from './constants';\n\ninterface TableBoundsOptions {\n event: MouseEvent;\n table: HTMLTableElement;\n edgeButtonSize: number;\n}\n\ninterface ButtonPositionContext {\n table: HTMLTableElement;\n rowIndex: number;\n cellIndex: number;\n container: HTMLElement;\n}\n\nconst OFFSCREEN_POSITION = '-1000px';\nconst BUTTON_OFFSET_SCALE = 0.6;\nconst CENTER_SCALE = 1.2;\nconst EDGE_BUTTON_SPACING = 5;\n\nfunction isPointInsideExpandedRect({ event, table, edgeButtonSize }: TableBoundsOptions): boolean {\n const rect = table.getBoundingClientRect();\n const minX = rect.left - edgeButtonSize;\n const minY = rect.top - edgeButtonSize;\n const maxX = minX + rect.width + edgeButtonSize * 2;\n const maxY = minY + rect.height + edgeButtonSize * 2;\n\n return (\n event.clientX >= minX &&\n event.clientX <= maxX &&\n event.clientY >= minY &&\n event.clientY <= maxY\n );\n}\n\nfunction createEdgeButton(className: string, symbol: string): HTMLDivElement {\n const button = document.createElement('div');\n button.classList.add(TABLE_CSS_CLASSES.OPERATE_BUTTON, className);\n button.innerHTML = symbol;\n return button;\n}\n\nexport class TableEditorEdgeButtons {\n readonly addTopButton: HTMLDivElement;\n readonly addLeftButton: HTMLDivElement;\n\n constructor(private readonly edgeButtonSize: number) {\n this.addTopButton = createEdgeButton(TABLE_CSS_CLASSES.TOP_BUTTON, TABLE_SYMBOLS.HORIZONTAL_ELLIPSIS);\n this.addLeftButton = createEdgeButton(TABLE_CSS_CLASSES.LEFT_BUTTON, TABLE_SYMBOLS.VERTICAL_ELLIPSIS);\n }\n\n get visible(): boolean {\n return this.addTopButton.parentElement !== null && this.addLeftButton.parentElement !== null;\n }\n\n show(): void {\n if (this.visible) {\n return;\n }\n document.body.appendChild(this.addTopButton);\n document.body.appendChild(this.addLeftButton);\n }\n\n hide(): void {\n this.addTopButton.parentElement?.removeChild(this.addTopButton);\n this.addLeftButton.parentElement?.removeChild(this.addLeftButton);\n }\n\n hideOffscreen(): void {\n this.addTopButton.style.top = OFFSCREEN_POSITION;\n this.addLeftButton.style.top = OFFSCREEN_POSITION;\n }\n\n shouldDisplayForMouseEvent(options: TableBoundsOptions): boolean {\n return isPointInsideExpandedRect(options);\n }\n\n reposition({ table, rowIndex, cellIndex, container }: ButtonPositionContext): void {\n const currentCell = table.rows[rowIndex]?.cells[cellIndex];\n if (!currentCell) {\n this.hide();\n return;\n }\n\n const currentRow = table.rows[rowIndex];\n const currentColumn = Array.from(table.rows).map((row) => row.cells[cellIndex]);\n\n const cellRect = currentCell.getBoundingClientRect();\n const rowRect = currentRow.getBoundingClientRect();\n const columnTop = Math.min(...currentColumn.map((cell) => cell.getBoundingClientRect().top));\n const containerRect = container.getBoundingClientRect();\n\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n\n const cellIsOnScreen = cellRect.top > containerRect.top && cellRect.bottom < containerRect.bottom;\n\n if (!cellIsOnScreen) {\n this.hideOffscreen();\n return;\n }\n\n const topButtonTop = scrollTop + columnTop - this.edgeButtonSize * BUTTON_OFFSET_SCALE - EDGE_BUTTON_SPACING;\n const topButtonLeft =\n scrollLeft + cellRect.left + cellRect.width / 2 - (this.edgeButtonSize * CENTER_SCALE) / 2;\n this.addTopButton.style.top = `${topButtonTop}px`;\n this.addTopButton.style.left = `${topButtonLeft}px`;\n\n const leftButtonTop =\n scrollTop + rowRect.top + rowRect.height / 2 - (this.edgeButtonSize * CENTER_SCALE) / 2;\n const leftButtonLeft =\n scrollLeft + rowRect.left - this.edgeButtonSize * BUTTON_OFFSET_SCALE - EDGE_BUTTON_SPACING;\n this.addLeftButton.style.top = `${leftButtonTop}px`;\n this.addLeftButton.style.left = `${leftButtonLeft}px`;\n }\n}\n", "import type { ColAlignment } from './types.ts';\n\nfunction assertAlignment(alignment: ColAlignment): void {\n if (!['left', 'center', 'right'].includes(alignment)) {\n throw new Error(`Wrong column alignment provided! ${alignment}`);\n }\n}\n\nexport class TableEditorModel {\n private readonly ast: string[][];\n private readonly colAlignments: ColAlignment[];\n\n constructor(ast: string[][], alignments: ColAlignment[]) {\n this.ast = ast;\n this.colAlignments = alignments;\n }\n\n get rows(): number {\n return this.ast.length;\n }\n\n get cols(): number {\n return this.ast[0]?.length ?? 0;\n }\n\n getSnapshot(): string {\n return JSON.stringify(this.ast);\n }\n\n getTableData(): string[][] {\n return this.ast;\n }\n\n getAlignments(): ColAlignment[] {\n return this.colAlignments;\n }\n\n getRow(rowIndex: number): string[] {\n return this.ast[rowIndex];\n }\n\n getCell(rowIndex: number, colIndex: number): string {\n return this.ast[rowIndex][colIndex];\n }\n\n setCell(rowIndex: number, colIndex: number, value: string): void {\n this.ast[rowIndex][colIndex] = value;\n }\n\n getColumnAlignment(colIndex: number): ColAlignment {\n return this.colAlignments[colIndex];\n }\n\n prependColumn(colIndex: number): void {\n for (const row of this.ast) {\n row.splice(colIndex, 0, '');\n }\n this.colAlignments.splice(colIndex, 0, 'left');\n }\n\n appendColumn(colIndex: number): void {\n this.prependColumn(colIndex + 1);\n }\n\n prependRow(rowIndex: number): void {\n this.ast.splice(rowIndex, 0, this.createEmptyRow());\n }\n\n appendRow(rowIndex: number): void {\n this.ast.splice(rowIndex + 1, 0, this.createEmptyRow());\n }\n\n removeRow(rowIndex: number): boolean {\n if (this.rows === 1) {\n return false;\n }\n this.ast.splice(rowIndex, 1);\n return true;\n }\n\n removeColumn(colIndex: number): boolean {\n if (this.cols === 1) {\n return false;\n }\n\n for (const row of this.ast) {\n row.splice(colIndex, 1);\n }\n\n this.colAlignments.splice(colIndex, 1);\n return true;\n }\n\n updateColumnAlignment(colIndex: number, alignment: ColAlignment): void {\n assertAlignment(alignment);\n\n if (colIndex >= this.cols || colIndex < 0) {\n throw new Error(`Could not align column - Index out of bounds: ${colIndex}`);\n }\n\n this.colAlignments[colIndex] = alignment;\n }\n\n private createEmptyRow(): string[] {\n return new Array(this.cols).fill('');\n }\n}\n", "export interface TableCursor {\n rowIndex: number;\n colIndex: number;\n}\n\nexport function moveToPreviousCell(cursor: TableCursor, colCount: number): TableCursor | null {\n if (cursor.colIndex === 0 && cursor.rowIndex === 0) {\n return null;\n }\n\n const previousCol = cursor.colIndex - 1;\n if (previousCol >= 0) {\n return {\n rowIndex: cursor.rowIndex,\n colIndex: previousCol,\n };\n }\n\n return {\n rowIndex: cursor.rowIndex - 1,\n colIndex: colCount - 1,\n };\n}\n\nexport function moveToNextCell(cursor: TableCursor, colCount: number): TableCursor {\n const nextCol = cursor.colIndex + 1;\n if (nextCol < colCount) {\n return {\n rowIndex: cursor.rowIndex,\n colIndex: nextCol,\n };\n }\n\n return {\n rowIndex: cursor.rowIndex + 1,\n colIndex: 0,\n };\n}\n\nexport function moveToPreviousRow(cursor: TableCursor): TableCursor | null {\n if (cursor.rowIndex === 0) {\n return null;\n }\n return {\n rowIndex: cursor.rowIndex - 1,\n colIndex: cursor.colIndex,\n };\n}\n\nexport function moveToNextRow(cursor: TableCursor): TableCursor {\n return {\n rowIndex: cursor.rowIndex + 1,\n colIndex: cursor.colIndex,\n };\n}\n", "import type { TableEditorOptions } from './types.ts';\n\nexport function resolveTableEditorContainer(options: TableEditorOptions): HTMLElement {\n if (options.container instanceof HTMLElement) {\n return options.container;\n }\n\n if (typeof options.container === 'string') {\n const target = document.querySelector(options.container);\n if (target === null) {\n throw new Error(`Could not find element using selector ${options.container}`);\n }\n return target as HTMLElement;\n }\n\n return document.body;\n}\n", "export function selectElementContents(node: Node, from: number = 0, to: number = 0): void {\n const sel = window.getSelection()\n // From MDN: Firefox may return null, other browsers may return a Selection\n // with type None\n if (sel === null || sel.type === 'None') {\n return\n }\n\n // From MDN: \"If the startNode is a Node of type Text, Comment, or CDataSection,\n // then startOffset is the number of characters from the start of startNode. For\n // other Node types, startOffset is the number of child nodes between the start\n // of the startNode.\"\n // Therefore: Ensure that the node is a text node so that from and to actually\n // refer to characters, and not to nodes.\n if (node.nodeType !== Node.TEXT_NODE) {\n const maybeTextNode = [...node.childNodes].find(child => child.nodeType === Node.TEXT_NODE) as Text | undefined\n if (maybeTextNode !== undefined) {\n node = maybeTextNode\n }\n }\n\n // Normalize the requested caret positions\n const maxLength = node.textContent?.length ?? 0\n if (from > maxLength) {\n from = maxLength // Setting to maxLength puts the cursor AFTER the last char\n }\n\n if (to > maxLength) {\n to = maxLength\n }\n\n const range = document.createRange()\n range.setStart(node, from)\n range.setEnd(node, to)\n\n // Reset the selection\n sel.removeAllRanges()\n sel.addRange(range)\n}", "import { md2html } from './markdown-to-html';\nimport { selectElementContents } from './select-in-element';\nimport type { TableEditorModel } from './table-editor-model';\n\nexport type TableSelection = 'start' | 'end' | { from: number; to: number };\n\ninterface RebuildEditableTableDomOptions {\n table: HTMLTableElement;\n model: TableEditorModel;\n readOnly?: boolean;\n onCellFocus: (cell: HTMLTableCellElement) => void;\n onCellBlur: (cell: HTMLTableCellElement) => void;\n onCellKeyDown?: (event: KeyboardEvent, cell: HTMLTableCellElement) => void;\n}\n\nexport function rebuildEditableTableDom(options: RebuildEditableTableDomOptions): void {\n const { table, model, readOnly = false, onCellFocus, onCellBlur, onCellKeyDown } = options;\n table.innerHTML = '';\n const tbody = table.createTBody();\n\n for (let rowIndex = 0; rowIndex < model.rows; rowIndex += 1) {\n const row = tbody.insertRow(-1);\n row.style.width = '100%';\n\n const rowData = model.getRow(rowIndex);\n for (let colIndex = 0; colIndex < rowData.length; colIndex += 1) {\n const cell = row.insertCell(-1);\n cell.innerHTML = md2html(rowData[colIndex]);\n cell.style.textAlign = model.getColumnAlignment(colIndex);\n cell.setAttribute('contenteditable', readOnly ? 'false' : 'true');\n if (readOnly) {\n cell.setAttribute('aria-readonly', 'true');\n }\n\n cell.addEventListener('focus', () => {\n onCellFocus(cell);\n });\n\n cell.addEventListener('blur', () => {\n onCellBlur(cell);\n });\n\n cell.addEventListener('keydown', (event) => {\n onCellKeyDown?.(event, cell);\n });\n }\n }\n}\n\ninterface SelectEditableCellOptions {\n table: HTMLTableElement;\n rowIndex: number;\n cellIndex: number;\n where: TableSelection;\n}\n\nexport function selectEditableCell(options: SelectEditableCellOptions): boolean {\n const { table, rowIndex, cellIndex, where } = options;\n\n if (!table.contains(document.activeElement)) {\n return false;\n }\n\n const currentRow = table.rows[rowIndex];\n const currentCell = currentRow?.cells[cellIndex];\n if (!currentCell) {\n return false;\n }\n\n currentCell.focus();\n const textLength = currentCell.textContent?.length ?? 0;\n\n if (where === 'start') {\n selectElementContents(currentCell);\n } else if (where === 'end') {\n selectElementContents(currentCell, textLength, textLength);\n } else {\n selectElementContents(currentCell, where.from, where.to);\n }\n\n setTimeout(() => currentCell.focus(), 10);\n return true;\n}\n", "import buildPipeTable from './build-pipe.ts';\nimport computeCSS from './compute-css.ts';\nimport type { ColAlignment, TableEditorOptions } from './types.ts';\nimport { md2html } from './markdown-to-html.ts';\nimport { TABLE_CSS_CLASSES, TABLE_SIZING } from './constants';\nimport { TableEditorActionsPopover } from './table-editor-actions-popover';\nimport { TableEditorEdgeButtons } from './table-editor-edge-buttons';\nimport { TableEditorModel } from './table-editor-model.ts';\nimport {\n moveToNextCell,\n moveToNextRow,\n moveToPreviousCell,\n moveToPreviousRow,\n} from './table-editor-navigation.ts';\nimport { resolveTableEditorContainer } from './table-editor-container.ts';\nimport {\n rebuildEditableTableDom,\n selectEditableCell,\n type TableSelection,\n} from './table-editor-dom.ts';\n\nconst BLUR_DELAY_MS = 50;\n\nexport default class TableEditor {\n private _rowIndex = 0;\n private _cellIndex = 0;\n private _eventLock = false;\n private _isClean = true;\n private _lastSeenTable: string;\n private _lastMousemoveEvent: MouseEvent | undefined;\n private _pendingBlur: number | null = null;\n\n private readonly _options: TableEditorOptions;\n private readonly _containerElement: HTMLElement;\n private readonly _elem: HTMLTableElement;\n private readonly _model: TableEditorModel;\n private readonly _edgeButtons: TableEditorEdgeButtons;\n private readonly _actionsPopover: TableEditorActionsPopover;\n private readonly _edgeButtonSize: number;\n\n constructor(ast: string[][], alignments: ColAlignment[], options: TableEditorOptions = {}) {\n this._options = options;\n this._model = new TableEditorModel(ast, alignments);\n this._lastSeenTable = this._model.getSnapshot();\n this._edgeButtonSize = TABLE_SIZING.EDGE_BUTTON_SIZE;\n\n this._containerElement = resolveTableEditorContainer(options);\n\n this._elem = document.createElement('table');\n this._elem.classList.add(TABLE_CSS_CLASSES.HELPER);\n\n this._edgeButtons = new TableEditorEdgeButtons(this._edgeButtonSize);\n this._actionsPopover = new TableEditorActionsPopover({\n rowAnchor: this._edgeButtons.addLeftButton,\n columnAnchor: this._edgeButtons.addTopButton,\n handlers: {\n prependRow: () => this.prependRow(),\n appendRow: () => this.appendRow(),\n pluckRow: () => this.pluckRow(),\n prependCol: () => this.prependCol(),\n appendCol: () => this.appendCol(),\n pluckCol: () => this.pluckCol(),\n changeColAlignment: (alignment) => this.changeColAlignment(alignment),\n },\n onCommit: () => {\n this._options.saveIntent?.(this);\n },\n });\n\n this._rebuildDOMElement();\n if (!this._options.readOnly) {\n this._bindContainerEvents();\n this._bindEdgeButtonEvents();\n }\n this._injectCSS();\n }\n\n private _bindContainerEvents(): void {\n this._containerElement.addEventListener('mouseover', (event) => {\n this._moveHelper(event);\n this._lastMousemoveEvent = event;\n });\n\n this._containerElement.addEventListener('mousedown', (event) => {\n this._clickHelper(event);\n this._lastMousemoveEvent = event;\n });\n\n this._containerElement.addEventListener('mouseover', (event) => {\n if (this._lastMousemoveEvent !== event) {\n this._hideAllButtons();\n }\n });\n }\n\n private _bindEdgeButtonEvents(): void {\n this._edgeButtons.addTopButton.addEventListener('mousedown', (event) => {\n event.preventDefault();\n this._actionsPopover.showColumnActions();\n });\n\n this._edgeButtons.addLeftButton.addEventListener('mousedown', (event) => {\n event.preventDefault();\n this._actionsPopover.showRowActions();\n });\n }\n\n _moveHelper(event: MouseEvent): void {\n if (\n this._edgeButtons.shouldDisplayForMouseEvent({\n event,\n table: this._elem,\n edgeButtonSize: this._edgeButtonSize,\n })\n ) {\n this._recalculateEdgeButtonPositions();\n return;\n }\n\n this._hideAllButtons();\n }\n\n _clickHelper(event: MouseEvent): void {\n if (\n this._edgeButtons.shouldDisplayForMouseEvent({\n event,\n table: this._elem,\n edgeButtonSize: this._edgeButtonSize,\n })\n ) {\n this._showEdgeButtons();\n this._recalculateEdgeButtonPositions();\n return;\n }\n\n this._hideAllButtons();\n }\n\n _rebuildDOMElement(): void {\n this._eventLock = true;\n rebuildEditableTableDom({\n table: this._elem,\n model: this._model,\n readOnly: this._options.readOnly,\n onCellFocus: (cell) => this._onCellFocus(cell),\n onCellBlur: (cell) => this._onCellBlur(cell),\n onCellKeyDown: (event, cell) => this._onCellKeyDown(event, cell),\n });\n this._eventLock = false;\n\n this.selectCell('start');\n }\n\n _onCellBlur(cell: HTMLTableCellElement): void {\n if (this._eventLock || this._options.readOnly) {\n return;\n }\n\n if (this._pendingBlur !== null) {\n clearTimeout(this._pendingBlur);\n this._pendingBlur = null;\n }\n\n const col = cell.cellIndex;\n const row = (cell.parentElement as HTMLTableRowElement).rowIndex;\n\n const newContent = cell.textContent ?? '';\n this._model.setCell(row, col, newContent);\n cell.innerHTML = md2html(newContent);\n\n this._signalContentChange();\n\n this._pendingBlur = window.setTimeout(() => {\n this._pendingBlur = null;\n const activeElement = document.activeElement;\n const isInCurrentTable = activeElement && this._elem.contains(activeElement);\n\n if (!isInCurrentTable && !this._isClean) {\n this._options.onBlur?.(this);\n }\n }, BLUR_DELAY_MS);\n }\n\n _onCellFocus(cell: HTMLTableCellElement): void {\n if (this._eventLock || this._options.readOnly) {\n return;\n }\n\n if (this._pendingBlur !== null) {\n clearTimeout(this._pendingBlur);\n this._pendingBlur = null;\n }\n\n const col = cell.cellIndex;\n const row = (cell.parentElement as HTMLTableRowElement).rowIndex;\n\n cell.innerHTML = this._model.getCell(row, col);\n\n this._rowIndex = row;\n this._cellIndex = col;\n\n this._recalculateEdgeButtonPositions();\n }\n\n _onCellKeyDown(event: KeyboardEvent, cell: HTMLTableCellElement): void {\n if (this._options.readOnly) {\n return;\n }\n\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'a') {\n event.preventDefault();\n selectEditableCell({\n table: this._elem,\n rowIndex: (cell.parentElement as HTMLTableRowElement).rowIndex,\n cellIndex: cell.cellIndex,\n where: {\n from: 0,\n to: cell.textContent?.length ?? 0,\n },\n });\n return;\n }\n\n if (event.key === 'Tab') {\n event.preventDefault();\n if (event.shiftKey) {\n this.previousCell();\n } else {\n this.nextCell();\n }\n return;\n }\n\n if (event.key === 'Enter' && !event.altKey && !event.metaKey && !event.ctrlKey) {\n event.preventDefault();\n if (event.shiftKey) {\n this.previousRow();\n } else {\n this.nextRow();\n }\n }\n }\n\n _recalculateEdgeButtonPositions(): void {\n this._edgeButtons.reposition({\n table: this._elem,\n rowIndex: this._rowIndex,\n cellIndex: this._cellIndex,\n container: this._containerElement,\n });\n }\n\n _showEdgeButtons(): void {\n if (this._options.readOnly) {\n return;\n }\n this._edgeButtons.show();\n this._recalculateEdgeButtonPositions();\n }\n\n _hideAllButtons(): void {\n this._actionsPopover.destroy();\n this._edgeButtons.hide();\n }\n\n get _edgeButtonsVisible(): boolean {\n return this._edgeButtons.visible;\n }\n\n get domElement(): HTMLTableElement {\n return this._elem;\n }\n\n _signalContentChange(): void {\n const currentTable = this._model.getSnapshot();\n if (currentTable === this._lastSeenTable && this._isClean) {\n return;\n }\n\n this._lastSeenTable = currentTable;\n this._isClean = false;\n\n this._options.onChange?.(this);\n }\n\n getMarkdownTable(): string {\n return buildPipeTable(this._model.getTableData(), this._model.getAlignments());\n }\n\n markClean(): void {\n this._isClean = true;\n }\n\n previousCell(): void {\n if (this._options.readOnly) {\n return;\n }\n const previous = moveToPreviousCell(\n {\n rowIndex: this._rowIndex,\n colIndex: this._cellIndex,\n },\n this._model.cols\n );\n\n if (!previous) {\n return;\n }\n\n this._rowIndex = previous.rowIndex;\n this._cellIndex = previous.colIndex;\n\n this.selectCell('end');\n this._options.onCellChange?.(this);\n }\n\n nextCell(automaticallyAddRows = true): void {\n if (this._options.readOnly) {\n return;\n }\n const next = moveToNextCell(\n {\n rowIndex: this._rowIndex,\n colIndex: this._cellIndex,\n },\n this._model.cols\n );\n\n if (next.rowIndex === this._model.rows) {\n if (automaticallyAddRows) {\n this.appendRow();\n } else {\n return;\n }\n }\n\n this._rowIndex = next.rowIndex;\n this._cellIndex = next.colIndex;\n\n this.selectCell('end');\n this._options.onCellChange?.(this);\n }\n\n previousRow(): void {\n if (this._options.readOnly) {\n return;\n }\n const previous = moveToPreviousRow({\n rowIndex: this._rowIndex,\n colIndex: this._cellIndex,\n });\n\n if (!previous) {\n return;\n }\n\n this._rowIndex = previous.rowIndex;\n this.selectCell('end');\n this._options.onCellChange?.(this);\n }\n\n nextRow(automaticallyAddRows = true): void {\n if (this._options.readOnly) {\n return;\n }\n const next = moveToNextRow({\n rowIndex: this._rowIndex,\n colIndex: this._cellIndex,\n });\n\n if (next.rowIndex === this._model.rows) {\n if (automaticallyAddRows) {\n this.appendRow();\n } else {\n return;\n }\n }\n\n this._rowIndex = next.rowIndex;\n this.selectCell('end');\n this._options.onCellChange?.(this);\n }\n\n prependCol(): void {\n if (this._options.readOnly) {\n return;\n }\n this._model.prependColumn(this._cellIndex);\n this._rebuildDOMElement();\n this._signalContentChange();\n }\n\n appendCol(): void {\n if (this._options.readOnly) {\n return;\n }\n this._model.appendColumn(this._cellIndex);\n this._rebuildDOMElement();\n\n this.nextCell();\n this._signalContentChange();\n }\n\n prependRow(): void {\n if (this._options.readOnly) {\n return;\n }\n this._model.prependRow(this._rowIndex);\n this._rebuildDOMElement();\n this._signalContentChange();\n }\n\n appendRow(): void {\n if (this._options.readOnly) {\n return;\n }\n this._model.appendRow(this._rowIndex);\n this._rebuildDOMElement();\n\n this.nextRow();\n this._recalculateEdgeButtonPositions();\n this._signalContentChange();\n }\n\n pluckRow(): void {\n if (this._options.readOnly) {\n return;\n }\n const rowToRemove = this._rowIndex;\n const firstRow = rowToRemove === 0;\n\n if (!this._model.removeRow(rowToRemove)) {\n return;\n }\n\n if (firstRow) {\n this._rowIndex += 1;\n } else {\n this._rowIndex -= 1;\n }\n\n this.selectCell('start');\n this._rebuildDOMElement();\n\n if (firstRow) {\n this._rowIndex = 0;\n this.selectCell('start');\n }\n\n this._signalContentChange();\n this._options.onCellChange?.(this);\n }\n\n pluckCol(): void {\n if (this._options.readOnly) {\n return;\n }\n const colToRemove = this._cellIndex;\n const firstCol = colToRemove === 0;\n\n if (!this._model.removeColumn(colToRemove)) {\n return;\n }\n\n if (firstCol) {\n this._cellIndex = 1;\n } else {\n this._cellIndex -= 1;\n }\n\n this.selectCell('start');\n this._rebuildDOMElement();\n\n if (firstCol) {\n this._cellIndex = 0;\n this.selectCell('start');\n }\n\n this._signalContentChange();\n this._options.onCellChange?.(this);\n }\n\n changeColAlignment(alignment: ColAlignment, col: number = this._cellIndex): void {\n if (this._options.readOnly) {\n return;\n }\n this._model.updateColumnAlignment(col, alignment);\n\n for (let row = 0; row < this._model.rows; row += 1) {\n this._elem.rows[row].cells[col].style.textAlign = alignment;\n }\n\n this._signalContentChange();\n this._options.onCellChange?.(this);\n }\n\n selectCell(where: TableSelection = 'end'): void {\n if (\n !selectEditableCell({\n table: this._elem,\n rowIndex: this._rowIndex,\n cellIndex: this._cellIndex,\n where,\n })\n ) {\n return;\n }\n\n this._recalculateEdgeButtonPositions();\n }\n\n _injectCSS(): void {\n if (document.getElementById('tableHelperCSS') !== null) {\n return;\n }\n\n const styleElement = computeCSS(this._edgeButtonSize);\n document.head.prepend(styleElement);\n }\n}\n", "import type { SyntaxNode } from '@lezer/common';\nimport TableEditor from './table-editor.ts';\nimport { parseNode } from './table-functions.ts';\nimport type { TableEditorOptions } from './types.ts';\n\nexport function createTableEditorFromSyntaxNode(\n tableNode: SyntaxNode,\n markdown: string,\n options: TableEditorOptions = {}\n): TableEditor {\n const parsed = parseNode(tableNode, markdown);\n if (!parsed) {\n throw new Error('Could not parse table node');\n }\n\n return new TableEditor(parsed.ast, parsed.colAlignments, options);\n}\n", "import type { Extension } from '@codemirror/state';\nimport { imageExtension } from '../image';\nimport { latexExtension } from '../latex';\nimport { markdownSyntaxHiding } from '../markdown-syntax-hiding';\nimport { mermaidExtension } from '../mermaid';\nimport { tableExtension } from '../table';\n\nconst wysiwygExtensionFactories: ReadonlyArray<() => Extension> = [\n tableExtension,\n imageExtension,\n mermaidExtension,\n latexExtension,\n markdownSyntaxHiding,\n];\n\n/**\n * WYSIWYG extension preset.\n * Built from factory functions to avoid accidental mutation.\n */\nexport const wysiwygExtensions: Extension[] = wysiwygExtensionFactories.map((factory) => factory());\n\nexport function resolveWysiwygExtensions(enabled: boolean): Extension[] {\n if (!enabled) {\n return [];\n }\n return [...wysiwygExtensions];\n}\n", "import type { Extension } from '@codemirror/state';\nimport type { Theme } from '../../core';\nimport { darkTheme, lightTheme } from '../../theme/base-theme';\n\nconst themeExtensionMap: Record<Theme, Extension> = {\n light: lightTheme,\n dark: darkTheme,\n};\n\nexport function resolveThemeExtension(theme: Theme): Extension {\n return themeExtensionMap[theme];\n}\n", "import type { Extension } from '@codemirror/state';\nimport { EditorView, type ViewUpdate } from '@codemirror/view';\n\nexport interface EditorLifecycleCallbacks {\n onChange?: (update: ViewUpdate) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n}\n\nexport function createEditorLifecycleListener(callbacks: EditorLifecycleCallbacks): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n callbacks.onChange?.(update);\n\n if (!update.focusChanged) {\n return;\n }\n\n if (update.view.hasFocus) {\n callbacks.onFocus?.();\n return;\n }\n\n callbacks.onBlur?.();\n });\n}\n", "import type { Extension } from '@codemirror/state';\nimport { EditorView, type ViewUpdate } from '@codemirror/view';\nimport type {\n MoondownPlugin,\n MoondownSlashCommand,\n MoondownPluginViewContext,\n ResolvedEditorConfig,\n} from '../../core';\n\ninterface EditorPluginRuntimeOptions {\n plugins: ReadonlyArray<MoondownPlugin>;\n config: ResolvedEditorConfig;\n initialDoc: string;\n}\n\ninterface HookedPlugin {\n plugin: MoondownPlugin;\n viewContext: MoondownPluginViewContext | null;\n}\n\nfunction toExtensionArray(result: Extension | Extension[] | void): Extension[] {\n if (!result) {\n return [];\n }\n return Array.isArray(result) ? [...result] : [result];\n}\n\nfunction getPluginLabel(plugin: MoondownPlugin): string {\n const trimmedName = plugin.name?.trim();\n if (trimmedName && trimmedName.length > 0) {\n return trimmedName;\n }\n return 'anonymous-plugin';\n}\n\nfunction withPluginErrorBoundary(\n plugin: MoondownPlugin,\n hookName: string,\n fn: () => void\n): void {\n try {\n fn();\n } catch (error) {\n console.error(`[MoondownPlugin:${getPluginLabel(plugin)}] ${hookName} failed`, error);\n }\n}\n\nexport class EditorPluginRuntime {\n private readonly preExtensions: Extension[] = [];\n private readonly postExtensions: Extension[] = [];\n private readonly slashCommands: MoondownSlashCommand[] = [];\n private readonly hookedPlugins: HookedPlugin[] = [];\n\n constructor({ plugins, config, initialDoc }: EditorPluginRuntimeOptions) {\n for (const plugin of plugins) {\n const hookedPlugin: HookedPlugin = {\n plugin,\n viewContext: null,\n };\n this.hookedPlugins.push(hookedPlugin);\n this.slashCommands.push(...this.collectSlashCommands(plugin));\n\n const setup = plugin.setup;\n if (!setup) {\n continue;\n }\n\n withPluginErrorBoundary(plugin, 'setup', () => {\n const result = setup({\n initialDoc,\n config,\n });\n const resolvedExtensions = toExtensionArray(result);\n if (plugin.order === 'pre') {\n this.preExtensions.push(...resolvedExtensions);\n return;\n }\n this.postExtensions.push(...resolvedExtensions);\n });\n }\n\n if (this.hookedPlugins.some(({ plugin }) => plugin.onUpdate)) {\n this.postExtensions.push(\n EditorView.updateListener.of((update: ViewUpdate) => {\n this.handleUpdate(update);\n })\n );\n }\n }\n\n get preRuntimeExtensions(): Extension[] {\n return [...this.preExtensions];\n }\n\n get postRuntimeExtensions(): Extension[] {\n return [...this.postExtensions];\n }\n\n get runtimeSlashCommands(): ReadonlyArray<MoondownSlashCommand> {\n return [...this.slashCommands];\n }\n\n bindView(view: EditorView, config: ResolvedEditorConfig): void {\n for (const hookedPlugin of this.hookedPlugins) {\n hookedPlugin.viewContext = {\n view,\n config,\n };\n }\n\n for (const { plugin, viewContext } of this.hookedPlugins) {\n if (!plugin.onViewCreated || !viewContext) {\n continue;\n }\n withPluginErrorBoundary(plugin, 'onViewCreated', () => {\n plugin.onViewCreated?.(viewContext);\n });\n }\n }\n\n destroy(): void {\n for (const { plugin, viewContext } of this.hookedPlugins) {\n if (!plugin.onDestroy || !viewContext) {\n continue;\n }\n withPluginErrorBoundary(plugin, 'onDestroy', () => {\n plugin.onDestroy?.(viewContext);\n });\n }\n }\n\n private handleUpdate(update: ViewUpdate): void {\n for (const { plugin, viewContext } of this.hookedPlugins) {\n if (!plugin.onUpdate || !viewContext) {\n continue;\n }\n withPluginErrorBoundary(plugin, 'onUpdate', () => {\n plugin.onUpdate?.(update, viewContext);\n });\n }\n }\n\n private collectSlashCommands(plugin: MoondownPlugin): MoondownSlashCommand[] {\n if (!plugin.slashCommands || plugin.slashCommands.length === 0) {\n return [];\n }\n\n const pluginLabel = getPluginLabel(plugin);\n const normalized: MoondownSlashCommand[] = [];\n\n plugin.slashCommands.forEach((command, index) => {\n if (!command || typeof command.execute !== 'function') {\n return;\n }\n\n const id = command.id?.trim() || `${pluginLabel}-slash-${index + 1}`;\n const fallbackTitle = command.titleKey?.trim() || id;\n const title = command.title?.trim() || fallbackTitle;\n const icon = command.icon?.trim() || 'puzzle';\n const keywords = (command.keywords ?? [])\n .map((keyword) => keyword.trim())\n .filter((keyword) => keyword.length > 0);\n\n const wrappedExecute: MoondownSlashCommand['execute'] = (view) => {\n try {\n const result = command.execute(view);\n if (result instanceof Promise) {\n return result.catch((error) => {\n console.error(`[MoondownPlugin:${pluginLabel}] slash command \"${id}\" failed`, error);\n });\n }\n return result;\n } catch (error) {\n console.error(`[MoondownPlugin:${pluginLabel}] slash command \"${id}\" failed`, error);\n return;\n }\n };\n\n normalized.push({\n ...command,\n id,\n title,\n icon,\n keywords,\n execute: wrappedExecute,\n });\n });\n\n return normalized;\n }\n}\n", "import type { EditorView } from '@codemirror/view';\nimport type { AIStreamHandler, EditorConfig, MoondownTranslations, Theme } from '../core';\nimport { normalizeEditorConfig, resolveInitialDocument } from './config/normalize-editor-config';\nimport { EditorRuntime } from './runtime/editor-runtime';\n\n/**\n * Public editor facade.\n * Keeps API stable while hiding internal extension/runtime composition details.\n */\nexport class MoondownEditor {\n public readonly view: EditorView;\n private readonly runtime: EditorRuntime;\n\n constructor(element: HTMLElement, initialDoc = '', config?: EditorConfig) {\n const resolvedConfig = normalizeEditorConfig(config);\n const resolvedInitialDoc = resolveInitialDocument(initialDoc, config);\n\n this.runtime = new EditorRuntime({\n element,\n initialDoc: resolvedInitialDoc,\n config: resolvedConfig,\n });\n\n this.view = this.runtime.editorView;\n }\n\n getValue(): string {\n return this.runtime.getValue();\n }\n\n setValue(value: string): void {\n this.runtime.setValue(value);\n }\n\n toggleSyntaxHiding(enabled: boolean): void {\n this.runtime.toggleSyntaxHiding(enabled);\n }\n\n setTheme(theme: Theme): void {\n this.runtime.setTheme(theme);\n }\n\n setReadOnly(enabled: boolean): void {\n this.runtime.setReadOnly(enabled);\n }\n\n setPlaceholder(text: string): void {\n this.runtime.setPlaceholder(text);\n }\n\n setAIStreamHandler(handler: AIStreamHandler): void {\n this.runtime.setAIStreamHandler(handler);\n }\n\n setTranslations(translations: MoondownTranslations): void {\n this.runtime.setTranslations(translations);\n }\n\n setLocale(locale: string): void {\n this.runtime.setLocale(locale);\n }\n\n getView(): EditorView {\n return this.view;\n }\n\n focus(): void {\n this.runtime.focus();\n }\n\n destroy(): void {\n this.runtime.destroy();\n }\n}\n", "import { MoondownEditor } from './editor/moondown-editor';\n\n/**\n * Backward-compatible public class name.\n * Internally delegates all responsibilities to the new facade/runtime architecture.\n */\nclass Moondown extends MoondownEditor {}\n\nexport default Moondown;\n", "import type { Extension } from '@codemirror/state';\nimport type {\n MoondownPlugin,\n MoondownPluginOrder,\n MoondownSlashCommand,\n} from '../core';\n\n/**\n * Type-safe plugin helper.\n * Use this to get autocomplete and compile-time validation for plugin hooks.\n */\nexport function defineMoondownPlugin<TPlugin extends MoondownPlugin>(plugin: TPlugin): TPlugin {\n return plugin;\n}\n\ninterface CreateExtensionPluginOptions {\n order?: MoondownPluginOrder;\n slashCommands?: ReadonlyArray<MoondownSlashCommand>;\n}\n\n/**\n * Shortcut for extension-only plugins.\n *\n * Useful when you only need to register CodeMirror extensions\n * without runtime hooks (`onViewCreated` / `onUpdate` / `onDestroy`).\n */\nexport function createExtensionPlugin(\n name: string,\n extension: Extension | Extension[],\n options?: CreateExtensionPluginOptions\n): MoondownPlugin {\n return defineMoondownPlugin({\n name,\n order: options?.order,\n slashCommands: options?.slashCommands,\n setup: () => extension,\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["scrollIntoView", "import_state", "import_view", "import_state", "import_view", "import_language", "import_lang_markdown", "import_commands", "import_autocomplete", "import_language_data", "import_markdown", "import_view", "import_state", "import_view", "import_state", "import_view", "import_state", "import_state", "import_view", "import_view", "import_state", "import_state", "import_view", "import_state", "import_view", "import_state", "import_state", "scrollIntoView", "scrollIntoView", "import_state", "import_language", "import_view", "import_state", "import_view", "import_state", "import_state", "import_view", "import_language", "import_view", "import_state", "import_language", "import_state", "import_view", "import_view", "import_state", "import_language", "import_view", "import_view", "import_view", "import_state", "import_state", "import_core", "import_lucide", "history", "import_lucide", "import_state", "import_view", "import_core", "markdown", "import_view", "import_state", "import_language", "expanded", "import_language", "import_view", "import_language", "import_language", "import_state", "import_view", "import_language", "import_state", "import_view", "shouldHandleNode", "createWidget", "latexLanguages", "import_state", "import_view", "import_language", "import_view", "import_view", "import_view", "import_state", "import_state", "import_view", "import_view", "import_state", "import_state", "import_view", "visibleMarkdown", "import_state", "import_view", "hiddenMarkdown", "visibleMarkdown", "import_language", "import_state", "import_view", "normalizeLanguageTag", "toErrorMessage", "renderStatus", "selectSourceBlock", "shouldHandleNode", "createWidget", "import_state", "import_state", "import_state", "import_view", "import_state", "import_language", "parseNode", "markdown", "markdown", "markdown", "markdown", "markdown", "import_lucide", "mountIcons", "tippy", "markdown", "parseNode", "shouldHandleNode", "createWidget", "CodeMirrorState", "import_view", "import_view", "viewPlaceholder"]
7
+ }