@thescaffold/editor-addons 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -0
- package/dist/index.cjs +4328 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +864 -0
- package/dist/index.d.ts +864 -0
- package/dist/index.mjs +4111 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/base/commands/index.ts","../src/base/history/index.ts","../src/base/input-rules/index.ts","../src/base/keymap/index.ts","../src/base/schema/index.ts","../src/marks/index.ts","../src/formatting/index.ts","../src/blocks/index.ts","../src/lists/index.ts","../src/tables/index.ts","../src/media/index.ts","../src/inline/index.ts","../src/ui-shell/command-group.ts","../src/ui-shell/index.ts","../src/structure/index.ts","../src/export/index.ts","../src/tools/index.ts","../src/collab/index.ts","../src/code/index.ts","../src/utility/index.ts"],"sourcesContent":["// Base\nexport * from \"./base/commands/index.js\";\nexport * from \"./base/history/index.js\";\nexport * from \"./base/input-rules/index.js\";\nexport * from \"./base/keymap/index.js\";\nexport * from \"./base/schema/index.js\";\n\n// Marks\nexport * from \"./marks/index.js\";\n\n// Formatting\nexport * from \"./formatting/index.js\";\n\n// Blocks\nexport * from \"./blocks/index.js\";\n\n// Lists\nexport * from \"./lists/index.js\";\n\n// Tables\nexport * from \"./tables/index.js\";\n\n// Media\nexport * from \"./media/index.js\";\n\n// Inline\nexport * from \"./inline/index.js\";\n\n// UI Shell\nexport * from \"./ui-shell/index.js\";\n\n// Structure\nexport * from \"./structure/index.js\";\n\n// Export\nexport * from \"./export/index.js\";\n\n// Tools\nexport * from \"./tools/index.js\";\n\n// Collab\nexport * from \"./collab/index.js\";\n\n// Code\nexport * from \"./code/index.js\";\n\n// Utility\nexport * from \"./utility/index.js\";\n\n// ─── Addon Implementation Map ─────────────────────────────────────────────────\n// Maps addon IDs to their runtime implementations.\n// Pass this map to AddonRegistry.load() when creating editors programmatically.\n\nimport type { Addon } from \"@thescaffold/editor-core\";\nimport { CommandsAddonImpl } from \"./base/commands/index.js\";\nimport { HistoryAddonImpl } from \"./base/history/index.js\";\nimport { InputRulesAddonImpl } from \"./base/input-rules/index.js\";\nimport { KeymapAddonImpl } from \"./base/keymap/index.js\";\nimport { SchemaAddonImpl } from \"./base/schema/index.js\";\nimport {\n BlockquoteAddonImpl,\n CalloutAddonImpl,\n CodeBlockAddonImpl,\n ColumnsAddonImpl,\n DetailsAddonImpl,\n DividerAddonImpl,\n HeadingsAddonImpl,\n PageBreakAddonImpl,\n} from \"./blocks/index.js\";\nimport {\n BracketMatchingAddonImpl,\n CodeAddonImpl,\n CodeAutoCompleteAddonImpl,\n CodeFoldingAddonImpl,\n CodeLintAddonImpl,\n DiffAddonImpl,\n LineNumbersAddonImpl,\n MiniMapAddonImpl,\n} from \"./code/index.js\";\nimport {\n AwarenessAddonImpl,\n CollabAddonImpl,\n CommentsAddonImpl,\n PresenceAddonImpl,\n SuggestionsAddonImpl,\n VersionAddonImpl,\n} from \"./collab/index.js\";\nimport {\n ContentAddonImpl,\n DocxAddonImpl,\n PdfAddonImpl,\n PrintAddonImpl,\n} from \"./export/index.js\";\nimport {\n AlignmentAddonImpl,\n IndentAddonImpl,\n LineHeightAddonImpl,\n ParagraphSpacingAddonImpl,\n} from \"./formatting/index.js\";\nimport {\n EmojiAddonImpl,\n EquationAddonImpl,\n FootnoteAddonImpl,\n LinkAddonImpl,\n MentionAddonImpl,\n SmartChipAddonImpl,\n} from \"./inline/index.js\";\nimport {\n BulletListAddonImpl,\n OrderedListAddonImpl,\n TaskListAddonImpl,\n ToggleListAddonImpl,\n} from \"./lists/index.js\";\nimport {\n BoldAddonImpl,\n ClearFormattingAddonImpl,\n FontFamilyAddonImpl,\n FontSizeAddonImpl,\n HighlightAddonImpl,\n InlineCodeAddonImpl,\n ItalicAddonImpl,\n StrikethroughAddonImpl,\n SubscriptAddonImpl,\n SuperscriptAddonImpl,\n TextColorAddonImpl,\n UnderlineAddonImpl,\n} from \"./marks/index.js\";\nimport {\n AudioAddonImpl,\n BookmarkAddonImpl,\n EmbedAddonImpl,\n FileAddonImpl,\n ImageAddonImpl,\n VideoAddonImpl,\n} from \"./media/index.js\";\nimport {\n BreadcrumbAddonImpl,\n CoverAddonImpl,\n OutlineAddonImpl,\n PageSetupAddonImpl,\n TableOfContentsAddonImpl,\n TemplatesAddonImpl,\n} from \"./structure/index.js\";\nimport { TableAddonImpl } from \"./tables/index.js\";\nimport {\n AutoSaveAddonImpl,\n GrammarAddonImpl,\n ReadOnlyAddonImpl,\n SearchAddonImpl,\n SpellCheckAddonImpl,\n} from \"./tools/index.js\";\nimport {\n BlockHandlesAddonImpl,\n BubbleMenuAddonImpl,\n CommandPaletteAddonImpl,\n ContextMenuAddonImpl,\n SlashMenuAddonImpl,\n StatusBarAddonImpl,\n ToolbarAddonImpl,\n} from \"./ui-shell/index.js\";\nimport {\n AccessibilityAddonImpl,\n CountAddonImpl,\n FocusModeAddonImpl,\n FullScreenAddonImpl,\n MarkdownAddonImpl,\n PlaceholderAddonImpl,\n ReadingTimeAddonImpl,\n} from \"./utility/index.js\";\n\nexport const ADDON_IMPLEMENTATIONS: Map<string, Addon> = new Map([\n [SchemaAddonImpl.id, SchemaAddonImpl as Addon],\n [CommandsAddonImpl.id, CommandsAddonImpl as Addon],\n [KeymapAddonImpl.id, KeymapAddonImpl as Addon],\n [HistoryAddonImpl.id, HistoryAddonImpl as Addon],\n [InputRulesAddonImpl.id, InputRulesAddonImpl as Addon],\n [BoldAddonImpl.id, BoldAddonImpl as Addon],\n [ItalicAddonImpl.id, ItalicAddonImpl as Addon],\n [UnderlineAddonImpl.id, UnderlineAddonImpl as Addon],\n [StrikethroughAddonImpl.id, StrikethroughAddonImpl as Addon],\n [InlineCodeAddonImpl.id, InlineCodeAddonImpl as Addon],\n [SubscriptAddonImpl.id, SubscriptAddonImpl as Addon],\n [SuperscriptAddonImpl.id, SuperscriptAddonImpl as Addon],\n [HighlightAddonImpl.id, HighlightAddonImpl as Addon],\n [TextColorAddonImpl.id, TextColorAddonImpl as Addon],\n [FontFamilyAddonImpl.id, FontFamilyAddonImpl as Addon],\n [FontSizeAddonImpl.id, FontSizeAddonImpl as Addon],\n [ClearFormattingAddonImpl.id, ClearFormattingAddonImpl as Addon],\n [AlignmentAddonImpl.id, AlignmentAddonImpl as Addon],\n [LineHeightAddonImpl.id, LineHeightAddonImpl as Addon],\n [ParagraphSpacingAddonImpl.id, ParagraphSpacingAddonImpl as Addon],\n [IndentAddonImpl.id, IndentAddonImpl as Addon],\n [HeadingsAddonImpl.id, HeadingsAddonImpl as Addon],\n [BlockquoteAddonImpl.id, BlockquoteAddonImpl as Addon],\n [DividerAddonImpl.id, DividerAddonImpl as Addon],\n [PageBreakAddonImpl.id, PageBreakAddonImpl as Addon],\n [CalloutAddonImpl.id, CalloutAddonImpl as Addon],\n [DetailsAddonImpl.id, DetailsAddonImpl as Addon],\n [ColumnsAddonImpl.id, ColumnsAddonImpl as Addon],\n [CodeBlockAddonImpl.id, CodeBlockAddonImpl as Addon],\n [BulletListAddonImpl.id, BulletListAddonImpl as Addon],\n [OrderedListAddonImpl.id, OrderedListAddonImpl as Addon],\n [TaskListAddonImpl.id, TaskListAddonImpl as Addon],\n [ToggleListAddonImpl.id, ToggleListAddonImpl as Addon],\n [TableAddonImpl.id, TableAddonImpl as Addon],\n [ImageAddonImpl.id, ImageAddonImpl as Addon],\n [VideoAddonImpl.id, VideoAddonImpl as Addon],\n [AudioAddonImpl.id, AudioAddonImpl as Addon],\n [FileAddonImpl.id, FileAddonImpl as Addon],\n [EmbedAddonImpl.id, EmbedAddonImpl as Addon],\n [BookmarkAddonImpl.id, BookmarkAddonImpl as Addon],\n [LinkAddonImpl.id, LinkAddonImpl as Addon],\n [MentionAddonImpl.id, MentionAddonImpl as Addon],\n [EmojiAddonImpl.id, EmojiAddonImpl as Addon],\n [EquationAddonImpl.id, EquationAddonImpl as Addon],\n [FootnoteAddonImpl.id, FootnoteAddonImpl as Addon],\n [SmartChipAddonImpl.id, SmartChipAddonImpl as Addon],\n [ToolbarAddonImpl.id, ToolbarAddonImpl as Addon],\n [BubbleMenuAddonImpl.id, BubbleMenuAddonImpl as Addon],\n [SlashMenuAddonImpl.id, SlashMenuAddonImpl as Addon],\n [CommandPaletteAddonImpl.id, CommandPaletteAddonImpl as Addon],\n [BlockHandlesAddonImpl.id, BlockHandlesAddonImpl as Addon],\n [ContextMenuAddonImpl.id, ContextMenuAddonImpl as Addon],\n [StatusBarAddonImpl.id, StatusBarAddonImpl as Addon],\n [TableOfContentsAddonImpl.id, TableOfContentsAddonImpl as Addon],\n [OutlineAddonImpl.id, OutlineAddonImpl as Addon],\n [CoverAddonImpl.id, CoverAddonImpl as Addon],\n [BreadcrumbAddonImpl.id, BreadcrumbAddonImpl as Addon],\n [TemplatesAddonImpl.id, TemplatesAddonImpl as Addon],\n [PageSetupAddonImpl.id, PageSetupAddonImpl as Addon],\n [ContentAddonImpl.id, ContentAddonImpl as Addon],\n [DocxAddonImpl.id, DocxAddonImpl as Addon],\n [PdfAddonImpl.id, PdfAddonImpl as Addon],\n [PrintAddonImpl.id, PrintAddonImpl as Addon],\n [SearchAddonImpl.id, SearchAddonImpl as Addon],\n [SpellCheckAddonImpl.id, SpellCheckAddonImpl as Addon],\n [GrammarAddonImpl.id, GrammarAddonImpl as Addon],\n [AutoSaveAddonImpl.id, AutoSaveAddonImpl as Addon],\n [ReadOnlyAddonImpl.id, ReadOnlyAddonImpl as Addon],\n [CollabAddonImpl.id, CollabAddonImpl as Addon],\n [AwarenessAddonImpl.id, AwarenessAddonImpl as Addon],\n [PresenceAddonImpl.id, PresenceAddonImpl as Addon],\n [CommentsAddonImpl.id, CommentsAddonImpl as Addon],\n [SuggestionsAddonImpl.id, SuggestionsAddonImpl as Addon],\n [VersionAddonImpl.id, VersionAddonImpl as Addon],\n [CodeAddonImpl.id, CodeAddonImpl as Addon],\n [LineNumbersAddonImpl.id, LineNumbersAddonImpl as Addon],\n [CodeFoldingAddonImpl.id, CodeFoldingAddonImpl as Addon],\n [BracketMatchingAddonImpl.id, BracketMatchingAddonImpl as Addon],\n [CodeAutoCompleteAddonImpl.id, CodeAutoCompleteAddonImpl as Addon],\n [CodeLintAddonImpl.id, CodeLintAddonImpl as Addon],\n [DiffAddonImpl.id, DiffAddonImpl as Addon],\n [MiniMapAddonImpl.id, MiniMapAddonImpl as Addon],\n [PlaceholderAddonImpl.id, PlaceholderAddonImpl as Addon],\n [CountAddonImpl.id, CountAddonImpl as Addon],\n [ReadingTimeAddonImpl.id, ReadingTimeAddonImpl as Addon],\n [FocusModeAddonImpl.id, FocusModeAddonImpl as Addon],\n [FullScreenAddonImpl.id, FullScreenAddonImpl as Addon],\n [AccessibilityAddonImpl.id, AccessibilityAddonImpl as Addon],\n [MarkdownAddonImpl.id, MarkdownAddonImpl as Addon],\n]);\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\nexport function CommandsAddon(): AddonDefinition {\n return {\n id: \"x/commands\",\n dependencies: [\"x/schema\"],\n impl: CommandsAddonImpl,\n };\n}\n\nexport const CommandsAddonImpl = {\n id: \"x/commands\",\n init(ctx: EditorContext): AddonInstance {\n // Core editing commands — toggle marks, set block types, etc.\n // Concrete implementations delegate to ProseMirror commands.\n ctx.commands.register({\n id: \"selectAll\",\n label: \"Select All\",\n shortcut: \"Mod-a\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\nexport function HistoryAddon(): AddonDefinition {\n return { id: \"x/history\", impl: HistoryAddonImpl };\n}\n\nexport const HistoryAddonImpl = {\n id: \"x/history\",\n init(ctx: EditorContext): AddonInstance {\n const ctxImpl = ctx as unknown as {\n dispatchPmCommand: (name: \"undo\" | \"redo\") => boolean;\n };\n ctx.commands.register({\n id: \"undo\",\n label: \"Undo\",\n icon: \"undo\",\n shortcut: \"Mod-z\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.dispatchPmCommand(\"undo\"),\n });\n ctx.commands.register({\n id: \"redo\",\n label: \"Redo\",\n icon: \"redo\",\n shortcut: \"Mod-Shift-z\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.dispatchPmCommand(\"redo\"),\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\nexport function InputRulesAddon(): AddonDefinition {\n return {\n id: \"x/input-rules\",\n dependencies: [\"x/schema\"],\n impl: InputRulesAddonImpl,\n };\n}\n\nexport const InputRulesAddonImpl = {\n id: \"x/input-rules\",\n init(_ctx: EditorContext): AddonInstance {\n // Markdown-style auto-formatting: **bold**, *italic*, # headings, - lists, etc.\n // Wires into ProseMirror's inputrules plugin at runtime.\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\nexport interface KeymapAddonConfig {\n overrides?: Record<string, string>;\n disabled?: string[];\n}\n\nexport function KeymapAddon(\n config?: KeymapAddonConfig,\n): AddonDefinition<KeymapAddonConfig> {\n return {\n id: \"x/keymap\",\n config,\n dependencies: [\"x/commands\"],\n impl: KeymapAddonImpl,\n };\n}\n\nconst IS_MAC =\n typeof navigator !== \"undefined\" &&\n /Mac|iP(hone|ad|od)/.test(navigator.platform);\n\nfunction normalizeShortcut(shortcut: string): string {\n return shortcut\n .split(\"-\")\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean)\n .sort((a, b) => {\n const order = [\"mod\", \"meta\", \"ctrl\", \"alt\", \"shift\"];\n const ai = order.indexOf(a);\n const bi = order.indexOf(b);\n if (ai === -1 && bi === -1) return 0;\n if (ai === -1) return 1;\n if (bi === -1) return -1;\n return ai - bi;\n })\n .join(\"-\");\n}\n\nfunction eventToShortcut(e: KeyboardEvent): string {\n const parts: string[] = [];\n if (e.metaKey || e.ctrlKey) parts.push(\"mod\");\n if (e.altKey) parts.push(\"alt\");\n if (e.shiftKey) parts.push(\"shift\");\n let key = e.key;\n if (key.length === 1) key = key.toLowerCase();\n if (key === \" \") key = \"space\";\n parts.push(key.toLowerCase());\n return parts.join(\"-\");\n}\n\nexport const KeymapAddonImpl = {\n id: \"x/keymap\",\n init(ctx: EditorContext, config: KeymapAddonConfig = {}): AddonInstance {\n const disabled = new Set(config.disabled ?? []);\n const overrides = config.overrides ?? {};\n\n const handleKeydown = (e: KeyboardEvent) => {\n const shortcut = eventToShortcut(e);\n for (const cmd of ctx.commands.getAll()) {\n if (disabled.has(cmd.id)) continue;\n const cmdShortcut = overrides[cmd.id] ?? cmd.shortcut;\n if (!cmdShortcut) continue;\n if (normalizeShortcut(cmdShortcut) === shortcut) {\n if (cmd.isEnabled?.(ctx) === false) continue;\n e.preventDefault();\n cmd.execute(ctx);\n return;\n }\n }\n };\n\n const content = ctx.getSlot(\"content\");\n const target = content ?? document;\n target.addEventListener(\"keydown\", handleKeydown as EventListener, true);\n\n return {\n destroy() {\n target.removeEventListener(\n \"keydown\",\n handleKeydown as EventListener,\n true,\n );\n },\n };\n },\n};\n\n// Suppress unused warning\nvoid IS_MAC;\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n SchemaContext,\n} from \"@thescaffold/editor-core\";\n\nexport interface SchemaAddonConfig {\n nodes?: string[];\n marks?: string[];\n}\n\nexport function SchemaAddon(\n config?: SchemaAddonConfig,\n): AddonDefinition<SchemaAddonConfig> {\n return { id: \"x/schema\", config, impl: SchemaAddonImpl };\n}\n\nexport const SchemaAddonImpl = {\n id: \"x/schema\",\n initSchema(ctx: SchemaContext, _config: SchemaAddonConfig = {}): void {\n ctx.addNode({\n name: \"doc\",\n content: \"block+\",\n });\n ctx.addNode({\n name: \"paragraph\",\n group: \"block\",\n content: \"inline*\",\n attrs: {\n align: { default: null },\n indent: { default: 0 },\n lineHeight: { default: null },\n },\n parseDOM: [\n {\n tag: \"p\",\n getAttrs: (el: Element) => {\n const e = el as HTMLElement;\n return {\n align: e.style.textAlign || null,\n indent: parseInt(e.dataset[\"indent\"] ?? \"0\", 10) || 0,\n lineHeight: e.style.lineHeight || null,\n };\n },\n },\n ],\n toDOM: (node: {\n attrs: {\n align: string | null;\n indent: number;\n lineHeight: string | null;\n };\n }) => {\n const style: string[] = [];\n if (node.attrs.align) style.push(`text-align:${node.attrs.align}`);\n if (node.attrs.lineHeight)\n style.push(`line-height:${node.attrs.lineHeight}`);\n const attrs: Record<string, string> = {};\n if (style.length > 0) attrs[\"style\"] = style.join(\";\");\n if (node.attrs.indent > 0)\n attrs[\"data-indent\"] = String(node.attrs.indent);\n return [\"p\", attrs, 0];\n },\n });\n ctx.addNode({\n name: \"text\",\n group: \"inline\",\n });\n ctx.addNode({\n name: \"hardBreak\",\n group: \"inline\",\n inline: true,\n selectable: false,\n parseDOM: [{ tag: \"br\" }],\n toDOM: () => [\"br\"],\n });\n },\n init(_ctx: EditorContext, _config: SchemaAddonConfig = {}): AddonInstance {\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n SchemaContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Bold ─────────────────────────────────────────────────────────────────────\n\nexport function BoldAddon(): AddonDefinition {\n return { id: \"x/bold\", dependencies: [\"x/schema\"], impl: BoldAddonImpl };\n}\n\nexport const BoldAddonImpl = {\n id: \"x/bold\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"bold\",\n parseDOM: [\n { tag: \"strong\" },\n { tag: \"b\" },\n { style: \"font-weight=bold\" },\n ],\n toDOM: () => [\"strong\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"bold\",\n label: \"Bold\",\n icon: \"bold\",\n shortcut: \"Mod-b\",\n isEnabled: (c) => c.selection.canHaveMark(\"bold\"),\n isActive: (c) => c.selection.hasMark(\"bold\"),\n execute: (c) => {\n c.addMark(\"bold\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Italic ───────────────────────────────────────────────────────────────────\n\nexport function ItalicAddon(): AddonDefinition {\n return { id: \"x/italic\", dependencies: [\"x/schema\"], impl: ItalicAddonImpl };\n}\n\nexport const ItalicAddonImpl = {\n id: \"x/italic\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"italic\",\n parseDOM: [{ tag: \"em\" }, { tag: \"i\" }, { style: \"font-style=italic\" }],\n toDOM: () => [\"em\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"italic\",\n label: \"Italic\",\n icon: \"italic\",\n shortcut: \"Mod-i\",\n isEnabled: (c) => c.selection.canHaveMark(\"italic\"),\n isActive: (c) => c.selection.hasMark(\"italic\"),\n execute: (c) => {\n c.addMark(\"italic\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Underline ────────────────────────────────────────────────────────────────\n\nexport function UnderlineAddon(): AddonDefinition {\n return {\n id: \"x/underline\",\n dependencies: [\"x/schema\"],\n impl: UnderlineAddonImpl,\n };\n}\n\nexport const UnderlineAddonImpl = {\n id: \"x/underline\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"underline\",\n parseDOM: [{ tag: \"u\" }, { style: \"text-decoration=underline\" }],\n toDOM: () => [\"u\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"underline\",\n label: \"Underline\",\n icon: \"underline\",\n shortcut: \"Mod-u\",\n isEnabled: (c) => c.selection.canHaveMark(\"underline\"),\n isActive: (c) => c.selection.hasMark(\"underline\"),\n execute: (c) => {\n c.addMark(\"underline\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Strikethrough ────────────────────────────────────────────────────────────\n\nexport function StrikethroughAddon(): AddonDefinition {\n return {\n id: \"x/strikethrough\",\n dependencies: [\"x/schema\"],\n impl: StrikethroughAddonImpl,\n };\n}\n\nexport const StrikethroughAddonImpl = {\n id: \"x/strikethrough\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"strikethrough\",\n parseDOM: [{ tag: \"s\" }, { tag: \"del\" }, { tag: \"strike\" }],\n toDOM: () => [\"s\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"strikethrough\",\n label: \"Strikethrough\",\n icon: \"strikethrough\",\n isEnabled: (c) => c.selection.canHaveMark(\"strikethrough\"),\n isActive: (c) => c.selection.hasMark(\"strikethrough\"),\n execute: (c) => {\n c.addMark(\"strikethrough\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Inline Code ─────────────────────────────────────────────────────────────\n\nexport function InlineCodeAddon(): AddonDefinition {\n return {\n id: \"x/inline-code\",\n dependencies: [\"x/schema\"],\n impl: InlineCodeAddonImpl,\n };\n}\n\nexport const InlineCodeAddonImpl = {\n id: \"x/inline-code\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"code\",\n parseDOM: [{ tag: \"code\" }],\n toDOM: () => [\"code\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"inlineCode\",\n label: \"Inline Code\",\n icon: \"code\",\n isEnabled: (c) => c.selection.canHaveMark(\"code\"),\n isActive: (c) => c.selection.hasMark(\"code\"),\n execute: (c) => {\n c.addMark(\"code\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Subscript ────────────────────────────────────────────────────────────────\n\nexport function SubscriptAddon(): AddonDefinition {\n return {\n id: \"x/subscript\",\n dependencies: [\"x/schema\"],\n impl: SubscriptAddonImpl,\n };\n}\n\nexport const SubscriptAddonImpl = {\n id: \"x/subscript\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"subscript\",\n excludes: \"superscript\",\n parseDOM: [{ tag: \"sub\" }],\n toDOM: () => [\"sub\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"subscript\",\n label: \"Subscript\",\n icon: \"subscript\",\n isEnabled: (c) => c.selection.canHaveMark(\"subscript\"),\n isActive: (c) => c.selection.hasMark(\"subscript\"),\n execute: (c) => {\n c.addMark(\"subscript\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Superscript ─────────────────────────────────────────────────────────────\n\nexport function SuperscriptAddon(): AddonDefinition {\n return {\n id: \"x/superscript\",\n dependencies: [\"x/schema\"],\n impl: SuperscriptAddonImpl,\n };\n}\n\nexport const SuperscriptAddonImpl = {\n id: \"x/superscript\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"superscript\",\n excludes: \"subscript\",\n parseDOM: [{ tag: \"sup\" }],\n toDOM: () => [\"sup\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"superscript\",\n label: \"Superscript\",\n icon: \"superscript\",\n isEnabled: (c) => c.selection.canHaveMark(\"superscript\"),\n isActive: (c) => c.selection.hasMark(\"superscript\"),\n execute: (c) => {\n c.addMark(\"superscript\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Highlight ────────────────────────────────────────────────────────────────\n\nexport interface HighlightAddonConfig {\n colors?: string[];\n defaultColor?: string;\n}\n\nexport function HighlightAddon(\n config?: HighlightAddonConfig,\n): AddonDefinition<HighlightAddonConfig> {\n return {\n id: \"x/highlight\",\n config,\n dependencies: [\"x/schema\"],\n impl: HighlightAddonImpl,\n };\n}\n\nexport const HighlightAddonImpl = {\n id: \"x/highlight\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"highlight\",\n attrs: { color: { default: \"#ffff00\" } },\n parseDOM: [{ tag: \"mark\" }],\n toDOM: (mark: { attrs: { color: string } }) => [\n \"mark\",\n { style: `background:${mark.attrs.color}` },\n 0,\n ],\n });\n },\n init(ctx: EditorContext, config: HighlightAddonConfig = {}): AddonInstance {\n ctx.commands.register({\n id: \"highlight\",\n label: \"Highlight\",\n icon: \"highlight\",\n isEnabled: (c) => c.selection.canHaveMark(\"highlight\"),\n isActive: (c) => c.selection.hasMark(\"highlight\"),\n execute: (c) => {\n c.addMark(\"highlight\", { color: config.defaultColor ?? \"#ffff00\" });\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Text Color ───────────────────────────────────────────────────────────────\n\nexport interface TextColorAddonConfig {\n colors?: string[];\n defaultColor?: string;\n}\n\nexport function TextColorAddon(\n config?: TextColorAddonConfig,\n): AddonDefinition<TextColorAddonConfig> {\n return {\n id: \"x/text-color\",\n config,\n dependencies: [\"x/schema\"],\n impl: TextColorAddonImpl,\n };\n}\n\nexport const TextColorAddonImpl = {\n id: \"x/text-color\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"textColor\",\n attrs: { color: { default: null } },\n parseDOM: [{ style: \"color\", getAttrs: (v: string) => ({ color: v }) }],\n toDOM: (mark: { attrs: { color: string } }) => [\n \"span\",\n { style: `color:${mark.attrs.color}` },\n 0,\n ],\n });\n },\n init(ctx: EditorContext, config: TextColorAddonConfig = {}): AddonInstance {\n ctx.commands.register({\n id: \"textColor\",\n label: \"Text Color\",\n icon: \"text-color\",\n isEnabled: (c) => c.selection.canHaveMark(\"textColor\"),\n isActive: (c) => c.selection.hasMark(\"textColor\"),\n execute: (c) => {\n c.addMark(\"textColor\", { color: config.defaultColor ?? \"#000000\" });\n return true;\n },\n });\n ctx.commands.register({\n id: \"clearTextColor\",\n label: \"Clear Text Color\",\n isEnabled: (c) => c.selection.hasMark(\"textColor\"),\n isActive: () => false,\n execute: (c) => {\n c.removeMark(\"textColor\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Font Family ──────────────────────────────────────────────────────────────\n\nexport interface FontFamilyAddonConfig {\n families: { label: string; value: string }[];\n}\n\nexport function FontFamilyAddon(\n config: FontFamilyAddonConfig,\n): AddonDefinition<FontFamilyAddonConfig> {\n return {\n id: \"x/font-family\",\n config,\n dependencies: [\"x/schema\"],\n impl: FontFamilyAddonImpl,\n };\n}\n\nexport const FontFamilyAddonImpl = {\n id: \"x/font-family\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"fontFamily\",\n attrs: { family: { default: null } },\n parseDOM: [\n { style: \"font-family\", getAttrs: (v: string) => ({ family: v }) },\n ],\n toDOM: (mark: { attrs: { family: string } }) => [\n \"span\",\n { style: `font-family:${mark.attrs.family}` },\n 0,\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"fontFamily\",\n label: \"Font Family\",\n icon: \"font-family\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const family = (args as { family?: string } | undefined)?.family;\n if (!family) return false;\n c.addMark(\"fontFamily\", { family });\n return true;\n },\n });\n ctx.commands.register({\n id: \"clearFontFamily\",\n label: \"Clear Font Family\",\n isEnabled: (c) => c.selection.hasMark(\"fontFamily\"),\n isActive: () => false,\n execute: (c) => {\n c.removeMark(\"fontFamily\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Font Size ────────────────────────────────────────────────────────────────\n\nexport interface FontSizeAddonConfig {\n sizes?: string[];\n defaultSize?: string;\n}\n\nexport function FontSizeAddon(\n config?: FontSizeAddonConfig,\n): AddonDefinition<FontSizeAddonConfig> {\n return {\n id: \"x/font-size\",\n config,\n dependencies: [\"x/schema\"],\n impl: FontSizeAddonImpl,\n };\n}\n\nexport const FontSizeAddonImpl = {\n id: \"x/font-size\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"fontSize\",\n attrs: { size: { default: null } },\n parseDOM: [\n { style: \"font-size\", getAttrs: (v: string) => ({ size: v }) },\n ],\n toDOM: (mark: { attrs: { size: string } }) => [\n \"span\",\n { style: `font-size:${mark.attrs.size}` },\n 0,\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"fontSize\",\n label: \"Font Size\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const size = (args as { size?: string } | undefined)?.size;\n if (!size) return false;\n c.addMark(\"fontSize\", { size });\n return true;\n },\n });\n ctx.commands.register({\n id: \"increaseFontSize\",\n label: \"Increase Font Size\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"decreaseFontSize\",\n label: \"Decrease Font Size\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"clearFontSize\",\n label: \"Clear Font Size\",\n isEnabled: (c) => c.selection.hasMark(\"fontSize\"),\n isActive: () => false,\n execute: (c) => {\n c.removeMark(\"fontSize\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Clear Formatting ─────────────────────────────────────────────────────────\n\nexport function ClearFormattingAddon(): AddonDefinition {\n return {\n id: \"x/clear-formatting\",\n dependencies: [\"x/commands\"],\n impl: ClearFormattingAddonImpl,\n };\n}\n\nexport const ClearFormattingAddonImpl = {\n id: \"x/clear-formatting\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"clearFormatting\",\n label: \"Clear Formatting\",\n icon: \"clear-formatting\",\n shortcut: \"Mod-\\\\\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n for (const m of c.schema.getMarks()) c.removeMark(m.name);\n return true;\n },\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Alignment ────────────────────────────────────────────────────────────────\n\nexport function AlignmentAddon(): AddonDefinition {\n return {\n id: \"x/alignment\",\n dependencies: [\"x/schema\"],\n impl: AlignmentAddonImpl,\n };\n}\n\nexport const AlignmentAddonImpl = {\n id: \"x/alignment\",\n init(ctx: EditorContext): AddonInstance {\n const setAttrs = (c: EditorContext, patch: Record<string, unknown>) =>\n (\n c as unknown as { setBlockAttrs(p: Record<string, unknown>): boolean }\n ).setBlockAttrs(patch);\n for (const align of [\"left\", \"center\", \"right\", \"justify\"] as const) {\n const id = `align${align.charAt(0).toUpperCase()}${align.slice(1)}`;\n ctx.commands.register({\n id,\n label: `Align ${align.charAt(0).toUpperCase()}${align.slice(1)}`,\n icon: `align-${align}`,\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => setAttrs(c, { align }),\n });\n }\n return {};\n },\n};\n\n// ─── Line Height ─────────────────────────────────────────────────────────────\n\nexport interface LineHeightAddonConfig {\n options?: number[];\n}\n\nexport function LineHeightAddon(\n config?: LineHeightAddonConfig,\n): AddonDefinition<LineHeightAddonConfig> {\n return {\n id: \"x/line-height\",\n config,\n dependencies: [\"x/schema\"],\n impl: LineHeightAddonImpl,\n };\n}\n\nexport const LineHeightAddonImpl = {\n id: \"x/line-height\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"lineHeight\",\n label: \"Line Height\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const value = (args as { value?: number | string } | undefined)?.value;\n if (value == null) return false;\n return (\n c as unknown as { setBlockAttrs(p: Record<string, unknown>): boolean }\n ).setBlockAttrs({ lineHeight: String(value) });\n },\n });\n return {};\n },\n};\n\n// ─── Paragraph Spacing ────────────────────────────────────────────────────────\n\nexport function ParagraphSpacingAddon(): AddonDefinition {\n return {\n id: \"x/paragraph-spacing\",\n dependencies: [\"x/schema\"],\n impl: ParagraphSpacingAddonImpl,\n };\n}\n\nexport const ParagraphSpacingAddonImpl = {\n id: \"x/paragraph-spacing\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"paragraphSpacing\",\n label: \"Paragraph Spacing\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const value = (args as { value?: number | string } | undefined)?.value;\n if (value == null) return false;\n return (\n c as unknown as { setBlockAttrs(p: Record<string, unknown>): boolean }\n ).setBlockAttrs({ paragraphSpacing: String(value) });\n },\n });\n return {};\n },\n};\n\n// ─── Indent ───────────────────────────────────────────────────────────────────\n\nexport function IndentAddon(): AddonDefinition {\n return { id: \"x/indent\", dependencies: [\"x/schema\"], impl: IndentAddonImpl };\n}\n\nexport const IndentAddonImpl = {\n id: \"x/indent\",\n init(ctx: EditorContext): AddonInstance {\n const bump = (c: EditorContext, delta: number) => {\n const view = (\n c as unknown as {\n _prosemirror?: {\n state: {\n doc: {\n nodeAt(p: number): { attrs?: Record<string, unknown> } | null;\n };\n selection: { from: number; to: number };\n };\n };\n }\n )._prosemirror;\n if (!view) return false;\n const { from, to } = view.state.selection;\n let current = 0;\n view.state.doc.nodeAt(from)?.attrs;\n // Find current block's indent\n const node = view.state.doc.nodeAt(Math.max(0, from - 1));\n if (node && typeof node.attrs?.[\"indent\"] === \"number\")\n current = node.attrs[\"indent\"] as number;\n const next = Math.max(0, Math.min(10, current + delta));\n return (\n c as unknown as { setBlockAttrs(p: Record<string, unknown>): boolean }\n ).setBlockAttrs({ indent: next });\n };\n ctx.commands.register({\n id: \"indent\",\n label: \"Indent\",\n icon: \"indent\",\n shortcut: \"Tab\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => bump(c, 1),\n });\n ctx.commands.register({\n id: \"outdent\",\n label: \"Outdent\",\n icon: \"outdent\",\n shortcut: \"Shift-Tab\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => bump(c, -1),\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n SchemaContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Headings ─────────────────────────────────────────────────────────────────\n\nexport function HeadingsAddon(): AddonDefinition {\n return {\n id: \"x/headings\",\n dependencies: [\"x/schema\"],\n impl: HeadingsAddonImpl,\n };\n}\n\nexport const HeadingsAddonImpl = {\n id: \"x/headings\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"heading\",\n group: \"block\",\n content: \"inline*\",\n attrs: {\n level: { default: 1 },\n align: { default: null },\n indent: { default: 0 },\n lineHeight: { default: null },\n },\n parseDOM: [1, 2, 3, 4, 5, 6].map((level) => ({\n tag: `h${level}`,\n getAttrs: () => ({ level }),\n })),\n toDOM: (node: {\n attrs: {\n level: number;\n align: string | null;\n indent: number;\n lineHeight: string | null;\n };\n }) => {\n const style: string[] = [];\n if (node.attrs.align) style.push(`text-align:${node.attrs.align}`);\n if (node.attrs.lineHeight)\n style.push(`line-height:${node.attrs.lineHeight}`);\n const attrs: Record<string, string> = {};\n if (style.length > 0) attrs[\"style\"] = style.join(\";\");\n if (node.attrs.indent > 0)\n attrs[\"data-indent\"] = String(node.attrs.indent);\n return [`h${node.attrs.level}`, attrs, 0];\n },\n });\n },\n init(ctx: EditorContext): AddonInstance {\n const ctxImpl = ctx as unknown as {\n setBlockType: (n: string, a?: Record<string, unknown>) => boolean;\n };\n for (let level = 1; level <= 6; level++) {\n ctx.commands.register({\n id: `heading${level}`,\n label: `Heading ${level}`,\n icon: `h${level}`,\n shortcut: `Mod-Alt-${level}`,\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.setBlockType(\"heading\", { level }),\n });\n }\n ctx.commands.register({\n id: \"paragraph\",\n label: \"Paragraph\",\n shortcut: \"Mod-Alt-0\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.setBlockType(\"paragraph\"),\n });\n return {};\n },\n};\n\n// ─── Blockquote ───────────────────────────────────────────────────────────────\n\nexport function BlockquoteAddon(): AddonDefinition {\n return {\n id: \"x/blockquote\",\n dependencies: [\"x/schema\"],\n impl: BlockquoteAddonImpl,\n };\n}\n\nexport const BlockquoteAddonImpl = {\n id: \"x/blockquote\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"blockquote\",\n group: \"block\",\n content: \"block+\",\n parseDOM: [{ tag: \"blockquote\" }],\n toDOM: () => [\"blockquote\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n const ctxImpl = ctx as unknown as {\n wrapInBlock: (n: string) => boolean;\n liftBlock: () => boolean;\n };\n ctx.commands.register({\n id: \"blockquote\",\n label: \"Blockquote\",\n icon: \"blockquote\",\n shortcut: \"Mod-Shift-.\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.wrapInBlock(\"blockquote\") || ctxImpl.liftBlock(),\n });\n return {};\n },\n};\n\n// ─── Divider ──────────────────────────────────────────────────────────────────\n\nexport function DividerAddon(): AddonDefinition {\n return {\n id: \"x/divider\",\n dependencies: [\"x/schema\"],\n impl: DividerAddonImpl,\n };\n}\n\nexport const DividerAddonImpl = {\n id: \"x/divider\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"horizontalRule\",\n group: \"block\",\n parseDOM: [{ tag: \"hr\" }],\n toDOM: () => [\"hr\"],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertDivider\",\n label: \"Divider\",\n icon: \"divider\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n c.insertNode(\"horizontalRule\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Page Break ───────────────────────────────────────────────────────────────\n\nexport function PageBreakAddon(): AddonDefinition {\n return {\n id: \"x/page-break\",\n dependencies: [\"x/schema\"],\n impl: PageBreakAddonImpl,\n };\n}\n\nexport const PageBreakAddonImpl = {\n id: \"x/page-break\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"pageBreak\",\n group: \"block\",\n parseDOM: [{ tag: \"div[data-page-break]\" }],\n toDOM: () => [\n \"div\",\n { \"data-page-break\": \"true\", style: \"page-break-after:always\" },\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertPageBreak\",\n label: \"Page Break\",\n icon: \"page-break\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n c.insertNode(\"pageBreak\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Callout ─────────────────────────────────────────────────────────────────\n\nexport type CalloutType =\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"tip\"\n | \"note\";\n\nexport interface CalloutAddonConfig {\n types?: CalloutType[];\n}\n\nexport function CalloutAddon(\n config?: CalloutAddonConfig,\n): AddonDefinition<CalloutAddonConfig> {\n return {\n id: \"x/callout\",\n config,\n dependencies: [\"x/schema\"],\n impl: CalloutAddonImpl,\n };\n}\n\nexport const CalloutAddonImpl = {\n id: \"x/callout\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"callout\",\n group: \"block\",\n content: \"block+\",\n attrs: { type: { default: \"info\" } },\n parseDOM: [\n {\n tag: \"div[data-callout]\",\n getAttrs: (el: Element) => ({\n type: el.getAttribute(\"data-callout\"),\n }),\n },\n ],\n toDOM: (node: { attrs: { type: string } }) => [\n \"div\",\n {\n \"data-callout\": node.attrs.type,\n class: `xe-callout xe-callout--${node.attrs.type}`,\n },\n 0,\n ],\n });\n },\n init(ctx: EditorContext, config: CalloutAddonConfig = {}): AddonInstance {\n const types = config.types ?? [\n \"info\",\n \"success\",\n \"warning\",\n \"error\",\n \"tip\",\n \"note\",\n ];\n const defaultType = types[0] ?? \"info\";\n // Generic insert (uses configured first type or args.type) plus a per-type\n // variant for richer toolbars.\n ctx.commands.register({\n id: \"insertCallout\",\n label: \"Callout\",\n icon: \"callout\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const type =\n (args as { type?: string } | undefined)?.type ?? defaultType;\n c.insertNode(\"callout\", { type }, { type: \"paragraph\" });\n return true;\n },\n });\n for (const type of types) {\n ctx.commands.register({\n id: `insertCallout_${type}`,\n label: `Callout: ${type}`,\n icon: `callout-${type}`,\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n c.insertNode(\"callout\", { type }, { type: \"paragraph\" });\n return true;\n },\n });\n }\n return {};\n },\n};\n\n// ─── Details ─────────────────────────────────────────────────────────────────\n\nexport function DetailsAddon(): AddonDefinition {\n return {\n id: \"x/details\",\n dependencies: [\"x/schema\"],\n impl: DetailsAddonImpl,\n };\n}\n\nexport const DetailsAddonImpl = {\n id: \"x/details\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"details\",\n group: \"block\",\n content: \"summary block+\",\n parseDOM: [{ tag: \"details\" }],\n toDOM: () => [\"details\", 0],\n });\n ctx.addNode({\n name: \"summary\",\n content: \"inline*\",\n parseDOM: [{ tag: \"summary\" }],\n toDOM: () => [\"summary\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertDetails\",\n label: \"Details / Toggle\",\n icon: \"details\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n c.insertNode(\"details\", undefined, [\n { type: \"summary\" },\n { type: \"paragraph\" },\n ] as unknown as import(\"@thescaffold/editor-core\").Content);\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Columns ─────────────────────────────────────────────────────────────────\n\nexport interface ColumnsAddonConfig {\n maxColumns?: number;\n ratios?: string[];\n}\n\nexport function ColumnsAddon(\n config?: ColumnsAddonConfig,\n): AddonDefinition<ColumnsAddonConfig> {\n return {\n id: \"x/columns\",\n config,\n dependencies: [\"x/schema\"],\n impl: ColumnsAddonImpl,\n };\n}\n\nexport const ColumnsAddonImpl = {\n id: \"x/columns\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"columns\",\n group: \"block\",\n content: \"column+\",\n attrs: { ratio: { default: \"1:1\" } },\n parseDOM: [{ tag: \"div[data-columns]\" }],\n toDOM: () => [\"div\", { \"data-columns\": \"true\", class: \"xe-columns\" }, 0],\n });\n ctx.addNode({\n name: \"column\",\n content: \"block+\",\n parseDOM: [{ tag: \"div[data-column]\" }],\n toDOM: () => [\"div\", { \"data-column\": \"true\", class: \"xe-column\" }, 0],\n });\n },\n init(ctx: EditorContext, config: ColumnsAddonConfig = {}): AddonInstance {\n ctx.commands.register({\n id: \"insertColumns\",\n label: \"Columns\",\n icon: \"columns\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n c.insertNode(\"columns\", undefined, [\n { type: \"column\", content: [{ type: \"paragraph\" }] },\n { type: \"column\", content: [{ type: \"paragraph\" }] },\n ] as unknown as import(\"@thescaffold/editor-core\").Content);\n return true;\n },\n });\n ctx.commands.register({\n id: \"addColumn\",\n label: \"Add Column\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"removeColumn\",\n label: \"Remove Column\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"setColumnRatio\",\n label: \"Set Column Ratio\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Code Block ───────────────────────────────────────────────────────────────\n\nexport interface CodeBlockAddonConfig {\n languages?: string[];\n defaultLanguage?: string;\n lineNumbers?: boolean;\n lineWrapping?: boolean;\n}\n\nexport function CodeBlockAddon(\n config?: CodeBlockAddonConfig,\n): AddonDefinition<CodeBlockAddonConfig> {\n return {\n id: \"x/code-block\",\n config,\n dependencies: [\"x/schema\"],\n impl: CodeBlockAddonImpl,\n };\n}\n\nexport const CodeBlockAddonImpl = {\n id: \"x/code-block\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"codeBlock\",\n group: \"block\",\n content: \"text*\",\n attrs: { language: { default: \"\" } },\n parseDOM: [{ tag: \"pre\", preserveWhitespace: \"full\" }],\n toDOM: () => [\"pre\", [\"code\", 0]],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n const ctxImpl = ctx as unknown as {\n setBlockType: (n: string, a?: Record<string, unknown>) => boolean;\n };\n ctx.commands.register({\n id: \"insertCodeBlock\",\n label: \"Code Block\",\n icon: \"code-block\",\n shortcut: \"Mod-Alt-c\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.setBlockType(\"codeBlock\"),\n });\n ctx.commands.register({\n id: \"copyCodeBlock\",\n label: \"Copy Code\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n const text = c.getContent(\"text\");\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(text).catch(() => {});\n }\n return true;\n },\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n SchemaContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Bullet List ─────────────────────────────────────────────────────────────\n\nexport function BulletListAddon(): AddonDefinition {\n return {\n id: \"x/bullet-list\",\n dependencies: [\"x/schema\"],\n impl: BulletListAddonImpl,\n };\n}\n\nexport const BulletListAddonImpl = {\n id: \"x/bullet-list\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"bulletList\",\n group: \"block\",\n content: \"listItem+\",\n parseDOM: [{ tag: \"ul\" }],\n toDOM: () => [\"ul\", 0],\n });\n ctx.addNode({\n name: \"listItem\",\n content: \"paragraph block*\",\n parseDOM: [{ tag: \"li\" }],\n toDOM: () => [\"li\", 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n const ctxImpl = ctx as unknown as {\n wrapInBlock: (n: string) => boolean;\n liftBlock: () => boolean;\n };\n ctx.commands.register({\n id: \"bulletList\",\n label: \"Bullet List\",\n icon: \"bullet-list\",\n shortcut: \"Mod-Shift-8\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.wrapInBlock(\"bulletList\") || ctxImpl.liftBlock(),\n });\n return {};\n },\n};\n\n// ─── Ordered List ─────────────────────────────────────────────────────────────\n\nexport function OrderedListAddon(): AddonDefinition {\n return {\n id: \"x/ordered-list\",\n dependencies: [\"x/schema\"],\n impl: OrderedListAddonImpl,\n };\n}\n\nexport const OrderedListAddonImpl = {\n id: \"x/ordered-list\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"orderedList\",\n group: \"block\",\n content: \"listItem+\",\n attrs: { order: { default: 1 } },\n parseDOM: [\n {\n tag: \"ol\",\n getAttrs: (el: Element) => ({\n order: parseInt(el.getAttribute(\"start\") ?? \"1\", 10),\n }),\n },\n ],\n toDOM: (node: { attrs: { order: number } }) =>\n node.attrs.order === 1\n ? [\"ol\", 0]\n : [\"ol\", { start: node.attrs.order }, 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n const ctxImpl = ctx as unknown as {\n wrapInBlock: (n: string) => boolean;\n liftBlock: () => boolean;\n };\n ctx.commands.register({\n id: \"orderedList\",\n label: \"Ordered List\",\n icon: \"ordered-list\",\n shortcut: \"Mod-Shift-7\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.wrapInBlock(\"orderedList\") || ctxImpl.liftBlock(),\n });\n return {};\n },\n};\n\n// ─── Task List ────────────────────────────────────────────────────────────────\n\nexport function TaskListAddon(): AddonDefinition {\n return {\n id: \"x/task-list\",\n dependencies: [\"x/schema\"],\n impl: TaskListAddonImpl,\n };\n}\n\nexport const TaskListAddonImpl = {\n id: \"x/task-list\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"taskList\",\n group: \"block\",\n content: \"taskItem+\",\n parseDOM: [{ tag: \"ul[data-task-list]\" }],\n toDOM: () => [\"ul\", { \"data-task-list\": \"true\" }, 0],\n });\n ctx.addNode({\n name: \"taskItem\",\n content: \"paragraph block*\",\n attrs: { checked: { default: false } },\n parseDOM: [{ tag: \"li[data-task-item]\" }],\n toDOM: (node: { attrs: { checked: boolean } }) => [\n \"li\",\n { \"data-task-item\": \"true\", \"data-checked\": node.attrs.checked },\n 0,\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n const ctxImpl = ctx as unknown as {\n wrapInBlock: (n: string) => boolean;\n liftBlock: () => boolean;\n };\n ctx.commands.register({\n id: \"taskList\",\n label: \"Task List\",\n icon: \"task-list\",\n shortcut: \"Mod-Shift-9\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => ctxImpl.wrapInBlock(\"taskList\") || ctxImpl.liftBlock(),\n });\n return {};\n },\n};\n\n// ─── Toggle List ──────────────────────────────────────────────────────────────\n\nexport function ToggleListAddon(): AddonDefinition {\n return {\n id: \"x/toggle-list\",\n dependencies: [\"x/schema\"],\n impl: ToggleListAddonImpl,\n };\n}\n\nexport const ToggleListAddonImpl = {\n id: \"x/toggle-list\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"toggleList\",\n group: \"block\",\n content: \"toggleItem+\",\n parseDOM: [{ tag: \"ul[data-toggle-list]\" }],\n toDOM: () => [\"ul\", { \"data-toggle-list\": \"true\" }, 0],\n });\n ctx.addNode({\n name: \"toggleItem\",\n content: \"paragraph block*\",\n attrs: { open: { default: true } },\n parseDOM: [{ tag: \"li[data-toggle-item]\" }],\n toDOM: () => [\"li\", { \"data-toggle-item\": \"true\" }, 0],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"toggleList\",\n label: \"Toggle List\",\n icon: \"toggle-list\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n c.insertNode(\"toggleList\", undefined, [\n { type: \"toggleItem\", content: [{ type: \"paragraph\" }] },\n ] as unknown as import(\"@thescaffold/editor-core\").Content);\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Lists Bundle ─────────────────────────────────────────────────────────────\n\nexport function ListsAddon(): AddonDefinition[] {\n return [\n BulletListAddon(),\n OrderedListAddon(),\n TaskListAddon(),\n ToggleListAddon(),\n ];\n}\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n SchemaContext,\n} from \"@thescaffold/editor-core\";\n\nexport interface TableAddonConfig {\n /**\n * For full cell-selection, Tab navigation, and column resize handles you\n * need prosemirror-tables' `tableEditing()` and (optionally)\n * `columnResizing()` plugins. Inject them at editor construction via\n * `EditorConfig.extraPlugins`:\n *\n * ```ts\n * import { tableEditing, columnResizing } from 'prosemirror-tables';\n *\n * el.config = {\n * addons: [TableAddon(), ...others],\n * extraPlugins: [columnResizing({}), tableEditing()],\n * };\n * ```\n *\n * The flag is kept on the config for API symmetry with prior versions and\n * for downstream tooling that wants to flip a single switch — at runtime\n * the editor itself doesn't read it, the user owns the plugin list.\n */\n resizable?: boolean;\n /** Soft cap on cols inserted via insertTable. Default 20. */\n maxCols?: number;\n /** Soft cap on rows inserted via insertTable. Default 100. */\n maxRows?: number;\n}\n\nexport function TableAddon(\n config?: TableAddonConfig,\n): AddonDefinition<TableAddonConfig> {\n return {\n id: \"x/table\",\n config,\n dependencies: [\"x/schema\"],\n impl: TableAddonImpl,\n };\n}\n\n// ─── Module loading ──────────────────────────────────────────────────────────\n//\n// prosemirror-tables is the source of truth for cell selection, the\n// row/column commands, and toggleHeader. It's lazy-loaded once per process\n// and cached. Commands check the cache synchronously; the module is also\n// kicked off at addon init so subsequent invocations have it ready.\n\n// We intentionally treat prosemirror-tables as `any`-shaped — its actual\n// EditorState/Transaction types don't line up with our `unknown`-based PM\n// surface and we'd otherwise need to re-import prosemirror-state + view just\n// to satisfy the type checker. The runtime contract is what matters.\ntype PmTables = {\n [k: string]: (...args: unknown[]) => unknown;\n} & {\n setCellAttr: (name: string, value: unknown) => PmCommand;\n deleteTable: PmCommand;\n addRowBefore: PmCommand;\n addRowAfter: PmCommand;\n deleteRow: PmCommand;\n addColumnBefore: PmCommand;\n addColumnAfter: PmCommand;\n deleteColumn: PmCommand;\n mergeCells: PmCommand;\n splitCell: PmCommand;\n toggleHeaderRow: PmCommand;\n toggleHeaderColumn: PmCommand;\n goToNextCell: (dir: 1 | -1) => PmCommand;\n};\ntype PmCommand = (state: unknown, dispatch?: (tr: unknown) => void) => boolean;\n\ninterface PmView {\n state: {\n tr: unknown;\n doc: {\n descendants: (\n cb: (\n node: { type: { name: string }; nodeSize: number },\n pos: number,\n ) => void,\n ) => void;\n };\n };\n dispatch: (tr: unknown) => void;\n}\n\nlet _tablesCache: PmTables | null = null;\nlet _tablesPromise: Promise<PmTables> | null = null;\n\nasync function loadTables(): Promise<PmTables> {\n if (_tablesCache) return _tablesCache;\n if (!_tablesPromise) {\n _tablesPromise = (\n import(\n \"prosemirror-tables\" as string as never\n ) as unknown as Promise<unknown>\n ).then((mod) => {\n _tablesCache = mod as PmTables;\n return _tablesCache;\n });\n }\n return _tablesPromise;\n}\n\nfunction getView(ctx: EditorContext): PmView | null {\n return (ctx as unknown as { _prosemirror?: PmView })._prosemirror ?? null;\n}\n\n// ─── Table Addon ─────────────────────────────────────────────────────────────\n\nexport const TableAddonImpl = {\n id: \"x/table\",\n\n initSchema(ctx: SchemaContext): void {\n // Schema mirrors prosemirror-tables' default node shapes. Names are\n // camelCase to match the editor's convention; the `tableRole` attribute\n // tells the prosemirror-tables plugin which logical role each node plays.\n ctx.addNode({\n name: \"table\",\n group: \"block\",\n content: \"tableRow+\",\n tableRole: \"table\",\n isolating: true,\n parseDOM: [{ tag: \"table\" }],\n toDOM: () => [\"table\", [\"tbody\", 0]],\n } as unknown as Parameters<SchemaContext[\"addNode\"]>[0]);\n ctx.addNode({\n name: \"tableRow\",\n content: \"(tableHeader | tableCell)+\",\n tableRole: \"row\",\n parseDOM: [{ tag: \"tr\" }],\n toDOM: () => [\"tr\", 0],\n } as unknown as Parameters<SchemaContext[\"addNode\"]>[0]);\n ctx.addNode({\n name: \"tableHeader\",\n content: \"block+\",\n tableRole: \"header_cell\",\n isolating: true,\n attrs: {\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null },\n align: { default: null },\n background: { default: null },\n },\n parseDOM: [\n {\n tag: \"th\",\n getAttrs: (el: HTMLElement) => readCellAttrs(el),\n },\n ],\n toDOM: (node: { attrs: Record<string, unknown> }) => [\n \"th\",\n cellDomAttrs(node.attrs),\n 0,\n ],\n } as unknown as Parameters<SchemaContext[\"addNode\"]>[0]);\n ctx.addNode({\n name: \"tableCell\",\n content: \"block+\",\n tableRole: \"cell\",\n isolating: true,\n attrs: {\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null },\n align: { default: null },\n background: { default: null },\n },\n parseDOM: [\n {\n tag: \"td\",\n getAttrs: (el: HTMLElement) => readCellAttrs(el),\n },\n ],\n toDOM: (node: { attrs: Record<string, unknown> }) => [\n \"td\",\n cellDomAttrs(node.attrs),\n 0,\n ],\n } as unknown as Parameters<SchemaContext[\"addNode\"]>[0]);\n },\n\n init(ctx: EditorContext, config?: TableAddonConfig): AddonInstance {\n // Kick the load. Most consumers will hit a command after at least one\n // event-loop tick has elapsed, so by the time the user clicks \"Add Row\"\n // the module is already resolved.\n void loadTables();\n\n // Insert: shape the JSON tree ourselves — no prosemirror-tables needed.\n ctx.commands.register({\n id: \"insertTable\",\n label: \"Insert Table\",\n icon: \"table\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | { rows?: number; cols?: number; withHeader?: boolean }\n | undefined) ?? {};\n const maxCols = config?.maxCols ?? 20;\n const maxRows = config?.maxRows ?? 100;\n const rows = clamp(a.rows ?? 3, 1, maxRows);\n const cols = clamp(a.cols ?? 3, 1, maxCols);\n const header = a.withHeader ?? true;\n const headerRow = header\n ? [\n {\n type: \"tableRow\",\n content: Array.from({ length: cols }, () => ({\n type: \"tableHeader\",\n content: [{ type: \"paragraph\" }],\n })),\n },\n ]\n : [];\n const bodyRows = Array.from(\n { length: header ? Math.max(0, rows - 1) : rows },\n () => ({\n type: \"tableRow\",\n content: Array.from({ length: cols }, () => ({\n type: \"tableCell\",\n content: [{ type: \"paragraph\" }],\n })),\n }),\n );\n c.insertNode(\"table\", undefined, [\n ...headerRow,\n ...bodyRows,\n ] as unknown as import(\"@thescaffold/editor-core\").Content);\n return true;\n },\n });\n\n // Row commands\n registerTableCommand(\n ctx,\n \"addRowBefore\",\n \"Add Row Before\",\n (t) => t.addRowBefore,\n );\n registerTableCommand(\n ctx,\n \"addRowAfter\",\n \"Add Row After\",\n (t) => t.addRowAfter,\n );\n registerTableCommand(ctx, \"deleteRow\", \"Delete Row\", (t) => t.deleteRow);\n\n // Column commands. Both naming conventions are exposed because tests and\n // existing consumer call sites use both `addCol*` and `addColumn*`.\n registerTableCommand(\n ctx,\n \"addColumnBefore\",\n \"Add Column Before\",\n (t) => t.addColumnBefore,\n );\n registerTableCommand(\n ctx,\n \"addColumnAfter\",\n \"Add Column After\",\n (t) => t.addColumnAfter,\n );\n registerTableCommand(\n ctx,\n \"deleteColumn\",\n \"Delete Column\",\n (t) => t.deleteColumn,\n );\n registerTableCommand(\n ctx,\n \"addColBefore\",\n \"Add Column Before\",\n (t) => t.addColumnBefore,\n );\n registerTableCommand(\n ctx,\n \"addColAfter\",\n \"Add Column After\",\n (t) => t.addColumnAfter,\n );\n registerTableCommand(\n ctx,\n \"deleteCol\",\n \"Delete Column\",\n (t) => t.deleteColumn,\n );\n\n // Cell operations\n registerTableCommand(ctx, \"mergeCells\", \"Merge Cells\", (t) => t.mergeCells);\n registerTableCommand(ctx, \"splitCell\", \"Split Cell\", (t) => t.splitCell);\n registerTableCommand(\n ctx,\n \"toggleHeaderRow\",\n \"Toggle Header Row\",\n (t) => t.toggleHeaderRow,\n );\n registerTableCommand(\n ctx,\n \"toggleHeaderCol\",\n \"Toggle Header Column\",\n (t) => t.toggleHeaderColumn,\n );\n registerTableCommand(\n ctx,\n \"toggleHeaderColumn\",\n \"Toggle Header Column\",\n (t) => t.toggleHeaderColumn,\n );\n registerTableCommand(ctx, \"goToNextCell\", \"Next Cell\", (t) =>\n t.goToNextCell(1),\n );\n registerTableCommand(ctx, \"goToPrevCell\", \"Previous Cell\", (t) =>\n t.goToNextCell(-1),\n );\n\n // Cell attribute commands.\n ctx.commands.register({\n id: \"setCellAlignment\",\n label: \"Set Cell Alignment\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const align = (args as { align?: string } | undefined)?.align ?? null;\n return setCellAttr(c, \"align\", align);\n },\n });\n ctx.commands.register({\n id: \"setCellBackground\",\n label: \"Set Cell Background\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const bg =\n (args as { background?: string; color?: string } | undefined)\n ?.background ??\n (args as { color?: string } | undefined)?.color ??\n null;\n return setCellAttr(c, \"background\", bg);\n },\n });\n\n // Delete the containing (or first) table.\n ctx.commands.register({\n id: \"deleteTable\",\n label: \"Delete Table\",\n icon: \"table-delete\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n const view = getView(c);\n if (!view) return false;\n // If tables is loaded, prefer its selection-aware deleteTable.\n if (_tablesCache) {\n const ok = _tablesCache.deleteTable(view.state, view.dispatch);\n if (ok) return true;\n }\n // Fallback: locate the first table and remove it.\n const found = findTableNode(view);\n if (!found) return false;\n const tr = (\n view.state.tr as unknown as {\n delete: (f: number, t: number) => unknown;\n }\n ).delete(found.from, found.from + found.size);\n view.dispatch(tr);\n return true;\n },\n });\n\n // We deliberately DO NOT install prosemirror-tables' tableEditing /\n // columnResizing plugins from this addon. Adding plugins post-mount\n // requires EditorState.reconfigure, which forces PM to destroyPluginViews\n // — and y-prosemirror's yUndoPlugin destroys its UndoManager in that\n // hook (see node_modules/y-prosemirror/.../yUndoPlugin view.destroy).\n // The undo stack would silently disappear, breaking per-peer undo\n // (the ws-undo-scope integration test catches this exact regression).\n //\n // The row/column/header/cell commands above call prosemirror-tables\n // commands directly, which only need the schema's tableRole attrs to\n // work. For cell-selection / Tab nav / resize handles, consumers pass\n // `tableEditing()` and `columnResizing()` via `EditorConfig.extraPlugins`\n // — see the TableAddonConfig.resizable JSDoc for the snippet.\n\n return {};\n },\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n));\n}\n\nfunction readCellAttrs(el: HTMLElement): Record<string, unknown> {\n const colspan = parseInt(el.getAttribute(\"colspan\") ?? \"1\", 10);\n const rowspan = parseInt(el.getAttribute(\"rowspan\") ?? \"1\", 10);\n const widthAttr = el.getAttribute(\"data-colwidth\");\n let colwidth: number[] | null = null;\n if (widthAttr) {\n const widths = widthAttr.split(\",\").map((s) => parseInt(s, 10));\n if (widths.every((w) => !isNaN(w)) && widths.length === colspan) {\n colwidth = widths;\n }\n }\n const align = el.style.textAlign || el.getAttribute(\"data-align\") || null;\n const background =\n el.style.backgroundColor || el.getAttribute(\"data-background\") || null;\n return { colspan, rowspan, colwidth, align, background };\n}\n\nfunction cellDomAttrs(attrs: Record<string, unknown>): Record<string, string> {\n const out: Record<string, string> = {};\n const colspan = (attrs[\"colspan\"] as number) ?? 1;\n const rowspan = (attrs[\"rowspan\"] as number) ?? 1;\n if (colspan !== 1) out[\"colspan\"] = String(colspan);\n if (rowspan !== 1) out[\"rowspan\"] = String(rowspan);\n const colwidth = attrs[\"colwidth\"] as number[] | null;\n if (colwidth) out[\"data-colwidth\"] = colwidth.join(\",\");\n const align = attrs[\"align\"] as string | null;\n const background = attrs[\"background\"] as string | null;\n const styles: string[] = [];\n if (align) styles.push(`text-align:${align}`);\n if (background) styles.push(`background-color:${background}`);\n if (styles.length > 0) out[\"style\"] = styles.join(\";\");\n if (align) out[\"data-align\"] = align;\n if (background) out[\"data-background\"] = background;\n return out;\n}\n\nfunction registerTableCommand(\n ctx: EditorContext,\n id: string,\n label: string,\n pick: (t: PmTables) => PmCommand,\n): void {\n ctx.commands.register({\n id,\n label,\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n const view = getView(c);\n if (!view) return false;\n if (_tablesCache) {\n const cmd = pick(_tablesCache);\n if (!cmd) return false;\n return cmd(view.state, view.dispatch);\n }\n // Module not yet ready. Kick the import — the next call will succeed.\n void loadTables();\n return false;\n },\n });\n}\n\nfunction setCellAttr(\n ctx: EditorContext,\n name: string,\n value: unknown,\n): boolean {\n const view = getView(ctx);\n if (!view) return false;\n if (!_tablesCache) {\n void loadTables();\n return false;\n }\n return _tablesCache.setCellAttr(name, value)(view.state, view.dispatch);\n}\n\nfunction findTableNode(view: PmView): { from: number; size: number } | null {\n let result: { from: number; size: number } | null = null;\n view.state.doc.descendants((node, pos) => {\n if (!result && node.type.name === \"table\") {\n result = { from: pos, size: node.nodeSize };\n }\n });\n return result;\n}\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n SchemaContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Image ────────────────────────────────────────────────────────────────────\n\nexport interface ImageAddonConfig {\n upload: (file: File) => Promise<string>;\n maxSizeMB?: number;\n allowedTypes?: string[];\n defaultAlign?: \"left\" | \"center\" | \"right\" | \"full\";\n}\n\nexport function ImageAddon(\n config: ImageAddonConfig,\n): AddonDefinition<ImageAddonConfig> {\n return {\n id: \"x/image\",\n config,\n dependencies: [\"x/schema\"],\n impl: ImageAddonImpl,\n };\n}\n\nexport const ImageAddonImpl = {\n id: \"x/image\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"image\",\n group: \"block\",\n atom: true,\n draggable: true,\n attrs: {\n src: {},\n alt: { default: \"\" },\n title: { default: null },\n width: { default: null },\n align: { default: \"center\" },\n },\n parseDOM: [\n {\n tag: \"img[src]\",\n getAttrs: (el: Element) => ({\n src: el.getAttribute(\"src\"),\n alt: el.getAttribute(\"alt\"),\n title: el.getAttribute(\"title\"),\n }),\n },\n ],\n toDOM: (node: { attrs: Record<string, string> }) => [\"img\", node.attrs],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertImage\",\n label: \"Image\",\n icon: \"image\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | {\n src?: string;\n alt?: string;\n title?: string;\n width?: number;\n align?: string;\n }\n | undefined) ?? {};\n if (!a.src) return false;\n c.insertNode(\"image\", {\n src: a.src,\n alt: a.alt ?? \"\",\n title: a.title ?? null,\n width: a.width ?? null,\n align: a.align ?? \"center\",\n });\n return true;\n },\n });\n ctx.commands.register({\n id: \"setImageAlt\",\n label: \"Set Image Alt\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"setImageSize\",\n label: \"Set Image Size\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"alignImageLeft\",\n label: \"Align Image Left\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"alignImageCenter\",\n label: \"Align Image Center\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"alignImageRight\",\n label: \"Align Image Right\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"alignImageFull\",\n label: \"Align Image Full\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Video ────────────────────────────────────────────────────────────────────\n\nexport interface VideoAddonConfig {\n upload?: (file: File) => Promise<string>;\n providers?: (\"youtube\" | \"vimeo\" | \"loom\")[];\n}\n\nexport function VideoAddon(\n config?: VideoAddonConfig,\n): AddonDefinition<VideoAddonConfig> {\n return {\n id: \"x/video\",\n config,\n dependencies: [\"x/schema\"],\n impl: VideoAddonImpl,\n };\n}\n\nexport const VideoAddonImpl = {\n id: \"x/video\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"video\",\n group: \"block\",\n atom: true,\n attrs: {\n src: {},\n provider: { default: \"upload\" },\n poster: { default: null },\n width: { default: null },\n },\n parseDOM: [\n {\n tag: \"video[src]\",\n getAttrs: (el: Element) => ({ src: el.getAttribute(\"src\") }),\n },\n ],\n toDOM: (node: { attrs: Record<string, string> }) => [\n \"video\",\n { src: node.attrs[\"src\"], controls: \"true\" },\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertVideo\",\n label: \"Video\",\n icon: \"video\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | {\n src?: string;\n provider?: string;\n poster?: string;\n width?: number;\n }\n | undefined) ?? {};\n if (!a.src) return false;\n c.insertNode(\"video\", {\n src: a.src,\n provider: a.provider ?? \"upload\",\n poster: a.poster ?? null,\n width: a.width ?? null,\n });\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Audio ────────────────────────────────────────────────────────────────────\n\nexport interface AudioAddonConfig {\n upload?: (file: File) => Promise<string>;\n}\n\nexport function AudioAddon(\n config?: AudioAddonConfig,\n): AddonDefinition<AudioAddonConfig> {\n return {\n id: \"x/audio\",\n config,\n dependencies: [\"x/schema\"],\n impl: AudioAddonImpl,\n };\n}\n\nexport const AudioAddonImpl = {\n id: \"x/audio\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"audio\",\n group: \"block\",\n atom: true,\n attrs: { src: {}, title: { default: \"\" } },\n parseDOM: [\n {\n tag: \"audio[src]\",\n getAttrs: (el: Element) => ({ src: el.getAttribute(\"src\") }),\n },\n ],\n toDOM: (node: { attrs: Record<string, string> }) => [\n \"audio\",\n { src: node.attrs[\"src\"], controls: \"true\" },\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertAudio\",\n label: \"Audio\",\n icon: \"audio\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a = (args as { src?: string; title?: string } | undefined) ?? {};\n if (!a.src) return false;\n c.insertNode(\"audio\", { src: a.src, title: a.title ?? \"\" });\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── File ─────────────────────────────────────────────────────────────────────\n\nexport interface FileAddonConfig {\n upload: (\n file: File,\n ) => Promise<{ url: string; name: string; size: number; mimeType: string }>;\n maxSizeMB?: number;\n}\n\nexport function FileAddon(\n config: FileAddonConfig,\n): AddonDefinition<FileAddonConfig> {\n return {\n id: \"x/file\",\n config,\n dependencies: [\"x/schema\"],\n impl: FileAddonImpl,\n };\n}\n\nexport const FileAddonImpl = {\n id: \"x/file\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"file\",\n group: \"block\",\n atom: true,\n attrs: {\n src: {},\n name: {},\n size: { default: 0 },\n mimeType: { default: \"\" },\n },\n parseDOM: [{ tag: \"a[data-file]\" }],\n toDOM: (node: { attrs: Record<string, unknown> }) => [\n \"a\",\n {\n href: node.attrs[\"src\"],\n download: node.attrs[\"name\"],\n \"data-file\": \"true\",\n },\n String(node.attrs[\"name\"]),\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertFile\",\n label: \"File\",\n icon: \"file\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | {\n src?: string;\n url?: string;\n name?: string;\n size?: number;\n mimeType?: string;\n }\n | undefined) ?? {};\n const src = a.src ?? a.url;\n if (!src) return false;\n c.insertNode(\"file\", {\n src,\n name: a.name ?? \"file\",\n size: a.size ?? 0,\n mimeType: a.mimeType ?? \"\",\n });\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Embed ────────────────────────────────────────────────────────────────────\n\nexport interface EmbedProvider {\n id: string;\n name: string;\n match: RegExp;\n toEmbedUrl: (url: string) => string;\n}\n\nexport interface EmbedAddonConfig {\n providers?: EmbedProvider[];\n allowedDomains?: string[];\n}\n\nexport function EmbedAddon(\n config?: EmbedAddonConfig,\n): AddonDefinition<EmbedAddonConfig> {\n return {\n id: \"x/embed\",\n config,\n dependencies: [\"x/schema\"],\n impl: EmbedAddonImpl,\n };\n}\n\nexport const EmbedAddonImpl = {\n id: \"x/embed\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"embed\",\n group: \"block\",\n atom: true,\n attrs: {\n url: {},\n provider: { default: \"\" },\n width: { default: null },\n height: { default: null },\n },\n parseDOM: [{ tag: \"iframe[data-embed]\" }],\n toDOM: (node: { attrs: Record<string, unknown> }) => [\n \"iframe\",\n { src: node.attrs[\"url\"], \"data-embed\": \"true\", class: \"xe-embed\" },\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertEmbed\",\n label: \"Embed\",\n icon: \"embed\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | {\n url?: string;\n provider?: string;\n width?: number;\n height?: number;\n }\n | undefined) ?? {};\n if (!a.url) return false;\n c.insertNode(\"embed\", {\n url: a.url,\n provider: a.provider ?? \"\",\n width: a.width ?? null,\n height: a.height ?? null,\n });\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Bookmark ─────────────────────────────────────────────────────────────────\n\nexport interface OGMetadata {\n title?: string;\n description?: string;\n image?: string;\n favicon?: string;\n url: string;\n}\n\nexport interface BookmarkAddonConfig {\n fetchMetadata: (url: string) => Promise<OGMetadata>;\n}\n\nexport function BookmarkAddon(\n config: BookmarkAddonConfig,\n): AddonDefinition<BookmarkAddonConfig> {\n return {\n id: \"x/bookmark\",\n config,\n dependencies: [\"x/schema\"],\n impl: BookmarkAddonImpl,\n };\n}\n\nexport const BookmarkAddonImpl = {\n id: \"x/bookmark\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"bookmark\",\n group: \"block\",\n atom: true,\n attrs: {\n url: {},\n title: { default: \"\" },\n description: { default: \"\" },\n image: { default: null },\n favicon: { default: null },\n },\n parseDOM: [{ tag: \"div[data-bookmark]\" }],\n toDOM: () => [\"div\", { \"data-bookmark\": \"true\", class: \"xe-bookmark\" }],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertBookmark\",\n label: \"Bookmark\",\n icon: \"bookmark\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | {\n url?: string;\n title?: string;\n description?: string;\n image?: string;\n favicon?: string;\n }\n | undefined) ?? {};\n if (!a.url) return false;\n c.insertNode(\"bookmark\", {\n url: a.url,\n title: a.title ?? \"\",\n description: a.description ?? \"\",\n image: a.image ?? null,\n favicon: a.favicon ?? null,\n });\n return true;\n },\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n SchemaContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Link ─────────────────────────────────────────────────────────────────────\n\nexport interface LinkAddonConfig {\n autoLink?: boolean;\n defaultTarget?: \"_blank\" | \"_self\";\n validate?: (url: string) => boolean;\n}\n\nexport function LinkAddon(\n config?: LinkAddonConfig,\n): AddonDefinition<LinkAddonConfig> {\n return {\n id: \"x/link\",\n config,\n dependencies: [\"x/schema\"],\n impl: LinkAddonImpl,\n };\n}\n\nexport const LinkAddonImpl = {\n id: \"x/link\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"link\",\n attrs: {\n href: {},\n title: { default: null },\n target: { default: \"_blank\" },\n },\n inclusive: false,\n parseDOM: [\n {\n tag: \"a[href]\",\n getAttrs: (el: Element) => ({\n href: el.getAttribute(\"href\"),\n title: el.getAttribute(\"title\"),\n target: el.getAttribute(\"target\"),\n }),\n },\n ],\n toDOM: (mark: { attrs: Record<string, string> }) => [\"a\", mark.attrs, 0],\n });\n },\n init(ctx: EditorContext, config: LinkAddonConfig = {}): AddonInstance {\n ctx.commands.register({\n id: \"insertLink\",\n label: \"Insert Link\",\n icon: \"link\",\n shortcut: \"Mod-k\",\n isEnabled: () => true,\n isActive: (c) => c.selection.hasMark(\"link\"),\n execute: (c, args) => {\n const a =\n (args as\n | { href?: string; title?: string | null; target?: string }\n | undefined) ?? {};\n let url = a.href;\n if (!url) {\n if (typeof window === \"undefined\") return false;\n const prompted = window.prompt(\"Enter URL\", \"https://\");\n if (!prompted) return false;\n url = prompted;\n }\n if (config.validate && !config.validate(url)) return false;\n c.addMark(\"link\", {\n href: url,\n title: a.title ?? null,\n target: a.target ?? config.defaultTarget ?? \"_blank\",\n });\n return true;\n },\n });\n ctx.commands.register({\n id: \"editLink\",\n label: \"Edit Link\",\n isEnabled: (c) => c.selection.hasMark(\"link\"),\n isActive: () => false,\n execute: (c) => {\n if (typeof window === \"undefined\") return false;\n const url = window.prompt(\"Edit URL\", \"https://\");\n if (!url) return false;\n c.addMark(\"link\", {\n href: url,\n target: config.defaultTarget ?? \"_blank\",\n });\n return true;\n },\n });\n ctx.commands.register({\n id: \"removeLink\",\n label: \"Remove Link\",\n isEnabled: (c) => c.selection.hasMark(\"link\"),\n isActive: () => false,\n execute: (c) => {\n c.removeMark(\"link\");\n return true;\n },\n });\n ctx.commands.register({\n id: \"openLink\",\n label: \"Open Link\",\n isEnabled: (c) => c.selection.hasMark(\"link\"),\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Mention ──────────────────────────────────────────────────────────────────\n\nexport interface MentionItem {\n id: string;\n label: string;\n [key: string]: unknown;\n}\n\nexport interface MentionType {\n id: string;\n trigger?: string;\n search(query: string): Promise<MentionItem[]>;\n renderItem?: (item: MentionItem) => HTMLElement;\n renderNode?: (item: MentionItem) => HTMLElement;\n}\n\nexport interface MentionAddonConfig {\n trigger?: string;\n types: MentionType[];\n}\n\nexport function MentionAddon(\n config: MentionAddonConfig,\n): AddonDefinition<MentionAddonConfig> {\n return {\n id: \"x/mention\",\n config,\n dependencies: [\"x/schema\"],\n impl: MentionAddonImpl,\n };\n}\n\nexport const MentionAddonImpl = {\n id: \"x/mention\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"mention\",\n group: \"inline\",\n inline: true,\n atom: true,\n attrs: { id: {}, label: {}, type: { default: \"user\" } },\n parseDOM: [{ tag: \"span[data-mention]\" }],\n toDOM: (node: { attrs: Record<string, string> }) => [\n \"span\",\n {\n \"data-mention\": node.attrs[\"type\"],\n \"data-id\": node.attrs[\"id\"],\n class: \"xe-mention\",\n },\n `@${node.attrs[\"label\"]}`,\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertMention\",\n label: \"Mention\",\n icon: \"mention\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | { id?: string; label?: string; type?: string }\n | undefined) ?? {};\n if (!a.id || !a.label) return false;\n c.insertNode(\"mention\", {\n id: a.id,\n label: a.label,\n type: a.type ?? \"user\",\n });\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Emoji ────────────────────────────────────────────────────────────────────\n\nexport interface EmojiAddonConfig {\n trigger?: string;\n skinTone?: number;\n}\n\nexport function EmojiAddon(\n config?: EmojiAddonConfig,\n): AddonDefinition<EmojiAddonConfig> {\n return {\n id: \"x/emoji\",\n config,\n dependencies: [\"x/schema\"],\n impl: EmojiAddonImpl,\n };\n}\n\nexport const EmojiAddonImpl = {\n id: \"x/emoji\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"emoji\",\n group: \"inline\",\n inline: true,\n atom: true,\n attrs: { id: {}, native: {} },\n parseDOM: [{ tag: \"span[data-emoji]\" }],\n toDOM: (node: { attrs: Record<string, string> }) => [\n \"span\",\n { \"data-emoji\": node.attrs[\"id\"], class: \"xe-emoji\" },\n node.attrs[\"native\"],\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertEmoji\",\n label: \"Emoji\",\n icon: \"emoji\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | { id?: string; native?: string; shortcode?: string }\n | undefined) ?? {};\n const id = a.id ?? a.shortcode ?? \"smile\";\n const native = a.native ?? \"🙂\";\n c.insertNode(\"emoji\", { id, native });\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Equation ─────────────────────────────────────────────────────────────────\n\nexport interface EquationAddonConfig {\n katexOptions?: Record<string, unknown>;\n macros?: Record<string, string>;\n}\n\nexport function EquationAddon(\n config?: EquationAddonConfig,\n): AddonDefinition<EquationAddonConfig> {\n return {\n id: \"x/equation\",\n config,\n dependencies: [\"x/schema\"],\n impl: EquationAddonImpl,\n };\n}\n\nexport const EquationAddonImpl = {\n id: \"x/equation\",\n initSchema(ctx: SchemaContext): void {\n ctx.addMark({\n name: \"equation\",\n parseDOM: [{ tag: \"span[data-equation]\" }],\n toDOM: () => [\n \"span\",\n { \"data-equation\": \"true\", class: \"xe-equation-inline\" },\n 0,\n ],\n });\n ctx.addNode({\n name: \"equationBlock\",\n group: \"block\",\n atom: true,\n attrs: { src: {} },\n parseDOM: [{ tag: \"div[data-equation-block]\" }],\n toDOM: () => [\n \"div\",\n { \"data-equation-block\": \"true\", class: \"xe-equation-block\" },\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertEquationBlock\",\n label: \"Equation Block\",\n icon: \"equation-block\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const src =\n (args as { latex?: string; src?: string } | undefined)?.latex ??\n (args as { src?: string } | undefined)?.src ??\n \"\";\n c.insertNode(\"equationBlock\", { src });\n return true;\n },\n });\n // Generic alias matching the addon name.\n ctx.commands.register({\n id: \"insertEquation\",\n label: \"Equation\",\n icon: \"equation\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => c.execCommand(\"insertEquationBlock\", args),\n });\n ctx.commands.register({\n id: \"insertInlineEquation\",\n label: \"Inline Equation\",\n icon: \"equation\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n c.addMark(\"equation\");\n return true;\n },\n });\n ctx.commands.register({\n id: \"editEquation\",\n label: \"Edit Equation\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Footnote ─────────────────────────────────────────────────────────────────\n\nexport function FootnoteAddon(): AddonDefinition {\n return {\n id: \"x/footnote\",\n dependencies: [\"x/schema\"],\n impl: FootnoteAddonImpl,\n };\n}\n\nexport const FootnoteAddonImpl = {\n id: \"x/footnote\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"footnoteRef\",\n group: \"inline\",\n inline: true,\n atom: true,\n attrs: { id: {}, index: { default: 1 } },\n parseDOM: [{ tag: \"sup[data-footnote-ref]\" }],\n toDOM: (node: { attrs: Record<string, unknown> }) => [\n \"sup\",\n { \"data-footnote-ref\": node.attrs[\"id\"], class: \"xe-footnote-ref\" },\n `[${node.attrs[\"index\"]}]`,\n ],\n });\n ctx.addNode({\n name: \"footnote\",\n group: \"block\",\n content: \"block+\",\n attrs: { id: {} },\n parseDOM: [{ tag: \"div[data-footnote]\" }],\n toDOM: () => [\n \"div\",\n { \"data-footnote\": \"true\", class: \"xe-footnote\" },\n 0,\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n let _footnoteCounter = 0;\n ctx.commands.register({\n id: \"insertFootnote\",\n label: \"Footnote\",\n icon: \"footnote\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | { id?: string; text?: string; index?: number }\n | undefined) ?? {};\n const id = a.id ?? `fn-${++_footnoteCounter}`;\n // Insert an inline ref. The matching footnote body would normally be\n // appended at the end of the doc; we keep it simple here.\n c.insertNode(\"footnote\", { id }, [\n {\n type: \"paragraph\",\n content: a.text ? [{ type: \"text\", text: a.text }] : [],\n },\n ] as unknown as import(\"@thescaffold/editor-core\").Content);\n return true;\n },\n });\n ctx.commands.register({\n id: \"editFootnote\",\n label: \"Edit Footnote\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Smart Chip ───────────────────────────────────────────────────────────────\n\nexport interface PersonProvider {\n search(\n query: string,\n ): Promise<{ id: string; name: string; avatar?: string }[]>;\n}\n\nexport interface FileChipProvider {\n search(query: string): Promise<{ id: string; name: string; icon?: string }[]>;\n}\n\nexport interface SmartChipAddonConfig {\n date?: { formats?: string[]; relative?: boolean };\n person?: { provider: PersonProvider };\n place?: { mapProvider?: \"google\" | \"osm\" };\n file?: { provider: FileChipProvider };\n variables?: { variables: Record<string, string> };\n}\n\nexport function SmartChipAddon(\n config?: SmartChipAddonConfig,\n): AddonDefinition<SmartChipAddonConfig> {\n return {\n id: \"x/smart-chip\",\n config,\n dependencies: [\"x/mention\"],\n impl: SmartChipAddonImpl,\n };\n}\n\nexport const SmartChipAddonImpl = {\n id: \"x/smart-chip\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"smartChip\",\n group: \"inline\",\n inline: true,\n atom: true,\n attrs: {\n kind: { default: \"generic\" },\n value: { default: \"\" },\n label: { default: null },\n },\n parseDOM: [{ tag: \"span[data-smart-chip]\" }],\n toDOM: (node: { attrs: Record<string, string> }) => [\n \"span\",\n {\n \"data-smart-chip\": node.attrs[\"kind\"],\n \"data-value\": node.attrs[\"value\"],\n class: \"xe-smart-chip\",\n },\n String(node.attrs[\"label\"] ?? node.attrs[\"value\"]),\n ],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertSmartChip\",\n label: \"Smart Chip\",\n icon: \"smart-chip\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c, args) => {\n const a =\n (args as\n | { kind?: string; value?: string; label?: string }\n | undefined) ?? {};\n c.insertNode(\"smartChip\", {\n kind: a.kind ?? \"generic\",\n value: a.value ?? \"\",\n label: a.label ?? null,\n });\n return true;\n },\n });\n return {};\n },\n};\n","// CommandGroup — reusable button-group primitive used by the toolbar, bubble\n// menu, slash menu, and link editor popover. Renders a row (or column) of\n// command buttons backed by the EditorContext's CommandRegistry, with:\n//\n// - role=\"group\" and aria-orientation so screen readers announce a logical\n// cluster of related controls\n// - roving tabindex + arrow-key navigation that stays scoped to the group\n// even when the group is mounted inside a portal/popover (so opening a\n// bubble menu and pressing ArrowRight cycles buttons instead of bouncing\n// focus back to the editor)\n// - active / disabled / loading visual + a11y states sourced from the\n// CommandSpec predicates plus a caller-supplied `loading` set\n// - a \"compact\" density variant that pairs with mode=\"popover\"\n//\n// Example — inline (toolbar):\n// const grp = createCommandGroup(ctx, {\n// commands: [\"bold\", \"italic\", \"underline\"],\n// mode: \"inline\",\n// });\n// container.appendChild(grp.el);\n// ctx.on(\"selection:change\", grp.update);\n//\n// Example — popover (bubble menu, compact, single group):\n// const grp = createCommandGroup(ctx, {\n// commands: [\"bold\", \"italic\", \"insertLink\"],\n// mode: \"popover\",\n// density: \"compact\",\n// });\n// bubble.appendChild(grp.el);\n\nimport type { CommandSpec, EditorContext } from \"@thescaffold/editor-core\";\n\nexport type CommandGroupMode = \"inline\" | \"popover\";\nexport type CommandGroupDensity = \"comfortable\" | \"compact\";\nexport type CommandGroupOrientation = \"horizontal\" | \"vertical\";\n\nexport interface CommandGroupOptions {\n /** Command IDs to render, in order. Unknown IDs are skipped. */\n commands: string[];\n /** Accessible label for the group (role=\"group\" aria-label). */\n label?: string;\n /** Inline = toolbar style; popover = bubble/slash/link-editor style. */\n mode?: CommandGroupMode;\n /** Comfortable default; compact for popovers. */\n density?: CommandGroupDensity;\n /** Sets aria-orientation and flex direction. */\n orientation?: CommandGroupOrientation;\n /** Render the command label next to the icon. */\n showLabels?: boolean;\n /** Show the title (tooltip) attribute. */\n showTooltips?: boolean;\n /** Command IDs that are currently in a loading state. */\n loading?: Set<string>;\n /** Optional intercept; defaults to ctx.execCommand(cmd.id). */\n onActivate?: (cmdId: string) => void;\n}\n\nexport interface CommandGroupHandle {\n readonly el: HTMLElement;\n /** Re-evaluate isEnabled/isActive/loading and update DOM state. Idempotent. */\n update(): void;\n /** Move focus to the first non-disabled button. No-op if all disabled. */\n focusFirst(): void;\n /** Move focus to the last non-disabled button. No-op if all disabled. */\n focusLast(): void;\n /** Update the loading set without recreating the group. */\n setLoading(loading: Set<string>): void;\n /** Remove the group and detach listeners. */\n destroy(): void;\n}\n\ninterface ButtonEntry {\n cmdId: string;\n cmd: CommandSpec;\n btn: HTMLButtonElement;\n}\n\nexport function createCommandGroup(\n ctx: EditorContext,\n opts: CommandGroupOptions,\n): CommandGroupHandle {\n const mode: CommandGroupMode = opts.mode ?? \"inline\";\n const density: CommandGroupDensity =\n opts.density ?? (mode === \"popover\" ? \"compact\" : \"comfortable\");\n const orientation: CommandGroupOrientation = opts.orientation ?? \"horizontal\";\n const showLabels = opts.showLabels ?? false;\n const showTooltips = opts.showTooltips ?? true;\n let loading: Set<string> = opts.loading ?? new Set();\n\n const el = document.createElement(\"div\");\n el.className = `xe-cgroup xe-cgroup--${mode} xe-cgroup--${density} xe-cgroup--${orientation}`;\n el.setAttribute(\"role\", \"group\");\n el.setAttribute(\"aria-orientation\", orientation);\n if (opts.label) el.setAttribute(\"aria-label\", opts.label);\n\n const entries: ButtonEntry[] = [];\n\n for (const cmdId of opts.commands) {\n const cmd = ctx.commands.get(cmdId);\n if (!cmd) continue;\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"xe-cgroup__btn\";\n btn.dataset[\"cmdId\"] = cmdId;\n btn.setAttribute(\"aria-label\", cmd.label);\n btn.tabIndex = -1;\n\n if (cmd.icon) {\n const svg = ctx.icons.get(cmd.icon);\n const iconWrap = document.createElement(\"span\");\n iconWrap.className = \"xe-cgroup__icon\";\n iconWrap.innerHTML = svg ?? cmd.icon;\n btn.appendChild(iconWrap);\n }\n if (showLabels) {\n const label = document.createElement(\"span\");\n label.className = \"xe-cgroup__label\";\n label.textContent = cmd.label;\n btn.appendChild(label);\n }\n // Spinner appended lazily by update() when the command is in the loading\n // set — keeps the DOM tidy for the steady-state case.\n\n btn.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n if (btn.disabled) return;\n if (loading.has(cmdId)) return;\n if (opts.onActivate) opts.onActivate(cmdId);\n else ctx.execCommand(cmdId);\n });\n // Suppress focus stealing when mounted inside a popover: pointerdown\n // toggling preventDefault keeps the editor selection alive so commands\n // that read the selection (bold, italic, insertLink) operate on the\n // user's actual text.\n btn.addEventListener(\"mousedown\", (ev) => {\n ev.preventDefault();\n });\n\n el.appendChild(btn);\n entries.push({ cmdId, cmd, btn });\n }\n\n // ─── Roving tabindex ──────────────────────────────────────────────────────\n let activeIndex = entries.findIndex(\n (e) => !(e.cmd.isEnabled?.(ctx) === false),\n );\n if (activeIndex < 0 && entries.length > 0) activeIndex = 0;\n if (activeIndex >= 0) entries[activeIndex].btn.tabIndex = 0;\n\n const setActive = (next: number, focus: boolean) => {\n if (next < 0 || next >= entries.length) return;\n if (entries[next].btn.disabled) return;\n if (activeIndex >= 0 && activeIndex < entries.length) {\n entries[activeIndex].btn.tabIndex = -1;\n }\n activeIndex = next;\n entries[activeIndex].btn.tabIndex = 0;\n if (focus) entries[activeIndex].btn.focus();\n };\n\n const findNext = (from: number, dir: 1 | -1): number => {\n if (entries.length === 0) return -1;\n for (let i = 1; i <= entries.length; i++) {\n const idx = (from + dir * i + entries.length * i) % entries.length;\n if (!entries[idx].btn.disabled) return idx;\n }\n return -1;\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n const nextKey = orientation === \"horizontal\" ? \"ArrowRight\" : \"ArrowDown\";\n const prevKey = orientation === \"horizontal\" ? \"ArrowLeft\" : \"ArrowUp\";\n if (ev.key === nextKey) {\n ev.preventDefault();\n const n = findNext(activeIndex, 1);\n if (n >= 0) setActive(n, true);\n } else if (ev.key === prevKey) {\n ev.preventDefault();\n const n = findNext(activeIndex, -1);\n if (n >= 0) setActive(n, true);\n } else if (ev.key === \"Home\") {\n ev.preventDefault();\n for (let i = 0; i < entries.length; i++) {\n if (!entries[i].btn.disabled) {\n setActive(i, true);\n break;\n }\n }\n } else if (ev.key === \"End\") {\n ev.preventDefault();\n for (let i = entries.length - 1; i >= 0; i--) {\n if (!entries[i].btn.disabled) {\n setActive(i, true);\n break;\n }\n }\n }\n };\n el.addEventListener(\"keydown\", onKeyDown);\n\n const onFocusIn = (ev: FocusEvent) => {\n const target = ev.target as HTMLElement | null;\n if (!target) return;\n const idx = entries.findIndex((e) => e.btn === target);\n if (idx >= 0 && idx !== activeIndex) setActive(idx, false);\n };\n el.addEventListener(\"focusin\", onFocusIn);\n\n // ─── State sync ────────────────────────────────────────────────────────────\n const update = () => {\n for (const entry of entries) {\n const { cmd, btn, cmdId } = entry;\n const enabled = cmd.isEnabled?.(ctx) ?? true;\n const active = cmd.isActive?.(ctx) ?? false;\n const isLoading = loading.has(cmdId);\n\n btn.disabled = !enabled || isLoading;\n btn.setAttribute(\"aria-disabled\", String(!enabled));\n btn.setAttribute(\"aria-pressed\", String(active));\n if (isLoading) btn.setAttribute(\"aria-busy\", \"true\");\n else btn.removeAttribute(\"aria-busy\");\n\n btn.classList.toggle(\"xe-cgroup__btn--active\", active);\n btn.classList.toggle(\"xe-cgroup__btn--disabled\", !enabled);\n btn.classList.toggle(\"xe-cgroup__btn--loading\", isLoading);\n\n const tooltipText =\n showTooltips && cmd.label\n ? cmd.shortcut\n ? `${cmd.label} (${cmd.shortcut})`\n : cmd.label\n : \"\";\n if (tooltipText) btn.title = tooltipText;\n else btn.removeAttribute(\"title\");\n\n const hasSpinner = btn.querySelector(\".xe-cgroup__spinner\");\n if (isLoading && !hasSpinner) {\n const spinner = document.createElement(\"span\");\n spinner.className = \"xe-cgroup__spinner\";\n spinner.setAttribute(\"aria-hidden\", \"true\");\n btn.appendChild(spinner);\n } else if (!isLoading && hasSpinner) {\n hasSpinner.remove();\n }\n }\n if (\n activeIndex >= 0 &&\n activeIndex < entries.length &&\n entries[activeIndex].btn.disabled\n ) {\n const n = findNext(activeIndex, 1);\n if (n >= 0) setActive(n, false);\n }\n };\n update();\n\n const focusFirst = () => {\n const n = findNext(-1, 1);\n if (n >= 0) setActive(n, true);\n };\n const focusLast = () => {\n const n = findNext(entries.length, -1);\n if (n >= 0) setActive(n, true);\n };\n\n const setLoading = (next: Set<string>) => {\n loading = next;\n update();\n };\n\n const destroy = () => {\n el.removeEventListener(\"keydown\", onKeyDown);\n el.removeEventListener(\"focusin\", onFocusIn);\n el.remove();\n };\n\n return { el, update, focusFirst, focusLast, setLoading, destroy };\n}\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\nimport {\n createCommandGroup,\n type CommandGroupHandle,\n} from \"./command-group.js\";\n\nexport {\n createCommandGroup,\n type CommandGroupDensity,\n type CommandGroupHandle,\n type CommandGroupMode,\n type CommandGroupOptions,\n type CommandGroupOrientation,\n} from \"./command-group.js\";\n\n// ─── Toolbar ──────────────────────────────────────────────────────────────────\n\nexport interface ToolbarGroup {\n label?: string;\n commands: string[];\n}\n\nexport interface ToolbarAddonConfig {\n position?: \"top\" | \"bottom\" | \"sticky\";\n groups?: ToolbarGroup[];\n overflow?: \"scroll\" | \"dropdown\";\n showLabels?: boolean;\n showTooltips?: boolean;\n}\n\nexport function ToolbarAddon(\n config?: ToolbarAddonConfig,\n): AddonDefinition<ToolbarAddonConfig> {\n return {\n id: \"x/toolbar\",\n config,\n dependencies: [\"x/commands\"],\n impl: ToolbarAddonImpl,\n };\n}\n\nexport const ToolbarAddonImpl = {\n id: \"x/toolbar\",\n init(ctx: EditorContext, config: ToolbarAddonConfig = {}): AddonInstance {\n const container = ctx.getSlot(\"toolbar\");\n if (!container) return {};\n\n const toolbar = document.createElement(\"div\");\n toolbar.className = \"xe-toolbar\";\n toolbar.setAttribute(\"role\", \"toolbar\");\n container.appendChild(toolbar);\n\n let groupHandles: CommandGroupHandle[] = [];\n let lastGroupsKey = \"\";\n\n const render = () => {\n const groups = config.groups ?? [\n { commands: ctx.commands.getAll().map((c) => c.id) },\n ];\n const groupsKey = JSON.stringify(\n groups.map((g) => [g.label ?? \"\", g.commands]),\n );\n if (groupsKey === lastGroupsKey) {\n for (const h of groupHandles) h.update();\n return;\n }\n lastGroupsKey = groupsKey;\n for (const h of groupHandles) h.destroy();\n groupHandles = [];\n toolbar.innerHTML = \"\";\n for (const group of groups) {\n const handle = createCommandGroup(ctx, {\n commands: group.commands,\n label: group.label,\n mode: \"inline\",\n density: \"comfortable\",\n showLabels: config.showLabels,\n showTooltips: config.showTooltips,\n });\n toolbar.appendChild(handle.el);\n groupHandles.push(handle);\n }\n };\n\n render();\n const unsub = ctx.on(\"selection:change\", () => {\n for (const h of groupHandles) h.update();\n });\n const unsub2 = ctx.on(\"doc:change\", render);\n\n return {\n destroy() {\n unsub();\n unsub2();\n for (const h of groupHandles) h.destroy();\n groupHandles = [];\n toolbar.remove();\n },\n };\n },\n};\n\n// ─── Bubble Menu ─────────────────────────────────────────────────────────────\n\nexport interface BubbleMenuAddonConfig {\n commands?: string[];\n showOnCode?: boolean;\n delay?: number;\n}\n\nexport function BubbleMenuAddon(\n config?: BubbleMenuAddonConfig,\n): AddonDefinition<BubbleMenuAddonConfig> {\n return {\n id: \"x/bubble-menu\",\n config,\n dependencies: [\"x/commands\"],\n impl: BubbleMenuAddonImpl,\n };\n}\n\nconst DEFAULT_BUBBLE_COMMANDS = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strikethrough\",\n \"inlineCode\",\n \"insertLink\",\n];\n\nexport const BubbleMenuAddonImpl = {\n id: \"x/bubble-menu\",\n init(ctx: EditorContext, config: BubbleMenuAddonConfig = {}): AddonInstance {\n const menu = document.createElement(\"div\");\n menu.className = \"xe-bubble-menu\";\n menu.style.display = \"none\";\n menu.style.position = \"absolute\";\n ctx.getSlot(\"overlay\")?.appendChild(menu);\n\n const commands = (config.commands ?? DEFAULT_BUBBLE_COMMANDS).filter(\n (id) => !!ctx.commands.get(id),\n );\n const group = createCommandGroup(ctx, {\n commands,\n mode: \"popover\",\n density: \"compact\",\n showTooltips: true,\n label: \"Selection actions\",\n });\n menu.appendChild(group.el);\n\n const unsub = ctx.on(\"selection:change\", () => {\n if (ctx.selection.empty) {\n menu.style.display = \"none\";\n } else {\n menu.style.display = \"flex\";\n group.update();\n }\n });\n const unsub2 = ctx.on(\"doc:change\", () => group.update());\n\n return {\n destroy() {\n unsub();\n unsub2();\n group.destroy();\n menu.remove();\n },\n };\n },\n};\n\n// ─── Slash Menu ───────────────────────────────────────────────────────────────\n\nexport interface SlashGroup {\n label: string;\n commands: string[];\n}\n\nexport interface SlashMenuAddonConfig {\n trigger?: string;\n groups?: SlashGroup[];\n maxVisible?: number;\n}\n\nexport function SlashMenuAddon(\n config?: SlashMenuAddonConfig,\n): AddonDefinition<SlashMenuAddonConfig> {\n return {\n id: \"x/slash-menu\",\n config,\n dependencies: [\"x/commands\"],\n impl: SlashMenuAddonImpl,\n };\n}\n\nexport const SlashMenuAddonImpl = {\n id: \"x/slash-menu\",\n init(ctx: EditorContext, config: SlashMenuAddonConfig = {}): AddonInstance {\n const content = ctx.getSlot(\"content\");\n let menu: HTMLElement | null = null;\n let groupHandles: CommandGroupHandle[] = [];\n\n const close = () => {\n for (const h of groupHandles) h.destroy();\n groupHandles = [];\n if (menu) {\n menu.remove();\n menu = null;\n }\n };\n\n const buildGroups = (): SlashGroup[] => {\n if (config.groups && config.groups.length > 0) return config.groups;\n const all = ctx.commands\n .getAll()\n .slice(0, config.maxVisible ?? 30)\n .map((c) => c.id);\n return [{ label: \"Commands\", commands: all }];\n };\n\n const open = () => {\n close();\n menu = document.createElement(\"div\");\n menu.className = \"xe-slash-menu\";\n menu.setAttribute(\"data-xe-slash\", \"true\");\n const groups = buildGroups();\n for (const grp of groups) {\n if (grp.label) {\n const header = document.createElement(\"div\");\n header.className = \"xe-slash-menu__label\";\n header.textContent = grp.label;\n menu.appendChild(header);\n }\n const handle = createCommandGroup(ctx, {\n commands: grp.commands,\n label: grp.label,\n mode: \"popover\",\n density: \"compact\",\n orientation: \"vertical\",\n showLabels: true,\n showTooltips: false,\n onActivate: (cmdId) => {\n ctx.execCommand(cmdId);\n close();\n },\n });\n menu.appendChild(handle.el);\n groupHandles.push(handle);\n }\n const host = ctx.getSlot(\"overlay\") ?? content ?? document.body;\n host.appendChild(menu);\n // Once any group button has focus, Escape no longer bubbles back to the\n // editor's content listener, so handle it on the menu itself.\n menu.addEventListener(\"keydown\", (ev) => {\n if (ev.key === \"Escape\") {\n ev.preventDefault();\n close();\n }\n });\n // Move focus to the first item so arrow-key navigation works\n // immediately for keyboard users.\n groupHandles[0]?.focusFirst();\n };\n\n const onKeydown = (e: KeyboardEvent) => {\n if (e.key === \"/\") {\n // Defer to next tick so the character makes it into the doc first.\n setTimeout(open, 0);\n } else if (e.key === \"Escape\" && menu) {\n e.preventDefault();\n close();\n }\n };\n\n const target = content ?? document;\n target.addEventListener(\"keydown\", onKeydown as EventListener);\n document.addEventListener(\n \"click\",\n (ev) => {\n if (menu && !menu.contains(ev.target as Node)) close();\n },\n true,\n );\n\n return {\n destroy() {\n close();\n target.removeEventListener(\"keydown\", onKeydown as EventListener);\n },\n };\n },\n};\n\n// ─── Command Palette ──────────────────────────────────────────────────────────\n\nexport interface CommandPaletteAddonConfig {\n shortcut?: string;\n placeholder?: string;\n maxRecent?: number;\n}\n\nexport function CommandPaletteAddon(\n config?: CommandPaletteAddonConfig,\n): AddonDefinition<CommandPaletteAddonConfig> {\n return {\n id: \"x/command-palette\",\n config,\n dependencies: [\"x/commands\"],\n impl: CommandPaletteAddonImpl,\n };\n}\n\nexport const CommandPaletteAddonImpl = {\n id: \"x/command-palette\",\n init(\n ctx: EditorContext,\n _config: CommandPaletteAddonConfig = {},\n ): AddonInstance {\n let palette: HTMLElement | null = null;\n\n const close = () => {\n if (palette) {\n palette.remove();\n palette = null;\n }\n };\n\n const open = () => {\n close();\n palette = document.createElement(\"div\");\n palette.className = \"xe-command-palette\";\n palette.setAttribute(\"data-xe-palette\", \"true\");\n palette.style.cssText =\n \"position:fixed; top:20%; left:50%; transform:translateX(-50%); background:var(--xe-bg,#fff); border:1px solid var(--xe-border,#ddd); border-radius:8px; padding:10px; width:420px; max-height:60vh; overflow:auto; box-shadow:0 12px 48px rgba(0,0,0,0.2); z-index:1000;\";\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.placeholder = \"Search commands…\";\n input.style.cssText =\n \"width:100%; padding:8px; border:1px solid var(--xe-border,#ddd); border-radius:4px; box-sizing:border-box;\";\n const list = document.createElement(\"div\");\n list.className = \"xe-command-palette-list\";\n list.style.cssText = \"margin-top:8px; max-height:50vh; overflow:auto;\";\n const renderList = (q = \"\") => {\n list.innerHTML = \"\";\n const ql = q.toLowerCase();\n for (const cmd of ctx.commands.getAll()) {\n if (\n ql &&\n !cmd.label.toLowerCase().includes(ql) &&\n !cmd.id.toLowerCase().includes(ql)\n )\n continue;\n const row = document.createElement(\"button\");\n row.type = \"button\";\n row.textContent = cmd.label;\n row.style.cssText =\n \"display:block; width:100%; text-align:left; padding:6px 8px; border:0; background:transparent; cursor:pointer;\";\n row.addEventListener(\"mousedown\", (ev) => {\n ev.preventDefault();\n ctx.execCommand(cmd.id);\n close();\n });\n list.appendChild(row);\n }\n };\n input.addEventListener(\"input\", () => renderList(input.value));\n input.addEventListener(\"keydown\", (ev) => {\n if (ev.key === \"Escape\") close();\n });\n palette.appendChild(input);\n palette.appendChild(list);\n renderList();\n document.body.appendChild(palette);\n input.focus();\n };\n\n const handleKeydown = (e: KeyboardEvent) => {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && (e.key === \"k\" || e.key === \"K\")) {\n e.preventDefault();\n ctx.emit(\"command-palette:open\");\n open();\n }\n };\n document.addEventListener(\"keydown\", handleKeydown);\n return {\n destroy() {\n close();\n document.removeEventListener(\"keydown\", handleKeydown);\n },\n };\n },\n};\n\n// ─── Block Handles ───────────────────────────────────────────────────────────\n\nexport interface BlockHandlesAddonConfig {\n showAddButton?: boolean;\n addButtonCommand?: string;\n}\n\nexport function BlockHandlesAddon(\n config?: BlockHandlesAddonConfig,\n): AddonDefinition<BlockHandlesAddonConfig> {\n return { id: \"x/block-handles\", config, impl: BlockHandlesAddonImpl };\n}\n\nexport const BlockHandlesAddonImpl = {\n id: \"x/block-handles\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Context Menu ─────────────────────────────────────────────────────────────\n\nexport function ContextMenuAddon(): AddonDefinition {\n return {\n id: \"x/context-menu\",\n dependencies: [\"x/commands\"],\n impl: ContextMenuAddonImpl,\n };\n}\n\nexport const ContextMenuAddonImpl = {\n id: \"x/context-menu\",\n init(ctx: EditorContext): AddonInstance {\n const content = ctx.getSlot(\"content\");\n const handleContextMenu = (e: MouseEvent) => {\n e.preventDefault();\n ctx.emit(\"context-menu:open\", { x: e.clientX, y: e.clientY });\n };\n content?.addEventListener(\"contextmenu\", handleContextMenu);\n return {\n destroy() {\n content?.removeEventListener(\"contextmenu\", handleContextMenu);\n },\n };\n },\n};\n\n// ─── Status Bar ───────────────────────────────────────────────────────────────\n\nexport type StatusBarSlot =\n | \"wordCount\"\n | \"charCount\"\n | \"readingTime\"\n | \"cursorPos\"\n | \"peers\"\n | \"saveStatus\";\n\nexport interface StatusBarAddonConfig {\n slots?: StatusBarSlot[];\n}\n\nexport function StatusBarAddon(\n config?: StatusBarAddonConfig,\n): AddonDefinition<StatusBarAddonConfig> {\n return { id: \"x/status-bar\", config, impl: StatusBarAddonImpl };\n}\n\nexport const StatusBarAddonImpl = {\n id: \"x/status-bar\",\n init(ctx: EditorContext, config: StatusBarAddonConfig = {}): AddonInstance {\n const container = ctx.getSlot(\"statusbar\");\n if (!container) return {};\n\n const slots = config.slots ?? [\"wordCount\", \"charCount\"];\n const bar = document.createElement(\"div\");\n bar.className = \"xe-status-bar\";\n bar.style.display = \"flex\";\n bar.style.gap = \"12px\";\n bar.style.padding = \"4px 8px\";\n container.appendChild(bar);\n\n const slotEls = new Map<StatusBarSlot, HTMLElement>();\n for (const slot of slots) {\n const el = document.createElement(\"span\");\n el.dataset[\"slot\"] = slot;\n el.className = `xe-status-${slot}`;\n bar.appendChild(el);\n slotEls.set(slot, el);\n }\n\n let words = 0,\n chars = 0,\n peerCount = 0,\n readingMinutes = 0;\n const render = () => {\n for (const [slot, el] of slotEls) {\n switch (slot) {\n case \"wordCount\":\n el.textContent = `Words: ${words}`;\n break;\n case \"charCount\":\n el.textContent = `Chars: ${chars}`;\n break;\n case \"readingTime\":\n el.textContent = `${readingMinutes}m read`;\n break;\n case \"peers\":\n el.textContent =\n peerCount > 0\n ? `${peerCount} peer${peerCount === 1 ? \"\" : \"s\"}`\n : \"Solo\";\n break;\n case \"cursorPos\":\n el.textContent = `Pos: ${ctx.selection.from}`;\n break;\n case \"saveStatus\":\n el.textContent = \"Saved\";\n break;\n }\n }\n };\n render();\n\n const unsubs = [\n ctx.on(\"count:update\", ((payload?: unknown) => {\n const p = (payload ?? {}) as { words?: number; chars?: number };\n if (typeof p.words === \"number\") words = p.words;\n if (typeof p.chars === \"number\") chars = p.chars;\n render();\n }) as import(\"@thescaffold/editor-core\").EventHandler),\n ctx.on(\"readingTime:update\", ((payload?: unknown) => {\n const p = (payload ?? {}) as { minutes?: number };\n if (typeof p.minutes === \"number\") readingMinutes = p.minutes;\n render();\n }) as import(\"@thescaffold/editor-core\").EventHandler),\n ctx.on(\"collab:awareness\", ((payload?: unknown) => {\n const p = (payload ?? {}) as { count?: number };\n if (typeof p.count === \"number\") peerCount = p.count;\n render();\n }) as import(\"@thescaffold/editor-core\").EventHandler),\n ctx.on(\"collab:sync\", ((payload?: unknown) => {\n const p = (payload ?? {}) as { state?: string };\n if (p.state === \"disconnected\") {\n peerCount = 0;\n render();\n }\n }) as import(\"@thescaffold/editor-core\").EventHandler),\n ctx.on(\"selection:change\", render),\n ctx.on(\"auto-save:saved\", () => {\n const el = slotEls.get(\"saveStatus\");\n if (el) {\n el.textContent = \"Saved ✓\";\n setTimeout(() => {\n el.textContent = \"Saved\";\n }, 1500);\n }\n }),\n ];\n\n return {\n destroy() {\n for (const u of unsubs) u();\n bar.remove();\n },\n };\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n SchemaContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Table of Contents ────────────────────────────────────────────────────────\n\nexport interface TableOfContentsAddonConfig {\n headingLevels?: number[];\n sidePanel?: boolean;\n}\n\nexport function TableOfContentsAddon(\n config?: TableOfContentsAddonConfig,\n): AddonDefinition<TableOfContentsAddonConfig> {\n return {\n id: \"x/toc\",\n config,\n dependencies: [\"x/headings\"],\n impl: TableOfContentsAddonImpl,\n };\n}\n\nexport const TableOfContentsAddonImpl = {\n id: \"x/toc\",\n initSchema(ctx: SchemaContext): void {\n ctx.addNode({\n name: \"tableOfContents\",\n group: \"block\",\n atom: true,\n parseDOM: [{ tag: \"nav[data-toc]\" }],\n toDOM: () => [\"nav\", { \"data-toc\": \"true\", class: \"xe-toc\" }],\n });\n },\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertTableOfContents\",\n label: \"Table of Contents\",\n icon: \"toc\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n c.insertNode(\"tableOfContents\");\n return true;\n },\n });\n ctx.commands.register({\n id: \"toggleOutlinePanel\",\n label: \"Toggle Outline Panel\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Outline ─────────────────────────────────────────────────────────────────\n\nexport function OutlineAddon(): AddonDefinition {\n return {\n id: \"x/outline\",\n dependencies: [\"x/headings\"],\n impl: OutlineAddonImpl,\n };\n}\n\nexport const OutlineAddonImpl = {\n id: \"x/outline\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Cover ────────────────────────────────────────────────────────────────────\n\nexport interface CoverAddonConfig {\n upload?: (file: File) => Promise<string>;\n gradients?: string[];\n}\n\nexport function CoverAddon(\n config?: CoverAddonConfig,\n): AddonDefinition<CoverAddonConfig> {\n return { id: \"x/cover\", config, impl: CoverAddonImpl };\n}\n\nexport const CoverAddonImpl = {\n id: \"x/cover\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"setCover\",\n label: \"Set Cover\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"removeCover\",\n label: \"Remove Cover\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"repositionCover\",\n label: \"Reposition Cover\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Breadcrumb ───────────────────────────────────────────────────────────────\n\nexport interface BreadcrumbItem {\n id: string;\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbProvider {\n getPath(docId: string): Promise<BreadcrumbItem[]>;\n}\n\nexport interface BreadcrumbAddonConfig {\n provider: BreadcrumbProvider;\n}\n\nexport function BreadcrumbAddon(\n config: BreadcrumbAddonConfig,\n): AddonDefinition<BreadcrumbAddonConfig> {\n return { id: \"x/breadcrumb\", config, impl: BreadcrumbAddonImpl };\n}\n\nexport const BreadcrumbAddonImpl = {\n id: \"x/breadcrumb\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Templates ────────────────────────────────────────────────────────────────\n\nexport function TemplatesAddon(): AddonDefinition {\n return {\n id: \"x/templates\",\n dependencies: [\"x/content\"],\n impl: TemplatesAddonImpl,\n };\n}\n\nexport const TemplatesAddonImpl = {\n id: \"x/templates\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"insertTemplate\",\n label: \"Insert Template\",\n icon: \"template\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Page Setup ───────────────────────────────────────────────────────────────\n\nexport interface PageSetupAddonConfig {\n size?: \"A4\" | \"Letter\" | \"Legal\";\n orientation?: \"portrait\" | \"landscape\";\n margins?: { top: string; right: string; bottom: string; left: string };\n}\n\nexport function PageSetupAddon(\n config?: PageSetupAddonConfig,\n): AddonDefinition<PageSetupAddonConfig> {\n return { id: \"x/page-setup\", config, impl: PageSetupAddonImpl };\n}\n\nexport const PageSetupAddonImpl = {\n id: \"x/page-setup\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"pageSetup\",\n label: \"Page Setup\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Content ─────────────────────────────────────────────────────────────────\n\nexport function ContentAddon(): AddonDefinition {\n return { id: \"x/content\", impl: ContentAddonImpl };\n}\n\nfunction downloadString(\n filename: string,\n content: string,\n mimeType: string,\n): void {\n if (typeof document === \"undefined\" || typeof URL === \"undefined\") return;\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n a.remove();\n URL.revokeObjectURL(url);\n }, 0);\n}\n\nexport const ContentAddonImpl = {\n id: \"x/content\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"exportJson\",\n label: \"Export as JSON\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n downloadString(\n \"document.json\",\n c.getContent(\"json\"),\n \"application/json\",\n );\n return true;\n },\n });\n ctx.commands.register({\n id: \"exportHtml\",\n label: \"Export as HTML\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n downloadString(\"document.html\", c.getContent(\"html\"), \"text/html\");\n return true;\n },\n });\n ctx.commands.register({\n id: \"exportMarkdown\",\n label: \"Export as Markdown\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n downloadString(\n \"document.md\",\n c.getContent(\"markdown\"),\n \"text/markdown\",\n );\n return true;\n },\n });\n ctx.commands.register({\n id: \"exportText\",\n label: \"Export as Text\",\n isEnabled: () => true,\n isActive: () => false,\n execute: (c) => {\n downloadString(\"document.txt\", c.getContent(\"text\"), \"text/plain\");\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── DOCX ─────────────────────────────────────────────────────────────────────\n\nexport function DocxAddon(): AddonDefinition {\n return { id: \"x/docx\", dependencies: [\"x/content\"], impl: DocxAddonImpl };\n}\n\nexport const DocxAddonImpl = {\n id: \"x/docx\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"exportDocx\",\n label: \"Export as DOCX\",\n icon: \"docx\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"importDocx\",\n label: \"Import DOCX\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── PDF ──────────────────────────────────────────────────────────────────────\n\nexport function PdfAddon(): AddonDefinition {\n return { id: \"x/pdf\", dependencies: [\"x/content\"], impl: PdfAddonImpl };\n}\n\nexport const PdfAddonImpl = {\n id: \"x/pdf\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"exportPdf\",\n label: \"Export as PDF\",\n icon: \"pdf\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Print ────────────────────────────────────────────────────────────────────\n\nexport function PrintAddon(): AddonDefinition {\n return { id: \"x/print\", impl: PrintAddonImpl };\n}\n\nexport const PrintAddonImpl = {\n id: \"x/print\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"print\",\n label: \"Print\",\n icon: \"print\",\n shortcut: \"Mod-p\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => {\n window.print();\n return true;\n },\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Search ───────────────────────────────────────────────────────────────────\n\nexport function SearchAddon(): AddonDefinition {\n return { id: \"x/search\", impl: SearchAddonImpl };\n}\n\nexport const SearchAddonImpl = {\n id: \"x/search\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"findReplace\",\n label: \"Find & Replace\",\n icon: \"search\",\n shortcut: \"Mod-f\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"findNext\",\n label: \"Find Next\",\n shortcut: \"F3\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"findPrevious\",\n label: \"Find Previous\",\n shortcut: \"Shift-F3\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Spell Check ──────────────────────────────────────────────────────────────\n\nexport function SpellCheckAddon(): AddonDefinition {\n return { id: \"x/spell-check\", impl: SpellCheckAddonImpl };\n}\n\nexport const SpellCheckAddonImpl = {\n id: \"x/spell-check\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Grammar ──────────────────────────────────────────────────────────────────\n\nexport function GrammarAddon(): AddonDefinition {\n return {\n id: \"x/grammar\",\n dependencies: [\"x/spell-check\"],\n impl: GrammarAddonImpl,\n };\n}\n\nexport const GrammarAddonImpl = {\n id: \"x/grammar\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Auto Save ────────────────────────────────────────────────────────────────\n\nexport interface AutoSaveAddonConfig {\n save: (content: string, format: string) => Promise<void>;\n interval?: number;\n format?: \"json\" | \"html\" | \"markdown\";\n}\n\nexport function AutoSaveAddon(\n config: AutoSaveAddonConfig,\n): AddonDefinition<AutoSaveAddonConfig> {\n return {\n id: \"x/auto-save\",\n config,\n dependencies: [\"x/content\"],\n impl: AutoSaveAddonImpl,\n };\n}\n\nexport const AutoSaveAddonImpl = {\n id: \"x/auto-save\",\n init(ctx: EditorContext, config: AutoSaveAddonConfig): AddonInstance {\n const interval = config.interval ?? 5000;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let dirty = false;\n\n const schedSave = () => {\n dirty = true;\n if (timer) clearTimeout(timer);\n timer = setTimeout(async () => {\n if (!dirty) return;\n dirty = false;\n const content = ctx.getContent(config.format ?? \"json\");\n await config.save(content, config.format ?? \"json\").catch(() => {});\n ctx.emit(\"auto-save:saved\");\n }, interval);\n };\n\n const unsub = ctx.on(\"doc:change\", schedSave);\n\n return {\n destroy() {\n unsub();\n if (timer) clearTimeout(timer);\n },\n };\n },\n};\n\n// ─── Read Only ────────────────────────────────────────────────────────────────\n\nexport interface ReadOnlyAddonConfig {\n readOnly?: boolean;\n}\n\nexport function ReadOnlyAddon(\n config?: ReadOnlyAddonConfig,\n): AddonDefinition<ReadOnlyAddonConfig> {\n return { id: \"x/read-only\", config, impl: ReadOnlyAddonImpl };\n}\n\nexport const ReadOnlyAddonImpl = {\n id: \"x/read-only\",\n init(ctx: EditorContext, config: ReadOnlyAddonConfig = {}): AddonInstance {\n let readOnly = config.readOnly ?? false;\n const ctxImpl = ctx as unknown as { setEditable: (e: boolean) => void };\n if (readOnly) ctxImpl.setEditable(false);\n ctx.commands.register({\n id: \"toggleReadOnly\",\n label: \"Toggle Read Only\",\n isEnabled: () => true,\n isActive: () => readOnly,\n execute: () => {\n readOnly = !readOnly;\n ctxImpl.setEditable(!readOnly);\n ctx.emit(\"read-only:change\", { readOnly });\n return true;\n },\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n CollabConfig,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Collab ───────────────────────────────────────────────────────────────────\n//\n// The real Yjs binding lives inside @thescaffold/editor-core's CollabBinder, which is\n// instantiated by the editor factory BEFORE the adapter mounts (y-prosemirror's\n// ySyncPlugin must be in the EditorState plugin list at construction time).\n// `CollabAddon` is now a thin compatibility shim: it forwards its config\n// up to the host via setCollab and re-broadcasts awareness/peer events for\n// addons that still depend on the old event surface (status bar peer count).\n\nexport function CollabAddon(\n config?: CollabConfig,\n): AddonDefinition<CollabConfig> {\n return { id: \"x/collab\", config, impl: CollabAddonImpl };\n}\n\ninterface BinderAccess {\n _collabBinder?: {\n awareness?: {\n on: (event: string, fn: (...args: unknown[]) => void) => void;\n off: (event: string, fn: (...args: unknown[]) => void) => void;\n getStates: () => Map<number, unknown>;\n clientID: number;\n };\n };\n}\n\nexport const CollabAddonImpl = {\n id: \"x/collab\",\n init(ctx: EditorContext, _config?: CollabConfig): AddonInstance {\n const binder = (ctx as unknown as BinderAccess)._collabBinder;\n if (!binder?.awareness) return {};\n const aw = binder.awareness;\n // Re-broadcast peer-count changes as `collab:awareness` so the status\n // bar (and any other consumer of that legacy event) keeps working.\n const emitPeerCount = () => {\n const states = aw.getStates();\n const others = Math.max(0, states.size - 1);\n ctx.emit(\"collab:awareness\", { count: others });\n };\n const handler = () => emitPeerCount();\n aw.on(\"update\", handler);\n emitPeerCount();\n return {\n destroy() {\n aw.off(\"update\", handler);\n },\n };\n },\n};\n\n// ─── Awareness ────────────────────────────────────────────────────────────────\n//\n// Stamps the local user identity (id/name/color) onto the awareness state so\n// other peers can label remote cursors. The cursor coordinates themselves are\n// owned by y-prosemirror's yCursorPlugin which reads/writes\n// `awareness.localState.cursor` for us.\n\nexport interface AwarenessAddonConfig {\n identity?: { id: string; name: string; color: string };\n /**\n * Opaque schema version stamped into awareness state. The binder emits\n * `collab:error { phase: 'schema-mismatch' }` if a peer's schemaVersion\n * differs from this one. Pin per-release so a rolling deploy with an\n * incompatible PM schema fails loudly instead of silently diverging.\n */\n schemaVersion?: string;\n}\n\nexport function AwarenessAddon(\n config?: AwarenessAddonConfig,\n): AddonDefinition<AwarenessAddonConfig> {\n return {\n id: \"x/awareness\",\n config,\n dependencies: [\"x/collab\"],\n impl: AwarenessAddonImpl,\n };\n}\n\ninterface AwarenessBinderAccess {\n _collabBinder?: {\n awareness?: {\n setLocalStateField: (field: string, value: unknown) => void;\n setLocalState: (state: unknown) => void;\n };\n };\n}\n\nexport const AwarenessAddonImpl = {\n id: \"x/awareness\",\n init(ctx: EditorContext, config: AwarenessAddonConfig = {}): AddonInstance {\n const binder = (ctx as unknown as AwarenessBinderAccess)._collabBinder;\n const aw = binder?.awareness;\n if (!aw) return {};\n // y-prosemirror's yCursorPlugin expects hex colors — not HSL — so we\n // generate hex from a deterministic palette.\n const palette = [\n \"#e74c3c\",\n \"#3498db\",\n \"#2ecc71\",\n \"#f39c12\",\n \"#9b59b6\",\n \"#1abc9c\",\n ];\n const identity = config.identity ?? {\n id:\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `user-${Math.random().toString(36).slice(2, 10)}`,\n name: \"Anonymous\",\n color: palette[Math.floor(Math.random() * palette.length)],\n };\n aw.setLocalStateField(\"user\", identity);\n if (config.schemaVersion) {\n aw.setLocalStateField(\"schemaVersion\", config.schemaVersion);\n }\n return {\n destroy() {\n // Cleanly clear local state so peers see us go offline.\n try {\n aw.setLocalState(null);\n } catch {\n /* ignore */\n }\n },\n };\n },\n};\n\n// ─── Presence ─────────────────────────────────────────────────────────────────\n//\n// Presence in the y-prosemirror world is rendered by yCursorPlugin reading\n// awareness — this addon now exists only to declare a dependency on\n// x/collab so the binder is guaranteed to be initialized.\n\nexport function PresenceAddon(): AddonDefinition {\n return {\n id: \"x/presence\",\n dependencies: [\"x/collab\", \"x/awareness\"],\n impl: PresenceAddonImpl,\n };\n}\n\nexport const PresenceAddonImpl = {\n id: \"x/presence\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Comments ─────────────────────────────────────────────────────────────────\n\nexport interface CommentProvider {\n getComments(docId: string): Promise<Comment[]>;\n addComment(\n docId: string,\n range: { from: number; to: number },\n text: string,\n ): Promise<Comment>;\n resolveComment(id: string): Promise<void>;\n deleteComment(id: string): Promise<void>;\n}\n\nexport interface Comment {\n id: string;\n from: number;\n to: number;\n text: string;\n author: string;\n createdAt: string;\n resolved: boolean;\n replies: Comment[];\n}\n\nexport interface CommentsAddonConfig {\n provider: CommentProvider;\n}\n\nexport function CommentsAddon(\n config: CommentsAddonConfig,\n): AddonDefinition<CommentsAddonConfig> {\n return { id: \"x/comments\", config, impl: CommentsAddonImpl };\n}\n\nexport const CommentsAddonImpl = {\n id: \"x/comments\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"addComment\",\n label: \"Add Comment\",\n icon: \"comment\",\n shortcut: \"Mod-Alt-m\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"resolveComment\",\n label: \"Resolve Comment\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"toggleComments\",\n label: \"Toggle Comments Panel\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Suggestions ─────────────────────────────────────────────────────────────\n\nexport function SuggestionsAddon(): AddonDefinition {\n return {\n id: \"x/suggestions\",\n dependencies: [\"x/schema\", \"x/commands\"],\n impl: SuggestionsAddonImpl,\n };\n}\n\nexport const SuggestionsAddonImpl = {\n id: \"x/suggestions\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"toggleSuggestions\",\n label: \"Toggle Tracked Changes\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"acceptSuggestion\",\n label: \"Accept Change\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"rejectSuggestion\",\n label: \"Reject Change\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"acceptAllSuggestions\",\n label: \"Accept All Changes\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"rejectAllSuggestions\",\n label: \"Reject All Changes\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Version ──────────────────────────────────────────────────────────────────\n\nexport function VersionAddon(): AddonDefinition {\n return {\n id: \"x/version\",\n dependencies: [\"x/content\"],\n impl: VersionAddonImpl,\n };\n}\n\nexport const VersionAddonImpl = {\n id: \"x/version\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"createSnapshot\",\n label: \"Create Snapshot\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"restoreSnapshot\",\n label: \"Restore Snapshot\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"viewHistory\",\n label: \"View History\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Code (code mode foundation) ──────────────────────────────────────────────\n\nexport interface CodeAddonConfig {\n language?: string;\n theme?: string;\n lineNumbers?: boolean;\n}\n\nexport function CodeAddon(\n config?: CodeAddonConfig,\n): AddonDefinition<CodeAddonConfig> {\n return { id: \"x/code\", config, impl: CodeAddonImpl };\n}\n\nexport const CodeAddonImpl = {\n id: \"x/code\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Line Numbers ─────────────────────────────────────────────────────────────\n\nexport function LineNumbersAddon(): AddonDefinition {\n return {\n id: \"x/line-numbers\",\n dependencies: [\"x/code\"],\n impl: LineNumbersAddonImpl,\n };\n}\n\nexport const LineNumbersAddonImpl = {\n id: \"x/line-numbers\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Code Folding ─────────────────────────────────────────────────────────────\n\nexport function CodeFoldingAddon(): AddonDefinition {\n return {\n id: \"x/code-folding\",\n dependencies: [\"x/code\"],\n impl: CodeFoldingAddonImpl,\n };\n}\n\nexport const CodeFoldingAddonImpl = {\n id: \"x/code-folding\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"foldCode\",\n label: \"Fold Code\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"unfoldCode\",\n label: \"Unfold Code\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"foldAll\",\n label: \"Fold All\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"unfoldAll\",\n label: \"Unfold All\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Bracket Matching ─────────────────────────────────────────────────────────\n\nexport function BracketMatchingAddon(): AddonDefinition {\n return {\n id: \"x/bracket-matching\",\n dependencies: [\"x/code\"],\n impl: BracketMatchingAddonImpl,\n };\n}\n\nexport const BracketMatchingAddonImpl = {\n id: \"x/bracket-matching\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Code Auto Complete ────────────────────────────────────────────────────────\n\nexport interface CodeAutoCompleteAddonConfig {\n completionSource?: unknown;\n}\n\nexport function CodeAutoCompleteAddon(\n config?: CodeAutoCompleteAddonConfig,\n): AddonDefinition<CodeAutoCompleteAddonConfig> {\n return {\n id: \"x/code-autocomplete\",\n config,\n dependencies: [\"x/code\"],\n impl: CodeAutoCompleteAddonImpl,\n };\n}\n\nexport const CodeAutoCompleteAddonImpl = {\n id: \"x/code-autocomplete\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Code Lint ────────────────────────────────────────────────────────────────\n\nexport interface CodeLintAddonConfig {\n linter: unknown;\n delay?: number;\n}\n\nexport function CodeLintAddon(\n config: CodeLintAddonConfig,\n): AddonDefinition<CodeLintAddonConfig> {\n return {\n id: \"x/code-lint\",\n config,\n dependencies: [\"x/code\"],\n impl: CodeLintAddonImpl,\n };\n}\n\nexport const CodeLintAddonImpl = {\n id: \"x/code-lint\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n\n// ─── Diff ─────────────────────────────────────────────────────────────────────\n\nexport interface DiffAddonConfig {\n original: string;\n mode?: \"side-by-side\" | \"unified\";\n highlightChanges?: boolean;\n gutter?: boolean;\n}\n\nexport function DiffAddon(\n config: DiffAddonConfig,\n): AddonDefinition<DiffAddonConfig> {\n return {\n id: \"x/diff\",\n config,\n dependencies: [\"x/code\"],\n impl: DiffAddonImpl,\n };\n}\n\nexport const DiffAddonImpl = {\n id: \"x/diff\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"toggleDiff\",\n label: \"Toggle Diff\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n\n// ─── Mini Map ─────────────────────────────────────────────────────────────────\n\nexport function MiniMapAddon(): AddonDefinition {\n return { id: \"x/minimap\", dependencies: [\"x/code\"], impl: MiniMapAddonImpl };\n}\n\nexport const MiniMapAddonImpl = {\n id: \"x/minimap\",\n init(_ctx: EditorContext): AddonInstance {\n return {};\n },\n};\n","import type {\n AddonDefinition,\n AddonInstance,\n EditorContext,\n} from \"@thescaffold/editor-core\";\n\n// ─── Placeholder ──────────────────────────────────────────────────────────────\n\nexport interface PlaceholderAddonConfig {\n text: string;\n showOnlyWhenFocused?: boolean;\n}\n\nexport function PlaceholderAddon(\n config: PlaceholderAddonConfig,\n): AddonDefinition<PlaceholderAddonConfig> {\n return { id: \"x/placeholder\", config, impl: PlaceholderAddonImpl };\n}\n\nexport const PlaceholderAddonImpl = {\n id: \"x/placeholder\",\n init(ctx: EditorContext, config: PlaceholderAddonConfig): AddonInstance {\n const container = ctx.getSlot(\"content\");\n if (!container) return {};\n\n const el = document.createElement(\"div\");\n el.className = \"xe-placeholder\";\n el.textContent = config.text;\n el.style.pointerEvents = \"none\";\n el.style.position = \"absolute\";\n el.style.color = \"var(--xe-fg)\";\n el.style.opacity = \"0.4\";\n container.style.position = \"relative\";\n container.appendChild(el);\n\n const update = () => {\n const isEmpty = ctx.getContent(\"text\").trim() === \"\";\n el.style.display = isEmpty ? \"block\" : \"none\";\n };\n\n update();\n const unsub = ctx.on(\"doc:change\", update);\n\n return {\n destroy() {\n unsub();\n el.remove();\n },\n };\n },\n};\n\n// ─── Count ────────────────────────────────────────────────────────────────────\n\nexport interface CountAddonConfig {\n wordsPerMinute?: number;\n showIn?: (\"statusbar\" | \"tooltip\")[];\n}\n\nexport function CountAddon(\n config?: CountAddonConfig,\n): AddonDefinition<CountAddonConfig> {\n return { id: \"x/count\", config, impl: CountAddonImpl };\n}\n\nexport const CountAddonImpl = {\n id: \"x/count\",\n init(ctx: EditorContext, config: CountAddonConfig = {}): AddonInstance {\n const update = () => {\n const text = ctx.getContent(\"text\");\n const words = text.trim() === \"\" ? 0 : text.trim().split(/\\s+/).length;\n const chars = text.length;\n ctx.emit(\"count:update\", { words, chars });\n };\n\n update();\n const unsub = ctx.on(\"doc:change\", update);\n\n return { destroy: unsub };\n },\n};\n\n// ─── Reading Time ─────────────────────────────────────────────────────────────\n\nexport function ReadingTimeAddon(): AddonDefinition {\n return { id: \"x/reading-time\", impl: ReadingTimeAddonImpl };\n}\n\nexport const ReadingTimeAddonImpl = {\n id: \"x/reading-time\",\n init(ctx: EditorContext): AddonInstance {\n const update = () => {\n const text = ctx.getContent(\"text\");\n const words = text.trim() === \"\" ? 0 : text.trim().split(/\\s+/).length;\n const minutes = Math.ceil(words / 200);\n ctx.emit(\"readingTime:update\", { minutes, words });\n };\n const unsub = ctx.on(\"doc:change\", update);\n return { destroy: unsub };\n },\n};\n\n// ─── Focus Mode ───────────────────────────────────────────────────────────────\n\nexport interface FocusModeAddonConfig {\n dimInactive?: boolean;\n typewriterScroll?: boolean;\n}\n\nexport function FocusModeAddon(\n config?: FocusModeAddonConfig,\n): AddonDefinition<FocusModeAddonConfig> {\n return { id: \"x/focus-mode\", config, impl: FocusModeAddonImpl };\n}\n\nexport const FocusModeAddonImpl = {\n id: \"x/focus-mode\",\n init(ctx: EditorContext): AddonInstance {\n let active = false;\n ctx.commands.register({\n id: \"toggleFocusMode\",\n label: \"Toggle Focus Mode\",\n icon: \"focus\",\n isEnabled: () => true,\n isActive: () => active,\n execute: () => {\n active = !active;\n ctx.emit(\"focus-mode:change\", { active });\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Full Screen ──────────────────────────────────────────────────────────────\n\nexport function FullScreenAddon(): AddonDefinition {\n return { id: \"x/fullscreen\", impl: FullScreenAddonImpl };\n}\n\nexport const FullScreenAddonImpl = {\n id: \"x/fullscreen\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"toggleFullScreen\",\n label: \"Toggle Full Screen\",\n icon: \"fullscreen\",\n shortcut: \"F11\",\n isEnabled: () => true,\n isActive: () => !!document.fullscreenElement,\n execute: () => {\n if (document.fullscreenElement) {\n document.exitFullscreen?.();\n } else {\n ctx.shadowRoot?.host?.requestFullscreen?.();\n }\n return true;\n },\n });\n return {};\n },\n};\n\n// ─── Accessibility ────────────────────────────────────────────────────────────\n\nexport function AccessibilityAddon(): AddonDefinition {\n return { id: \"x/accessibility\", impl: AccessibilityAddonImpl };\n}\n\nexport const AccessibilityAddonImpl = {\n id: \"x/accessibility\",\n init(ctx: EditorContext): AddonInstance {\n const content = ctx.getSlot(\"content\");\n if (content) {\n content.setAttribute(\"role\", \"textbox\");\n content.setAttribute(\"aria-multiline\", \"true\");\n }\n const toolbar = ctx.getSlot(\"toolbar\");\n if (toolbar) {\n toolbar.setAttribute(\"role\", \"toolbar\");\n }\n return {};\n },\n};\n\n// ─── Markdown Mode ────────────────────────────────────────────────────────────\n\nexport interface MarkdownAddonConfig {\n defaultMode?: \"wysiwyg\" | \"raw\";\n showPreview?: boolean;\n sanitizeHtml?: (html: string) => string;\n}\n\nexport function MarkdownAddon(\n config?: MarkdownAddonConfig,\n): AddonDefinition<MarkdownAddonConfig> {\n return {\n id: \"x/markdown\",\n config,\n dependencies: [\"x/schema\"],\n impl: MarkdownAddonImpl,\n };\n}\n\nexport const MarkdownAddonImpl = {\n id: \"x/markdown\",\n init(ctx: EditorContext): AddonInstance {\n ctx.commands.register({\n id: \"toggleMarkdownMode\",\n label: \"Toggle Markdown Mode\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n ctx.commands.register({\n id: \"toggleMarkdownPreview\",\n label: \"Toggle Markdown Preview\",\n isEnabled: () => true,\n isActive: () => false,\n execute: () => true,\n });\n return {};\n },\n};\n"],"mappings":"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","names":[]}
|