{"version":3,"file":"rk-editor-ui.mjs","sources":["../src/Modal.ts","../src/icons.ts","../src/dialogs.ts","../src/FindReplaceBar.ts","../src/StatusBar.ts","../src/Outline.ts","../src/PropertyPanel.ts","../src/CommandPalette.ts","../src/toast.ts","../src/web-component.ts","../src/index.ts"],"sourcesContent":["export type ModalFieldType = 'text' | 'number' | 'select' | 'color' | 'textarea' | 'checkbox';\n\nexport interface ModalField {\n    id: string;\n    label: string;\n    type: ModalFieldType;\n    value?: any;\n    placeholder?: string;\n    min?: number;\n    max?: number;\n    step?: number;\n    options?: { label: string; value: any }[];\n}\n\nexport interface ModalAction {\n    label: string;\n    variant?: 'primary' | 'secondary' | 'danger';\n    onClick?: (data: Record<string, any>, modal: Modal) => void | Promise<void>;\n    closeOnClick?: boolean;\n}\n\nexport interface ModalOptions {\n    title: string;\n    description?: string;\n    fields?: ModalField[];\n    confirmLabel?: string;\n    cancelLabel?: string;\n    actions?: ModalAction[];\n    width?: number;\n    onConfirm?: (data: Record<string, any>) => void;\n    onClose?: () => void;\n    bodyHtml?: string;\n}\n\n/** Lightweight, themed modal that supports forms, custom actions, and ESC/click-out close. */\nexport class Modal {\n    private overlay: HTMLDivElement;\n    private fields: Record<string, HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> = {};\n    private opts: ModalOptions;\n    private bodyContainer: HTMLDivElement;\n\n    constructor(opts: ModalOptions) {\n        this.opts = opts;\n        this.overlay = document.createElement('div');\n        // Carry the editor scope so CSS variables (--rk-surface, --rk-text, etc.) resolve.\n        // Inherit the active theme from the first editor on the page if present.\n        const themed = document.querySelector('.rk-word-editor[data-rk-theme]') as HTMLElement | null;\n        this.overlay.className = 'rk-word-editor rk-modal-overlay';\n        if (themed?.dataset.rkTheme) this.overlay.dataset.rkTheme = themed.dataset.rkTheme;\n\n        const content = document.createElement('div');\n        content.className = 'rk-modal-content';\n        if (opts.width) content.style.maxWidth = `${opts.width}px`;\n\n        const header = document.createElement('div');\n        header.className = 'rk-modal-header';\n        header.innerHTML = `<h3>${escapeHtml(opts.title)}</h3>\n            <button class=\"rk-modal-close\" aria-label=\"Close\">×</button>`;\n\n        const body = document.createElement('div');\n        body.className = 'rk-modal-body';\n        this.bodyContainer = body;\n\n        if (opts.description) {\n            const desc = document.createElement('div');\n            desc.className = 'rk-modal-description';\n            desc.innerHTML = opts.description.replace(/\\n/g, '<br/>');\n            body.appendChild(desc);\n        }\n        if (opts.bodyHtml) {\n            const wrap = document.createElement('div');\n            wrap.innerHTML = opts.bodyHtml;\n            body.appendChild(wrap);\n        }\n\n        if (opts.fields) {\n            opts.fields.forEach(field => body.appendChild(this.buildField(field)));\n        }\n\n        const footer = document.createElement('div');\n        footer.className = 'rk-modal-footer';\n\n        if (opts.actions && opts.actions.length) {\n            opts.actions.forEach(action => {\n                const btn = document.createElement('button');\n                btn.className = `rk-btn rk-btn-${action.variant || 'secondary'}`;\n                btn.textContent = action.label;\n                btn.addEventListener('click', async () => {\n                    await action.onClick?.(this.collect(), this);\n                    if (action.closeOnClick !== false) this.close();\n                });\n                footer.appendChild(btn);\n            });\n        } else {\n            const cancelBtn = document.createElement('button');\n            cancelBtn.className = 'rk-btn rk-btn-secondary';\n            cancelBtn.textContent = opts.cancelLabel || 'Cancel';\n            cancelBtn.addEventListener('click', () => this.close());\n\n            const confirmBtn = document.createElement('button');\n            confirmBtn.className = 'rk-btn rk-btn-primary';\n            confirmBtn.textContent = opts.confirmLabel || (opts.fields?.length ? 'Confirm' : 'Close');\n            confirmBtn.addEventListener('click', () => {\n                opts.onConfirm?.(this.collect());\n                this.close();\n            });\n            if (opts.fields?.length) footer.appendChild(cancelBtn);\n            footer.appendChild(confirmBtn);\n        }\n\n        content.appendChild(header);\n        content.appendChild(body);\n        content.appendChild(footer);\n        this.overlay.appendChild(content);\n\n        header.querySelector('.rk-modal-close')?.addEventListener('click', () => this.close());\n        this.overlay.addEventListener('click', e => {\n            if (e.target === this.overlay) this.close();\n        });\n        const onKey = (e: KeyboardEvent) => {\n            if (e.key === 'Escape') this.close();\n        };\n        document.addEventListener('keydown', onKey);\n        this.overlay.addEventListener('rk-modal-closed', () => document.removeEventListener('keydown', onKey));\n    }\n\n    private buildField(field: ModalField): HTMLDivElement {\n        const group = document.createElement('div');\n        group.className = 'rk-modal-field';\n\n        const label = document.createElement('label');\n        label.htmlFor = field.id;\n        label.textContent = field.label;\n        group.appendChild(label);\n\n        let input: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n        if (field.type === 'select') {\n            const sel = document.createElement('select');\n            (field.options || []).forEach(opt => {\n                const o = document.createElement('option');\n                o.value = String(opt.value);\n                o.textContent = opt.label;\n                sel.appendChild(o);\n            });\n            input = sel;\n        } else if (field.type === 'textarea') {\n            input = document.createElement('textarea');\n            (input as HTMLTextAreaElement).rows = 4;\n        } else {\n            const i = document.createElement('input');\n            i.type = field.type;\n            if (field.min !== undefined) i.min = String(field.min);\n            if (field.max !== undefined) i.max = String(field.max);\n            if (field.step !== undefined) i.step = String(field.step);\n            input = i;\n        }\n        input.id = field.id;\n        if (field.placeholder) (input as any).placeholder = field.placeholder;\n        if (field.value !== undefined) {\n            if (field.type === 'checkbox') (input as HTMLInputElement).checked = !!field.value;\n            else (input as any).value = field.value;\n        }\n        group.appendChild(input);\n        this.fields[field.id] = input;\n        return group;\n    }\n\n    public collect(): Record<string, any> {\n        const data: Record<string, any> = {};\n        Object.keys(this.fields).forEach(k => {\n            const el = this.fields[k];\n            if ((el as HTMLInputElement).type === 'checkbox') data[k] = (el as HTMLInputElement).checked;\n            else if ((el as HTMLInputElement).type === 'number') data[k] = parseFloat((el as HTMLInputElement).value);\n            else data[k] = (el as any).value;\n        });\n        return data;\n    }\n\n    public show(): this {\n        document.body.appendChild(this.overlay);\n        // Force reflow\n        void this.overlay.offsetHeight;\n        this.overlay.classList.add('active');\n        // Focus first field\n        const first = this.overlay.querySelector('input, select, textarea, button.rk-btn-primary') as HTMLElement | null;\n        first?.focus();\n        return this;\n    }\n\n    public close(): void {\n        this.overlay.classList.remove('active');\n        this.opts.onClose?.();\n        this.overlay.dispatchEvent(new CustomEvent('rk-modal-closed'));\n        setTimeout(() => this.overlay.remove(), 180);\n    }\n\n    public get body(): HTMLDivElement { return this.bodyContainer; }\n}\n\nfunction escapeHtml(s: string): string {\n    return s.replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]!));\n}\n","/**\n * Unified SVG icon set for RK Word Editor.\n *\n * All icons are 16×16 line icons in the spirit of Lucide / Tabler — single\n * stroke colour (`currentColor`), 1.5 stroke width, no fills. Pass them as\n * `innerHTML` of buttons; size and color are controlled by the parent button.\n */\n\nconst wrap = (path: string) =>\n    `<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">${path}</svg>`;\n\nexport const Icons = {\n    // ---- File ----\n    fileNew: wrap('<path d=\"M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\"/><path d=\"M14 3v6h6\"/><path d=\"M9 14h6M9 17h4\"/>'),\n    fileOpen: wrap('<path d=\"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/>'),\n    save: wrap('<path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"/><path d=\"M17 21v-8H7v8M7 3v5h8\"/>'),\n    download: wrap('<path d=\"M12 3v12\"/><path d=\"m7 10 5 5 5-5\"/><path d=\"M5 21h14\"/>'),\n    upload: wrap('<path d=\"M12 21V9\"/><path d=\"m7 14 5-5 5 5\"/><path d=\"M5 3h14\"/>'),\n    print: wrap('<path d=\"M6 9V3h12v6\"/><rect x=\"4\" y=\"9\" width=\"16\" height=\"8\" rx=\"2\"/><path d=\"M6 17h12v4H6z\"/>'),\n    pdf: wrap('<path d=\"M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\"/><path d=\"M14 3v6h6\"/><text x=\"8\" y=\"17\" font-size=\"6\" font-weight=\"700\" fill=\"currentColor\" stroke=\"none\">PDF</text>'),\n    docx: wrap('<path d=\"M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\"/><path d=\"M14 3v6h6\"/><text x=\"7\" y=\"18\" font-size=\"6\" font-weight=\"700\" fill=\"currentColor\" stroke=\"none\">DOC</text>'),\n\n    // ---- Edit ----\n    undo: wrap('<path d=\"M9 14 4 9l5-5\"/><path d=\"M4 9h11a5 5 0 0 1 0 10h-3\"/>'),\n    redo: wrap('<path d=\"m15 14 5-5-5-5\"/><path d=\"M20 9H9a5 5 0 0 0 0 10h3\"/>'),\n    cut: wrap('<circle cx=\"6\" cy=\"6\" r=\"3\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><path d=\"M20 4 8.12 15.88M14.47 14.48 20 20M8.12 8.12 12 12\"/>'),\n    copy: wrap('<rect x=\"8\" y=\"8\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M16 8V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h3\"/>'),\n    paste: wrap('<rect x=\"6\" y=\"4\" width=\"12\" height=\"17\" rx=\"2\"/><rect x=\"9\" y=\"2\" width=\"6\" height=\"4\" rx=\"1\"/>'),\n    clear: wrap('<path d=\"M21 21H7L3 17l5-5 5 5\"/><path d=\"m12 7 5 5\"/><path d=\"m17 12 4-4-5-5-9 9\"/>'),\n    formatPainter: wrap('<path d=\"M3 3h12v5H3z\"/><path d=\"M5 8v2h8V8\"/><path d=\"M9 10v3\"/><path d=\"M7 13h4l-1 5a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1z\"/>'),\n    eraser: wrap('<path d=\"m7 21-4-4L17 3l4 4z\"/><path d=\"M22 21H7\"/><path d=\"m5 11 9 9\"/>'),\n\n    // ---- Inline marks ----\n    bold: wrap('<path d=\"M7 5h6a4 4 0 0 1 0 8H7zM7 13h7a4 4 0 0 1 0 8H7z\"/>'),\n    italic: wrap('<path d=\"M19 4h-9M14 20H5M15 4 9 20\"/>'),\n    underline: wrap('<path d=\"M6 4v8a6 6 0 0 0 12 0V4\"/><path d=\"M5 20h14\"/>'),\n    strike: wrap('<path d=\"M16 4h-7a4 4 0 0 0-3.6 5.7\"/><path d=\"M14 12a4 4 0 0 1 0 8H8\"/><path d=\"M3 12h18\"/>'),\n    // X with a small \"2\" floating above (superscript) or below (subscript).\n    // Drawn as paths so they render identically across browsers without depending on a font.\n    superscript: wrap('<path d=\"M4 7l8 12M12 7l-8 12\"/><path d=\"M16 8a1.6 1.6 0 0 1 3 0c0 1-3 1.5-3 3h3\"/>'),\n    subscript: wrap('<path d=\"M4 5l8 12M12 5l-8 12\"/><path d=\"M16 17a1.6 1.6 0 0 1 3 0c0 1-3 1.5-3 3h3\"/>'),\n    code: wrap('<path d=\"m8 8-5 4 5 4M16 8l5 4-5 4M14 4 10 20\"/>'),\n    link: wrap('<path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>'),\n    unlink: wrap('<path d=\"m18 8 4-4M16 4l4 4M2 20l4-4M6 16l-4 4\"/><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/>'),\n    highlight: wrap('<path d=\"m9 11 6 6\"/><path d=\"M3 21h6\"/><path d=\"M5 19l4-7 9-9 4 4-9 9-7 4z\"/>'),\n    color: wrap('<path d=\"M4 20h16\"/><path d=\"m6 17 6-13 6 13\"/><path d=\"M8 13h8\"/>'),\n    fontColor: wrap('<path d=\"M4 20h16\"/><path d=\"m6 17 6-13 6 13\"/><path d=\"M8 13h8\"/>'),\n    fillColor: wrap('<path d=\"m6 11 6-6 8 8-6 6-6 0z\"/><path d=\"m12 5-2-2\"/><path d=\"M2 22h20\"/><path d=\"m18 16 2 2\"/>'),\n\n    // ---- Alignment & lists ----\n    alignLeft: wrap('<path d=\"M3 6h18M3 12h12M3 18h18M3 24\"/>'),\n    alignCenter: wrap('<path d=\"M3 6h18M6 12h12M3 18h18\"/>'),\n    alignRight: wrap('<path d=\"M3 6h18M9 12h12M3 18h18\"/>'),\n    alignJustify: wrap('<path d=\"M3 6h18M3 12h18M3 18h18\"/>'),\n    bulletList: wrap('<circle cx=\"4\" cy=\"6\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"4\" cy=\"12\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"4\" cy=\"18\" r=\"1.2\" fill=\"currentColor\"/><path d=\"M9 6h12M9 12h12M9 18h12\"/>'),\n    orderedList: wrap('<path d=\"M9 6h12M9 12h12M9 18h12\"/><path d=\"M3 5h2v3M3 11h2.5L3 14h2.5M3 18h2v.5l-2 1V20h2\"/>'),\n    nepaliList: wrap('<path d=\"M9 6h12M9 12h12M9 18h12\"/><text x=\"2\" y=\"9\" font-size=\"7\" fill=\"currentColor\" stroke=\"none\">१</text><text x=\"2\" y=\"15\" font-size=\"7\" fill=\"currentColor\" stroke=\"none\">२</text>'),\n    taskList: wrap('<rect x=\"3\" y=\"4\" width=\"6\" height=\"6\" rx=\"1\"/><path d=\"m4 7 1 1 2-2\"/><rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\"/><path d=\"M12 7h9M12 17h9\"/>'),\n    indentRight: wrap('<path d=\"M3 6h18M11 12h10M3 18h18\"/><path d=\"m3 9 4 3-4 3\"/>'),\n    indentLeft: wrap('<path d=\"M3 6h18M11 12h10M3 18h18\"/><path d=\"m9 9-4 3 4 3\"/>'),\n\n    // ---- Headings & paragraph ----\n    heading: wrap('<path d=\"M6 4v16M18 4v16M6 12h12\"/>'),\n    h1: wrap('<path d=\"M4 4v16M4 12h10M14 4v16\"/><text x=\"17\" y=\"20\" font-size=\"6\" font-weight=\"700\" fill=\"currentColor\" stroke=\"none\">1</text>'),\n    h2: wrap('<path d=\"M4 4v16M4 12h10M14 4v16\"/><text x=\"17\" y=\"20\" font-size=\"6\" font-weight=\"700\" fill=\"currentColor\" stroke=\"none\">2</text>'),\n    h3: wrap('<path d=\"M4 4v16M4 12h10M14 4v16\"/><text x=\"17\" y=\"20\" font-size=\"6\" font-weight=\"700\" fill=\"currentColor\" stroke=\"none\">3</text>'),\n    paragraph: wrap('<path d=\"M13 4v16M17 4v16M9 4h8M9 4v8M9 4a4 4 0 0 0 0 8M9 12h4\"/>'),\n    blockquote: wrap('<path d=\"M3 21V11l5-7M9 21V11l5-7\"/><path d=\"M3 11h6M9 11h6\"/>'),\n    horizontalRule: wrap('<path d=\"M3 12h18\"/>'),\n\n    // ---- Insert ----\n    image: wrap('<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"9\" r=\"1.5\"/><path d=\"m21 15-5-5L5 21\"/>'),\n    table: wrap('<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18M3 15h18M9 3v18M15 3v18\"/>'),\n    math: wrap('<path d=\"M5 4h14M5 4 12 12 5 20h14M9 12h6\"/>'),\n    citation: wrap('<path d=\"M7 7v4a3 3 0 0 0 3 3h0V7zM14 7v4a3 3 0 0 0 3 3h0V7z\"/>'),\n    footnote: wrap('<path d=\"M5 5h12v12H5z\" opacity=\"0\"/><path d=\"M4 4h6v6H4zm10 0h6v6h-6z\" opacity=\"0\"/><path d=\"M4 4v16M4 4h16M4 12h12M4 20h16\"/>'),\n    pageBreak: wrap('<path d=\"M5 6h14M5 18h14\"/><path d=\"M3 12h2M9 12h2M13 12h2M19 12h2\"/>'),\n    pageNumber: wrap('<path d=\"M5 4h12l3 3v13a2 2 0 0 1-2 2H5z\"/><text x=\"8\" y=\"16\" font-size=\"7\" font-weight=\"700\" fill=\"currentColor\" stroke=\"none\">#</text>'),\n    toc: wrap('<path d=\"M3 6h2M3 12h2M3 18h2M8 6h13M8 12h13M8 18h13\"/>'),\n    template: wrap('<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18M9 9v12\"/>'),\n    emoji: wrap('<circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"9\" cy=\"10\" r=\".8\" fill=\"currentColor\"/><circle cx=\"15\" cy=\"10\" r=\".8\" fill=\"currentColor\"/><path d=\"M8 14a4 4 0 0 0 8 0\"/>'),\n    textbox: wrap('<rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"1.5\"/><path d=\"M7 10h10M7 14h6\"/>'),\n\n    // ---- Layout & view ----\n    pageSize: wrap('<rect x=\"5\" y=\"3\" width=\"14\" height=\"18\" rx=\"1\"/><path d=\"M9 3v6M15 3v6M9 21v-6M15 21v-6\"/>'),\n    margins: wrap('<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" stroke-dasharray=\"2 2\"/>'),\n    orientation: wrap('<rect x=\"4\" y=\"3\" width=\"16\" height=\"11\" rx=\"1\"/><rect x=\"6\" y=\"16\" width=\"9\" height=\"5\" rx=\"1\"/>'),\n    zoomIn: wrap('<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"M21 21l-4.3-4.3M11 8v6M8 11h6\"/>'),\n    zoomOut: wrap('<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"M21 21l-4.3-4.3M8 11h6\"/>'),\n    eye: wrap('<path d=\"M2 12s4-7 10-7 10 7 10 7-4 7-10 7-10-7-10-7z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>'),\n    eyeOff: wrap('<path d=\"M3 3l18 18\"/><path d=\"M10.6 5.1A11 11 0 0 1 12 5c6 0 10 7 10 7a18 18 0 0 1-2.6 3.4M6.5 6.5C3.7 8.4 2 12 2 12s4 7 10 7c2 0 3.7-.5 5.1-1.3\"/><path d=\"M14.1 14.1A3 3 0 0 1 9.9 9.9\"/>'),\n    sun: wrap('<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/>'),\n    moon: wrap('<path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\"/>'),\n    panelLeft: wrap('<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M9 3v18\"/>'),\n    panelRight: wrap('<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M15 3v18\"/>'),\n\n    // ---- Misc & status ----\n    search: wrap('<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m21 21-4.3-4.3\"/>'),\n    replace: wrap('<path d=\"M14 4 18 8 14 12\"/><path d=\"M18 8H8a4 4 0 0 0-4 4v0\"/><path d=\"m10 20-4-4 4-4\"/><path d=\"M6 16h10a4 4 0 0 0 4-4v0\"/>'),\n    settings: wrap('<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3h0a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5h0a1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8v0a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z\"/>'),\n    info: wrap('<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 16v-4M12 8h.01\"/>'),\n    keyboard: wrap('<rect x=\"2\" y=\"6\" width=\"20\" height=\"12\" rx=\"2\"/><path d=\"M6 10h.01M10 10h.01M14 10h.01M18 10h.01M6 14h.01M18 14h.01M8 14h8\"/>'),\n    github: wrap('<path d=\"M9 19c-5 1.5-5-2.5-7-3m14 6v-4a3 3 0 0 0-1-2c3 0 6-2 6-6 0-1.6-.6-3-1.5-4 .4-1 .4-2.5-.5-4 0 0-1.6 0-3 1.4-1.5-.4-3-.5-4.5 0C7 1.4 5.5 1 5.5 1c-1 1.5-1 3-.5 4-1 1-1.5 2.4-1.5 4 0 4 3 6 6 6a3 3 0 0 0-1 2v4\"/>'),\n    chevronDown: wrap('<path d=\"m6 9 6 6 6-6\"/>'),\n    chevronUp: wrap('<path d=\"m18 15-6-6-6 6\"/>'),\n    chevronRight: wrap('<path d=\"m9 6 6 6-6 6\"/>'),\n    chevronLeft: wrap('<path d=\"m15 6-6 6 6 6\"/>'),\n    close: wrap('<path d=\"M18 6 6 18M6 6l12 12\"/>'),\n    check: wrap('<path d=\"m5 12 5 5L20 7\"/>'),\n    plus: wrap('<path d=\"M12 5v14M5 12h14\"/>'),\n    minus: wrap('<path d=\"M5 12h14\"/>'),\n    moreHorizontal: wrap('<circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/>'),\n    track: wrap('<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><path d=\"m17 8-5-5-5 5M12 3v12\"/>'),\n    comment: wrap('<path d=\"M21 11.5a8.4 8.4 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7a8.5 8.5 0 0 1 4.7-12.3 8.4 8.4 0 0 1 3.6-.9h.5a8.5 8.5 0 0 1 8 8z\"/>'),\n    drag: wrap('<circle cx=\"9\" cy=\"6\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"9\" cy=\"12\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"9\" cy=\"18\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"15\" cy=\"6\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"15\" cy=\"12\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"15\" cy=\"18\" r=\"1.2\" fill=\"currentColor\"/>'),\n};\n\nexport type IconName = keyof typeof Icons;\n\nexport function icon(name: IconName): string {\n    return Icons[name];\n}\n","import type { WordEditor, PageLayoutOptions } from '@raazkhnl/rk-editor-core';\nimport { Modal } from './Modal';\n\nexport function showLinkDialog(editor: WordEditor): void {\n    new Modal({\n        title: 'Insert link',\n        fields: [\n            { id: 'url', label: 'URL', type: 'text', value: 'https://', placeholder: 'https://example.com' },\n            { id: 'text', label: 'Display text (optional)', type: 'text', placeholder: 'Optional text' },\n        ],\n        confirmLabel: 'Insert',\n        onConfirm: (data) => {\n            const safe = sanitizeUrl(data.url);\n            if (!safe) return;\n            const chain = (editor.instance.chain().focus() as any);\n            if (data.text) {\n                chain.insertContent({\n                    type: 'text', text: data.text,\n                    marks: [{ type: 'link', attrs: { href: safe } }],\n                }).run();\n            } else {\n                chain.setLink({ href: safe }).run();\n            }\n        },\n    }).show();\n}\n\n/**\n * Reject `javascript:`, `data:` and `vbscript:` URLs to avoid XSS via the\n * link dialog. Returns the sanitised URL or null.\n */\nfunction sanitizeUrl(input: string | undefined | null): string | null {\n    if (!input) return null;\n    const trimmed = String(input).trim();\n    if (!trimmed) return null;\n    const lowered = trimmed.toLowerCase();\n    if (lowered.startsWith('javascript:') || lowered.startsWith('vbscript:')) return null;\n    if (lowered.startsWith('data:')) return null;\n    return trimmed;\n}\n\nexport function showImageDialog(editor: WordEditor): void {\n    new Modal({\n        title: 'Insert image',\n        width: 460,\n        fields: [\n            { id: 'src', label: 'Image URL', type: 'text', placeholder: 'https://example.com/photo.png' },\n            { id: 'alt', label: 'Alt text (for screen readers)', type: 'text', placeholder: 'Describe the image' },\n            { id: 'title', label: 'Title (tooltip on hover, optional)', type: 'text', placeholder: 'Tooltip' },\n            { id: 'width', label: 'Width (e.g. 480, 60%)', type: 'text' },\n        ],\n        confirmLabel: 'Insert',\n        onConfirm: (data) => {\n            const src = sanitizeUrl(data.src);\n            if (!src) return;\n            const attrs: any = { src, alt: data.alt || '' };\n            if (data.title) attrs.title = data.title;\n            if (data.width) attrs.width = data.width;\n            (editor.instance.chain().focus() as any).setImage(attrs).run();\n        },\n    }).show();\n}\n\nexport function showTableDialog(editor: WordEditor): void {\n    new Modal({\n        title: 'Insert table',\n        fields: [\n            { id: 'rows', label: 'Rows', type: 'number', value: 3, min: 1, max: 50 },\n            { id: 'cols', label: 'Columns', type: 'number', value: 3, min: 1, max: 20 },\n            {\n                id: 'header', label: 'Header row', type: 'select', value: 'true',\n                options: [{ label: 'Yes', value: 'true' }, { label: 'No', value: 'false' }],\n            },\n        ],\n        confirmLabel: 'Insert',\n        onConfirm: (data) => {\n            editor.format.insertTable({\n                rows: data.rows || 3,\n                cols: data.cols || 3,\n                withHeaderRow: String(data.header) === 'true',\n            });\n        },\n    }).show();\n}\n\nexport function showMathDialog(editor: WordEditor): void {\n    new Modal({\n        title: 'Insert math (LaTeX)',\n        fields: [\n            { id: 'latex', label: 'Expression', type: 'text', value: 'E=mc^2', placeholder: 'LaTeX expression' },\n            {\n                id: 'kind', label: 'Type', type: 'select', value: 'inline',\n                options: [{ label: 'Inline', value: 'inline' }, { label: 'Block', value: 'block' }],\n            },\n        ],\n        confirmLabel: 'Insert',\n        onConfirm: (data) => {\n            if (!data.latex) return;\n            if (data.kind === 'block') editor.format.insertMathBlock(data.latex);\n            else editor.format.insertMathInline(data.latex);\n        },\n    }).show();\n}\n\nexport function showFootnoteDialog(editor: WordEditor): void {\n    new Modal({\n        title: 'Insert footnote',\n        fields: [{ id: 'text', label: 'Footnote text', type: 'textarea' }],\n        confirmLabel: 'Insert',\n        onConfirm: (data) => editor.format.footnote(data.text || ''),\n    }).show();\n}\n\nexport function showCitationDialog(editor: WordEditor): void {\n    new Modal({\n        title: 'Insert citation',\n        fields: [\n            { id: 'key', label: 'Citation key', type: 'text', placeholder: 'smith2024' },\n            { id: 'label', label: 'Label (optional)', type: 'text', placeholder: 'Smith, 2024' },\n        ],\n        confirmLabel: 'Insert',\n        onConfirm: (data) => {\n            if (!data.key) return;\n            editor.format.insertCitation(data.key, data.label || undefined);\n        },\n    }).show();\n}\n\nexport function showPageLayoutDialog(editor: WordEditor): void {\n    const layout = editor.getPageLayout();\n    new Modal({\n        title: 'Page layout',\n        width: 480,\n        fields: [\n            {\n                id: 'pageSize', label: 'Page size', type: 'select', value: layout.pageSize,\n                options: [\n                    { label: 'A4 (210 × 297 mm)', value: 'A4' },\n                    { label: 'A3 (297 × 420 mm)', value: 'A3' },\n                    { label: 'A5 (148 × 210 mm)', value: 'A5' },\n                    { label: 'Letter (8.5 × 11 in)', value: 'Letter' },\n                    { label: 'Legal (8.5 × 14 in)', value: 'Legal' },\n                    { label: 'Tabloid (11 × 17 in)', value: 'Tabloid' },\n                ],\n            },\n            {\n                id: 'orientation', label: 'Orientation', type: 'select', value: layout.orientation,\n                options: [{ label: 'Portrait', value: 'portrait' }, { label: 'Landscape', value: 'landscape' }],\n            },\n            { id: 'top', label: 'Top margin', type: 'text', value: layout.margins.top },\n            { id: 'bottom', label: 'Bottom margin', type: 'text', value: layout.margins.bottom },\n            { id: 'left', label: 'Left margin', type: 'text', value: layout.margins.left },\n            { id: 'right', label: 'Right margin', type: 'text', value: layout.margins.right },\n        ],\n        confirmLabel: 'Apply',\n        onConfirm: (data) => {\n            const next: Partial<PageLayoutOptions> = {\n                pageSize: data.pageSize,\n                orientation: data.orientation,\n                margins: { top: data.top, bottom: data.bottom, left: data.left, right: data.right },\n            };\n            editor.setPageLayout(next);\n        },\n    }).show();\n}\n\nexport function showTocDialog(editor: WordEditor): void {\n    new Modal({\n        title: 'Insert table of contents',\n        width: 460,\n        fields: [\n            { id: 'title', label: 'Title', type: 'text', value: 'Table of contents', placeholder: 'Heading shown above the TOC' },\n            {\n                id: 'minLevel', label: 'From heading', type: 'select', value: '1',\n                options: [1, 2, 3, 4, 5, 6].map(l => ({ label: `H${l}`, value: String(l) })),\n            },\n            {\n                id: 'maxLevel', label: 'To heading', type: 'select', value: '3',\n                options: [1, 2, 3, 4, 5, 6].map(l => ({ label: `H${l}`, value: String(l) })),\n            },\n            {\n                id: 'showLeader', label: 'Show dotted leader', type: 'select', value: 'true',\n                options: [{ label: 'Yes', value: 'true' }, { label: 'No', value: 'false' }],\n            },\n            {\n                id: 'showPageNumbers', label: 'Show page numbers', type: 'select', value: 'true',\n                options: [{ label: 'Yes', value: 'true' }, { label: 'No', value: 'false' }],\n            },\n        ],\n        confirmLabel: 'Insert',\n        onConfirm: (data) => {\n            const min = Math.min(parseInt(data.minLevel, 10) || 1, parseInt(data.maxLevel, 10) || 3);\n            const max = Math.max(parseInt(data.minLevel, 10) || 1, parseInt(data.maxLevel, 10) || 3);\n            editor.format.insertTableOfContents({\n                title: data.title || 'Table of contents',\n                minLevel: min,\n                maxLevel: max,\n                showLeader: data.showLeader !== 'false',\n                showPageNumbers: data.showPageNumbers !== 'false',\n            });\n        },\n    }).show();\n}\n\nexport function showShortcutsDialog(): void {\n    const rows = [\n        ['Bold', 'Ctrl/⌘+B'],\n        ['Italic', 'Ctrl/⌘+I'],\n        ['Underline', 'Ctrl/⌘+U'],\n        ['Strikethrough', 'Ctrl/⌘+Shift+X'],\n        ['Heading 1 / 2 / 3', 'Ctrl/⌘+Alt+1 / 2 / 3'],\n        ['Bullet list', 'Ctrl/⌘+Shift+8'],\n        ['Numbered list', 'Ctrl/⌘+Shift+7'],\n        ['Indent / Outdent', 'Tab / Shift+Tab'],\n        ['Insert link', 'Ctrl/⌘+K'],\n        ['Find', 'Ctrl/⌘+F'],\n        ['Find & Replace', 'Ctrl/⌘+H'],\n        ['Page break', 'Ctrl/⌘+Enter'],\n        ['Undo / Redo', 'Ctrl/⌘+Z / Ctrl/⌘+Shift+Z'],\n        ['Print / Export PDF', 'Ctrl/⌘+P'],\n        ['Save (autosave)', 'Ctrl/⌘+S'],\n        ['Command palette', 'Ctrl/⌘+/'],\n    ];\n    new Modal({\n        title: 'Keyboard shortcuts',\n        width: 520,\n        bodyHtml: `<table class=\"rk-shortcut-table\"><tbody>${rows.map(r => `<tr><td>${r[0]}</td><td><kbd>${r[1]}</kbd></td></tr>`).join('')}</tbody></table>`,\n        confirmLabel: 'Done',\n    }).show();\n}\n\nexport const RK_EDITOR_VERSION = '4.6.0';\n\nexport function showAboutDialog(): void {\n    new Modal({\n        title: 'About RK Word Editor',\n        width: 480,\n        bodyHtml: `<p>A free, open-source, fully customizable Word-style editor built with Tiptap and ProseMirror.</p>\n            <p><strong>Version:</strong> ${RK_EDITOR_VERSION}<br/>\n            <strong>Author:</strong> RaaZ Khanal (@raazkhnl)<br/>\n            <strong>License:</strong> MIT</p>\n            <p><a href=\"https://github.com/raazkhnl/rk-word-editor\" target=\"_blank\" rel=\"noopener\">View on GitHub</a></p>`,\n        confirmLabel: 'Close',\n    }).show();\n}\n","import type { WordEditor } from '@raazkhnl/rk-editor-core';\nimport { icon } from './icons';\n\n/**\n * Floating, draggable Find &amp; Replace popup.\n *\n * - Opens with `Ctrl/⌘+F` (find) or `Ctrl/⌘+H` (find &amp; replace).\n * - Can be dragged anywhere on screen by its title bar.\n * - Live match counter; Enter / Shift+Enter cycle through matches.\n * - Supports case-sensitive, whole-word and regex modes.\n */\nexport class FindReplaceBar {\n    private el: HTMLDivElement;\n    private editor: WordEditor;\n    private replaceMode = false;\n    private query = '';\n    private replacement = '';\n    private caseSensitive = false;\n    private regex = false;\n    private wholeWord = false;\n    private statusEl!: HTMLSpanElement;\n    private findInput!: HTMLInputElement;\n    private replaceInput!: HTMLInputElement;\n    private replaceRow!: HTMLDivElement;\n\n    constructor(editor: WordEditor, parent: HTMLElement) {\n        this.editor = editor;\n        this.el = document.createElement('div');\n        this.el.className = 'rk-find-bar';\n        this.el.setAttribute('role', 'dialog');\n        this.el.setAttribute('aria-label', 'Find and replace');\n        this.el.style.display = 'none';\n        this.render();\n        parent.appendChild(this.el);\n    }\n\n    private render() {\n        this.el.innerHTML = `\n            <div class=\"rk-find-handle\" data-drag-handle>\n                <span class=\"rk-find-title\">${icon('search')}<span>Find</span></span>\n                <button class=\"rk-icon-btn rk-find-close\" title=\"Close (Esc)\" aria-label=\"Close find\">${icon('close')}</button>\n            </div>\n            <div class=\"rk-find-row\">\n                <button class=\"rk-icon-btn rk-find-toggle\" title=\"Toggle replace\" aria-label=\"Toggle replace\">${icon('chevronRight')}</button>\n                <div class=\"rk-find-input-wrap\">\n                    <input type=\"text\" class=\"rk-find-input\" placeholder=\"Find\" autocomplete=\"off\" spellcheck=\"false\" />\n                </div>\n                <button class=\"rk-icon-btn rk-find-prev\" title=\"Previous match (Shift+Enter)\" aria-label=\"Previous match\">${icon('chevronUp')}</button>\n                <button class=\"rk-icon-btn rk-find-next\" title=\"Next match (Enter)\" aria-label=\"Next match\">${icon('chevronDown')}</button>\n                <span class=\"rk-find-status\" aria-live=\"polite\">0 of 0</span>\n            </div>\n            <div class=\"rk-find-row rk-find-options-row\">\n                <button class=\"rk-find-opt rk-find-case\" title=\"Match case\" aria-pressed=\"false\">Aa</button>\n                <button class=\"rk-find-opt rk-find-word\" title=\"Whole word\" aria-pressed=\"false\">[w]</button>\n                <button class=\"rk-find-opt rk-find-regex\" title=\"Regular expression\" aria-pressed=\"false\">.*</button>\n            </div>\n            <div class=\"rk-find-row rk-find-replace-row\" style=\"display:none\">\n                <div class=\"rk-find-input-wrap\">\n                    <input type=\"text\" class=\"rk-find-replace-input\" placeholder=\"Replace with…\" autocomplete=\"off\" spellcheck=\"false\" />\n                </div>\n                <button class=\"rk-btn rk-btn-secondary rk-find-replace-one\">Replace</button>\n                <button class=\"rk-btn rk-btn-primary rk-find-replace-all\">All</button>\n            </div>`;\n\n        this.findInput = this.el.querySelector('.rk-find-input') as HTMLInputElement;\n        this.replaceInput = this.el.querySelector('.rk-find-replace-input') as HTMLInputElement;\n        this.statusEl = this.el.querySelector('.rk-find-status') as HTMLSpanElement;\n        this.replaceRow = this.el.querySelector('.rk-find-replace-row') as HTMLDivElement;\n\n        this.bindInputs();\n        this.bindButtons();\n        this.bindDragging();\n    }\n\n    private bindInputs() {\n        this.findInput.addEventListener('input', () => {\n            this.query = this.findInput.value;\n            this.runFind();\n        });\n        this.findInput.addEventListener('keydown', (e) => {\n            if (e.key === 'Enter') {\n                e.preventDefault();\n                if (e.shiftKey) this.editor.commands.findPrev();\n                else this.editor.commands.findNext();\n                this.updateStatus();\n            } else if (e.key === 'Escape') {\n                this.close();\n            }\n        });\n        this.replaceInput.addEventListener('input', () => {\n            this.replacement = this.replaceInput.value;\n        });\n        this.replaceInput.addEventListener('keydown', (e) => {\n            if (e.key === 'Escape') this.close();\n            if (e.key === 'Enter') { e.preventDefault(); this.replaceOne(); }\n        });\n    }\n\n    private bindButtons() {\n        this.el.querySelector('.rk-find-prev')?.addEventListener('click', () => {\n            this.editor.commands.findPrev();\n            this.updateStatus();\n        });\n        this.el.querySelector('.rk-find-next')?.addEventListener('click', () => {\n            this.editor.commands.findNext();\n            this.updateStatus();\n        });\n        this.el.querySelector('.rk-find-close')?.addEventListener('click', () => this.close());\n        this.el.querySelector('.rk-find-toggle')?.addEventListener('click', () => this.toggleReplace());\n        this.el.querySelector('.rk-find-replace-one')?.addEventListener('click', () => this.replaceOne());\n        this.el.querySelector('.rk-find-replace-all')?.addEventListener('click', () => this.replaceAll());\n\n        const setupOpt = (cls: string, onChange: (v: boolean) => void) => {\n            const btn = this.el.querySelector(cls) as HTMLButtonElement;\n            btn.addEventListener('click', () => {\n                const next = btn.getAttribute('aria-pressed') !== 'true';\n                btn.setAttribute('aria-pressed', String(next));\n                btn.classList.toggle('is-active', next);\n                onChange(next);\n                this.runFind();\n            });\n        };\n        setupOpt('.rk-find-case', v => (this.caseSensitive = v));\n        setupOpt('.rk-find-word', v => (this.wholeWord = v));\n        setupOpt('.rk-find-regex', v => (this.regex = v));\n    }\n\n    private bindDragging() {\n        const handle = this.el.querySelector('.rk-find-handle') as HTMLElement;\n        let dragging = false;\n        let startX = 0, startY = 0, startLeft = 0, startTop = 0;\n\n        handle.addEventListener('mousedown', (e) => {\n            // Don't start a drag if user clicked the close button.\n            if ((e.target as HTMLElement).closest('.rk-find-close')) return;\n            dragging = true;\n            startX = e.clientX;\n            startY = e.clientY;\n            const rect = this.el.getBoundingClientRect();\n            startLeft = rect.left;\n            startTop = rect.top;\n            this.el.style.transition = 'none';\n            this.el.classList.add('is-dragging');\n            e.preventDefault();\n        });\n\n        const onMove = (e: MouseEvent) => {\n            if (!dragging) return;\n            const dx = e.clientX - startX;\n            const dy = e.clientY - startY;\n            const left = Math.max(8, Math.min(window.innerWidth - this.el.offsetWidth - 8, startLeft + dx));\n            const top = Math.max(8, Math.min(window.innerHeight - this.el.offsetHeight - 8, startTop + dy));\n            this.el.style.left = `${left}px`;\n            this.el.style.top = `${top}px`;\n            this.el.style.right = 'auto';\n            this.el.style.bottom = 'auto';\n        };\n        const onUp = () => {\n            if (!dragging) return;\n            dragging = false;\n            this.el.classList.remove('is-dragging');\n            this.el.style.transition = '';\n        };\n        document.addEventListener('mousemove', onMove);\n        document.addEventListener('mouseup', onUp);\n    }\n\n    private runFind() {\n        if (!this.query) {\n            this.editor.clearSearch();\n            this.statusEl.textContent = '0 of 0';\n            return;\n        }\n        this.editor.find(this.query, { caseSensitive: this.caseSensitive, regex: this.regex });\n        this.updateStatus();\n    }\n\n    private updateStatus() {\n        const storage: any = (this.editor.instance.storage as any).findReplace;\n        if (!storage) return;\n        const total = storage.results?.length || 0;\n        const idx = total ? (storage.current >= 0 ? storage.current + 1 : 1) : 0;\n        this.statusEl.textContent = `${idx} of ${total}`;\n    }\n\n    private replaceOne() {\n        if (!this.query) return;\n        this.editor.replace(this.query, this.replacement, false, {\n            caseSensitive: this.caseSensitive, regex: this.regex,\n        });\n        this.updateStatus();\n    }\n\n    private replaceAll() {\n        if (!this.query) return;\n        const n = this.editor.replace(this.query, this.replacement, true, {\n            caseSensitive: this.caseSensitive, regex: this.regex,\n        });\n        this.statusEl.textContent = `${n} replaced`;\n    }\n\n    public toggleReplace(force?: boolean) {\n        this.replaceMode = force ?? !this.replaceMode;\n        this.replaceRow.style.display = this.replaceMode ? 'flex' : 'none';\n        const toggle = this.el.querySelector('.rk-find-toggle') as HTMLElement;\n        toggle.innerHTML = this.replaceMode ? icon('chevronDown') : icon('chevronRight');\n        const title = this.el.querySelector('.rk-find-title span') as HTMLElement | null;\n        if (title) title.textContent = this.replaceMode ? 'Find & replace' : 'Find';\n    }\n\n    public open(replace = false) {\n        this.toggleReplace(replace);\n        this.el.style.display = 'block';\n        // Position in the top-right of the editor surface area on first open.\n        if (!this.el.style.left) {\n            const parentRect = this.el.parentElement?.getBoundingClientRect();\n            if (parentRect) {\n                this.el.style.right = '24px';\n                this.el.style.top = `${parentRect.top + 16}px`;\n            }\n        }\n        // Pre-fill with selected text (if any).\n        const sel = this.editor.instance.state.doc.textBetween(\n            this.editor.instance.state.selection.from,\n            this.editor.instance.state.selection.to,\n        );\n        if (sel && sel.length < 200) {\n            this.findInput.value = sel;\n            this.query = sel;\n            this.runFind();\n        }\n        this.findInput.focus();\n        this.findInput.select();\n    }\n\n    public close() {\n        this.el.style.display = 'none';\n        this.editor.clearSearch();\n        this.editor.focus();\n    }\n\n    public destroy() {\n        this.el.remove();\n    }\n}\n","import type { WordEditor } from '@raazkhnl/rk-editor-core';\nimport { icon } from './icons';\n\nexport interface StatusBarOptions {\n    showWordCount?: boolean;\n    showZoom?: boolean;\n    showPage?: boolean;\n    showReadingTime?: boolean;\n    showAutoSave?: boolean;\n}\n\nexport type AutoSaveState = 'idle' | 'saving' | 'saved' | 'error';\n\nexport class StatusBar {\n    private el: HTMLDivElement;\n    private editor: WordEditor;\n    private opts: StatusBarOptions;\n    private wcEl!: HTMLSpanElement;\n    private pageEl!: HTMLSpanElement;\n    private readEl!: HTMLSpanElement;\n    private zoomLabel!: HTMLSpanElement;\n    private saveEl!: HTMLSpanElement;\n    private savedAt: number | null = null;\n    private resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n    constructor(editor: WordEditor, parent: HTMLElement, opts: StatusBarOptions = {}) {\n        this.editor = editor;\n        this.opts = {\n            showWordCount: true,\n            showZoom: true,\n            showPage: true,\n            showReadingTime: true,\n            showAutoSave: true,\n            ...opts,\n        };\n        this.el = document.createElement('div');\n        this.el.className = 'rk-statusbar';\n        this.render();\n        parent.appendChild(this.el);\n        this.update();\n        this.editor.instance.on('update', () => this.update());\n        this.editor.instance.on('selectionUpdate', () => this.update());\n    }\n\n    private render() {\n        this.el.innerHTML = `\n            <div class=\"rk-statusbar-left\">\n                <span class=\"rk-status-page\" title=\"Estimated pages\"></span>\n                <span class=\"rk-status-wc\" title=\"Word count\"></span>\n                <span class=\"rk-status-read\" title=\"Reading time\"></span>\n                ${this.opts.showAutoSave ? `<span class=\"rk-status-autosave\" data-state=\"idle\" aria-live=\"polite\">Ready</span>` : ''}\n            </div>\n            <div class=\"rk-statusbar-right\">\n                <button class=\"rk-icon-btn rk-zoom-out\" aria-label=\"Zoom out\" title=\"Zoom out (Ctrl+-)\">${icon('zoomOut')}</button>\n                <span class=\"rk-zoom-label\" aria-live=\"polite\">100%</span>\n                <button class=\"rk-icon-btn rk-zoom-in\" aria-label=\"Zoom in\" title=\"Zoom in (Ctrl++)\">${icon('zoomIn')}</button>\n            </div>\n        `;\n        this.pageEl = this.el.querySelector('.rk-status-page')!;\n        this.wcEl = this.el.querySelector('.rk-status-wc')!;\n        this.readEl = this.el.querySelector('.rk-status-read')!;\n        this.zoomLabel = this.el.querySelector('.rk-zoom-label')!;\n        this.saveEl = this.el.querySelector('.rk-status-autosave')!;\n\n        this.el.querySelector('.rk-zoom-in')?.addEventListener('click', () => this.bumpZoom(0.1));\n        this.el.querySelector('.rk-zoom-out')?.addEventListener('click', () => this.bumpZoom(-0.1));\n    }\n\n    private bumpZoom(delta: number) {\n        const z = Math.round((this.editor.getZoom() + delta) * 100) / 100;\n        this.editor.setZoom(z);\n        this.zoomLabel.textContent = `${Math.round(z * 100)}%`;\n    }\n\n    public update() {\n        const stats = this.editor.getWordCount();\n        if (this.opts.showPage) this.pageEl.textContent = `Page ${stats.pages}`;\n        if (this.opts.showWordCount) this.wcEl.textContent = `${stats.words} words • ${stats.characters} chars`;\n        if (this.opts.showReadingTime) this.readEl.textContent = `${stats.readingTimeMinutes} min read`;\n        this.zoomLabel.textContent = `${Math.round(this.editor.getZoom() * 100)}%`;\n    }\n\n    /** Reflect auto-save progress in the status bar pill. */\n    public setSaveState(state: AutoSaveState, message?: string) {\n        if (!this.saveEl) return;\n        this.saveEl.classList.remove('is-saving', 'is-saved', 'is-error');\n        if (this.resetTimer) { clearTimeout(this.resetTimer); this.resetTimer = null; }\n        switch (state) {\n            case 'saving':\n                this.saveEl.classList.add('is-saving');\n                this.saveEl.textContent = message ?? 'Saving…';\n                break;\n            case 'saved':\n                this.saveEl.classList.add('is-saved');\n                this.savedAt = Date.now();\n                this.saveEl.textContent = message ?? 'Saved';\n                this.resetTimer = setTimeout(() => this.refreshSavedLabel(), 30_000);\n                break;\n            case 'error':\n                this.saveEl.classList.add('is-error');\n                this.saveEl.textContent = message ?? 'Save failed';\n                break;\n            default:\n                this.saveEl.textContent = message ?? 'Ready';\n        }\n    }\n\n    private refreshSavedLabel() {\n        if (!this.saveEl || !this.savedAt) return;\n        const seconds = Math.floor((Date.now() - this.savedAt) / 1000);\n        if (seconds < 60) this.saveEl.textContent = `Saved ${seconds}s ago`;\n        else if (seconds < 3600) this.saveEl.textContent = `Saved ${Math.floor(seconds / 60)}m ago`;\n        else this.saveEl.textContent = 'Saved';\n        this.resetTimer = setTimeout(() => this.refreshSavedLabel(), 30_000);\n    }\n\n    public destroy() {\n        if (this.resetTimer) clearTimeout(this.resetTimer);\n        this.el.remove();\n    }\n}\n","import type { WordEditor } from '@raazkhnl/rk-editor-core';\nimport { icon } from './icons';\n\ninterface Heading { level: number; text: string; pos: number }\n\n/**\n * Document outline pane that lists all headings and lets the user jump to\n * them by clicking. Compact, hierarchical, and scroll-aware.\n */\nexport class Outline {\n    public readonly el: HTMLElement;\n    private editor: WordEditor;\n    private headings: Heading[] = [];\n    private rafId: number | null = null;\n\n    constructor(editor: WordEditor, parent: HTMLElement, position: 'start' | 'end' = 'start') {\n        this.editor = editor;\n        this.el = document.createElement('aside');\n        this.el.className = 'rk-outline';\n        this.render();\n        if (position === 'start') parent.insertBefore(this.el, parent.firstChild);\n        else parent.appendChild(this.el);\n        editor.instance.on('update', () => this.scheduleRefresh());\n        editor.instance.on('create', () => this.refresh());\n    }\n\n    private scheduleRefresh() {\n        if (this.rafId) cancelAnimationFrame(this.rafId);\n        this.rafId = requestAnimationFrame(() => {\n            this.rafId = null;\n            this.refresh();\n        });\n    }\n\n    private render() {\n        this.el.innerHTML = `\n            <header class=\"rk-outline-header\">\n                <span class=\"rk-outline-title\">${icon('toc')}<span>Outline</span></span>\n                <button class=\"rk-icon-btn rk-outline-close\" aria-label=\"Hide outline\" title=\"Hide outline\">${icon('panelLeft')}</button>\n            </header>\n            <div class=\"rk-outline-list\" role=\"navigation\" aria-label=\"Document headings\"></div>\n            <button class=\"rk-outline-reopen\" type=\"button\" aria-label=\"Show outline\" title=\"Show outline\">\n                ${icon('panelLeft')}\n                <span class=\"rk-outline-reopen-label\">Outline</span>\n            </button>\n        `;\n        this.el.querySelector('.rk-outline-close')?.addEventListener('click', () => this.toggle());\n        this.el.querySelector('.rk-outline-reopen')?.addEventListener('click', () => this.toggle());\n        this.refresh();\n    }\n\n    public refresh() {\n        const list = this.el.querySelector('.rk-outline-list') as HTMLElement;\n        if (!list) return;\n\n        // Walk the doc to collect headings WITH their positions so we can\n        // scroll the actual DOM node into view.\n        this.headings = [];\n        this.editor.instance.state.doc.descendants((node, pos) => {\n            if (node.type.name === 'heading' && node.textContent.trim().length) {\n                this.headings.push({ level: node.attrs.level, text: node.textContent, pos });\n            }\n            return true;\n        });\n\n        if (this.headings.length === 0) {\n            list.innerHTML = `<p class=\"rk-outline-empty\">No headings yet. Use H1–H6 to populate the outline.</p>`;\n            return;\n        }\n\n        list.innerHTML = this.headings\n            .map((h, i) => `\n                <button type=\"button\"\n                        class=\"rk-outline-item rk-outline-l${h.level}\"\n                        data-idx=\"${i}\"\n                        title=\"${escapeAttr(h.text)}\">\n                    <span class=\"rk-outline-marker\">H${h.level}</span>\n                    <span class=\"rk-outline-text\">${escapeHtml(h.text)}</span>\n                </button>\n            `).join('');\n\n        list.querySelectorAll<HTMLButtonElement>('.rk-outline-item').forEach((btn) => {\n            btn.addEventListener('click', () => {\n                const idx = Number(btn.dataset.idx);\n                this.jumpTo(idx);\n            });\n        });\n    }\n\n    private jumpTo(idx: number) {\n        const heading = this.headings[idx];\n        if (!heading) return;\n        const view = this.editor.instance.view;\n\n        // 1. Move the editor cursor to the heading.\n        this.editor.instance.commands.setTextSelection(heading.pos + 1);\n\n        // 2. Scroll the heading's actual DOM element into view inside the\n        //    editor's scroll container. `commands.scrollIntoView()` works when\n        //    the editor itself scrolls, but here the surface area is the\n        //    scroller — so we scroll the heading's DOM node directly.\n        const dom = view.nodeDOM(heading.pos) as HTMLElement | null;\n        if (dom && typeof dom.scrollIntoView === 'function') {\n            dom.scrollIntoView({ behavior: 'smooth', block: 'start' });\n        } else {\n            this.editor.instance.commands.scrollIntoView();\n        }\n\n        this.editor.focus();\n    }\n\n    public toggle() { this.el.classList.toggle('rk-outline-collapsed'); }\n    public hide() { this.el.classList.add('rk-outline-collapsed'); }\n    public show() { this.el.classList.remove('rk-outline-collapsed'); }\n    public destroy() {\n        if (this.rafId) cancelAnimationFrame(this.rafId);\n        this.el.remove();\n    }\n}\n\nfunction escapeHtml(s: string): string {\n    return s.replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]!));\n}\n\nfunction escapeAttr(s: string): string {\n    return s.replace(/\"/g, '&quot;');\n}\n","import type { WordEditor } from '@raazkhnl/rk-editor-core';\nimport { icon } from './icons';\n\ninterface SelectionInfo {\n    kind: 'image' | 'table' | 'textBox' | 'toc' | 'paragraph' | 'heading' | null;\n    pos: number;\n    node: any | null;\n}\n\n/**\n * Context-aware property panel docked to the right of the editor.\n *\n * Inspects the current selection on every transaction. When the user has an\n * image, table, text box or TOC selected (or the cursor is inside one) we\n * render a small form with the relevant attributes — width, alignment, levels,\n * row/column controls, etc. — and wire each control to the right command.\n */\nexport class PropertyPanel {\n    public readonly el: HTMLElement;\n    private editor: WordEditor;\n    private last: SelectionInfo = { kind: null, pos: 0, node: null };\n    private collapsed = false;\n\n    constructor(editor: WordEditor, parent: HTMLElement, position: 'end' | 'start' = 'end') {\n        this.editor = editor;\n        this.el = document.createElement('aside');\n        this.el.className = 'rk-properties';\n        this.el.innerHTML = this.emptyState();\n        if (position === 'end') parent.appendChild(this.el);\n        else parent.insertBefore(this.el, parent.firstChild);\n\n        editor.instance.on('selectionUpdate', () => this.update());\n        editor.instance.on('transaction', () => this.update());\n        editor.instance.on('update', () => this.update());\n        this.update();\n    }\n\n    private emptyState() {\n        return `<header class=\"rk-properties-header\">\n                    <span class=\"rk-properties-title\">${icon('settings')}<span>Properties</span></span>\n                    <button class=\"rk-icon-btn rk-properties-close\" type=\"button\" aria-label=\"Hide panel\" title=\"Hide panel\">${icon('panelRight')}</button>\n                </header>\n                <div class=\"rk-properties-body\">\n                    <p class=\"rk-properties-empty\">Select an image, table, text box, or table of contents to edit its properties.</p>\n                </div>\n                <button class=\"rk-properties-reopen\" type=\"button\" aria-label=\"Show properties\" title=\"Show properties panel\">\n                    ${icon('panelRight')}\n                    <span class=\"rk-properties-reopen-label\">Properties</span>\n                </button>`;\n    }\n\n    private update() {\n        const info = detectSelection(this.editor);\n        // Skip a render when nothing meaningful changed.\n        if (\n            info.kind === this.last.kind\n            && info.pos === this.last.pos\n            && (info.kind === null || JSON.stringify(info.node?.attrs) === JSON.stringify(this.last.node?.attrs))\n        ) {\n            return;\n        }\n        this.last = info;\n\n        if (!info.kind) {\n            this.el.innerHTML = this.emptyState();\n            this.bindHeader();\n            return;\n        }\n\n        this.el.innerHTML = `\n            <header class=\"rk-properties-header\">\n                <span class=\"rk-properties-title\">${icon('settings')}<span>${labelFor(info.kind)}</span></span>\n                <button class=\"rk-icon-btn rk-properties-close\" type=\"button\" aria-label=\"Hide panel\" title=\"Hide panel\">${icon('panelRight')}</button>\n            </header>\n            <div class=\"rk-properties-body\">${this.renderBodyFor(info)}</div>\n            <button class=\"rk-properties-reopen\" type=\"button\" aria-label=\"Show properties\" title=\"Show properties panel\">\n                ${icon('panelRight')}\n                <span class=\"rk-properties-reopen-label\">Properties</span>\n            </button>`;\n        this.bindHeader();\n        this.bindBody(info);\n    }\n\n    private bindHeader() {\n        this.el.querySelector('.rk-properties-close')?.addEventListener('click', () => this.toggle());\n        this.el.querySelector('.rk-properties-reopen')?.addEventListener('click', () => this.toggle());\n    }\n\n    public toggle() {\n        this.collapsed = !this.collapsed;\n        this.el.classList.toggle('rk-properties-collapsed', this.collapsed);\n    }\n\n    public destroy() {\n        this.el.remove();\n    }\n\n    // ---------- Renderers ----------\n\n    private renderBodyFor(info: SelectionInfo): string {\n        switch (info.kind) {\n            case 'image': return renderImageBody(info.node);\n            case 'table': return renderTableBody();\n            case 'textBox': return renderTextBoxBody(info.node);\n            case 'toc': return renderTocBody(info.node);\n            case 'heading': return renderHeadingBody(info.node);\n            case 'paragraph': return renderParagraphBody(info.node);\n            default: return '';\n        }\n    }\n\n    private bindBody(info: SelectionInfo) {\n        const ed = this.editor;\n        const $ = (s: string) => this.el.querySelector(s) as HTMLElement | null;\n        const onInput = (sel: string, fn: (v: string) => void) => {\n            const el = $(sel) as HTMLInputElement | HTMLSelectElement | null;\n            if (!el) return;\n            el.addEventListener('change', () => fn(el.value));\n            el.addEventListener('input', () => fn(el.value));\n        };\n        const onClick = (sel: string, fn: () => void) => {\n            $(sel)?.addEventListener('click', (e) => { e.preventDefault(); fn(); });\n        };\n\n        if (info.kind === 'image') {\n            onInput('#prop-img-width', v => ed.format.setImageSize(v));\n            onInput('#prop-img-height', v => {\n                const w = (this.el.querySelector('#prop-img-width') as HTMLInputElement)?.value || '';\n                ed.format.setImageSize(w, v);\n            });\n            onInput('#prop-img-float', v => ed.format.setImageFloat(v as any));\n            onInput('#prop-img-align', v => ed.format.align(v as any));\n            onInput('#prop-img-alt', v => updateImageAttr(ed, info, { alt: v }));\n            onInput('#prop-img-title', v => updateImageAttr(ed, info, { title: v }));\n        }\n\n        if (info.kind === 'table') {\n            onClick('#prop-tbl-row-before', () => ed.format.addRowBefore());\n            onClick('#prop-tbl-row-after', () => ed.format.addRowAfter());\n            onClick('#prop-tbl-row-del', () => ed.format.deleteRow());\n            onClick('#prop-tbl-col-before', () => ed.format.addColumnBefore());\n            onClick('#prop-tbl-col-after', () => ed.format.addColumnAfter());\n            onClick('#prop-tbl-col-del', () => ed.format.deleteColumn());\n            onClick('#prop-tbl-merge', () => ed.format.mergeOrSplit());\n            onClick('#prop-tbl-toggle-header-row', () => ed.format.toggleHeaderRow());\n            onClick('#prop-tbl-toggle-header-col', () => ed.format.toggleHeaderColumn());\n            onClick('#prop-tbl-delete', () => ed.format.deleteTable());\n            onInput('#prop-tbl-bg', v => (ed.format as any).setCellAttribute('background', v));\n        }\n\n        if (info.kind === 'textBox') {\n            onInput('#prop-tb-width', v => updateTextBoxAttr(ed, info, { width: parseInt(v, 10) || 320 }));\n            onInput('#prop-tb-height', v => updateTextBoxAttr(ed, info, { height: parseInt(v, 10) || 160 }));\n            onInput('#prop-tb-bg', v => updateTextBoxAttr(ed, info, { backgroundColor: v }));\n            onInput('#prop-tb-border', v => updateTextBoxAttr(ed, info, { borderColor: v }));\n        }\n\n        if (info.kind === 'toc') {\n            onInput('#prop-toc-min', v => {\n                const max = (this.el.querySelector('#prop-toc-max') as HTMLSelectElement)?.value || '3';\n                ed.format.setTocLevels(parseInt(v, 10), Math.max(parseInt(v, 10), parseInt(max, 10)));\n            });\n            onInput('#prop-toc-max', v => {\n                const min = (this.el.querySelector('#prop-toc-min') as HTMLSelectElement)?.value || '1';\n                ed.format.setTocLevels(Math.min(parseInt(min, 10), parseInt(v, 10)), parseInt(v, 10));\n            });\n            onClick('#prop-toc-refresh', () => ed.format.refreshTableOfContents());\n            const leaderEl = $('#prop-toc-leader') as HTMLInputElement | null;\n            leaderEl?.addEventListener('change', () => {\n                updateTocAttr(ed, info, { showLeader: leaderEl.checked });\n                leaderEl.parentElement?.classList.toggle('is-on', leaderEl.checked);\n            });\n            const pagesEl = $('#prop-toc-pages') as HTMLInputElement | null;\n            pagesEl?.addEventListener('change', () => {\n                updateTocAttr(ed, info, { showPageNumbers: pagesEl.checked });\n                pagesEl.parentElement?.classList.toggle('is-on', pagesEl.checked);\n            });\n            onInput('#prop-toc-title', v => updateTocAttr(ed, info, { title: v }));\n        }\n\n        if (info.kind === 'heading') {\n            this.el.querySelectorAll<HTMLButtonElement>('.rk-heading-chip').forEach(btn => {\n                btn.addEventListener('click', (e) => {\n                    e.preventDefault();\n                    const level = Number(btn.dataset.level);\n                    if (level >= 1 && level <= 6) ed.format.heading(level as any);\n                });\n            });\n            this.el.querySelectorAll<HTMLButtonElement>('.rk-align-btn').forEach(btn => {\n                btn.addEventListener('click', (e) => {\n                    e.preventDefault();\n                    const a = btn.dataset.align as any;\n                    if (a) ed.format.align(a);\n                });\n            });\n        }\n\n        if (info.kind === 'paragraph') {\n            this.el.querySelectorAll<HTMLButtonElement>('.rk-align-btn').forEach(btn => {\n                btn.addEventListener('click', (e) => {\n                    e.preventDefault();\n                    const a = btn.dataset.align as any;\n                    if (a) ed.format.align(a);\n                });\n            });\n            this.el.querySelectorAll<HTMLButtonElement>('.rk-pill-btn').forEach(btn => {\n                btn.addEventListener('click', (e) => {\n                    e.preventDefault();\n                    const v = btn.dataset.lh;\n                    if (v) ed.format.lineHeight(v);\n                });\n            });\n        }\n    }\n}\n\n// ---------- Selection detection ----------\n\nfunction detectSelection(editor: WordEditor): SelectionInfo {\n    const state = editor.instance.state;\n    const sel: any = state.selection;\n\n    // Node selection (image, table, textBox, toc, etc.)\n    if (sel?.node) {\n        const node = sel.node;\n        const name = node.type.name;\n        if (name === 'image') return { kind: 'image', pos: sel.from, node };\n        if (name === 'table') return { kind: 'table', pos: sel.from, node };\n        if (name === 'textBox') return { kind: 'textBox', pos: sel.from, node };\n        if (name === 'tableOfContents') return { kind: 'toc', pos: sel.from, node };\n    }\n\n    // Cursor inside a table / textbox / toc?\n    const $from = state.selection.$from;\n    for (let d = $from.depth; d >= 0; d--) {\n        const n = $from.node(d);\n        if (n.type.name === 'table') return { kind: 'table', pos: $from.before(d), node: n };\n        if (n.type.name === 'textBox') return { kind: 'textBox', pos: $from.before(d), node: n };\n        if (n.type.name === 'tableOfContents') return { kind: 'toc', pos: $from.before(d), node: n };\n    }\n\n    // Heading or paragraph at the cursor.\n    const parent = $from.parent;\n    if (parent?.type?.name === 'heading') return { kind: 'heading', pos: $from.before(), node: parent };\n    if (parent?.type?.name === 'paragraph') return { kind: 'paragraph', pos: $from.before(), node: parent };\n\n    return { kind: null, pos: 0, node: null };\n}\n\nfunction labelFor(kind: NonNullable<SelectionInfo['kind']>): string {\n    return ({\n        image: 'Image properties',\n        table: 'Table properties',\n        textBox: 'Text box properties',\n        toc: 'Table of contents',\n        heading: 'Heading',\n        paragraph: 'Paragraph',\n    } as const)[kind];\n}\n\n// ---------- Body templates ----------\n\nfunction renderImageBody(node: any): string {\n    const w = node?.attrs?.width || '';\n    const h = node?.attrs?.height || '';\n    const float = node?.attrs?.float || 'none';\n    const alt = node?.attrs?.alt || '';\n    const title = node?.attrs?.title || '';\n    return `\n        <div class=\"rk-properties-section\">\n            <h4>Accessibility</h4>\n            ${field('Alt text', `<input id=\"prop-img-alt\" type=\"text\" value=\"${escAttr(alt)}\" placeholder=\"Describe the image\" />`)}\n            ${field('Title', `<input id=\"prop-img-title\" type=\"text\" value=\"${escAttr(title)}\" placeholder=\"Optional tooltip\" />`)}\n            <p class=\"rk-properties-help\">Alt text is read by screen readers and shown if the image fails to load.</p>\n        </div>\n        <div class=\"rk-properties-section\">\n            <h4>Size</h4>\n            ${field('Width', `<input id=\"prop-img-width\" type=\"text\" value=\"${escAttr(w)}\" placeholder=\"e.g. 480 or 60%\" />`)}\n            ${field('Height', `<input id=\"prop-img-height\" type=\"text\" value=\"${escAttr(h)}\" placeholder=\"auto\" />`)}\n        </div>\n        <div class=\"rk-properties-section\">\n            <h4>Layout</h4>\n            ${field('Wrap', selectMarkup('prop-img-float', String(float), [\n                { v: 'none', l: 'No wrap' }, { v: 'left', l: 'Wrap left' }, { v: 'right', l: 'Wrap right' },\n            ]))}\n            ${field('Align', selectMarkup('prop-img-align', '', [\n                { v: 'left', l: 'Left' }, { v: 'center', l: 'Center' }, { v: 'right', l: 'Right' },\n            ]))}\n        </div>\n        <p class=\"rk-properties-hint\">Tip: drag the corner handles on the image to resize visually.</p>\n    `;\n}\n\nfunction renderTableBody(): string {\n    return `\n        <div class=\"rk-properties-section\">\n            <h4>Rows</h4>\n            <div class=\"rk-properties-row\">\n                <button id=\"prop-tbl-row-before\" class=\"rk-btn rk-btn-secondary\">Insert above</button>\n                <button id=\"prop-tbl-row-after\" class=\"rk-btn rk-btn-secondary\">Insert below</button>\n            </div>\n            <button id=\"prop-tbl-row-del\" class=\"rk-btn rk-btn-danger\">Delete row</button>\n        </div>\n        <div class=\"rk-properties-section\">\n            <h4>Columns</h4>\n            <div class=\"rk-properties-row\">\n                <button id=\"prop-tbl-col-before\" class=\"rk-btn rk-btn-secondary\">Insert before</button>\n                <button id=\"prop-tbl-col-after\" class=\"rk-btn rk-btn-secondary\">Insert after</button>\n            </div>\n            <button id=\"prop-tbl-col-del\" class=\"rk-btn rk-btn-danger\">Delete column</button>\n        </div>\n        <div class=\"rk-properties-section\">\n            <h4>Cells</h4>\n            <button id=\"prop-tbl-merge\" class=\"rk-btn rk-btn-secondary\">Merge / split</button>\n            ${field('Cell color', `<input id=\"prop-tbl-bg\" type=\"color\" value=\"#ffffff\" />`)}\n        </div>\n        <div class=\"rk-properties-section\">\n            <h4>Header</h4>\n            <div class=\"rk-properties-row\">\n                <button id=\"prop-tbl-toggle-header-row\" class=\"rk-btn rk-btn-secondary\">Toggle row</button>\n                <button id=\"prop-tbl-toggle-header-col\" class=\"rk-btn rk-btn-secondary\">Toggle column</button>\n            </div>\n        </div>\n        <button id=\"prop-tbl-delete\" class=\"rk-btn rk-btn-danger\" style=\"width:100%;margin-top:6px\">Delete entire table</button>\n        <p class=\"rk-properties-hint\">Tip: drag the right edge of any cell to resize the column.</p>\n    `;\n}\n\nfunction renderTextBoxBody(node: any): string {\n    const w = node?.attrs?.width || 320;\n    const h = node?.attrs?.height || 160;\n    const bg = node?.attrs?.backgroundColor || '#ffffff';\n    const border = node?.attrs?.borderColor || '#cbd5e1';\n    return `\n        ${field('Width (px)', `<input id=\"prop-tb-width\" type=\"number\" min=\"80\" value=\"${escAttr(w)}\" />`)}\n        ${field('Height (px)', `<input id=\"prop-tb-height\" type=\"number\" min=\"60\" value=\"${escAttr(h)}\" />`)}\n        ${field('Background', `<input id=\"prop-tb-bg\" type=\"color\" value=\"${escAttr(bg)}\" />`)}\n        ${field('Border', `<input id=\"prop-tb-border\" type=\"color\" value=\"${escAttr(border)}\" />`)}\n        <p class=\"rk-properties-hint\">Tip: drag the ⠿ handle (top-left) to move; drag a corner to resize.</p>\n    `;\n}\n\nfunction renderTocBody(node: any): string {\n    const min = node?.attrs?.minLevel ?? 1;\n    const max = node?.attrs?.maxLevel ?? 3;\n    const title = node?.attrs?.title || 'Table of contents';\n    const showLeader = node?.attrs?.showLeader !== false;\n    const showPages = node?.attrs?.showPageNumbers !== false;\n    return `\n        <button id=\"prop-toc-refresh\" class=\"rk-btn rk-btn-primary rk-properties-cta\" type=\"button\">\n            <span aria-hidden=\"true\">↻</span> Refresh table of contents\n        </button>\n\n        <div class=\"rk-properties-section\">\n            <h4>Heading</h4>\n            ${field('Title', `<input id=\"prop-toc-title\" type=\"text\" value=\"${escAttr(title)}\" placeholder=\"Table of contents\" />`)}\n        </div>\n\n        <div class=\"rk-properties-section\">\n            <h4>Levels included</h4>\n            <p class=\"rk-properties-help\">Pick the heading depth shown in the table.</p>\n            <div class=\"rk-toc-level-row\">\n                <label class=\"rk-toc-level-pill\">\n                    <span>From</span>\n                    ${selectMarkup('prop-toc-min', String(min), [1,2,3,4,5,6].map(l => ({ v: String(l), l: `H${l}` })))}\n                </label>\n                <span class=\"rk-toc-level-arrow\" aria-hidden=\"true\">→</span>\n                <label class=\"rk-toc-level-pill\">\n                    <span>To</span>\n                    ${selectMarkup('prop-toc-max', String(max), [1,2,3,4,5,6].map(l => ({ v: String(l), l: `H${l}` })))}\n                </label>\n            </div>\n        </div>\n\n        <div class=\"rk-properties-section\">\n            <h4>Display</h4>\n            ${toggleField('Dotted leader', 'prop-toc-leader', showLeader)}\n            ${toggleField('Page numbers', 'prop-toc-pages', showPages)}\n        </div>\n\n        <p class=\"rk-properties-hint\">The TOC does not auto-refresh — press <strong>Refresh</strong> after adding, renaming or removing headings.</p>\n    `;\n}\n\nfunction renderHeadingBody(node: any): string {\n    const level = node?.attrs?.level || 1;\n    const align = node?.attrs?.textAlign || 'left';\n    return `\n        <div class=\"rk-properties-section\">\n            <h4>Style</h4>\n            <p class=\"rk-properties-help\">Click a level to apply it to this paragraph.</p>\n            <div class=\"rk-heading-grid\" role=\"radiogroup\" aria-label=\"Heading level\">\n                ${[1, 2, 3, 4, 5, 6].map(l => `\n                    <button class=\"rk-heading-chip ${l === level ? 'is-active' : ''}\"\n                            data-level=\"${l}\" type=\"button\" role=\"radio\" aria-checked=\"${l === level}\">\n                        <span class=\"rk-heading-chip-num\">H${l}</span>\n                        <span class=\"rk-heading-chip-preview\" style=\"font-size:${headingPreviewSize(l)}px\">${escHtml(headingLabel(l))}</span>\n                    </button>\n                `).join('')}\n            </div>\n        </div>\n\n        <div class=\"rk-properties-section\">\n            <h4>Alignment</h4>\n            <div class=\"rk-align-row\" role=\"radiogroup\" aria-label=\"Alignment\">\n                ${alignBtn('left', '⇤', align === 'left')}\n                ${alignBtn('center', '↔', align === 'center')}\n                ${alignBtn('right', '⇥', align === 'right')}\n                ${alignBtn('justify', '☰', align === 'justify')}\n            </div>\n        </div>\n    `;\n}\n\nfunction renderParagraphBody(node: any): string {\n    const lh = node?.attrs?.lineHeight || '';\n    const align = node?.attrs?.textAlign || 'left';\n    return `\n        <div class=\"rk-properties-section\">\n            <h4>Alignment</h4>\n            <div class=\"rk-align-row\" role=\"radiogroup\" aria-label=\"Alignment\">\n                ${alignBtn('left', '⇤', align === 'left')}\n                ${alignBtn('center', '↔', align === 'center')}\n                ${alignBtn('right', '⇥', align === 'right')}\n                ${alignBtn('justify', '☰', align === 'justify')}\n            </div>\n        </div>\n\n        <div class=\"rk-properties-section\">\n            <h4>Line height</h4>\n            <div class=\"rk-lh-row\" role=\"radiogroup\" aria-label=\"Line height\">\n                ${lineHeightBtn('1', 'Single', lh === '1')}\n                ${lineHeightBtn('1.15', '1.15', lh === '1.15')}\n                ${lineHeightBtn('1.5', '1.5', lh === '1.5')}\n                ${lineHeightBtn('2', 'Double', lh === '2')}\n            </div>\n        </div>\n    `;\n}\n\nfunction alignBtn(value: string, glyph: string, active: boolean): string {\n    return `<button type=\"button\" role=\"radio\" aria-checked=\"${active}\"\n        class=\"rk-icon-btn rk-align-btn${active ? ' is-active' : ''}\"\n        data-align=\"${value}\" title=\"${value[0].toUpperCase() + value.slice(1)}\">${glyph}</button>`;\n}\n\nfunction lineHeightBtn(value: string, label: string, active: boolean): string {\n    return `<button type=\"button\" role=\"radio\" aria-checked=\"${active}\"\n        class=\"rk-pill-btn${active ? ' is-active' : ''}\"\n        data-lh=\"${value}\">${escHtml(label)}</button>`;\n}\n\nfunction toggleField(label: string, id: string, active: boolean): string {\n    return `<label class=\"rk-properties-toggle\">\n        <span>${label}</span>\n        <span class=\"rk-switch ${active ? 'is-on' : ''}\">\n            <input type=\"checkbox\" id=\"${id}\" ${active ? 'checked' : ''} />\n            <span class=\"rk-switch-track\"><span class=\"rk-switch-thumb\"></span></span>\n        </span>\n    </label>`;\n}\n\nfunction headingPreviewSize(level: number): number {\n    return [22, 18, 15, 13, 12, 11][level - 1] || 12;\n}\nfunction headingLabel(level: number): string {\n    return ['Title', 'Section', 'Subsection', 'Heading 4', 'Heading 5', 'Heading 6'][level - 1] || `Heading ${level}`;\n}\n\nfunction field(label: string, control: string): string {\n    return `<label class=\"rk-properties-field\"><span>${label}</span>${control}</label>`;\n}\n\nfunction selectMarkup(id: string, current: string, opts: { v: string; l: string }[]): string {\n    return `<select id=\"${id}\">\n        ${opts.map(o => `<option value=\"${escAttr(o.v)}\"${o.v === current ? ' selected' : ''}>${escHtml(o.l)}</option>`).join('')}\n    </select>`;\n}\n\nfunction escAttr(s: any): string { return String(s ?? '').replace(/\"/g, '&quot;'); }\nfunction escHtml(s: string): string {\n    return s.replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]!));\n}\n\nfunction updateTextBoxAttr(editor: WordEditor, info: SelectionInfo, attrs: Record<string, any>) {\n    const view = editor.instance.view;\n    const tr = editor.instance.state.tr.setNodeMarkup(info.pos, undefined, { ...info.node.attrs, ...attrs });\n    view.dispatch(tr);\n}\n\nfunction updateTocAttr(editor: WordEditor, info: SelectionInfo, attrs: Record<string, any>) {\n    const view = editor.instance.view;\n    const tr = editor.instance.state.tr.setNodeMarkup(info.pos, undefined, { ...info.node.attrs, ...attrs });\n    view.dispatch(tr);\n}\n\nfunction updateImageAttr(editor: WordEditor, info: SelectionInfo, attrs: Record<string, any>) {\n    const view = editor.instance.view;\n    const tr = editor.instance.state.tr.setNodeMarkup(info.pos, undefined, { ...info.node.attrs, ...attrs });\n    view.dispatch(tr);\n}\n","/**\n * Quick command palette opened with Ctrl/⌘+/.\n * Fuzzy filters a flat command list and runs the picked entry.\n */\n\nexport interface PaletteCommand {\n    id: string;\n    title: string;\n    description?: string;\n    shortcut?: string;\n    action: () => void;\n}\n\nexport class CommandPalette {\n    private overlay: HTMLDivElement;\n    private input!: HTMLInputElement;\n    private list!: HTMLUListElement;\n    private commands: PaletteCommand[];\n    private filtered: PaletteCommand[] = [];\n    private active = 0;\n    private isOpen = false;\n    private keyHandler: (e: KeyboardEvent) => void;\n\n    constructor(commands: PaletteCommand[]) {\n        this.commands = commands;\n        this.overlay = document.createElement('div');\n        this.overlay.className = 'rk-cmd-palette rk-word-editor';\n        const themed = document.querySelector('.rk-word-editor[data-rk-theme]') as HTMLElement | null;\n        if (themed?.dataset.rkTheme) this.overlay.dataset.rkTheme = themed.dataset.rkTheme;\n\n        this.overlay.innerHTML = `\n            <div class=\"rk-cmd-palette-content\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Command palette\">\n                <input class=\"rk-cmd-palette-input\" type=\"text\" placeholder=\"Type a command…\" aria-label=\"Search commands\" />\n                <ul class=\"rk-cmd-palette-list\" role=\"listbox\"></ul>\n            </div>`;\n\n        this.input = this.overlay.querySelector('.rk-cmd-palette-input') as HTMLInputElement;\n        this.list = this.overlay.querySelector('.rk-cmd-palette-list') as HTMLUListElement;\n\n        this.input.addEventListener('input', () => this.refresh());\n        this.overlay.addEventListener('click', (e) => {\n            if (e.target === this.overlay) this.close();\n        });\n        this.list.addEventListener('click', (e) => {\n            const li = (e.target as HTMLElement).closest('[data-cmd-id]') as HTMLLIElement | null;\n            if (li) this.run(this.filtered.find(c => c.id === li.dataset.cmdId));\n        });\n\n        this.keyHandler = (e: KeyboardEvent) => {\n            if (!this.isOpen) return;\n            if (e.key === 'Escape') { e.preventDefault(); this.close(); }\n            else if (e.key === 'ArrowDown') { e.preventDefault(); this.move(1); }\n            else if (e.key === 'ArrowUp') { e.preventDefault(); this.move(-1); }\n            else if (e.key === 'Enter') { e.preventDefault(); this.run(this.filtered[this.active]); }\n        };\n        document.addEventListener('keydown', this.keyHandler);\n    }\n\n    public setCommands(commands: PaletteCommand[]) {\n        this.commands = commands;\n    }\n\n    public open() {\n        if (this.isOpen) return;\n        this.isOpen = true;\n        const themed = document.querySelector('.rk-word-editor[data-rk-theme]') as HTMLElement | null;\n        if (themed?.dataset.rkTheme) this.overlay.dataset.rkTheme = themed.dataset.rkTheme;\n        document.body.appendChild(this.overlay);\n        requestAnimationFrame(() => this.overlay.classList.add('is-open'));\n        this.input.value = '';\n        this.refresh();\n        setTimeout(() => this.input.focus(), 30);\n    }\n\n    public close() {\n        this.isOpen = false;\n        this.overlay.classList.remove('is-open');\n        setTimeout(() => this.overlay.remove(), 200);\n    }\n\n    public toggle() {\n        if (this.isOpen) this.close(); else this.open();\n    }\n\n    public destroy() {\n        document.removeEventListener('keydown', this.keyHandler);\n        this.overlay.remove();\n    }\n\n    private move(delta: number) {\n        if (!this.filtered.length) return;\n        this.active = (this.active + delta + this.filtered.length) % this.filtered.length;\n        this.render();\n        const el = this.list.querySelector('.is-active') as HTMLElement | null;\n        el?.scrollIntoView({ block: 'nearest' });\n    }\n\n    private run(cmd: PaletteCommand | undefined) {\n        if (!cmd) return;\n        this.close();\n        try { cmd.action(); }\n        catch (e) { console.warn('[CommandPalette] command failed', e); }\n    }\n\n    private refresh() {\n        const q = this.input.value.trim().toLowerCase();\n        this.filtered = q\n            ? this.commands.filter(c => fuzzyMatch(`${c.title} ${c.description || ''}`.toLowerCase(), q))\n            : this.commands;\n        this.active = 0;\n        this.render();\n    }\n\n    private render() {\n        if (!this.filtered.length) {\n            this.list.innerHTML = `<li class=\"rk-cmd-palette-empty\">No matching commands.</li>`;\n            return;\n        }\n        this.list.innerHTML = this.filtered.map((c, i) => `\n            <li class=\"rk-cmd-palette-item ${i === this.active ? 'is-active' : ''}\"\n                data-cmd-id=\"${escAttr(c.id)}\" role=\"option\" aria-selected=\"${i === this.active}\">\n                <div>\n                    <div>${escHtml(c.title)}</div>\n                    ${c.description ? `<div style=\"font-size:11px;color:var(--rk-text-muted)\">${escHtml(c.description)}</div>` : ''}\n                </div>\n                ${c.shortcut ? `<span class=\"rk-cmd-palette-item-shortcut\">${escHtml(c.shortcut)}</span>` : ''}\n            </li>\n        `).join('');\n    }\n}\n\nfunction fuzzyMatch(text: string, query: string): boolean {\n    let i = 0;\n    for (const ch of query) {\n        const idx = text.indexOf(ch, i);\n        if (idx === -1) return false;\n        i = idx + 1;\n    }\n    return true;\n}\n\nfunction escAttr(s: string): string { return s.replace(/\"/g, '&quot;'); }\nfunction escHtml(s: string): string {\n    return s.replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]!));\n}\n","/**\n * Lightweight, dependency-free toast notifications. Theming follows the\n * editor host element (so the toast adopts dark mode if any editor on the\n * page is themed dark).\n */\ntype ToastVariant = 'info' | 'success' | 'error' | 'warn';\n\nlet host: HTMLDivElement | null = null;\n\nfunction ensureHost(): HTMLDivElement {\n    if (host && document.body.contains(host)) return host;\n    host = document.createElement('div');\n    host.className = 'rk-toast-host rk-word-editor';\n    const themed = document.querySelector('.rk-word-editor[data-rk-theme]') as HTMLElement | null;\n    if (themed?.dataset.rkTheme) host.dataset.rkTheme = themed.dataset.rkTheme;\n    document.body.appendChild(host);\n    return host;\n}\n\nexport interface ToastOptions {\n    variant?: ToastVariant;\n    duration?: number; // ms\n}\n\nexport function toast(message: string, opts: ToastOptions = {}): () => void {\n    const root = ensureHost();\n    const el = document.createElement('div');\n    el.className = `rk-toast rk-toast-${opts.variant || 'info'}`;\n    el.setAttribute('role', opts.variant === 'error' ? 'alert' : 'status');\n    el.textContent = message;\n    root.appendChild(el);\n    requestAnimationFrame(() => el.classList.add('is-visible'));\n\n    const dismiss = () => {\n        el.classList.remove('is-visible');\n        setTimeout(() => el.remove(), 250);\n    };\n    const t = setTimeout(dismiss, Math.max(800, opts.duration ?? 3200));\n    el.addEventListener('click', () => { clearTimeout(t); dismiss(); });\n    return () => { clearTimeout(t); dismiss(); };\n}\n","import { EditorShell } from './index';\n\n/**\n * Vanilla custom element: <rk-word-editor></rk-word-editor>\n *\n * Attributes:\n *   - placeholder: initial placeholder text\n *   - theme: \"light\" | \"dark\" | \"auto\"\n *   - readonly: present means start in read-only mode\n *   - outline: present means show document outline\n *   - properties: present means show right-side property panel\n *   - menubar / toolbar / statusbar: present (default) — set to \"false\" to hide.\n *\n * Events (CustomEvent on the element):\n *   - rk-ready    — { editor, toolbar } once the shell is mounted\n *   - rk-change   — { json, html } debounced doc update\n *   - rk-selection — { editor }\n *\n * Methods:\n *   - .editor / .toolbar — proxies to the inner shell\n *   - .getValue(format?) — returns html | json | text | markdown\n *   - .setValue(content) — replaces the document (HTML or JSON)\n *   - .focus() / .blur()\n */\nexport class RKEditorElement extends HTMLElement {\n    static get observedAttributes(): string[] {\n        return ['theme', 'readonly', 'placeholder'];\n    }\n\n    private shell: EditorShell | null = null;\n    private mountHost: HTMLDivElement | null = null;\n\n    connectedCallback() {\n        if (this.shell) return; // guard against double-mount\n\n        const host = document.createElement('div');\n        host.style.height = '100%';\n        host.style.display = 'flex';\n        host.style.flexDirection = 'column';\n        this.appendChild(host);\n        this.mountHost = host;\n\n        const initial = (this.getAttribute('content') || this.innerHTML || '').trim();\n\n        const theme = (this.getAttribute('theme') as 'light' | 'dark' | 'auto') || 'light';\n        const readonly = this.hasAttribute('readonly');\n        const outline = this.hasAttribute('outline');\n        const properties = this.hasAttribute('properties') || this.hasAttribute('property-panel');\n\n        const flag = (attr: string, def: boolean) => {\n            const v = this.getAttribute(attr);\n            if (v === null) return def;\n            return v !== 'false';\n        };\n\n        this.shell = new EditorShell({\n            element: host,\n            initialContent: initial || '<p></p>',\n            placeholder: this.getAttribute('placeholder') || undefined,\n            editable: !readonly,\n            menubar: flag('menubar', true),\n            toolbar: flag('toolbar', true),\n            statusBar: flag('statusbar', true),\n            outline,\n            propertyPanel: properties,\n            theme,\n            onUpdate: (json, editor) => {\n                this.dispatchEvent(new CustomEvent('rk-change', {\n                    detail: { json, html: editor.getHTML() },\n                    bubbles: true,\n                    composed: true,\n                }));\n            },\n            onSelectionChange: (editor) => {\n                this.dispatchEvent(new CustomEvent('rk-selection', {\n                    detail: { editor },\n                    bubbles: true,\n                    composed: true,\n                }));\n            },\n        });\n\n        // Notify external code that the editor is ready.\n        this.dispatchEvent(new CustomEvent('rk-ready', {\n            detail: { editor: this.shell.editor, toolbar: this.shell.toolbar },\n            bubbles: true,\n            composed: true,\n        }));\n    }\n\n    disconnectedCallback() {\n        this.shell?.destroy();\n        this.shell = null;\n        if (this.mountHost) {\n            this.mountHost.remove();\n            this.mountHost = null;\n        }\n    }\n\n    attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null) {\n        if (!this.shell) return;\n        if (name === 'theme') {\n            const t = (newValue as 'light' | 'dark' | 'auto') || 'light';\n            this.shell.toolbar.applyTheme(t);\n        } else if (name === 'readonly') {\n            this.shell.editor.setEditable(newValue === null);\n        }\n    }\n\n    public get editor() { return this.shell?.editor; }\n    public get toolbar() { return this.shell?.toolbar; }\n\n    /** Get the document content. */\n    public getValue(format: 'html' | 'json' | 'text' = 'html'): string | object {\n        const ed = this.shell?.editor;\n        if (!ed) return format === 'json' ? {} : '';\n        if (format === 'json') return ed.getJSON();\n        if (format === 'text') return ed.getText();\n        return ed.getHTML();\n    }\n\n    /** Replace the document contents. */\n    public setValue(content: string | object): void {\n        this.shell?.editor.setDocument(content as any);\n    }\n\n    public override focus(): void { this.shell?.editor.focus('end'); }\n    public override blur(): void { this.shell?.editor.blur(); }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('rk-word-editor')) {\n    customElements.define('rk-word-editor', RKEditorElement);\n}\n","import { WordEditor, type WordEditorOptions } from '@raazkhnl/rk-editor-core';\nimport { Modal } from './Modal';\nimport { icon, Icons, type IconName } from './icons';\nimport {\n    showLinkDialog, showImageDialog, showTableDialog, showMathDialog, showFootnoteDialog,\n    showCitationDialog, showPageLayoutDialog, showShortcutsDialog, showAboutDialog, showTocDialog,\n    RK_EDITOR_VERSION,\n} from './dialogs';\nimport { FindReplaceBar } from './FindReplaceBar';\nimport { StatusBar, type AutoSaveState } from './StatusBar';\nimport { Outline } from './Outline';\nimport { PropertyPanel } from './PropertyPanel';\nimport { CommandPalette } from './CommandPalette';\nimport { toast } from './toast';\nimport './styles.css';\n\nexport { Modal, icon, Icons, type IconName };\nexport { FindReplaceBar, StatusBar, Outline, PropertyPanel, CommandPalette, toast };\nexport type { AutoSaveState };\nexport { RK_EDITOR_VERSION };\nexport {\n    showLinkDialog, showImageDialog, showTableDialog, showMathDialog, showFootnoteDialog,\n    showCitationDialog, showPageLayoutDialog, showShortcutsDialog, showAboutDialog, showTocDialog,\n};\n\nconst FONT_FAMILIES = [\n    { label: 'Default', value: '' },\n    { label: 'Arial', value: 'Arial, sans-serif' },\n    { label: 'Calibri', value: 'Calibri, sans-serif' },\n    { label: 'Cambria', value: 'Cambria, serif' },\n    { label: 'Georgia', value: 'Georgia, serif' },\n    { label: 'Times New Roman', value: '\"Times New Roman\", Times, serif' },\n    { label: 'Courier New', value: '\"Courier New\", Courier, monospace' },\n    { label: 'Verdana', value: 'Verdana, sans-serif' },\n    { label: 'Tahoma', value: 'Tahoma, sans-serif' },\n    { label: 'Trebuchet MS', value: '\"Trebuchet MS\", sans-serif' },\n    { label: 'Inter', value: 'Inter, sans-serif' },\n    { label: 'Roboto', value: 'Roboto, sans-serif' },\n    { label: 'Open Sans', value: '\"Open Sans\", sans-serif' },\n    { label: 'Lato', value: 'Lato, sans-serif' },\n    { label: 'Montserrat', value: 'Montserrat, sans-serif' },\n    { label: 'Source Sans 3', value: '\"Source Sans 3\", sans-serif' },\n    { label: 'Noto Sans Devanagari', value: '\"Noto Sans Devanagari\", sans-serif' },\n    { label: 'Mangal', value: 'Mangal, sans-serif' },\n    { label: 'Kalimati', value: 'Kalimati, sans-serif' },\n];\n\nconst FONT_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36, 40, 48, 56, 64, 72, 96];\n\nconst PARAGRAPH_STYLES = [\n    { label: 'Title', value: 'title' },\n    { label: 'Subtitle', value: 'subtitle' },\n    { label: 'Heading 1', value: '1' },\n    { label: 'Heading 2', value: '2' },\n    { label: 'Heading 3', value: '3' },\n    { label: 'Heading 4', value: '4' },\n    { label: 'Heading 5', value: '5' },\n    { label: 'Heading 6', value: '6' },\n    { label: 'Normal text', value: 'p' },\n];\n\ninterface MenuItem {\n    label?: string;\n    icon?: IconName;\n    action?: string;\n    shortcut?: string;\n    sep?: boolean;\n}\n\nexport interface WordToolbarOptions {\n    /** Show the menubar (File / Edit / Insert / Format / View / Help). Defaults to `true`. */\n    menubar?: boolean;\n    /** Show the formatting toolbar. Defaults to `true`. */\n    toolbar?: boolean;\n    /** Show the status bar (page count, word count, zoom). Defaults to `true`. */\n    statusBar?: boolean;\n    /** Show the document outline sidebar. Defaults to `false`. */\n    outline?: boolean;\n    /** Show the right-side property panel. Defaults to `true`. */\n    propertyPanel?: boolean;\n    /** Initial theme. Defaults to `'light'`. */\n    theme?: 'light' | 'dark' | 'auto';\n    /** Brand label / logo HTML. */\n    brandHtml?: string;\n}\n\nexport class WordToolbar {\n    public editor: WordEditor;\n    private container: HTMLElement;\n    private opts: WordToolbarOptions;\n    private root!: HTMLDivElement;\n    private findBar?: FindReplaceBar;\n    private _statusBar?: StatusBar;\n    private outline?: Outline;\n    private propertyPanel?: PropertyPanel;\n    private surfaceWrap!: HTMLDivElement;\n    private palette?: CommandPalette;\n\n    /** The status bar instance (if one was rendered). */\n    public get statusBar(): StatusBar | undefined { return this._statusBar; }\n\n    constructor(editor: WordEditor, container: HTMLElement, opts: WordToolbarOptions = {}) {\n        this.editor = editor;\n        this.container = container;\n        this.opts = {\n            menubar: true,\n            toolbar: true,\n            statusBar: true,\n            outline: false,\n            propertyPanel: true,\n            theme: 'light',\n            ...opts,\n        };\n        this.render();\n        this.applyTheme(this.opts.theme!);\n    }\n\n    private render() {\n        this.container.classList.add('rk-word-editor');\n        this.root = document.createElement('div');\n        this.root.className = 'rk-editor-shell';\n        this.container.appendChild(this.root);\n\n        if (this.opts.menubar) this.root.appendChild(this.buildMenubar());\n        if (this.opts.toolbar) this.root.appendChild(this.buildToolbar());\n\n        const main = document.createElement('div');\n        main.className = 'rk-editor-main';\n\n        if (this.opts.outline) {\n            this.outline = new Outline(this.editor, main);\n        }\n\n        const surfaceArea = document.createElement('div');\n        surfaceArea.className = 'rk-editor-surface-area';\n        this.surfaceWrap = surfaceArea;\n\n        // Move the existing ProseMirror surface here.\n        const editorEl = this.editor.instance.options.element as HTMLElement;\n        if (editorEl && editorEl.firstChild) {\n            surfaceArea.appendChild(editorEl);\n        }\n\n        main.appendChild(surfaceArea);\n\n        if (this.opts.propertyPanel) {\n            this.propertyPanel = new PropertyPanel(this.editor, main, 'end');\n        }\n\n        this.root.appendChild(main);\n\n        this.findBar = new FindReplaceBar(this.editor, surfaceArea);\n\n        if (this.opts.statusBar) this._statusBar = new StatusBar(this.editor, this.root);\n\n        const importInput = document.createElement('input');\n        importInput.type = 'file';\n        importInput.id = 'rk-import-input';\n        importInput.accept = '.docx,.md,.markdown,.html,.htm,.txt,.json';\n        importInput.style.display = 'none';\n        this.root.appendChild(importInput);\n\n        importInput.addEventListener('change', async (e) => {\n            const file = (e.target as HTMLInputElement).files?.[0];\n            if (!file) return;\n            try {\n                await this.editor.importFromFile(file);\n            } catch (err: any) {\n                alert(`Import failed: ${err.message || err}`);\n            } finally {\n                importInput.value = '';\n            }\n        });\n\n        this.bindGlobalKeys();\n        // Single document-level click closes any open menubar dropdown.\n        document.addEventListener('click', this.handleDocClick);\n        this.editor.instance.on('selectionUpdate', () => this.updateActiveStates());\n        this.editor.instance.on('transaction', () => this.updateActiveStates());\n        this.updateActiveStates();\n    }\n\n    private handleDocClick = (e: MouseEvent) => {\n        const target = e.target as HTMLElement | null;\n        if (!target || !target.closest('.rk-menu-trigger,.rk-menu-dropdown')) {\n            this.closeMenus();\n        }\n    };\n\n    // ----- Menubar -----\n    private buildMenubar(): HTMLElement {\n        const nav = document.createElement('nav');\n        nav.className = 'rk-menubar';\n        nav.setAttribute('role', 'menubar');\n\n        if (this.opts.brandHtml) {\n            const brand = document.createElement('div');\n            brand.className = 'rk-brand';\n            brand.innerHTML = this.opts.brandHtml;\n            nav.appendChild(brand);\n        }\n\n        const menus: { label: string; items: MenuItem[] }[] = [\n            {\n                label: 'File',\n                items: [\n                    { label: 'New document', action: 'newDoc', icon: 'fileNew' },\n                    { label: 'Open / Import…', action: 'openImport', icon: 'fileOpen' },\n                    { sep: true },\n                    { label: 'Save copy as DOCX', action: 'exportDocx', icon: 'docx' },\n                    { label: 'Export as Markdown', action: 'exportMd' },\n                    { label: 'Export as HTML', action: 'exportHtml' },\n                    { label: 'Export as JSON', action: 'exportJson' },\n                    { sep: true },\n                    { label: 'Print / Save as PDF', action: 'printDoc', icon: 'print', shortcut: 'Ctrl+P' },\n                    { sep: true },\n                    { label: 'Page layout…', action: 'pageLayout', icon: 'pageSize' },\n                ],\n            },\n            {\n                label: 'Edit',\n                items: [\n                    { label: 'Undo', action: 'undo', icon: 'undo', shortcut: 'Ctrl+Z' },\n                    { label: 'Redo', action: 'redo', icon: 'redo', shortcut: 'Ctrl+Y' },\n                    { sep: true },\n                    { label: 'Cut', action: 'cut', icon: 'cut', shortcut: 'Ctrl+X' },\n                    { label: 'Copy', action: 'copy', icon: 'copy', shortcut: 'Ctrl+C' },\n                    { label: 'Paste', action: 'paste', icon: 'paste', shortcut: 'Ctrl+V' },\n                    { sep: true },\n                    { label: 'Find', action: 'find', icon: 'search', shortcut: 'Ctrl+F' },\n                    { label: 'Find & Replace', action: 'findReplace', icon: 'replace', shortcut: 'Ctrl+H' },\n                    { sep: true },\n                    { label: 'Format painter', action: 'formatPainter', icon: 'formatPainter' },\n                    { label: 'Clear formatting', action: 'clearFormatting', icon: 'eraser' },\n                    { label: 'Track changes', action: 'trackChanges', icon: 'track' },\n                ],\n            },\n            {\n                label: 'Insert',\n                items: [\n                    { label: 'Image', action: 'insertImage', icon: 'image' },\n                    { label: 'Image from URL', action: 'insertImageUrl', icon: 'image' },\n                    { label: 'Table…', action: 'insertTable', icon: 'table' },\n                    { label: 'Text box', action: 'insertTextBox', icon: 'textbox' },\n                    { label: 'Link…', action: 'insertLink', icon: 'link', shortcut: 'Ctrl+K' },\n                    { sep: true },\n                    { label: 'Math (LaTeX)…', action: 'insertMath', icon: 'math' },\n                    { label: 'Citation…', action: 'insertCitation', icon: 'citation' },\n                    { label: 'Footnote…', action: 'insertFootnote', icon: 'footnote' },\n                    { label: 'Bibliography', action: 'insertBibliography', icon: 'citation' },\n                    { label: 'Table of contents', action: 'insertToc', icon: 'toc' },\n                    { sep: true },\n                    { label: 'Page number', action: 'insertPageNumber', icon: 'pageBreak' },\n                    { label: 'Page break', action: 'pageBreak', icon: 'pageBreak', shortcut: 'Ctrl+Enter' },\n                    { label: 'Horizontal rule', action: 'hr', icon: 'horizontalRule' },\n                    { label: 'Blockquote', action: 'blockquote', icon: 'blockquote' },\n                    { label: 'Code block', action: 'codeBlock', icon: 'code' },\n                ],\n            },\n            {\n                label: 'Format',\n                items: [\n                    { label: 'Bold', action: 'bold', icon: 'bold', shortcut: 'Ctrl+B' },\n                    { label: 'Italic', action: 'italic', icon: 'italic', shortcut: 'Ctrl+I' },\n                    { label: 'Underline', action: 'underline', icon: 'underline', shortcut: 'Ctrl+U' },\n                    { label: 'Strikethrough', action: 'strike', icon: 'strike' },\n                    { sep: true },\n                    { label: 'Superscript', action: 'superscript', icon: 'superscript' },\n                    { label: 'Subscript', action: 'subscript', icon: 'subscript' },\n                    { sep: true },\n                    { label: 'Align left', action: 'alignLeft', icon: 'alignLeft' },\n                    { label: 'Align center', action: 'alignCenter', icon: 'alignCenter' },\n                    { label: 'Align right', action: 'alignRight', icon: 'alignRight' },\n                    { label: 'Justify', action: 'alignJustify', icon: 'alignJustify' },\n                    { sep: true },\n                    { label: 'Bullet list', action: 'bulletList', icon: 'bulletList' },\n                    { label: 'Numbered list', action: 'orderedList', icon: 'orderedList' },\n                    { label: 'Nepali numbering (१.)', action: 'nepaliList', icon: 'nepaliList' },\n                    { label: 'Task list', action: 'taskList', icon: 'taskList' },\n                ],\n            },\n            {\n                label: 'View',\n                items: [\n                    { label: 'Toggle outline', action: 'toggleOutline', icon: 'panelLeft' },\n                    { label: 'Toggle properties panel', action: 'toggleProperties', icon: 'panelRight' },\n                    { label: 'Read-only mode', action: 'toggleReadOnly', icon: 'eye' },\n                    { label: 'Show secondary toolbar', action: 'toggleSecondaryToolbar', icon: 'panelLeft' },\n                    { sep: true },\n                    { label: 'Light theme', action: 'themeLight', icon: 'sun' },\n                    { label: 'Dark theme', action: 'themeDark', icon: 'moon' },\n                    { sep: true },\n                    { label: 'Command palette', action: 'commandPalette', icon: 'search', shortcut: 'Ctrl+/' },\n                    { sep: true },\n                    { label: 'Zoom in', action: 'zoomIn', icon: 'zoomIn', shortcut: 'Ctrl++' },\n                    { label: 'Zoom out', action: 'zoomOut', icon: 'zoomOut', shortcut: 'Ctrl+-' },\n                    { label: 'Reset zoom', action: 'zoomReset', shortcut: 'Ctrl+0' },\n                ],\n            },\n            {\n                label: 'Help',\n                items: [\n                    { label: 'Command palette', action: 'commandPalette', icon: 'search', shortcut: 'Ctrl+/' },\n                    { label: 'Keyboard shortcuts', action: 'showShortcuts', icon: 'keyboard' },\n                    { label: 'About', action: 'showAbout', icon: 'info' },\n                    { label: 'GitHub repository', action: 'openGithub', icon: 'github' },\n                ],\n            },\n        ];\n\n        menus.forEach(menu => nav.appendChild(this.buildMenu(menu.label, menu.items)));\n\n        const spacer = document.createElement('div');\n        spacer.className = 'rk-menubar-spacer';\n        nav.appendChild(spacer);\n\n        const toolbarRight = document.createElement('div');\n        toolbarRight.className = 'rk-menubar-actions';\n        toolbarRight.innerHTML = `\n            <button class=\"rk-icon-btn rk-theme-toggle\" title=\"Toggle dark mode\" aria-label=\"Toggle theme\">${icon('moon')}</button>\n            <button class=\"rk-icon-btn rk-find-toggle-btn\" title=\"Find (Ctrl+F)\" aria-label=\"Find\">${icon('search')}</button>`;\n        nav.appendChild(toolbarRight);\n\n        toolbarRight.querySelector('.rk-theme-toggle')?.addEventListener('click', () => this.toggleTheme());\n        toolbarRight.querySelector('.rk-find-toggle-btn')?.addEventListener('click', () => this.findBar?.open(false));\n        return nav;\n    }\n\n    private buildMenu(label: string, items: MenuItem[]): HTMLElement {\n        const wrap = document.createElement('div');\n        wrap.className = 'rk-menu';\n        const trigger = document.createElement('button');\n        trigger.className = 'rk-menu-trigger';\n        trigger.textContent = label;\n        trigger.setAttribute('aria-haspopup', 'true');\n        trigger.setAttribute('aria-expanded', 'false');\n\n        const dropdown = document.createElement('div');\n        dropdown.className = 'rk-menu-dropdown';\n        dropdown.setAttribute('role', 'menu');\n        items.forEach(item => {\n            if (item.sep) {\n                const s = document.createElement('div');\n                s.className = 'rk-menu-sep';\n                dropdown.appendChild(s);\n                return;\n            }\n            const btn = document.createElement('button');\n            btn.className = 'rk-menu-item';\n            btn.dataset.action = item.action;\n            btn.innerHTML = `\n                <span class=\"rk-menu-icon\">${item.icon ? icon(item.icon) : ''}</span>\n                <span class=\"rk-menu-label\">${item.label}</span>\n                ${item.shortcut ? `<span class=\"rk-menu-shortcut\">${item.shortcut}</span>` : ''}`;\n            btn.addEventListener('click', () => {\n                this.handleAction(item.action!);\n                this.closeMenus();\n            });\n            dropdown.appendChild(btn);\n        });\n\n        trigger.addEventListener('click', (e) => {\n            e.stopPropagation();\n            const expanded = trigger.getAttribute('aria-expanded') === 'true';\n            this.closeMenus();\n            trigger.setAttribute('aria-expanded', String(!expanded));\n        });\n\n        wrap.appendChild(trigger);\n        wrap.appendChild(dropdown);\n        return wrap;\n    }\n\n    private closeMenus() {\n        this.container.querySelectorAll('.rk-menu-trigger').forEach(t => t.setAttribute('aria-expanded', 'false'));\n    }\n\n    // ----- Toolbar -----\n    private buildToolbar(): HTMLElement {\n        const tb = document.createElement('div');\n        tb.className = 'rk-toolbar';\n        tb.setAttribute('role', 'toolbar');\n\n        // Row 1\n        const row1 = document.createElement('div');\n        row1.className = 'rk-toolbar-row';\n        row1.appendChild(this.toolbarGroup([\n            { id: 'undo', icon: 'undo', title: 'Undo (Ctrl+Z)' },\n            { id: 'redo', icon: 'redo', title: 'Redo (Ctrl+Y)' },\n        ]));\n\n        const styleGroup = document.createElement('div');\n        styleGroup.className = 'rk-toolbar-group';\n        styleGroup.innerHTML = `\n            <select class=\"rk-select rk-select-medium\" id=\"rk-style\">\n                ${PARAGRAPH_STYLES.map(s => `<option value=\"${s.value}\">${s.label}</option>`).join('')}\n            </select>\n            <select class=\"rk-select rk-select-wide\" id=\"rk-font\">\n                ${FONT_FAMILIES.map(f => `<option value=\"${f.value}\">${f.label}</option>`).join('')}\n            </select>\n            <select class=\"rk-select rk-select-narrow\" id=\"rk-size\">\n                ${FONT_SIZES.map(s => `<option value=\"${s}pt\"${s === 12 ? ' selected' : ''}>${s}</option>`).join('')}\n            </select>`;\n        row1.appendChild(styleGroup);\n\n        row1.appendChild(this.toolbarGroup([\n            { id: 'bold', icon: 'bold', title: 'Bold (Ctrl+B)' },\n            { id: 'italic', icon: 'italic', title: 'Italic (Ctrl+I)' },\n            { id: 'underline', icon: 'underline', title: 'Underline (Ctrl+U)' },\n            { id: 'strike', icon: 'strike', title: 'Strikethrough' },\n            { id: 'sup', icon: 'superscript', title: 'Superscript' },\n            { id: 'sub', icon: 'subscript', title: 'Subscript' },\n        ]));\n\n        const colorGroup = document.createElement('div');\n        colorGroup.className = 'rk-toolbar-group';\n        colorGroup.innerHTML = `\n            <label class=\"rk-color-pick\" title=\"Text color\" data-color=\"#1a1a1a\">\n                <span class=\"rk-color-pick-icon\">${icon('fontColor')}<span class=\"rk-color-pick-bar\" style=\"background:#1a1a1a\"></span></span>\n                <input type=\"color\" class=\"rk-color-input\" id=\"rk-text-color\" value=\"#1a1a1a\" />\n            </label>\n            <label class=\"rk-color-pick\" title=\"Highlight color\" data-color=\"#fff59d\">\n                <span class=\"rk-color-pick-icon\">${icon('highlight')}<span class=\"rk-color-pick-bar\" style=\"background:#fff59d\"></span></span>\n                <input type=\"color\" class=\"rk-color-input\" id=\"rk-hl-color\" value=\"#fff59d\" />\n            </label>`;\n        row1.appendChild(colorGroup);\n\n        row1.appendChild(this.toolbarGroup([\n            { id: 'alignLeft', icon: 'alignLeft', title: 'Align left' },\n            { id: 'alignCenter', icon: 'alignCenter', title: 'Align center' },\n            { id: 'alignRight', icon: 'alignRight', title: 'Align right' },\n            { id: 'alignJustify', icon: 'alignJustify', title: 'Justify' },\n        ]));\n\n        row1.appendChild(this.toolbarGroup([\n            { id: 'bulletList', icon: 'bulletList', title: 'Bullet list' },\n            { id: 'orderedList', icon: 'orderedList', title: 'Numbered list' },\n            { id: 'nepaliList', icon: 'nepaliList', title: 'Nepali numbering (१.)' },\n            { id: 'taskList', icon: 'taskList', title: 'Task list' },\n            { id: 'indent', icon: 'indentRight', title: 'Increase indent' },\n            { id: 'outdent', icon: 'indentLeft', title: 'Decrease indent' },\n        ]));\n\n        tb.appendChild(row1);\n\n        // Row 2\n        const row2 = document.createElement('div');\n        row2.className = 'rk-toolbar-row';\n        row2.appendChild(this.toolbarGroup([\n            { id: 'insertLink', icon: 'link', title: 'Insert link (Ctrl+K)' },\n            { id: 'insertImage', icon: 'image', title: 'Insert image' },\n            { id: 'insertTable', icon: 'table', title: 'Insert table' },\n            { id: 'insertTextBox', icon: 'textbox', title: 'Insert text box' },\n            { id: 'insertMath', icon: 'math', title: 'Insert math' },\n            { id: 'insertFootnote', icon: 'footnote', title: 'Insert footnote' },\n            { id: 'insertCitation', icon: 'citation', title: 'Insert citation' },\n            { id: 'insertToc', icon: 'toc', title: 'Insert table of contents' },\n        ]));\n\n        row2.appendChild(this.toolbarGroup([\n            { id: 'blockquote', icon: 'blockquote', title: 'Blockquote' },\n            { id: 'codeBlock', icon: 'code', title: 'Code block' },\n            { id: 'hr', icon: 'horizontalRule', title: 'Horizontal rule' },\n            { id: 'pageBreak', icon: 'pageBreak', title: 'Page break (Ctrl+Enter)' },\n        ]));\n\n        row2.appendChild(this.toolbarGroup([\n            { id: 'formatPainter', icon: 'formatPainter', title: 'Format painter' },\n            { id: 'clearFormatting', icon: 'eraser', title: 'Clear formatting' },\n            { id: 'trackChanges', icon: 'track', title: 'Track changes' },\n        ]));\n\n        row2.appendChild(this.toolbarGroup([\n            { id: 'find', icon: 'search', title: 'Find (Ctrl+F)' },\n            { id: 'findReplace', icon: 'replace', title: 'Find & replace (Ctrl+H)' },\n            { id: 'pageLayout', icon: 'pageSize', title: 'Page layout' },\n        ]));\n\n        row2.appendChild(this.toolbarGroup([\n            { id: 'exportDocx', icon: 'docx', title: 'Export DOCX' },\n            { id: 'printDoc', icon: 'print', title: 'Print / Save as PDF' },\n        ]));\n\n        tb.appendChild(row2);\n\n        this.bindToolbarEvents(tb);\n        return tb;\n    }\n\n    private toolbarGroup(items: { id: string; icon: IconName; title: string }[]): HTMLElement {\n        const g = document.createElement('div');\n        g.className = 'rk-toolbar-group';\n        items.forEach(it => {\n            const btn = document.createElement('button');\n            btn.className = 'rk-icon-btn';\n            btn.dataset.action = it.id;\n            btn.title = it.title;\n            btn.setAttribute('aria-label', it.title);\n            btn.innerHTML = icon(it.icon);\n            btn.addEventListener('click', () => this.handleAction(it.id));\n            g.appendChild(btn);\n        });\n        return g;\n    }\n\n    private bindToolbarEvents(tb: HTMLElement) {\n        const $ = (s: string) => tb.querySelector(s) as HTMLElement | null;\n\n        ($('#rk-font') as HTMLSelectElement | null)?.addEventListener('change', (e) => {\n            const v = (e.target as HTMLSelectElement).value;\n            if (v) this.editor.format.fontFamily(v);\n        });\n        ($('#rk-size') as HTMLSelectElement | null)?.addEventListener('change', (e) => {\n            const v = (e.target as HTMLSelectElement).value;\n            if (v) this.editor.format.fontSize(v);\n        });\n        ($('#rk-style') as HTMLSelectElement | null)?.addEventListener('change', (e) => {\n            const v = (e.target as HTMLSelectElement).value;\n            if (v === 'p') this.editor.format.paragraph();\n            else if (v === 'title') this.editor.format.title();\n            else if (v === 'subtitle') this.editor.format.subtitle();\n            else this.editor.format.heading(parseInt(v) as any);\n        });\n        const txtColor = $('#rk-text-color') as HTMLInputElement | null;\n        txtColor?.addEventListener('input', (e) => {\n            const v = (e.target as HTMLInputElement).value;\n            this.editor.format.setColor(v);\n            const bar = txtColor.parentElement?.querySelector('.rk-color-pick-bar') as HTMLElement | null;\n            if (bar) bar.style.background = v;\n        });\n        const hlColor = $('#rk-hl-color') as HTMLInputElement | null;\n        hlColor?.addEventListener('input', (e) => {\n            const v = (e.target as HTMLInputElement).value;\n            this.editor.format.setHighlight(v);\n            const bar = hlColor.parentElement?.querySelector('.rk-color-pick-bar') as HTMLElement | null;\n            if (bar) bar.style.background = v;\n        });\n    }\n\n    // ----- Action dispatcher -----\n    private handleAction(action: string) {\n        const ed = this.editor;\n        const importInput = () => (this.container.querySelector('#rk-import-input') as HTMLInputElement | null)?.click();\n        switch (action) {\n            // File\n            case 'newDoc':\n                if (!ed.isEmpty() && !confirm('Discard current document and start a new one?')) return;\n                ed.clear(); ed.focus(); break;\n            case 'openImport': importInput(); break;\n            case 'exportDocx': ed.exportDocx(); break;\n            case 'exportMd': ed.exportMarkdown(); break;\n            case 'exportHtml': ed.exportHtml(); break;\n            case 'exportJson': ed.exportJson(); break;\n            case 'printDoc': ed.printPdf(); break;\n            case 'pageLayout': showPageLayoutDialog(ed); break;\n\n            // Edit\n            case 'undo': ed.format.undo(); break;\n            case 'redo': ed.format.redo(); break;\n            case 'cut': document.execCommand('cut'); break;\n            case 'copy': document.execCommand('copy'); break;\n            case 'paste': document.execCommand('paste'); break;\n            case 'find': this.findBar?.open(false); break;\n            case 'findReplace': this.findBar?.open(true); break;\n            case 'formatPainter': ed.format.startFormatPaint(); break;\n            case 'clearFormatting': ed.format.clearFormatting(); break;\n            case 'trackChanges': ed.toggleTrackChanges(); this.updateActiveStates(); break;\n\n            // Insert\n            case 'insertImage': ed.format.openImageUpload(); break;\n            case 'insertImageUrl': showImageDialog(ed); break;\n            case 'insertTable': showTableDialog(ed); break;\n            case 'insertTextBox': ed.format.insertTextBox(); break;\n            case 'insertLink': showLinkDialog(ed); break;\n            case 'insertMath': showMathDialog(ed); break;\n            case 'insertFootnote': showFootnoteDialog(ed); break;\n            case 'insertCitation': showCitationDialog(ed); break;\n            case 'insertBibliography': ed.format.insertBibliography(); break;\n            case 'insertToc': showTocDialog(ed); break;\n            case 'insertPageNumber': ed.format.insertPageNumber(); break;\n            case 'refreshToc': ed.format.refreshTableOfContents(); break;\n            case 'pageBreak': ed.format.pageBreak(); break;\n            case 'hr': ed.format.horizontalRule(); break;\n            case 'blockquote': ed.format.blockquote(); break;\n            case 'codeBlock': ed.format.codeBlock(); break;\n\n            // Format\n            case 'bold': ed.format.bold(); break;\n            case 'italic': ed.format.italic(); break;\n            case 'underline': ed.format.underline(); break;\n            case 'strike': ed.format.strike(); break;\n            case 'sup':\n            case 'superscript': ed.format.superscript(); break;\n            case 'sub':\n            case 'subscript': ed.format.subscript(); break;\n            case 'alignLeft': ed.format.align('left'); break;\n            case 'alignCenter': ed.format.align('center'); break;\n            case 'alignRight': ed.format.align('right'); break;\n            case 'alignJustify': ed.format.align('justify'); break;\n            case 'bulletList': ed.format.bulletList(); break;\n            case 'orderedList': ed.format.orderedList(); break;\n            case 'nepaliList': ed.format.orderedList(); ed.format.setListStyle('nepali'); break;\n            case 'taskList': ed.format.taskList(); break;\n            case 'indent': ed.format.indent(); break;\n            case 'outdent': ed.format.outdent(); break;\n\n            // View\n            case 'toggleOutline':\n                if (this.outline) {\n                    this.outline.toggle();\n                } else {\n                    const main = this.root.querySelector('.rk-editor-main') as HTMLElement;\n                    this.outline = new Outline(ed, main, 'start');\n                }\n                break;\n            case 'toggleProperties':\n                if (this.propertyPanel) {\n                    this.propertyPanel.toggle();\n                } else {\n                    const main = this.root.querySelector('.rk-editor-main') as HTMLElement;\n                    this.propertyPanel = new PropertyPanel(ed, main, 'end');\n                }\n                break;\n            case 'toggleReadOnly':\n                ed.setEditable(!ed.isEditable());\n                this.root.classList.toggle('rk-readonly', !ed.isEditable());\n                break;\n            case 'toggleSecondaryToolbar': {\n                const tb = this.root.querySelector('.rk-toolbar') as HTMLElement | null;\n                tb?.classList.toggle('is-show-secondary');\n                break;\n            }\n            case 'commandPalette': this.openCommandPalette(); break;\n            case 'themeLight': this.applyTheme('light'); break;\n            case 'themeDark': this.applyTheme('dark'); break;\n            case 'zoomIn': ed.setZoom(ed.getZoom() + 0.1); this._statusBar?.update(); break;\n            case 'zoomOut': ed.setZoom(ed.getZoom() - 0.1); this._statusBar?.update(); break;\n            case 'zoomReset': ed.setZoom(1); this._statusBar?.update(); break;\n\n            // Help\n            case 'showShortcuts': showShortcutsDialog(); break;\n            case 'showAbout': showAboutDialog(); break;\n            case 'openGithub': window.open('https://github.com/raazkhnl/rk-word-editor', '_blank', 'noopener'); break;\n        }\n    }\n\n    private bindGlobalKeys() {\n        document.addEventListener('keydown', (e) => {\n            const mod = e.ctrlKey || e.metaKey;\n            if (!mod) return;\n            const k = e.key.toLowerCase();\n            if (k === 'f') { e.preventDefault(); this.findBar?.open(false); }\n            else if (k === 'h') { e.preventDefault(); this.findBar?.open(true); }\n            else if (k === 'p') { e.preventDefault(); this.editor.printPdf(); }\n            else if (k === 's') { e.preventDefault(); this.editor.exportDocx(); }\n            else if (k === '=' || k === '+') { e.preventDefault(); this.handleAction('zoomIn'); }\n            else if (k === '-') { e.preventDefault(); this.handleAction('zoomOut'); }\n            else if (k === '0') { e.preventDefault(); this.handleAction('zoomReset'); }\n            else if (k === '/') { e.preventDefault(); this.openCommandPalette(); }\n        });\n    }\n\n    /** Lazily build & open the command palette (Ctrl/⌘+/). */\n    private openCommandPalette() {\n        if (!this.palette) {\n            const run = (action: string) => () => this.handleAction(action);\n            this.palette = new CommandPalette([\n                { id: 'newDoc', title: 'New document', description: 'Clear the editor and start fresh', action: run('newDoc') },\n                { id: 'openImport', title: 'Open / Import file…', description: '.docx, .md, .html, .json, .txt', action: run('openImport') },\n                { id: 'exportDocx', title: 'Save as DOCX', shortcut: 'Ctrl+S', action: run('exportDocx') },\n                { id: 'exportMd', title: 'Export as Markdown', action: run('exportMd') },\n                { id: 'exportHtml', title: 'Export as HTML', action: run('exportHtml') },\n                { id: 'exportJson', title: 'Export as JSON', action: run('exportJson') },\n                { id: 'printDoc', title: 'Print / Save as PDF', shortcut: 'Ctrl+P', action: run('printDoc') },\n                { id: 'pageLayout', title: 'Page layout…', description: 'Page size, orientation, margins', action: run('pageLayout') },\n                { id: 'find', title: 'Find', shortcut: 'Ctrl+F', action: run('find') },\n                { id: 'findReplace', title: 'Find and replace', shortcut: 'Ctrl+H', action: run('findReplace') },\n                { id: 'insertImage', title: 'Insert image (upload)', action: run('insertImage') },\n                { id: 'insertImageUrl', title: 'Insert image from URL', action: run('insertImageUrl') },\n                { id: 'insertTable', title: 'Insert table', action: run('insertTable') },\n                { id: 'insertTextBox', title: 'Insert text box', action: run('insertTextBox') },\n                { id: 'insertLink', title: 'Insert link', shortcut: 'Ctrl+K', action: run('insertLink') },\n                { id: 'insertMath', title: 'Insert math (LaTeX)', action: run('insertMath') },\n                { id: 'insertCitation', title: 'Insert citation', action: run('insertCitation') },\n                { id: 'insertFootnote', title: 'Insert footnote', action: run('insertFootnote') },\n                { id: 'insertToc', title: 'Insert table of contents', action: run('insertToc') },\n                { id: 'insertPageNumber', title: 'Insert page number', action: run('insertPageNumber') },\n                { id: 'pageBreak', title: 'Insert page break', shortcut: 'Ctrl+Enter', action: run('pageBreak') },\n                { id: 'trackChanges', title: 'Toggle track changes', action: run('trackChanges') },\n                { id: 'formatPainter', title: 'Format painter', action: run('formatPainter') },\n                { id: 'clearFormatting', title: 'Clear formatting', action: run('clearFormatting') },\n                { id: 'toggleOutline', title: 'Toggle outline panel', action: run('toggleOutline') },\n                { id: 'toggleProperties', title: 'Toggle properties panel', action: run('toggleProperties') },\n                { id: 'toggleReadOnly', title: 'Toggle read-only mode', action: run('toggleReadOnly') },\n                { id: 'themeDark', title: 'Switch to dark theme', action: run('themeDark') },\n                { id: 'themeLight', title: 'Switch to light theme', action: run('themeLight') },\n                { id: 'showShortcuts', title: 'Keyboard shortcuts', action: run('showShortcuts') },\n                { id: 'showAbout', title: 'About RK Word Editor', action: run('showAbout') },\n            ]);\n        }\n        this.palette.open();\n    }\n\n    // ----- Theme -----\n    public applyTheme(theme: 'light' | 'dark' | 'auto') {\n        this.opts.theme = theme;\n        let resolved: 'light' | 'dark' = theme === 'auto'\n            ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n            : theme;\n        this.container.dataset.rkTheme = resolved;\n        const btn = this.root.querySelector('.rk-theme-toggle') as HTMLElement | null;\n        if (btn) btn.innerHTML = resolved === 'dark' ? icon('sun') : icon('moon');\n    }\n\n    public toggleTheme() {\n        const next = this.container.dataset.rkTheme === 'dark' ? 'light' : 'dark';\n        this.applyTheme(next as 'light' | 'dark');\n    }\n\n    // ----- Active states -----\n    private updateActiveStates() {\n        const ed = this.editor.instance;\n        const root = this.root;\n        const $btn = (id: string) => root.querySelector(`.rk-icon-btn[data-action=\"${id}\"]`);\n        const setActive = (id: string, active: boolean) => $btn(id)?.classList.toggle('is-active', active);\n\n        setActive('bold', ed.isActive('bold'));\n        setActive('italic', ed.isActive('italic'));\n        setActive('underline', ed.isActive('underline'));\n        setActive('strike', ed.isActive('strike'));\n        setActive('sup', ed.isActive('superscript'));\n        setActive('sub', ed.isActive('subscript'));\n        setActive('bulletList', ed.isActive('bulletList'));\n        setActive('orderedList', ed.isActive('orderedList'));\n        setActive('taskList', ed.isActive('taskList'));\n        setActive('blockquote', ed.isActive('blockquote'));\n        setActive('codeBlock', ed.isActive('codeBlock'));\n        setActive('alignLeft', ed.isActive({ textAlign: 'left' }));\n        setActive('alignCenter', ed.isActive({ textAlign: 'center' }));\n        setActive('alignRight', ed.isActive({ textAlign: 'right' }));\n        setActive('alignJustify', ed.isActive({ textAlign: 'justify' }));\n        setActive('trackChanges', this.editor.isTrackingChanges?.() || false);\n\n        const styleSel = root.querySelector('#rk-style') as HTMLSelectElement | null;\n        if (styleSel) {\n            if (ed.isActive('title')) { styleSel.value = 'title'; return; }\n            if (ed.isActive('subtitle')) { styleSel.value = 'subtitle'; return; }\n            for (let l = 1; l <= 6; l++) {\n                if (ed.isActive('heading', { level: l })) { styleSel.value = String(l); return; }\n            }\n            styleSel.value = 'p';\n        }\n    }\n\n    /** Reflect auto-save progress in the status bar pill. */\n    public setSaveState(state: AutoSaveState, message?: string) {\n        this._statusBar?.setSaveState(state, message);\n    }\n\n    public destroy() {\n        document.removeEventListener('click', this.handleDocClick);\n        this.findBar?.destroy();\n        this._statusBar?.destroy();\n        this.outline?.destroy();\n        this.propertyPanel?.destroy();\n        this.palette?.destroy();\n        this.root.remove();\n    }\n}\n\n// ---- Convenience: bundled editor + shell ----\n\nexport interface EditorShellOptions extends Omit<WordEditorOptions, 'element'>, WordToolbarOptions {\n    /** Where to mount the editor. Either `container` or `element` is accepted. */\n    container?: HTMLElement;\n    /** Same as `container` — kept for compatibility with the bare `WordEditor` API. */\n    element?: HTMLElement;\n}\n\n/**\n * One-shot constructor that mounts a fully-featured editor (engine + UI shell)\n * into a container. Returns both the engine and toolbar so consumers can wire\n * up their own buttons, listeners, or commands.\n */\nexport class EditorShell {\n    public editor: WordEditor;\n    public toolbar: WordToolbar;\n    public container: HTMLElement;\n\n    constructor(opts: EditorShellOptions) {\n        const target = opts.container || opts.element;\n        if (!target) throw new Error('EditorShell requires `container` or `element`.');\n        this.container = target;\n\n        // We need a child element for the editor surface so we don't fight with the toolbar layout.\n        target.classList.add('rk-word-editor');\n        const surface = document.createElement('div');\n        surface.className = 'rk-editor-surface';\n        target.appendChild(surface);\n\n        this.editor = new WordEditor({\n            ...opts,\n            element: surface,\n        });\n        this.toolbar = new WordToolbar(this.editor, target, opts);\n    }\n\n    /** Reflect auto-save progress in the status bar pill. */\n    public setSaveState(state: AutoSaveState, message?: string) {\n        this.toolbar.setSaveState(state, message);\n    }\n\n    public destroy(): void {\n        this.toolbar.destroy();\n        this.editor.destroy();\n    }\n}\n\n// ---- Web component ----\nexport * from './web-component';\n"],"names":["Modal","opts","__publicField","themed","content","header","escapeHtml","body","desc","wrap","field","footer","action","btn","cancelBtn","confirmBtn","e","onKey","group","label","input","sel","opt","o","i","data","k","el","s","c","path","Icons","icon","name","showLinkDialog","editor","safe","sanitizeUrl","chain","trimmed","lowered","showImageDialog","src","attrs","showTableDialog","showMathDialog","showFootnoteDialog","showCitationDialog","showPageLayoutDialog","layout","next","showTocDialog","l","min","max","showShortcutsDialog","rows","r","RK_EDITOR_VERSION","showAboutDialog","FindReplaceBar","parent","setupOpt","cls","onChange","v","handle","dragging","startX","startY","startLeft","startTop","rect","onMove","dx","dy","left","top","onUp","storage","total","idx","n","force","toggle","title","replace","parentRect","StatusBar","delta","z","stats","state","message","seconds","Outline","position","list","node","pos","h","escapeAttr","heading","view","dom","PropertyPanel","info","detectSelection","labelFor","renderImageBody","renderTableBody","renderTextBoxBody","renderTocBody","renderHeadingBody","renderParagraphBody","ed","$","onInput","fn","onClick","w","updateImageAttr","updateTextBoxAttr","leaderEl","updateTocAttr","pagesEl","level","a","$from","d","kind","float","alt","escAttr","selectMarkup","bg","border","showLeader","showPages","toggleField","align","headingPreviewSize","escHtml","headingLabel","alignBtn","lh","lineHeightBtn","value","glyph","active","id","control","current","tr","CommandPalette","commands","li","cmd","q","fuzzyMatch","text","query","ch","host","ensureHost","toast","root","dismiss","t","RKEditorElement","initial","theme","readonly","outline","properties","flag","attr","def","EditorShell","json","_oldValue","newValue","format","FONT_FAMILIES","FONT_SIZES","PARAGRAPH_STYLES","WordToolbar","container","target","main","surfaceArea","editorEl","importInput","file","err","nav","brand","menu","spacer","toolbarRight","items","trigger","dropdown","item","expanded","tb","row1","styleGroup","f","colorGroup","row2","g","it","txtColor","bar","hlColor","run","resolved","$btn","setActive","styleSel","surface","WordEditor"],"mappings":"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"}