@domternal/core 0.2.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 @@
1
+ {"version":3,"sources":["../src/EventEmitter.ts","../src/helpers/callOrReturn.ts","../src/ExtensionManager.ts","../src/commands/selectionCommands.ts","../src/helpers/createDocument.ts","../src/helpers/isNodeEmpty.ts","../src/helpers/markInputRule.ts","../src/helpers/isValidUrl.ts","../src/helpers/ssr.ts","../src/helpers/getMarkRange.ts","../src/helpers/findParentNode.ts","../src/helpers/findChildren.ts","../src/helpers/defaultBlockAt.ts","../src/commands/contentCommands.ts","../src/Extension.ts","../src/helpers/specBuilder.ts","../src/Mark.ts","../src/commands/markCommands.ts","../src/commands/nodeCommands.ts","../src/commands/listCommands.ts","../src/commands/attributeCommands.ts","../src/commands/index.ts","../src/commandPropsBuilder.ts","../src/ChainBuilder.ts","../src/CanChecker.ts","../src/CommandManager.ts","../src/utils/inlineStyles.ts","../src/helpers/normalizeColor.ts","../src/Editor.ts","../src/utils/positionFloating.ts","../src/Node.ts","../src/ToolbarController.ts","../src/icons/phosphor.ts","../src/nodes/Document.ts","../src/nodes/Text.ts","../src/nodes/Paragraph.ts","../src/nodes/Heading.ts","../src/nodes/Blockquote.ts","../src/nodes/CodeBlock.ts","../src/extensions/ListKeymap.ts","../src/nodes/ListItem.ts","../src/nodes/BulletList.ts","../src/nodes/OrderedList.ts","../src/nodes/HorizontalRule.ts","../src/nodes/HardBreak.ts","../src/nodes/TaskItem.ts","../src/nodes/TaskList.ts","../src/marks/Bold.ts","../src/marks/Italic.ts","../src/marks/Underline.ts","../src/marks/Strike.ts","../src/marks/Code.ts","../src/marks/helpers/linkClickPlugin.ts","../src/marks/helpers/linkPastePlugin.ts","../src/marks/helpers/autolinkPlugin.ts","../src/marks/helpers/linkExitPlugin.ts","../src/marks/Link.ts","../src/marks/Subscript.ts","../src/marks/Superscript.ts","../src/marks/TextStyle.ts","../src/extensions/BaseKeymap.ts","../src/extensions/History.ts","../src/extensions/Dropcursor.ts","../src/extensions/Gapcursor.ts","../src/extensions/TrailingNode.ts","../src/extensions/Placeholder.ts","../src/extensions/CharacterCount.ts","../src/extensions/Typography.ts","../src/extensions/TextAlign.ts","../src/extensions/Focus.ts","../src/extensions/LineHeight.ts","../src/extensions/UniqueID.ts","../src/extensions/Selection.ts","../src/extensions/SelectionDecoration.ts","../src/extensions/InvisibleChars.ts","../src/extensions/TextColor.ts","../src/extensions/Highlight.ts","../src/extensions/FontFamily.ts","../src/extensions/FontSize.ts","../src/extensions/ClearFormatting.ts","../src/extensions/LinkPopover.ts","../src/extensions/BubbleMenu.ts","../src/extensions/FloatingMenu.ts","../src/extensions/StarterKit.ts","../src/index.ts"],"names":["createInputRulesPlugin","pmSelectNodeBackward","PMNode","find","document","PMDOMParser","offset","TextSelection","ProseMirrorDOMParser","allWrapped","from","to","$from","$to","range","target","allInTargetList","DOMSerializer","EditorState","keymap","textblockTypeInputRule","liftListItem","wrappingInputRule","InputRule","splitListItem","Selection","sinkListItem","PluginKey","Plugin","isNodeEmpty","DecorationSet","Decoration","Fragment","Slice","tr","PMSelection","hide","defaultShouldShow"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Callback type for event handlers\n * - Events with payload: (data: T) => void\n * - Events without payload (undefined): () => void\n */\ntype EventCallback<T> = T extends undefined ? () => void : (data: T) => void;\n\n/**\n * Generic, type-safe event emitter\n *\n * @example\n * ```typescript\n * interface MyEvents {\n * update: { value: number };\n * destroy: undefined;\n * }\n *\n * const emitter = new EventEmitter<MyEvents>();\n * emitter.on('update', ({ value }) => console.log(value));\n * emitter.on('destroy', () => console.log('destroyed'));\n * ```\n */\nexport class EventEmitter<Events extends { [K in keyof Events]: unknown } = Record<string, never>> {\n // Protected so Editor subclass can access if needed\n protected callbacks = new Map<keyof Events, Set<EventCallback<unknown>>>();\n\n /**\n * Register an event listener\n */\n on<E extends keyof Events>(event: E, callback: EventCallback<Events[E]>): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n listeners.add(callback as EventCallback<unknown>);\n } else {\n this.callbacks.set(event, new Set([callback as EventCallback<unknown>]));\n }\n\n return this;\n }\n\n /**\n * Remove an event listener, or all listeners for an event if no callback specified\n */\n off<E extends keyof Events>(event: E, callback?: EventCallback<Events[E]>): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n if (callback) {\n // Remove specific callback\n listeners.delete(callback as EventCallback<unknown>);\n\n // Clean up empty sets\n if (listeners.size === 0) {\n this.callbacks.delete(event);\n }\n } else {\n // Remove all listeners for this event\n this.callbacks.delete(event);\n }\n }\n\n return this;\n }\n\n /**\n * Emit an event to all registered listeners\n * Uses .call(this) to preserve context for callbacks\n */\n emit<E extends keyof Events>(\n event: E,\n ...args: Events[E] extends undefined ? [] : [Events[E]]\n ): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n listeners.forEach((callback) => {\n if (args.length > 0) {\n (callback as (data: unknown) => void).call(this, args[0]);\n } else {\n (callback as () => void).call(this);\n }\n });\n }\n\n return this;\n }\n\n /**\n * Register an event listener that fires only once\n */\n once<E extends keyof Events>(event: E, callback: EventCallback<Events[E]>): this {\n const onceWrapper = ((...args: unknown[]) => {\n this.off(event, onceWrapper);\n\n if (args.length > 0) {\n (callback as (data: unknown) => void).call(this, args[0]);\n } else {\n (callback as () => void).call(this);\n }\n }) as EventCallback<Events[E]>;\n\n return this.on(event, onceWrapper);\n }\n\n /**\n * Remove all listeners for a specific event, or all events if no event specified\n */\n removeAllListeners(event?: keyof Events): this {\n if (event !== undefined) {\n this.callbacks.delete(event);\n } else {\n this.callbacks.clear();\n }\n\n return this;\n }\n\n /**\n * Get the number of listeners for a specific event\n */\n listenerCount(event: keyof Events): number {\n return this.callbacks.get(event)?.size ?? 0;\n }\n\n /**\n * Get all event names that have listeners\n */\n eventNames(): (keyof Events)[] {\n return Array.from(this.callbacks.keys());\n }\n}\n","/**\n * callOrReturn - Helper for context binding in extension config\n *\n * Used to call config functions with proper `this` context,\n * or return the value directly if it's not a function.\n *\n * This enables patterns like:\n * ```typescript\n * const Bold = Mark.create({\n * name: 'bold',\n * addCommands() {\n * return {\n * toggleBold: () => ({ commands }) => {\n * return commands.toggleMark(this.name); // this.name = 'bold'\n * },\n * };\n * },\n * });\n * ```\n */\n\n/**\n * Calls a function with the given context, or returns the value if not a function\n *\n * @param value - Function to call or value to return\n * @param context - The `this` context to bind when calling the function\n * @param args - Additional arguments to pass to the function\n * @returns The function result or the value itself\n */\nexport function callOrReturn<T>(\n value: T | ((...args: unknown[]) => T),\n context: unknown,\n ...args: unknown[]\n): T {\n if (typeof value === 'function') {\n return (value as (...args: unknown[]) => T).call(context, ...args);\n }\n return value;\n}\n","/**\n * ExtensionManager - Manages extensions and schema\n *\n * Handles:\n * - Extension lifecycle (flatten, resolve, bind)\n * - Schema building from Node/Mark extensions\n * - Plugin collection from all extensions\n * - Extension storage management\n * - Conflict detection (AD-7)\n */\nimport { Schema } from '@domternal/pm/model';\nimport type { NodeSpec, MarkSpec } from '@domternal/pm/model';\nimport type { Plugin, Transaction } from '@domternal/pm/state';\nimport type { NodeViewConstructor } from '@domternal/pm/view';\nimport { keymap } from '@domternal/pm/keymap';\nimport { inputRules as createInputRulesPlugin } from '@domternal/pm/inputrules';\nimport type { InputRule } from '@domternal/pm/inputrules';\n\nimport type { Command as PMCommand } from '@domternal/pm/state';\n\nimport type { AnyExtension } from './types/EditorOptions.js';\nimport type { CommandMap } from './types/Commands.js';\nimport type { GlobalAttributes, GlobalAttributeSpec } from './types/ExtensionConfig.js';\nimport type { ToolbarItem } from './types/Toolbar.js';\nimport type { Extension } from './Extension.js';\nimport type { Node } from './Node.js';\nimport type { Mark } from './Mark.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\n\n/**\n * Error event props for safeCall\n */\ninterface ErrorEventProps {\n error: Error;\n context: string;\n}\n\n/**\n * Editor interface for ExtensionManager\n * Forward declaration to avoid circular dependency\n */\nexport interface ExtensionManagerEditor {\n readonly schema: Schema;\n emit?(event: 'error', props: ErrorEventProps): void;\n}\n\n/**\n * Options for ExtensionManager constructor\n */\nexport interface ExtensionManagerOptions {\n /**\n * Extensions to process\n * If provided, schema is built from extensions\n */\n extensions?: AnyExtension[] | undefined;\n\n /**\n * Direct schema (backward compatibility with Step 1.3)\n * If provided, extensions are ignored for schema building\n */\n schema?: Schema | undefined;\n}\n\n/**\n * Manages editor extensions and schema\n *\n * Supports two modes:\n * 1. Extensions mode: Schema built from Node/Mark extensions\n * 2. Schema mode: Direct schema passed (backward compatible)\n */\n/**\n * Merge HTML attribute objects, concatenating 'style' and 'class' values\n * instead of overwriting them.\n */\nfunction mergeHTMLAttrs(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...target };\n\n for (const [key, value] of Object.entries(source)) {\n if (key === 'style' && typeof result[key] === 'string' && typeof value === 'string') {\n result[key] = `${result[key]}; ${value}`;\n } else if (key === 'class' && typeof result[key] === 'string' && typeof value === 'string') {\n result[key] = `${result[key]} ${value}`;\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport class ExtensionManager {\n /**\n * Processed extensions (flattened, sorted by priority)\n */\n private readonly _extensions: AnyExtension[];\n\n /**\n * ProseMirror schema (built from extensions or passed directly)\n */\n private readonly _schema: Schema;\n\n /**\n * Reference to the editor instance\n */\n readonly editor: ExtensionManagerEditor;\n\n /**\n * Extension storage (keyed by extension name)\n */\n private readonly _storage: Record<string, unknown> = {};\n\n /**\n * Whether the manager has been destroyed\n */\n private isDestroyed = false;\n\n /**\n * Cached plugins (built lazily)\n */\n private _plugins: Plugin[] | null = null;\n\n /**\n * Cached commands (collected lazily)\n */\n private _commands: CommandMap | null = null;\n\n /**\n * Cached toolbar items (collected lazily)\n */\n private _toolbarItems: ToolbarItem[] | null = null;\n\n /**\n * Cached node views (collected lazily)\n */\n private _nodeViews: Record<string, NodeViewConstructor> | null = null;\n\n /**\n * Creates a new ExtensionManager\n *\n * @param options - Extensions or direct schema\n * @param editor - Editor instance\n */\n constructor(options: ExtensionManagerOptions, editor: ExtensionManagerEditor) {\n this.editor = editor;\n\n // Schema mode (backward compatibility)\n if (options.schema) {\n this._extensions = [];\n this._schema = options.schema;\n return;\n }\n\n // Extensions mode\n if (!options.extensions || options.extensions.length === 0) {\n throw new Error(\n 'ExtensionManager requires either extensions or schema. ' +\n 'Provide at least Document, Text, and Paragraph extensions.'\n );\n }\n\n // Process extensions following the pipeline:\n // 1. Flatten (expand addExtensions)\n // 2. Deduplicate (keep last occurrence — explicit configs override auto-included defaults)\n // 3. Resolve (sort by priority)\n // 4. Detect conflicts (AD-7)\n // 5. Check dependencies\n // 6. Bind editor to extensions\n // 7. Build schema\n // 8. Initialize storage\n\n const flattened = this.flattenExtensions(options.extensions);\n const deduped = this.deduplicateExtensions(flattened);\n this._extensions = this.resolveExtensions(deduped);\n this.detectConflicts();\n this.checkDependencies();\n this.bindEditorToExtensions();\n this._schema = this.buildSchema();\n this.initializeStorage();\n }\n\n // === Getters ===\n\n /**\n * Gets the processed extensions array\n */\n get extensions(): readonly AnyExtension[] {\n return this._extensions;\n }\n\n /**\n * Gets the ProseMirror schema\n */\n get schema(): Schema {\n return this._schema;\n }\n\n /**\n * Gets extension storage (accessed via editor.storage)\n */\n get storage(): Record<string, unknown> {\n return this._storage;\n }\n\n /**\n * Gets plugins from all extensions\n * Cached after first call\n */\n get plugins(): Plugin[] {\n this._plugins ??= this.buildPlugins();\n return this._plugins;\n }\n\n /**\n * Gets commands from all extensions\n */\n get commands(): CommandMap {\n this._commands ??= this.collectCommands();\n return this._commands;\n }\n\n /**\n * Gets toolbar items from all extensions\n * Cached after first call\n */\n get toolbarItems(): ToolbarItem[] {\n this._toolbarItems ??= this.collectToolbarItems();\n return this._toolbarItems;\n }\n\n /**\n * Gets node views from all Node extensions that define addNodeView\n */\n get nodeViews(): Record<string, NodeViewConstructor> {\n this._nodeViews ??= this.collectNodeViews();\n return this._nodeViews;\n }\n\n // === Cache Invalidation ===\n\n /**\n * Clears all caches (plugins, commands)\n * Call when extensions change dynamically\n */\n clearAllCaches(): void {\n this._plugins = null;\n this._commands = null;\n this._toolbarItems = null;\n this._nodeViews = null;\n }\n\n // === Extension Processing ===\n\n /**\n * Recursively flattens extensions by expanding addExtensions()\n * This allows extension bundles like StarterKit to work\n */\n private flattenExtensions(extensions: AnyExtension[]): AnyExtension[] {\n const result: AnyExtension[] = [];\n\n for (const ext of extensions) {\n result.push(ext);\n\n // Check for nested extensions (bundles like StarterKit)\n const nested = callOrReturn(\n (ext as Extension).config.addExtensions,\n ext\n ) as AnyExtension[] | undefined;\n\n if (nested && nested.length > 0) {\n result.push(...this.flattenExtensions(nested));\n }\n }\n\n return result;\n }\n\n /**\n * Removes duplicate extensions by name, keeping the last occurrence.\n * This allows parent extensions to auto-include children via addExtensions()\n * while letting users override with explicitly configured versions.\n */\n private deduplicateExtensions(extensions: AnyExtension[]): AnyExtension[] {\n const seen = new Map<string, number>();\n for (let i = 0; i < extensions.length; i++) {\n const ext = extensions[i];\n if (ext) seen.set(ext.name, i);\n }\n return extensions.filter((ext, i) => seen.get(ext.name) === i);\n }\n\n /**\n * Sorts extensions by priority (higher priority first)\n * Default priority is 100\n */\n private resolveExtensions(extensions: AnyExtension[]): AnyExtension[] {\n return [...extensions].sort((a, b) => {\n const priorityA = (a as Extension).config.priority ?? 100;\n const priorityB = (b as Extension).config.priority ?? 100;\n return priorityB - priorityA;\n });\n }\n\n /**\n * Detects duplicate extension names (AD-7: Schema Conflict Detection)\n * @throws Error if duplicate names found\n */\n private detectConflicts(): void {\n const names = new Set<string>();\n\n for (const ext of this._extensions) {\n if (names.has(ext.name)) {\n throw new Error(\n `Extension name conflict: \"${ext.name}\" is defined multiple times. ` +\n `Each extension must have a unique name.`\n );\n }\n names.add(ext.name);\n }\n }\n\n /**\n * Validates that all extension dependencies are present\n * @throws Error if required dependency is missing\n */\n private checkDependencies(): void {\n const extensionNames = new Set(this._extensions.map((e) => e.name));\n\n for (const ext of this._extensions) {\n const deps = (ext as Extension).config.dependencies;\n if (!deps) continue;\n\n for (const dep of deps) {\n if (!extensionNames.has(dep)) {\n throw new Error(\n `Extension \"${ext.name}\" requires \"${dep}\" extension. ` +\n `Please add it to your extensions array.`\n );\n }\n }\n }\n }\n\n /**\n * Sets editor reference on all extensions\n */\n private bindEditorToExtensions(): void {\n for (const ext of this._extensions) {\n (ext as Extension).editor = this.editor as ExtensionManagerEditor &\n Extension['editor'];\n }\n }\n\n /**\n * Collects global attributes from all extensions.\n * Returns a map of type name -> attribute specs to merge.\n */\n private collectGlobalAttributes(): Map<string, Record<string, GlobalAttributeSpec>> {\n const globalAttrs = new Map<string, Record<string, GlobalAttributeSpec>>();\n\n for (const ext of this._extensions) {\n const addGlobalAttributes = (ext as Extension).config.addGlobalAttributes;\n if (!addGlobalAttributes) continue;\n\n const attrs = this.safeCall(\n () => callOrReturn(addGlobalAttributes, ext) as GlobalAttributes[] | undefined,\n `${ext.name}.addGlobalAttributes`\n );\n\n if (!attrs) continue;\n\n for (const { types, attributes } of attrs) {\n for (const typeName of types) {\n const existing = globalAttrs.get(typeName) ?? {};\n globalAttrs.set(typeName, { ...existing, ...attributes });\n }\n }\n }\n\n return globalAttrs;\n }\n\n /**\n * Applies global attributes to a node or mark spec.\n * Merges extra attrs into spec.attrs, wraps parseDOM getAttrs to parse\n * global attributes from DOM elements, and wraps toDOM to inject rendered\n * global HTML attributes into the output.\n */\n private applyGlobalAttributes(\n spec: NodeSpec | MarkSpec,\n extraAttrs: Record<string, GlobalAttributeSpec>,\n ): void {\n // 1. Convert global attrs to PM attrs and merge\n const convertedAttrs: Record<string, { default?: unknown }> = {};\n for (const [attrName, attrSpec] of Object.entries(extraAttrs)) {\n convertedAttrs[attrName] = { default: attrSpec.default };\n }\n spec.attrs = { ...spec.attrs, ...convertedAttrs };\n\n // 2. Wrap parseDOM handlers to include global attribute parsing\n if (spec.parseDOM) {\n spec.parseDOM = spec.parseDOM.map((rule) => {\n const originalGetAttrs = rule.getAttrs as\n | ((dom: HTMLElement | string) => Record<string, unknown> | false | null)\n | undefined;\n return {\n ...rule,\n getAttrs: (dom: HTMLElement | string) => {\n const baseAttrs = originalGetAttrs\n ? originalGetAttrs(dom)\n : rule.attrs ?? {};\n\n if (baseAttrs === false) return false;\n\n // Parse global attributes from DOM (only if element, not style string)\n const globalParsed: Record<string, unknown> = {};\n if (typeof dom !== 'string') {\n for (const [name, attrSpec] of Object.entries(extraAttrs)) {\n if (attrSpec.parseHTML) {\n globalParsed[name] = attrSpec.parseHTML(dom);\n }\n }\n }\n\n return { ...baseAttrs, ...globalParsed };\n },\n };\n });\n }\n\n // 3. Wrap toDOM to inject rendered global HTML attributes\n const originalToDOM = spec.toDOM;\n if (originalToDOM) {\n // Use a generic wrapper — first arg is always a node or mark with .attrs\n const wrappedToDOM = (...args: unknown[]): unknown => {\n const result = (originalToDOM as (...a: unknown[]) => unknown)(...args);\n if (!Array.isArray(result)) return result;\n\n // First arg is always the node or mark, which has .attrs\n const nodeOrMark = args[0] as { attrs: Record<string, unknown> };\n\n let extraHtmlAttrs: Record<string, string> = {};\n for (const [, attrSpec] of Object.entries(extraAttrs)) {\n if (attrSpec.renderHTML) {\n const rendered = attrSpec.renderHTML(nodeOrMark.attrs);\n if (rendered) {\n extraHtmlAttrs = mergeHTMLAttrs(extraHtmlAttrs, rendered) as Record<string, string>;\n }\n }\n }\n\n // Merge into result[1] if it's an attributes object\n if (\n result.length >= 2 &&\n typeof result[1] === 'object' &&\n result[1] !== null &&\n !Array.isArray(result[1])\n ) {\n const existingAttrs = result[1] as Record<string, unknown>;\n result[1] = { ...existingAttrs, ...extraHtmlAttrs };\n } else if (Object.keys(extraHtmlAttrs).length > 0) {\n // Insert attributes object at position 1\n const rest = result.slice(1) as unknown[];\n return [result[0], extraHtmlAttrs, ...rest];\n }\n\n return result;\n };\n // Cast needed: wrappedToDOM is generic but spec.toDOM expects specific signatures.\n // The wrapper preserves the original signature by forwarding all arguments.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (spec as any).toDOM = wrappedToDOM;\n }\n }\n\n /**\n * Builds ProseMirror Schema from Node and Mark extensions\n */\n private buildSchema(): Schema {\n // First, collect global attributes from all extensions\n const globalAttrs = this.collectGlobalAttributes();\n\n const nodes: Record<string, NodeSpec> = {};\n const marks: Record<string, MarkSpec> = {};\n let topNode: string | undefined;\n\n for (const ext of this._extensions) {\n if (ext.type === 'node') {\n const nodeExt = ext as Node;\n const spec = nodeExt.createNodeSpec();\n\n const extraAttrs = globalAttrs.get(ext.name);\n if (extraAttrs) {\n this.applyGlobalAttributes(spec, extraAttrs);\n }\n\n nodes[ext.name] = spec;\n\n // Check for topNode (usually 'doc')\n if (nodeExt.config.topNode) {\n topNode = ext.name;\n }\n } else if (ext.type === 'mark') {\n const markExt = ext as Mark;\n const spec = markExt.createMarkSpec();\n\n const extraAttrs = globalAttrs.get(ext.name);\n if (extraAttrs) {\n this.applyGlobalAttributes(spec, extraAttrs);\n }\n\n marks[ext.name] = spec;\n }\n }\n\n return new Schema({\n nodes,\n marks,\n ...(topNode && { topNode }),\n });\n }\n\n /**\n * Initializes storage for all extensions\n */\n private initializeStorage(): void {\n for (const ext of this._extensions) {\n const storageFactory = (ext as Extension).config.addStorage;\n if (storageFactory) {\n const storage = this.safeCall(\n () => callOrReturn(storageFactory, ext),\n `${ext.name}.addStorage`\n );\n if (storage !== undefined) {\n this._storage[ext.name] = storage;\n (ext as Extension).storage = storage;\n }\n }\n // Always expose ext.storage via editor.storage[name], even for\n // extensions without addStorage(). The Extension constructor\n // initialises storage to {} by default — make it accessible.\n if (!(ext.name in this._storage)) {\n this._storage[ext.name] = (ext as Extension).storage;\n }\n }\n }\n\n // === Plugin Collection ===\n\n /**\n * Builds all ProseMirror plugins from extensions\n */\n private buildPlugins(): Plugin[] {\n const plugins: Plugin[] = [];\n\n // Collect keyboard shortcuts and create keymap plugin\n const shortcuts = this.collectKeyboardShortcuts();\n if (Object.keys(shortcuts).length > 0) {\n plugins.push(keymap(shortcuts));\n }\n\n // Collect input rules and create inputRules plugin\n const rules = this.collectInputRules();\n if (rules.length > 0) {\n plugins.push(createInputRulesPlugin({ rules }));\n }\n\n // Collect custom plugins from extensions\n for (const ext of this._extensions) {\n const addPlugins = (ext as Extension).config.addProseMirrorPlugins;\n if (addPlugins) {\n const extPlugins = this.safeCall(\n () => callOrReturn(addPlugins, ext) as Plugin[] | undefined,\n `${ext.name}.addProseMirrorPlugins`\n );\n if (extPlugins && extPlugins.length > 0) {\n plugins.push(...extPlugins);\n }\n }\n }\n\n return plugins;\n }\n\n /**\n * Collects keyboard shortcuts from all extensions\n * Returns ProseMirror-compatible commands for keymap plugin\n *\n * Note: Extensions should return PM-compatible commands from addKeyboardShortcuts()\n */\n private collectKeyboardShortcuts(): Record<string, PMCommand> {\n const shortcuts: Record<string, PMCommand> = {};\n\n for (const ext of this._extensions) {\n const addShortcuts = (ext as Extension).config.addKeyboardShortcuts;\n if (addShortcuts) {\n const extShortcuts = this.safeCall(\n () => callOrReturn(addShortcuts, ext),\n `${ext.name}.addKeyboardShortcuts`\n );\n if (extShortcuts) {\n const cast = extShortcuts as unknown as Record<string, PMCommand>;\n for (const [key, handler] of Object.entries(cast)) {\n if (shortcuts[key]) {\n // Chain: try new handler first, fall back to previous\n const prev = shortcuts[key];\n shortcuts[key] = (state, dispatch, view) => {\n return handler(state, dispatch, view) || prev(state, dispatch, view);\n };\n } else {\n shortcuts[key] = handler;\n }\n }\n }\n }\n }\n\n return shortcuts;\n }\n\n /**\n * Collects input rules from all extensions\n */\n private collectInputRules(): InputRule[] {\n const rules: InputRule[] = [];\n\n for (const ext of this._extensions) {\n const addRules = (ext as Extension).config.addInputRules;\n if (addRules) {\n const extRules = this.safeCall(\n () => callOrReturn(addRules, ext) as InputRule[] | undefined,\n `${ext.name}.addInputRules`\n );\n if (extRules && extRules.length > 0) {\n rules.push(...extRules);\n }\n }\n }\n\n return rules;\n }\n\n /**\n * Collects commands from all extensions\n *\n * Note: Commands with the same name will be overwritten by later extensions\n * (lower priority extensions override higher priority). This is intentional\n * to allow customization of built-in commands.\n */\n private collectCommands(): CommandMap {\n const commands: CommandMap = {};\n\n for (const ext of this._extensions) {\n const addCommands = (ext as Extension).config.addCommands;\n if (addCommands) {\n const extCommands = this.safeCall(\n () => callOrReturn(addCommands, ext) as CommandMap | undefined,\n `${ext.name}.addCommands`\n );\n if (extCommands) {\n // Later extensions override earlier ones (intentional for customization)\n Object.assign(commands, extCommands);\n }\n }\n }\n\n return commands;\n }\n\n /**\n * Collects toolbar items from all extensions\n */\n private collectToolbarItems(): ToolbarItem[] {\n const items: ToolbarItem[] = [];\n\n for (const ext of this._extensions) {\n const addItems = (ext as Extension).config.addToolbarItems;\n if (addItems) {\n const extItems = this.safeCall(\n () => callOrReturn(addItems, ext) as ToolbarItem[] | undefined,\n `${ext.name}.addToolbarItems`\n );\n if (extItems && extItems.length > 0) {\n items.push(...extItems);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Collects node views from all Node extensions\n * Returns a map of node name → NodeViewConstructor for EditorView\n */\n private collectNodeViews(): Record<string, NodeViewConstructor> {\n const nodeViews: Record<string, NodeViewConstructor> = {};\n\n for (const ext of this._extensions) {\n if (ext.type !== 'node') continue;\n const nodeExt = ext as Node;\n const addNodeView = nodeExt.config.addNodeView;\n if (addNodeView) {\n const nodeView = this.safeCall(\n () => callOrReturn(addNodeView, nodeExt) as NodeViewConstructor | undefined,\n `${ext.name}.addNodeView`\n );\n if (nodeView) {\n nodeViews[ext.name] = nodeView;\n }\n }\n }\n\n return nodeViews;\n }\n\n // === Validation ===\n\n /**\n * Validates that the schema has required nodes\n * @throws Error if schema is missing 'doc' or 'text' nodes\n */\n validateSchema(): void {\n if (this.isDestroyed) {\n throw new Error('ExtensionManager has been destroyed');\n }\n\n const { nodes } = this._schema.spec;\n\n if (!nodes.get('doc')) {\n throw new Error(\n 'Invalid schema: missing required \"doc\" node. ' +\n 'The schema must define a \"doc\" node as the document root.'\n );\n }\n\n if (!nodes.get('text')) {\n throw new Error(\n 'Invalid schema: missing required \"text\" node. ' +\n 'The schema must define a \"text\" node for inline text content.'\n );\n }\n }\n\n // === Lifecycle ===\n\n /**\n * Cleans up the extension manager\n * Calls onDestroy on all extensions and clears all caches\n */\n destroy(): void {\n if (this.isDestroyed) {\n return;\n }\n\n // Call onDestroy on all extensions (wrapped in safeCall)\n for (const ext of this._extensions) {\n const onDestroy = (ext as Extension).config.onDestroy;\n if (onDestroy) {\n this.safeCall(() => {\n callOrReturn(onDestroy, ext);\n }, `${ext.name}.onDestroy`);\n }\n }\n\n // Clear all caches to prevent memory leaks\n // Note: ProseMirror's EditorView.destroy() handles plugin view cleanup\n // Storage is not cleared explicitly - it will be garbage collected\n // when the ExtensionManager instance is no longer referenced\n this.clearAllCaches();\n\n this.isDestroyed = true;\n }\n\n // === Error Handling (2.7: Extension Error Isolation) ===\n\n /**\n * Safely executes a function, catching and reporting errors\n * Prevents a single extension error from crashing the entire editor\n *\n * Handles both synchronous errors and async promise rejections.\n *\n * @param fn - Function to execute\n * @param context - Context for error reporting (e.g., 'Bold.onUpdate')\n * @returns The function result, or undefined if an error occurred\n */\n safeCall<T>(fn: () => T, context: string): T | undefined {\n try {\n const result = fn();\n\n // Handle async functions - catch promise rejections\n if (result instanceof Promise) {\n result.catch((error: unknown) => {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n this.editor.emit?.('error', { error: errorObj, context });\n });\n }\n\n return result;\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n\n // Emit error event (Editor will call onError callback via event listener)\n this.editor.emit?.('error', { error: errorObj, context });\n\n return undefined;\n }\n }\n\n // === Extension Lifecycle Hook Calls ===\n\n /**\n * Calls onBeforeCreate on all extensions\n */\n callOnBeforeCreate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onBeforeCreate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onBeforeCreate`);\n }\n }\n }\n\n /**\n * Calls onCreate on all extensions\n */\n callOnCreate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onCreate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onCreate`);\n }\n }\n }\n\n /**\n * Calls onUpdate on all extensions\n */\n callOnUpdate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onUpdate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onUpdate`);\n }\n }\n }\n\n /**\n * Calls onSelectionUpdate on all extensions\n */\n callOnSelectionUpdate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onSelectionUpdate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onSelectionUpdate`);\n }\n }\n }\n\n /**\n * Calls onTransaction on all extensions\n * @param props - Transaction props\n */\n callOnTransaction(props: { transaction: Transaction }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onTransaction;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onTransaction`);\n }\n }\n }\n\n /**\n * Calls onFocus on all extensions\n * @param props - Focus event props\n */\n callOnFocus(props: { event: FocusEvent }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onFocus;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onFocus`);\n }\n }\n }\n\n /**\n * Calls onBlur on all extensions\n * @param props - Blur event props\n */\n callOnBlur(props: { event: FocusEvent }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onBlur;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onBlur`);\n }\n }\n }\n}\n","/**\n * Selection commands — focus, blur, selectAll, selectNodeBackward, deleteSelection\n */\nimport { TextSelection, AllSelection } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { selectNodeBackward as pmSelectNodeBackward } from '@domternal/pm/commands';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { FocusPosition } from '../types/index.js';\n\n/**\n * Resolves focus position to a numeric position in the document\n *\n * Uses the provided doc (tr.doc) rather than view.state.doc to support\n * chain context where prior commands may have modified the document.\n */\nfunction resolveFocusPosition(\n doc: { content: { size: number } },\n position: FocusPosition\n): number | null {\n if (position === null || position === false) {\n return null;\n }\n\n if (position === true || position === 'end') {\n return doc.content.size - 1;\n }\n\n if (position === 'start') {\n return 1;\n }\n\n if (position === 'all') {\n return null;\n }\n\n if (typeof position === 'number') {\n return Math.max(0, Math.min(position, doc.content.size));\n }\n\n return null;\n}\n\n/**\n * Focus command - focuses the editor at the specified position\n *\n * @param position - Where to place the cursor\n * - true/'end': End of document\n * - 'start': Start of document\n * - 'all': Select all content\n * - number: Specific position\n * - null/false: Just focus without changing selection\n */\nexport const focus: CommandSpec<[position?: FocusPosition]> =\n (position: FocusPosition = null) =>\n ({ editor, tr, dispatch }) => {\n const view = editor.view as EditorView;\n\n // Check if view is attached to DOM (dry-run always returns true)\n if (!dispatch) {\n return true;\n }\n\n if (!view.dom.isConnected) {\n return false;\n }\n\n // Focus the editor\n view.focus();\n\n if (position === 'all') {\n const selection = new AllSelection(tr.doc);\n dispatch(tr.setSelection(selection));\n return true;\n }\n\n // Resolve position\n const resolvedPos = resolveFocusPosition(tr.doc, position);\n\n if (resolvedPos !== null) {\n // Use TextSelection.near() to find nearest valid text position\n // (e.g., position 1 inside a blockquote resolves to the paragraph within)\n const $pos = tr.doc.resolve(resolvedPos);\n const selection = TextSelection.near($pos);\n dispatch(tr.setSelection(selection));\n } else {\n dispatch(tr);\n }\n\n return true;\n };\n\n/**\n * Blur command - removes focus from the editor\n */\nexport const blur: CommandSpec =\n () =>\n ({ editor, dispatch }) => {\n const view = editor.view as EditorView;\n\n if (!dispatch) {\n return true;\n }\n\n // blur() is not part of ProseMirror API, but works on the DOM element\n view.dom.blur();\n return true;\n };\n\n/**\n * SelectAll command - selects all content in the editor\n *\n * Uses AllSelection to select the entire document.\n * Uses tr.doc to support chain context.\n */\nexport const selectAll: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n if (!dispatch) {\n return true;\n }\n\n tr.setSelection(new AllSelection(tr.doc));\n dispatch(tr);\n return true;\n };\n\n/**\n * SelectNodeBackward command - selects the node before the cursor\n *\n * When the cursor is at the start of a textblock, this selects the node before it.\n */\nexport const selectNodeBackward: CommandSpec =\n () =>\n ({ state, dispatch }) => {\n return pmSelectNodeBackward(state, dispatch);\n };\n\n/**\n * DeleteSelection command - deletes the current selection\n *\n * Uses tr.selection to support chain context.\n */\nexport const deleteSelection: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n const { empty, from, to } = tr.selection;\n\n if (empty) {\n return false;\n }\n\n if (!dispatch) {\n return true;\n }\n\n tr.deleteRange(from, to);\n dispatch(tr);\n return true;\n };\n","/**\n * Create a ProseMirror document from content\n *\n * Supports JSON and HTML content formats (AD-11).\n * Plain text is NOT supported - use HTML or JSON explicitly.\n */\nimport type { Schema} from '@domternal/pm/model';\nimport { Node as PMNode, DOMParser } from '@domternal/pm/model';\nimport type { Content, JSONContent } from '../types/index.js';\n\n/**\n * Options for createDocument\n */\nexport interface CreateDocumentOptions {\n /**\n * Parse options passed to DOMParser\n */\n parseOptions?: Parameters<DOMParser['parse']>[1];\n}\n\n/**\n * Checks if content is a JSON object (has 'type' property)\n */\nfunction isJSONContent(content: unknown): content is JSONContent {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'type' in content &&\n typeof (content as JSONContent).type === 'string'\n );\n}\n\n/**\n * Checks if content is an HTML string (starts with '<')\n *\n * SECURITY NOTE: This function only checks if the string looks like HTML.\n * It does NOT sanitize content. If you're accepting user-provided content,\n * sanitize it before passing to the editor (e.g., using DOMPurify).\n */\nfunction isHTMLContent(content: unknown): content is string {\n return typeof content === 'string' && content.trim().startsWith('<');\n}\n\n/**\n * Creates an empty document with a single empty paragraph\n */\nfunction createEmptyDocument(schema: Schema): PMNode {\n const paragraphType = schema.nodes['paragraph'];\n\n if (paragraphType) {\n return schema.node('doc', null, [paragraphType.create()]);\n }\n\n // Fallback: create doc with whatever the first block type is\n // Try to find the first allowed node type\n for (const [name, nodeType] of Object.entries(schema.nodes)) {\n if (name !== 'doc' && name !== 'text' && nodeType.isBlock) {\n return schema.node('doc', null, [nodeType.create()]);\n }\n }\n\n // Last resort: empty doc (might be invalid for some schemas)\n return schema.node('doc', null, []);\n}\n\n/**\n * Parses HTML string into a ProseMirror document\n */\nfunction parseHTMLContent(\n html: string,\n schema: Schema,\n options?: CreateDocumentOptions\n): PMNode {\n // Create a temporary DOM element to parse the HTML\n const element = document.createElement('div');\n element.innerHTML = html;\n\n const parser = DOMParser.fromSchema(schema);\n return parser.parse(element, options?.parseOptions);\n}\n\n/**\n * Creates a ProseMirror document from content\n *\n * **Security:** Content is NOT sanitized. If accepting user-provided HTML,\n * sanitize it first (e.g., using DOMPurify) to prevent XSS attacks.\n *\n * @param content - JSON content object, HTML string, or null/undefined\n * @param schema - ProseMirror schema to use\n * @param options - Optional parse options\n * @returns ProseMirror Node (document)\n *\n * @throws Error if content format is invalid (plain text without HTML tags)\n *\n * @example\n * ```ts\n * // JSON content\n * const doc = createDocument(\n * { type: 'doc', content: [{ type: 'paragraph' }] },\n * schema\n * );\n *\n * // HTML content\n * const doc = createDocument('<p>Hello world</p>', schema);\n *\n * // Empty document\n * const doc = createDocument(null, schema);\n * ```\n */\nexport function createDocument(\n content: Content | null | undefined,\n schema: Schema,\n options?: CreateDocumentOptions\n): PMNode {\n // Handle null/undefined/empty string - create empty document\n if (content === null || content === undefined || content === '') {\n return createEmptyDocument(schema);\n }\n\n // Handle JSON content\n if (isJSONContent(content)) {\n return PMNode.fromJSON(schema, content);\n }\n\n // Handle HTML string\n if (isHTMLContent(content)) {\n return parseHTMLContent(content, schema, options);\n }\n\n // Handle plain text string (not allowed per AD-11)\n if (typeof content === 'string') {\n throw new Error(\n 'Invalid content format: plain text is not supported. ' +\n 'Use HTML string (e.g., \"<p>Hello</p>\") or JSON content object instead.'\n );\n }\n\n // Unknown content type\n throw new Error(\n `Invalid content format: expected JSON object with 'type' property or HTML string, ` +\n `got ${typeof content}`\n );\n}\n","/**\n * Check if a ProseMirror node is empty\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\n\n/**\n * Options for isNodeEmpty check\n */\nexport interface IsNodeEmptyOptions {\n /**\n * Check child nodes recursively\n * @default true\n */\n checkChildren?: boolean;\n\n /**\n * Ignore hardBreak nodes when checking emptiness\n * @default true\n */\n ignoreHardBreaks?: boolean;\n}\n\n/**\n * Checks if a ProseMirror node is considered empty\n *\n * A node is considered empty if:\n * - It has no content (childCount === 0)\n * - It only contains empty child nodes (when checkChildren is true)\n * - It only contains hardBreaks (when ignoreHardBreaks is true)\n *\n * @param node - ProseMirror node to check\n * @param options - Options for emptiness check\n * @returns true if node is empty\n *\n * @example\n * ```ts\n * // Check if document is empty\n * const empty = isNodeEmpty(editor.state.doc);\n *\n * // Check without recursion\n * const empty = isNodeEmpty(node, { checkChildren: false });\n * ```\n */\nexport function isNodeEmpty(\n node: PMNode,\n options: IsNodeEmptyOptions = {}\n): boolean {\n const { checkChildren = true, ignoreHardBreaks = true } = options;\n\n // Leaf nodes with no content\n if (node.isLeaf) {\n // Text node is empty if it has no text\n if (node.isText) {\n return !node.text || node.text.length === 0;\n }\n\n // HardBreak is considered \"empty\" if ignoreHardBreaks is true\n if (ignoreHardBreaks && node.type.name === 'hardBreak') {\n return true;\n }\n\n // Other leaf nodes (like images, horizontal rules) are not empty\n return false;\n }\n\n // No children = empty\n if (node.childCount === 0) {\n return true;\n }\n\n // If not checking children, has children = not empty\n if (!checkChildren) {\n return false;\n }\n\n // Check all children recursively (with early exit for performance)\n for (let i = 0; i < node.childCount; i++) {\n if (!isNodeEmpty(node.child(i), options)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if a document node is empty\n *\n * Convenience wrapper for isNodeEmpty with document-specific defaults.\n * A document is empty if it only contains empty paragraphs or no content.\n *\n * @param doc - Document node to check\n * @returns true if document is empty\n */\nexport function isDocumentEmpty(doc: PMNode): boolean {\n return isNodeEmpty(doc, {\n checkChildren: true,\n ignoreHardBreaks: true,\n });\n}\n","/**\n * Mark Input Rule Helper\n *\n * Creates input rules for applying marks based on regex patterns.\n * Used for markdown-style shortcuts like **bold**, *italic*, ~~strike~~, etc.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { MarkType } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\n\n/**\n * Options for creating a mark input rule\n */\nexport interface MarkInputRuleOptions {\n /**\n * The regex pattern to match.\n * Must have a capture group for the content to be marked.\n *\n * @example\n * // Match **text**\n * /(?:\\*\\*)([^*]+)(?:\\*\\*)$/\n */\n find: RegExp;\n\n /**\n * The mark type to apply\n */\n type: MarkType;\n\n /**\n * Optional: get attributes from the match\n *\n * @param match - The regex match array\n * @returns Mark attributes or null to skip\n */\n getAttributes?: (match: RegExpMatchArray) => Record<string, unknown> | null;\n}\n\n/**\n * Creates an input rule that applies a mark to matched text.\n *\n * When the user types text matching the pattern, the delimiters are removed\n * and the mark is applied to the content.\n *\n * @example\n * // **text** → applies bold mark to \"text\"\n * markInputRule({\n * find: /(?:\\*\\*)([^*]+)(?:\\*\\*)$/,\n * type: schema.marks.bold,\n * });\n *\n * @example\n * // `text` → applies code mark to \"text\"\n * markInputRule({\n * find: /(?:`)([^`]+)(?:`)$/,\n * type: schema.marks.code,\n * });\n *\n * @param options - Configuration options\n * @returns ProseMirror InputRule\n */\nexport function markInputRule(options: MarkInputRuleOptions): InputRule {\n const { find, type, getAttributes } = options;\n\n return new InputRule(\n find,\n (state: EditorState, match: RegExpMatchArray, start: number, end: number) => {\n const attributes = getAttributes ? getAttributes(match) : null;\n\n // If getAttributes returned null, skip this rule\n if (getAttributes && attributes === null) {\n return null;\n }\n\n // match[0] = full match (e.g., \"**text**\")\n // match[1] = captured content (e.g., \"text\")\n const textContent = match[1];\n if (!textContent) {\n return null;\n }\n\n const { tr } = state;\n\n // Replace the matched text (including delimiters) with just the content\n tr.replaceWith(start, end, state.schema.text(textContent));\n\n // Apply the mark to the inserted text\n tr.addMark(start, start + textContent.length, type.create(attributes ?? undefined));\n\n // Remove the mark at the end so typing continues without the mark\n tr.removeStoredMark(type);\n\n return tr;\n }\n );\n}\n\n/**\n * Pre-built regex patterns for common mark input rules\n */\nexport const markInputRulePatterns = {\n /**\n * Bold: **text** or __text__\n * Matches text wrapped in double asterisks or underscores\n */\n bold: /(?:\\*\\*|__)([^*_]+)(?:\\*\\*|__)$/,\n\n /**\n * Strike: ~~text~~\n * Matches text wrapped in double tildes\n */\n strike: /(?:~~)([^~]+)(?:~~)$/,\n\n /**\n * Code: `text`\n * Matches text wrapped in backticks\n */\n code: /(?:`)([^`]+)(?:`)$/,\n\n /**\n * Highlight: ==text==\n * Matches text wrapped in double equals\n */\n highlight: /(?:==)([^=]+)(?:==)$/,\n} as const;\n","/**\n * URL Validation Helper\n *\n * Provides a utility for validating URLs.\n */\n\n/**\n * Options for URL validation\n */\nexport interface IsValidUrlOptions {\n /**\n * List of allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n}\n\n/**\n * Checks if a string is a valid URL\n *\n * @param url - The string to validate\n * @param options - Validation options\n * @returns True if the string is a valid URL with an allowed protocol\n *\n * @example\n * ```ts\n * isValidUrl('https://example.com'); // true\n * isValidUrl('javascript:alert(1)'); // false (protocol not allowed)\n * isValidUrl('not a url'); // false\n * ```\n */\nexport function isValidUrl(\n url: string,\n options: IsValidUrlOptions = {}\n): boolean {\n const { protocols = ['http:', 'https:'] } = options;\n\n try {\n const parsed = new URL(url);\n return protocols.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n","/**\n * SSR Helpers\n *\n * Utilities for server-side rendering and content conversion.\n * - generateHTML: Convert JSON content to HTML string\n * - generateJSON: Convert HTML string to JSON content\n * - generateText: Extract plain text from JSON content\n *\n * Note: SSR environment requires 'linkedom' package (optional peer dependency).\n */\nimport {\n Node as PMNode,\n DOMSerializer,\n DOMParser as PMDOMParser,\n} from '@domternal/pm/model';\nimport type { Schema } from '@domternal/pm/model';\nimport type { AnyExtension, JSONContent } from '../types/index.js';\nimport { ExtensionManager } from '../ExtensionManager.js';\n\n// Declare global require for Node.js environment\ndeclare const require: (id: string) => unknown;\n\n/**\n * Build a ProseMirror schema from extensions.\n * Used internally by SSR helpers.\n */\nfunction buildSchemaFromExtensions(extensions: AnyExtension[]): Schema {\n // Create a minimal editor-like object for ExtensionManager\n const mockEditor = {\n state: null,\n view: null,\n schema: null,\n commands: {},\n };\n\n const manager = new ExtensionManager(\n { extensions },\n mockEditor as never\n );\n return manager.schema;\n}\n\n/**\n * Get a DOM document for parsing/serialization.\n * Uses native document in browser, linkedom in Node.js.\n */\nfunction getDocument(): Document {\n // Browser environment\n if (typeof window !== 'undefined') {\n return window.document;\n }\n\n // Server environment - try linkedom\n try {\n // Dynamic require to avoid bundling linkedom in browser builds\n const linkedom = require('linkedom') as { parseHTML: (html: string) => { document: Document } };\n const { document } = linkedom.parseHTML('<!DOCTYPE html><html><body></body></html>');\n return document;\n } catch {\n throw new Error(\n 'SSR requires \"linkedom\" package. Install it with: pnpm add linkedom'\n );\n }\n}\n\nexport interface GenerateHTMLOptions {\n /**\n * Custom document implementation. If not provided, uses native document\n * in browser or linkedom in Node.js.\n */\n document?: Document;\n}\n\n/**\n * Generate HTML string from JSON content.\n *\n * @param content - The JSON content to convert\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns HTML string\n *\n * @example\n * ```ts\n * const html = generateHTML(\n * { type: 'doc', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] }] },\n * [Document, Paragraph, Text]\n * );\n * // Returns: '<p>Hello</p>'\n * ```\n */\nexport function generateHTML(\n content: JSONContent,\n extensions: AnyExtension[],\n options: GenerateHTMLOptions = {}\n): string {\n const schema = buildSchemaFromExtensions(extensions);\n const doc = PMNode.fromJSON(schema, content);\n const targetDocument = options.document ?? getDocument();\n\n const serializer = DOMSerializer.fromSchema(schema);\n const fragment = serializer.serializeFragment(doc.content, {\n document: targetDocument,\n });\n\n const container = targetDocument.createElement('div');\n container.appendChild(fragment);\n\n return container.innerHTML;\n}\n\nexport interface GenerateJSONOptions {\n /**\n * Custom document implementation. If not provided, uses native document\n * in browser or linkedom in Node.js.\n */\n document?: Document;\n}\n\n/**\n * Generate JSON content from HTML string.\n *\n * @param html - The HTML string to convert\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns JSON content object\n *\n * @example\n * ```ts\n * const json = generateJSON(\n * '<p>Hello</p>',\n * [Document, Paragraph, Text]\n * );\n * // Returns: { type: 'doc', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] }] }\n * ```\n */\nexport function generateJSON(\n html: string,\n extensions: AnyExtension[],\n options: GenerateJSONOptions = {}\n): JSONContent {\n const schema = buildSchemaFromExtensions(extensions);\n const targetDocument = options.document ?? getDocument();\n\n // Parse HTML into DOM\n const container = targetDocument.createElement('div');\n container.innerHTML = html;\n\n // Use ProseMirror's DOMParser\n const parser = PMDOMParser.fromSchema(schema);\n const doc = parser.parse(container);\n\n return doc.toJSON() as JSONContent;\n}\n\nexport interface GenerateTextOptions {\n /**\n * Separator between block elements.\n * @default '\\n\\n'\n */\n blockSeparator?: string;\n}\n\n/**\n * Generate plain text from JSON content.\n *\n * @param content - The JSON content to extract text from\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns Plain text string\n *\n * @example\n * ```ts\n * const text = generateText(\n * { type: 'doc', content: [\n * { type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] },\n * { type: 'paragraph', content: [{ type: 'text', text: 'World' }] }\n * ]},\n * [Document, Paragraph, Text]\n * );\n * // Returns: 'Hello\\n\\nWorld'\n * ```\n */\nexport function generateText(\n content: JSONContent,\n extensions: AnyExtension[],\n options: GenerateTextOptions = {}\n): string {\n const { blockSeparator = '\\n\\n' } = options;\n const schema = buildSchemaFromExtensions(extensions);\n const doc = PMNode.fromJSON(schema, content);\n\n return doc.textBetween(0, doc.content.size, blockSeparator);\n}\n","/**\n * Get the range of a mark at a resolved position.\n *\n * Walks backward and forward from the position to find contiguous\n * text nodes that share the same mark type, returning the full range.\n */\nimport type { MarkType, ResolvedPos } from '@domternal/pm/model';\n\nexport interface MarkRange {\n from: number;\n to: number;\n}\n\n/**\n * Returns the contiguous range of a mark around the given resolved position.\n * Returns undefined if the mark is not present at the position.\n */\nexport function getMarkRange(\n $pos: ResolvedPos,\n type: MarkType,\n): MarkRange | undefined {\n const parent = $pos.parent;\n\n // Try the node at/after cursor first, then the node before\n let start = parent.childAfter($pos.parentOffset);\n\n if (!start.node || !type.isInSet(start.node.marks)) {\n start = parent.childBefore($pos.parentOffset);\n }\n\n if (!start.node || !type.isInSet(start.node.marks)) {\n return undefined;\n }\n\n let startIndex = start.index;\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n // Walk backward\n while (startIndex > 0 && type.isInSet(parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= parent.child(startIndex).nodeSize;\n }\n\n // Walk forward\n while (endIndex < parent.childCount && type.isInSet(parent.child(endIndex).marks)) {\n endPos += parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return { from: startPos, to: endPos };\n}\n","/**\n * Find the closest parent node matching a predicate\n *\n * Returns a curried function: findParentNode(predicate)(selection)\n *\n * @example\n * const details = findParentNode(node => node.type.name === 'details')(selection);\n * if (details) {\n * console.log(details.pos, details.node);\n * }\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Selection } from '@domternal/pm/state';\n\nexport interface FindParentNodeResult {\n pos: number;\n start: number;\n depth: number;\n node: PMNode;\n}\n\nexport const findParentNode =\n (predicate: (node: PMNode) => boolean) =>\n (selection: Selection): FindParentNodeResult | undefined => {\n const { $from } = selection;\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n\n if (predicate(node)) {\n return {\n pos: $from.before(depth),\n start: $from.start(depth),\n depth,\n node,\n };\n }\n }\n\n return undefined;\n };\n","/**\n * Find all children of a node matching a predicate\n *\n * @example\n * const summaries = findChildren(detailsNode, node => node.type.name === 'detailsSummary');\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\n\nexport interface FindChildResult {\n node: PMNode;\n pos: number;\n}\n\nexport const findChildren = (\n node: PMNode,\n predicate: (node: PMNode) => boolean,\n): FindChildResult[] => {\n const result: FindChildResult[] = [];\n\n node.forEach((child, offset) => {\n if (predicate(child)) {\n result.push({ node: child, pos: offset });\n }\n });\n\n return result;\n};\n","/**\n * Get the default block type at a given content match position\n *\n * Finds the first textblock type that can be created without required attributes.\n * Useful for creating new empty blocks (e.g., paragraph after details).\n *\n * @example\n * const type = defaultBlockAt(parent.contentMatchAt(index));\n * if (type) {\n * const node = type.createAndFill();\n * }\n */\nimport type { ContentMatch, NodeType } from '@domternal/pm/model';\n\nexport const defaultBlockAt = (match: ContentMatch): NodeType | null => {\n for (let i = 0; i < match.edgeCount; i++) {\n const { type } = match.edge(i);\n\n if (type.isTextblock && !type.hasRequiredAttrs()) {\n return type;\n }\n }\n\n return null;\n};\n","/**\n * Content commands — setContent, clearContent, insertText, insertContent\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport { Fragment, Slice, DOMParser as ProseMirrorDOMParser } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { Content } from '../types/index.js';\nimport { createDocument } from '../helpers/index.js';\n\n/**\n * Options for setContent command\n */\nexport interface SetContentOptions {\n /**\n * Emit update event after setting content\n * @default true\n */\n emitUpdate?: boolean;\n\n /**\n * Parse options for HTML content\n */\n parseOptions?: Record<string, unknown>;\n}\n\n/**\n * Options for clearContent command\n */\nexport interface ClearContentOptions {\n /**\n * Emit update event after clearing content\n * @default true\n */\n emitUpdate?: boolean;\n}\n\n/**\n * SetContent command - sets the editor content\n *\n * @param content - JSON or HTML content\n * @param options - Options for setting content\n */\nexport const setContent: CommandSpec<[content: Content, options?: SetContentOptions]> =\n (content: Content, options: SetContentOptions = {}) =>\n ({ state, tr, dispatch }) => {\n const { emitUpdate = true, parseOptions } = options;\n const { schema } = state;\n\n // Parse content into document (with graceful error handling)\n let doc;\n try {\n doc = createDocument(content, schema, { parseOptions });\n } catch {\n // Invalid content - return false to indicate command failed\n return false;\n }\n\n // In dry-run mode, just check if content can be created\n if (!dispatch) {\n return true;\n }\n\n // Replace entire document\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n tr.replaceWith(0, tr.doc.content.size, doc.content);\n\n // Mark transaction to potentially skip update event\n if (!emitUpdate) {\n tr.setMeta('addToHistory', false);\n tr.setMeta('skipUpdate', true);\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * ClearContent command - clears the editor content to empty state\n *\n * @param options - Options for clearing content\n */\nexport const clearContent: CommandSpec<[options?: ClearContentOptions]> =\n (options: ClearContentOptions = {}) =>\n ({ state, tr, dispatch }) => {\n const { emitUpdate = true } = options;\n const { schema } = state;\n\n // Create empty document\n const doc = createDocument(null, schema);\n\n // In dry-run mode, just return true\n if (!dispatch) {\n return true;\n }\n\n // Replace entire document\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n tr.replaceWith(0, tr.doc.content.size, doc.content);\n\n if (!emitUpdate) {\n tr.setMeta('addToHistory', false);\n tr.setMeta('skipUpdate', true);\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * InsertText command - inserts text at the current selection\n *\n * @param text - Text to insert\n */\nexport const insertText: CommandSpec<[text: string]> =\n (text: string) =>\n ({ tr, dispatch }) => {\n // Use tr.selection for chain compatibility - reflects current position\n const { from, to } = tr.selection;\n\n // For TextSelection, check if parent allows inline content\n // For other selections (AllSelection, NodeSelection), let ProseMirror handle validation\n if (tr.selection instanceof TextSelection) {\n const { $from } = tr.selection;\n if (!$from.parent.inlineContent) {\n return false;\n }\n }\n\n if (!dispatch) {\n return true;\n }\n\n tr.insertText(text, from, to);\n dispatch(tr);\n return true;\n };\n\n/**\n * InsertContent command - inserts content at the current selection\n *\n * @param content - The content to insert (JSON object, array, or HTML string)\n */\nexport const insertContent: CommandSpec<[content: Content]> =\n (content: Content) =>\n ({ state, tr, dispatch }) => {\n const { schema } = state;\n const { from, to } = tr.selection;\n\n // Parse content based on type\n let fragment: Fragment;\n\n if (typeof content === 'string') {\n // HTML string - parse using DOMParser\n if (typeof window === 'undefined') {\n return false; // Can't parse HTML in SSR without DOM\n }\n\n const parser = ProseMirrorDOMParser.fromSchema(schema);\n const wrapper = document.createElement('div');\n wrapper.innerHTML = content;\n const parsed = parser.parse(wrapper);\n fragment = parsed.content;\n } else if (content && typeof content === 'object') {\n // JSON content\n if (Array.isArray(content)) {\n // Array of nodes\n const nodes = content.map(item => schema.nodeFromJSON(item));\n fragment = Fragment.from(nodes);\n } else if ('type' in content) {\n // Single node or document\n const node = schema.nodeFromJSON(content);\n // If it's a doc, use its content; otherwise wrap in fragment\n fragment = node.type.name === 'doc' ? node.content : Fragment.from(node);\n } else {\n return false;\n }\n } else {\n return false;\n }\n\n if (!dispatch) {\n return true;\n }\n\n // Insert the content\n tr.replaceRange(from, to, new Slice(fragment, 0, 0));\n dispatch(tr);\n return true;\n };\n","/**\n * Extension - Base class for all extensions\n *\n * Extensions provide functionality without contributing to the schema.\n * For schema contributions, use Node (for block/inline nodes) or Mark (for inline formatting).\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const History = Extension.create({\n * name: 'history',\n * addOptions() {\n * return { depth: 100 };\n * },\n * addKeyboardShortcuts() {\n * return {\n * 'Mod-z': () => this.editor.commands.undo(),\n * 'Mod-Shift-z': () => this.editor.commands.redo(),\n * };\n * },\n * });\n */\n\nimport type { ExtensionConfig, ExtensionConfigBase, ExtensionContext } from './types/ExtensionConfig.js';\nimport type { SingleCommands } from './types/Commands.js';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { callOrReturn } from './helpers/callOrReturn.js';\n\n/**\n * Merges extension config with parent binding support.\n *\n * For each function in `extendedConfig` that overrides a function in `parentConfig`,\n * wraps the override so that `this.parent` temporarily points to the parent's version.\n * This enables the `this.parent?.()` pattern in extend():\n *\n * ```typescript\n * Paragraph.extend({\n * addAttributes() {\n * return { ...this.parent?.(), align: { default: 'left' } };\n * },\n * });\n * ```\n */\nexport function mergeConfigWithParentBinding(\n parentConfig: object,\n extendedConfig: object,\n): object {\n const parent = parentConfig as Record<string, unknown>;\n const merged: Record<string, unknown> = { ...parent };\n\n for (const [key, value] of Object.entries(extendedConfig)) {\n if (typeof value === 'function' && typeof parent[key] === 'function') {\n const parentFn = parent[key] as (...args: unknown[]) => unknown;\n const childFn = value as (...args: unknown[]) => unknown;\n\n merged[key] = function (this: Extension, ...args: unknown[]) {\n const previousParent = this.parent;\n this.parent = (...pArgs: unknown[]) => parentFn.call(this, ...pArgs);\n const result = childFn.call(this, ...args);\n this.parent = previousParent;\n return result;\n };\n } else {\n merged[key] = value;\n }\n }\n\n return merged;\n}\n\n/**\n * Editor interface for Extension\n * Forward declaration to avoid circular dependency\n */\nexport interface ExtensionEditorInterface {\n readonly state: EditorState;\n readonly view: EditorView;\n readonly schema: unknown;\n readonly commands: SingleCommands;\n}\n\n/**\n * Base class for all extensions\n *\n * @typeParam Options - Extension options type\n * @typeParam Storage - Extension storage type\n */\nexport class Extension<Options = unknown, Storage = unknown> {\n /**\n * Extension type identifier\n * Used to distinguish between Extension, Node, and Mark\n * Subclasses override this to 'node' or 'mark'\n */\n readonly type: 'extension' | 'node' | 'mark' = 'extension';\n\n /**\n * Unique extension name\n */\n readonly name: string;\n\n /**\n * Extension options (immutable after creation)\n */\n readonly options: Options;\n\n /**\n * Extension storage (mutable state)\n * Accessible via editor.storage[extensionName]\n */\n storage: Storage;\n\n /**\n * The original configuration object\n */\n readonly config: ExtensionConfig<Options, Storage>;\n\n /**\n * Editor instance (set by ExtensionManager after creation)\n * null until ExtensionManager binds it\n */\n editor: ExtensionEditorInterface | null = null;\n\n /**\n * Reference to the parent config method when using extend().\n * Set temporarily during config method execution so overridden\n * methods can call `this.parent?.()` to invoke the original.\n */\n parent?: ((...args: unknown[]) => unknown) | undefined;\n\n /**\n * Protected constructor - use Extension.create() instead\n */\n protected constructor(config: ExtensionConfig<Options, Storage>) {\n // Validate extension name (must be camelCase starting with lowercase letter)\n if (!/^[a-z][a-zA-Z0-9]*$/.test(config.name)) {\n throw new Error(\n `Extension name '${config.name}' is invalid. ` +\n `Names must be camelCase starting with a lowercase letter (e.g., 'myExtension').`\n );\n }\n\n this.config = config;\n this.name = config.name;\n\n // Initialize options using addOptions() with `this` context\n // If addOptions is not defined, default to empty object\n const defaultOptions = callOrReturn(config.addOptions, this);\n this.options = (defaultOptions ?? {}) as Options;\n\n // Initialize storage using addStorage() with `this` context\n // If addStorage is not defined, default to empty object\n const defaultStorage = callOrReturn(config.addStorage, this);\n this.storage = (defaultStorage ?? {}) as Storage;\n }\n\n /**\n * Creates a new extension instance\n *\n * @param config - Extension configuration\n * @returns New extension instance\n *\n * @example\n * const MyExtension = Extension.create({\n * name: 'myExtension',\n * addOptions() {\n * return { enabled: true };\n * },\n * });\n */\n static create<O = unknown, S = unknown>(\n config: ExtensionConfig<O, S>\n ): Extension<O, S> {\n return new Extension(config);\n }\n\n /**\n * Creates a new extension with merged options\n * Original extension is not modified\n *\n * **Note:** Options are merged shallowly using object spread (`...`).\n * Nested objects are replaced entirely, not deeply merged.\n *\n * @param options - Options to merge with existing options\n * @returns New extension instance with merged options\n *\n * @example\n * const configured = MyExtension.configure({ enabled: false });\n *\n * @example\n * // Shallow merge behavior with nested objects:\n * // Given: options = { nested: { a: 1, b: 2 } }\n * // configure({ nested: { b: 3 } })\n * // Result: { nested: { b: 3 } } — 'a' is lost!\n * // To preserve nested values, spread manually:\n * // configure({ nested: { ...original.options.nested, b: 3 } })\n */\n configure(options: Partial<Options>): Extension<Options, Storage> {\n // Create new config with merged options\n const newConfig: ExtensionConfig<Options, Storage> = {\n ...this.config,\n // Override addOptions to return merged options\n addOptions: () => ({\n ...this.options,\n ...options,\n }),\n };\n\n return new Extension(newConfig);\n }\n\n /**\n * Creates a new extension with extended configuration\n * Original extension is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addCommands`, `addKeyboardShortcuts`) are\n * replaced entirely, not combined with the base extension's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New extension instance with extended config\n *\n * @example\n * const Extended = MyExtension.extend({\n * name: 'extendedExtension',\n * addCommands() {\n * return { customCommand: () => ({ tr }) => true };\n * },\n * });\n *\n * @example\n * // To preserve base extension's commands while adding new ones:\n * const Extended = BaseExtension.extend({\n * addCommands() {\n * const baseCommands = BaseExtension.config.addCommands?.call(this) ?? {};\n * return {\n * ...baseCommands,\n * newCommand: () => ({ tr }) => true,\n * };\n * },\n * });\n */\n extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<ExtensionConfigBase<ExtendedOptions, ExtendedStorage>> &\n ThisType<ExtensionContext<ExtendedOptions, ExtendedStorage>>\n ): Extension<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Extension(newConfig as ExtensionConfig<ExtendedOptions, ExtendedStorage>);\n }\n}\n","/**\n * Shared helpers for building ProseMirror node/mark specs.\n *\n * Used by both Node.createNodeSpec() and Mark.createMarkSpec() to\n * eliminate duplicated attribute conversion and HTML attribute building.\n */\nimport type { AttributeSpecs } from '../types/AttributeSpec.js';\n\n/**\n * Converts extension AttributeSpecs to ProseMirror-compatible `attrs` object.\n *\n * @example\n * spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n */\nexport function buildProseMirrorAttrs(\n attributeSpecs: AttributeSpecs,\n): Record<string, { default?: unknown }> {\n const attrs: Record<string, { default?: unknown }> = {};\n\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n const attr: Record<string, unknown> = {\n default: attrSpec.default,\n };\n // Add validate if defined (ProseMirror 1.22.0+)\n if (attrSpec.validate) {\n attr['validate'] = attrSpec.validate;\n }\n attrs[name] = attr;\n }\n\n return attrs;\n}\n\n/**\n * Builds an HTML attributes object from a node/mark's attrs using the\n * attribute specs' renderHTML functions.\n *\n * Used inside toDOM wrappers for both nodes and marks.\n *\n * @example\n * const htmlAttrs = buildHTMLAttributes(node.attrs, attrSpecs);\n * return renderFn.call(instance, { node, HTMLAttributes: htmlAttrs });\n */\nexport function buildHTMLAttributes(\n attrs: Record<string, unknown>,\n attrSpecs: AttributeSpecs,\n): Record<string, unknown> {\n const htmlAttrs: Record<string, unknown> = {};\n\n for (const [name, attrSpec] of Object.entries(attrSpecs)) {\n // Skip if not rendered\n if (attrSpec.rendered === false) continue;\n\n // Use renderHTML if defined, otherwise add directly\n if (attrSpec.renderHTML) {\n const rendered = attrSpec.renderHTML(attrs);\n if (rendered) {\n Object.assign(htmlAttrs, rendered);\n }\n } else if (attrs[name] !== undefined && attrs[name] !== null) {\n // Default: use attribute value directly\n htmlAttrs[name] = attrs[name];\n }\n }\n\n return htmlAttrs;\n}\n","/**\n * Mark - Base class for mark extensions\n *\n * Marks define inline formatting that can be applied to text.\n * Examples: Bold, Italic, Link, Code, etc.\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const Bold = Mark.create({\n * name: 'bold',\n * parseHTML() {\n * return [\n * { tag: 'strong' },\n * { tag: 'b' },\n * { style: 'font-weight=bold' },\n * ];\n * },\n * renderHTML({ HTMLAttributes }) {\n * return ['strong', HTMLAttributes, 0];\n * },\n * });\n */\n\nimport type { MarkSpec, MarkType, ParseRule } from '@domternal/pm/model';\nimport { Extension, type ExtensionEditorInterface, mergeConfigWithParentBinding } from './Extension.js';\nimport type { MarkConfig, MarkContext } from './types/MarkConfig.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\nimport { buildProseMirrorAttrs, buildHTMLAttributes } from './helpers/specBuilder.js';\n\n/**\n * Extended editor interface for Mark\n * Includes schema access for MarkType getter\n */\nexport interface MarkEditorInterface extends ExtensionEditorInterface {\n readonly schema: {\n marks: Record<string, MarkType>;\n };\n}\n\n/**\n * Base class for mark extensions\n *\n * @typeParam Options - Mark options type\n * @typeParam Storage - Mark storage type\n */\nexport class Mark<Options = unknown, Storage = unknown> extends Extension<\n Options,\n Storage\n> {\n /**\n * Mark type identifier\n * Distinguishes marks from extensions and nodes\n */\n override readonly type = 'mark' as const;\n\n /**\n * The original configuration object\n * Typed as MarkConfig for mark-specific properties\n */\n declare readonly config: MarkConfig<Options, Storage>;\n\n /**\n * Editor instance with schema access\n * null until set by ExtensionManager\n */\n override editor: MarkEditorInterface | null = null;\n\n /**\n * Protected constructor - use Mark.create() instead\n */\n protected constructor(config: MarkConfig<Options, Storage>) {\n super(config);\n }\n\n /**\n * Whether this mark represents visual formatting.\n * Returns false for semantic marks (links, comments) that should\n * survive `unsetAllMarks`. Defaults to true.\n */\n get isFormatting(): boolean {\n return this.config.isFormatting !== false;\n }\n\n /**\n * Get the ProseMirror MarkType from schema\n *\n * This is a lazy getter because schema doesn't exist at mark creation time.\n * Schema is built FROM marks by ExtensionManager.\n *\n * Returns null if editor is not yet initialized.\n * Always check editor is set before using markType.\n */\n get markType(): MarkType | null {\n if (!this.editor) {\n return null;\n }\n return this.editor.schema.marks[this.name] ?? null;\n }\n\n /**\n * Get MarkType or throw if not initialized.\n * Use in contexts where editor is guaranteed to be set (like addCommands).\n */\n get markTypeOrThrow(): MarkType {\n const type = this.markType;\n if (!type) {\n throw new Error(\n `Mark \"${this.name}\" is not initialized. ` +\n `Make sure the editor is created before accessing markType.`\n );\n }\n return type;\n }\n\n /**\n * Creates a new mark instance\n *\n * @param config - Mark configuration\n * @returns New mark instance\n *\n * @example\n * const Bold = Mark.create({\n * name: 'bold',\n * parseHTML() {\n * return [{ tag: 'strong' }, { tag: 'b' }];\n * },\n * });\n */\n static override create<O = unknown, S = unknown>(\n config: MarkConfig<O, S>\n ): Mark<O, S> {\n return new Mark(config);\n }\n\n /**\n * Creates a new mark with merged options\n * Original mark is not modified\n *\n * **Note:** Options are merged shallowly using object spread (`...`).\n * Nested objects are replaced entirely, not deeply merged.\n *\n * @param options - Options to merge with existing options\n * @returns New mark instance with merged options\n *\n * @example\n * const CustomBold = Bold.configure({ HTMLAttributes: { class: 'custom-bold' } });\n *\n * @example\n * // Shallow merge behavior with nested objects:\n * // Given: options = { HTMLAttributes: { class: 'a', id: 'b' } }\n * // configure({ HTMLAttributes: { class: 'c' } })\n * // Result: { HTMLAttributes: { class: 'c' } } — 'id' is lost!\n * // To preserve nested values, spread manually:\n * // configure({ HTMLAttributes: { ...original.options.HTMLAttributes, class: 'c' } })\n */\n override configure(options: Partial<Options> & { isFormatting?: boolean }): Mark<Options, Storage> {\n const { isFormatting, ...restOptions } = options as Record<string, unknown> & { isFormatting?: boolean };\n const newConfig: MarkConfig<Options, Storage> = {\n ...this.config,\n ...(isFormatting !== undefined ? { isFormatting } : {}),\n addOptions: () => ({\n ...this.options,\n ...restOptions as Partial<Options>,\n }),\n };\n\n return new Mark(newConfig);\n }\n\n /**\n * Creates a new mark with extended configuration\n * Original mark is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addAttributes`, `parseHTML`) are\n * replaced entirely, not combined with the base mark's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New mark instance with extended config\n *\n * @example\n * const CustomBold = Bold.extend({\n * name: 'customBold',\n * addAttributes() {\n * return { ...this.parent?.(), weight: { default: 'bold' } };\n * },\n * });\n *\n * @example\n * // To preserve base mark's parse rules while adding new ones:\n * const Extended = BaseMark.extend({\n * parseHTML() {\n * const baseRules = BaseMark.config.parseHTML?.call(this) ?? [];\n * return [...baseRules, { tag: 'custom-tag' }];\n * },\n * });\n */\n override extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<MarkConfig<ExtendedOptions, ExtendedStorage>> &\n ThisType<MarkContext<ExtendedOptions, ExtendedStorage>>\n ): Mark<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Mark(newConfig as MarkConfig<ExtendedOptions, ExtendedStorage>);\n }\n\n /**\n * Creates a ProseMirror MarkSpec from this mark's configuration\n *\n * Called by ExtensionManager when building the schema.\n * Converts our config format to ProseMirror's MarkSpec format.\n *\n * @returns ProseMirror MarkSpec\n */\n createMarkSpec(): MarkSpec {\n const spec: MarkSpec = {};\n\n // Schema properties - copy directly if defined\n if (this.config.inclusive !== undefined)\n spec.inclusive = callOrReturn(this.config.inclusive, this);\n if (this.config.excludes !== undefined)\n spec.excludes = this.config.excludes;\n if (this.config.group !== undefined) spec.group = this.config.group;\n if (this.config.spanning !== undefined)\n spec.spanning = this.config.spanning;\n\n // Attributes - convert AttributeSpecs to ProseMirror attrs\n const attributeSpecs = callOrReturn(this.config.addAttributes, this);\n if (attributeSpecs) {\n spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n }\n\n // Parse rules - convert to parseDOM\n const parseRules = callOrReturn(this.config.parseHTML, this);\n if (parseRules && parseRules.length > 0) {\n // Build parseDOM array with proper typing\n const parseDOMRules = parseRules.map((rule) => {\n // Build parse rule object\n const parseRule: {\n tag?: string;\n style?: string;\n priority?: number;\n consuming?: boolean;\n getAttrs?: (\n node: HTMLElement | string\n ) => Record<string, unknown> | false | null;\n } = {};\n\n if (rule.tag) parseRule.tag = rule.tag;\n if (rule.style) parseRule.style = rule.style;\n if (rule.priority !== undefined) parseRule.priority = rule.priority;\n if (rule.consuming !== undefined) parseRule.consuming = rule.consuming;\n\n // Handle getAttrs - need to merge with attribute parseHTML\n if (rule.getAttrs || attributeSpecs) {\n parseRule.getAttrs = (node: HTMLElement | string) => {\n // Get attrs from rule\n const ruleAttrs = rule.getAttrs ? rule.getAttrs(node) : {};\n\n // If rule returned null or false, skip this rule\n if (ruleAttrs === null || ruleAttrs === false) {\n return ruleAttrs;\n }\n\n // Get attrs from attribute parseHTML functions\n const parsedAttrs: Record<string, unknown> = { ...ruleAttrs };\n\n // Only run attribute parseHTML for element-based rules\n // For style-based rules (where node is a string), the rule.getAttrs\n // already handles extracting values from the style string\n if (attributeSpecs && typeof node !== 'string') {\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n if (attrSpec.parseHTML) {\n parsedAttrs[name] = attrSpec.parseHTML(node);\n }\n }\n }\n\n return parsedAttrs;\n };\n }\n\n return parseRule;\n });\n\n // Cast required: Our MarkParseRule type is structurally compatible with\n // ProseMirror's ParseRule but TypeScript can't infer this due to\n // our custom getAttrs return type. The cast is safe.\n spec.parseDOM = parseDOMRules as unknown as readonly ParseRule[];\n }\n\n // Render - convert renderHTML to toDOM\n if (this.config.renderHTML) {\n const renderFn = this.config.renderHTML;\n const attrSpecs = attributeSpecs;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const markInstance = this;\n\n spec.toDOM = (mark, _inline) => {\n const htmlAttrs = attrSpecs\n ? buildHTMLAttributes(mark.attrs, attrSpecs)\n : {};\n\n return renderFn.call(markInstance, { mark, HTMLAttributes: htmlAttrs });\n };\n }\n\n return spec;\n }\n}\n","/**\n * Mark commands — toggleMark, setMark, unsetMark, unsetAllMarks\n */\nimport type { Attrs, MarkType } from '@domternal/pm/model';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { Mark } from '../Mark.js';\n\n/**\n * Checks if a mark can be applied in the current selection context.\n * Shared by toggleMark and setMark to avoid duplicated logic.\n *\n * For empty selections: checks that the cursor is in inline content,\n * the parent allows the mark type, and no existing marks exclude it.\n *\n * For range selections: checks that at least one parent allows the mark\n * and that applicable text exists (text not excluded by other marks).\n */\nfunction canApplyMark(\n state: EditorState,\n tr: Transaction,\n markType: MarkType,\n): boolean {\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n if (empty) {\n const $pos = tr.doc.resolve(firstRange.$from.pos);\n if (!$pos.parent.inlineContent || !$pos.parent.type.allowsMarkType(markType)) {\n return false;\n }\n const cursorMarks = tr.storedMarks ?? state.storedMarks ?? $pos.marks();\n if (cursorMarks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n return false;\n }\n } else {\n const ctx = { parentAllows: false, hasText: false, hasApplicableText: false };\n for (const range of ranges) {\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node) => {\n if (node.inlineContent && node.type.allowsMarkType(markType)) {\n ctx.parentAllows = true;\n }\n if (node.isText) {\n ctx.hasText = true;\n if (!node.marks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n ctx.hasApplicableText = true;\n }\n }\n });\n }\n if (!ctx.parentAllows || (ctx.hasText && !ctx.hasApplicableText)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * ToggleMark command - toggles a mark on the current selection\n *\n * In cursor mode (empty selection): toggles stored mark.\n * In range mode: applies/removes mark across the entire selection,\n * respecting CellSelection ranges.\n *\n * @param markName - The name of the mark to toggle\n * @param attributes - Optional attributes for the mark\n */\nexport const toggleMark: CommandSpec<[markName: string, attributes?: Attrs]> =\n (markName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n if (!canApplyMark(state, tr, markType)) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n if (!dispatch) return true;\n\n if (empty) {\n // Cursor mode — toggle stored mark\n const from = firstRange.$from.pos;\n const cursorMarks = tr.storedMarks\n ?? state.storedMarks\n ?? tr.doc.resolve(from).marks();\n\n if (markType.isInSet(cursorMarks)) {\n tr.removeStoredMark(markType);\n } else {\n tr.addStoredMark(markType.create(attributes ?? null));\n }\n } else {\n // Range mode — iterate over selection ranges (handles CellSelection)\n const hasMark = ranges.every(range =>\n tr.doc.rangeHasMark(range.$from.pos, range.$to.pos, markType),\n );\n for (const range of ranges) {\n if (hasMark) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n } else {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes ?? null));\n }\n }\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * SetMark command - adds a mark to the current selection\n *\n * @param markName - The name of the mark to set\n * @param attributes - Optional attributes for the mark\n */\nexport const setMark: CommandSpec<[markName: string, attributes?: Attrs]> =\n (markName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n if (!canApplyMark(state, tr, markType)) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n // Cursor mode — add to stored marks\n if (empty) {\n if (!dispatch) return true;\n\n const from = firstRange.$from.pos;\n // Merge with existing mark attributes to preserve sibling attributes\n // (e.g., fontFamily should not be lost when setting fontSize on textStyle)\n // Priority: stored marks on tr > stored marks on state > marks at cursor position\n const existingMark = tr.storedMarks?.find(m => m.type === markType)\n ?? state.storedMarks?.find(m => m.type === markType)\n ?? tr.doc.resolve(from).marks().find(m => m.type === markType)\n ?? null;\n const mergedAttrs = existingMark\n ? { ...existingMark.attrs, ...attributes }\n : attributes;\n\n const mark = markType.create(mergedAttrs);\n tr.addStoredMark(mark);\n dispatch(tr);\n return true;\n }\n\n if (!dispatch) {\n return true;\n }\n\n // Merge per-node to preserve each node's own attributes\n // (e.g., one word has fontFamily: 'Arial', another has 'Georgia' —\n // setting fontSize should preserve each node's fontFamily independently)\n // Iterate over selection ranges to handle CellSelection (multiple ranges)\n const nodeMarks: { from: number; to: number; attrs: Attrs }[] = [];\n for (const range of ranges) {\n const rfrom = range.$from.pos;\n const rto = range.$to.pos;\n tr.doc.nodesBetween(rfrom, rto, (node, pos) => {\n if (!node.isText) return;\n const existing = markType.isInSet(node.marks);\n const nodeAttrs = existing\n ? { ...existing.attrs, ...attributes }\n : (attributes ?? {});\n nodeMarks.push({\n from: Math.max(pos, rfrom),\n to: Math.min(pos + node.nodeSize, rto),\n attrs: nodeAttrs,\n });\n });\n }\n\n if (nodeMarks.length > 0) {\n for (const nm of nodeMarks) {\n tr.addMark(nm.from, nm.to, markType.create(nm.attrs));\n }\n } else {\n // No text nodes found (e.g., selection across empty blocks) — apply globally\n for (const range of ranges) {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes));\n }\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * UnsetMark command - removes a mark from the current selection\n *\n * @param markName - The name of the mark to remove\n */\nexport const unsetMark: CommandSpec<[markName: string]> =\n (markName: string) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n\n // For empty selection, remove from stored marks\n if (empty) {\n if (!dispatch) {\n return true;\n }\n\n tr.removeStoredMark(markType);\n dispatch(tr);\n return true;\n }\n\n if (!dispatch) {\n return true;\n }\n\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n }\n dispatch(tr);\n return true;\n };\n\n/**\n * UnsetAllMarks command - removes all formatting marks from the current selection\n *\n * Iterates over all mark types in the schema and removes those with\n * `isFormatting !== false`. Marks like Link that set `isFormatting: false`\n * are preserved.\n *\n * Returns false for empty selections (no range to clear).\n */\nexport const unsetAllMarks: CommandSpec =\n () =>\n ({ state, tr, dispatch, editor }) => {\n const { empty, ranges } = tr.selection;\n\n if (empty) return false;\n if (!dispatch) return true;\n\n // Build set of non-formatting mark names to skip.\n // Mark extensions with isFormatting: false (e.g. Link) survive clear formatting.\n const skipMarks = new Set<string>();\n const mgr = (editor as unknown as { extensionManager: { extensions: readonly unknown[] } }).extensionManager;\n for (const ext of mgr.extensions) {\n if (ext instanceof Mark && !ext.isFormatting) {\n skipMarks.add(ext.name);\n }\n }\n\n for (const markName of Object.keys(state.schema.marks)) {\n if (!skipMarks.has(markName)) {\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, state.schema.marks[markName]);\n }\n }\n }\n tr.setStoredMarks([]);\n dispatch(tr);\n return true;\n };\n","/**\n * Node commands — setBlockType, toggleBlockType, wrapIn, toggleWrap, lift\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport { findWrapping, liftTarget } from '@domternal/pm/transform';\nimport type { Attrs, Node as PMNode } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\n\n/**\n * SetBlockType command - changes the block type of the selection\n *\n * Uses tr.doc/tr.selection for chain compatibility. Preserves global\n * attributes (textAlign, lineHeight, etc.) by merging existing node\n * attrs with the provided ones via tr.setBlockType's function form.\n *\n * @param nodeName - The name of the node type to set\n * @param attributes - Optional attributes for the node\n */\nexport const setBlockType: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n // Check if any textblock in the selection can be changed\n const canApply = tr.selection.ranges.some((range) => {\n let found = false;\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n if (found) return false;\n if (!node.isTextblock) return;\n const mergedAttrs = { ...node.attrs, ...(attributes ?? {}) };\n if (node.hasMarkup(nodeType, mergedAttrs)) return;\n if (node.type === nodeType) {\n found = true;\n } else {\n const $pos = tr.doc.resolve(pos);\n const index = $pos.index();\n found = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n return;\n });\n return found;\n });\n\n if (!canApply) return false;\n if (!dispatch) return true;\n\n // Apply: use function attrs to preserve global attributes (textAlign, lineHeight, etc.)\n for (const range of tr.selection.ranges) {\n const from = range.$from.pos;\n const to = range.$to.pos;\n tr.setBlockType(from, to, nodeType, (node) => ({ ...node.attrs, ...(attributes ?? {}) }));\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n };\n\n/**\n * ToggleBlockType command - toggles between a block type and a default type\n *\n * If the current block is of the target type, changes it to the default type.\n * If the current block is not of the target type, changes it to the target type.\n * Preserves global attributes (textAlign, lineHeight) on toggle.\n *\n * @param nodeName - The name of the node type to toggle to\n * @param defaultNodeName - The name of the default node type (usually 'paragraph')\n * @param attributes - Optional attributes for the node\n */\nexport const toggleBlockType: CommandSpec<[nodeName: string, defaultNodeName: string, attributes?: Attrs]> =\n (nodeName: string, defaultNodeName: string, attributes?: Attrs) =>\n (props) => {\n const { state, tr } = props;\n const nodeType = state.schema.nodes[nodeName];\n const defaultNodeType = state.schema.nodes[defaultNodeName];\n\n if (!nodeType || !defaultNodeType) {\n return false;\n }\n\n // Collect non-empty textblocks in the selection. Empty textblocks\n // (e.g., trailing node from TrailingNode extension) are excluded so they\n // don't affect toggle direction. This handles AllSelection correctly.\n const { from, to } = tr.selection;\n const contentBlocks: { node: PMNode }[] = [];\n tr.doc.nodesBetween(from, to, (node) => {\n if (node.isTextblock && node.content.size > 0) {\n contentBlocks.push({ node });\n }\n });\n\n const allMatch = contentBlocks.length > 0 && contentBlocks.every(({ node }) => {\n const typeMatches = node.type === nodeType;\n const attrsMatch = !attributes || Object.keys(attributes).every(\n (key) => node.attrs[key] === attributes[key]\n );\n return typeMatches && attrsMatch;\n });\n\n if (allMatch) {\n // Toggle OFF → switch to default type, preserving global attrs\n return setBlockType(defaultNodeName)(props);\n }\n\n // Toggle ON → switch to target type with attrs, preserving global attrs\n return setBlockType(nodeName, attributes)(props);\n };\n\n/**\n * WrapIn command - wraps the selection in a node type\n *\n * Uses tr.doc/tr.selection for chain compatibility.\n *\n * @param nodeName - The name of the wrapping node type\n * @param attributes - Optional attributes for the node\n */\nexport const wrapIn: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n const { $from, $to } = tr.selection;\n const range = $from.blockRange($to);\n if (!range) return false;\n\n const wrapping = findWrapping(range, nodeType, attributes);\n if (!wrapping) return false;\n if (!dispatch) return true;\n\n tr.wrap(range, wrapping).scrollIntoView();\n dispatch(tr);\n return true;\n };\n\n/**\n * ToggleWrap command - toggles wrapping of the selection in a node type\n *\n * If the selection is already wrapped in the node type, lifts it out.\n * Otherwise, wraps the selection in the node type.\n * Uses tr.doc/tr.selection for chain compatibility.\n *\n * @param nodeName - The name of the wrapping node type\n * @param attributes - Optional attributes for the node\n */\nexport const toggleWrap: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n (props) => {\n const { state, tr, dispatch } = props;\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n const { ranges } = tr.selection;\n\n const isInsideWrap = (pos: number): boolean => {\n const $pos = tr.doc.resolve(pos);\n for (let d = $pos.depth; d > 0; d--) {\n if ($pos.node(d).type === nodeType) return true;\n }\n return false;\n };\n\n // Multi-range selection (CellSelection): handle each cell independently\n if (ranges.length > 1) {\n const allWrapped = ranges.every(range => isInsideWrap(range.$from.pos));\n if (!dispatch) return true;\n\n // Snapshot positions and sort descending so bottom-of-doc modifications\n // don't shift positions of cells still to be processed.\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const blockRange = $from.blockRange($to);\n if (!blockRange) continue;\n\n if (allWrapped) {\n const target = liftTarget(blockRange);\n if (target !== null) tr.lift(blockRange, target);\n } else {\n const wrapping = findWrapping(blockRange, nodeType, attributes);\n if (wrapping) tr.wrap(blockRange, wrapping);\n }\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n // Single-range selection: existing logic\n // Collect non-empty textblocks in the selection with their positions.\n // Empty textblocks (e.g., trailing node) are excluded so they don't\n // affect toggle direction. This handles AllSelection correctly.\n const { from, to } = tr.selection;\n const contentBlocks: { pos: number }[] = [];\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock && node.content.size > 0) {\n contentBlocks.push({ pos });\n }\n });\n\n const allWrapped = contentBlocks.length > 0\n ? contentBlocks.every(({ pos }) => isInsideWrap(pos))\n : isInsideWrap(from);\n\n if (allWrapped) {\n const first = contentBlocks[0];\n if (first) {\n tr.setSelection(TextSelection.create(tr.doc, first.pos + 1));\n }\n return lift()(props);\n }\n\n return wrapIn(nodeName, attributes)(props);\n };\n\n/**\n * Lift command - lifts the current block out of its parent wrapper\n *\n * Uses tr.doc/tr.selection for chain compatibility.\n * For example, lifts a paragraph out of a blockquote.\n */\nexport const lift: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n const { ranges } = tr.selection;\n\n // Multi-range selection (CellSelection): lift each cell independently\n if (ranges.length > 1) {\n if (!dispatch) return true;\n\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const range = $from.blockRange($to);\n if (!range) continue;\n const target = liftTarget(range);\n if (target !== null) tr.lift(range, target);\n }\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n const { $from, $to } = tr.selection;\n const range = $from.blockRange($to);\n if (!range) return false;\n\n const target = liftTarget(range);\n if (target === null) return false;\n if (!dispatch) return true;\n\n tr.lift(range, target).scrollIntoView();\n dispatch(tr);\n return true;\n };\n","/**\n * List commands — toggleList\n */\nimport { TextSelection, EditorState } from '@domternal/pm/state';\nimport { wrapRangeInList, liftListItem } from '@domternal/pm/schema-list';\nimport type { Attrs, Node as PMNode } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\n\n/**\n * ToggleList command - toggles a list type on the current selection\n *\n * If the selection is not in a list, wraps it in the specified list type.\n * If it's in the same list type, lifts the list items out.\n * If it's in a different list type, converts to the new list type in-place.\n *\n * @param listNodeName - The name of the list node type (e.g., 'bulletList', 'orderedList')\n * @param listItemNodeName - The name of the list item node type (usually 'listItem')\n * @param attributes - Optional attributes for the list node\n */\nexport const toggleList: CommandSpec<[listNodeName: string, listItemNodeName: string, attributes?: Attrs]> =\n (listNodeName: string, listItemNodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const listType = state.schema.nodes[listNodeName];\n const listItemType = state.schema.nodes[listItemNodeName];\n\n if (!listType || !listItemType) {\n return false;\n }\n\n interface ListBlockCtx { pos: number; inTargetList: boolean; inSomeList: boolean; otherListPos: number | null }\n\n /** Collect list context for non-empty textblocks in a range.\n * If no textblocks are found (cursor in empty block), falls back to the\n * resolved position's ancestor context so toggle/convert/lift still work. */\n const collectListContext = (doc: PMNode, rfrom: number, rto: number): ListBlockCtx[] => {\n const blocks: ListBlockCtx[] = [];\n doc.nodesBetween(rfrom, rto, (node, pos) => {\n if (!node.isTextblock || node.content.size === 0) return;\n let inTargetList = false;\n let inSomeList = false;\n let otherListPos: number | null = null;\n const $pos = doc.resolve(pos);\n for (let d = $pos.depth; d >= 0; d--) {\n const n = $pos.node(d);\n if (n.type === listType) {\n inTargetList = true;\n inSomeList = true;\n break;\n }\n const groups = (n.type.spec.group ?? '').split(/\\s+/);\n if (groups.includes('list')) {\n inSomeList = true;\n otherListPos = $pos.before(d);\n break;\n }\n }\n blocks.push({ pos, inTargetList, inSomeList, otherListPos });\n });\n\n // Empty-textblock fallback: cursor in empty list item etc.\n // Use the textblock node position (not cursor position) so that\n // pos + 1 points into the textblock content, not past it.\n if (blocks.length === 0) {\n const $cur = doc.resolve(rfrom);\n const nodePos = $cur.parent.inlineContent ? $cur.before($cur.depth) : rfrom;\n let inTargetList = false;\n let inSomeList = false;\n let otherListPos: number | null = null;\n for (let d = $cur.depth; d >= 0; d--) {\n const n = $cur.node(d);\n if (n.type === listType) { inTargetList = true; inSomeList = true; break; }\n const groups = (n.type.spec.group ?? '').split(/\\s+/);\n if (groups.includes('list')) { inSomeList = true; otherListPos = $cur.before(d); break; }\n }\n blocks.push({ pos: nodePos, inTargetList, inSomeList, otherListPos });\n }\n\n return blocks;\n };\n\n const { ranges } = tr.selection;\n\n // Multi-range selection (CellSelection): handle each cell independently\n if (ranges.length > 1) {\n // Snapshot raw positions and sort descending (process bottom-of-doc first\n // so modifications don't shift positions of cells still to be processed)\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n // Determine global toggle direction on unmodified doc\n const allBlocks: ListBlockCtx[] = [];\n for (const cell of cellPositions) {\n allBlocks.push(...collectListContext(tr.doc, cell.from, cell.to));\n }\n const allInTargetList = allBlocks.length > 0 && allBlocks.every((b) => b.inTargetList);\n if (!dispatch) return true;\n\n if (allInTargetList) {\n // Lift: remove target list from all cells\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const cellBlocks = collectListContext(tr.doc, from, to);\n const first = cellBlocks[0];\n const last = cellBlocks[cellBlocks.length - 1];\n if (!first || !last) continue;\n const narrowSel = TextSelection.create(tr.doc, first.pos + 1, last.pos + 1);\n const narrowState = EditorState.create({ doc: tr.doc, selection: narrowSel });\n liftListItem(listItemType)(narrowState, (liftTr) => {\n for (const step of liftTr.steps) {\n tr.step(step);\n }\n });\n }\n } else {\n // Per-cell: skip if already target, convert if in other list, wrap if no list\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const cellBlocks = collectListContext(tr.doc, from, to);\n const cellInTarget = cellBlocks.length > 0 && cellBlocks.every((b) => b.inTargetList);\n const cellInSomeList = cellBlocks.length > 0 && cellBlocks.every((b) => b.inSomeList);\n\n if (cellInTarget) {\n continue; // already has target list type\n } else if (cellInSomeList) {\n // Convert: change list type in-place\n const otherPos = cellBlocks.find((b) => b.otherListPos !== null)?.otherListPos;\n if (otherPos === null || otherPos === undefined) continue;\n const listNode = tr.doc.nodeAt(otherPos);\n if (!listNode) continue;\n const firstChild = listNode.firstChild;\n if (firstChild && firstChild.type !== listItemType) {\n // Cross-type (e.g. taskItem → listItem): rebuild items\n const newItems: PMNode[] = [];\n listNode.forEach((child) => {\n newItems.push(listItemType.create(child.attrs, child.content, child.marks));\n });\n tr.replaceWith(otherPos, otherPos + listNode.nodeSize, listType.create(attributes, newItems));\n } else {\n tr.setNodeMarkup(otherPos, listType, attributes);\n }\n } else {\n // Not in any list → wrap\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const blockRange = $from.blockRange($to);\n if (!blockRange) continue;\n wrapRangeInList(tr, blockRange, listType, attributes);\n }\n }\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n // Single-range selection\n const { from, to } = tr.selection;\n const contentBlocks = collectListContext(tr.doc, from, to);\n\n const allInTargetList = contentBlocks.length > 0 && contentBlocks.every((b) => b.inTargetList);\n const allInSomeList = contentBlocks.length > 0 && contentBlocks.every((b) => b.inSomeList);\n\n // Case 1: All non-empty textblocks are in the target list type → lift items out\n if (allInTargetList) {\n const first = contentBlocks[0];\n const last = contentBlocks[contentBlocks.length - 1];\n if (!first || !last) return false;\n const narrowSel = TextSelection.create(tr.doc, first.pos + 1, last.pos + 1);\n const narrowState = EditorState.create({\n doc: tr.doc,\n selection: narrowSel,\n });\n return liftListItem(listItemType)(narrowState, dispatch);\n }\n\n // Case 2: All non-empty textblocks are in some list but not target → convert\n if (allInSomeList) {\n const otherPos = contentBlocks.find((b) => b.otherListPos !== null)?.otherListPos;\n if (otherPos === undefined || otherPos === null) return false;\n\n if (!dispatch) {\n return true; // Can convert\n }\n\n const listNode = tr.doc.nodeAt(otherPos);\n if (!listNode) return false;\n\n const firstChild = listNode.firstChild;\n if (firstChild && firstChild.type !== listItemType) {\n const cursorOffset = tr.selection.from - otherPos;\n const newItems: PMNode[] = [];\n listNode.forEach((child) => {\n newItems.push(listItemType.create(child.attrs, child.content, child.marks));\n });\n const newList = listType.create(attributes, newItems);\n tr.replaceWith(otherPos, otherPos + listNode.nodeSize, newList);\n const restored = otherPos + Math.min(cursorOffset, newList.nodeSize - 1);\n tr.setSelection(TextSelection.near(tr.doc.resolve(restored)));\n } else {\n tr.setNodeMarkup(otherPos, listType, attributes);\n }\n\n dispatch(tr);\n return true;\n }\n\n // Case 3: Not in a list → wrap in the target list type\n const { $from: $wrapFrom, $to: $wrapTo } = tr.selection;\n const wrapRange = $wrapFrom.blockRange($wrapTo);\n if (!wrapRange) return false;\n if (!wrapRangeInList(dispatch ? tr : null, wrapRange, listType, attributes)) return false;\n if (dispatch) dispatch(tr.scrollIntoView());\n return true;\n };\n","/**\n * Attribute commands — updateAttributes, resetAttributes\n */\nimport type { CommandSpec } from '../types/Commands.js';\n\n/**\n * UpdateAttributes command - updates attributes on nodes matching a type\n *\n * Updates attributes on all nodes of the specified type within the selection.\n *\n * @param typeOrName - The node type name or NodeType to update\n * @param attributes - The attributes to merge into existing attributes\n */\nexport const updateAttributes: CommandSpec<[typeOrName: string, attributes: Record<string, unknown>]> =\n (typeOrName: string, attributes: Record<string, unknown>) =>\n ({ state, tr, dispatch }) => {\n const type = state.schema.nodes[typeOrName] ?? state.schema.marks[typeOrName];\n\n if (!type) {\n return false;\n }\n\n const { from, to } = tr.selection;\n const nodeChanges: { pos: number; attrs: Record<string, unknown> }[] = [];\n const markChanges: { pos: number; nodeSize: number; attrs: Record<string, unknown> }[] = [];\n\n // Use tr.doc to support chain context where prior commands may have modified the document\n // For nodes - collect changes\n if (state.schema.nodes[typeOrName]) {\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type.name === typeOrName) {\n nodeChanges.push({ pos, attrs: { ...node.attrs, ...attributes } });\n }\n });\n }\n\n // For marks - collect changes\n if (state.schema.marks[typeOrName]) {\n const markType = state.schema.marks[typeOrName];\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isInline) return;\n\n const mark = markType.isInSet(node.marks);\n if (mark) {\n markChanges.push({\n pos,\n nodeSize: node.nodeSize,\n attrs: { ...mark.attrs, ...attributes },\n });\n }\n });\n }\n\n const hasChanges = nodeChanges.length > 0 || markChanges.length > 0;\n\n if (hasChanges && dispatch) {\n // Apply node changes\n for (const change of nodeChanges) {\n tr.setNodeMarkup(change.pos, undefined, change.attrs);\n }\n\n // Apply mark changes\n if (state.schema.marks[typeOrName]) {\n const markType = state.schema.marks[typeOrName];\n for (const change of markChanges) {\n const newMark = markType.create(change.attrs);\n tr.removeMark(change.pos, change.pos + change.nodeSize, markType);\n tr.addMark(change.pos, change.pos + change.nodeSize, newMark);\n }\n }\n\n dispatch(tr);\n }\n\n return hasChanges;\n };\n\n/**\n * ResetAttributes command - resets an attribute to its default value\n *\n * Resets the specified attribute on all nodes of the given type within the selection\n * to the default value defined in the schema.\n *\n * @param typeOrName - The node type name to update\n * @param attributeName - The name of the attribute to reset\n */\nexport const resetAttributes: CommandSpec<[typeOrName: string, attributeName: string]> =\n (typeOrName: string, attributeName: string) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[typeOrName];\n const markType = state.schema.marks[typeOrName];\n\n if (!nodeType && !markType) {\n return false;\n }\n\n const { from, to } = tr.selection;\n const nodeChanges: { pos: number; attrs: Record<string, unknown> }[] = [];\n const markChanges: { pos: number; nodeSize: number; attrs: Record<string, unknown> }[] = [];\n\n // Use tr.doc to support chain context where prior commands may have modified the document\n // For nodes - collect changes\n if (nodeType) {\n const defaultValue: unknown = nodeType.spec.attrs?.[attributeName]?.default;\n\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type === nodeType) {\n nodeChanges.push({\n pos,\n attrs: { ...node.attrs, [attributeName]: defaultValue },\n });\n }\n });\n }\n\n // For marks - collect changes\n if (markType) {\n const defaultValue: unknown = markType.spec.attrs?.[attributeName]?.default;\n\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isInline) return;\n\n const mark = markType.isInSet(node.marks);\n if (mark) {\n markChanges.push({\n pos,\n nodeSize: node.nodeSize,\n attrs: { ...mark.attrs, [attributeName]: defaultValue },\n });\n }\n });\n }\n\n const hasChanges = nodeChanges.length > 0 || markChanges.length > 0;\n\n if (hasChanges && dispatch) {\n // Apply node changes\n for (const change of nodeChanges) {\n tr.setNodeMarkup(change.pos, undefined, change.attrs);\n }\n\n // Apply mark changes\n if (markType) {\n for (const change of markChanges) {\n const newMark = markType.create(change.attrs);\n tr.removeMark(change.pos, change.pos + change.nodeSize, markType);\n tr.addMark(change.pos, change.pos + change.nodeSize, newMark);\n }\n }\n\n dispatch(tr);\n }\n\n return hasChanges;\n };\n","/**\n * Built-in commands for @domternal/core\n *\n * Re-exports from domain-specific command files and assembles the\n * builtInCommands map consumed by CommandManager.\n */\nimport type { CommandMap } from '../types/Commands.js';\n\n// Selection commands\nexport {\n focus,\n blur,\n selectAll,\n selectNodeBackward,\n deleteSelection,\n} from './selectionCommands.js';\n\n// Content commands\nexport {\n setContent,\n clearContent,\n insertText,\n insertContent,\n type SetContentOptions,\n type ClearContentOptions,\n} from './contentCommands.js';\n\n// Mark commands\nexport {\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n} from './markCommands.js';\n\n// Node / block commands\nexport {\n setBlockType,\n toggleBlockType,\n wrapIn,\n toggleWrap,\n lift,\n} from './nodeCommands.js';\n\n// List commands\nexport { toggleList } from './listCommands.js';\n\n// Attribute commands\nexport {\n updateAttributes,\n resetAttributes,\n} from './attributeCommands.js';\n\n// --- Assemble the builtInCommands map ---\nimport { focus, blur, selectAll, selectNodeBackward, deleteSelection } from './selectionCommands.js';\nimport { setContent, clearContent, insertText, insertContent } from './contentCommands.js';\nimport { toggleMark, setMark, unsetMark, unsetAllMarks } from './markCommands.js';\nimport { setBlockType, toggleBlockType, wrapIn, toggleWrap, lift } from './nodeCommands.js';\nimport { toggleList } from './listCommands.js';\nimport { updateAttributes, resetAttributes } from './attributeCommands.js';\n\nexport const builtInCommands: CommandMap = {\n focus,\n blur,\n setContent,\n clearContent,\n insertText,\n deleteSelection,\n selectAll,\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n setBlockType,\n toggleBlockType,\n wrapIn,\n toggleWrap,\n lift,\n toggleList,\n insertContent,\n selectNodeBackward,\n updateAttributes,\n resetAttributes,\n} as CommandMap;\n\n// Module augmentation: register built-in commands with typed signatures\nimport type { Attrs } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { FocusPosition, Content } from '../types/index.js';\nimport type { SetContentOptions, ClearContentOptions } from './contentCommands.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n focus: CommandSpec<[position?: FocusPosition]>;\n blur: CommandSpec;\n setContent: CommandSpec<[content: Content, options?: SetContentOptions]>;\n clearContent: CommandSpec<[options?: ClearContentOptions]>;\n insertText: CommandSpec<[text: string]>;\n deleteSelection: CommandSpec;\n selectAll: CommandSpec;\n toggleMark: CommandSpec<[markName: string, attributes?: Attrs]>;\n setMark: CommandSpec<[markName: string, attributes?: Attrs]>;\n unsetMark: CommandSpec<[markName: string]>;\n unsetAllMarks: CommandSpec;\n setBlockType: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n toggleBlockType: CommandSpec<[nodeName: string, defaultNodeName: string, attributes?: Attrs]>;\n wrapIn: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n toggleWrap: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n lift: CommandSpec;\n toggleList: CommandSpec<[listNodeName: string, listItemNodeName: string, attributes?: Attrs]>;\n insertContent: CommandSpec<[content: Content]>;\n selectNodeBackward: CommandSpec;\n updateAttributes: CommandSpec<[typeOrName: string, attributes: Record<string, unknown>]>;\n resetAttributes: CommandSpec<[typeOrName: string, attributeName: string]>;\n }\n}\n","/**\n * Command Props Builder - Shared utility for building CommandProps\n *\n * Provides a factory for creating CommandProps objects with configurable\n * dispatch behavior, used by both ChainBuilder and CanChecker.\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n ChainedCommands,\n CanCommands,\n SingleCommands,\n} from './types/Commands.js';\n\n/**\n * Minimal editor interface for command props building\n */\nexport interface CommandPropsEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n}\n\n/**\n * Options for building CommandProps\n */\nexport interface BuildCommandPropsOptions {\n /** The editor instance */\n editor: CommandPropsEditor;\n\n /** The transaction to use */\n tr: Transaction;\n\n /**\n * Dispatch function - undefined for dry-run mode\n * In chain mode, this accumulates changes on shared transaction\n */\n dispatch: ((tr: Transaction) => void) | undefined;\n\n /** Function to create chain commands */\n chain: () => ChainedCommands;\n\n /** Function to create can commands */\n can: () => CanCommands;\n\n /** Function to create single commands */\n commands: () => SingleCommands;\n}\n\n/**\n * Builds a CommandProps object with the given options\n *\n * @example\n * // For chain mode with dispatch\n * const props = buildCommandProps({\n * editor,\n * tr,\n * dispatch: (transaction) => { ... },\n * chain: () => this.proxy(),\n * can: () => this.buildCanCommands(),\n * commands: () => this.buildSingleCommands(),\n * });\n *\n * @example\n * // For dry-run mode (can check)\n * const props = buildCommandProps({\n * editor,\n * tr,\n * dispatch: undefined,\n * chain: () => createChainBuilder(),\n * can: () => this.proxy(),\n * commands: () => this.buildSingleCommands(tr),\n * });\n */\nexport function buildCommandProps(options: BuildCommandPropsOptions): CommandProps {\n const { editor, tr, dispatch, chain, can, commands } = options;\n\n return {\n // Cast required: CommandPropsEditor is a minimal interface, but CommandProps\n // expects full Editor. Callers ensure the actual editor instance is passed.\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch,\n chain,\n can,\n commands: commands(),\n };\n}\n\n/**\n * Creates a dispatch function that accumulates steps on a shared transaction\n *\n * Used in chain mode where multiple commands share the same transaction.\n * If a command creates a new transaction, its steps and metadata are copied\n * to the shared one.\n *\n * Metadata propagation is critical for commands like undo/redo:\n * prosemirror-history sets metadata (addToHistory, plugin state) on its\n * transactions. Without copying this metadata, the shared transaction\n * would be recorded as a new history entry, causing undo to oscillate.\n */\nexport function createAccumulatingDispatch(sharedTr: Transaction): (tr: Transaction) => void {\n return (transaction: Transaction): void => {\n if (transaction !== sharedTr) {\n for (const step of transaction.steps) {\n sharedTr.step(step);\n }\n\n // Copy metadata from accumulated transaction to shared transaction.\n // ProseMirror stores metadata as a plain object (tr.meta) accessed\n // via getMeta/setMeta. We access it directly to iterate all entries.\n // Critical for undo/redo: prosemirror-history sets addToHistory and\n // plugin state metadata that must be on the dispatched transaction.\n const meta = (transaction as unknown as { meta: Record<string, unknown> }).meta;\n for (const key of Object.keys(meta)) {\n sharedTr.setMeta(key, meta[key]);\n }\n\n // Copy selection if the accumulated transaction explicitly set one.\n // This ensures commands like undo/redo restore the cursor to the\n // correct position (mapped back through inverted steps).\n // We must re-create the selection against sharedTr.doc because\n // ResolvedPos objects are bound to their document instance.\n if (transaction.selectionSet) {\n const { from, to } = transaction.selection;\n try {\n sharedTr.setSelection(TextSelection.create(sharedTr.doc, from, to));\n } catch {\n // Positions may be invalid if documents diverged - skip\n }\n }\n }\n };\n}\n","/**\n * ChainBuilder - Chainable command builder\n *\n * Provides fluent API for chaining multiple commands with a shared transaction.\n * Commands accumulate changes on the transaction, which is dispatched on run().\n *\n * @example\n * editor.chain()\n * .focus()\n * .insertText('Hello')\n * .toggleBold()\n * .run();\n */\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n ChainedCommands,\n SingleCommands,\n CanCommands,\n ChainFailure,\n} from './types/Commands.js';\nimport {\n buildCommandProps,\n createAccumulatingDispatch,\n} from './commandPropsBuilder.js';\n\n/**\n * Editor interface for ChainBuilder\n */\nexport interface ChainBuilderEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n readonly isDestroyed: boolean;\n}\n\n/**\n * Options for creating a ChainBuilder\n */\nexport interface ChainBuilderOptions {\n editor: ChainBuilderEditor;\n rawCommands: CommandMap;\n tr?: Transaction;\n}\n\n/**\n * Builds chainable commands with shared transaction\n *\n * Uses JavaScript Proxy to dynamically generate command methods.\n * Each command method returns `this` for fluent chaining.\n */\nexport class ChainBuilder {\n private readonly editor: ChainBuilderEditor;\n private readonly rawCommands: CommandMap;\n private readonly tr: Transaction;\n private shouldDispatch = true;\n /** Cached proxy instance for performance (avoids creating new Proxy per command) */\n private _cachedProxy: ChainedCommands | null = null;\n /** Tracks the first command failure in the chain */\n private _failure: ChainFailure | null = null;\n /** Current command index in the chain */\n private _commandIndex = 0;\n /** Cached CommandProps for performance */\n private _cachedProps: CommandProps | null = null;\n /** Cached SingleCommands proxy for performance */\n private _cachedSingleCommands: SingleCommands | null = null;\n /** Cached CanCommands proxy for performance */\n private _cachedCanCommands: CanCommands | null = null;\n\n constructor(options: ChainBuilderOptions) {\n this.editor = options.editor;\n this.rawCommands = options.rawCommands;\n // Use provided transaction or create new one from current state\n this.tr = options.tr ?? options.editor.view.state.tr;\n }\n\n /**\n * Gets cached CommandProps or builds new one\n * In chain mode, dispatch adds to shared transaction\n */\n private buildCommandProps(): CommandProps {\n if (this._cachedProps) {\n return this._cachedProps;\n }\n\n const { editor, tr } = this;\n\n this._cachedProps = buildCommandProps({\n editor,\n tr,\n dispatch: createAccumulatingDispatch(tr),\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: () => this.buildSingleCommands(),\n });\n\n return this._cachedProps;\n }\n\n /**\n * Gets cached SingleCommands proxy or builds new one\n */\n private buildSingleCommands(): SingleCommands {\n if (this._cachedSingleCommands) {\n return this._cachedSingleCommands;\n }\n\n const { rawCommands } = this;\n\n this._cachedSingleCommands = new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n const props = this.buildCommandProps();\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedSingleCommands;\n }\n\n /**\n * Gets cached CanCommands proxy or builds new one\n */\n private buildCanCommands(): CanCommands {\n if (this._cachedCanCommands) {\n return this._cachedCanCommands;\n }\n\n const { editor, rawCommands, tr } = this;\n\n this._cachedCanCommands = new Proxy({} as CanCommands, {\n get: (_, name: string) => {\n if (name === 'chain') {\n // Return a function that creates a CanChainBuilder\n return () => this.buildCanChainCommands();\n }\n\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n // Dry run - dispatch is undefined\n const props: CommandProps = {\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch: undefined,\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: this.buildSingleCommands(),\n };\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedCanCommands;\n }\n\n /**\n * Builds CanChainedCommands for chained dry-run checks\n */\n private buildCanChainCommands(): ChainedCommands {\n const { editor, rawCommands, tr } = this;\n let allSucceeded = true;\n\n const canChainProxy = new Proxy({} as ChainedCommands, {\n get: (_, name: string) => {\n if (name === 'run') {\n return () => allSucceeded;\n }\n\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => {\n allSucceeded = false;\n return canChainProxy;\n };\n }\n\n return (...args: unknown[]) => {\n // Dry run - dispatch is undefined\n const props: CommandProps = {\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch: undefined,\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: this.buildSingleCommands(),\n };\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result) {\n allSucceeded = false;\n }\n return canChainProxy;\n };\n },\n });\n\n return canChainProxy;\n }\n\n /**\n * Execute a custom command within the chain\n *\n * @example\n * editor.chain()\n * .focus()\n * .command(({ tr }) => {\n * tr.insertText('custom');\n * return true;\n * })\n * .run();\n */\n command(fn: (props: CommandProps) => boolean): this {\n const commandIndex = this._commandIndex++;\n const props = this.buildCommandProps();\n const result = fn(props);\n if (!result && !this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: 'command', args: [fn], index: commandIndex };\n }\n return this;\n }\n\n /**\n * Get information about the first command that failed in the chain\n *\n * @returns ChainFailure object or null if no failure occurred\n *\n * @example\n * const chain = editor.chain().toggleBold().setHeading(1);\n * if (!chain.run()) {\n * console.log('Failed:', chain.getFailure());\n * }\n */\n getFailure(): ChainFailure | null {\n return this._failure;\n }\n\n /**\n * Execute the command chain\n * Dispatches the accumulated transaction\n *\n * @returns true if chain was executed successfully\n */\n run(): boolean {\n const { editor, tr, shouldDispatch } = this;\n\n if (editor.isDestroyed) {\n return false;\n }\n\n if (!shouldDispatch) {\n return false;\n }\n\n // Only dispatch if there are actual changes\n if (tr.steps.length === 0 && !tr.selectionSet && !tr.storedMarksSet) {\n return true;\n }\n\n editor.view.dispatch(tr);\n return true;\n }\n\n /**\n * Creates a Proxy that provides dynamic command methods\n * Each method returns `this` for chaining\n *\n * Caches the proxy instance for performance - avoids creating\n * new Proxy objects for each command in the chain.\n */\n proxy(): ChainedCommands {\n if (this._cachedProxy) {\n return this._cachedProxy;\n }\n\n const { rawCommands } = this;\n\n // Create proxy with local const - handlers reference this directly (no assertion needed)\n const proxy: ChainedCommands = new Proxy({} as ChainedCommands, {\n get: (_, name: string) => {\n // Handle special methods\n if (name === 'run') {\n return () => this.run();\n }\n\n if (name === 'getFailure') {\n return () => this.getFailure();\n }\n\n if (name === 'command') {\n return (fn: (props: CommandProps) => boolean) => {\n this.command(fn);\n return proxy;\n };\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return (...args: unknown[]) => {\n const commandIndex = this._commandIndex++;\n if (!this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: name, args, index: commandIndex };\n }\n return proxy;\n };\n }\n\n return (...args: unknown[]) => {\n const commandIndex = this._commandIndex++;\n const props = this.buildCommandProps();\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result && !this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: name, args, index: commandIndex };\n }\n return proxy;\n };\n },\n });\n\n // Cache for subsequent calls\n this._cachedProxy = proxy;\n return proxy;\n }\n}\n\n/**\n * Creates a new ChainBuilder instance\n */\nexport function createChainBuilder(options: ChainBuilderOptions): ChainedCommands {\n const builder = new ChainBuilder(options);\n return builder.proxy();\n}\n","/**\n * CanChecker - Dry-run command checker\n *\n * Provides API for checking if commands CAN be executed without actually executing them.\n * Commands receive dispatch=undefined to indicate dry-run mode.\n *\n * @example\n * // Check single command\n * if (editor.can().toggleBold()) {\n * // Bold can be applied\n * }\n *\n * // Check command chain\n * if (editor.can().chain().toggleBold().toggleItalic().run()) {\n * // Both commands can be executed\n * }\n */\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n CanCommands,\n CanChainedCommands,\n SingleCommands,\n ChainedCommands,\n} from './types/Commands.js';\nimport { buildCommandProps } from './commandPropsBuilder.js';\n\n/**\n * Editor interface for CanChecker\n */\nexport interface CanCheckerEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n readonly isDestroyed: boolean;\n}\n\n/**\n * Options for creating a CanChecker\n */\nexport interface CanCheckerOptions {\n editor: CanCheckerEditor;\n rawCommands: CommandMap;\n /** Function to create a ChainBuilder for chain() within commands */\n createChainBuilder: () => ChainedCommands;\n /**\n * Optional callback when an unknown command is accessed\n * Useful for debugging - called with command name and context\n */\n onUnknownCommand?: (name: string, context: 'single' | 'chain') => void;\n}\n\n/**\n * Checks if commands can be executed (dry-run mode)\n *\n * Uses JavaScript Proxy to dynamically generate command methods.\n * Each command is executed with dispatch=undefined.\n */\nexport class CanChecker {\n private readonly editor: CanCheckerEditor;\n private readonly rawCommands: CommandMap;\n private readonly createChainBuilder: () => ChainedCommands;\n private readonly onUnknownCommand: ((name: string, context: 'single' | 'chain') => void) | undefined;\n\n constructor(options: CanCheckerOptions) {\n this.editor = options.editor;\n this.rawCommands = options.rawCommands;\n this.createChainBuilder = options.createChainBuilder;\n this.onUnknownCommand = options.onUnknownCommand;\n }\n\n /**\n * Builds CommandProps for dry-run checks\n * dispatch is undefined to indicate dry-run mode\n */\n private buildDryRunProps(tr: Transaction): CommandProps {\n const { editor } = this;\n\n return buildCommandProps({\n editor,\n tr,\n dispatch: undefined, // Key difference: undefined for dry-run\n chain: this.createChainBuilder,\n can: () => this.proxy(),\n commands: () => this.buildSingleCommands(tr),\n });\n }\n\n /**\n * Builds SingleCommands for use within can() checks\n */\n private buildSingleCommands(tr: Transaction): SingleCommands {\n const { rawCommands } = this;\n\n return new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n const props = this.buildDryRunProps(tr);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n }\n\n /**\n * Creates a Proxy that provides dynamic can() methods\n * Each method returns boolean indicating if command can execute\n */\n proxy(): CanCommands {\n const { editor, rawCommands } = this;\n\n return new Proxy({} as CanCommands, {\n get: (_, name: string) => {\n // Handle chain() method\n if (name === 'chain') {\n return () => this.chainProxy();\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n this.onUnknownCommand?.(name, 'single');\n return () => false;\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n return false;\n }\n\n const tr = editor.view.state.tr;\n const props = this.buildDryRunProps(tr);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n }\n\n /**\n * Creates a chain proxy for can().chain()\n * Tracks if all commands in chain can execute\n */\n chainProxy(): CanChainedCommands {\n const { editor, rawCommands } = this;\n let allSucceeded = true;\n const tr = editor.view.state.tr;\n\n const chainProxy: CanChainedCommands = new Proxy({} as CanChainedCommands, {\n get: (_, name: string) => {\n // Handle run() - returns accumulated result\n if (name === 'run') {\n return () => allSucceeded;\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n this.onUnknownCommand?.(name, 'chain');\n return () => {\n allSucceeded = false;\n return chainProxy;\n };\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n allSucceeded = false;\n return chainProxy;\n }\n\n const props = this.buildDryRunProps(tr);\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result) {\n allSucceeded = false;\n }\n return chainProxy;\n };\n },\n });\n\n return chainProxy;\n }\n}\n\n/**\n * Creates a new CanChecker instance\n */\nexport function createCanChecker(options: CanCheckerOptions): CanCommands {\n const checker = new CanChecker(options);\n return checker.proxy();\n}\n","/**\n * CommandManager - Manages editor commands\n *\n * Provides unified command API with:\n * - Dynamic commands from extensions\n * - Built-in commands (focus, blur, setContent, etc.)\n * - chain() for chainable commands\n * - can() for checking command availability\n */\nimport type { Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n SingleCommands,\n ChainedCommands,\n CanCommands,\n} from './types/Commands.js';\nimport { builtInCommands } from './commands/index.js';\nimport { createChainBuilder } from './ChainBuilder.js';\nimport { createCanChecker } from './CanChecker.js';\n\n// Re-export option types for backward compatibility\nexport type { SetContentOptions, ClearContentOptions } from './commands/index.js';\n\n/**\n * Editor interface for CommandManager\n * Forward declaration to avoid circular dependency\n */\nexport interface CommandManagerEditor {\n readonly view: EditorView;\n readonly state: CommandManagerEditor['view']['state'];\n readonly isDestroyed: boolean;\n emit(event: string, props?: unknown): void;\n /** Extension manager for collecting extension commands */\n readonly extensionManager: {\n readonly commands: CommandMap;\n };\n}\n\n/**\n * Manages editor commands\n *\n * Provides:\n * - editor.commands.* - Single commands that execute immediately\n * - editor.chain().*.run() - Chainable commands with shared transaction\n * - editor.can().* - Dry-run checks if commands can execute\n */\nexport class CommandManager {\n private readonly editor: CommandManagerEditor;\n\n /** Cached raw commands (built-in + extension) */\n private _rawCommands: CommandMap | null = null;\n\n /** Cached commands proxy to avoid allocation on every access */\n private _cachedCommands: SingleCommands | null = null;\n\n /** Cached dispatch function to avoid allocation on every command */\n private readonly _dispatch: (tr: Transaction) => void;\n\n constructor(editor: CommandManagerEditor) {\n this.editor = editor;\n this._dispatch = (tr: Transaction): void => {\n editor.view.dispatch(tr);\n };\n }\n\n /**\n * Gets all raw commands (built-in + extension commands)\n * Cached after first access\n */\n get rawCommands(): CommandMap {\n this._rawCommands ??= {\n ...builtInCommands,\n ...this.editor.extensionManager.commands,\n };\n return this._rawCommands;\n }\n\n /**\n * Builds CommandProps for executing a command\n */\n private buildCommandProps(tr: Transaction, dispatch?: (tr: Transaction) => void): CommandProps {\n const { editor } = this;\n\n return {\n // Cast needed: CommandManagerEditor is a minimal interface for dependency injection,\n // but CommandProps expects the full Editor type. Callers pass the actual Editor instance.\n editor: editor as unknown as CommandProps['editor'],\n state: editor.state,\n tr,\n dispatch,\n chain: () => this.chain(),\n can: () => this.can(),\n commands: this.commands,\n };\n }\n\n /**\n * Single commands that execute immediately\n * Uses Proxy to dynamically generate command methods (ID-1)\n *\n * @example\n * editor.commands.focus('end');\n * editor.commands.insertText('Hello');\n */\n get commands(): SingleCommands {\n if (this._cachedCommands) return this._cachedCommands;\n\n const { editor, rawCommands } = this;\n\n this._cachedCommands = new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n return false;\n }\n\n // Create fresh transaction for each command\n const tr = editor.state.tr;\n\n const props = this.buildCommandProps(tr, this._dispatch);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedCommands;\n }\n\n /**\n * Creates a chainable command builder\n *\n * Commands accumulate on a shared transaction, dispatched on run()\n *\n * @example\n * editor.chain()\n * .focus()\n * .insertText('Hello')\n * .run();\n */\n chain(): ChainedCommands {\n const { editor, rawCommands } = this;\n\n return createChainBuilder({\n editor,\n rawCommands,\n });\n }\n\n /**\n * Creates a command availability checker (dry-run mode)\n *\n * Commands are executed with dispatch=undefined to check if they can run\n *\n * @example\n * if (editor.can().toggleBold()) {\n * // Bold can be applied\n * }\n *\n * if (editor.can().chain().toggleBold().toggleItalic().run()) {\n * // Both can be applied\n * }\n */\n can(): CanCommands {\n const { editor, rawCommands } = this;\n\n return createCanChecker({\n editor,\n rawCommands,\n createChainBuilder: () => this.chain(),\n });\n }\n\n /**\n * Clears cached commands\n * Call this if extensions change dynamically\n */\n clearCache(): void {\n this._rawCommands = null;\n this._cachedCommands = null;\n }\n}\n","/**\n * Inline Styles Utility\n *\n * Applies inline CSS styles to serialized HTML so it renders correctly\n * when pasted outside the editor (email clients, CMS, Google Docs, etc.).\n *\n * Uses hardcoded light-theme defaults (same approach as Google Docs, Notion,\n * TinyMCE). Optionally accepts overrides for custom styling.\n *\n * Only structural styles are inlined (borders, padding, margins, fonts).\n * Colors are NOT inlined — explicit colors (TextColor, Highlight, cell bg)\n * are already inline from renderHTML, and default text color is browser default.\n */\n\n// ---------------------------------------------------------------------------\n// Override keys — users can override any of these\n// ---------------------------------------------------------------------------\n\nexport interface InlineStyleOverrides {\n blockquoteBorder?: string;\n blockquoteColor?: string;\n tableBorder?: string;\n tableHeaderBg?: string;\n codeBg?: string;\n codeFont?: string;\n codeBorder?: string;\n codeBlockBg?: string;\n codeBlockFont?: string;\n hrBorder?: string;\n linkColor?: string;\n detailsBorder?: string;\n detailsBg?: string;\n /**\n * How to export table column widths from `data-colwidth` attributes.\n * - `'percent'` (default): convert to percentage widths on first-row cells\n * - `'pixel'`: convert to pixel widths on first-row cells, table gets fixed width\n * - `'none'`: leave `data-colwidth` as-is, no width styles applied\n */\n tableColumnWidths?: 'percent' | 'pixel' | 'none';\n /**\n * Optional callback to syntax-highlight code blocks.\n * Receives the raw text content and optional language, returns highlighted HTML\n * with `<span class=\"hljs-*\">` markup (or any spans with inline styles).\n *\n * @example\n * ```ts\n * import { createLowlight, common } from 'lowlight';\n * import { toHtml } from 'hast-util-to-html';\n * const lowlight = createLowlight(common);\n *\n * inlineStyles(html, {\n * codeHighlighter: (code, language) => {\n * if (language && lowlight.registered(language)) {\n * return toHtml(lowlight.highlight(language, code));\n * }\n * return null; // no highlighting\n * },\n * });\n * ```\n */\n codeHighlighter?: (code: string, language: string | null) => string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Syntax highlighting colors (from packages/theme/src/_syntax.scss)\n// GitHub-style light theme — hardcoded for consistent export.\n// ---------------------------------------------------------------------------\n\nconst SYNTAX_COLORS: Record<string, string> = {\n // Keywords, types, doctags\n 'hljs-doctag': '#d73a49',\n 'hljs-keyword': '#d73a49',\n 'hljs-template-tag': '#d73a49',\n 'hljs-template-variable': '#d73a49',\n 'hljs-type': '#d73a49',\n\n // Function & class names\n 'hljs-title': '#6f42c1',\n\n // Constants, numbers, operators, attributes\n 'hljs-attr': '#005cc5',\n 'hljs-attribute': '#005cc5',\n 'hljs-literal': '#005cc5',\n 'hljs-meta': '#005cc5',\n 'hljs-number': '#005cc5',\n 'hljs-operator': '#005cc5',\n 'hljs-variable': '#e36209',\n 'hljs-selector-attr': '#005cc5',\n 'hljs-selector-class': '#005cc5',\n 'hljs-selector-id': '#005cc5',\n\n // Strings & regex\n 'hljs-regexp': '#032f62',\n 'hljs-string': '#032f62',\n\n // Built-ins & symbols\n 'hljs-built_in': '#e36209',\n 'hljs-symbol': '#e36209',\n\n // Comments\n 'hljs-comment': '#6a737d',\n 'hljs-code': '#6a737d',\n 'hljs-formula': '#6a737d',\n\n // HTML/XML tag names, selectors\n 'hljs-name': '#22863a',\n 'hljs-quote': '#22863a',\n 'hljs-selector-tag': '#22863a',\n 'hljs-selector-pseudo': '#22863a',\n\n // Markup\n 'hljs-section': '#005cc5',\n 'hljs-bullet': '#22863a',\n\n // Diff\n 'hljs-addition': '#22863a',\n 'hljs-deletion': '#b31d28',\n};\n\n// ---------------------------------------------------------------------------\n// Light-theme defaults (from packages/theme/src/_variables.scss)\n// ---------------------------------------------------------------------------\n\ntype StyleDefaults = Required<Omit<InlineStyleOverrides, 'codeHighlighter'>>;\n\nconst DEFAULTS: StyleDefaults = {\n blockquoteBorder: '3px solid #6a6a6a',\n blockquoteColor: '#6a6a6a',\n tableBorder: '1px solid #e5e7eb',\n tableHeaderBg: '#f8f9fa',\n codeBg: '#f0f0f0',\n codeFont: '\"SF Mono\", \"Fira Code\", Consolas, \"Liberation Mono\", Menlo, monospace',\n codeBorder: '1px solid #e5e7eb',\n codeBlockBg: '#f0f0f0',\n codeBlockFont: '\"SF Mono\", \"Fira Code\", Consolas, \"Liberation Mono\", Menlo, monospace',\n hrBorder: '2px solid #e5e7eb',\n linkColor: '#2563eb',\n detailsBorder: '1px solid #e5e7eb',\n detailsBg: '#f8f9fa',\n tableColumnWidths: 'percent' as const,\n};\n\n// ---------------------------------------------------------------------------\n// Core implementation\n// ---------------------------------------------------------------------------\n\nfunction resolveOverrides(overrides?: InlineStyleOverrides): StyleDefaults {\n if (!overrides) return DEFAULTS;\n return { ...DEFAULTS, ...overrides };\n}\n\n/**\n * Applies inline styles to all elements in a container.\n * Exported for use in clipboardSerializer (operates on DOM directly).\n */\nexport function applyInlineStyles(container: HTMLElement, overrides?: InlineStyleOverrides): void {\n const v = resolveOverrides(overrides);\n\n // Syntax-highlight code blocks if a highlighter is provided\n if (overrides?.codeHighlighter) {\n const codeBlocks = Array.from(container.querySelectorAll('pre > code'));\n for (const code of codeBlocks) {\n const raw = code.textContent || '';\n const langClass = Array.from(code.classList).find(c => c.startsWith('language-'));\n const language = langClass ? langClass.slice('language-'.length) : null;\n const highlighted = overrides.codeHighlighter(raw, language);\n if (highlighted !== null) {\n code.innerHTML = highlighted;\n }\n }\n }\n\n const elements = Array.from(container.querySelectorAll('blockquote, table, td, th, pre, code, hr, a, img, h1, h2, h3, h4, h5, h6, ul, ol, li, details, summary, div, span'));\n\n for (const el of elements) {\n const tag = el.tagName;\n const existing = el.getAttribute('style') ?? '';\n let styles = '';\n\n switch (tag) {\n case 'BLOCKQUOTE':\n styles = `border-left: ${v.blockquoteBorder}; color: ${v.blockquoteColor}; margin: 0.75em 0; padding: 0.25em 0 0.25em 1em;`;\n break;\n\n case 'TABLE':\n styles = `border-collapse: collapse; width: 100%; margin: 0.75em 0;`;\n break;\n\n case 'TD': {\n styles = `border: ${v.tableBorder}; padding: 0.5em 0.75em; overflow-wrap: break-word; word-wrap: break-word; box-sizing: border-box;`;\n const tdTextAlign = el.getAttribute('data-text-align');\n if (tdTextAlign) styles += ` text-align: ${tdTextAlign};`;\n const tdVerticalAlign = el.getAttribute('data-vertical-align');\n if (tdVerticalAlign) styles += ` vertical-align: ${tdVerticalAlign};`;\n break;\n }\n\n case 'TH': {\n styles = `border: ${v.tableBorder}; padding: 0.5em 0.75em; overflow-wrap: break-word; word-wrap: break-word; box-sizing: border-box; font-weight: 600; background: ${v.tableHeaderBg}; text-align: left;`;\n const thTextAlign = el.getAttribute('data-text-align');\n if (thTextAlign) styles += ` text-align: ${thTextAlign};`;\n const thVerticalAlign = el.getAttribute('data-vertical-align');\n if (thVerticalAlign) styles += ` vertical-align: ${thVerticalAlign};`;\n break;\n }\n\n case 'PRE':\n styles = `background: ${v.codeBlockBg}; font-family: ${v.codeBlockFont}; font-size: 0.875em; padding: 1em; border-radius: 0.375rem; overflow-x: auto; margin: 0.75em 0;`;\n break;\n\n case 'CODE': {\n const parent = el.parentElement;\n if (parent?.tagName === 'PRE') {\n // Code inside pre — reset inline code styles\n styles = 'background: none; padding: 0; border: none; border-radius: 0; font-size: inherit;';\n } else {\n // Inline code\n styles = `background: ${v.codeBg}; font-family: ${v.codeFont}; font-size: 0.875em; padding: 0.15em 0.35em; border: ${v.codeBorder}; border-radius: 0.25rem;`;\n }\n break;\n }\n\n case 'HR':\n styles = `border: none; border-top: ${v.hrBorder}; margin: 1.5em 0;`;\n break;\n\n case 'A':\n styles = `color: ${v.linkColor}; text-decoration: underline;`;\n break;\n\n case 'IMG':\n styles = 'max-width: 100%; height: auto; display: block; margin: 0.75em 0;';\n break;\n\n case 'H1':\n styles = 'font-size: 2em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H2':\n styles = 'font-size: 1.5em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H3':\n styles = 'font-size: 1.25em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H4':\n styles = 'font-size: 1.1em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H5':\n styles = 'font-size: 1em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H6':\n styles = 'font-size: 0.9em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n\n case 'UL':\n if (el.getAttribute('data-type') === 'taskList') {\n styles = 'list-style: none; padding-left: 0; margin: 0.75em 0;';\n } else {\n styles = 'margin: 0.75em 0; padding-left: 1.5em;';\n }\n break;\n\n case 'OL':\n styles = 'margin: 0.75em 0; padding-left: 1.5em;';\n break;\n\n case 'LI':\n if (el.getAttribute('data-type') === 'taskItem') {\n styles = 'display: flex; align-items: flex-start; gap: 0.5em; margin: 0.25em 0;';\n // Checked task item — style the content div\n if (el.getAttribute('data-checked') === 'true') {\n const contentDiv = el.querySelector(':scope > div');\n if (contentDiv) {\n const contentExisting = contentDiv.getAttribute('style') ?? '';\n contentDiv.setAttribute(\n 'style',\n 'text-decoration: line-through; opacity: 0.6;' + contentExisting,\n );\n }\n }\n } else {\n styles = 'margin: 0.25em 0;';\n }\n break;\n\n case 'DETAILS':\n styles = `border: ${v.detailsBorder}; border-radius: 0.375rem; margin: 0.75em 0;`;\n break;\n\n case 'SUMMARY':\n styles = `font-weight: 600; padding: 0.5em 0.75em; background: ${v.detailsBg}; border-radius: 0.375rem 0.375rem 0 0; cursor: pointer; list-style: none;`;\n break;\n\n case 'DIV':\n if (el.hasAttribute('data-details-content')) {\n styles = `padding: 0.5em 0.75em; border-top: ${v.detailsBorder};`;\n }\n break;\n\n case 'SPAN': {\n if (!el.className) break;\n // Syntax highlighting — apply inline color for hljs-* classes\n const classList = el.className.split(' ');\n for (const cls of classList) {\n const color = SYNTAX_COLORS[cls];\n if (color) {\n styles = `color: ${color};`;\n break;\n }\n }\n // hljs-section is bold, hljs-emphasis italic, hljs-strong bold\n if (el.classList.contains('hljs-section') || el.classList.contains('hljs-strong')) {\n styles += ' font-weight: bold;';\n }\n if (el.classList.contains('hljs-emphasis')) {\n styles += ' font-style: italic;';\n }\n // Diff backgrounds\n if (el.classList.contains('hljs-addition')) {\n styles += ' background-color: #f0fff4;';\n }\n if (el.classList.contains('hljs-deletion')) {\n styles += ' background-color: #ffeef0;';\n }\n break;\n }\n }\n\n // Merge: theme defaults first, then existing inline styles (user-set wins)\n if (styles) {\n el.setAttribute('style', styles + ' ' + existing);\n }\n }\n\n // --- Table column widths (second pass) ---\n if (v.tableColumnWidths !== 'none') {\n const tables = Array.from(container.querySelectorAll('table'));\n for (const table of tables) {\n const firstRow = table.querySelector('tr');\n if (!firstRow) continue;\n\n const firstRowCells = Array.from(firstRow.querySelectorAll<HTMLElement>('td, th'));\n // Collect all column widths from first-row cells (handles colspan via comma-separated values)\n const widths: number[] = [];\n let allHaveWidths = true;\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth');\n if (!raw) { allHaveWidths = false; break; }\n const parsed = raw.split(',').map(Number);\n if (parsed.some(n => !n || isNaN(n))) { allHaveWidths = false; break; }\n widths.push(...parsed);\n }\n if (!allHaveWidths || widths.length === 0) continue;\n\n const sum = widths.reduce((s, w) => s + w, 0);\n\n // table-layout: fixed ensures the browser respects the exact widths\n const tableStyle = table.getAttribute('style') ?? '';\n if (v.tableColumnWidths === 'percent') {\n table.setAttribute('style', tableStyle + ' table-layout: fixed;');\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth') ?? '';\n const parsed = raw.split(',').map(Number);\n const cellPercent = parsed.reduce((s, w) => s + w, 0) / sum * 100;\n const existing = cell.getAttribute('style') ?? '';\n cell.setAttribute('style', existing + ` width: ${cellPercent.toFixed(2)}%;`);\n }\n } else {\n // pixel mode\n table.setAttribute('style', tableStyle.replace(/width:\\s*100%/, `width: ${String(sum)}px`) + ' table-layout: fixed;');\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth') ?? '';\n const parsed = raw.split(',').map(Number);\n const cellWidth = parsed.reduce((s, w) => s + w, 0);\n const existing = cell.getAttribute('style') ?? '';\n cell.setAttribute('style', existing + ` width: ${String(cellWidth)}px;`);\n }\n }\n\n // Keep data-colwidth on cells for round-trip back into the editor\n }\n }\n}\n\n/**\n * Takes an HTML string and returns it with inline CSS styles applied\n * to all elements, so it renders correctly outside the editor.\n *\n * @param html - Serialized HTML string from editor.getHTML()\n * @param overrides - Optional style overrides for custom theming\n *\n * @example\n * ```ts\n * // Default light-theme styles\n * const styled = inlineStyles(editor.getHTML());\n *\n * // With custom overrides\n * const styled = inlineStyles(editor.getHTML(), {\n * blockquoteBorder: '5px solid red',\n * linkColor: '#ff6600',\n * });\n * ```\n */\nexport function inlineStyles(html: string, overrides?: InlineStyleOverrides): string {\n if (!html) return html;\n\n const div = document.createElement('div');\n div.innerHTML = html;\n applyInlineStyles(div, overrides);\n return div.innerHTML;\n}\n","/**\n * Normalizes browser-computed color values (rgb/rgba) to hex format.\n * Browsers convert hex colors to rgb() in element.style, causing\n * isActive mismatches when comparing stored values after HTML re-parsing.\n */\nexport function normalizeColor(color: string): string {\n const rgbMatch = /^rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/.exec(color);\n if (rgbMatch?.[1] && rgbMatch[2] && rgbMatch[3]) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n }\n return color;\n}\n","/**\n * Editor - Main editor class wrapping ProseMirror\n *\n * Manages extensions, schema, commands, and the ProseMirror EditorView/State.\n */\nimport type { Transaction, Plugin, PluginKey } from '@domternal/pm/state';\nimport { EditorState } from '@domternal/pm/state';\nimport { EditorView } from '@domternal/pm/view';\nimport { DOMSerializer } from '@domternal/pm/model';\nimport type { Schema, Fragment } from '@domternal/pm/model';\n\nimport { EventEmitter } from './EventEmitter.js';\nimport { ExtensionManager } from './ExtensionManager.js';\nimport { CommandManager } from './CommandManager.js';\nimport { createDocument, isDocumentEmpty } from './helpers/index.js';\nimport { inlineStyles, type InlineStyleOverrides } from './utils/inlineStyles.js';\nimport { normalizeColor } from './helpers/normalizeColor.js';\nimport {\n focus as focusCommand,\n blur as blurCommand,\n setContent as setContentCommand,\n clearContent as clearContentCommand,\n} from './commands/index.js';\nimport type {\n EditorOptions,\n EditorEvents,\n Content,\n JSONContent,\n FocusPosition,\n SingleCommands,\n ChainedCommands,\n CanCommands,\n Command,\n ToolbarItem,\n} from './types/index.js';\n\n/**\n * Main editor class\n *\n * Wraps ProseMirror's EditorView and EditorState with a cleaner API.\n *\n * @example\n * ```ts\n * import { Editor } from '@domternal/core';\n * import { Schema } from '@domternal/pm/model';\n *\n * const schema = new Schema({\n * nodes: { doc: { content: 'paragraph+' }, paragraph: { content: 'text*' }, text: {} }\n * });\n *\n * const editor = new Editor({\n * schema,\n * element: document.getElementById('editor'),\n * content: '<p>Hello world</p>',\n * });\n *\n * // Get content\n * const json = editor.getJSON();\n * const html = editor.getHTML();\n *\n * // Set content\n * editor.commands.setContent('<p>New content</p>');\n *\n * // Cleanup\n * editor.destroy();\n * ```\n */\nexport class Editor extends EventEmitter<EditorEvents> {\n /**\n * Editor configuration options\n */\n private options: EditorOptions;\n\n /**\n * Manages extensions and schema\n * @internal Exposed for CommandManager, not for public use\n */\n private _extensionManager!: ExtensionManager;\n\n /**\n * Gets the extension manager\n * @internal For CommandManager use only\n */\n get extensionManager(): ExtensionManager {\n return this._extensionManager;\n }\n\n /**\n * Manages commands\n */\n private commandManager!: CommandManager;\n\n /**\n * ProseMirror EditorView instance\n */\n public view!: EditorView;\n\n /**\n * Whether the editor has been destroyed\n */\n private _isDestroyed = false;\n\n /**\n * Timer for autofocus (cleared on destroy to prevent memory leaks)\n */\n private _autofocusTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Creates a new Editor instance\n *\n * @param options - Editor configuration\n * @throws Error if running in SSR environment (no window)\n * @throws Error if schema is not provided\n */\n constructor(options: EditorOptions) {\n super();\n\n // SSR Guard - Editor requires browser environment\n if (typeof window === 'undefined') {\n throw new Error(\n 'Editor requires a browser environment. ' +\n 'For server-side rendering, use generateHTML() and generateJSON() helpers instead.'\n );\n }\n\n // Validate: need either schema or extensions\n if (!options.schema && (!options.extensions || options.extensions.length === 0)) {\n throw new Error(\n 'Editor requires either schema or extensions. ' +\n 'Provide a ProseMirror schema directly, or use extensions like [Document, Paragraph, Text].'\n );\n }\n\n this.options = {\n editable: true,\n ...options,\n };\n\n this.createEditor();\n }\n\n // === Getters ===\n\n /**\n * Gets the current EditorState\n */\n get state(): EditorState {\n return this.view.state;\n }\n\n /**\n * Gets the ProseMirror schema\n */\n get schema(): Schema {\n return this._extensionManager.schema;\n }\n\n /**\n * Checks if the editor is editable\n */\n get isEditable(): boolean {\n return this.view.editable;\n }\n\n /**\n * Checks if the editor content is empty\n */\n get isEmpty(): boolean {\n return isDocumentEmpty(this.state.doc);\n }\n\n /**\n * Checks if the editor has focus\n */\n get isFocused(): boolean {\n return this.view.hasFocus();\n }\n\n /**\n * Checks if the editor has been destroyed\n */\n get isDestroyed(): boolean {\n return this._isDestroyed;\n }\n\n /**\n * Gets single commands for immediate execution\n * @example editor.commands.focus('end')\n */\n get commands(): SingleCommands {\n return this.commandManager.commands;\n }\n\n /**\n * Creates a command chain for batched execution\n * @example editor.chain().focus().insertText('Hello').run()\n */\n chain(): ChainedCommands {\n return this.commandManager.chain();\n }\n\n /**\n * Checks if commands can be executed (dry-run)\n * @example if (editor.can().toggleBold()) { ... }\n */\n can(): CanCommands {\n return this.commandManager.can();\n }\n\n /**\n * Gets extension storage\n * Access via: editor.storage.extensionName.propertyName\n */\n get storage(): Record<string, unknown> {\n return this._extensionManager.storage;\n }\n\n /**\n * Gets toolbar items registered by all extensions.\n * Used by framework toolbar components to auto-generate UI.\n */\n get toolbarItems(): ToolbarItem[] {\n return this._extensionManager.toolbarItems;\n }\n\n // === Active State Methods ===\n\n /**\n * Checks if a node or mark is currently active\n *\n * For toolbar button states - returns true if:\n * - For marks: the current selection has the mark applied\n * - For nodes: the cursor is inside that node type\n *\n * @param nameOrAttributes - Extension name, or object with name and attributes\n * @param attributes - Optional attributes to match (for node/mark specific states)\n *\n * @example\n * editor.isActive('bold') // → true if bold mark is active\n * editor.isActive('heading', { level: 2 }) // → true if in h2\n * editor.isActive({ name: 'textAlign', attributes: { align: 'center' } })\n */\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean {\n // Normalize arguments\n const name = typeof nameOrAttributes === 'string' ? nameOrAttributes : nameOrAttributes.name;\n const attrs = typeof nameOrAttributes === 'string' ? attributes : nameOrAttributes.attributes;\n\n const { state } = this;\n const { selection, schema } = state;\n const { from, to, $from } = selection;\n\n // Check if it's a mark\n const markType = schema.marks[name];\n if (markType) {\n // For empty selection, check marks at cursor or stored marks\n if (selection.empty) {\n const storedMarks = state.storedMarks ?? $from.marks();\n const hasMark = storedMarks.some(mark => mark.type === markType);\n if (!hasMark) return false;\n\n // Check attributes if specified\n if (attrs) {\n const mark = storedMarks.find(m => m.type === markType);\n return mark ? this.matchAttributes(mark.attrs, attrs) : false;\n }\n return true;\n }\n\n // For range selection, check if all applicable text has the mark.\n // Skip text that can't have this mark: inside blocks that don't allow it\n // (e.g. code blocks) or carrying a mark that excludes it (e.g. inline code).\n const check = { hasApplicableText: false, hasMark: true };\n state.doc.nodesBetween(from, to, (node, _pos, parent) => {\n if (node.isText) {\n if (parent && !parent.type.allowsMarkType(markType)) {\n return; // skip text in mark-incompatible blocks\n }\n if (node.marks.some(m => m.type.excludes(markType) && m.type !== markType)) {\n return; // skip text with marks that exclude this mark type\n }\n check.hasApplicableText = true;\n const nodeMark = node.marks.find(m => m.type === markType);\n if (!nodeMark) {\n check.hasMark = false;\n return false; // Stop iteration\n }\n if (attrs && !this.matchAttributes(nodeMark.attrs, attrs)) {\n check.hasMark = false;\n return false;\n }\n }\n return true;\n });\n return check.hasApplicableText && check.hasMark;\n }\n\n // Check if it's a node\n const nodeType = schema.nodes[name];\n if (nodeType) {\n // NodeSelection — check the selected node directly (atom/leaf nodes like image)\n const selNode = (selection as { node?: { type: typeof nodeType; attrs: Record<string, unknown> } }).node;\n if (selNode?.type === nodeType) {\n return attrs ? this.matchAttributes(selNode.attrs, attrs) : true;\n }\n\n // Check both $from and $to paths — the node must be an ancestor\n // of both ends of the selection for it to be considered active.\n const { $to } = selection;\n\n // For list-group nodes, only the innermost list ancestor should be\n // considered active. This prevents e.g. both bulletList and orderedList\n // showing as active when a bullet list is nested inside an ordered list.\n const isListNode = nodeType.spec.group?.split(' ').includes('list') ?? false;\n\n const findInPath = ($pos: typeof $from): boolean => {\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth);\n\n if (isListNode) {\n const inListGroup = node.type.spec.group?.split(' ').includes('list') ?? false;\n if (inListGroup) {\n // First (innermost) list ancestor — only match if it's the target type\n if (node.type !== nodeType) return false;\n return attrs ? this.matchAttributes(node.attrs, attrs) : true;\n }\n } else {\n if (node.type === nodeType) {\n return attrs ? this.matchAttributes(node.attrs, attrs) : true;\n }\n }\n }\n return false;\n };\n\n return findInPath($from) && findInPath($to);\n }\n\n return false;\n }\n\n /**\n * Gets attributes of the currently active node or mark\n *\n * Returns empty object if the node/mark is not found or not active.\n *\n * @param name - Extension name (node or mark)\n *\n * @example\n * editor.getAttributes('heading') // → { level: 2 }\n * editor.getAttributes('link') // → { href: 'https://...', target: '_blank' }\n */\n getAttributes(name: string): Record<string, unknown> {\n const { state } = this;\n const { selection, schema } = state;\n const { $from } = selection;\n\n // Check if it's a mark\n const markType = schema.marks[name];\n if (markType) {\n // Get marks at cursor position or stored marks\n const marks = state.storedMarks ?? $from.marks();\n const mark = marks.find(m => m.type === markType);\n return mark ? { ...mark.attrs } : {};\n }\n\n // Check if it's a node\n const nodeType = schema.nodes[name];\n if (nodeType) {\n // Find node in selection path\n for (let depth = $from.depth; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type === nodeType) {\n return { ...node.attrs };\n }\n }\n return {};\n }\n\n return {};\n }\n\n /**\n * Helper to match attributes\n * Returns true if target contains all key/value pairs from source\n */\n private matchAttributes(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n ): boolean {\n for (const [key, value] of Object.entries(source)) {\n if (target[key] !== value) {\n return false;\n }\n }\n return true;\n }\n\n // === Content Methods ===\n\n /**\n * Gets the document content as JSON\n */\n getJSON(): JSONContent {\n return this.state.doc.toJSON() as JSONContent;\n }\n\n /**\n * Gets the document content as HTML string\n *\n * @param options - Optional settings\n * @param options.styled - When true (or an override object), applies inline CSS\n * styles so the HTML renders correctly outside the editor (email, CMS, etc.)\n */\n getHTML(options?: { styled?: boolean | InlineStyleOverrides }): string {\n const fragment = DOMSerializer.fromSchema(this.schema).serializeFragment(\n this.state.doc.content\n );\n\n const div = document.createElement('div');\n div.appendChild(fragment);\n\n // Browser DOM normalizes hex colors to rgb() — convert back to hex within style attrs\n const html = div.innerHTML.replace(/style=\"([^\"]*)\"/g, (_match, style: string) =>\n 'style=\"' +\n style.replace(\n /rgba?\\(\\s*\\d+[\\s,]+\\d+[\\s,]+\\d+[^)]*\\)/g,\n (colorStr) => normalizeColor(colorStr),\n ) +\n '\"',\n );\n\n if (options?.styled) {\n const overrides = typeof options.styled === 'object' ? options.styled : undefined;\n return inlineStyles(html, overrides);\n }\n\n return html;\n }\n\n /**\n * Gets the document content as plain text\n *\n * @param options - Options for text extraction\n * @param options.blockSeparator - String to insert between blocks (default: '\\n\\n')\n */\n getText(options: { blockSeparator?: string } = {}): string {\n const { blockSeparator = '\\n\\n' } = options;\n return this.state.doc.textBetween(\n 0,\n this.state.doc.content.size,\n blockSeparator\n );\n }\n\n /**\n * Executes a command with proper CommandProps\n * @internal\n */\n private runCommand(command: Command): boolean {\n const tr = this.state.tr;\n return command({\n editor: this,\n state: this.state,\n tr,\n dispatch: (t) => { this.view.dispatch(t); },\n chain: () => this.chain(),\n can: () => this.can(),\n commands: this.commands,\n });\n }\n\n /**\n * Sets the editor content\n *\n * @param content - JSON or HTML content\n * @param emitUpdate - Whether to emit update event (default: true)\n * @returns true if content was set successfully, false if content was invalid\n */\n setContent(content: Content, emitUpdate = true): boolean {\n return this.runCommand(setContentCommand(content, { emitUpdate }));\n }\n\n /**\n * Clears the editor content\n *\n * @param emitUpdate - Whether to emit update event (default: true)\n * @returns true if content was cleared successfully\n */\n clearContent(emitUpdate = true): boolean {\n return this.runCommand(clearContentCommand({ emitUpdate }));\n }\n\n // === Lifecycle Methods ===\n\n /**\n * Sets whether the editor is editable\n *\n * @param editable - Whether the editor should be editable\n */\n setEditable(editable: boolean): this {\n this.options.editable = editable;\n\n // ProseMirror rechecks editable on each transaction\n // Dispatch empty transaction to trigger re-evaluation\n this.view.dispatch(this.state.tr);\n\n return this;\n }\n\n /**\n * Focuses the editor\n *\n * @param position - Where to place cursor (default: null = just focus)\n */\n focus(position: FocusPosition = null): this {\n this.runCommand(focusCommand(position));\n return this;\n }\n\n /**\n * Removes focus from the editor\n */\n blur(): this {\n this.runCommand(blurCommand());\n return this;\n }\n\n // === Dynamic Plugin Management ===\n\n /**\n * Registers a ProseMirror plugin dynamically at runtime.\n * Used by framework wrappers (e.g. Angular BubbleMenu component) to add\n * plugins after the editor is created.\n */\n registerPlugin(plugin: Plugin): void {\n // Prevent duplicate registration (same plugin key)\n if (plugin.spec.key?.get(this.view.state)) return;\n\n const newState = this.view.state.reconfigure({\n plugins: [...this.view.state.plugins, plugin],\n });\n this.view.updateState(newState);\n }\n\n /**\n * Unregisters a ProseMirror plugin by its PluginKey.\n * Uses PluginKey.get() to identify the plugin to remove.\n */\n unregisterPlugin(key: PluginKey): void {\n const pluginToRemove = key.get(this.view.state);\n if (!pluginToRemove) return;\n\n const newState = this.view.state.reconfigure({\n plugins: this.view.state.plugins.filter((p) => p !== pluginToRemove),\n });\n this.view.updateState(newState);\n }\n\n /**\n * Destroys the editor and cleans up resources\n *\n * After calling destroy(), the editor instance should not be used.\n */\n destroy(): void {\n if (this._isDestroyed) {\n return;\n }\n\n // Clear autofocus timer if pending\n if (this._autofocusTimer) {\n clearTimeout(this._autofocusTimer);\n this._autofocusTimer = null;\n }\n\n this.emit('destroy');\n this.options.onDestroy?.();\n\n // Destroy ProseMirror view\n this.view.destroy();\n\n // Destroy managers\n this._extensionManager.destroy();\n\n // Clear all event listeners\n this.removeAllListeners();\n\n this._isDestroyed = true;\n }\n\n // === Private Methods ===\n\n /**\n * Builds a clipboardSerializer that applies a transform function to HTML on copy/cut.\n */\n private buildClipboardSerializer(\n transform: (html: string) => string,\n schema: Schema,\n ): { clipboardSerializer: DOMSerializer } {\n return {\n clipboardSerializer: {\n serializeFragment: (fragment: unknown, options?: Record<string, unknown>) => {\n const base = DOMSerializer.fromSchema(schema);\n const dom = base.serializeFragment(fragment as Fragment, options);\n const wrapper = document.createElement('div');\n wrapper.appendChild(dom);\n wrapper.innerHTML = transform(wrapper.innerHTML);\n const frag = document.createDocumentFragment();\n while (wrapper.firstChild) frag.appendChild(wrapper.firstChild);\n return frag;\n },\n } as unknown as DOMSerializer,\n };\n }\n\n /**\n * Creates the editor instance\n */\n private createEditor(): void {\n // 1. Emit beforeCreate - extensions can modify options in Step 2\n this.emit('beforeCreate', { editor: this });\n this.options.onBeforeCreate?.({ editor: this });\n // Note: Extension onBeforeCreate is called after ExtensionManager is created (step 2)\n\n // 2. Initialize ExtensionManager with extensions or schema\n this._extensionManager = new ExtensionManager(\n {\n extensions: this.options.extensions,\n schema: this.options.schema,\n },\n this\n );\n\n // 2.1 Call onBeforeCreate on all extensions (now that they have editor reference)\n this._extensionManager.callOnBeforeCreate();\n\n this._extensionManager.validateSchema();\n\n // 3. Create initial document from content (with graceful error handling)\n let doc;\n try {\n doc = createDocument(\n this.options.content ?? null,\n this._extensionManager.schema\n );\n } catch (error) {\n // Emit content error event for invalid content\n const contentError = error instanceof Error ? error : new Error(String(error));\n this.emit('contentError', {\n editor: this,\n error: contentError,\n content: this.options.content,\n });\n this.options.onContentError?.({\n editor: this,\n error: contentError,\n content: this.options.content,\n });\n\n // Fall back to empty document\n doc = createDocument(null, this._extensionManager.schema);\n }\n\n // 4. Get plugins from extensions (empty in Step 1.3)\n const plugins = this._extensionManager.plugins;\n\n // 5. Create EditorState\n const state = EditorState.create({\n schema: this._extensionManager.schema,\n doc,\n plugins,\n });\n\n // 6. Resolve element - use provided or create detached div\n const element = this.options.element ?? document.createElement('div');\n\n // 7. Create EditorView\n const nodeViews = this._extensionManager.nodeViews;\n this.view = new EditorView(element, {\n state,\n dispatchTransaction: this.dispatchTransaction.bind(this),\n editable: () => this.options.editable ?? true,\n ...(Object.keys(nodeViews).length > 0 ? { nodeViews } : {}),\n // Clipboard transform — apply user-provided transform (e.g. inlineStyles) on copy/cut\n ...(this.options.clipboardHTMLTransform\n ? this.buildClipboardSerializer(this.options.clipboardHTMLTransform, this._extensionManager.schema)\n : {}),\n // Handle focus/blur events\n handleDOMEvents: {\n focus: (_view, event) => {\n this.emit('focus', { editor: this, event: event });\n this.options.onFocus?.({ editor: this, event: event });\n this._extensionManager.callOnFocus({ event });\n return false;\n },\n blur: (_view, event) => {\n this.emit('blur', { editor: this, event: event });\n this.options.onBlur?.({ editor: this, event: event });\n this._extensionManager.callOnBlur({ event });\n return false;\n },\n },\n });\n\n // 8. Emit mount event - view is now attached to DOM element\n this.emit('mount', { editor: this, view: this.view });\n this.options.onMount?.({ editor: this, view: this.view });\n\n // 9. Initialize CommandManager\n this.commandManager = new CommandManager(this);\n\n // 10. Handle autofocus\n if (this.options.autofocus) {\n // Use setTimeout to ensure DOM is ready\n // Store reference for cleanup on destroy\n this._autofocusTimer = setTimeout(() => {\n this._autofocusTimer = null;\n if (!this._isDestroyed) {\n this.focus(this.options.autofocus);\n }\n }, 0);\n }\n\n // 11. Set up error event handler for onError callback\n this.on('error', (props) => {\n this.options.onError?.(props);\n });\n\n // 12. Emit create event and call extension onCreate hooks\n this.emit('create', { editor: this });\n this.options.onCreate?.({ editor: this });\n this._extensionManager.callOnCreate();\n }\n\n /**\n * Handles ProseMirror transactions\n */\n private dispatchTransaction(transaction: Transaction): void {\n if (this._isDestroyed) {\n return;\n }\n\n // 1. Apply transaction to state\n const newState = this.view.state.apply(transaction);\n\n // 2. Update view\n this.view.updateState(newState);\n\n // 3. Emit transaction event (fires for EVERY transaction)\n this.emit('transaction', { editor: this, transaction });\n this.options.onTransaction?.({ editor: this, transaction });\n this._extensionManager.callOnTransaction({ transaction });\n\n // 4. Check if we should skip update event\n const skipUpdate = transaction.getMeta('skipUpdate') as boolean | undefined;\n\n // 5. Emit selectionUpdate if selection changed (without doc change)\n if (!transaction.docChanged && transaction.selectionSet) {\n this.emit('selectionUpdate', { editor: this, transaction });\n this.options.onSelectionUpdate?.({ editor: this, transaction });\n this._extensionManager.callOnSelectionUpdate();\n }\n\n // 6. Emit update if document changed\n if (transaction.docChanged && !skipUpdate) {\n this.emit('update', { editor: this, transaction });\n this.options.onUpdate?.({ editor: this, transaction });\n this._extensionManager.callOnUpdate();\n }\n }\n\n /**\n * Emit method - needed for CommandManager interface\n */\n override emit<E extends keyof EditorEvents>(\n event: E,\n ...args: EditorEvents[E] extends undefined ? [] : [EditorEvents[E]]\n ): this {\n return super.emit(event, ...args);\n }\n}\n","/**\n * Thin wrapper around @floating-ui/dom for consistent floating element positioning.\n *\n * Used by BubbleMenu, FloatingMenu, Link Popover, and exposed for extension\n * authors building custom floating UI (emoji suggestion, slash command, etc.).\n */\nimport {\n computePosition,\n flip,\n shift,\n offset,\n hide,\n autoUpdate,\n type Placement,\n} from '@floating-ui/dom';\n\nexport interface PositionFloatingOptions {\n /** Placement relative to reference. @default 'bottom' */\n placement?: Placement;\n /** Distance from reference in px. @default 4 */\n offsetValue?: number;\n /** Viewport padding for flip/shift in px. @default 10 */\n padding?: number;\n /** Track ancestor scroll events. Disable for static anchors (e.g. toolbar buttons). @default true */\n trackScroll?: boolean;\n}\n\n/**\n * Positions a floating element relative to a reference element or virtual rect,\n * and keeps it positioned on scroll, resize, and layout shifts.\n *\n * Uses `autoUpdate` from floating-ui with `animationFrame` polling for\n * jitter-free scroll tracking (rAF syncs with browser paint).\n *\n * Includes `hide` middleware — when the reference element is scrolled out of\n * view, the floating element is hidden via `visibility: hidden`.\n *\n * The floating element must have `position: fixed`.\n *\n * Returns a cleanup function. **Always call it** when hiding or destroying\n * the floating element to stop listeners and prevent memory leaks.\n *\n * @example\n * ```ts\n * // Start auto-positioning (follows scroll/resize)\n * const cleanup = positionFloating(buttonEl, dropdownEl, {\n * placement: 'bottom-start',\n * });\n *\n * // Virtual reference (e.g. cursor position — must return fresh coords)\n * const virtualEl = {\n * getBoundingClientRect: () => {\n * const coords = view.coordsAtPos(pos);\n * return new DOMRect(coords.left, coords.top, 0, coords.bottom - coords.top);\n * },\n * };\n * const cleanup = positionFloating(virtualEl, tooltipEl, { placement: 'top' });\n *\n * // Stop when done\n * cleanup();\n * ```\n */\nexport function positionFloating(\n reference: Element | { getBoundingClientRect: () => DOMRect },\n floating: HTMLElement,\n options?: PositionFloatingOptions,\n): () => void {\n const placementOpt = options?.placement ?? 'bottom';\n const paddingOpt = options?.padding ?? 10;\n const middleware = [\n offset(options?.offsetValue ?? 4),\n flip({ padding: paddingOpt }),\n shift({ padding: paddingOpt }),\n hide(),\n ];\n\n const update = (): void => {\n void computePosition(\n reference as Element,\n floating,\n {\n strategy: 'fixed',\n placement: placementOpt,\n middleware,\n },\n ).then(({ x, y, middlewareData }) => {\n // Use transform instead of left/top — GPU-accelerated, no layout reflow,\n // eliminates visible jitter during scroll tracking.\n Object.assign(floating.style, {\n left: '0',\n top: '0',\n transform: `translate3d(${String(x)}px,${String(y)}px,0)`,\n });\n\n // Hide floating element when reference is scrolled out of view\n const hidden = middlewareData.hide?.referenceHidden;\n floating.style.visibility = hidden ? 'hidden' : '';\n });\n };\n\n // When scroll tracking is enabled, use requestAnimationFrame polling\n // instead of scroll event listeners. rAF runs in the same frame as the\n // browser paint, so the position update is synchronous with the scroll —\n // no 1-frame lag / jitter. Slightly more CPU than event-based, but\n // imperceptible on modern devices and only active while the element is shown.\n //\n // ancestorScroll is always off: when rAF is enabled it's redundant,\n // when rAF is disabled (trackScroll:false) no scroll tracking is wanted.\n const trackScroll = options?.trackScroll ?? true;\n return autoUpdate(reference as Element, floating, update, {\n ancestorScroll: false,\n animationFrame: trackScroll,\n });\n}\n\n/**\n * Positions a floating element using `strategy: 'absolute'` so it scrolls\n * together with its offsetParent — zero jitter by design.\n *\n * Ideal for dropdowns inside scroll containers (e.g. emoji suggestion inside\n * `.dm-editor`) and toolbar dropdowns. The absolute coordinates are stable\n * across scrolls — only `flip`/`shift` decisions change on scroll, producing\n * a discrete jump rather than continuous jitter.\n *\n * The floating element must have `position: absolute` and its offsetParent\n * must have `position: relative`.\n *\n * Returns a cleanup function — call it when hiding or destroying the\n * floating element.\n */\nexport function positionFloatingOnce(\n reference: Element | { getBoundingClientRect: () => DOMRect },\n floating: HTMLElement,\n options?: PositionFloatingOptions,\n): () => void {\n const placementOpt = options?.placement ?? 'bottom';\n const paddingOpt = options?.padding ?? 10;\n const middleware = [\n offset(options?.offsetValue ?? 4),\n flip({ padding: paddingOpt }),\n shift({ padding: paddingOpt }),\n ];\n\n const update = (): void => {\n void computePosition(\n reference as Element,\n floating,\n {\n strategy: 'absolute',\n placement: placementOpt,\n middleware,\n },\n ).then(({ x, y }) => {\n Object.assign(floating.style, {\n left: '0',\n top: '0',\n transform: `translate3d(${String(Math.round(x))}px,${String(Math.round(y))}px,0)`,\n });\n });\n };\n\n // Track scroll + resize. With strategy:'absolute' the base coordinates\n // are stable across scrolls — only flip/shift decisions change (discrete\n // jump, not continuous jitter).\n const trackScroll = options?.trackScroll ?? true;\n return autoUpdate(reference as Element, floating, update, {\n ancestorScroll: trackScroll,\n layoutShift: false,\n });\n}\n","/**\n * Node - Base class for node extensions\n *\n * Nodes define document structure elements that contribute to the schema.\n * Examples: Paragraph, Heading, List, Image, etc.\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const Paragraph = Node.create({\n * name: 'paragraph',\n * group: 'block',\n * content: 'inline*',\n * parseHTML() {\n * return [{ tag: 'p' }];\n * },\n * renderHTML({ HTMLAttributes }) {\n * return ['p', HTMLAttributes, 0];\n * },\n * });\n */\n\nimport type { NodeSpec, NodeType, TagParseRule } from '@domternal/pm/model';\nimport { Extension, type ExtensionEditorInterface, mergeConfigWithParentBinding } from './Extension.js';\nimport type { NodeConfig, NodeContext } from './types/NodeConfig.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\nimport { buildProseMirrorAttrs, buildHTMLAttributes } from './helpers/specBuilder.js';\n\n/**\n * Extended editor interface for Node\n * Includes schema access for NodeType getter\n */\nexport interface NodeEditorInterface extends ExtensionEditorInterface {\n readonly schema: {\n nodes: Record<string, NodeType>;\n };\n}\n\n/**\n * Base class for node extensions\n *\n * @typeParam Options - Node options type\n * @typeParam Storage - Node storage type\n */\nexport class Node<Options = unknown, Storage = unknown> extends Extension<\n Options,\n Storage\n> {\n /**\n * Node type identifier\n * Distinguishes nodes from extensions and marks\n */\n override readonly type = 'node' as const;\n\n /**\n * The original configuration object\n * Typed as NodeConfig for node-specific properties\n */\n declare readonly config: NodeConfig<Options, Storage>;\n\n /**\n * Editor instance with schema access\n * null until set by ExtensionManager\n */\n override editor: NodeEditorInterface | null = null;\n\n /**\n * Protected constructor - use Node.create() instead\n */\n protected constructor(config: NodeConfig<Options, Storage>) {\n super(config);\n }\n\n /**\n * Get the ProseMirror NodeType from schema\n *\n * This is a lazy getter because schema doesn't exist at node creation time.\n * Schema is built FROM nodes by ExtensionManager.\n *\n * Returns null if editor is not yet initialized.\n * Always check editor is set before using nodeType.\n */\n get nodeType(): NodeType | null {\n if (!this.editor) {\n return null;\n }\n return this.editor.schema.nodes[this.name] ?? null;\n }\n\n /**\n * Get NodeType or throw if not initialized.\n * Use in contexts where editor is guaranteed to be set (like addCommands).\n */\n get nodeTypeOrThrow(): NodeType {\n const type = this.nodeType;\n if (!type) {\n throw new Error(\n `Node \"${this.name}\" is not initialized. ` +\n `Make sure the editor is created before accessing nodeType.`\n );\n }\n return type;\n }\n\n /**\n * Creates a new node instance\n *\n * @param config - Node configuration\n * @returns New node instance\n *\n * @example\n * const Paragraph = Node.create({\n * name: 'paragraph',\n * group: 'block',\n * content: 'inline*',\n * });\n */\n static override create<O = unknown, S = unknown>(\n config: NodeConfig<O, S>\n ): Node<O, S> {\n return new Node(config);\n }\n\n /**\n * Creates a new node with merged options\n * Original node is not modified\n *\n * **Note:** Options are merged shallowly using object spread (`...`).\n * Nested objects are replaced entirely, not deeply merged.\n *\n * @param options - Options to merge with existing options\n * @returns New node instance with merged options\n *\n * @example\n * const CustomParagraph = Paragraph.configure({ HTMLAttributes: { class: 'custom' } });\n *\n * @example\n * // Shallow merge behavior with nested objects:\n * // Given: options = { HTMLAttributes: { class: 'a', id: 'b' } }\n * // configure({ HTMLAttributes: { class: 'c' } })\n * // Result: { HTMLAttributes: { class: 'c' } } — 'id' is lost!\n * // To preserve nested values, spread manually:\n * // configure({ HTMLAttributes: { ...original.options.HTMLAttributes, class: 'c' } })\n */\n override configure(options: Partial<Options>): Node<Options, Storage> {\n const newConfig: NodeConfig<Options, Storage> = {\n ...this.config,\n addOptions: () => ({\n ...this.options,\n ...options,\n }),\n };\n\n return new Node(newConfig);\n }\n\n /**\n * Creates a new node with extended configuration\n * Original node is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addAttributes`, `parseHTML`) are\n * replaced entirely, not combined with the base node's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New node instance with extended config\n *\n * @example\n * const CustomParagraph = Paragraph.extend({\n * name: 'customParagraph',\n * addAttributes() {\n * return { ...this.parent?.(), align: { default: 'left' } };\n * },\n * });\n *\n * @example\n * // To preserve base node's parse rules while adding new ones:\n * const Extended = BaseNode.extend({\n * parseHTML() {\n * const baseRules = BaseNode.config.parseHTML?.call(this) ?? [];\n * return [...baseRules, { tag: 'custom-tag' }];\n * },\n * });\n */\n override extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<NodeConfig<ExtendedOptions, ExtendedStorage>> &\n ThisType<NodeContext<ExtendedOptions, ExtendedStorage>>\n ): Node<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Node(newConfig as NodeConfig<ExtendedOptions, ExtendedStorage>);\n }\n\n /**\n * Creates a ProseMirror NodeSpec from this node's configuration\n *\n * Called by ExtensionManager when building the schema.\n * Converts our config format to ProseMirror's NodeSpec format.\n *\n * @returns ProseMirror NodeSpec\n */\n createNodeSpec(): NodeSpec {\n const spec: NodeSpec = {};\n\n // Schema properties - use callOrReturn for group/inline to support dynamic values\n if (this.config.group !== undefined) spec.group = callOrReturn(this.config.group, this);\n if (this.config.content !== undefined) spec.content = this.config.content;\n if (this.config.inline !== undefined) spec.inline = callOrReturn(this.config.inline, this);\n if (this.config.atom !== undefined) spec.atom = this.config.atom;\n if (this.config.selectable !== undefined)\n spec.selectable = this.config.selectable;\n if (this.config.draggable !== undefined)\n spec.draggable = this.config.draggable;\n if (this.config.code !== undefined) spec.code = this.config.code;\n if (this.config.whitespace !== undefined)\n spec.whitespace = this.config.whitespace;\n if (this.config.isolating !== undefined)\n spec.isolating = this.config.isolating;\n if (this.config.defining !== undefined)\n spec.defining = this.config.defining;\n if (this.config.marks !== undefined) spec.marks = this.config.marks;\n if (this.config.allowGapCursor !== undefined)\n (spec as Record<string, unknown>)['allowGapCursor'] =\n this.config.allowGapCursor;\n if (this.config.tableRole !== undefined)\n (spec as Record<string, unknown>)['tableRole'] =\n this.config.tableRole;\n\n // Leaf text - bind to extension instance so this.storage etc. are available\n if (this.config.leafText !== undefined) {\n if (typeof this.config.leafText === 'function') {\n const leafTextFn = this.config.leafText;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const instance = this;\n spec.leafText = (node) => leafTextFn.call(instance, node);\n } else {\n spec.leafText = () => this.config.leafText as string;\n }\n }\n\n // Attributes - convert AttributeSpecs to ProseMirror attrs\n const attributeSpecs = callOrReturn(this.config.addAttributes, this);\n if (attributeSpecs) {\n spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n }\n\n // Parse rules - convert to parseDOM\n const parseRules = callOrReturn(this.config.parseHTML, this);\n if (parseRules && parseRules.length > 0) {\n // Build parseDOM array with proper typing\n // ProseMirror's TagParseRule type is strict, so we cast through unknown\n const parseDOMRules = parseRules.map((rule) => {\n // Build parse rule object using object literal to avoid index signature issues\n const parseRule: {\n tag?: string;\n style?: string;\n priority?: number;\n consuming?: boolean;\n context?: string;\n preserveWhitespace?: boolean | 'full';\n getAttrs?: (\n node: HTMLElement | string\n ) => Record<string, unknown> | false | null;\n } = {};\n\n if (rule.tag) parseRule.tag = rule.tag;\n if (rule.style) parseRule.style = rule.style;\n if (rule.priority !== undefined) parseRule.priority = rule.priority;\n if (rule.consuming !== undefined) parseRule.consuming = rule.consuming;\n if (rule.context) parseRule.context = rule.context;\n if (rule.preserveWhitespace !== undefined)\n parseRule.preserveWhitespace = rule.preserveWhitespace;\n\n // Handle getAttrs - need to merge with attribute parseHTML\n if (rule.getAttrs || attributeSpecs) {\n parseRule.getAttrs = (node: HTMLElement | string) => {\n // If node is string (for style rules), skip attribute parsing\n if (typeof node === 'string') {\n return rule.getAttrs\n ? rule.getAttrs(node as unknown as HTMLElement) ?? {}\n : {};\n }\n\n // Get attrs from rule\n const ruleAttrs = rule.getAttrs ? rule.getAttrs(node) : {};\n\n // If rule returned null, skip this rule\n if (ruleAttrs === null || ruleAttrs === undefined) {\n return false;\n }\n\n // Get attrs from attribute parseHTML functions\n const parsedAttrs: Record<string, unknown> = { ...ruleAttrs };\n if (attributeSpecs) {\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n if (attrSpec.parseHTML) {\n parsedAttrs[name] = attrSpec.parseHTML(node);\n }\n }\n }\n\n return parsedAttrs;\n };\n }\n\n return parseRule;\n });\n\n // Cast required: Our NodeParseRule type is structurally compatible with\n // ProseMirror's TagParseRule but TypeScript can't infer this due to\n // our custom getAttrs return type. The cast is safe.\n spec.parseDOM = parseDOMRules as unknown as readonly TagParseRule[];\n }\n\n // Render - convert renderHTML to toDOM\n if (this.config.renderHTML) {\n const renderFn = this.config.renderHTML;\n const attrSpecs = attributeSpecs;\n // Capture 'this' (the Node instance) for use in toDOM\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const nodeInstance = this;\n\n spec.toDOM = (node) => {\n const htmlAttrs = attrSpecs\n ? buildHTMLAttributes(node.attrs, attrSpecs)\n : {};\n\n // Call renderFn with Node instance as 'this' context\n return renderFn.call(nodeInstance, { node, HTMLAttributes: htmlAttrs });\n };\n }\n\n return spec;\n }\n}\n","/**\n * ToolbarController — Headless, framework-agnostic toolbar state machine\n *\n * Manages toolbar item collection, grouping, active state tracking,\n * dropdown state, and keyboard navigation. Framework wrappers (Angular,\n * React, Vue) bind their templates to this controller.\n *\n * @example\n * const controller = new ToolbarController(editor, () => {\n * // Called on every state change — trigger framework re-render\n * });\n * controller.subscribe();\n * // ... use controller.groups, controller.activeMap, etc.\n * controller.destroy();\n */\n\nimport type { ToolbarItem, ToolbarButton, ToolbarDropdown, ToolbarLayoutEntry } from './types/Toolbar.js';\n\n/**\n * Editor interface for ToolbarController.\n * Minimal surface to avoid circular dependency on Editor class.\n */\nexport interface ToolbarControllerEditor {\n readonly toolbarItems: ToolbarItem[];\n readonly storage: Record<string, unknown>;\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean;\n readonly commands: Record<string, (...args: unknown[]) => boolean>;\n can(): Record<string, (...args: unknown[]) => boolean>;\n on(event: string, handler: (...args: unknown[]) => void): void;\n off(event: string, handler: (...args: unknown[]) => void): void;\n}\n\n/**\n * A group of toolbar items with the same group name.\n */\nexport interface ToolbarGroup {\n name: string;\n items: ToolbarItem[];\n}\n\n/**\n * Flattened button reference for keyboard navigation.\n */\ninterface FlatButton {\n item: ToolbarButton | ToolbarDropdown;\n groupIndex: number;\n itemIndex: number;\n}\n\n/** Minimal editor shape for static helpers (avoids strict ToolbarControllerEditor compatibility issues) */\ninterface ToolbarItemEditor {\n readonly storage: Record<string, unknown>;\n readonly commands: Record<string, (...args: unknown[]) => boolean>;\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean;\n}\n\nexport class ToolbarController {\n /**\n * Resolves the active state of a toolbar button against the editor.\n * Shared between ToolbarController and framework components (e.g. bubble-menu).\n */\n static resolveActive(editor: ToolbarItemEditor, item: ToolbarButton): boolean {\n if (item.isActiveFn) return item.isActiveFn(editor);\n if (!item.isActive) return false;\n if (typeof item.isActive === 'string') return editor.isActive(item.isActive);\n if (Array.isArray(item.isActive)) {\n return item.isActive.some(c =>\n typeof c === 'string' ? editor.isActive(c) : editor.isActive(c.name, c.attributes));\n }\n return editor.isActive(item.isActive.name, item.isActive.attributes);\n }\n\n /**\n * Executes a toolbar button's command on the editor.\n * Shared between ToolbarController and framework components (e.g. bubble-menu).\n */\n static executeItem(editor: ToolbarItemEditor, item: ToolbarButton): void {\n const cmd = editor.commands[item.command];\n if (cmd) {\n if (item.commandArgs?.length) {\n cmd(...item.commandArgs);\n } else {\n cmd();\n }\n }\n }\n\n private editor: ToolbarControllerEditor;\n private onChange: () => void;\n private _layout: ToolbarLayoutEntry[] | null;\n private transactionHandler: (() => void) | null = null;\n\n /** Grouped and sorted toolbar items */\n private _groups: ToolbarGroup[] = [];\n\n /** Active state for each button (keyed by item.name) */\n private _activeMap = new Map<string, boolean>();\n\n /** Disabled state for each button (keyed by item.name) */\n private _disabledMap = new Map<string, boolean>();\n\n /** Expanded state for emitEvent buttons — true when their panel is open */\n private _expandedMap = new Map<string, boolean>();\n\n /** Currently open dropdown name (null = none) */\n private _openDropdown: string | null = null;\n\n /** Focused button index for roving tabindex (-1 = none) */\n private _focusedIndex = 0;\n\n /** Flat list of top-level buttons/dropdowns for keyboard nav */\n private _flatButtons: FlatButton[] = [];\n\n constructor(editor: ToolbarControllerEditor, onChange: () => void, layout?: ToolbarLayoutEntry[]) {\n this.editor = editor;\n this.onChange = onChange;\n this._layout = layout ?? null;\n this.rebuild();\n }\n\n // === Getters ===\n\n get groups(): ToolbarGroup[] {\n return this._groups;\n }\n\n get activeMap(): ReadonlyMap<string, boolean> {\n return this._activeMap;\n }\n\n get disabledMap(): ReadonlyMap<string, boolean> {\n return this._disabledMap;\n }\n\n get expandedMap(): ReadonlyMap<string, boolean> {\n return this._expandedMap;\n }\n\n get openDropdown(): string | null {\n return this._openDropdown;\n }\n\n get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n get flatButtonCount(): number {\n return this._flatButtons.length;\n }\n\n // === State Methods ===\n\n /**\n * Checks if a toolbar button is currently active.\n */\n isActive(item: ToolbarButton): boolean {\n return this._activeMap.get(item.name) ?? false;\n }\n\n /**\n * Checks if a toolbar button is currently disabled (command cannot execute).\n */\n isDisabled(item: ToolbarButton): boolean {\n return this._disabledMap.get(item.name) ?? false;\n }\n\n /**\n * Executes a toolbar button's command.\n */\n executeCommand(item: ToolbarButton): void {\n ToolbarController.executeItem(this.editor, item);\n this.updateActiveStates();\n }\n\n /**\n * Toggles a dropdown open/closed.\n */\n toggleDropdown(name: string): void {\n this._openDropdown = this._openDropdown === name ? null : name;\n this.onChange();\n }\n\n /**\n * Closes any open dropdown.\n */\n closeDropdown(): void {\n if (this._openDropdown !== null) {\n this._openDropdown = null;\n this.onChange();\n }\n }\n\n // === Keyboard Navigation ===\n\n /**\n * Move focus to the next button (ArrowRight).\n */\n navigateNext(): number {\n if (this._flatButtons.length === 0) return -1;\n this._focusedIndex = (this._focusedIndex + 1) % this._flatButtons.length;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the previous button (ArrowLeft).\n */\n navigatePrev(): number {\n if (this._flatButtons.length === 0) return -1;\n this._focusedIndex =\n (this._focusedIndex - 1 + this._flatButtons.length) % this._flatButtons.length;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the first button (Home).\n */\n navigateFirst(): number {\n this._focusedIndex = 0;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the last button (End).\n */\n navigateLast(): number {\n this._focusedIndex = Math.max(0, this._flatButtons.length - 1);\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Set focused index directly (e.g. on mouse enter).\n */\n setFocusedIndex(index: number): void {\n if (index >= 0 && index < this._flatButtons.length) {\n this._focusedIndex = index;\n }\n }\n\n /**\n * Get the flat index of a top-level item by name.\n */\n getFlatIndex(name: string): number {\n return this._flatButtons.findIndex((fb) => fb.item.name === name);\n }\n\n // === Lifecycle ===\n\n /**\n * Subscribes to editor transaction events for active state tracking.\n */\n subscribe(): void {\n this.transactionHandler = () => {\n this.updateActiveStates();\n };\n this.editor.on('transaction', this.transactionHandler);\n this.updateActiveStates();\n }\n\n /**\n * Unsubscribes from editor events and cleans up.\n */\n destroy(): void {\n if (this.transactionHandler) {\n this.editor.off('transaction', this.transactionHandler);\n this.transactionHandler = null;\n }\n this._groups = [];\n this._activeMap.clear();\n this._disabledMap.clear();\n this._expandedMap.clear();\n this._flatButtons = [];\n }\n\n // === Internal ===\n\n /**\n * Rebuilds groups and flat button list from editor.toolbarItems.\n * When a layout is provided, uses layout-based resolution instead of default grouping.\n */\n private rebuild(): void {\n const items = this.editor.toolbarItems;\n this._groups = this._layout\n ? this.resolveLayout(items, this._layout)\n : this.groupItems(items);\n this._flatButtons = this.buildFlatList();\n this._focusedIndex = 0;\n }\n\n /**\n * Groups items by their `group` property, preserving extension order within groups.\n * Items without a group go into a default '' group.\n * Within each group, items are sorted by priority (higher first).\n */\n private groupItems(items: ToolbarItem[]): ToolbarGroup[] {\n const groupMap = new Map<string, ToolbarItem[]>();\n const groupOrder: string[] = [];\n\n for (const item of items) {\n // Skip items marked as bubble-menu-only\n if (item.type === 'button' && item.toolbar === false) continue;\n const groupName = ('group' in item && item.group) ? item.group : '';\n let list = groupMap.get(groupName);\n if (!list) {\n list = [];\n groupMap.set(groupName, list);\n groupOrder.push(groupName);\n }\n list.push(item);\n }\n\n // Sort items within each group by priority (higher first)\n const groups: ToolbarGroup[] = [];\n for (const name of groupOrder) {\n const groupItems = groupMap.get(name) ?? [];\n groupItems.sort((a, b) => {\n const pa = a.priority ?? 100;\n const pb = b.priority ?? 100;\n return pb - pa;\n });\n groups.push({ name, items: groupItems });\n }\n\n return groups;\n }\n\n /**\n * Resolves a layout array into ToolbarGroups by looking up registered items by name.\n * Separators ('|') split items into visual groups.\n * String entries resolve to existing buttons or dropdowns.\n * ToolbarLayoutDropdown entries build custom dropdowns from named sub-items.\n */\n private resolveLayout(items: ToolbarItem[], layout: ToolbarLayoutEntry[]): ToolbarGroup[] {\n // Build lookup maps from registered toolbar items\n const buttonMap = new Map<string, ToolbarButton>();\n const dropdownMap = new Map<string, ToolbarDropdown>();\n\n for (const item of items) {\n if (item.type === 'button') {\n buttonMap.set(item.name, item);\n } else if (item.type === 'dropdown') {\n dropdownMap.set(item.name, item);\n for (const sub of item.items) {\n buttonMap.set(sub.name, sub);\n }\n }\n }\n\n // Walk layout entries, building groups split by '|'\n const groups: ToolbarGroup[] = [];\n let current: ToolbarItem[] = [];\n let groupIdx = 0;\n\n for (const entry of layout) {\n if (entry === '|') {\n if (current.length > 0) {\n groups.push({ name: `layout-${String(groupIdx++)}`, items: current });\n current = [];\n }\n continue;\n }\n\n if (typeof entry === 'string') {\n const dd = dropdownMap.get(entry);\n if (dd) {\n current.push(dd);\n } else {\n const btn = buttonMap.get(entry);\n if (btn) current.push(btn);\n }\n continue;\n }\n\n // ToolbarLayoutDropdown — build a custom dropdown from named sub-items\n const subItems: ToolbarButton[] = [];\n for (const subName of entry.items) {\n const btn = buttonMap.get(subName);\n if (btn) subItems.push(btn);\n }\n if (subItems.length > 0) {\n const dd: ToolbarDropdown = {\n type: 'dropdown',\n name: `layout-dd-${entry.dropdown}`,\n icon: entry.icon,\n label: entry.dropdown,\n items: subItems,\n };\n if (entry.displayMode) dd.displayMode = entry.displayMode;\n if (entry.dynamicIcon) dd.dynamicIcon = entry.dynamicIcon;\n current.push(dd);\n }\n }\n\n if (current.length > 0) {\n groups.push({ name: `layout-${String(groupIdx)}`, items: current });\n }\n\n return groups;\n }\n\n /**\n * Builds a flat list of top-level buttons/dropdowns for keyboard navigation.\n */\n private buildFlatList(): FlatButton[] {\n const flat: FlatButton[] = [];\n for (const [gi, group] of this._groups.entries()) {\n for (const [ii, item] of group.items.entries()) {\n if (item.type === 'button' || item.type === 'dropdown') {\n flat.push({ item, groupIndex: gi, itemIndex: ii });\n }\n }\n }\n return flat;\n }\n\n /**\n * Updates active state map by checking editor.isActive() for each button.\n */\n private updateActiveStates(): void {\n // Cache can() proxy once per cycle — avoids creating a new Proxy per button\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try {\n canProxy = this.editor.can();\n } catch {\n // can() may throw if editor is in an invalid state\n }\n\n for (const group of this._groups) {\n for (const item of group.items) {\n if (item.type === 'button') {\n this.checkButtonActive(item);\n this.checkButtonDisabled(item, canProxy);\n this.checkButtonExpanded(item);\n } else if (item.type === 'dropdown') {\n for (const sub of item.items) {\n this.checkButtonActive(sub);\n this.checkButtonDisabled(sub, canProxy);\n }\n // Dropdown trigger is disabled when ALL sub-items are disabled\n const allDisabled = item.items.length > 0\n && item.items.every(sub => this._disabledMap.get(sub.name));\n this._disabledMap.set(item.name, allDisabled);\n }\n }\n }\n\n // Always notify — even when no active/disabled states changed, cursor\n // position may have moved, which affects dynamic trigger labels that\n // read computed styles at cursor (e.g. font-size, font-family dropdowns\n // showing values not in the configured list).\n this.onChange();\n }\n\n private checkButtonDisabled(\n item: ToolbarButton,\n canProxy: Record<string, (...args: unknown[]) => boolean> | null,\n ): boolean {\n const wasDisabled = this._disabledMap.get(item.name) ?? false;\n let nowDisabled = false;\n\n try {\n if (item.emitEvent) {\n // emitEvent buttons open a popover — can't do meaningful can() dry-run\n // because the command needs user-provided args (href, src, etc.).\n // Instead, check if cursor is in a code block where marks/inserts are blocked.\n nowDisabled = this.editor.isActive('codeBlock');\n } else if (canProxy) {\n const canCmd = canProxy[item.command];\n if (canCmd) {\n nowDisabled = item.commandArgs?.length\n ? !canCmd(...item.commandArgs)\n : !canCmd();\n }\n }\n } catch {\n // Command dry-run may throw (e.g. buggy extension) — treat as enabled\n }\n\n if (wasDisabled !== nowDisabled) {\n this._disabledMap.set(item.name, nowDisabled);\n return true;\n }\n\n return false;\n }\n\n private checkButtonActive(item: ToolbarButton): boolean {\n if (!item.isActive && !item.isActiveFn) return false;\n\n const wasActive = this._activeMap.get(item.name) ?? false;\n const nowActive = ToolbarController.resolveActive(this.editor, item);\n\n if (wasActive !== nowActive) {\n this._activeMap.set(item.name, nowActive);\n return true;\n }\n\n return false;\n }\n\n private checkButtonExpanded(item: ToolbarButton): boolean {\n if (!item.emitEvent) return false;\n\n const wasExpanded = this._expandedMap.get(item.name) ?? false;\n const ext = this.editor.storage[item.name] as Record<string, unknown> | undefined;\n const nowExpanded = ext?.['isOpen'] === true;\n\n if (wasExpanded !== nowExpanded) {\n this._expandedMap.set(item.name, nowExpanded);\n return true;\n }\n\n return false;\n }\n}\n","// Phosphor Icons (MIT) — https://phosphoricons.com/\n\nimport type { IconSet } from '../types/Toolbar.js';\n\nexport const defaultIcons: IconSet = {\n // --- Format: Inline ---\n textB:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M178.48,115.7A44,44,0,0,0,148,40H80a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8h80a48,48,0,0,0,18.48-92.3ZM88,56h60a28,28,0,0,1,0,56H88Zm72,136H88V128h72a32,32,0,0,1,0,64Z\"/></svg>',\n\n textItalic:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200,56a8,8,0,0,1-8,8H157.77L115.1,192H144a8,8,0,0,1,0,16H64a8,8,0,0,1,0-16H98.23L140.9,64H112a8,8,0,0,1,0-16h80A8,8,0,0,1,200,56Z\"/></svg>',\n\n textUnderline:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z\"/></svg>',\n\n textStrikethrough:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H175.93c9.19,7.11,16.07,17.2,16.07,32,0,13.34-7,25.7-19.75,34.79C160.33,211.31,144.61,216,128,216s-32.33-4.69-44.25-13.21C71,193.7,64,181.34,64,168a8,8,0,0,1,16,0c0,17.35,22,32,48,32s48-14.65,48-32c0-14.85-10.54-23.58-38.77-32H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM76.33,104a8,8,0,0,0,7.61-10.49A17.3,17.3,0,0,1,83.11,88c0-18.24,19.3-32,44.89-32,18.84,0,34.16,7.42,41,19.85a8,8,0,0,0,14-7.7C173.33,50.52,152.77,40,128,40,93.29,40,67.11,60.63,67.11,88a33.73,33.73,0,0,0,1.62,10.49A8,8,0,0,0,76.33,104Z\"/></svg>',\n\n code:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\"/></svg>',\n\n highlighterCircle:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M201.54,54.46A104,104,0,0,0,54.46,201.54,104,104,0,0,0,201.54,54.46ZM96,210V152h64v58a88.33,88.33,0,0,1-64,0Zm48-74H112V100.94l32-16Zm46.22,54.22A88.09,88.09,0,0,1,176,201.77V152a16,16,0,0,0-16-16V72a8,8,0,0,0-11.58-7.16l-48,24A8,8,0,0,0,96,96v40a16,16,0,0,0-16,16v49.77a88,88,0,1,1,110.22-11.55Z\"/></svg>',\n\n textSubscript:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M248,208a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.56a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.34,32.18,32.18,0,0,1,4.63-8.59,32,32,0,0,1,51.11,38.52L208,200h32A8,8,0,0,1,248,208ZM149.24,50a8,8,0,0,0-11.29.81L92,103.78l-45.95-53A8,8,0,0,0,34,61.24L81.41,116,34,170.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,116l47.46-54.76A8,8,0,0,0,149.24,50Z\"/></svg>',\n\n textSuperscript:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M248,144a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.55a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.33,32,32,0,1,1,55.74,29.92L208,136h32A8,8,0,0,1,248,144ZM149.24,74a8,8,0,0,0-11.29.8L92,127.79l-45.95-53A8,8,0,0,0,34,85.24L81.41,140,34,194.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,140l47.46-54.76A8,8,0,0,0,149.24,74Z\"/></svg>',\n\n link:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z\"/></svg>',\n\n // --- Format: Block ---\n paragraph:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,40H96a64,64,0,0,0,0,128h40v40a8,8,0,0,0,16,0V56h24V208a8,8,0,0,0,16,0V56h16a8,8,0,0,0,0-16ZM136,152H96a48,48,0,0,1,0-96h40Z\"/></svg>',\n\n textH:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,56V200a8,8,0,0,1-16,0V136H64v64a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v64H192V56a8,8,0,0,1,16,0Z\"/></svg>',\n\n textHOne:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm75.77,49a8,8,0,0,0-8.21.39l-24,16a8,8,0,1,0,8.88,13.32L216,127V208a8,8,0,0,0,16,0V112A8,8,0,0,0,227.77,105Z\"/></svg>',\n\n textHTwo:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm88,144H208l33.55-44.74a32,32,0,1,0-55.73-29.93,8,8,0,1,0,15.08,5.34,16.28,16.28,0,0,1,2.32-4.3,16,16,0,1,1,25.54,19.27L185.6,203.2A8,8,0,0,0,192,216h48a8,8,0,0,0,0-16Z\"/></svg>',\n\n textHThree:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm73.52,90.63,21-30A8,8,0,0,0,240,104H192a8,8,0,0,0,0,16h32.63l-19.18,27.41A8,8,0,0,0,212,160a20,20,0,1,1-14.29,34,8,8,0,1,0-11.42,11.19A36,36,0,0,0,248,180,36.07,36.07,0,0,0,225.52,146.63Z\"/></svg>',\n\n textHFour:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0ZM256,184a8,8,0,0,1-8,8h-8v16a8,8,0,0,1-16,0V192H176a8,8,0,0,1-6.31-12.91l56-72A8,8,0,0,1,240,112v64h8A8,8,0,0,1,256,184Zm-32-48.68L192.36,176H224Z\"/></svg>',\n\n quotes:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z\"/></svg>',\n\n codeBlock:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M58.34,101.66l-32-32a8,8,0,0,1,0-11.32l32-32A8,8,0,0,1,69.66,37.66L43.31,64,69.66,90.34a8,8,0,0,1-11.32,11.32Zm40,0a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0,0-11.32l-32-32A8,8,0,0,0,98.34,37.66L124.69,64,98.34,90.34A8,8,0,0,0,98.34,101.66ZM200,40H176a8,8,0,0,0,0,16h24V200H56V136a8,8,0,0,0-16,0v64a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Z\"/></svg>',\n\n minus:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z\"/></svg>',\n\n // --- Lists ---\n list:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n listBullets:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M80,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H88A8,8,0,0,1,80,64Zm136,56H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,64H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM44,52A12,12,0,1,0,56,64,12,12,0,0,0,44,52Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,116Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,180Z\"/></svg>',\n\n listNumbers:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H104a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM104,72H216a8,8,0,0,0,0-16H104a8,8,0,0,0,0,16ZM216,184H104a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM43.58,55.16,48,52.94V104a8,8,0,0,0,16,0V40a8,8,0,0,0-11.58-7.16l-16,8a8,8,0,0,0,7.16,14.32ZM79.77,156.72a23.73,23.73,0,0,0-9.6-15.95,24.86,24.86,0,0,0-34.11,4.7,23.63,23.63,0,0,0-3.57,6.46,8,8,0,1,0,15,5.47,7.84,7.84,0,0,1,1.18-2.13,8.76,8.76,0,0,1,12-1.59A7.91,7.91,0,0,1,63.93,159a7.64,7.64,0,0,1-1.57,5.78,1,1,0,0,0-.08.11L33.59,203.21A8,8,0,0,0,40,216H72a8,8,0,0,0,0-16H56l19.08-25.53A23.47,23.47,0,0,0,79.77,156.72Z\"/></svg>',\n\n listChecks:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H128a8,8,0,0,1,0-16h88A8,8,0,0,1,224,128ZM128,72h88a8,8,0,0,0,0-16H128a8,8,0,0,0,0,16Zm88,112H128a8,8,0,0,0,0,16h88a8,8,0,0,0,0-16ZM82.34,42.34,56,68.69,45.66,58.34A8,8,0,0,0,34.34,69.66l16,16a8,8,0,0,0,11.32,0l32-32A8,8,0,0,0,82.34,42.34Zm0,64L56,132.69,45.66,122.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Zm0,64L56,196.69,45.66,186.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z\"/></svg>',\n\n // --- Alignment ---\n textAlignLeft:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,48H168a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm176,24H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-48,40H40a8,8,0,0,0,0,16H168a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignCenter:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM64,96a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Zm152,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-24,40H64a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignRight:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignJustify:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n // --- Text Style ---\n textAUnderline:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -23 256 256\" fill=\"currentColor\"><path d=\"M60.59,175.24a8,8,0,0,0,10.65-3.83L87.9,136h80.2l16.66,35.41a8,8,0,1,0,14.48-6.82l-64-136a8,8,0,0,0-14.48,0l-64,136A8,8,0,0,0,60.59,175.24ZM128,50.79,160.57,120H95.43Z\"/></svg>',\n\n palette:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89Zm13,93.71A15.89,15.89,0,0,1,198.21,160H152a32,32,0,0,0-32,32,16,16,0,0,1-21.31,15.07C62.49,194.3,40,164,40,128a88,88,0,0,1,87.09-88h.9a88.35,88.35,0,0,1,88,87.25A88.86,88.86,0,0,1,213.81,147.6ZM140,76a12,12,0,1,1-12-12A12,12,0,0,1,140,76ZM96,100A12,12,0,1,1,84,88,12,12,0,0,1,96,100Zm0,56a12,12,0,1,1-12-12A12,12,0,0,1,96,156Zm88-56a12,12,0,1,1-12-12A12,12,0,0,1,184,100Z\"/></svg>',\n\n textAa:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M87.24,52.59a8,8,0,0,0-14.48,0l-64,136a8,8,0,1,0,14.48,6.81L39.9,160h80.2l16.66,35.4a8,8,0,1,0,14.48-6.81ZM47.43,144,80,74.79,112.57,144ZM200,96c-12.76,0-22.73,3.47-29.63,10.32a8,8,0,0,0,11.26,11.36c3.8-3.77,10-5.68,18.37-5.68,13.23,0,24,9,24,20v3.22A42.76,42.76,0,0,0,200,128c-22.06,0-40,16.15-40,36s17.94,36,40,36a42.73,42.73,0,0,0,24-7.25,8,8,0,0,0,16-.75V132C240,112.15,222.06,96,200,96Zm0,88c-13.23,0-24-9-24-20s10.77-20,24-20,24,9,24,20S213.23,184,200,184Z\"/></svg>',\n\n textSize:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -23 256 256\" fill=\"currentColor\"><path d=\"M24.59,175.24a8,8,0,0,0,10.65-3.83L51.9,136h80.2l16.66,35.41a8,8,0,1,0,14.48-6.82l-64-136a8,8,0,0,0-14.48,0l-64,136A8,8,0,0,0,24.59,175.24ZM92,50.79,124.57,120H59.43Z\"/><g transform=\"translate(195,112.5) scale(0.68) translate(-105,-146)\"><path d=\"M165.66,194.34a8,8,0,0,1,0,11.32l-32,32a8,8,0,0,1-11.32,0l-32-32a8,8,0,0,1,11.32-11.32L120,212.69V43.31L101.66,61.66A8,8,0,0,1,90.34,50.34l32-32a8,8,0,0,1,11.32,0l32,32a8,8,0,0,1-11.32,11.32L136,43.31V212.69l18.34-18.35A8,8,0,0,1,165.66,194.34Z\"/></g></svg>',\n\n lineSpacing:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM101.66,53.66,120,35.31V96a8,8,0,0,0,16,0V35.31l18.34,18.35a8,8,0,0,0,11.32-11.32l-32-32a8,8,0,0,0-11.32,0l-32,32a8,8,0,0,0,11.32,11.32Zm52.68,148.68L136,220.69V160a8,8,0,0,0-16,0v60.69l-18.34-18.35a8,8,0,0,0-11.32,11.32l32,32a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z\"/></svg>',\n\n // --- Link Popover ---\n linkBreak:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M198.63,57.37a32,32,0,0,0-45.19-.06L141.79,69.52a8,8,0,0,1-11.58-11l11.72-12.29a1.59,1.59,0,0,1,.13-.13,48,48,0,0,1,67.88,67.88,1.59,1.59,0,0,1-.13.13l-12.29,11.72a8,8,0,0,1-11-11.58l12.21-11.65A32,32,0,0,0,198.63,57.37ZM114.21,186.48l-11.65,12.21a32,32,0,0,1-45.25-45.25l12.21-11.65a8,8,0,0,0-11-11.58L46.19,141.93a1.59,1.59,0,0,0-.13.13,48,48,0,0,0,67.88,67.88,1.59,1.59,0,0,0,.13-.13l11.72-12.29a8,8,0,1,0-11.58-11ZM216,152H192a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16ZM40,104H64a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm120,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V192A8,8,0,0,0,160,184ZM96,72a8,8,0,0,0,8-8V40a8,8,0,0,0-16,0V64A8,8,0,0,0,96,72Z\"/></svg>',\n\n check:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z\"/></svg>',\n\n // --- Color Palette ---\n prohibit:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.41A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.59A88,88,0,0,1,40,128Z\"/></svg>',\n\n // --- Details / Accordion ---\n caretCircleRight:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm29.66-93.66a8,8,0,0,1,0,11.32l-40,40a8,8,0,0,1-11.32-11.32L140.69,128,106.34,93.66a8,8,0,0,1,11.32-11.32Z\"/></svg>',\n\n // --- Insert ---\n image:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z\"/></svg>',\n\n smiley:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Zm-1.07,48c-10.29,17.79-27.4,28-46.93,28s-36.63-10.2-46.92-28a8,8,0,1,1,13.84-8c7.47,12.91,19.21,20,33.08,20s25.61-7.1,33.07-20a8,8,0,0,1,13.86,8Z\"/></svg>',\n\n textIndent:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H112a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM112,72H216a8,8,0,0,0,0-16H112a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM34.34,141.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0,0-11.32l-40-40A8,8,0,0,0,34.34,61.66L68.69,96,34.34,130.34A8,8,0,0,0,34.34,141.66Z\"/></svg>',\n\n // --- Image ---\n trash:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\"/></svg>',\n\n // --- Utilities ---\n textT:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,56V88a8,8,0,0,1-16,0V64H136V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V64H64V88a8,8,0,0,1-16,0V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z\"/></svg>',\n\n textTSlash:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M213.38,221.92a8,8,0,0,1-11.3-.54L136,148.69V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V131.09L64,69.49V88a8,8,0,0,1-16,0V56a8,8,0,0,1,.72-3.31l-6.64-7.31A8,8,0,1,1,53.92,34.62l160,176A8,8,0,0,1,213.38,221.92ZM105.79,64H120V80.43a8,8,0,0,0,16,0V64h56V88a8,8,0,0,0,16,0V56a8,8,0,0,0-8-8H105.79a8,8,0,0,0,0,16Z\"/></svg>',\n\n // --- History ---\n arrowCounterClockwise:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a96,96,0,0,1-94.71,96H128A95.38,95.38,0,0,1,62.1,197.8a8,8,0,0,1,11-11.63A80,80,0,1,0,71.43,71.39a3.07,3.07,0,0,1-.26.25L44.59,96H72a8,8,0,0,1,0,16H24a8,8,0,0,1-8-8V56a8,8,0,0,1,16,0V85.8L60.25,60A96,96,0,0,1,224,128Z\"/></svg>',\n\n arrowClockwise:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z\"/></svg>',\n\n // --- Table ---\n table:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM40,112H80v32H40Zm56,0H216v32H96ZM216,64V96H40V64ZM40,160H80v32H40Zm176,32H96V160H216v32Z\"/></svg>',\n\n gridNine:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,48H40A16,16,0,0,0,24,64V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM104,144V112h48v32Zm48,16v32H104V160ZM40,112H88v32H40Zm64-16V64h48V96Zm64,16h48v32H168Zm48-16H168V64h48ZM88,64V96H40V64ZM40,160H88v32H40Zm176,32H168V160h48v32Z\"/></svg>',\n};\n","/**\n * Document Node\n *\n * The root node of every ProseMirror document.\n * Must have at least one block child.\n */\n\nimport { Node } from '../Node.js';\n\nexport const Document = Node.create({\n name: 'doc',\n topNode: true,\n content: 'block+',\n});\n","/**\n * Text Node\n *\n * Inline text content. Can hold marks (bold, italic, etc.).\n * This is the leaf node that contains actual text content.\n */\n\nimport { Node } from '../Node.js';\n\nexport const Text = Node.create({\n name: 'text',\n group: 'inline',\n});\n","/**\n * Paragraph Node\n *\n * The default block-level text container.\n * Contains inline content (text and inline nodes).\n */\n\nimport { Node } from '../Node.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setParagraph: CommandSpec;\n }\n}\n\nexport interface ParagraphOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Paragraph = Node.create<ParagraphOptions>({\n name: 'paragraph',\n group: 'block',\n content: 'inline*',\n priority: 1000,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'p' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['p', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setParagraph:\n () =>\n ({ commands }) => {\n return commands.setBlockType(name);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Alt-0': () => {\n return editor?.commands['setParagraph']?.() ?? false;\n },\n };\n },\n});\n","/**\n * Heading Node\n *\n * Block-level heading elements (h1-h6).\n * Supports configurable levels and markdown-style input rules.\n */\n\nimport { Node } from '../Node.js';\nimport { textblockTypeInputRule } from '@domternal/pm/inputrules';\nimport { keymap } from '@domternal/pm/keymap';\nimport type { Command as PMCommand } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem, ToolbarButton } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setHeading: CommandSpec<[attributes?: { level?: number }]>;\n toggleHeading: CommandSpec<[attributes?: { level?: number }]>;\n }\n}\n\nexport interface HeadingOptions {\n levels: number[];\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Heading = Node.create<HeadingOptions>({\n name: 'heading',\n group: 'block',\n content: 'inline*',\n defining: true,\n\n addOptions() {\n return {\n levels: [1, 2, 3, 4],\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n level: {\n default: 1,\n parseHTML: (element: HTMLElement) => {\n const match = /^H(\\d)$/i.exec(element.tagName);\n return match?.[1] ? parseInt(match[1], 10) : 1;\n },\n renderHTML: () => {\n // Level is used in the tag name, not as an attribute\n return {};\n },\n },\n };\n },\n\n parseHTML() {\n // `this` is properly typed via ThisType<NodeContext<HeadingOptions>>\n return this.options.levels.map((level) => ({\n tag: `h${String(level)}`,\n attrs: { level },\n }));\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const level = node.attrs['level'] as number;\n // Ensure level is within allowed range\n const validLevel = this.options.levels.includes(level) ? level : this.options.levels[0];\n return [`h${String(validLevel)}`, { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n setHeading:\n (attributes?: { level?: number }) =>\n ({ commands }) => {\n const level = attributes?.level ?? options.levels[0] ?? 1;\n if (!options.levels.includes(level)) {\n return false;\n }\n return commands.setBlockType(name, { level });\n },\n toggleHeading:\n (attributes?: { level?: number }) =>\n ({ commands }) => {\n const level = attributes?.level ?? options.levels[0] ?? 1;\n if (!options.levels.includes(level)) {\n return false;\n }\n return commands.toggleBlockType(name, 'paragraph', { level });\n },\n };\n },\n\n addKeyboardShortcuts() {\n const shortcuts: Record<string, () => boolean> = {};\n const { options, editor } = this;\n\n options.levels.forEach((level) => {\n shortcuts[`Mod-Alt-${String(level)}`] = () => {\n return editor?.commands['toggleHeading']?.({ level }) ?? false;\n };\n });\n\n return shortcuts;\n },\n\n addToolbarItems(): ToolbarItem[] {\n const iconMap: Record<number, string> = {\n 1: 'textHOne',\n 2: 'textHTwo',\n 3: 'textHThree',\n 4: 'textHFour',\n };\n\n const headingItems: ToolbarButton[] = this.options.levels\n .filter((level) => level <= 4)\n .map((level) => ({\n type: 'button' as const,\n name: `heading${String(level)}`,\n command: 'toggleHeading',\n commandArgs: [{ level }],\n isActive: { name: 'heading', attributes: { level } },\n icon: iconMap[level] ?? 'textH',\n label: `Heading ${String(level)}`,\n shortcut: `Mod-Alt-${String(level)}`,\n }));\n\n const paragraphItem: ToolbarButton = {\n type: 'button',\n name: 'paragraph',\n command: 'setParagraph',\n isActive: 'paragraph',\n icon: 'textT',\n label: 'Normal text',\n shortcut: 'Mod-Alt-0',\n };\n\n return [\n {\n type: 'dropdown',\n name: 'heading',\n icon: 'textH',\n label: 'Heading',\n items: [paragraphItem, ...headingItems],\n group: 'blocks',\n priority: 200,\n dynamicIcon: true,\n },\n ];\n },\n\n addProseMirrorPlugins() {\n return [\n keymap({\n Backspace: ((state, dispatch) => {\n const { selection } = state;\n if (!selection.empty) return false;\n\n const { $from } = selection;\n if ($from.parentOffset !== 0) return false;\n if ($from.parent.type.name !== 'heading') return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n if (dispatch) {\n dispatch(\n state.tr.setNodeMarkup($from.before($from.depth), paragraphType).scrollIntoView()\n );\n }\n return true;\n }) as PMCommand,\n }),\n ];\n },\n\n addInputRules() {\n const { nodeType, options } = this;\n\n if (!nodeType) {\n return [];\n }\n\n const maxLevel = Math.max(...options.levels);\n return [\n textblockTypeInputRule(\n new RegExp(`^(#{1,${String(maxLevel)}})\\\\s$`),\n nodeType,\n (match) => {\n const hashes = match[1];\n if (!hashes) {\n return null;\n }\n const level = hashes.length;\n // Only convert if this level is enabled\n if (!options.levels.includes(level)) {\n return null;\n }\n return { level };\n }\n ),\n ];\n },\n});\n","/**\n * Blockquote Node\n *\n * Block-level quote container that can hold other blocks.\n * Supports nested blockquotes and markdown-style input rule.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule } from '@domternal/pm/inputrules';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setBlockquote: CommandSpec;\n toggleBlockquote: CommandSpec;\n unsetBlockquote: CommandSpec;\n }\n}\n\nexport interface BlockquoteOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Blockquote = Node.create<BlockquoteOptions>({\n name: 'blockquote',\n group: 'block',\n content: 'block+',\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'blockquote' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['blockquote', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setBlockquote:\n () =>\n ({ commands }) => {\n return commands.wrapIn(name);\n },\n toggleBlockquote:\n () =>\n ({ commands }) => {\n return commands.toggleWrap(name);\n },\n unsetBlockquote:\n () =>\n ({ commands }) => {\n return commands.lift();\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-b': () => {\n return editor?.commands['toggleBlockquote']?.() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'blockquote',\n command: 'toggleBlockquote',\n isActive: 'blockquote',\n icon: 'quotes',\n label: 'Blockquote',\n shortcut: 'Mod-Shift-B',\n group: 'blocks',\n priority: 150,\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n wrappingInputRule(/^\\s*>\\s$/, nodeType),\n ];\n },\n});\n","/**\n * CodeBlock Node\n *\n * Block-level code container with syntax highlighting support.\n * Preserves whitespace and disallows marks.\n *\n * Keyboard shortcuts:\n * - Mod-Alt-C: Toggle code block\n * - Enter (triple): Exit code block when last 2 lines are empty\n * - ArrowDown: Exit code block when cursor is at the end and it's the last block\n */\n\nimport { Node } from '../Node.js';\nimport { textblockTypeInputRule } from '@domternal/pm/inputrules';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setCodeBlock: CommandSpec<[attributes?: { language?: string }]>;\n toggleCodeBlock: CommandSpec<[attributes?: { language?: string }]>;\n }\n}\n\nexport interface CodeBlockOptions {\n languageClassPrefix: string;\n HTMLAttributes: Record<string, unknown>;\n exitOnTripleEnter: boolean;\n}\n\nexport const CodeBlock = Node.create<CodeBlockOptions>({\n name: 'codeBlock',\n group: 'block',\n content: 'text*',\n marks: '',\n code: true,\n defining: true,\n\n addOptions() {\n return {\n languageClassPrefix: 'language-',\n HTMLAttributes: {},\n exitOnTripleEnter: true,\n };\n },\n\n addAttributes() {\n const { options } = this;\n return {\n language: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const codeEl = element.querySelector('code');\n if (!codeEl) return null;\n\n const prefix = options.languageClassPrefix;\n\n // Find class starting with language prefix\n const classes = codeEl.className.split(/\\s+/);\n for (const cls of classes) {\n if (cls.startsWith(prefix)) {\n return cls.slice(prefix.length) || null;\n }\n }\n return null;\n },\n renderHTML: () => {\n // Language is rendered on the code element, not pre\n return {};\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'pre',\n preserveWhitespace: 'full' as const,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const language = node.attrs['language'] as string | null;\n\n const codeAttrs: Record<string, unknown> = {};\n if (language) {\n codeAttrs['class'] = `${this.options.languageClassPrefix}${language}`;\n }\n\n return [\n 'pre',\n { ...this.options.HTMLAttributes, ...HTMLAttributes },\n ['code', codeAttrs, 0],\n ];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setCodeBlock:\n (attributes?: { language?: string }) =>\n ({ commands }) => {\n return commands.setBlockType(name, attributes);\n },\n toggleCodeBlock:\n (attributes?: { language?: string }) =>\n ({ commands }) => {\n return commands.toggleBlockType(name, 'paragraph', attributes);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n\n const exitCodeBlock = (): boolean => {\n if (!editor) return false;\n const { state, view } = editor;\n const after = state.selection.$head.after();\n const paragraph = state.schema.nodes['paragraph']?.createAndFill();\n if (!paragraph) return false;\n const tr = state.tr.insert(after, paragraph);\n tr.setSelection(TextSelection.near(tr.doc.resolve(after + 1)));\n view.dispatch(tr.scrollIntoView());\n return true;\n };\n\n return {\n 'Mod-Alt-c': () => editor?.commands['toggleCodeBlock']?.() ?? false,\n\n Enter: () => {\n if (!this.options.exitOnTripleEnter || !editor) return false;\n const { $head } = editor.state.selection;\n if ($head.parent.type !== this.nodeType) return false;\n const pos = $head.parentOffset;\n if (pos < 2 || pos !== $head.parent.content.size) return false;\n const text = $head.parent.textContent;\n if (text[pos - 1] !== '\\n' || text[pos - 2] !== '\\n') return false;\n editor.view.dispatch(editor.state.tr.delete($head.pos - 2, $head.pos));\n return exitCodeBlock();\n },\n\n ArrowDown: () => {\n if (!editor) return false;\n const { $head } = editor.state.selection;\n if ($head.parent.type !== this.nodeType) return false;\n if ($head.parentOffset !== $head.parent.content.size) return false;\n const after = $head.after();\n if (after < editor.state.doc.content.size && editor.state.doc.resolve(after).nodeAfter) return false;\n return exitCodeBlock();\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'codeBlock',\n command: 'toggleCodeBlock',\n isActive: 'codeBlock',\n icon: 'codeBlock',\n label: 'Code Block',\n shortcut: 'Mod-Alt-C',\n group: 'blocks',\n priority: 140,\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n textblockTypeInputRule(\n /^```([a-z]*)?[\\s\\n]$/,\n nodeType,\n (match) => {\n const language = match[1] ?? null;\n return { language };\n }\n ),\n ];\n },\n});\n","/**\n * ListKeymap Extension\n *\n * Provides keyboard shortcuts for list manipulation:\n * - Tab: Sink (indent) list item\n * - Shift-Tab: Lift (outdent) list item\n * - Backspace: Lift list item when at start of empty item\n */\nimport { liftListItem, sinkListItem } from '@domternal/pm/schema-list';\nimport type { NodeType } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\nimport type { ExtensionEditorInterface } from '../Extension.js';\n\nexport interface ListKeymapOptions {\n /**\n * Name of the list item node type.\n * @default 'listItem'\n */\n listItem: string;\n}\n\n/** Resolves the list item NodeType and checks if cursor is inside one.\n * Returns null when a different item type (e.g. taskItem) sits closer\n * to the cursor than the target listItem, preventing cross-type interference. */\nfunction getListItemContext(\n editor: ExtensionEditorInterface,\n listItemName: string,\n): { state: EditorState; view: EditorView; listItemType: NodeType } | null {\n const { state, view } = editor as { state: EditorState; view: EditorView };\n const listItemType = state.schema.nodes[listItemName];\n if (!listItemType) return null;\n\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d);\n // If we hit a different item type first (e.g. taskItem), bail out\n if (node.type.spec.defining && node.type !== listItemType && node.type.isBlock) {\n const parent = d > 0 ? $from.node(d - 1) : null;\n if (parent?.type.spec.group?.includes('list')) {\n return null;\n }\n }\n if (node.type === listItemType) {\n return { state, view, listItemType };\n }\n }\n\n return null;\n}\n\nexport const ListKeymap = Extension.create<ListKeymapOptions>({\n name: 'listKeymap',\n\n addOptions() {\n return {\n listItem: 'listItem',\n };\n },\n\n addKeyboardShortcuts() {\n return {\n // Tab to sink (indent) list item\n Tab: () => {\n if (!this.editor) return false;\n const ctx = getListItemContext(this.editor, this.options.listItem);\n if (!ctx) return false;\n return sinkListItem(ctx.listItemType)(ctx.state, ctx.view.dispatch);\n },\n\n // Shift-Tab to lift (outdent) list item\n 'Shift-Tab': () => {\n if (!this.editor) return false;\n const ctx = getListItemContext(this.editor, this.options.listItem);\n if (!ctx) return false;\n return liftListItem(ctx.listItemType)(ctx.state, ctx.view.dispatch);\n },\n\n // Backspace at start of list item to lift\n Backspace: () => {\n const editor = this.editor;\n if (!editor) return false;\n\n const { state, view } = editor as { state: EditorState; view: EditorView };\n const { $from, empty } = state.selection;\n\n // Only at start of textblock with empty selection\n if (!empty || $from.parentOffset !== 0) return false;\n\n const listItemType = state.schema.nodes[this.options.listItem];\n if (!listItemType) return false;\n\n // Check if we're at the start of a list item\n let listItemDepth = -1;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === listItemType) {\n listItemDepth = d;\n break;\n }\n }\n\n if (listItemDepth === -1) return false;\n\n // Only lift if we're at the very start of the list item content\n // (i.e., cursor is at start of first child of list item)\n const listItemNode = $from.node(listItemDepth);\n const firstChild = listItemNode.firstChild;\n\n if (firstChild?.isTextblock) {\n // Check if the textblock is empty or cursor is at its start\n const posInListItem = $from.pos - $from.start(listItemDepth);\n if (posInListItem <= 1) {\n return liftListItem(listItemType)(state, view.dispatch);\n }\n }\n\n return false;\n },\n };\n },\n});\n","/**\n * ListItem Node\n *\n * Individual list item that can contain paragraphs and nested blocks.\n * Used by BulletList and OrderedList.\n *\n * Keyboard shortcuts:\n * - Enter: Split list item at cursor, or lift out of list if item is empty\n * - Tab/Shift-Tab: Handled by ListKeymap extension (included via addExtensions)\n */\n\nimport { Node } from '../Node.js';\nimport { splitListItem, liftListItem } from '@domternal/pm/schema-list';\nimport { Selection } from '@domternal/pm/state';\nimport { ListKeymap } from '../extensions/ListKeymap.js';\n\nexport interface ListItemOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const ListItem = Node.create<ListItemOptions>({\n name: 'listItem',\n content: 'block+',\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'li' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addExtensions() {\n return [ListKeymap];\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from } = state.selection;\n // Only handle Enter when the cursor's immediate item ancestor is a listItem.\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n\n if (splitListItem(this.nodeType)(state, view.dispatch)) return true;\n\n // Empty listItem inside a list that's inside a taskItem: liftListItem would\n // place a bare paragraph in the taskItem (loses bullet marker). Instead,\n // delete the empty item and create a new taskItem in the parent taskList\n // (one level up, not jumping to a distant ancestor).\n const listDepth = $from.depth - 2;\n const taskItemType = state.schema.nodes['taskItem'];\n if ($from.parent.content.size === 0 && listDepth > 0\n && taskItemType && $from.node(listDepth - 1).type === taskItemType) {\n const tr = state.tr;\n const delDepth = $from.node(listDepth).childCount <= 1 ? listDepth : $from.depth - 1;\n tr.delete($from.before(delDepth), $from.after(delDepth));\n const taskItemDepth = listDepth - 1;\n const end = tr.mapping.map($from.after(taskItemDepth));\n const item = taskItemType.createAndFill();\n if (item) {\n tr.insert(end, item);\n tr.setSelection(Selection.near(tr.doc.resolve(end + 2)));\n view.dispatch(tr.scrollIntoView());\n return true;\n }\n }\n\n return liftListItem(this.nodeType)(state, view.dispatch);\n },\n };\n },\n});\n","/**\n * BulletList Node\n *\n * Block-level unordered list container.\n * Supports markdown-style input rules and keyboard shortcuts.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule } from '@domternal/pm/inputrules';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { ListItem } from './ListItem.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n toggleBulletList: CommandSpec;\n }\n}\n\nexport interface BulletListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const BulletList = Node.create<BulletListOptions>({\n name: 'bulletList',\n group: 'block list',\n content: 'listItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'listItem',\n };\n },\n\n parseHTML() {\n return [{ tag: 'ul' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['ul', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleBulletList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'bulletList',\n command: 'toggleBulletList',\n isActive: 'bulletList',\n icon: 'listBullets',\n label: 'Bullet List',\n shortcut: 'Mod-Shift-8',\n group: 'lists',\n priority: 200,\n },\n ];\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-8': () => {\n return editor?.commands['toggleBulletList']?.() ?? false;\n },\n };\n },\n\n addExtensions() {\n return [ListItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // - item\n wrappingInputRule(/^\\s*[-]\\s$/, nodeType),\n // * item\n wrappingInputRule(/^\\s*[*]\\s$/, nodeType),\n // + item\n wrappingInputRule(/^\\s*[+]\\s$/, nodeType),\n ];\n },\n});\n","/**\n * OrderedList Node\n *\n * Block-level ordered (numbered) list container.\n * Supports start attribute and markdown-style input rules.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule } from '@domternal/pm/inputrules';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { ListItem } from './ListItem.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n toggleOrderedList: CommandSpec;\n }\n}\n\nexport interface OrderedListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const OrderedList = Node.create<OrderedListOptions>({\n name: 'orderedList',\n group: 'block list',\n content: 'listItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'listItem',\n };\n },\n\n addAttributes() {\n return {\n start: {\n default: 1,\n parseHTML: (element: HTMLElement) => {\n const start = element.getAttribute('start');\n return start ? parseInt(start, 10) : 1;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const start = attributes['start'] as number;\n if (start === 1) {\n return {};\n }\n return { start: String(start) };\n },\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'ol' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['ol', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleOrderedList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'orderedList',\n command: 'toggleOrderedList',\n isActive: 'orderedList',\n icon: 'listNumbers',\n label: 'Ordered List',\n shortcut: 'Mod-Shift-7',\n group: 'lists',\n priority: 190,\n },\n ];\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-7': () => {\n return editor?.commands['toggleOrderedList']?.() ?? false;\n },\n };\n },\n\n addExtensions() {\n return [ListItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // 1. item (any number followed by . )\n wrappingInputRule(\n /^(\\d+)\\.\\s$/,\n nodeType,\n (match) => {\n const num = match[1];\n return { start: num ? parseInt(num, 10) : 1 };\n }\n ),\n ];\n },\n});\n","/**\n * HorizontalRule Node\n *\n * Block-level thematic break element (hr).\n * Supports markdown-style input rules: ---, ***, ___\n */\n\nimport { Node } from '../Node.js';\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { EditorState } from '@domternal/pm/state';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setHorizontalRule: CommandSpec;\n }\n}\n\nexport interface HorizontalRuleOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const HorizontalRule = Node.create<HorizontalRuleOptions>({\n name: 'horizontalRule',\n group: 'block',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'hr' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['hr', { ...this.options.HTMLAttributes, ...HTMLAttributes }];\n },\n\n addCommands() {\n return {\n setHorizontalRule:\n () =>\n ({ state, tr, dispatch }) => {\n if (!this.nodeType) return false;\n\n // Use tr.selection for chain compatibility - prior commands may have changed selection\n const { $from } = tr.selection;\n const parent = $from.parent;\n\n // Block insertion when selection is not in a textblock (e.g. CellSelection\n // resolves $from at the tableRow level — inserting HR there splits the table)\n if (!parent.isTextblock) return false;\n\n if (dispatch) {\n // If cursor is in an empty block, replace it with HR + new paragraph\n if (parent.content.size === 0 && parent.type.name === 'paragraph') {\n const from = $from.before();\n const to = $from.after();\n const paragraph = state.schema.nodes['paragraph']?.create();\n const nodes = paragraph\n ? [this.nodeType.create(), paragraph]\n : [this.nodeType.create()];\n tr.replaceWith(from, to, nodes);\n\n // Move cursor into the new paragraph\n const sel = TextSelection.findFrom(tr.doc.resolve(from + 1), 1);\n if (sel) tr.setSelection(sel);\n } else {\n // Insert HR after current position\n const end = $from.after();\n const paragraph = state.schema.nodes['paragraph']?.create();\n const nodes = paragraph\n ? [this.nodeType.create(), paragraph]\n : [this.nodeType.create()];\n tr.insert(end, nodes);\n\n // Move cursor into the new paragraph\n const sel = TextSelection.findFrom(tr.doc.resolve(end + 1), 1);\n if (sel) tr.setSelection(sel);\n }\n\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'horizontalRule',\n command: 'setHorizontalRule',\n icon: 'minus',\n label: 'Horizontal Rule',\n group: 'blocks',\n priority: 130,\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n new InputRule(\n /^(?:---|—-|___|\\*\\*\\*)\\s$/,\n (state: EditorState, match: RegExpMatchArray, start: number) => {\n const { tr } = state;\n\n if (match[0]) {\n const $start = state.doc.resolve(start);\n // Replace the entire parent block (paragraph) with HR\n const from = $start.before();\n const to = $start.after();\n tr.replaceWith(from, to, nodeType.create());\n\n // Move selection after the HR if possible\n if (from + 1 < tr.doc.content.size) {\n const $after = tr.doc.resolve(from + 1);\n const sel = TextSelection.findFrom($after, 1);\n if (sel) {\n tr.setSelection(sel);\n }\n }\n }\n\n return tr;\n }\n ),\n ];\n },\n});\n","/**\n * HardBreak Node\n *\n * Inline line break element (br).\n * Keyboard shortcuts: Mod-Enter, Shift-Enter\n */\n\nimport { Node } from '../Node.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setHardBreak: CommandSpec;\n insertNbsp: CommandSpec;\n }\n}\n\nexport interface HardBreakOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const HardBreak = Node.create<HardBreakOptions>({\n name: 'hardBreak',\n group: 'inline',\n inline: true,\n selectable: false,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'br' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['br', { ...this.options.HTMLAttributes, ...HTMLAttributes }];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setHardBreak:\n () =>\n ({ commands }) => {\n return commands.insertContent({ type: name });\n },\n insertNbsp:\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n tr.insertText('\\u00A0');\n dispatch(tr);\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Enter': () => {\n return editor?.commands['setHardBreak']?.() ?? false;\n },\n 'Shift-Enter': () => {\n return editor?.commands['setHardBreak']?.() ?? false;\n },\n 'Mod-Shift-Space': () => {\n return editor?.commands['insertNbsp']?.() ?? false;\n },\n };\n },\n});\n","/**\n * TaskItem Node\n *\n * Individual task/checkbox item that can contain paragraphs and nested blocks.\n * Used by TaskList.\n *\n * Keyboard shortcuts:\n * - Enter: Split task item at cursor\n * - Tab: Sink (indent) task item\n * - Shift-Tab: Lift (outdent) task item\n * - Mod-Enter: Toggle task checked state\n */\n\nimport { Node } from '../Node.js';\nimport { splitListItem, liftListItem, sinkListItem } from '@domternal/pm/schema-list';\nimport { Selection } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n toggleTask: CommandSpec;\n }\n}\n\nexport interface TaskItemOptions {\n HTMLAttributes: Record<string, unknown>;\n nested: boolean;\n}\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n content: 'block+',\n\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n nested: true,\n };\n },\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: (element: HTMLElement) => {\n const dataChecked = element.getAttribute('data-checked');\n return dataChecked === 'true' || dataChecked === '';\n },\n renderHTML: (attributes: Record<string, unknown>) => ({\n 'data-checked': attributes['checked'] ? 'true' : 'false',\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `li[data-type=\"${this.name}\"]`,\n priority: 51,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'li',\n {\n ...this.options.HTMLAttributes,\n ...HTMLAttributes,\n 'data-type': this.name,\n },\n [\n 'label',\n { contenteditable: 'false' },\n [\n 'input',\n {\n type: 'checkbox',\n checked: node.attrs['checked'] ? 'checked' : null,\n },\n ],\n ],\n ['div', 0],\n ];\n },\n\n addCommands() {\n const { name } = this;\n return {\n toggleTask:\n () =>\n ({ state, dispatch }) => {\n const { selection } = state;\n const { $from } = selection;\n\n // Find the task item node\n let taskItemPos: number | null = null;\n let taskItemNode = null;\n\n for (let depth = $from.depth; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type.name === name) {\n taskItemPos = $from.before(depth);\n taskItemNode = node;\n break;\n }\n }\n\n if (taskItemPos === null || !taskItemNode) return false;\n\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(taskItemPos, undefined, {\n ...taskItemNode.attrs,\n checked: !taskItemNode.attrs['checked'],\n });\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from } = state.selection;\n // Only handle Enter when cursor's immediate item ancestor is a taskItem\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n\n // Standard split for non-empty items\n if (splitListItem(this.nodeType)(state, view.dispatch)) return true;\n\n // For empty taskItem nested inside a parent list item (e.g. orderedList > listItem > taskList > taskItem),\n // delete the taskItem, clean up the taskList if empty, and create a new parent listItem.\n // Without this, liftListItem alone leaves a bare empty paragraph inside the listItem.\n if ($from.parent.content.size === 0) {\n const listItemType = state.schema.nodes['listItem'];\n if (listItemType) {\n let parentListItemDepth = -1;\n for (let d = $from.depth - 2; d > 0; d--) {\n if ($from.node(d).type === listItemType) {\n parentListItemDepth = d;\n break;\n }\n }\n\n if (parentListItemDepth > 0) {\n const tr = state.tr;\n const taskItemDepth = $from.depth - 1;\n const taskItemNode = $from.node(taskItemDepth);\n\n if (taskItemNode.childCount > 1) {\n // TaskItem has content beyond the empty paragraph (e.g. paragraph + nested list + empty paragraph).\n // Only delete the trailing empty paragraph, not the whole taskItem.\n tr.delete($from.before($from.depth), $from.after($from.depth));\n } else {\n const taskListDepth = taskItemDepth - 1;\n const taskListNode = $from.node(taskListDepth);\n\n if (taskListNode.childCount <= 1) {\n // Only child — delete the entire taskList. Deleting just the taskItem\n // would leave an empty taskList, violating its content spec and causing\n // ProseMirror's replaceStep to silently skip the deletion.\n tr.delete($from.before(taskListDepth), $from.after(taskListDepth));\n } else {\n // Multiple children — delete just the empty taskItem\n tr.delete($from.before(taskItemDepth), $from.after(taskItemDepth));\n }\n }\n\n // 3. Insert a new listItem after the parent listItem\n const listItemEnd = tr.mapping.map($from.after(parentListItemDepth));\n const newItem = listItemType.createAndFill();\n if (newItem) {\n tr.insert(listItemEnd, newItem);\n tr.setSelection(Selection.near(tr.doc.resolve(listItemEnd + 2)));\n view.dispatch(tr.scrollIntoView());\n return true;\n }\n }\n }\n }\n\n // Standard lift for non-nested empty items\n return liftListItem(this.nodeType)(state, view.dispatch);\n },\n Tab: () => {\n if (!this.editor || !this.nodeType) return false;\n const { $from } = this.editor.state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n return sinkListItem(this.nodeType)(this.editor.state, this.editor.view.dispatch);\n },\n 'Shift-Tab': () => {\n if (!this.editor || !this.nodeType) return false;\n const { $from } = this.editor.state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n return liftListItem(this.nodeType)(this.editor.state, this.editor.view.dispatch);\n },\n 'Mod-Enter': () => {\n return this.editor?.commands['toggleTask']?.() ?? false;\n },\n };\n },\n});\n","/**\n * TaskList Node\n *\n * Block-level task/checkbox list container.\n * Supports markdown-style input rules with `[ ]` and `[x]`.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule } from '@domternal/pm/inputrules';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { TaskItem } from './TaskItem.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n toggleTaskList: CommandSpec;\n }\n}\n\nexport interface TaskListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const TaskList = Node.create<TaskListOptions>({\n name: 'taskList',\n group: 'block list',\n content: 'taskItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'taskItem',\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `ul[data-type=\"${this.name}\"]`,\n priority: 51, // Higher priority than regular bulletList\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'ul',\n {\n ...this.options.HTMLAttributes,\n ...HTMLAttributes,\n 'data-type': this.name,\n },\n 0,\n ];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleTaskList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-9': () => {\n return editor?.commands['toggleTaskList']?.() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'taskList',\n command: 'toggleTaskList',\n isActive: 'taskList',\n icon: 'listChecks',\n label: 'Task List',\n shortcut: 'Mod-Shift-9',\n group: 'lists',\n priority: 170,\n },\n ];\n },\n\n addExtensions() {\n return [TaskItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // [ ] at start of line creates unchecked task\n wrappingInputRule(/^\\s*\\[\\s?\\]\\s$/, nodeType),\n // [x] or [X] at start of line creates checked task\n wrappingInputRule(/^\\s*\\[[xX]\\]\\s$/, nodeType),\n ];\n },\n});\n","/**\n * Bold Mark\n *\n * Applies bold formatting to text. Supports multiple HTML tags\n * and CSS font-weight styles.\n *\n * @example\n * ```ts\n * import { Bold } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Bold],\n * });\n *\n * // Toggle bold with keyboard shortcut: Mod-b\n * // Or use input rule: **text**\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Bold mark\n */\nexport interface BoldOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Bold mark for text formatting\n */\nexport const Bold = Mark.create<BoldOptions>({\n name: 'bold',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'strong' },\n {\n tag: 'b',\n getAttrs: (node) => {\n if (typeof node === 'string') return {};\n const fontWeight = node.style.fontWeight;\n\n // Google Docs uses <b style=\"font-weight:normal\"> for non-bold text\n if (fontWeight === 'normal' || fontWeight === '400') {\n return false;\n }\n\n return {};\n },\n },\n {\n style: 'font-weight',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n\n // Match numeric weight >= 600 (semibold and above)\n const numWeight = parseInt(value, 10);\n if (!isNaN(numWeight) && numWeight >= 600) return {};\n\n // Match named weights\n if (/^(bold|bolder)$/i.test(value)) return {};\n\n return false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['strong', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-b': () => this.editor?.commands['toggleMark']?.('bold') ?? false,\n };\n },\n\n addCommands() {\n return {\n setBold:\n () =>\n ({ commands }) => commands.setMark('bold'),\n unsetBold:\n () =>\n ({ commands }) => commands.unsetMark('bold'),\n toggleBold:\n () =>\n ({ commands }) => commands.toggleMark('bold'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'bold',\n command: 'toggleBold',\n isActive: 'bold',\n icon: 'textB',\n label: 'Bold',\n shortcut: 'Mod-B',\n group: 'format',\n priority: 200,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // **text** or __text__\n markInputRule({\n find: markInputRulePatterns.bold,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setBold: CommandSpec;\n unsetBold: CommandSpec;\n toggleBold: CommandSpec;\n }\n}\n","/**\n * Italic Mark\n *\n * Applies italic formatting to text. Supports multiple HTML tags\n * and CSS font-style styles.\n *\n * @example\n * ```ts\n * import { Italic } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Italic],\n * });\n *\n * // Toggle italic with keyboard shortcut: Mod-i\n * // Or use input rule: *text* or _text_\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport { markInputRule } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Italic mark\n */\nexport interface ItalicOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Italic mark for text formatting\n */\nexport const Italic = Mark.create<ItalicOptions>({\n name: 'italic',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'em' },\n {\n tag: 'i',\n getAttrs: (node) => {\n if (typeof node === 'string') return {};\n const fontStyle = node.style.fontStyle;\n\n // Google Docs uses <i style=\"font-style:normal\"> for non-italic text\n if (fontStyle === 'normal') {\n return false;\n }\n\n return {};\n },\n },\n {\n style: 'font-style',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return /^italic$/i.test(value) ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['em', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-i': () => this.editor?.commands['toggleMark']?.('italic') ?? false,\n };\n },\n\n addCommands() {\n return {\n setItalic:\n () =>\n ({ commands }) => commands.setMark('italic'),\n unsetItalic:\n () =>\n ({ commands }) => commands.unsetMark('italic'),\n toggleItalic:\n () =>\n ({ commands }) => commands.toggleMark('italic'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'italic',\n command: 'toggleItalic',\n isActive: 'italic',\n icon: 'textItalic',\n label: 'Italic',\n shortcut: 'Mod-I',\n group: 'format',\n priority: 190,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // *text* - using negative lookbehind to avoid matching **text**\n markInputRule({\n find: /(?<!\\*)\\*([^*]+)\\*$/,\n type: markType,\n }),\n // _text_ - using negative lookbehind to avoid matching __text__\n markInputRule({\n find: /(?<!_)_([^_]+)_$/,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setItalic: CommandSpec;\n unsetItalic: CommandSpec;\n toggleItalic: CommandSpec;\n }\n}\n","/**\n * Underline Mark\n *\n * Applies underline formatting to text.\n *\n * @example\n * ```ts\n * import { Underline } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Underline],\n * });\n *\n * // Toggle underline with keyboard shortcut: Mod-u\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Underline mark\n */\nexport interface UnderlineOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Underline mark for text formatting\n */\nexport const Underline = Mark.create<UnderlineOptions>({\n name: 'underline',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'u' },\n {\n style: 'text-decoration',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n // text-decoration can be \"underline\" or \"underline dotted\" etc.\n return value.includes('underline') ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['u', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-u': () => this.editor?.commands['toggleMark']?.('underline') ?? false,\n };\n },\n\n addCommands() {\n return {\n setUnderline:\n () =>\n ({ commands }) => commands.setMark('underline'),\n unsetUnderline:\n () =>\n ({ commands }) => commands.unsetMark('underline'),\n toggleUnderline:\n () =>\n ({ commands }) => commands.toggleMark('underline'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'underline',\n command: 'toggleUnderline',\n isActive: 'underline',\n icon: 'textUnderline',\n label: 'Underline',\n shortcut: 'Mod-U',\n group: 'format',\n priority: 180,\n },\n ];\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setUnderline: CommandSpec;\n unsetUnderline: CommandSpec;\n toggleUnderline: CommandSpec;\n }\n}\n","/**\n * Strike Mark\n *\n * Applies strikethrough formatting to text.\n *\n * @example\n * ```ts\n * import { Strike } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Strike],\n * });\n *\n * // Toggle strike with keyboard shortcut: Mod-Shift-s\n * // Or use input rule: ~~text~~\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Strike mark\n */\nexport interface StrikeOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Strike mark for text formatting\n */\nexport const Strike = Mark.create<StrikeOptions>({\n name: 'strike',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 's' },\n { tag: 'del' },\n { tag: 'strike' }, // Deprecated but still common\n {\n style: 'text-decoration',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value.includes('line-through') ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['s', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-s': () => this.editor?.commands['toggleMark']?.('strike') ?? false,\n };\n },\n\n addCommands() {\n return {\n setStrike:\n () =>\n ({ commands }) => commands.setMark('strike'),\n unsetStrike:\n () =>\n ({ commands }) => commands.unsetMark('strike'),\n toggleStrike:\n () =>\n ({ commands }) => commands.toggleMark('strike'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'strike',\n command: 'toggleStrike',\n isActive: 'strike',\n icon: 'textStrikethrough',\n label: 'Strikethrough',\n shortcut: 'Mod-Shift-S',\n group: 'format',\n priority: 170,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // ~~text~~\n markInputRule({\n find: markInputRulePatterns.strike,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setStrike: CommandSpec;\n unsetStrike: CommandSpec;\n toggleStrike: CommandSpec;\n }\n}\n","/**\n * Code Mark\n *\n * Applies inline code formatting to text. This mark is exclusive,\n * meaning it cannot be combined with other marks like bold or italic.\n *\n * @example\n * ```ts\n * import { Code } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Code],\n * });\n *\n * // Toggle code with keyboard shortcut: Mod-e\n * // Or use input rule: `text`\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Code mark\n */\nexport interface CodeOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Code mark for inline code formatting\n */\nexport const Code = Mark.create<CodeOptions>({\n name: 'code',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n // Code mark is exclusive - it cannot be combined with other marks\n // ProseMirror uses '_' to mean \"exclude all marks\"\n excludes: '_',\n\n // Code should not span across multiple nodes\n spanning: false,\n\n parseHTML() {\n return [{ tag: 'code' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['code', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-e': () => this.editor?.commands['toggleMark']?.('code') ?? false,\n };\n },\n\n addCommands() {\n return {\n setCode:\n () =>\n ({ commands }) => commands.setMark('code'),\n unsetCode:\n () =>\n ({ commands }) => commands.unsetMark('code'),\n toggleCode:\n () =>\n ({ commands }) => commands.toggleMark('code'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'code',\n command: 'toggleCode',\n isActive: 'code',\n icon: 'code',\n label: 'Code',\n shortcut: 'Mod-E',\n group: 'format',\n priority: 160,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // `text`\n markInputRule({\n find: markInputRulePatterns.code,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setCode: CommandSpec;\n unsetCode: CommandSpec;\n toggleCode: CommandSpec;\n }\n}\n","/**\n * Link Click Plugin\n *\n * Handles click on links to open them.\n * When editable: opens on click.\n * When read-only: browser handles link clicks natively.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link click plugin\n */\nexport interface LinkClickPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * When to open links on click\n * - true: Open on click\n * - false: Never open\n * - 'whenNotEditable': Only open when editor is read-only (browser handles natively)\n * @default true\n */\n openOnClick?: boolean | 'whenNotEditable';\n\n /**\n * Select the full link text range when clicking a link\n * @default false\n */\n enableClickSelection?: boolean;\n}\n\n/**\n * Plugin key for link click plugin\n */\nexport const linkClickPluginKey = new PluginKey('linkClick');\n\n/**\n * Creates a plugin that handles clicking on links to open them.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkClickPlugin(options: LinkClickPluginOptions): Plugin {\n const { type, openOnClick = true, enableClickSelection = false } = options;\n\n return new Plugin({\n key: linkClickPluginKey,\n\n props: {\n handleClick(view, _pos, event) {\n // Only left clicks\n if (event.button !== 0) {\n return false;\n }\n\n // When not editable, let browser handle natively (links navigate normally)\n if (!view.editable) {\n return false;\n }\n\n // Find the <a> element from the click target\n let link: HTMLAnchorElement | null = null;\n\n if (event.target instanceof HTMLAnchorElement) {\n link = event.target;\n } else {\n const target = event.target as HTMLElement | null;\n if (!target) {\n return false;\n }\n link = target.closest<HTMLAnchorElement>('a');\n if (link && !view.dom.contains(link)) {\n link = null;\n }\n }\n\n if (!link) {\n return false;\n }\n\n // Select full link range on click\n if (enableClickSelection) {\n const pos = view.posAtDOM(link, 0);\n const $pos = view.state.doc.resolve(pos);\n\n if ($pos.marks().some((m) => m.type === type)) {\n // Find contiguous mark range within the parent text block\n const parent = $pos.parent;\n const blockStart = pos - $pos.parentOffset;\n let rangeStart = pos;\n let rangeEnd = pos;\n\n parent.forEach((child, childOffset) => {\n const childStart = blockStart + childOffset;\n const childEnd = childStart + child.nodeSize;\n if (type.isInSet(child.marks) && childStart <= rangeEnd && childEnd >= rangeStart) {\n rangeStart = Math.min(rangeStart, childStart);\n rangeEnd = Math.max(rangeEnd, childEnd);\n }\n });\n\n const tr = view.state.tr.setSelection(\n TextSelection.create(view.state.doc, rangeStart, rangeEnd)\n );\n view.dispatch(tr);\n return true;\n }\n }\n\n if (openOnClick) {\n // Get href/target from ProseMirror mark (validated by renderHTML), fallback to DOM\n const pos = view.posAtDOM(link, 0);\n const $pos = view.state.doc.resolve(pos);\n const linkMark = $pos.marks().find((m) => m.type === type);\n\n const href = (linkMark?.attrs['href'] as string | undefined) ?? link.href;\n const linkTarget = (linkMark?.attrs['target'] as string | undefined) ?? link.target;\n\n if (href) {\n window.open(href, linkTarget || '_blank');\n return true;\n }\n }\n\n return false;\n },\n },\n });\n}\n","/**\n * Link Paste Plugin\n *\n * Handles pasting URLs:\n * - If text is selected: wraps selection in a link\n * - If no selection: inserts URL as clickable link text\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link paste plugin\n */\nexport interface LinkPastePluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * Allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n\n /**\n * Custom URL validation function\n * Return false to prevent linking specific URLs\n */\n validate?: (url: string) => boolean;\n}\n\n/**\n * Plugin key for link paste plugin\n */\nexport const linkPastePluginKey = new PluginKey('linkPaste');\n\n/**\n * Creates a plugin that handles pasting URLs.\n *\n * Behavior:\n * - Text selected + paste URL = wrap selection in link\n * - No selection + paste URL = insert URL as link\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkPastePlugin(options: LinkPastePluginOptions): Plugin {\n const { type, protocols = ['http:', 'https:'], validate } = options;\n\n return new Plugin({\n key: linkPastePluginKey,\n\n props: {\n handlePaste(view, event) {\n // Get pasted text\n const text = event.clipboardData?.getData('text/plain').trim();\n if (!text) return false;\n\n // Check if pasted text is a URL\n let url: URL;\n try {\n url = new URL(text);\n } catch {\n return false; // Not a URL, let default paste handling continue\n }\n\n // Validate protocol\n if (!protocols.includes(url.protocol)) {\n return false;\n }\n\n // Custom validation\n if (validate && !validate(text)) {\n return false;\n }\n\n const { state, dispatch } = view;\n const { from, to, empty } = state.selection;\n const tr = state.tr;\n\n if (empty) {\n // No selection - insert URL as linked text\n tr.insertText(text, from, to);\n tr.addMark(from, from + text.length, type.create({ href: text }));\n } else {\n // Has selection - wrap selection in link\n tr.addMark(from, to, type.create({ href: text }));\n }\n\n dispatch(tr);\n return true;\n },\n },\n });\n}\n","/**\n * Autolink Plugin\n *\n * Automatically converts typed URLs into clickable links.\n * Triggers when user types a space, punctuation, or presses Enter after a URL.\n * Uses linkifyjs for robust URL detection.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\nimport { find } from 'linkifyjs';\n\n/**\n * Options for the autolink plugin\n */\nexport interface AutolinkPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * Allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n\n /**\n * Default protocol to add to bare URLs (e.g., 'example.com' → 'https://example.com')\n * @default 'https'\n */\n defaultProtocol?: string;\n\n /**\n * Custom validation function\n * Return false to prevent auto-linking specific URLs\n */\n shouldAutoLink?: (url: string) => boolean;\n}\n\n/**\n * Plugin key for autolink plugin\n */\nexport const autolinkPluginKey = new PluginKey('autolink');\n\n/**\n * Characters that trigger autolink detection\n */\nconst TRIGGER_CHARS = /[\\s.,!?;:\\n]/;\n\n/**\n * Creates a plugin that auto-converts typed URLs to links.\n *\n * When user types a URL followed by space/punctuation, the URL\n * is automatically wrapped in a link mark.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function autolinkPlugin(options: AutolinkPluginOptions): Plugin {\n const {\n type,\n protocols = ['http:', 'https:'],\n defaultProtocol = 'https',\n shouldAutoLink,\n } = options;\n\n return new Plugin({\n key: autolinkPluginKey,\n\n props: {\n handleTextInput(view, from, to, text) {\n // Only trigger on space, punctuation, or newline\n if (!TRIGGER_CHARS.test(text)) {\n return false;\n }\n\n const { state } = view;\n const $from = state.doc.resolve(from);\n\n // Get text before cursor in current text block\n const textBefore = $from.parent.textBetween(\n Math.max(0, $from.parentOffset - 500), // Look back max 500 chars\n $from.parentOffset,\n undefined,\n '\\ufffc'\n );\n\n // Use linkifyjs to find URLs in the text\n const matches = find(textBefore, {\n defaultProtocol: defaultProtocol as 'http' | 'https',\n });\n\n // Get the last match (most recent URL)\n const lastMatch = matches[matches.length - 1];\n if (!lastMatch) {\n return false;\n }\n\n // Only process URL types (not email, etc.)\n if (lastMatch.type !== 'url') {\n return false;\n }\n\n // Check if URL ends right before the trigger character\n if (lastMatch.end !== textBefore.length) {\n return false;\n }\n\n const href = lastMatch.href;\n\n // Validate protocol\n try {\n const url = new URL(href);\n if (!protocols.includes(url.protocol)) {\n return false;\n }\n } catch {\n return false;\n }\n\n // Custom validation\n if (shouldAutoLink && !shouldAutoLink(href)) {\n return false;\n }\n\n // Calculate positions in document\n const blockStart = from - $from.parentOffset;\n const linkStart = blockStart + lastMatch.start;\n const linkEnd = blockStart + lastMatch.end;\n\n // Check if already has link mark\n const $linkStart = state.doc.resolve(linkStart);\n if ($linkStart.marks().some((m) => m.type === type)) {\n return false;\n }\n\n // Apply link mark and insert trigger character\n const tr = state.tr;\n tr.addMark(linkStart, linkEnd, type.create({ href }));\n tr.insertText(text, from, to);\n\n view.dispatch(tr);\n return true;\n },\n },\n });\n}\n","/**\n * Link Exit Plugin\n *\n * Allows users to \"exit\" a link mark by pressing ArrowRight at the\n * end of the link. After exiting, newly typed text will not have\n * the link mark applied.\n *\n * Enabled when the Link mark has `exitable: true` configured.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link exit plugin\n */\nexport interface LinkExitPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n}\n\n/**\n * Plugin key for link exit plugin\n */\nexport const linkExitPluginKey = new PluginKey('linkExit');\n\n/**\n * Creates a plugin that allows exiting a link mark with ArrowRight.\n *\n * When the cursor is at the end boundary of a link mark (the next\n * character has no link mark, or there is no next character), pressing\n * ArrowRight will set storedMarks to exclude the link mark. This means\n * any text typed after will not be linked.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkExitPlugin(options: LinkExitPluginOptions): Plugin {\n const { type } = options;\n\n return new Plugin({\n key: linkExitPluginKey,\n\n props: {\n handleKeyDown(view, event) {\n if (event.key !== 'ArrowRight') return false;\n\n const { state } = view;\n const { selection } = state;\n\n // Only handle cursor (collapsed) selections\n if (!(selection instanceof TextSelection) || !selection.empty) {\n return false;\n }\n\n const $cursor = selection.$cursor;\n if (!$cursor) return false;\n\n // Check the node before cursor for the link mark.\n // We use nodeBefore.marks instead of $cursor.marks() because\n // nodeBefore always reflects the actual marks on the text node,\n // regardless of the mark's inclusive setting.\n const nodeBefore = $cursor.nodeBefore;\n if (!nodeBefore) return false;\n\n const marksOnNode = nodeBefore.marks;\n const hasLink = marksOnNode.some((m) => m.type === type);\n if (!hasLink) return false;\n\n // Check if we're at the end of the mark range:\n // The next character either doesn't exist or doesn't have the link mark\n const after = $cursor.nodeAfter;\n const afterHasLink = after?.marks.some((m) => m.type === type) ?? false;\n\n if (!afterHasLink) {\n // We're at the boundary — strip link from storedMarks\n const marksWithoutLink = marksOnNode.filter((m) => m.type !== type);\n const tr = state.tr.setStoredMarks(marksWithoutLink);\n view.dispatch(tr);\n // Don't prevent default — let ArrowRight move cursor normally\n return false;\n }\n\n return false;\n },\n },\n });\n}\n","/**\n * Link Mark\n *\n * Applies hyperlink formatting to text. Supports href and target attributes.\n *\n * @example\n * ```ts\n * import { Link } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Link],\n * });\n *\n * // Set a link\n * editor.commands.setLink({ href: 'https://example.com' });\n *\n * // Remove a link\n * editor.commands.unsetLink();\n * ```\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport { Mark } from '../Mark.js';\nimport { isValidUrl } from '../helpers/isValidUrl.js';\nimport { getMarkRange } from '../helpers/getMarkRange.js';\nimport { linkClickPlugin } from './helpers/linkClickPlugin.js';\nimport { linkPastePlugin } from './helpers/linkPastePlugin.js';\nimport { autolinkPlugin } from './helpers/autolinkPlugin.js';\nimport { linkExitPlugin } from './helpers/linkExitPlugin.js';\nimport type { Editor } from '../Editor.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Link mark\n */\nexport interface LinkOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n /**\n * List of allowed URL protocols\n * @default ['http:', 'https:', 'mailto:', 'tel:']\n */\n protocols: string[];\n /**\n * When to open links on click\n * - true: Open on click (when editable)\n * - false: Never open\n * - 'whenNotEditable': Only open when editor is read-only\n * @default true\n */\n openOnClick: boolean | 'whenNotEditable';\n /**\n * Whether to add rel=\"noopener noreferrer\" to links\n * @default true\n */\n addRelNoopener: boolean;\n /**\n * Auto-convert typed URLs to links\n * @default true\n */\n autolink: boolean;\n /**\n * Convert pasted URLs to links (wraps selection or inserts as link)\n * @default true\n */\n linkOnPaste: boolean;\n /**\n * Default protocol for bare URLs (e.g., 'example.com' → 'https://example.com')\n * @default 'https'\n */\n defaultProtocol: string;\n /**\n * Custom validation for autolink\n * Return false to prevent auto-linking specific URLs\n */\n shouldAutoLink?: (url: string) => boolean;\n /**\n * Select the full link text range when clicking a link\n * @default false\n */\n enableClickSelection: boolean;\n}\n\n/**\n * Attributes for the Link mark\n */\nexport interface LinkAttributes {\n href: string;\n target?: string | null;\n rel?: string | null;\n title?: string | null;\n class?: string | null;\n}\n\n/**\n * Link mark for hyperlinks\n */\nexport const Link = Mark.create<LinkOptions>({\n name: 'link',\n\n // Links are semantic data, not visual formatting.\n // They survive `unsetAllMarks` (clear formatting).\n // Override with: Link.configure({ isFormatting: true })\n isFormatting: false,\n\n // Links have lower priority than other marks\n priority: 1000,\n\n // When autolink is enabled, the mark is inclusive so that typing at\n // the end of a link naturally extends it (e.g. adding path segments\n // to an autolinked URL). When autolink is off, links are set manually\n // and should not extend on typing.\n inclusive() {\n return this.options.autolink;\n },\n\n addOptions(): LinkOptions {\n return {\n HTMLAttributes: {},\n protocols: ['http:', 'https:', 'mailto:', 'tel:'],\n openOnClick: true,\n addRelNoopener: true,\n autolink: true,\n linkOnPaste: true,\n defaultProtocol: 'https',\n enableClickSelection: false,\n };\n },\n\n addAttributes() {\n return {\n href: {\n default: null,\n },\n target: {\n default: null,\n },\n rel: {\n default: null,\n },\n title: {\n default: null,\n },\n class: {\n default: null,\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'a[href]',\n getAttrs: (node) => {\n if (typeof node === 'string') return false;\n const href = node.getAttribute('href');\n\n // Validate URL\n if (!href || !isValidUrl(href, { protocols: this.options.protocols })) {\n return false;\n }\n\n return {\n href,\n target: node.getAttribute('target'),\n rel: node.getAttribute('rel'),\n title: node.getAttribute('title'),\n class: node.getAttribute('class'),\n };\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = { ...this.options.HTMLAttributes, ...HTMLAttributes };\n\n // Validate href before rendering\n if (\n typeof attrs['href'] === 'string' &&\n !isValidUrl(attrs['href'], { protocols: this.options.protocols })\n ) {\n // Remove the href if invalid, keeping other attributes\n const { href: _, ...rest } = attrs;\n return ['a', rest, 0];\n }\n\n // Add rel=\"noopener noreferrer\" for external links\n if (\n this.options.addRelNoopener &&\n attrs['target'] === '_blank' &&\n !attrs['rel']\n ) {\n attrs['rel'] = 'noopener noreferrer';\n }\n\n return ['a', attrs, 0];\n },\n\n addCommands() {\n return {\n setLink:\n (attributes: LinkAttributes) =>\n ({ commands }) => {\n if (!isValidUrl(attributes.href, { protocols: this.options.protocols })) {\n return false;\n }\n return commands.setMark('link', attributes);\n },\n unsetLink:\n () =>\n ({ tr, state, dispatch }) => {\n const markType = state.schema.marks['link'];\n if (!markType) return false;\n\n const { empty, ranges } = tr.selection;\n\n if (empty) {\n // Extend to full link range around cursor\n const $pos = tr.doc.resolve(tr.selection.from);\n const range = getMarkRange($pos, markType);\n if (!range) return false;\n if (!dispatch) return true;\n tr.removeMark(range.from, range.to, markType);\n } else {\n // Check that at least one text node in the selection is in a context that allows links.\n // This correctly handles CellSelection (multiple ranges) and code blocks (marks: '').\n const ctx = { hasApplicableText: false };\n for (const range of ranges) {\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, _pos, parent) => {\n if (node.isText && parent?.type.allowsMarkType(markType)\n && !node.marks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n ctx.hasApplicableText = true;\n }\n });\n }\n if (!ctx.hasApplicableText) return false;\n if (!dispatch) return true;\n // Iterate over selection ranges (handles CellSelection with multiple ranges)\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n }\n }\n\n dispatch(tr);\n return true;\n },\n toggleLink:\n (attributes: LinkAttributes) =>\n ({ tr, state, dispatch }) => {\n if (!isValidUrl(attributes.href, { protocols: this.options.protocols })) {\n return false;\n }\n\n const markType = state.schema.marks['link'];\n if (!markType) return false;\n\n const { empty, ranges } = tr.selection;\n\n if (empty) {\n // Extend to full link range around cursor\n const $pos = tr.doc.resolve(tr.selection.from);\n const range = getMarkRange($pos, markType);\n\n if (range && tr.doc.rangeHasMark(range.from, range.to, markType)) {\n // Has link — remove it from the full range\n if (!dispatch) return true;\n tr.removeMark(range.from, range.to, markType);\n } else {\n // No link — toggle stored mark for cursor\n if (!dispatch) return true;\n const cursorMarks = tr.storedMarks ?? state.storedMarks ?? $pos.marks();\n if (markType.isInSet(cursorMarks)) {\n tr.removeStoredMark(markType);\n } else {\n tr.addStoredMark(markType.create(attributes));\n }\n }\n } else {\n if (!dispatch) return true;\n // Iterate over selection ranges (handles CellSelection with multiple ranges)\n const hasMark = ranges.every(range =>\n tr.doc.rangeHasMark(range.$from.pos, range.$to.pos, markType),\n );\n for (const range of ranges) {\n if (hasMark) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n } else {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes));\n }\n }\n }\n\n dispatch(tr);\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-k': () => {\n (this.editor as unknown as Editor).emit('linkEdit', {});\n return true;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'link',\n command: 'unsetLink',\n emitEvent: 'linkEdit',\n isActive: 'link',\n icon: 'link',\n label: 'Link',\n shortcut: 'Mod-K',\n group: 'format',\n priority: 120,\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const markType = this.markType;\n if (!markType) return [];\n\n const plugins = [];\n\n // Click plugin - always added (handles link opening on click)\n // 'whenNotEditable' → true: browser handles read-only links natively\n plugins.push(\n linkClickPlugin({\n type: markType,\n openOnClick: this.options.openOnClick === 'whenNotEditable'\n ? true\n : this.options.openOnClick,\n enableClickSelection: this.options.enableClickSelection,\n })\n );\n\n // Paste plugin - wraps selection or inserts URL as link\n if (this.options.linkOnPaste) {\n plugins.push(\n linkPastePlugin({\n type: markType,\n protocols: this.options.protocols,\n })\n );\n }\n\n // Exit plugin - ArrowRight at end of link exits the mark\n plugins.push(linkExitPlugin({ type: markType }));\n\n // keepOnSplit: strip link from storedMarks after a block split so that\n // pressing Enter at the end of a link does not carry it to the new line.\n plugins.push(\n new Plugin({\n key: new PluginKey('linkKeepOnSplit'),\n appendTransaction(transactions, _oldState, newState) {\n const docChanged = transactions.some((tr) => tr.docChanged);\n if (!docChanged) return null;\n\n const { selection } = newState;\n if (!(selection instanceof TextSelection) || !selection.empty) return null;\n\n const $cursor = selection.$cursor;\n if ($cursor?.parentOffset !== 0) return null;\n\n const stored = newState.storedMarks;\n if (!stored) return null;\n\n const hasLink = stored.some((m) => m.type === markType);\n if (!hasLink) return null;\n\n return newState.tr.setStoredMarks(stored.filter((m) => m.type !== markType));\n },\n })\n );\n\n // Autolink plugin - converts typed URLs to links\n if (this.options.autolink) {\n plugins.push(\n autolinkPlugin({\n type: markType,\n protocols: this.options.protocols,\n defaultProtocol: this.options.defaultProtocol,\n ...(this.options.shouldAutoLink && {\n shouldAutoLink: this.options.shouldAutoLink,\n }),\n })\n );\n }\n\n return plugins;\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setLink: CommandSpec<[attributes: LinkAttributes]>;\n unsetLink: CommandSpec;\n toggleLink: CommandSpec<[attributes: LinkAttributes]>;\n }\n}\n","/**\n * Subscript Mark\n *\n * Applies subscript formatting to text (e.g., H₂O).\n *\n * @example\n * ```ts\n * import { Subscript } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Subscript],\n * });\n *\n * // Toggle subscript with keyboard shortcut: Mod-,\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Subscript mark\n */\nexport interface SubscriptOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Subscript mark for text formatting\n */\nexport const Subscript = Mark.create<SubscriptOptions>({\n name: 'subscript',\n\n // Mutual exclusion handled in toggle commands (not schema)\n // so can() dry-run works correctly for toolbar disabled state\n excludes: '',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'sub' },\n {\n style: 'vertical-align',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value === 'sub' ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['sub', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-,': () => this.editor?.commands['toggleSubscript']?.() ?? false,\n };\n },\n\n addCommands() {\n return {\n setSubscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('superscript');\n return commands.setMark('subscript');\n },\n unsetSubscript:\n () =>\n ({ commands }) => commands.unsetMark('subscript'),\n toggleSubscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('superscript');\n return commands.toggleMark('subscript');\n },\n };\n },\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'subscript',\n command: 'toggleSubscript',\n isActive: 'subscript',\n icon: 'textSubscript',\n label: 'Subscript',\n shortcut: 'Mod-,',\n group: 'format',\n priority: 140,\n },\n ];\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setSubscript: CommandSpec;\n unsetSubscript: CommandSpec;\n toggleSubscript: CommandSpec;\n }\n}\n","/**\n * Superscript Mark\n *\n * Applies superscript formatting to text (e.g., x²).\n *\n * @example\n * ```ts\n * import { Superscript } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Superscript],\n * });\n *\n * // Toggle superscript with keyboard shortcut: Mod-.\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Superscript mark\n */\nexport interface SuperscriptOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Superscript mark for text formatting\n */\nexport const Superscript = Mark.create<SuperscriptOptions>({\n name: 'superscript',\n\n // Mutual exclusion handled in toggle commands (not schema)\n // so can() dry-run works correctly for toolbar disabled state\n excludes: '',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'sup' },\n {\n style: 'vertical-align',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value === 'super' ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['sup', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-.': () => this.editor?.commands['toggleSuperscript']?.() ?? false,\n };\n },\n\n addCommands() {\n return {\n setSuperscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('subscript');\n return commands.setMark('superscript');\n },\n unsetSuperscript:\n () =>\n ({ commands }) => commands.unsetMark('superscript'),\n toggleSuperscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('subscript');\n return commands.toggleMark('superscript');\n },\n };\n },\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'superscript',\n command: 'toggleSuperscript',\n isActive: 'superscript',\n icon: 'textSuperscript',\n label: 'Superscript',\n shortcut: 'Mod-.',\n group: 'format',\n priority: 130,\n },\n ];\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setSuperscript: CommandSpec;\n unsetSuperscript: CommandSpec;\n toggleSuperscript: CommandSpec;\n }\n}\n","/**\n * TextStyle Mark\n *\n * A \"carrier mark\" for inline text styling. This mark itself has no attributes,\n * but other extensions (TextColor, FontFamily, FontSize) can inject attributes\n * into it via addGlobalAttributes.\n *\n * @example\n * ```ts\n * import { TextStyle, TextColor, FontFamily } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * TextColor,\n * FontFamily.configure({ fontFamilies: ['Arial', 'Times New Roman'] }),\n * ],\n * });\n *\n * editor.commands.setTextColor('#ff0000');\n * editor.commands.setFontFamily('Arial');\n * ```\n */\nimport { Mark } from '../Mark.js';\n\nexport interface TextStyleOptions {\n /**\n * HTML attributes to add to the rendered element.\n * @default {}\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const TextStyle = Mark.create<TextStyleOptions>({\n name: 'textStyle',\n\n // Lower priority so it renders after other marks\n priority: 101,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span',\n getAttrs: (element) => {\n // Only parse spans that have style attributes\n if (typeof element === 'string') return false;\n const hasStyles = element.hasAttribute('style');\n if (!hasStyles) return false;\n return {};\n },\n },\n // Parse <mark> elements as textStyle (Highlight extension adds backgroundColor attribute)\n { tag: 'mark' },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n return {\n setTextStyle:\n (attributes: Record<string, unknown>) =>\n ({ commands }) => commands.setMark('textStyle', attributes),\n\n removeTextStyle:\n () =>\n ({ commands }) => commands.unsetMark('textStyle'),\n\n removeEmptyTextStyle:\n () =>\n ({ state, tr, dispatch }) => {\n const { from, to, empty } = tr.selection;\n const markType = this.markType;\n\n if (!markType) return false;\n\n // For empty selection, check stored marks — setMark on empty selection\n // only modifies stored marks, so the document still has the old mark.\n // An empty textStyle stored mark (all attrs null) would cause future\n // typed text to get a meaningless <span> wrapper.\n if (empty) {\n const storedMarks = tr.storedMarks ?? state.storedMarks;\n if (storedMarks) {\n const storedTextStyle = storedMarks.find(m => m.type === markType);\n if (storedTextStyle) {\n const hasNonNullAttr = Object.values(storedTextStyle.attrs).some(\n (val) => val !== null && val !== undefined\n );\n if (!hasNonNullAttr) {\n if (dispatch) {\n tr.removeStoredMark(markType);\n dispatch(tr);\n }\n return true;\n }\n }\n }\n return false;\n }\n\n // Non-empty selection: check document marks\n let hasEmptyTextStyle = false;\n\n tr.doc.nodesBetween(from, to, (node) => {\n const textStyleMark = node.marks.find(\n (mark) => mark.type.name === this.name\n );\n if (textStyleMark) {\n const hasNonNullAttr = Object.values(textStyleMark.attrs).some(\n (val) => val !== null && val !== undefined\n );\n if (!hasNonNullAttr) {\n hasEmptyTextStyle = true;\n }\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!hasEmptyTextStyle) return false;\n\n if (dispatch) {\n // Only remove textStyle from nodes where ALL attributes are null.\n // A blanket tr.removeMark(from, to) would also strip marks that\n // have active attributes (e.g. color) on adjacent nodes.\n tr.doc.nodesBetween(from, to, (node, pos) => {\n const mark = node.marks.find(m => m.type === markType);\n if (mark) {\n const hasActiveAttr = Object.values(mark.attrs).some(\n v => v !== null && v !== undefined,\n );\n if (!hasActiveAttr) {\n const nodeFrom = Math.max(pos, from);\n const nodeTo = Math.min(pos + node.nodeSize, to);\n tr.removeMark(nodeFrom, nodeTo, markType);\n }\n }\n });\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n});\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setTextStyle: CommandSpec<[attributes: Record<string, unknown>]>;\n removeTextStyle: CommandSpec;\n removeEmptyTextStyle: CommandSpec;\n }\n}\n","/**\n * BaseKeymap Extension\n *\n * Adds essential keyboard shortcuts for basic editing operations.\n * This includes Enter (new paragraph), Backspace, Delete, and other\n * fundamental editing commands from ProseMirror's baseKeymap.\n *\n * @example\n * ```ts\n * import { BaseKeymap } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, BaseKeymap],\n * });\n * ```\n *\n * ## Included Shortcuts\n * - Enter: Create new paragraph / split block\n * - Backspace: Delete backward\n * - Delete: Delete forward\n * - Mod-Backspace: Delete to start of line\n * - Mod-Delete: Delete to end of line\n * - Alt-ArrowUp/Down: Join with block above/below\n * - Mod-a: Select all\n * - And more standard editing commands\n */\nimport { Extension } from '../Extension.js';\nimport { keymap } from '@domternal/pm/keymap';\nimport {\n baseKeymap,\n chainCommands,\n createParagraphNear,\n liftEmptyBlock,\n newlineInCode,\n splitBlock,\n} from '@domternal/pm/commands';\nimport type { Command } from '@domternal/pm/state';\n\nexport interface BaseKeymapOptions {\n /**\n * Whether to include the default Enter behavior.\n * @default true\n */\n enter: boolean;\n}\n\n// Enhanced Enter command that handles more cases\nconst enterCommand: Command = chainCommands(\n newlineInCode,\n createParagraphNear,\n liftEmptyBlock,\n splitBlock\n);\n\nexport const BaseKeymap = Extension.create<BaseKeymapOptions>({\n name: 'baseKeymap',\n\n addOptions() {\n return {\n enter: true,\n };\n },\n\n addProseMirrorPlugins() {\n const bindings = { ...baseKeymap };\n\n // Override Enter with our enhanced version if enabled\n if (this.options.enter) {\n bindings['Enter'] = enterCommand;\n }\n\n return [keymap(bindings)];\n },\n});\n","/**\n * History Extension\n *\n * Provides undo/redo functionality using prosemirror-history.\n */\nimport { history, undo, redo } from '@domternal/pm/history';\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n undo: CommandSpec;\n redo: CommandSpec;\n }\n}\n\nexport interface HistoryOptions {\n /**\n * Maximum number of undo steps to keep in history.\n * @default 100\n */\n depth: number;\n\n /**\n * Time in milliseconds to group changes into a single undo step.\n * Changes within this delay will be combined.\n * @default 500\n */\n newGroupDelay: number;\n}\n\nexport const History = Extension.create<HistoryOptions>({\n name: 'history',\n\n addOptions() {\n return {\n depth: 100,\n newGroupDelay: 500,\n };\n },\n\n addCommands() {\n return {\n undo:\n () =>\n ({ state, dispatch }) =>\n undo(state, dispatch),\n\n redo:\n () =>\n ({ state, dispatch }) =>\n redo(state, dispatch),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'undo',\n command: 'undo',\n icon: 'arrowCounterClockwise',\n label: 'Undo',\n shortcut: 'Mod-Z',\n group: 'history',\n priority: 200,\n },\n {\n type: 'button',\n name: 'redo',\n command: 'redo',\n icon: 'arrowClockwise',\n label: 'Redo',\n shortcut: 'Mod-Shift-Z',\n group: 'history',\n priority: 190,\n },\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-z': () => this.editor?.commands.undo() ?? false,\n 'Mod-Shift-z': () => this.editor?.commands.redo() ?? false,\n 'Mod-y': () => this.editor?.commands.redo() ?? false,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n history({\n depth: this.options.depth,\n newGroupDelay: this.options.newGroupDelay,\n }),\n ];\n },\n});\n","/**\n * Dropcursor Extension\n *\n * Shows a visual indicator when dragging content to help users\n * see where the content will be dropped.\n */\nimport { dropCursor } from '@domternal/pm/dropcursor';\nimport { Extension } from '../Extension.js';\n\nexport interface DropcursorOptions {\n /**\n * Color of the drop cursor line.\n * @default 'currentColor'\n */\n color: string;\n\n /**\n * Width of the drop cursor line in pixels.\n * @default 1\n */\n width: number;\n\n /**\n * CSS class to add to the drop cursor element.\n * @default undefined\n */\n class?: string;\n}\n\nexport const Dropcursor = Extension.create<DropcursorOptions>({\n name: 'dropcursor',\n\n addOptions() {\n return {\n color: 'currentColor',\n width: 1,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n dropCursor({\n color: this.options.color,\n width: this.options.width,\n ...(this.options.class ? { class: this.options.class } : {}),\n }),\n ];\n },\n});\n","/**\n * Gapcursor Extension\n *\n * Allows cursor to be placed in positions that normally wouldn't accept text,\n * like before/after tables or other block nodes.\n */\nimport { gapCursor } from '@domternal/pm/gapcursor';\nimport { Extension } from '../Extension.js';\n\nexport const Gapcursor = Extension.create({\n name: 'gapcursor',\n\n addProseMirrorPlugins() {\n return [gapCursor()];\n },\n});\n","/**\n * TrailingNode Extension\n *\n * Ensures there's always a trailing node (usually paragraph) at the end\n * of the document, making it easier to type after block elements like\n * code blocks, images, or tables.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { NodeType } from '@domternal/pm/model';\nimport { Extension } from '../Extension.js';\n\nexport interface TrailingNodeOptions {\n /**\n * The node type name to insert as trailing node.\n * @default 'paragraph'\n */\n node: string;\n\n /**\n * Node types after which a trailing node should NOT be added.\n * Typically includes the trailing node type itself.\n * @default ['paragraph']\n */\n notAfter: string[];\n}\n\nconst trailingNodeKey = new PluginKey('trailingNode');\n\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n name: 'trailingNode',\n\n addOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph'],\n };\n },\n\n addProseMirrorPlugins(): Plugin[] {\n const { node: nodeName, notAfter } = this.options;\n const ignoredNames = new Set([...notAfter, nodeName]);\n let type: NodeType;\n let triggerTypes: NodeType[];\n\n return [\n new Plugin({\n key: trailingNodeKey,\n appendTransaction(_, __, state) {\n if (!trailingNodeKey.getState(state)) return;\n return state.tr.insert(state.doc.content.size, type.create());\n },\n state: {\n init(_, { doc, schema }) {\n const nodeType = schema.nodes[nodeName];\n if (!nodeType) {\n throw new Error(`TrailingNode: invalid node type '${nodeName}'`);\n }\n type = nodeType;\n triggerTypes = Object.values(schema.nodes)\n .filter((n) => !ignoredNames.has(n.name));\n const lastType = doc.lastChild?.type;\n return !!lastType && triggerTypes.includes(lastType);\n },\n apply(tr, value) {\n if (!tr.docChanged) return value;\n const lastType = tr.doc.lastChild?.type;\n return !!lastType && triggerTypes.includes(lastType);\n },\n },\n }),\n ];\n },\n});\n","/**\n * Placeholder Extension\n *\n * Shows placeholder text when the editor is empty.\n * Supports both static and dynamic (function-based) placeholders.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport { Extension } from '../Extension.js';\n\nexport interface PlaceholderOptions {\n /**\n * Placeholder text to show. Can be a string or function for per-node placeholders.\n * @default 'Write something …'\n */\n placeholder: string | ((props: { node: PMNode; pos: number }) => string);\n\n /**\n * Only show placeholder when editor is editable.\n * @default true\n */\n showOnlyWhenEditable: boolean;\n\n /**\n * CSS class applied to empty nodes.\n * @default 'is-empty'\n */\n emptyNodeClass: string;\n\n /**\n * CSS class applied when entire editor is empty.\n * @default 'is-editor-empty'\n */\n emptyEditorClass: string;\n\n /**\n * Show placeholder only in the currently focused/selected node.\n * @default true\n */\n showOnlyCurrent: boolean;\n\n /**\n * Include children when checking if a node is empty.\n * @default false\n */\n includeChildren: boolean;\n}\n\nexport const placeholderPluginKey = new PluginKey('placeholder');\n\nexport const Placeholder = Extension.create<PlaceholderOptions>({\n name: 'placeholder',\n\n addOptions() {\n return {\n placeholder: 'Write something …',\n showOnlyWhenEditable: true,\n emptyNodeClass: 'is-empty',\n emptyEditorClass: 'is-editor-empty',\n showOnlyCurrent: true,\n includeChildren: false,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: placeholderPluginKey,\n props: {\n decorations: ({ doc, selection }) => {\n const editor = this.editor;\n if (!editor?.view) return DecorationSet.empty;\n const isEditable = editor.view.editable;\n\n if (!isEditable && this.options.showOnlyWhenEditable) {\n return DecorationSet.empty;\n }\n\n // Check if document is empty (for editor-level class)\n const isDocEmpty =\n doc.childCount === 1 &&\n doc.firstChild?.isTextblock &&\n doc.firstChild.content.size === 0;\n\n const { includeChildren, showOnlyCurrent, emptyNodeClass, emptyEditorClass } = this.options;\n\n const isNodeEmpty = (node: PMNode): boolean =>\n includeChildren\n ? node.content.size === 0\n : node.childCount === 0 ||\n (node.childCount === 1 &&\n !!node.firstChild?.isText &&\n !node.firstChild.text);\n\n const getPlaceholderText = (node: PMNode, pos: number): string =>\n typeof this.options.placeholder === 'function'\n ? this.options.placeholder({ node, pos })\n : this.options.placeholder;\n\n const makeDecoration = (node: PMNode, pos: number): Decoration =>\n Decoration.node(pos, pos + node.nodeSize, {\n class: `${emptyNodeClass}${isDocEmpty ? ` ${emptyEditorClass}` : ''}`,\n 'data-placeholder': getPlaceholderText(node, pos),\n });\n\n // Fast path: showOnlyCurrent (default) — O(1), check only the anchor node\n if (showOnlyCurrent) {\n const { $anchor } = selection;\n if ($anchor.depth === 0) return DecorationSet.empty;\n const node = $anchor.parent;\n if (!node.isTextblock || !isNodeEmpty(node)) return DecorationSet.empty;\n const pos = $anchor.before($anchor.depth);\n return DecorationSet.create(doc, [makeDecoration(node, pos)]);\n }\n\n // Slow path: show placeholder in all empty textblocks\n const decorations: Decoration[] = [];\n doc.descendants((node, pos) => {\n if (!node.isTextblock) return;\n if (!isNodeEmpty(node)) return;\n decorations.push(makeDecoration(node, pos));\n });\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n","/**\n * CharacterCount Extension\n *\n * Provides character and word counting with optional limits.\n * Access counts via editor.storage.characterCount.characters() and .words()\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Extension } from '../Extension.js';\n\nexport interface CharacterCountOptions {\n /**\n * Maximum number of characters allowed. Set to null for no limit.\n * @default null\n */\n limit: number | null;\n\n /**\n * Maximum number of words allowed. Set to null for no limit.\n * @default null\n */\n wordLimit: number | null;\n\n /**\n * How to count characters:\n * - 'textSize': Count text characters only\n * - 'nodeSize': Count ProseMirror node size (includes structural characters)\n * @default 'textSize'\n */\n mode: 'textSize' | 'nodeSize';\n}\n\nexport interface CharacterCountStorage {\n /**\n * Get current character count.\n */\n characters: () => number;\n\n /**\n * Get current word count.\n */\n words: () => number;\n\n /**\n * Get percentage of limit used (0-100). Returns 0 if no limit.\n */\n percentage: () => number;\n\n /**\n * Get remaining characters before limit. Returns Infinity if no limit.\n */\n remaining: () => number;\n\n /**\n * Get percentage of word limit used (0-100). Returns 0 if no word limit.\n */\n wordPercentage: () => number;\n\n /**\n * Get remaining words before limit. Returns Infinity if no word limit.\n */\n wordRemaining: () => number;\n\n /**\n * Check if limit is exceeded.\n */\n isLimitExceeded: () => boolean;\n}\n\nexport const characterCountPluginKey = new PluginKey('characterCount');\n\nexport const CharacterCount = Extension.create<\n CharacterCountOptions,\n CharacterCountStorage\n>({\n name: 'characterCount',\n\n addOptions() {\n return {\n limit: null,\n wordLimit: null,\n mode: 'textSize',\n };\n },\n\n addStorage() {\n return {\n characters: () => 0,\n words: () => 0,\n percentage: () => 0,\n remaining: () => Infinity,\n wordPercentage: () => 0,\n wordRemaining: () => Infinity,\n isLimitExceeded: () => false,\n };\n },\n\n onCreate() {\n const getCharacters = (): number => {\n const doc = this.editor?.view.state.doc;\n if (!doc) return 0;\n\n if (this.options.mode === 'nodeSize') {\n return doc.nodeSize;\n }\n\n return doc.textContent.length;\n };\n\n const getWords = (): number => {\n const doc = this.editor?.view.state.doc;\n if (!doc) return 0;\n\n const text = doc.textContent;\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n return words.length;\n };\n\n this.storage.characters = getCharacters;\n this.storage.words = getWords;\n\n this.storage.percentage = () => {\n if (this.options.limit === null) return 0;\n const chars = getCharacters();\n return Math.min(100, Math.round((chars / this.options.limit) * 100));\n };\n\n this.storage.remaining = () => {\n if (this.options.limit === null) return Infinity;\n return Math.max(0, this.options.limit - getCharacters());\n };\n\n this.storage.wordPercentage = () => {\n if (this.options.wordLimit === null) return 0;\n const words = getWords();\n return Math.min(100, Math.round((words / this.options.wordLimit) * 100));\n };\n\n this.storage.wordRemaining = () => {\n if (this.options.wordLimit === null) return Infinity;\n return Math.max(0, this.options.wordLimit - getWords());\n };\n\n this.storage.isLimitExceeded = () => {\n if (this.options.limit !== null) {\n if (getCharacters() > this.options.limit) return true;\n }\n if (this.options.wordLimit !== null) {\n if (getWords() > this.options.wordLimit) return true;\n }\n return false;\n };\n },\n\n addProseMirrorPlugins() {\n const { limit, wordLimit, mode } = this.options;\n\n // If no limits, no need for filtering plugin\n if (limit === null && wordLimit === null) return [];\n\n return [\n new Plugin({\n key: characterCountPluginKey,\n filterTransaction: (transaction) => {\n // Allow non-document changes (selection, etc.)\n if (!transaction.docChanged) return true;\n\n const newDoc = transaction.doc;\n\n // Character limit check — use same counting mode as characters()\n if (limit !== null) {\n const count = mode === 'nodeSize'\n ? newDoc.nodeSize\n : newDoc.textContent.length;\n if (count > limit) return false;\n }\n\n // Word limit check\n if (wordLimit !== null) {\n const words = newDoc.textContent.split(/\\s+/).filter((w) => w.length > 0);\n if (words.length > wordLimit) {\n return false;\n }\n }\n\n return true;\n },\n }),\n ];\n },\n});\n","/**\n * Typography Extension\n *\n * Provides automatic typographic replacements via input rules:\n * - -- → — (em-dash)\n * - ... → … (ellipsis)\n * - Smart quotes\n * - Arrows, fractions, symbols\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport { Extension } from '../Extension.js';\n\nexport interface TypographyOptions {\n /**\n * Enable em-dash replacement (-- → —)\n * @default true\n */\n emDash: boolean;\n\n /**\n * Enable ellipsis replacement (... → …)\n * @default true\n */\n ellipsis: boolean;\n\n /**\n * Enable arrow replacements (<- → ←, -> → →)\n * @default true\n */\n arrows: boolean;\n\n /**\n * Enable fraction replacements (1/2 → ½, 1/4 → ¼, 3/4 → ¾)\n * @default true\n */\n fractions: boolean;\n\n /**\n * Enable symbol replacements ((c) → ©, (r) → ®, (tm) → ™)\n * @default true\n */\n symbols: boolean;\n\n /**\n * Enable math replacements (+/- → ±, != → ≠)\n * @default true\n */\n math: boolean;\n\n /**\n * Enable guillemet replacements (<< → «, >> → »)\n * @default true\n */\n guillemets: boolean;\n\n /**\n * Enable smart quote replacements (\"text\" → \"text\", 'text' → 'text')\n * @default true\n */\n smartQuotes: boolean;\n\n /**\n * Opening double quote character.\n * @default '\"'\n */\n openDoubleQuote: string;\n\n /**\n * Closing double quote character.\n * @default '\"'\n */\n closeDoubleQuote: string;\n\n /**\n * Opening single quote character.\n * @default '''\n */\n openSingleQuote: string;\n\n /**\n * Closing single quote character.\n * @default '''\n */\n closeSingleQuote: string;\n}\n\nexport const Typography = Extension.create<TypographyOptions>({\n name: 'typography',\n\n addOptions() {\n return {\n emDash: true,\n ellipsis: true,\n arrows: true,\n fractions: true,\n symbols: true,\n math: true,\n guillemets: true,\n smartQuotes: true,\n openDoubleQuote: '\\u201C', // \"\n closeDoubleQuote: '\\u201D', // \"\n openSingleQuote: '\\u2018', // '\n closeSingleQuote: '\\u2019', // '\n };\n },\n\n addInputRules() {\n const rules: InputRule[] = [];\n\n // Helper for simple text replacement rules\n const textReplace = (find: RegExp, replacement: string): InputRule =>\n new InputRule(find, (state, _match, start, end) =>\n state.tr.replaceWith(start, end, state.schema.text(replacement)));\n\n if (this.options.emDash) {\n rules.push(textReplace(/--$/, '\\u2014')); // -- → —\n }\n\n if (this.options.ellipsis) {\n rules.push(textReplace(/\\.\\.\\.$/, '\\u2026')); // ... → …\n }\n\n if (this.options.arrows) {\n rules.push(textReplace(/<-$/, '\\u2190')); // <- → ←\n rules.push(textReplace(/->$/, '\\u2192')); // -> → →\n rules.push(textReplace(/=>$/, '\\u21D2')); // => → ⇒\n }\n\n if (this.options.fractions) {\n rules.push(textReplace(/1\\/2$/, '\\u00BD')); // 1/2 → ½\n rules.push(textReplace(/1\\/4$/, '\\u00BC')); // 1/4 → ¼\n rules.push(textReplace(/3\\/4$/, '\\u00BE')); // 3/4 → ¾\n rules.push(textReplace(/1\\/3$/, '\\u2153')); // 1/3 → ⅓\n rules.push(textReplace(/2\\/3$/, '\\u2154')); // 2/3 → ⅔\n }\n\n if (this.options.symbols) {\n rules.push(textReplace(/\\(c\\)$/i, '\\u00A9')); // (c) → ©\n rules.push(textReplace(/\\(r\\)$/i, '\\u00AE')); // (r) → ®\n rules.push(textReplace(/\\(tm\\)$/i, '\\u2122')); // (tm) → ™\n rules.push(textReplace(/\\(sm\\)$/i, '\\u2120')); // (sm) → ℠\n }\n\n if (this.options.math) {\n rules.push(textReplace(/\\+\\/-$/, '\\u00B1')); // +/- → ±\n rules.push(textReplace(/!=$/, '\\u2260')); // != → ≠\n rules.push(textReplace(/<=$/, '\\u2264')); // <= → ≤\n rules.push(textReplace(/>=$/, '\\u2265')); // >= → ≥\n }\n\n if (this.options.guillemets) {\n rules.push(textReplace(/<<$/, '\\u00AB')); // << → «\n rules.push(textReplace(/>>$/, '\\u00BB')); // >> → »\n }\n\n // Smart quotes (need match groups, can't use textReplace)\n if (this.options.smartQuotes) {\n const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = this.options;\n\n // \"text\" → \"text\" (double quotes)\n rules.push(\n new InputRule(/\"([^\"]+)\"$/, (state, match, start, end) => {\n const text = match[1] ?? '';\n return state.tr.replaceWith(\n start,\n end,\n state.schema.text(openDoubleQuote + text + closeDoubleQuote)\n );\n })\n );\n\n // 'text' → 'text' (single quotes - only when clearly a quote pair)\n // Use pattern to avoid matching apostrophes in contractions\n rules.push(\n new InputRule(/(?:^|[\\s([{])'([^']+)'$/, (state, match, start, end) => {\n const text = match[1] ?? '';\n const prefix = match[0].charAt(0);\n // If there's a prefix character (space, bracket, etc.), keep it\n const hasPrefix = prefix !== \"'\";\n return state.tr.replaceWith(\n start,\n end,\n state.schema.text(\n hasPrefix\n ? prefix + openSingleQuote + text + closeSingleQuote\n : openSingleQuote + text + closeSingleQuote\n )\n );\n })\n );\n }\n\n return rules;\n },\n});\n","/**\n * TextAlign Extension\n *\n * Adds text alignment capabilities to specified node types.\n * Uses addGlobalAttributes to inject textAlign attribute into nodes.\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setTextAlign: CommandSpec<[alignment: string]>;\n unsetTextAlign: CommandSpec;\n }\n}\n\nexport interface TextAlignOptions {\n /**\n * Node types that can have text alignment.\n * @default ['heading', 'paragraph']\n */\n types: string[];\n\n /**\n * Allowed alignment values.\n * @default ['left', 'center', 'right', 'justify']\n */\n alignments: string[];\n\n /**\n * Default alignment value.\n * @default 'left'\n */\n defaultAlignment: string;\n}\n\nexport const TextAlign = Extension.create<TextAlignOptions>({\n name: 'textAlign',\n\n addOptions() {\n return {\n types: ['heading', 'paragraph'],\n alignments: ['left', 'center', 'right', 'justify'],\n defaultAlignment: 'left',\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n textAlign: {\n default: this.options.defaultAlignment,\n parseHTML: (element: HTMLElement) =>\n element.style.textAlign || this.options.defaultAlignment,\n renderHTML: (attributes: Record<string, unknown>) => {\n const textAlign = attributes['textAlign'] as string;\n if (textAlign === this.options.defaultAlignment) {\n return null;\n }\n return { style: `text-align: ${textAlign}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setTextAlign:\n (alignment: string) =>\n ({ commands }) => {\n if (!this.options.alignments.includes(alignment)) {\n return false;\n }\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { textAlign: alignment }))\n .some(Boolean);\n },\n\n unsetTextAlign:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'textAlign'))\n .some(Boolean);\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-l': () =>\n this.editor?.commands.setTextAlign('left') ?? false,\n 'Mod-Shift-e': () =>\n this.editor?.commands.setTextAlign('center') ?? false,\n 'Mod-Shift-r': () =>\n this.editor?.commands.setTextAlign('right') ?? false,\n 'Mod-Shift-j': () =>\n this.editor?.commands.setTextAlign('justify') ?? false,\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n const types = this.options.types;\n const makeActive = (alignment: string): { name: string; attributes: Record<string, unknown> }[] =>\n types.map((t) => ({ name: t, attributes: { textAlign: alignment } }));\n\n return [\n {\n type: 'dropdown',\n name: 'textAlign',\n icon: 'textAlignLeft',\n label: 'Text Alignment',\n group: 'alignment',\n priority: 200,\n dynamicIcon: true,\n items: [\n {\n type: 'button',\n name: 'alignLeft',\n command: 'setTextAlign',\n commandArgs: ['left'],\n isActive: makeActive('left'),\n icon: 'textAlignLeft',\n label: 'Align Left',\n shortcut: 'Mod-Shift-L',\n },\n {\n type: 'button',\n name: 'alignCenter',\n command: 'setTextAlign',\n commandArgs: ['center'],\n isActive: makeActive('center'),\n icon: 'textAlignCenter',\n label: 'Align Center',\n shortcut: 'Mod-Shift-E',\n },\n {\n type: 'button',\n name: 'alignRight',\n command: 'setTextAlign',\n commandArgs: ['right'],\n isActive: makeActive('right'),\n icon: 'textAlignRight',\n label: 'Align Right',\n shortcut: 'Mod-Shift-R',\n },\n {\n type: 'button',\n name: 'alignJustify',\n command: 'setTextAlign',\n commandArgs: ['justify'],\n isActive: makeActive('justify'),\n icon: 'textAlignJustify',\n label: 'Justify',\n shortcut: 'Mod-Shift-J',\n },\n ],\n },\n ];\n },\n});\n","/**\n * Focus Extension\n *\n * Adds CSS classes to nodes that contain the current selection.\n * Useful for highlighting the focused paragraph or block.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\n\nexport interface FocusOptions {\n /**\n * CSS class to add to focused nodes.\n * @default 'has-focus'\n */\n className: string;\n\n /**\n * Which nodes to mark as focused:\n * - 'all': All nodes containing the selection\n * - 'deepest': Only the innermost focused node\n * - 'shallowest': Only the outermost focused node\n * @default 'all'\n */\n mode: 'all' | 'deepest' | 'shallowest';\n}\n\nexport const focusPluginKey = new PluginKey('focus');\n\nexport const Focus = Extension.create<FocusOptions>({\n name: 'focus',\n\n addOptions() {\n return {\n className: 'has-focus',\n mode: 'all',\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: focusPluginKey,\n props: {\n decorations: ({ doc, selection }) => {\n const { from, to } = selection;\n const decorations: Decoration[] = [];\n const focusedNodes: { pos: number; nodeSize: number }[] = [];\n\n // Collect all nodes containing the selection\n doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) return;\n\n // Check if this node actually contains part of the selection\n const nodeEnd = pos + node.nodeSize;\n if (pos <= to && nodeEnd >= from) {\n focusedNodes.push({ pos, nodeSize: node.nodeSize });\n }\n });\n\n if (focusedNodes.length === 0) {\n return DecorationSet.empty;\n }\n\n // Apply mode filtering\n let nodesToDecorate = focusedNodes;\n\n if (this.options.mode === 'deepest') {\n // Only the innermost (last) node\n const last = focusedNodes[focusedNodes.length - 1];\n nodesToDecorate = last ? [last] : [];\n } else if (this.options.mode === 'shallowest') {\n // Only the outermost (first) node\n const first = focusedNodes[0];\n nodesToDecorate = first ? [first] : [];\n }\n\n // Create decorations\n for (const { pos, nodeSize } of nodesToDecorate) {\n decorations.push(\n Decoration.node(pos, pos + nodeSize, {\n class: this.options.className,\n })\n );\n }\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n","/**\n * LineHeight Extension\n *\n * Adds line height styling to block nodes.\n *\n * @example\n * ```ts\n * import { LineHeight } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * LineHeight.configure({\n * types: ['paragraph', 'heading'],\n * lineHeights: ['1', '1.5', '2'],\n * }),\n * ],\n * });\n *\n * editor.commands.setLineHeight('1.5');\n * editor.commands.unsetLineHeight();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setLineHeight: CommandSpec<[lineHeight: string]>;\n unsetLineHeight: CommandSpec;\n }\n}\n\nexport interface LineHeightOptions {\n /**\n * Node types that should support line height.\n * @default ['paragraph', 'heading']\n */\n types: string[];\n\n /**\n * List of allowed line heights (e.g., ['1', '1.5', '2']).\n * If empty, all values are allowed.\n * @default ['1', '1.15', '1.25', '1.5', '2']\n */\n lineHeights: string[];\n\n /**\n * Default line height value.\n * @default null\n */\n defaultLineHeight: string | null;\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: 'lineHeight',\n\n addOptions() {\n return {\n types: ['paragraph', 'heading'],\n lineHeights: ['1', '1.15', '1.25', '1.5', '2'],\n defaultLineHeight: null,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: this.options.defaultLineHeight,\n parseHTML: (element: HTMLElement) => {\n return element.style.lineHeight || this.options.defaultLineHeight;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const lineHeight = attributes['lineHeight'] as string | null;\n\n // Don't render if it's the default\n if (!lineHeight || lineHeight === this.options.defaultLineHeight) {\n return null;\n }\n\n // Validate if lineHeights list is provided\n if (\n this.options.lineHeights.length > 0 &&\n !this.options.lineHeights.includes(lineHeight)\n ) {\n return null;\n }\n\n return { style: `line-height: ${lineHeight}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight: string) =>\n ({ commands }) => {\n // Validate if lineHeights list is provided\n if (\n this.options.lineHeights.length > 0 &&\n !this.options.lineHeights.includes(lineHeight)\n ) {\n return false;\n }\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { lineHeight }))\n .some(Boolean);\n },\n\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'lineHeight'))\n .some(Boolean);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.lineHeights.length === 0) return [];\n\n const types = this.options.types;\n return [\n {\n type: 'dropdown',\n name: 'lineHeight',\n icon: 'lineSpacing',\n label: 'Line Height',\n group: 'textStyle',\n priority: 50,\n displayMode: 'text',\n dynamicLabel: true,\n items: [\n ...this.options.lineHeights.map((lh, i) => ({\n type: 'button' as const,\n name: `lineHeight-${lh}`,\n command: 'setLineHeight',\n commandArgs: [lh],\n isActive: types.map((t) => ({ name: t, attributes: { lineHeight: lh } })),\n icon: 'lineSpacing',\n label: lh,\n priority: 200 - i,\n })),\n {\n type: 'button' as const,\n name: 'unsetLineHeight',\n command: 'unsetLineHeight',\n icon: 'lineSpacing',\n label: 'Default',\n },\n ],\n },\n ];\n },\n});\n","/**\n * UniqueID Extension\n *\n * Automatically assigns unique IDs to specified node types.\n * Useful for collaborative editing, linking, and history tracking.\n *\n * @example\n * ```ts\n * import { UniqueID } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * UniqueID.configure({\n * types: ['paragraph', 'heading'],\n * attributeName: 'id',\n * }),\n * ],\n * });\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey, type Transaction } from '@domternal/pm/state';\nimport { Fragment, Slice } from '@domternal/pm/model';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\n\n/**\n * Simple UUID generator (no external dependency)\n */\nfunction generateUUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport const uniqueIDPluginKey = new PluginKey('uniqueID');\n\nexport interface UniqueIDOptions {\n /**\n * Node types that should receive unique IDs.\n * @default ['paragraph', 'heading', 'blockquote', 'codeBlock', 'bulletList', 'orderedList', 'taskList', 'listItem', 'taskItem', 'image', 'horizontalRule']\n */\n types: string[];\n\n /**\n * Attribute name to store the unique ID.\n * @default 'id'\n */\n attributeName: string;\n\n /**\n * Function to generate unique IDs.\n * @default generateUUID\n */\n generateID: () => string;\n\n /**\n * Whether to filter duplicates when pasting content.\n * @default true\n */\n filterDuplicates: boolean;\n}\n\nexport const UniqueID = Extension.create<UniqueIDOptions>({\n name: 'uniqueID',\n\n addOptions() {\n return {\n types: [\n 'paragraph',\n 'heading',\n 'blockquote',\n 'codeBlock',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'listItem',\n 'taskItem',\n 'image',\n 'horizontalRule',\n ],\n attributeName: 'id',\n generateID: generateUUID,\n filterDuplicates: true,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n [this.options.attributeName]: {\n default: null,\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(this.options.attributeName),\n renderHTML: (attributes: Record<string, unknown>) => {\n const id = attributes[this.options.attributeName] as string | null;\n if (!id) return null;\n return { [this.options.attributeName]: id };\n },\n },\n },\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const { types, attributeName, generateID, filterDuplicates } = this.options;\n const editor = this.editor as Editor | null;\n\n const transformPastedSlice = (slice: Slice): Slice => {\n const existingIDs = new Set<string>();\n\n // Collect existing IDs in document\n editor?.state.doc.descendants((node: PMNode) => {\n const id = node.attrs[attributeName] as string | undefined;\n if (id) existingIDs.add(id);\n });\n\n // Transform pasted content\n const transformNode = (node: PMNode): PMNode => {\n if (!types.includes(node.type.name)) {\n return node.copy(transformFragment(node.content));\n }\n\n const existingID = node.attrs[attributeName] as string | undefined;\n if (existingID && existingIDs.has(existingID)) {\n // Regenerate ID for duplicate\n return node.type.create(\n { ...node.attrs, [attributeName]: generateID() },\n transformFragment(node.content),\n node.marks\n );\n }\n\n // Track new ID\n if (existingID) existingIDs.add(existingID);\n return node.copy(transformFragment(node.content));\n };\n\n const transformFragment = (fragment: Fragment): Fragment => {\n const nodes: PMNode[] = [];\n fragment.forEach((node) => {\n nodes.push(transformNode(node));\n });\n return Fragment.from(nodes);\n };\n\n return new Slice(\n transformFragment(slice.content),\n slice.openStart,\n slice.openEnd\n );\n };\n\n // Helper to assign IDs to nodes that lack them\n const assignMissingIDs = (doc: PMNode, tr: Transaction): void => {\n doc.descendants((node, pos) => {\n if (!types.includes(node.type.name)) return;\n\n const existingID = node.attrs[attributeName] as string | undefined;\n if (!existingID) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n [attributeName]: generateID(),\n });\n }\n });\n };\n\n return [\n new Plugin({\n key: uniqueIDPluginKey,\n\n // Apply initial IDs after the view is ready\n view(editorView) {\n // Use setTimeout to avoid dispatching during plugin init, but\n // re-create the transaction from the *current* state inside the\n // callback to avoid stale-transaction bugs.\n const timeoutId = setTimeout(() => {\n const tr = editorView.state.tr;\n assignMissingIDs(editorView.state.doc, tr);\n if (tr.docChanged) {\n editorView.dispatch(tr);\n }\n }, 0);\n return {\n destroy() {\n clearTimeout(timeoutId);\n },\n };\n },\n\n // Ensure new nodes get IDs\n appendTransaction(transactions, _oldState, newState) {\n const docChanged = transactions.some((tr) => tr.docChanged);\n if (!docChanged) return null;\n\n const tr = newState.tr;\n assignMissingIDs(newState.doc, tr);\n\n return tr.docChanged ? tr : null;\n },\n\n // Handle paste - filter duplicates\n props: filterDuplicates\n ? {\n transformPasted: transformPastedSlice,\n }\n : {},\n }),\n ];\n },\n});\n","/**\n * Selection Extension\n *\n * Provides selection utilities and helpers for working with\n * the editor's current selection state.\n *\n * @example\n * ```ts\n * import { Selection } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * Selection,\n * ],\n * });\n *\n * // Get selected text\n * const text = editor.storage.selection.getText();\n *\n * // Check if selection is empty\n * if (editor.storage.selection.isEmpty()) {\n * console.log('Cursor is collapsed');\n * }\n *\n * // Get selection range\n * const { from, to } = editor.storage.selection.getRange();\n *\n * // Set selection programmatically\n * editor.commands.setSelection(5, 10);\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { NodeSelection, TextSelection, Selection as PMSelection } from '@domternal/pm/state';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setSelection: CommandSpec<[from: number, to?: number]>;\n selectNode: CommandSpec<[pos: number]>;\n selectParentNode: CommandSpec;\n extendSelection: CommandSpec<[direction: 'left' | 'right' | 'start' | 'end']>;\n }\n}\n\nexport interface SelectionOptions {}\n\nexport interface SelectionStorage {\n /**\n * Returns the currently selected text content.\n */\n getText: () => string;\n\n /**\n * Returns the selected node (if a node selection).\n */\n getNode: () => PMNode | null;\n\n /**\n * Returns true if the selection is empty.\n */\n isEmpty: () => boolean;\n\n /**\n * Returns the selection range { from, to }.\n */\n getRange: () => { from: number; to: number };\n\n /**\n * Returns the current cursor position (null if range selection).\n */\n getCursor: () => number | null;\n}\n\nexport const Selection = Extension.create<SelectionOptions, SelectionStorage>({\n name: 'selection',\n\n addStorage() {\n return {\n getText: () => '',\n getNode: () => null,\n isEmpty: () => true,\n getRange: () => ({ from: 0, to: 0 }),\n getCursor: () => null,\n };\n },\n\n onCreate() {\n const editor = this.editor as Editor | null;\n\n // Initialize storage methods\n this.storage.getText = () => {\n const state = editor?.state;\n if (!state) return '';\n\n const { selection, doc } = state;\n const { from, to } = selection;\n return doc.textBetween(from, to, ' ');\n };\n\n this.storage.getNode = () => {\n const state = editor?.state;\n if (!state) return null;\n\n const { selection } = state;\n if (selection instanceof NodeSelection) {\n return selection.node;\n }\n\n return null;\n };\n\n this.storage.isEmpty = () => {\n const state = editor?.state;\n if (!state) return true;\n return state.selection.empty;\n };\n\n this.storage.getRange = () => {\n const state = editor?.state;\n if (!state) return { from: 0, to: 0 };\n return { from: state.selection.from, to: state.selection.to };\n };\n\n this.storage.getCursor = () => {\n const state = editor?.state;\n if (!state) return null;\n const { selection } = state;\n if (!selection.empty) return null;\n return selection.from;\n };\n },\n\n addCommands() {\n return {\n setSelection:\n (from: number, to?: number) =>\n ({ tr, dispatch }) => {\n const resolvedTo = to ?? from;\n\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n if (from < 0 || resolvedTo > tr.doc.content.size) {\n return false;\n }\n\n if (dispatch) {\n const selection = TextSelection.create(tr.doc, from, resolvedTo);\n tr.setSelection(selection);\n dispatch(tr);\n }\n\n return true;\n },\n\n selectNode:\n (pos: number) =>\n ({ tr, dispatch }) => {\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n if (pos < 0 || pos >= tr.doc.content.size) {\n return false;\n }\n\n const node = tr.doc.nodeAt(pos);\n\n if (!node) return false;\n\n if (dispatch) {\n const selection = NodeSelection.create(tr.doc, pos);\n tr.setSelection(selection);\n dispatch(tr);\n }\n\n return true;\n },\n\n selectParentNode:\n () =>\n ({ tr, dispatch }) => {\n // Use tr.selection/tr.doc for chain compatibility\n const { $from } = tr.selection;\n\n // Find the nearest parent node that can be selected\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n const pos = $from.before(depth);\n\n if (node.type.spec.selectable !== false) {\n if (dispatch) {\n const sel = NodeSelection.create(tr.doc, pos);\n tr.setSelection(sel);\n dispatch(tr);\n }\n return true;\n }\n }\n\n return false;\n },\n\n extendSelection:\n (direction: 'left' | 'right' | 'start' | 'end') =>\n ({ tr, dispatch }) => {\n // Use tr.selection/tr.doc for chain compatibility\n let { from, to } = tr.selection;\n\n // Use Selection.atStart/atEnd to find the first/last valid\n // text position, which handles nested structures correctly\n // (e.g. doc > blockquote > paragraph where position 1 is not\n // inside a textblock).\n switch (direction) {\n case 'left':\n from = Math.max(PMSelection.atStart(tr.doc).from, from - 1);\n break;\n case 'right':\n to = Math.min(PMSelection.atEnd(tr.doc).to, to + 1);\n break;\n case 'start':\n from = PMSelection.atStart(tr.doc).from;\n break;\n case 'end':\n to = PMSelection.atEnd(tr.doc).to;\n break;\n }\n\n if (dispatch) {\n const newSelection = TextSelection.create(tr.doc, from, to);\n tr.setSelection(newSelection);\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n});\n","/**\n * SelectionDecoration Extension\n *\n * Collapses the editor's range selection to a cursor when the editor loses\n * focus. This prevents a \"ghost selection\" from lingering after the user\n * clicks outside the editor (approach A — same as Google Docs / Notion).\n *\n * Toolbar and bubble-menu buttons call `event.preventDefault()` on\n * `mousedown`, so they never trigger blur — the selection stays intact\n * while the user interacts with editor UI.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport { Extension } from '../Extension.js';\n\nexport interface SelectionDecorationOptions {}\n\nexport const selectionDecorationPluginKey = new PluginKey(\n 'selectionDecoration'\n);\n\nexport const SelectionDecoration = Extension.create<SelectionDecorationOptions>(\n {\n name: 'selectionDecoration',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: selectionDecorationPluginKey,\n props: {\n handleDOMEvents: {\n blur(view, event) {\n // Don't collapse selection when focus moves to editor-related\n // UI (e.g. link popover input). Elements marked with\n // [data-dm-editor-ui] are treated as part of the editor.\n const related = event.relatedTarget;\n if (\n related instanceof HTMLElement &&\n related.closest('[data-dm-editor-ui]')\n ) {\n return false;\n }\n\n const { from, to } = view.state.selection;\n if (from !== to) {\n view.dispatch(\n view.state.tr.setSelection(\n TextSelection.create(view.state.doc, from)\n )\n );\n }\n return false;\n },\n },\n },\n }),\n ];\n },\n }\n);\n","/**\n * InvisibleChars Extension\n *\n * Shows invisible characters like spaces, paragraph marks, and hard breaks.\n * Useful for document editing where whitespace matters.\n *\n * Styles are included automatically via `@domternal/theme` (`_invisible-chars.scss`).\n *\n * @example\n * ```ts\n * import { InvisibleChars } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * InvisibleChars.configure({\n * visible: false, // Start hidden\n * paragraph: true,\n * hardBreak: true,\n * space: true,\n * nbsp: true,\n * }),\n * ],\n * });\n *\n * // Toggle visibility\n * editor.commands.toggleInvisibleChars();\n *\n * // Check current state\n * const isVisible = editor.storage.invisibleChars.isVisible();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport type { Node as ProseMirrorNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n toggleInvisibleChars: CommandSpec;\n showInvisibleChars: CommandSpec;\n hideInvisibleChars: CommandSpec;\n }\n}\n\nexport const invisibleCharsPluginKey = new PluginKey('invisibleChars');\n\n// Unicode characters for display\nconst CHARS = {\n paragraph: '¶',\n hardBreak: '↵',\n space: '·',\n nbsp: '°',\n};\n\ninterface InvisibleCharsPluginState {\n visible: boolean;\n decorations: DecorationSet;\n}\n\nfunction buildDecorations(\n doc: ProseMirrorNode,\n options: InvisibleCharsOptions,\n): DecorationSet {\n const decorations: Decoration[] = [];\n\n doc.descendants((node, pos) => {\n if (options.paragraph && node.type.name === 'paragraph') {\n const endPos = pos + node.nodeSize - 1;\n decorations.push(\n Decoration.widget(\n endPos,\n () => {\n const span = document.createElement('span');\n span.className = `${options.className} ${options.className}--paragraph`;\n span.textContent = CHARS.paragraph;\n return span;\n },\n { side: -1 }\n )\n );\n }\n\n if (options.hardBreak && node.type.name === 'hardBreak') {\n decorations.push(\n Decoration.widget(\n pos,\n () => {\n const span = document.createElement('span');\n span.className = `${options.className} ${options.className}--hardBreak`;\n span.textContent = CHARS.hardBreak;\n return span;\n },\n { side: -1 }\n )\n );\n }\n\n if (node.isText && node.text) {\n const text = node.text;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const charPos = pos + i;\n\n if (options.space && char === ' ') {\n decorations.push(\n Decoration.inline(charPos, charPos + 1, {\n class: `${options.className} ${options.className}--space`,\n 'data-char': 'space',\n })\n );\n }\n\n if (options.nbsp && char === '\\u00A0') {\n decorations.push(\n Decoration.inline(charPos, charPos + 1, {\n class: `${options.className} ${options.className}--nbsp`,\n 'data-char': 'nbsp',\n })\n );\n }\n }\n }\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nexport interface InvisibleCharsOptions {\n /**\n * Whether invisible characters are shown.\n * @default false\n */\n visible: boolean;\n\n /**\n * Show paragraph markers (¶).\n * @default true\n */\n paragraph: boolean;\n\n /**\n * Show hard break markers (↵).\n * @default true\n */\n hardBreak: boolean;\n\n /**\n * Show space markers (·).\n * @default true\n */\n space: boolean;\n\n /**\n * Show non-breaking space markers (°).\n * @default true\n */\n nbsp: boolean;\n\n /**\n * Custom CSS class for invisible char decorations.\n * @default 'invisible-char'\n */\n className: string;\n}\n\nexport interface InvisibleCharsStorage {\n /**\n * Toggle visibility of invisible characters.\n */\n toggle: () => void;\n\n /**\n * Current visibility state.\n */\n isVisible: () => boolean;\n}\n\nexport const InvisibleChars = Extension.create<\n InvisibleCharsOptions,\n InvisibleCharsStorage\n>({\n name: 'invisibleChars',\n\n addOptions() {\n return {\n visible: false,\n paragraph: true,\n hardBreak: true,\n space: true,\n nbsp: true,\n className: 'invisible-char',\n };\n },\n\n addStorage() {\n return {\n toggle: (): void => {\n // Initialized in onCreate\n },\n isVisible: () => false,\n };\n },\n\n onCreate() {\n const editor = this.editor as Editor | null;\n const options = this.options;\n\n this.storage.toggle = (): void => {\n const state = editor?.state;\n if (!state) return;\n\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n const currentVisible = pluginState?.visible ?? options.visible;\n\n const tr = state.tr.setMeta(invisibleCharsPluginKey, {\n visible: !currentVisible,\n });\n editor.view.dispatch(tr);\n };\n\n this.storage.isVisible = (): boolean => {\n const state = editor?.state;\n if (!state) return options.visible;\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n return pluginState?.visible ?? options.visible;\n };\n },\n\n addCommands() {\n return {\n toggleInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch) {\n this.storage.toggle();\n }\n return true;\n },\n\n showInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch && !this.storage.isVisible()) {\n this.storage.toggle();\n }\n return true;\n },\n\n hideInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch && this.storage.isVisible()) {\n this.storage.toggle();\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-i': () => {\n return this.editor?.commands.toggleInvisibleChars() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'invisibleChars',\n command: 'toggleInvisibleChars',\n icon: 'paragraph',\n label: 'Invisible Characters',\n shortcut: 'Mod-Shift-I',\n group: 'utility',\n priority: 100,\n isActiveFn: (editor) => {\n const storage = editor.storage['invisibleChars'] as\n | { isVisible?: () => boolean }\n | undefined;\n return storage?.isVisible?.() ?? false;\n },\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n\n return [\n new Plugin({\n key: invisibleCharsPluginKey,\n\n state: {\n init: (_, state): InvisibleCharsPluginState => ({\n visible: options.visible,\n decorations: options.visible\n ? buildDecorations(state.doc, options)\n : DecorationSet.empty,\n }),\n apply: (tr, prev: InvisibleCharsPluginState, _oldState, newState): InvisibleCharsPluginState => {\n const meta = tr.getMeta(invisibleCharsPluginKey) as\n | { visible: boolean }\n | undefined;\n const visible = meta?.visible ?? prev.visible;\n\n if (!visible) {\n if (!prev.visible) return prev;\n return { visible, decorations: DecorationSet.empty };\n }\n\n // Visibility just toggled on — full rebuild\n if (!prev.visible) {\n return { visible, decorations: buildDecorations(newState.doc, options) };\n }\n\n // Doc changed — rebuild\n if (tr.docChanged) {\n return { visible, decorations: buildDecorations(newState.doc, options) };\n }\n\n // No change — reuse cached\n return prev;\n },\n },\n\n props: {\n decorations: (state) => {\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n return pluginState?.decorations ?? DecorationSet.empty;\n },\n },\n }),\n ];\n },\n});\n","/**\n * TextColor Extension\n *\n * Adds text color styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, TextColor } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * TextColor, // uses the default 80-color palette\n * ],\n * });\n *\n * editor.commands.setTextColor('#ff0000');\n * editor.commands.unsetTextColor();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { normalizeColor } from '../helpers/normalizeColor.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setTextColor: CommandSpec<[color: string]>;\n unsetTextColor: CommandSpec;\n }\n}\n\n/**\n * Default 25-color palette (5 columns x 5 rows).\n * Row 1: neutrals (black → white)\n * Row 2: pastel tints\n * Row 3: vivid / saturated\n * Row 4: medium shades\n * Row 5: dark shades\n *\n * Columns: Red, Orange/Yellow, Green, Blue, Purple\n */\nexport const DEFAULT_TEXT_COLORS: string[] = [\n // Row 1 — Neutrals\n '#000000', '#595959', '#a6a6a6', '#d9d9d9', '#ffffff',\n // Row 2 — Pastel\n '#ffc9c9', '#fff3bf', '#b2f2bb', '#a5d8ff', '#d0bfff',\n // Row 3 — Vivid\n '#e03131', '#f08c00', '#2f9e44', '#1971c2', '#7048e8',\n // Row 4 — Medium\n '#ff6b6b', '#ffd43b', '#69db7c', '#4dabf7', '#9775fa',\n // Row 5 — Dark\n '#c92a2a', '#e67700', '#2b8a3e', '#1864ab', '#6741d9',\n];\n\nexport interface TextColorOptions {\n /**\n * List of color values for the palette.\n * Defaults to a 25-color grid (5 cols x 5 rows).\n * Pass a custom array to restrict to specific colors.\n */\n colors: string[];\n\n /**\n * Number of columns in the palette grid.\n * @default 5\n */\n columns: number;\n}\n\nexport const TextColor = Extension.create<TextColorOptions>({\n name: 'textColor',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n colors: DEFAULT_TEXT_COLORS,\n columns: 5,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n color: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const raw = element.style.color.replace(/['\"]+/g, '');\n return raw ? normalizeColor(raw) : null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const color = attributes['color'] as string | null;\n if (!color) return null;\n\n return { style: `color: ${color}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setTextColor:\n (color: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { color });\n },\n\n unsetTextColor:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { color: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.colors.length === 0) return [];\n\n return [\n {\n type: 'dropdown',\n name: 'textColor',\n icon: 'textAUnderline',\n label: 'Text Color',\n group: 'textStyle',\n priority: 200,\n layout: 'grid',\n gridColumns: this.options.columns,\n defaultIndicatorColor: '#000000',\n items: [\n {\n type: 'button' as const,\n name: 'unsetTextColor',\n command: 'unsetTextColor',\n icon: 'prohibit',\n label: 'Default',\n },\n ...this.options.colors.map((color, i) => ({\n type: 'button' as const,\n name: `textColor-${color}`,\n command: 'setTextColor',\n commandArgs: [color],\n isActive: { name: 'textStyle', attributes: { color } },\n icon: '',\n label: color,\n color,\n priority: 200 - i,\n })),\n ],\n },\n ];\n },\n});\n","/**\n * Highlight Extension\n *\n * Adds background-color highlighting via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, Highlight } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * Highlight, // uses the default 25-color palette\n * ],\n * });\n *\n * editor.commands.setHighlight({ color: '#fef08a' });\n * editor.commands.unsetHighlight();\n * editor.commands.toggleHighlight();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { normalizeColor } from '../helpers/normalizeColor.js';\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setHighlight: CommandSpec<[attributes?: { color?: string }]>;\n unsetHighlight: CommandSpec;\n toggleHighlight: CommandSpec<[attributes?: { color?: string }]>;\n }\n}\n\n/**\n * Default 25-color highlight palette (5 columns x 5 rows).\n * Row 1–2: warm pastels (yellow → pink)\n * Row 3–4: cool pastels (green → purple)\n * Row 5: neutrals\n */\nexport const DEFAULT_HIGHLIGHT_COLORS: string[] = [\n // Row 1 — Classic warm highlights\n '#fef08a', '#fde68a', '#fed7aa', '#fecaca', '#fbcfe8',\n // Row 2 — Lighter warm pastels\n '#fef9c3', '#fef3c7', '#ffedd5', '#fee2e2', '#fce7f3',\n // Row 3 — Cool highlights\n '#a7f3d0', '#99f6e4', '#a5f3fc', '#bfdbfe', '#c4b5fd',\n // Row 4 — Lighter cool pastels\n '#d1fae5', '#ccfbf1', '#cffafe', '#dbeafe', '#ede9fe',\n // Row 5 — Neutrals\n '#e5e7eb', '#d1d5db', '#f3f4f6', '#fafafa', '#ffffff',\n];\n\nexport interface HighlightOptions {\n /**\n * List of color values for the highlight palette.\n * Pass an empty array to get a simple toggle button instead of a dropdown.\n */\n colors: string[];\n\n /**\n * Number of columns in the palette grid.\n * @default 5\n */\n columns: number;\n\n /**\n * Default highlight color used by keyboard shortcut and ==text== input rule.\n * @default '#fef08a'\n */\n defaultColor: string;\n}\n\nexport const Highlight = Extension.create<HighlightOptions>({\n name: 'highlight',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n colors: DEFAULT_HIGHLIGHT_COLORS,\n columns: 5,\n defaultColor: '#fef08a',\n };\n },\n\n addGlobalAttributes() {\n const { options } = this;\n return [\n {\n types: ['textStyle'],\n attributes: {\n backgroundColor: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const raw = element.style.backgroundColor.replace(/['\"]+/g, '');\n if (raw) return normalizeColor(raw);\n // Plain <mark> without inline background-color → use default\n if (element.tagName === 'MARK') return options.defaultColor;\n return null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const bg = attributes['backgroundColor'] as string | null;\n if (!bg) return null;\n return { style: `background-color: ${bg}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n const defaultColor = this.options.defaultColor;\n return {\n setHighlight:\n (attributes?: { color?: string }) =>\n ({ commands }) => {\n const color = attributes?.color ?? defaultColor;\n return commands.setMark('textStyle', { backgroundColor: color });\n },\n\n unsetHighlight:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { backgroundColor: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n\n toggleHighlight:\n (attributes?: { color?: string }) =>\n ({ commands, state }) => {\n const color = attributes?.color ?? defaultColor;\n const markType = state.schema.marks['textStyle'];\n if (!markType) return false;\n\n const { from, to, empty } = state.selection;\n let hasHighlight = false;\n\n if (empty) {\n const marks = state.storedMarks ?? state.doc.resolve(from).marks();\n const mark = markType.isInSet(marks);\n hasHighlight = !!mark?.attrs['backgroundColor'];\n } else {\n state.doc.nodesBetween(from, to, (node) => {\n if (hasHighlight) return false;\n const mark = markType.isInSet(node.marks);\n if (mark?.attrs['backgroundColor']) {\n hasHighlight = true;\n return false;\n }\n return true;\n });\n }\n\n if (hasHighlight) {\n commands.setMark('textStyle', { backgroundColor: null });\n commands.removeEmptyTextStyle();\n return true;\n }\n\n return commands.setMark('textStyle', { backgroundColor: color });\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-h': () =>\n this.editor?.commands.toggleHighlight() ?? false,\n };\n },\n\n addInputRules() {\n const defaultColor = this.options.defaultColor;\n return [\n new InputRule(\n /(?:==)([^=]+)(?:==)$/,\n (state, match, start, end) => {\n const textStyleType = state.schema.marks['textStyle'];\n if (!textStyleType) return null;\n\n const content = match[1];\n if (!content) return null;\n\n const { tr } = state;\n tr.replaceWith(start, end, state.schema.text(content));\n tr.addMark(\n start,\n start + content.length,\n textStyleType.create({ backgroundColor: defaultColor }),\n );\n tr.removeStoredMark(textStyleType);\n return tr;\n },\n ),\n ];\n },\n\n addToolbarItems(): ToolbarItem[] {\n const defaultColor = this.options.defaultColor;\n\n if (this.options.colors.length === 0) {\n return [\n {\n type: 'button',\n name: 'highlight',\n command: 'toggleHighlight',\n isActive: { name: 'textStyle', attributes: { backgroundColor: defaultColor } },\n icon: 'highlighterCircle',\n label: 'Highlight',\n shortcut: 'Mod-Shift-H',\n group: 'format',\n priority: 150,\n },\n ];\n }\n\n return [\n {\n type: 'dropdown',\n name: 'highlight',\n icon: 'highlighterCircle',\n label: 'Highlight',\n group: 'format',\n priority: 150,\n layout: 'grid',\n gridColumns: this.options.columns,\n items: [\n {\n type: 'button' as const,\n name: 'unsetHighlight',\n command: 'unsetHighlight',\n icon: 'prohibit',\n label: 'No highlight',\n },\n ...this.options.colors.map((color, i) => ({\n type: 'button' as const,\n name: `highlight-${color}`,\n command: 'setHighlight',\n commandArgs: [{ color }],\n isActive: { name: 'textStyle', attributes: { backgroundColor: color } },\n icon: '',\n label: color,\n color,\n priority: 200 - i,\n })),\n ],\n },\n ];\n },\n});\n","/**\n * FontFamily Extension\n *\n * Adds font family styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, FontFamily } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * FontFamily.configure({\n * fontFamilies: ['Arial', 'Times New Roman', 'Courier New'],\n * }),\n * ],\n * });\n *\n * editor.commands.setFontFamily('Arial');\n * editor.commands.unsetFontFamily();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setFontFamily: CommandSpec<[fontFamily: string]>;\n unsetFontFamily: CommandSpec;\n }\n}\n\nexport interface FontFamilyOptions {\n /**\n * List of font families shown in the toolbar dropdown.\n * Any font family is accepted from pasted HTML regardless of this list.\n * @default ['Arial', 'Verdana', 'Tahoma', 'Trebuchet MS', 'Times New Roman', 'Georgia', 'Palatino Linotype', 'Courier New']\n */\n fontFamilies: string[];\n}\n\nexport const FontFamily = Extension.create<FontFamilyOptions>({\n name: 'fontFamily',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n fontFamilies: ['Arial', 'Verdana', 'Tahoma', 'Trebuchet MS', 'Times New Roman', 'Georgia', 'Palatino Linotype', 'Courier New'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n fontFamily: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.style.fontFamily.replace(/['\"]+/g, '') || null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const fontFamily = attributes['fontFamily'] as string | null;\n if (!fontFamily) return null;\n\n const value = fontFamily.includes(' ') ? `'${fontFamily}'` : fontFamily;\n return { style: `font-family: ${value}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontFamily:\n (fontFamily: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { fontFamily });\n },\n\n unsetFontFamily:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { fontFamily: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.fontFamilies.length === 0) return [];\n\n return [\n {\n type: 'dropdown',\n name: 'fontFamily',\n icon: 'textAa',\n label: 'Font Family',\n group: 'textStyle',\n priority: 150,\n displayMode: 'text',\n dynamicLabel: true,\n computedStyleProperty: 'font-family',\n items: this.options.fontFamilies.map((font, i) => ({\n type: 'button' as const,\n name: `fontFamily-${font}`,\n command: 'setFontFamily',\n commandArgs: [font],\n isActive: { name: 'textStyle', attributes: { fontFamily: font } },\n icon: 'textAa',\n label: font,\n style: `font-family: ${font.includes(' ') ? `'${font}'` : font}`,\n priority: 200 - i,\n })),\n },\n ];\n },\n});\n","/**\n * FontSize Extension\n *\n * Adds font size styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, FontSize } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * FontSize.configure({\n * fontSizes: ['12px', '14px', '16px', '18px', '24px', '32px'],\n * }),\n * ],\n * });\n *\n * editor.commands.setFontSize('16px');\n * editor.commands.unsetFontSize();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarButton, ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '../types/Commands.js' {\n interface RawCommands {\n setFontSize: CommandSpec<[fontSize: string]>;\n unsetFontSize: CommandSpec;\n }\n}\n\nexport interface FontSizeOptions {\n /**\n * List of font sizes shown in the toolbar dropdown.\n * Any font size is accepted from pasted HTML regardless of this list.\n * @default ['12px', '14px', '16px', '18px', '24px', '32px']\n */\n fontSizes: string[];\n\n /**\n * Show an unset/reset button at the end of the dropdown.\n * @default false\n */\n showReset: boolean;\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n name: 'fontSize',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n fontSizes: ['12px', '14px', '16px', '18px', '24px', '32px'],\n showReset: false,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.style.fontSize || null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const fontSize = attributes['fontSize'] as string | null;\n if (!fontSize) return null;\n\n return { style: `font-size: ${fontSize}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { fontSize });\n },\n\n unsetFontSize:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { fontSize: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.fontSizes.length === 0) return [];\n\n const sizes = this.options.fontSizes;\n\n const items: ToolbarButton[] = sizes.map((size, i) => ({\n type: 'button' as const,\n name: `fontSize-${size}`,\n command: 'setFontSize',\n commandArgs: [size],\n isActive: { name: 'textStyle', attributes: { fontSize: size } },\n icon: 'textSize',\n label: size,\n priority: 200 - i,\n }));\n\n if (this.options.showReset) {\n items.push({\n type: 'button' as const,\n name: 'unsetFontSize',\n command: 'unsetFontSize',\n icon: 'textSize',\n label: '–',\n priority: 0,\n });\n }\n\n return [\n {\n type: 'dropdown',\n name: 'fontSize',\n icon: 'textSize',\n label: 'Font Size',\n group: 'textStyle',\n priority: 100,\n displayMode: 'text',\n dynamicLabel: true,\n dynamicLabelFallback: '16px',\n computedStyleProperty: 'font-size',\n items,\n },\n ];\n },\n});\n","/**\n * ClearFormatting Extension\n *\n * Adds a toolbar button that removes all formatting marks from the current\n * selection. Marks with `isFormatting: false` (like Link) are preserved.\n *\n * Uses the built-in `unsetAllMarks` command.\n *\n * @example\n * ```ts\n * import { ClearFormatting } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * ClearFormatting,\n * ],\n * });\n *\n * editor.commands.unsetAllMarks(); // removes formatting marks from selection\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\nexport const ClearFormatting = Extension.create({\n name: 'clearFormatting',\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'clearFormatting',\n command: 'unsetAllMarks',\n icon: 'textTSlash',\n label: 'Clear Formatting',\n group: 'utilities',\n priority: 200,\n },\n ];\n },\n});\n","/**\n * LinkPopover Extension\n *\n * Provides a floating URL input popover for editing links.\n * This is a UI extension — it creates DOM elements and should only be used\n * when a visual link-editing UI is desired. In headless (core-only) setups\n * this extension can be omitted; users build their own link UI instead.\n *\n * Listens for the `linkEdit` editor event (emitted by Link's Mod-K shortcut\n * and the toolbar link button) to toggle the popover.\n *\n * Included in StarterKit by default. Disable with:\n * ```ts\n * StarterKit.configure({ linkPopover: false })\n * ```\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\nimport { isValidUrl } from '../helpers/isValidUrl.js';\nimport { getMarkRange } from '../helpers/getMarkRange.js';\nimport { defaultIcons } from '../icons/index.js';\nimport { positionFloating } from '../utils/positionFloating.js';\nimport type { Editor } from '../Editor.js';\n\nexport interface LinkPopoverOptions {\n /**\n * List of allowed URL protocols (should match Link mark's protocols)\n * @default ['http:', 'https:', 'mailto:', 'tel:']\n */\n protocols: string[];\n}\n\n// =============================================================================\n// Plugin implementation\n// =============================================================================\n\ninterface LinkPopoverPluginOptions {\n editor: Editor;\n markType: MarkType;\n protocols: string[];\n}\n\nconst linkPopoverPluginKey = new PluginKey('linkPopover');\n\nfunction linkPopoverPlugin({ editor, markType, protocols }: LinkPopoverPluginOptions): Plugin {\n // Build DOM elements\n const el = document.createElement('div');\n el.className = 'dm-link-popover';\n el.setAttribute('data-dm-editor-ui', '');\n el.style.display = 'none';\n\n const input = document.createElement('input');\n input.type = 'url';\n input.placeholder = 'Enter URL...';\n input.className = 'dm-link-popover-input';\n\n const applyBtn = document.createElement('button');\n applyBtn.type = 'button';\n applyBtn.className = 'dm-link-popover-btn dm-link-popover-apply';\n applyBtn.title = 'Apply link';\n applyBtn.innerHTML = defaultIcons['check'] ?? '';\n\n const removeBtn = document.createElement('button');\n removeBtn.type = 'button';\n removeBtn.className = 'dm-link-popover-btn dm-link-popover-remove';\n removeBtn.title = 'Remove link';\n removeBtn.innerHTML = defaultIcons['linkBreak'] ?? '';\n\n el.appendChild(input);\n el.appendChild(applyBtn);\n el.appendChild(removeBtn);\n\n let isOpen = false;\n let hasExistingLink = false;\n let cleanupFloating: (() => void) | null = null;\n let toggleAnchor: HTMLElement | null = null;\n\n /** Write isOpen state to the Link mark's storage for toolbar expanded state */\n const setLinkStorageOpen = (value: boolean): void => {\n const linkStorage = editor.storage['link'] as Record<string, unknown> | undefined;\n if (linkStorage) linkStorage['isOpen'] = value;\n };\n\n const show = (anchorElement?: HTMLElement): void => {\n toggleAnchor = anchorElement ?? null;\n // Detect existing link at cursor\n const { state } = editor.view;\n const { from, empty } = state.selection;\n let existingHref: string | null = null;\n\n if (empty) {\n const $pos = state.doc.resolve(from);\n const linkMark = $pos.marks().find((m: { type: { name: string } }) => m.type === markType);\n existingHref = linkMark ? (linkMark.attrs as Record<string, unknown>)['href'] as string : null;\n } else {\n // Check marks in selection\n const { to } = state.selection;\n state.doc.nodesBetween(from, to, (node) => {\n if (existingHref) return false;\n const linkMark = node.marks.find((m: { type: { name: string } }) => m.type === markType);\n if (linkMark) existingHref = (linkMark.attrs as Record<string, unknown>)['href'] as string;\n return true;\n });\n }\n\n hasExistingLink = existingHref !== null;\n input.value = existingHref ?? '';\n removeBtn.style.display = hasExistingLink ? '' : 'none';\n\n el.style.display = '';\n el.setAttribute('data-show', '');\n isOpen = true;\n setLinkStorageOpen(true);\n\n // Show a visual decoration on the selected range while the popover is\n // open. The browser removes native selection highlight when the input\n // takes focus, so we render our own via ProseMirror DecorationSet.\n // Dispatch AFTER setting storage['isOpen'] so the toolbar transaction\n // handler sees the updated value.\n if (!empty) {\n const { to } = state.selection;\n editor.view.dispatch(state.tr.setMeta(linkPopoverPluginKey, { from, to }));\n } else {\n // No decoration needed but still trigger toolbar active-state refresh\n editor.view.dispatch(editor.view.state.tr);\n }\n\n // Position below the anchor element (toolbar/bubble-menu button) or cursor\n const reference: Element | { getBoundingClientRect: () => DOMRect } = anchorElement ?? {\n getBoundingClientRect: () => {\n const coords = editor.view.coordsAtPos(from);\n return new DOMRect(coords.left, coords.top, 0, coords.bottom - coords.top);\n },\n };\n\n cleanupFloating?.();\n cleanupFloating = positionFloating(reference, el, {\n placement: 'bottom',\n offsetValue: 4,\n });\n\n input.focus();\n input.select();\n };\n\n const hide = (): void => {\n if (!isOpen) return;\n toggleAnchor = null;\n cleanupFloating?.();\n cleanupFloating = null;\n el.removeAttribute('data-show');\n el.style.display = 'none';\n isOpen = false;\n setLinkStorageOpen(false);\n // Clear pending-link decoration — dispatch AFTER setting storage['isOpen']\n // so the toolbar transaction handler sees the updated value.\n editor.view.dispatch(editor.view.state.tr.setMeta(linkPopoverPluginKey, null));\n input.value = '';\n };\n\n const applyLink = (): void => {\n let href = input.value.trim();\n if (!href) {\n hide();\n editor.view.focus();\n return;\n }\n\n // Auto-prepend https:// if no protocol\n if (!/^[a-z][a-z0-9+.-]*:/i.test(href)) {\n href = 'https://' + href;\n }\n\n if (!isValidUrl(href, { protocols })) {\n hide();\n editor.view.focus();\n return;\n }\n\n // If cursor is on existing link with no selection, select the full link range\n // and apply the mark in a single transaction to avoid visual flash\n const { state } = editor.view;\n const { from, empty } = state.selection;\n\n if (empty && hasExistingLink) {\n const $pos = state.doc.resolve(from);\n const range = getMarkRange($pos, markType);\n if (range) {\n const tr = state.tr\n .setSelection(TextSelection.create(state.doc, range.from, range.to))\n .addMark(range.from, range.to, markType.create({ href }));\n editor.view.dispatch(tr);\n hide();\n editor.view.focus();\n return;\n }\n }\n\n editor.commands.setLink({ href });\n hide();\n editor.view.focus();\n };\n\n const removeLink = (): void => {\n editor.commands.unsetLink();\n hide();\n editor.view.focus();\n };\n\n // Event handlers\n const onLinkEdit = (data: { anchorElement?: HTMLElement }): void => {\n if (isOpen) {\n hide();\n editor.view.focus();\n } else {\n show(data.anchorElement);\n }\n };\n\n const onInputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n applyLink();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n hide();\n editor.view.focus();\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (e.shiftKey) {\n (hasExistingLink ? removeBtn : applyBtn).focus();\n } else {\n applyBtn.focus();\n }\n }\n };\n\n const onButtonKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.preventDefault();\n hide();\n editor.view.focus();\n } else if (e.key === 'Tab') {\n e.preventDefault();\n const target = e.target as HTMLElement;\n if (e.shiftKey) {\n if (target === applyBtn) {\n input.focus();\n } else {\n applyBtn.focus();\n }\n } else {\n if (target === applyBtn && hasExistingLink) {\n removeBtn.focus();\n } else {\n input.focus();\n }\n }\n } else if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLElement).click();\n }\n };\n\n const onClickOutside = (e: MouseEvent): void => {\n if (!isOpen || el.contains(e.target as Node)) return;\n // Skip if clicking the toolbar button that toggles this popover —\n // the button's click handler will fire onLinkEdit to toggle.\n if (toggleAnchor && (toggleAnchor === e.target || toggleAnchor.contains(e.target as Node))) return;\n hide();\n };\n\n const onPreventBlur = (e: MouseEvent): void => {\n e.preventDefault();\n };\n\n return new Plugin({\n key: linkPopoverPluginKey,\n\n state: {\n init() {\n return DecorationSet.empty;\n },\n apply(tr, decorations) {\n const meta = tr.getMeta(linkPopoverPluginKey) as { from: number; to: number } | null | undefined;\n if (meta === null) return DecorationSet.empty;\n if (meta) {\n return DecorationSet.create(tr.doc, [\n Decoration.inline(meta.from, meta.to, { class: 'dm-link-pending' }),\n ]);\n }\n return decorations.map(tr.mapping, tr.doc);\n },\n },\n\n props: {\n decorations(state) {\n return linkPopoverPluginKey.getState(state) as DecorationSet;\n },\n },\n\n view: () => {\n // Append to document.body so it's not clipped by .dm-editor overflow:hidden\n document.body.appendChild(el);\n\n // Register all event listeners here — ProseMirror calls destroy()/view()\n // on plugin view rebuilds, so listeners must be re-attached each time.\n input.addEventListener('keydown', onInputKeydown);\n applyBtn.addEventListener('mousedown', onPreventBlur);\n applyBtn.addEventListener('click', applyLink);\n applyBtn.addEventListener('keydown', onButtonKeydown);\n removeBtn.addEventListener('mousedown', onPreventBlur);\n removeBtn.addEventListener('click', removeLink);\n removeBtn.addEventListener('keydown', onButtonKeydown);\n document.addEventListener('mousedown', onClickOutside);\n editor.on('linkEdit', onLinkEdit);\n\n return {\n destroy: () => {\n hide();\n input.removeEventListener('keydown', onInputKeydown);\n applyBtn.removeEventListener('mousedown', onPreventBlur);\n applyBtn.removeEventListener('click', applyLink);\n applyBtn.removeEventListener('keydown', onButtonKeydown);\n removeBtn.removeEventListener('mousedown', onPreventBlur);\n removeBtn.removeEventListener('click', removeLink);\n removeBtn.removeEventListener('keydown', onButtonKeydown);\n document.removeEventListener('mousedown', onClickOutside);\n editor.off('linkEdit', onLinkEdit);\n el.remove();\n },\n };\n },\n });\n}\n\n// =============================================================================\n// Extension\n// =============================================================================\n\nexport const LinkPopover = Extension.create<LinkPopoverOptions>({\n name: 'linkPopover',\n\n dependencies: ['link'],\n\n addOptions() {\n return {\n protocols: ['http:', 'https:', 'mailto:', 'tel:'],\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor as unknown as Editor;\n const markType = editor.schema.marks['link'];\n if (!markType) return [];\n\n return [\n linkPopoverPlugin({\n editor,\n markType,\n protocols: this.options.protocols,\n }),\n ];\n },\n});\n","/**\n * BubbleMenu Extension\n *\n * Shows a floating menu when text is selected in the editor.\n * Useful for formatting toolbars that appear contextually.\n *\n * Styles are included automatically via `@domternal/theme` (`_bubble-menu.scss`).\n *\n * @example\n * ```ts\n * import { BubbleMenu } from '@domternal/core';\n *\n * // Create menu element\n * const menuElement = document.getElementById('bubble-menu');\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * BubbleMenu.configure({\n * element: menuElement,\n * shouldShow: ({ editor, state, from, to }) => {\n * // Only show for text selections\n * return !state.selection.empty;\n * },\n * }),\n * ],\n * });\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { Editor } from '../Editor.js';\nimport { positionFloatingOnce } from '../utils/positionFloating.js';\n\nexport const bubbleMenuPluginKey = new PluginKey('bubbleMenu');\n\n// Default shouldShow: text selection with actual content in an editable editor\nfunction defaultShouldShow({\n editor,\n state,\n from,\n to,\n}: {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n}): boolean {\n const { selection } = state;\n\n // Must have a non-empty selection\n if (selection.empty) return false;\n\n // Must be a text selection (not NodeSelection for images/HR)\n if (!(selection instanceof TextSelection)) return false;\n\n // Must have actual text content (double-click empty paragraph produces from!=to but no text)\n if (!state.doc.textBetween(from, to).length) return false;\n\n // Don't show if editor is not editable\n if (!editor.isEditable) return false;\n\n // Don't show inside table cells — the cell toolbar handles table formatting.\n // Extensions can opt-in via a custom shouldShow if needed.\n const $from = state.doc.resolve(from);\n for (let d = $from.depth; d > 0; d--) {\n const name = $from.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return false;\n }\n\n return true;\n}\n\nexport interface BubbleMenuOptions {\n /**\n * The HTML element that contains the menu.\n * Must be provided by the user.\n */\n element: HTMLElement | null;\n\n /**\n * Duration in ms to wait before showing the menu.\n * @default 0\n */\n updateDelay: number;\n\n /**\n * Function to determine if the menu should be shown.\n * By default, shows for text selections with actual content in an editable editor.\n */\n shouldShow: (props: {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n }) => boolean;\n\n /**\n * Placement of the menu relative to the selection.\n * @default 'top'\n */\n placement: 'top' | 'bottom';\n\n /**\n * Offset in pixels from the selection.\n * @default 8\n */\n offset: number;\n}\n\ninterface BubbleMenuPluginState {\n visible: boolean;\n from: number;\n to: number;\n}\n\nexport interface CreateBubbleMenuPluginOptions {\n pluginKey: PluginKey;\n editor: Editor;\n element: HTMLElement;\n shouldShow?: BubbleMenuOptions['shouldShow'];\n placement?: 'top' | 'bottom';\n offset?: number;\n updateDelay?: number;\n}\n\n/**\n * Creates a standalone BubbleMenu ProseMirror plugin.\n * Can be used by framework wrappers (Angular, React, Vue) to create the plugin\n * independently of the extension system.\n */\nexport function createBubbleMenuPlugin(options: CreateBubbleMenuPluginOptions): Plugin {\n const {\n pluginKey,\n editor,\n element,\n shouldShow = defaultShouldShow,\n placement = 'top',\n offset = 8,\n updateDelay = 0,\n } = options;\n\n let updateTimeout: ReturnType<typeof setTimeout> | null = null;\n let focusTimeout: ReturnType<typeof setTimeout> | null = null;\n let mouseupTimeout: ReturnType<typeof setTimeout> | null = null;\n let cleanupFloating: (() => void) | null = null;\n\n const updatePosition = (view: EditorView, from: number, to: number): void => {\n cleanupFloating?.();\n\n // For NodeSelection (images, HRs, etc.), use the actual DOM element\n // for precise alignment. coordsAtPos gives paragraph-wide coords\n // which misaligns the menu for small centered nodes.\n const sel = view.state.selection;\n let reference: Element | { getBoundingClientRect: () => DOMRect } | null = null;\n if ('node' in sel) {\n const dom = view.nodeDOM(from);\n if (dom instanceof HTMLElement) reference = dom;\n }\n reference ??= {\n getBoundingClientRect: () => {\n const start = view.coordsAtPos(from);\n const end = view.coordsAtPos(to);\n return new DOMRect(\n start.left,\n start.top,\n end.right - start.left,\n end.bottom - start.top,\n );\n },\n };\n\n cleanupFloating = positionFloatingOnce(reference, element, {\n placement,\n offsetValue: offset,\n });\n\n element.setAttribute('data-show', '');\n };\n\n const hideMenu = (): void => {\n cleanupFloating?.();\n cleanupFloating = null;\n element.removeAttribute('data-show');\n };\n\n // When the user clicks outside the bubble menu and outside the editor\n // (e.g. on the toolbar), suppress the menu until the selection changes.\n let suppressed = false;\n\n // Suppress bubble menu during active mouse drag inside the editor.\n // Without this, the bubble menu appears mid-drag, and its DOM element\n // blocks prosemirror-tables' posAtCoords() from resolving the cell\n // under the cursor — preventing TextSelection → CellSelection conversion.\n let mouseDown = false;\n\n const onDocumentMousedown = (e: MouseEvent): void => {\n const target = e.target as Node | null;\n if (!target) return;\n // Click inside bubble menu — ignore (handled by onMenuMousedown)\n if (element.contains(target)) return;\n // Click inside editor — let ProseMirror handle selection change\n if (editor.view.dom.contains(target)) return;\n // Outside both — hide and suppress until selection changes\n hideMenu();\n suppressed = true;\n };\n\n // Prevent blur when clicking inside the bubble menu\n const onMenuMousedown = (e: Event): void => {\n e.preventDefault();\n };\n\n // Initially hide\n hideMenu();\n\n return new Plugin({\n key: pluginKey,\n\n state: {\n init: (): BubbleMenuPluginState => ({\n visible: false,\n from: 0,\n to: 0,\n }),\n apply: (_tr, prevValue, _oldState, newState): BubbleMenuPluginState => {\n const { selection } = newState;\n const { from, to } = selection;\n\n // Reset suppression when the selection range changes\n if (from !== prevValue.from || to !== prevValue.to) {\n suppressed = false;\n }\n\n // Determine visibility\n const visible =\n !suppressed &&\n !selection.empty &&\n shouldShow({\n editor,\n view: editor.view,\n state: newState,\n from,\n to,\n });\n\n return { visible, from, to };\n },\n },\n\n view: (editorView) => {\n // Move element inside .dm-editor (position:relative) so it uses\n // position:absolute — CSS compositor handles scroll, zero jitter.\n const editorEl = editorView.dom.closest('.dm-editor');\n if (editorEl && element.parentElement !== editorEl) {\n editorEl.appendChild(element);\n }\n\n // Track mouse drag to suppress bubble menu during active drag.\n const onEditorMousedown = (e: MouseEvent): void => {\n if (e.button !== 0) return; // only primary button\n mouseDown = true;\n hideMenu();\n };\n const onDocumentMouseup = (): void => {\n if (!mouseDown) return;\n mouseDown = false;\n // Defer to let ProseMirror finalize selection changes from the mouseup\n mouseupTimeout = setTimeout(() => {\n if (mouseDown) return; // new drag started\n const currentState = pluginKey.getState(editor.view.state) as\n | BubbleMenuPluginState\n | undefined;\n if (currentState?.visible) {\n updatePosition(editor.view, currentState.from, currentState.to);\n }\n });\n };\n\n const onFocus = (): void => {\n // Re-evaluate after focus (selection may have settled).\n // Must re-check shouldShow with current state — plugin state may be stale\n // if blur/focus happened without a transaction (e.g. cell handle click,\n // browser extension, or external focus change).\n focusTimeout = setTimeout(() => {\n if (suppressed) {\n hideMenu();\n return;\n }\n if (mouseDown) return; // don't show during drag\n const { selection } = editor.view.state;\n const { from, to } = selection;\n const show =\n !selection.empty &&\n shouldShow({\n editor,\n view: editor.view,\n state: editor.view.state,\n from,\n to,\n });\n if (show) {\n updatePosition(editor.view, from, to);\n } else {\n hideMenu();\n }\n });\n };\n\n const onBlur = ({ event }: { event: FocusEvent }): void => {\n // Don't hide if focus moved to the bubble menu itself\n if (\n event.relatedTarget &&\n element.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n hideMenu();\n };\n\n // Dismiss when another overlay opens (e.g. table dropdown)\n const onDismissOverlays = (): void => {\n hideMenu();\n suppressed = true;\n };\n\n element.addEventListener('mousedown', onMenuMousedown, { capture: true });\n document.addEventListener('mousedown', onDocumentMousedown);\n editorView.dom.addEventListener('mousedown', onEditorMousedown);\n document.addEventListener('mouseup', onDocumentMouseup);\n editorEl?.addEventListener('dm:dismiss-overlays', onDismissOverlays);\n editor.on('focus', onFocus);\n editor.on('blur', onBlur);\n\n return {\n update: (view, prevState) => {\n // Skip during IME composition\n if (view.composing) return;\n\n const state = pluginKey.getState(view.state) as\n | BubbleMenuPluginState\n | undefined;\n const prevPluginState = pluginKey.getState(prevState) as\n | BubbleMenuPluginState\n | undefined;\n\n // Skip if nothing changed — but reposition when the doc changed\n // while the menu is visible (e.g. image float attribute changed,\n // the DOM element moved but the selection stayed at the same pos)\n if (\n state?.visible === prevPluginState?.visible &&\n state?.from === prevPluginState?.from &&\n state?.to === prevPluginState?.to &&\n !(state?.visible && view.state.doc !== prevState.doc)\n ) {\n // Safety: ensure DOM matches state (onFocus setTimeout can race)\n if (!state?.visible && element.hasAttribute('data-show')) {\n hideMenu();\n }\n return;\n }\n\n // Clear pending update\n if (updateTimeout) {\n clearTimeout(updateTimeout);\n updateTimeout = null;\n }\n\n if (state?.visible && !mouseDown) {\n // Show menu with delay\n if (updateDelay > 0) {\n updateTimeout = setTimeout(() => {\n updatePosition(view, state.from, state.to);\n }, updateDelay);\n } else {\n updatePosition(view, state.from, state.to);\n }\n } else {\n hideMenu();\n }\n },\n\n destroy: () => {\n editor.off('focus', onFocus);\n editor.off('blur', onBlur);\n element.removeEventListener('mousedown', onMenuMousedown, {\n capture: true,\n });\n document.removeEventListener('mousedown', onDocumentMousedown);\n editorView.dom.removeEventListener('mousedown', onEditorMousedown);\n document.removeEventListener('mouseup', onDocumentMouseup);\n editorEl?.removeEventListener('dm:dismiss-overlays', onDismissOverlays);\n if (updateTimeout) {\n clearTimeout(updateTimeout);\n }\n if (focusTimeout) {\n clearTimeout(focusTimeout);\n }\n if (mouseupTimeout) {\n clearTimeout(mouseupTimeout);\n }\n hideMenu();\n },\n };\n },\n });\n}\n\nexport const BubbleMenu = Extension.create<BubbleMenuOptions>({\n name: 'bubbleMenu',\n\n addOptions() {\n return {\n element: null,\n updateDelay: 0,\n shouldShow: defaultShouldShow,\n placement: 'top' as const,\n offset: 8,\n };\n },\n\n addProseMirrorPlugins() {\n const { element, updateDelay, shouldShow, placement, offset } =\n this.options;\n\n if (!element) {\n return [];\n }\n\n const editor = this.editor as Editor | null;\n if (!editor) {\n return [];\n }\n\n return [\n createBubbleMenuPlugin({\n pluginKey: bubbleMenuPluginKey,\n editor,\n element,\n shouldShow,\n placement,\n offset,\n updateDelay,\n }),\n ];\n },\n});\n","/**\n * FloatingMenu Extension\n *\n * Shows a floating menu when the cursor is in an empty paragraph.\n * Useful for showing block-level insertion options.\n *\n * @example\n * ```ts\n * import { FloatingMenu } from '@domternal/core';\n *\n * // Create menu element\n * const menuElement = document.getElementById('floating-menu');\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * FloatingMenu.configure({\n * element: menuElement,\n * shouldShow: ({ editor, state }) => {\n * const { $from, empty } = state.selection;\n * // Show in empty paragraphs\n * return empty &&\n * $from.parent.type.name === 'paragraph' &&\n * $from.parent.content.size === 0;\n * },\n * }),\n * ],\n * });\n * ```\n *\n * Styles are included automatically via `@domternal/theme` (`_floating-menu.scss`).\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { Editor } from '../Editor.js';\nimport { positionFloatingOnce } from '../utils/positionFloating.js';\n\nexport const floatingMenuPluginKey = new PluginKey('floatingMenu');\n\n// Default shouldShow: empty paragraph with cursor in editable editor\nfunction defaultShouldShow({\n editor,\n state,\n}: {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n}): boolean {\n // Don't show if editor is not editable\n if (!editor.isEditable) return false;\n\n const { selection } = state;\n const { $from, empty } = selection;\n\n // Must be empty selection\n if (!empty) return false;\n\n // Must be in a paragraph\n if ($from.parent.type.name !== 'paragraph') return false;\n\n // Paragraph must be empty\n if ($from.parent.content.size !== 0) return false;\n\n // Must be at the start of the paragraph\n if ($from.parentOffset !== 0) return false;\n\n return true;\n}\n\nexport interface FloatingMenuOptions {\n /**\n * The HTML element that contains the menu.\n * Must be provided by the user.\n */\n element: HTMLElement | null;\n\n /**\n * Function to determine if the menu should be shown.\n * By default, shows when the cursor is in an empty paragraph.\n */\n shouldShow: (props: {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n }) => boolean;\n\n /**\n * Offset in pixels from the cursor position.\n * @default 0\n */\n offset: number;\n}\n\nexport interface CreateFloatingMenuPluginOptions {\n pluginKey: PluginKey;\n editor: Editor;\n element: HTMLElement;\n shouldShow?: FloatingMenuOptions['shouldShow'];\n offset?: number;\n}\n\n/**\n * Creates a standalone FloatingMenu ProseMirror plugin.\n * Can be used by framework wrappers (Angular, React, Vue) to create the plugin\n * independently of the extension system.\n */\nexport function createFloatingMenuPlugin(options: CreateFloatingMenuPluginOptions): Plugin {\n const {\n pluginKey,\n editor,\n element,\n shouldShow = defaultShouldShow,\n offset = 0,\n } = options;\n\n let cleanupFloating: (() => void) | null = null;\n\n const updatePosition = (view: EditorView): void => {\n const { selection } = view.state;\n const { $from } = selection;\n\n const depth = $from.depth;\n const startPos = $from.start(depth);\n const domNode = view.nodeDOM(startPos - 1);\n\n if (domNode instanceof HTMLElement) {\n cleanupFloating?.();\n cleanupFloating = positionFloatingOnce(domNode, element, {\n placement: 'bottom-start',\n offsetValue: offset,\n });\n element.setAttribute('data-show', '');\n }\n };\n\n const hideMenu = (): void => {\n cleanupFloating?.();\n cleanupFloating = null;\n element.removeAttribute('data-show');\n };\n\n // Initially hide\n hideMenu();\n\n return new Plugin({\n key: pluginKey,\n\n view: (editorView) => {\n // Move element inside .dm-editor (position:relative) so it uses\n // position:absolute — CSS compositor handles scroll, zero jitter.\n const editorEl = editorView.dom.closest('.dm-editor');\n if (editorEl && element.parentElement !== editorEl) {\n editorEl.appendChild(element);\n }\n\n const onFocus = (): void => {\n const visible = shouldShow({\n editor,\n view: editor.view,\n state: editor.view.state,\n });\n if (visible) {\n updatePosition(editor.view);\n } else {\n hideMenu();\n }\n };\n\n const onBlur = ({ event }: { event: FocusEvent }): void => {\n if (event.relatedTarget && element.contains(event.relatedTarget as Node)) {\n return;\n }\n hideMenu();\n };\n\n editor.on('focus', onFocus);\n editor.on('blur', onBlur);\n\n return {\n update: (view) => {\n const visible = shouldShow({\n editor,\n view,\n state: view.state,\n });\n\n if (visible) {\n updatePosition(view);\n } else {\n hideMenu();\n }\n },\n\n destroy: () => {\n hideMenu();\n editor.off('focus', onFocus);\n editor.off('blur', onBlur);\n },\n };\n },\n });\n}\n\nexport const FloatingMenu = Extension.create<FloatingMenuOptions>({\n name: 'floatingMenu',\n\n addOptions() {\n return {\n element: null,\n shouldShow: defaultShouldShow,\n offset: 0,\n };\n },\n\n addProseMirrorPlugins() {\n const { element, shouldShow, offset } = this.options;\n\n if (!element) {\n return [];\n }\n\n const editor = this.editor as Editor | null;\n if (!editor) {\n return [];\n }\n\n return [\n createFloatingMenuPlugin({\n pluginKey: floatingMenuPluginKey,\n editor,\n element,\n shouldShow,\n offset,\n }),\n ];\n },\n});\n","/**\n * StarterKit Extension\n *\n * A convenient bundle of commonly-used extensions for quick setup.\n * All included extensions can be configured or disabled individually.\n */\nimport { Extension } from '../Extension.js';\nimport type { AnyExtensionConfig } from '../types/index.js';\n\n// Nodes\nimport { Document } from '../nodes/Document.js';\nimport { Text } from '../nodes/Text.js';\nimport { Paragraph, type ParagraphOptions } from '../nodes/Paragraph.js';\nimport { Heading, type HeadingOptions } from '../nodes/Heading.js';\nimport { Blockquote, type BlockquoteOptions } from '../nodes/Blockquote.js';\nimport { CodeBlock, type CodeBlockOptions } from '../nodes/CodeBlock.js';\nimport { BulletList, type BulletListOptions } from '../nodes/BulletList.js';\nimport { OrderedList, type OrderedListOptions } from '../nodes/OrderedList.js';\nimport { ListItem, type ListItemOptions } from '../nodes/ListItem.js';\nimport {\n HorizontalRule,\n type HorizontalRuleOptions,\n} from '../nodes/HorizontalRule.js';\nimport { HardBreak, type HardBreakOptions } from '../nodes/HardBreak.js';\nimport { TaskList, type TaskListOptions } from '../nodes/TaskList.js';\nimport { TaskItem, type TaskItemOptions } from '../nodes/TaskItem.js';\n\n// Marks\nimport { Bold, type BoldOptions } from '../marks/Bold.js';\nimport { Italic, type ItalicOptions } from '../marks/Italic.js';\nimport { Underline, type UnderlineOptions } from '../marks/Underline.js';\nimport { Strike, type StrikeOptions } from '../marks/Strike.js';\nimport { Code, type CodeOptions } from '../marks/Code.js';\nimport { Link, type LinkOptions } from '../marks/Link.js';\n\n// Functionality\nimport { BaseKeymap, type BaseKeymapOptions } from './BaseKeymap.js';\nimport { History, type HistoryOptions } from './History.js';\nimport { Dropcursor, type DropcursorOptions } from './Dropcursor.js';\nimport { Gapcursor } from './Gapcursor.js';\nimport { TrailingNode, type TrailingNodeOptions } from './TrailingNode.js';\nimport { ListKeymap, type ListKeymapOptions } from './ListKeymap.js';\nimport { LinkPopover, type LinkPopoverOptions } from './LinkPopover.js';\n\nexport interface StarterKitOptions {\n // Nodes\n /**\n * Set to false to disable the Document node.\n */\n document?: false;\n /**\n * Set to false to disable the Text node.\n */\n text?: false;\n /**\n * Set to false to disable the Paragraph node, or pass options to configure it.\n */\n paragraph?: false | Partial<ParagraphOptions>;\n /**\n * Set to false to disable the Heading node, or pass options to configure it.\n */\n heading?: false | Partial<HeadingOptions>;\n /**\n * Set to false to disable the Blockquote node, or pass options to configure it.\n */\n blockquote?: false | Partial<BlockquoteOptions>;\n /**\n * Set to false to disable the CodeBlock node, or pass options to configure it.\n */\n codeBlock?: false | Partial<CodeBlockOptions>;\n /**\n * Set to false to disable the BulletList node, or pass options to configure it.\n */\n bulletList?: false | Partial<BulletListOptions>;\n /**\n * Set to false to disable the OrderedList node, or pass options to configure it.\n */\n orderedList?: false | Partial<OrderedListOptions>;\n /**\n * Set to false to disable the ListItem node, or pass options to configure it.\n */\n listItem?: false | Partial<ListItemOptions>;\n /**\n * Set to false to disable the HorizontalRule node, or pass options to configure it.\n */\n horizontalRule?: false | Partial<HorizontalRuleOptions>;\n /**\n * Set to false to disable the HardBreak node, or pass options to configure it.\n */\n hardBreak?: false | Partial<HardBreakOptions>;\n /**\n * Set to false to disable the TaskList node, or pass options to configure it.\n */\n taskList?: false | Partial<TaskListOptions>;\n /**\n * Set to false to disable the TaskItem node, or pass options to configure it.\n */\n taskItem?: false | Partial<TaskItemOptions>;\n\n // Marks\n /**\n * Set to false to disable the Bold mark, or pass options to configure it.\n */\n bold?: false | Partial<BoldOptions>;\n /**\n * Set to false to disable the Italic mark, or pass options to configure it.\n */\n italic?: false | Partial<ItalicOptions>;\n /**\n * Set to false to disable the Underline mark, or pass options to configure it.\n */\n underline?: false | Partial<UnderlineOptions>;\n /**\n * Set to false to disable the Strike mark, or pass options to configure it.\n */\n strike?: false | Partial<StrikeOptions>;\n /**\n * Set to false to disable the Code mark, or pass options to configure it.\n */\n code?: false | Partial<CodeOptions>;\n /**\n * Set to false to disable the Link mark, or pass options to configure it.\n */\n link?: false | Partial<LinkOptions>;\n\n // Functionality\n /**\n * Set to false to disable the BaseKeymap extension, or pass options to configure it.\n */\n baseKeymap?: false | Partial<BaseKeymapOptions>;\n /**\n * Set to false to disable the History extension, or pass options to configure it.\n */\n history?: false | Partial<HistoryOptions>;\n /**\n * Set to false to disable the Dropcursor extension, or pass options to configure it.\n */\n dropcursor?: false | Partial<DropcursorOptions>;\n /**\n * Set to false to disable the Gapcursor extension.\n */\n gapcursor?: false;\n /**\n * Set to false to disable the TrailingNode extension, or pass options to configure it.\n */\n trailingNode?: false | Partial<TrailingNodeOptions>;\n /**\n * Set to false to disable the ListKeymap extension, or pass options to configure it.\n */\n listKeymap?: false | Partial<ListKeymapOptions>;\n /**\n * Set to false to disable the LinkPopover extension, or pass options to configure it.\n */\n linkPopover?: false | Partial<LinkPopoverOptions>;\n}\n\nexport const StarterKit = Extension.create<StarterKitOptions>({\n name: 'starterKit',\n\n addOptions() {\n return {};\n },\n\n addExtensions() {\n const extensions: AnyExtensionConfig[] = [];\n\n // Helper to conditionally add extension\n const maybeAdd = <T extends object>(\n ext: { configure: (opts: Partial<T>) => AnyExtensionConfig } & AnyExtensionConfig,\n opts: false | Partial<T> | undefined\n ): void => {\n if (opts === false) return;\n if (opts && Object.keys(opts).length > 0) {\n extensions.push(ext.configure(opts));\n } else {\n extensions.push(ext);\n }\n };\n\n // Nodes\n maybeAdd(Document as never, this.options.document as never);\n maybeAdd(Text as never, this.options.text as never);\n maybeAdd(Paragraph, this.options.paragraph);\n maybeAdd(Heading, this.options.heading);\n maybeAdd(Blockquote, this.options.blockquote);\n maybeAdd(CodeBlock, this.options.codeBlock);\n maybeAdd(BulletList, this.options.bulletList);\n maybeAdd(OrderedList, this.options.orderedList);\n maybeAdd(ListItem, this.options.listItem);\n maybeAdd(HorizontalRule, this.options.horizontalRule);\n maybeAdd(HardBreak, this.options.hardBreak);\n maybeAdd(TaskList, this.options.taskList);\n maybeAdd(TaskItem, this.options.taskItem);\n\n // Marks\n maybeAdd(Bold, this.options.bold);\n maybeAdd(Italic, this.options.italic);\n maybeAdd(Underline, this.options.underline);\n maybeAdd(Strike, this.options.strike);\n maybeAdd(Code, this.options.code);\n maybeAdd(Link, this.options.link);\n\n // Functionality\n maybeAdd(BaseKeymap, this.options.baseKeymap);\n maybeAdd(History, this.options.history);\n maybeAdd(Dropcursor, this.options.dropcursor);\n maybeAdd(Gapcursor as never, this.options.gapcursor as never);\n maybeAdd(TrailingNode, this.options.trailingNode);\n maybeAdd(ListKeymap, this.options.listKeymap);\n maybeAdd(LinkPopover, this.options.linkPopover);\n\n return extensions;\n },\n});\n","/**\n * @domternal/core\n * Framework-agnostic ProseMirror editor engine\n */\n\nexport const VERSION = '0.1.0';\n\n// === Type exports ===\nexport type {\n // Content types\n JSONAttribute,\n JSONMark,\n JSONContent,\n Content,\n Range,\n // Editor options\n AnyExtension,\n FocusPosition,\n EditorOptions,\n // Editor events\n EditorInstance,\n TransactionEventProps,\n FocusEventProps,\n CreateEventProps,\n ContentErrorProps,\n PasteEventProps,\n DropEventProps,\n MountEventProps,\n DeleteEventProps,\n EditorEvents,\n EditorEventName,\n // Command types\n CommandEditor,\n CommandProps,\n Command,\n CommandSpec,\n CommandMap,\n RawCommands,\n SingleCommands,\n ChainedCommands,\n ChainFailure,\n CanCommands,\n CanChainedCommands,\n KeyboardShortcutCommand,\n // Extension config types\n ExtensionEditor,\n AnyExtensionConfig,\n GlobalAttributeSpec,\n GlobalAttributes,\n ExtensionConfig,\n // Attribute types\n AttributeSpec,\n AttributeSpecs,\n // Node config types\n NodeParseRule,\n NodeRenderHTMLProps,\n NodeConfig,\n // Mark config types\n MarkParseRule,\n MarkRenderHTMLProps,\n MarkConfig,\n // Toolbar types\n IconSet,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarSeparator,\n ToolbarItem,\n ToolbarLayoutDropdown,\n ToolbarLayoutEntry,\n} from './types/index.js';\n\n// === ProseMirror re-exports (for framework wrappers) ===\nexport { PluginKey } from '@domternal/pm/state';\n\n// === Core classes ===\nexport { EventEmitter } from './EventEmitter.js';\nexport { Editor } from './Editor.js';\nexport {\n ExtensionManager,\n type ExtensionManagerOptions,\n type ExtensionManagerEditor,\n} from './ExtensionManager.js';\nexport {\n CommandManager,\n type SetContentOptions,\n type ClearContentOptions,\n type CommandManagerEditor,\n} from './CommandManager.js';\n\n// === Floating UI ===\nexport {\n positionFloating,\n positionFloatingOnce,\n type PositionFloatingOptions,\n} from './utils/positionFloating.js';\n\n// === Inline Styles ===\nexport {\n inlineStyles,\n applyInlineStyles,\n type InlineStyleOverrides,\n} from './utils/inlineStyles.js';\n\n// === Helpers ===\nexport {\n createDocument,\n isNodeEmpty,\n isDocumentEmpty,\n callOrReturn,\n markInputRule,\n markInputRulePatterns,\n isValidUrl,\n generateHTML,\n generateJSON,\n generateText,\n type CreateDocumentOptions,\n type IsNodeEmptyOptions,\n type MarkInputRuleOptions,\n type IsValidUrlOptions,\n type GenerateHTMLOptions,\n type GenerateJSONOptions,\n type GenerateTextOptions,\n getMarkRange,\n type MarkRange,\n findParentNode,\n type FindParentNodeResult,\n findChildren,\n type FindChildResult,\n defaultBlockAt,\n} from './helpers/index.js';\n\n// === Extension System ===\nexport { Extension } from './Extension.js';\nexport { Node } from './Node.js';\n\n// === Toolbar ===\nexport {\n ToolbarController,\n type ToolbarControllerEditor,\n type ToolbarGroup,\n} from './ToolbarController.js';\n\n// === Icons ===\nexport { defaultIcons } from './icons/index.js';\n\nexport { Mark } from './Mark.js';\n\n// === Command System ===\nexport {\n ChainBuilder,\n createChainBuilder,\n type ChainBuilderEditor,\n type ChainBuilderOptions,\n} from './ChainBuilder.js';\nexport {\n CanChecker,\n createCanChecker,\n type CanCheckerEditor,\n type CanCheckerOptions,\n} from './CanChecker.js';\nexport {\n buildCommandProps,\n createAccumulatingDispatch,\n type CommandPropsEditor,\n type BuildCommandPropsOptions,\n} from './commandPropsBuilder.js';\nexport {\n builtInCommands,\n // Basic commands\n focus,\n blur,\n setContent,\n clearContent,\n insertText,\n deleteSelection,\n selectAll,\n // Mark commands\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n // Block commands\n setBlockType,\n toggleBlockType,\n // Wrap commands\n wrapIn,\n toggleWrap,\n lift,\n // List commands\n toggleList,\n // Insert commands\n insertContent,\n // Selection commands\n selectNodeBackward,\n // Attribute commands\n updateAttributes,\n resetAttributes,\n} from './commands/index.js';\n\n// === Nodes ===\nexport {\n Document,\n Text,\n Paragraph,\n type ParagraphOptions,\n Heading,\n type HeadingOptions,\n Blockquote,\n type BlockquoteOptions,\n CodeBlock,\n type CodeBlockOptions,\n BulletList,\n type BulletListOptions,\n OrderedList,\n type OrderedListOptions,\n ListItem,\n type ListItemOptions,\n HorizontalRule,\n type HorizontalRuleOptions,\n HardBreak,\n type HardBreakOptions,\n TaskList,\n type TaskListOptions,\n TaskItem,\n type TaskItemOptions,\n} from './nodes/index.js';\n\n// === Marks ===\nexport {\n Bold,\n type BoldOptions,\n Italic,\n type ItalicOptions,\n Underline,\n type UnderlineOptions,\n Strike,\n type StrikeOptions,\n Code,\n type CodeOptions,\n Link,\n type LinkOptions,\n type LinkAttributes,\n Subscript,\n type SubscriptOptions,\n Superscript,\n type SuperscriptOptions,\n TextStyle,\n type TextStyleOptions,\n // Link helpers\n linkClickPlugin,\n linkClickPluginKey,\n type LinkClickPluginOptions,\n linkPastePlugin,\n linkPastePluginKey,\n type LinkPastePluginOptions,\n autolinkPlugin,\n autolinkPluginKey,\n type AutolinkPluginOptions,\n linkExitPlugin,\n linkExitPluginKey,\n type LinkExitPluginOptions,\n} from './marks/index.js';\n\n// === Extensions ===\nexport {\n // Core functionality\n BaseKeymap,\n type BaseKeymapOptions,\n History,\n type HistoryOptions,\n Dropcursor,\n type DropcursorOptions,\n Gapcursor,\n TrailingNode,\n type TrailingNodeOptions,\n Placeholder,\n placeholderPluginKey,\n type PlaceholderOptions,\n // List & Count\n ListKeymap,\n type ListKeymapOptions,\n CharacterCount,\n characterCountPluginKey,\n type CharacterCountOptions,\n type CharacterCountStorage,\n // Styling\n Typography,\n type TypographyOptions,\n TextAlign,\n type TextAlignOptions,\n Focus,\n focusPluginKey,\n type FocusOptions,\n LineHeight,\n type LineHeightOptions,\n // Block Attributes\n UniqueID,\n uniqueIDPluginKey,\n type UniqueIDOptions,\n // Selection & Editor Utilities\n Selection,\n type SelectionOptions,\n type SelectionStorage,\n SelectionDecoration,\n selectionDecorationPluginKey,\n type SelectionDecorationOptions,\n InvisibleChars,\n invisibleCharsPluginKey,\n type InvisibleCharsOptions,\n type InvisibleCharsStorage,\n // Text Style Extensions\n TextColor,\n DEFAULT_TEXT_COLORS,\n type TextColorOptions,\n Highlight,\n DEFAULT_HIGHLIGHT_COLORS,\n type HighlightOptions,\n FontFamily,\n type FontFamilyOptions,\n FontSize,\n type FontSizeOptions,\n // Formatting Utilities\n ClearFormatting,\n // Link UI\n LinkPopover,\n type LinkPopoverOptions,\n // Menu Extensions\n BubbleMenu,\n createBubbleMenuPlugin,\n bubbleMenuPluginKey,\n type BubbleMenuOptions,\n type CreateBubbleMenuPluginOptions,\n FloatingMenu,\n createFloatingMenuPlugin,\n floatingMenuPluginKey,\n type FloatingMenuOptions,\n type CreateFloatingMenuPluginOptions,\n // Bundle\n StarterKit,\n type StarterKitOptions,\n} from './extensions/index.js';\n"]}