{"version":3,"file":"rk-editor-ui.cjs","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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"}