@w100n/documents 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/{SheetView-3XTEV2VT.css → SheetView-43MPR64N.css} +5 -4
  2. package/dist/{SheetView-3XTEV2VT.css.map → SheetView-43MPR64N.css.map} +1 -1
  3. package/dist/{SheetView-3UAFXGZS.js → SheetView-4TPL7DES.js} +51 -10
  4. package/dist/SheetView-4TPL7DES.js.map +1 -0
  5. package/dist/{TextEditor-OLBLWC6F.js → TextEditor-VBHWUOZR.js} +636 -225
  6. package/dist/TextEditor-VBHWUOZR.js.map +1 -0
  7. package/dist/{chunk-L765DZPO.js → chunk-2CA3HQTI.js} +3 -3
  8. package/dist/{chunk-L765DZPO.js.map → chunk-2CA3HQTI.js.map} +1 -1
  9. package/dist/{chunk-MRP3EURG.js → chunk-5MH4WDW4.js} +133 -20
  10. package/dist/chunk-5MH4WDW4.js.map +1 -0
  11. package/dist/{chunk-WR3MT7KP.js → chunk-DR3TTJWZ.js} +374 -29
  12. package/dist/chunk-DR3TTJWZ.js.map +1 -0
  13. package/dist/{chunk-T7XCGDE5.js → chunk-RCQODE2Z.js} +2 -2
  14. package/dist/collab.cjs +487 -46
  15. package/dist/collab.cjs.map +1 -1
  16. package/dist/collab.d.cts +2 -2
  17. package/dist/collab.d.ts +2 -2
  18. package/dist/collab.js +2 -2
  19. package/dist/{grid-EI5JNZAA.js → grid-Q4XBPQFY.js} +3 -3
  20. package/dist/grid-Q4XBPQFY.js.map +1 -0
  21. package/dist/index.cjs +1449 -314
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.css +888 -171
  24. package/dist/index.css.map +1 -1
  25. package/dist/index.d.cts +9 -4
  26. package/dist/index.d.ts +9 -4
  27. package/dist/index.js +282 -32
  28. package/dist/index.js.map +1 -1
  29. package/dist/kinds.cjs +2 -2
  30. package/dist/kinds.cjs.map +1 -1
  31. package/dist/kinds.d.cts +2 -2
  32. package/dist/kinds.d.ts +2 -2
  33. package/dist/kinds.js +1 -1
  34. package/dist/memory.cjs +3 -0
  35. package/dist/memory.cjs.map +1 -1
  36. package/dist/memory.d.cts +1 -1
  37. package/dist/memory.d.ts +1 -1
  38. package/dist/memory.js +4 -1
  39. package/dist/memory.js.map +1 -1
  40. package/dist/{types-Er60M5kL.d.ts → types-BTsVooZw.d.cts} +2 -1
  41. package/dist/{types-Er60M5kL.d.cts → types-BTsVooZw.d.ts} +2 -1
  42. package/dist/write-BCI8yool.d.cts +16 -0
  43. package/dist/write-BCI8yool.d.ts +16 -0
  44. package/package.json +1 -1
  45. package/dist/SheetView-3UAFXGZS.js.map +0 -1
  46. package/dist/TextEditor-OLBLWC6F.js.map +0 -1
  47. package/dist/chunk-MRP3EURG.js.map +0 -1
  48. package/dist/chunk-WR3MT7KP.js.map +0 -1
  49. package/dist/grid-EI5JNZAA.js.map +0 -1
  50. package/dist/write-DaVtTJCS.d.cts +0 -6
  51. package/dist/write-DaVtTJCS.d.ts +0 -6
  52. /package/dist/{chunk-T7XCGDE5.js.map → chunk-RCQODE2Z.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor/TextEditor.tsx","../src/viewers/DocxView.tsx","../src/viewers/headings.ts"],"sourcesContent":["import type { JSONContent } from '@tiptap/core';\nimport type { Node as Block } from '@tiptap/pm/model';\nimport { EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport {\n AlignCenter, AlignJustify, AlignLeft, AlignRight, Baseline, BetweenHorizontalEnd, BetweenHorizontalStart, BetweenVerticalEnd, BetweenVerticalStart, Bold, Check,\n ChevronDown, ChevronUp, CloudAlert, Code, FilePenLine, Highlighter, ImagePlus, Italic, Link, Link2Off, List, ListChecks, ListIndentDecrease, ListIndentIncrease, ListOrdered, ListTree,\n Grid3x3, Image, MessageSquarePlus, MessagesSquare, MoveHorizontal, PaintBucket, PaintRoller, Printer, Search, PanelLeft, PanelRight, Ruler, PanelTop, Pencil, Plus, Minus, Redo2, RemoveFormatting, Reply, RotateCcw, Save, Strikethrough, Table,\n Subscript, Superscript, TableCellsMerge, TableColumnsSplit, TableRowsSplit, Trash2, Underline, Undo2, UnfoldVertical, WifiOff, X, type LucideIcon,\n} from 'lucide-react';\nimport { Fragment, useEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { readDocx, writeDocx } from '../docx';\nimport { rove, useRestore } from '../focus';\nimport type { Text } from '../text';\nimport type { Comment, DocumentsHost, Language, Rights } from '../types';\nimport type { Guard } from '../Unsaved';\nimport { useLoad } from '../useLoad';\nimport DocxView from '../viewers/DocxView';\nimport type { Heading, Reading } from '../viewers/headings';\nimport { align, changes, cleanPaste, clear, decide, entries, indent, kit, locate, notes, replace, searching, spacing, suggesting, type Change } from './extensions';\nimport { useLive } from './live';\nimport { fromMarkdown, toMarkdown, track, type Base } from './markdown';\nimport { a4, letter, paging, type Page } from './pager';\n\nconst legal = { width: 816, height: 1344 };\nconst cm = (px: number) => Math.round(px / 96 * 254) / 100;\n\ntype Menu = 'file' | 'edit' | 'view' | 'insert' | 'format' | 'tools';\ntype Pop = 'style' | 'color' | 'mark' | 'table' | 'link' | 'image' | 'zoom' | 'font' | 'size' | 'spacing' | 'fill' | 'find' | 'align' | Menu | null;\ntype Paint = { marks: { type: string; attrs?: Record<string, unknown> }[]; block: Record<string, unknown>; keep: boolean };\ntype Item = { label: string; run: () => unknown; on?: boolean; off?: boolean; keys?: string } | '-';\n\nconst inks = ['#0f172a', '#475569', '#dc2626', '#ea580c', '#ca8a04', '#16a34a', '#0891b2', '#2563eb', '#7c3aed', '#db2777'];\nconst glows = ['#fef08a', '#bbf7d0', '#bfdbfe', '#fbcfe8', '#fed7aa', '#ddd6fe'];\nconst faces = ['Arial', 'Calibri', 'Cambria', 'Courier New', 'Georgia', 'Inter', 'Roboto', 'Times New Roman', 'Verdana'];\nconst sizes = [8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 48, 72];\nconst uid = () => Math.random().toString(36).slice(2, 10);\n\nexport default function TextEditor({ kind, bytes, t, language, rights, host, together, documentId, onSaved, onOutline, onReading, onPanel, slot, head, file, guard }: {\n kind: 'markdown' | 'docx'; bytes: ArrayBuffer; t: Text; language: Language; rights?: Rights; host?: DocumentsHost; together?: boolean; documentId: string;\n onSaved?: () => void; onOutline: (headings: Heading[]) => void; onReading?: (reading: Reading) => void; onPanel?: (tab: 'outline' | 'comments') => void; slot: HTMLElement | null; head?: { menus: HTMLElement | null; status: HTMLElement | null };\n file?: { formats: ('pdf' | 'docx' | 'md')[]; download: (format: 'pdf' | 'docx' | 'md') => void; copy?: () => void; rename?: () => void }; guard?: Guard;\n}) {\n const docx = kind === 'docx';\n const can = { edit: !!host?.save && !!rights?.edit, comment: !!host?.comment && !!rights && (rights.comment || rights.edit) };\n const source = useLoad(async () => {\n if (docx) return { ...await readDocx(bytes), md: null };\n const md = fromMarkdown(new TextDecoder().decode(bytes));\n return { doc: md.doc, md, styles: [], page: a4 };\n }, [bytes, kind]);\n const live = useLive(together ? host : undefined, documentId, kind, bytes, source.data?.doc, language, can.edit, onSaved);\n const shared = live?.ready ? live.wire : null;\n if (live?.readonly) can.edit = false;\n const baseline = useRef<{ bytes: ArrayBuffer; doc: Block; base: Base | null } | null>(null);\n const anchors = useRef(new Map<string, string>());\n const scroller = useRef<HTMLDivElement>(null);\n const root = useRef<HTMLDivElement>(null);\n const [pop, setPop] = useState<Pop>(null);\n const [more, setMore] = useState(() => typeof localStorage !== 'undefined' && localStorage.getItem('w100n-docs-more') === '1');\n const [zoom, setZoom] = useState<number | null>(null);\n const [layout, setLayout] = useState<Page | null>(null);\n const [room, setRoom] = useState(0);\n const [saving, setSaving] = useState<'idle' | 'busy' | 'done' | 'failed'>('idle');\n const [href, setHref] = useState('');\n const [grid, setGrid] = useState({ rows: 0, cols: 0 });\n const [draft, setDraft] = useState<{ quote: string; body: string } | null>(null);\n const [reply, setReply] = useState<{ id: string; body: string } | null>(null);\n const [active, setActive] = useState<string | null>(null);\n const [resolved, setResolved] = useState(false);\n const [posting, setPosting] = useState<'idle' | 'busy' | 'failed'>('idle');\n const [added, setAdded] = useState<Comment[]>([]);\n const [changed, setChanged] = useState<Record<string, Comment | null>>({});\n const [editing, setEditing] = useState<{ id: string; body: string } | null>(null);\n const [dropping, setDropping] = useState<string | null>(null);\n const [failed, setFailed] = useState(false);\n const [paint, setPaint] = useState<Paint | null>(null);\n const [query, setQuery] = useState('');\n const [swap, setSwap] = useState('');\n const [matchCase, setMatchCase] = useState(false);\n const [count, setCount] = useState({ words: 0, pages: 0 });\n const [marg, setMarg] = useState<{ header: string; footer: string; numbers: boolean } | null>(null);\n const [unsetup, setUnsetup] = useState(false);\n const [draft2, setDraft2] = useState<{ width: number; height: number; margins: number[]; header: string; footer: string; numbers: boolean } | null>(null);\n useRestore(pop !== null);\n useRestore(editing !== null);\n useRestore(dropping !== null);\n\n const editor = useEditor({\n extensions: kit(kind, t, shared),\n content: shared ? null : source.data?.doc ?? null,\n editable: can.edit && (!live || !!shared),\n immediatelyRender: true,\n shouldRerenderOnTransaction: false,\n editorProps: { attributes: { class: 'w100n-docs-prose w100n-text-body', 'aria-label': t.documentText }, transformPastedHTML: cleanPaste },\n onCreate: ({ editor: made }) => {\n if (source.data && !live) baseline.current = { bytes, doc: made.state.doc, base: source.data.md && track(source.data.md, made.state.doc) };\n },\n }, [source.data, can.edit, shared]);\n\n const state = useEditorState({\n editor,\n selector: ({ editor: e }) => {\n if (!e) return null;\n const { $from, empty } = e.state.selection;\n const block = $from.parent;\n return {\n style: e.isActive('codeBlock') ? 'code' : block.type.name === 'heading' ? `h${block.attrs.level}` : e.isActive('blockquote') ? 'quote' : 'normal',\n bold: e.isActive('bold'), italic: e.isActive('italic'), underline: e.isActive('underline'), strike: e.isActive('strike'), code: e.isActive('code'),\n bullets: e.isActive('bulletList'), numbers: e.isActive('orderedList'), tasks: e.isActive('taskList'),\n align: (block.attrs.align as string | null) ?? 'left', table: e.isActive('table'), link: e.isActive('link'),\n color: (e.getAttributes('textStyle').color as string | undefined) ?? null, glow: e.isActive('highlight'),\n font: (e.getAttributes('textStyle').fontFamily as string | undefined) ?? null, size: (e.getAttributes('textStyle').fontSize as string | undefined) ?? null,\n fill: (e.getAttributes('tableCell').background ?? e.getAttributes('tableHeader').background ?? null) as string | null, bare: e.getAttributes('table').borders === 'none',\n sup: e.isActive('superscript'), sub: e.isActive('subscript'), img: e.isActive('image') ? (e.getAttributes('image').wrap as string | null) ?? 'inline' : null, line: (block.attrs.line as number | null) ?? null, after: (block.attrs.after as number | null) ?? null,\n undo: e.can().undo(), redo: e.can().redo(), empty,\n toc: (() => { let at = -1; e.state.doc.forEach((node, pos) => { if (at < 0 && node.type.name === 'toc') at = pos; }); return at; })(),\n find: (({ at, hits }) => `${at}/${hits.length}`)(searching.getState(e.state)!), suggest: !!suggesting.getState(e.state)?.on, revs: docx ? changes(e.state.doc) : [],\n dirty: !!baseline.current && !e.state.doc.eq(baseline.current.doc),\n };\n },\n });\n\n const page = layout ?? source.data?.page ?? a4;\n const print = () => {\n if (!editor) return;\n const frame = document.createElement('iframe');\n frame.style.cssText = 'position:fixed;width:0;height:0;border:0;opacity:0';\n document.body.append(frame);\n const [mt, mr, mb, ml] = page.margins;\n const size = docx ? `${page.width}px ${page.height}px` : 'A4';\n frame.contentDocument!.open();\n frame.contentDocument!.write(`<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>${editor.state.doc.firstChild?.textContent.slice(0, 80).replace(/[<&]/g, '') ?? ''}</title><style>\n@page { size: ${size}; margin: ${docx ? `${mt}px ${mr}px ${mb}px ${ml}px` : '20mm'}; }\nbody { margin: 0; font: 11pt/1.5 Arial, sans-serif; color: #111; }\nh1 { font-size: 20pt; } h2 { font-size: 15pt; } h3 { font-size: 13pt; }\ntable { border-collapse: collapse; width: 100%; } td, th { border: 1px solid #94a3b8; padding: 4px 6px; vertical-align: top; } table[data-borders='none'] td, table[data-borders='none'] th { border-color: transparent; }\nimg { max-width: 100%; } img[data-wrap='left'] { float: left; margin: 0 12pt 6pt 0; } img[data-wrap='right'] { float: right; margin: 0 0 6pt 12pt; }\n[data-type='page-break'], .page-break { break-after: page; height: 0; overflow: hidden; }\n</style></head><body>${editor.getHTML()}</body></html>`);\n frame.contentDocument!.close();\n frame.contentWindow!.focus();\n frame.contentWindow!.print();\n setTimeout(() => frame.remove(), 1000);\n };\n const marginal = marg ?? (source.data && 'marginal' in source.data ? source.data.marginal : null) ?? { header: '', footer: '', numbers: false };\n useEffect(() => {\n if (editor && docx && source.data) editor.view.dispatch(editor.state.tr.setMeta(paging, { page, marks: { header: marginal.header, footer: marginal.footer } }));\n }, [editor, source.data, page, marginal.header, marginal.footer]);\n useEffect(() => {\n if (!shared || !docx) return;\n const map = shared.doc.getMap<unknown>('setup');\n const sync = () => {\n const v = map.toJSON() as { page?: Page; header?: string; footer?: string; numbers?: boolean };\n if (v.page) setLayout(v.page);\n if (v.header !== undefined || v.footer !== undefined || v.numbers !== undefined) setMarg({ header: v.header ?? '', footer: v.footer ?? '', numbers: !!v.numbers });\n };\n sync();\n map.observe(sync);\n return () => map.unobserve(sync);\n }, [shared, docx]);\n\n const loaded = useLoad(signal => host?.comments ? host.comments(documentId, { signal }) : Promise.resolve([]), [host, documentId]);\n const all = [...(loaded.data ?? []), ...added].flatMap(c => c.id in changed ? changed[c.id] ?? [] : [c]).filter(c => !c.replyTo || changed[c.replyTo] !== null);\n const open = all.filter(c => !c.replyTo && !c.resolved);\n const threads = all.filter(c => !c.replyTo && (resolved || !c.resolved)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n const openIds = open.map(c => c.id).join();\n\n useEffect(() => {\n if (!editor || !source.data) return;\n const have = new Map(notes.getState(editor.state)!.spots.map(s => [s.id, s]));\n const fresh = open.filter(c => !have.has(c.id));\n const found = locate(editor.state.doc, fresh.map(c => ({ id: c.id, quote: c.quote, anchor: anchors.current.get(c.id) })));\n editor.view.dispatch(editor.state.tr.setMeta(notes, { spots: [...open.flatMap(c => have.get(c.id) ?? []), ...found] }));\n }, [editor, source.data, openIds]);\n\n useEffect(() => {\n if (editor && source.data) editor.view.dispatch(editor.state.tr.setMeta(notes, { active }));\n }, [editor, source.data, active]);\n\n useEffect(() => {\n if (!editor || !source.data) return;\n let timer = 0;\n let last = '';\n const run = () => {\n const list: Heading[] = [];\n editor.state.doc.forEach((node, offset) => {\n if (node.type.name !== 'heading' || !node.textContent.trim()) return;\n list.push({ id: `h${offset}`, level: Math.min(3, node.attrs.level), text: node.textContent.trim(), go: () => {\n (editor.view.nodeDOM(offset) as HTMLElement | null)?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n editor.commands.setTextSelection(offset + 1);\n } });\n });\n const text = editor.state.doc.textBetween(0, editor.state.doc.content.size, ' ', ' ');\n setCount({ words: (text.match(/[\\p{L}\\p{N}]+(?:['’-][\\p{L}\\p{N}]+)*/gu) ?? []).length, pages: scroller.current?.querySelectorAll('.w100n-text-gap').length ?? 0 });\n const key = JSON.stringify(list.map(h => [h.id, h.level, h.text]));\n if (key === last) return;\n last = key;\n onOutline(list);\n };\n const later = () => { clearTimeout(timer); timer = window.setTimeout(run, 300); };\n run();\n editor.on('update', later);\n return () => { clearTimeout(timer); editor.off('update', later); };\n }, [editor, source.data, onOutline]);\n useEffect(() => {\n const el = scroller.current;\n if (!el || !editor || !onReading) return;\n let frame = 0;\n let last = '';\n const look = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const line = el.getBoundingClientRect().top + el.clientHeight / 3;\n let id: string | null = null;\n editor.state.doc.forEach((node, offset) => {\n const dom = node.type.name === 'heading' && node.textContent.trim() ? editor.view.nodeDOM(offset) as HTMLElement | null : null;\n if (dom && dom.getBoundingClientRect().top <= line) id = `h${offset}`;\n });\n const room = el.scrollHeight - el.clientHeight;\n const progress = room > 0 ? Math.round(el.scrollTop / room * 100) / 100 : 1;\n if (`${id}:${progress}` === last) return;\n last = `${id}:${progress}`;\n onReading({ documentId, id, progress });\n });\n };\n look();\n el.addEventListener('scroll', look, { passive: true });\n return () => { cancelAnimationFrame(frame); el.removeEventListener('scroll', look); };\n }, [editor, source.data, onReading, documentId]);\n\n const dirty = live ? live.pending : !!state?.dirty || unsetup;\n const unsent = live ? live.unsynced && can.edit : dirty;\n useEffect(() => {\n if (!guard || live || !dirty || !source.data || !editor) return;\n guard.current = save;\n return () => { guard.current = null; };\n });\n useEffect(() => {\n if (live || !dirty || !can.edit || saving === 'busy' || !editor) return;\n const timer = window.setTimeout(() => void save(true), 3000);\n return () => clearTimeout(timer);\n });\n useEffect(() => {\n if (!unsent) return;\n const stop = (e: BeforeUnloadEvent) => e.preventDefault();\n window.addEventListener('beforeunload', stop);\n return () => window.removeEventListener('beforeunload', stop);\n }, [unsent]);\n\n useEffect(() => {\n const el = scroller.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const watch = new ResizeObserver(() => setRoom(el.clientWidth));\n watch.observe(el);\n return () => watch.disconnect();\n }, [editor, source.data]);\n\n useEffect(() => {\n const el = root.current;\n if (!el) return;\n const open = () => { setPop('find'); el.querySelector<HTMLInputElement>('.w100n-text-find input')?.focus(); };\n el.addEventListener('docs-find', open);\n return () => el.removeEventListener('docs-find', open);\n }, [editor, source.data]);\n\n useEffect(() => {\n const shown = pop === 'find' ? query : '';\n if (editor && searching.getState(editor.state)!.query !== shown) editor.view.dispatch(editor.state.tr.setMeta(searching, { query: shown }));\n }, [editor, pop, query]);\n\n useEffect(() => {\n const press = (e: globalThis.KeyboardEvent) => {\n if (!(e.metaKey || e.ctrlKey) || e.altKey || e.shiftKey || e.key.toLowerCase() !== 'p') return;\n e.preventDefault();\n e.stopPropagation();\n print();\n };\n window.addEventListener('keydown', press, true);\n return () => window.removeEventListener('keydown', press, true);\n });\n\n useEffect(() => {\n if (!pop) return;\n const close = (e: PointerEvent) => { if (!(e.target as HTMLElement).closest('.w100n-text-pop, [data-pop]')) setPop(null); };\n document.addEventListener('pointerdown', close);\n return () => document.removeEventListener('pointerdown', close);\n }, [pop]);\n\n if (source.error) return docx ? <div className=\"w100n-docs-scroll\"><DocxView bytes={bytes} onOutline={onOutline} failed={t.failed} /></div> : <div className=\"w100n-docs-empty\">{t.failed}</div>;\n if (!source.data || !editor || !state || (live && !live.ready && !live.late && !live.denied)) return <div className=\"w100n-docs-empty\">{t.loading}</div>;\n\n const save = async (auto = false) => {\n if (live) {\n if (!can.edit || !live.ready || !live.online || !live.pending || saving === 'busy') return false;\n setSaving('busy');\n const ok = await live.save();\n setSaving(ok ? 'done' : 'failed');\n return ok;\n }\n const was = baseline.current;\n const doc = editor.state.doc;\n if (!can.edit || !was || saving === 'busy' || (doc.eq(was.doc) && !unsetup)) return false;\n setSaving('busy');\n try {\n const md = was.base && toMarkdown(doc, was.base);\n const out = md ? new TextEncoder().encode(md.text).buffer as ArrayBuffer : await writeDocx(was.bytes, editor.getJSON(), undefined, unsetup ? { page, ...marginal } : undefined);\n await host!.save!(documentId, out, auto ? t.autosavedNote : t.editedNote, auto);\n baseline.current = { bytes: md ? out : was.bytes, doc, base: md ? md.base : null };\n if (!md && editor.state.doc === doc) {\n const fresh = (await readDocx(out)).doc;\n if (editor.state.doc === doc && renew(fresh)) baseline.current = { bytes: out, doc: editor.state.doc, base: null };\n }\n setUnsetup(false);\n setSaving('done');\n onSaved?.();\n return true;\n } catch {\n setSaving('failed');\n return false;\n }\n };\n\n const renew = (fresh: JSONContent) => {\n const at: number[] = [];\n const refs: string[] = [];\n editor.state.doc.descendants((node, pos) => { if (node.isBlock) at.push(pos); });\n editor.schema.nodeFromJSON(fresh).descendants(node => { if (node.isBlock) refs.push(node.type.name, node.attrs.ref); });\n if (refs.length !== at.length * 2 || at.some((pos, i) => editor.state.doc.nodeAt(pos)!.type.name !== refs[i * 2])) return false;\n const tr = editor.state.tr.setMeta('addToHistory', false);\n at.forEach((pos, i) => { if (tr.doc.nodeAt(pos)!.attrs.ref !== refs[i * 2 + 1]) tr.setNodeAttribute(pos, 'ref', refs[i * 2 + 1]); });\n editor.view.dispatch(tr);\n return true;\n };\n\n const linkUp = () => {\n setHref((editor.getAttributes('link').href as string | undefined) ?? '');\n setPop('link');\n };\n const putLink = () => {\n const value = href.trim();\n const chain = editor.chain().focus();\n if (!value) chain.extendMarkRange('link').unsetLink().run();\n else if (editor.state.selection.empty && !editor.isActive('link')) chain.insertContent({ type: 'text', text: value, marks: [{ type: 'link', attrs: { href: value } }] }).run();\n else chain.extendMarkRange('link').setLink({ href: value }).run();\n setPop(null);\n };\n const begin = () => {\n const { from, to, empty } = editor.state.selection;\n if (empty || !can.comment) return;\n editor.view.dispatch(editor.state.tr.setMeta(notes, { pending: { from, to } }));\n setDraft({ quote: editor.state.doc.textBetween(from, to, '\\n', ' '), body: '' });\n setPosting('idle');\n onPanel?.('comments');\n };\n const drop = () => {\n editor.view.dispatch(editor.state.tr.setMeta(notes, { pending: null }));\n setDraft(null);\n };\n const post = async () => {\n if (!draft?.body.trim() || !host?.comment || posting === 'busy') return;\n setPosting('busy');\n try {\n const anchor = uid();\n const made = await host.comment(documentId, { body: draft.body.trim(), quote: draft.quote, replyTo: null, anchor });\n anchors.current.set(made.id, anchor);\n const range = notes.getState(editor.state)!.pending;\n editor.view.dispatch(editor.state.tr.setMeta(notes, { pending: null, spots: [...notes.getState(editor.state)!.spots, ...(range ? [{ id: made.id, ...range }] : [])] }));\n setAdded(list => [...list, made]);\n setDraft(null);\n setActive(made.id);\n setPosting('idle');\n } catch {\n setPosting('failed');\n }\n };\n const answer = async (parent: Comment) => {\n if (!reply?.body.trim() || !host?.comment || posting === 'busy') return;\n setPosting('busy');\n try {\n const made = await host.comment(documentId, { body: reply.body.trim(), quote: parent.quote, replyTo: parent.id, anchor: anchors.current.get(parent.id) ?? '' });\n setAdded(list => [...list, made]);\n setReply(null);\n setPosting('idle');\n } catch {\n setPosting('failed');\n }\n };\n const settle = async (c: Comment) => {\n try {\n await host!.resolveComment!(documentId, c.id, !c.resolved);\n setChanged(list => ({ ...list, [c.id]: { ...c, resolved: !c.resolved } }));\n } catch {\n setPosting('failed');\n }\n };\n const change = async (id: string, body: string | null) => {\n if (posting === 'busy') return;\n setPosting('busy');\n setFailed(false);\n try {\n let made: Comment | null = null;\n if (body === null) await host!.deleteComment!(documentId, id);\n else made = await host!.editComment!(documentId, id, body);\n setChanged(list => ({ ...list, [id]: made }));\n setEditing(null);\n setDropping(null);\n if (body === null && active === id) setActive(null);\n } catch {\n setFailed(true);\n }\n setPosting('idle');\n };\n const mine = (c: Comment) => c.author.id === host?.me.id;\n const drops = (c: Comment) => mine(c) || c.author.id.startsWith('guest:') && !!rights?.edit;\n const show = (c: Comment) => {\n setActive(c.id);\n const spot = notes.getState(editor.state)!.spots.find(s => s.id === c.id);\n if (!spot) return;\n const at = editor.view.domAtPos(spot.from).node;\n (at instanceof HTMLElement ? at : at.parentElement)?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n };\n const suggested = [...state.revs.reduce((all, c) => {\n const key = `${c.kind}:${c.id}`;\n const was = all.get(key);\n all.set(key, was ? { ...was, text: `${was.text} ${c.text}` } : c);\n return all;\n }, new Map<string, Change>()).values()];\n const jump = (at: number) => {\n const dom = editor.view.domAtPos(at).node;\n (dom instanceof HTMLElement ? dom : dom.parentElement)?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n };\n const percent = zoom ?? (docx && room ? Math.max(10, Math.min(100, Math.floor((room - 24) / page.width * 100))) : 100);\n const zoomBy = (d: number) => setZoom(Math.min(200, Math.max(30, percent + d)));\n\n const keys = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.defaultPrevented) return;\n const key = e.key.toLowerCase();\n const mod = e.metaKey || e.ctrlKey;\n if (key === 'escape' && (pop || draft || paint)) {\n e.stopPropagation();\n if (paint) setPaint(null);\n else if (pop) setPop(null);\n else drop();\n return;\n }\n if (!mod) return;\n const act = (run: () => unknown) => { e.preventDefault(); run(); };\n if (key === 's' && can.edit) act(() => void save());\n else if (key === 'k' && can.edit) act(linkUp);\n else if (key === 'f' && !e.altKey) act(() => setPop('find'));\n else if (key === 'm' && e.altKey && can.comment) act(begin);\n else if (!can.edit || e.altKey) return;\n else if (key === ']' || key === '[') act(() => indent(editor, key === ']' ? 1 : -1));\n else if (key === '\\\\') act(() => clear(editor));\n else if (key === 'enter' && docx) act(() => editor.chain().focus().insertContent({ type: 'pageBreak' }).run());\n else if (e.shiftKey && docx && ['l', 'e', 'r', 'j'].includes(key)) act(() => align(editor, { l: 'left', e: 'center', r: 'right', j: 'justify' }[key]!));\n };\n\n const tool = (icon: LucideIcon, label: string, run: () => unknown, pressed?: boolean, disabled?: boolean) => {\n const Icon = icon;\n return <button type=\"button\" aria-label={label} title={label} aria-pressed={pressed} disabled={disabled} onClick={() => { run(); }}><Icon aria-hidden /></button>;\n };\n const gap = <span className=\"w100n-pdf-gap\" />;\n const known = source.data.styles;\n const named = (test: (style: { name: string; heading: number | null }) => boolean) => {\n const name = known.find(test)?.name;\n return name && `${name[0].toUpperCase()}${name.slice(1)}`;\n };\n const levels = docx ? [1, 2, 3, 4, 5, 6].filter(level => level <= 4 || named(s => s.heading === level)) : [1, 2, 3, 4];\n const styles: [string, string, () => unknown][] = [\n ['normal', t.normal, () => editor.chain().focus().clearNodes().setParagraph().run()],\n ...levels.map(level => [`h${level}`, named(s => s.heading === level && !/^title$/i.test(s.name)) || `${t.heading} ${level}`,\n () => editor.chain().focus().setHeading({ level: level as 1 | 2 | 3 | 4 | 5 | 6 }).run()] as [string, string, () => unknown]),\n ['quote', named(s => /quote/i.test(s.name)) || t.quote, () => editor.chain().focus().clearNodes().setParagraph().setBlockquote().run()],\n ['code', t.code, () => editor.chain().focus().setCodeBlock().run()],\n ];\n const margins: [string, Page['margins']][] = [[t.marginsNormal, [96, 96, 96, 96]], [t.marginsNarrow, [48, 48, 48, 48]], [t.marginsWide, [96, 192, 96, 192]]];\n const when = (iso: string) => new Intl.DateTimeFormat(language, { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' }).format(new Date(iso));\n const person = (c: Comment) => <header>\n {c.author.avatarUrl ? <img className=\"w100n-text-face\" src={c.author.avatarUrl} alt=\"\" /> : <span className=\"w100n-text-face\" aria-hidden>{c.author.name.slice(0, 1).toUpperCase()}</span>}\n <span className=\"w100n-text-who\"><b>{c.author.name}{c.author.id.startsWith('guest:') && <span className=\"w100n-docs-badge\">{t.guest}</span>}</b><small>{when(c.createdAt)}</small></span>\n {drops(c) && <span className=\"w100n-text-own\" onClick={e => e.stopPropagation()}>\n {mine(c) && host!.editComment && <button type=\"button\" aria-label={t.editComment} title={t.editComment} onClick={() => { setDropping(null); setEditing({ id: c.id, body: c.body }); }}><Pencil aria-hidden /></button>}\n {host!.deleteComment && <button type=\"button\" data-tone=\"red\" aria-label={t.delete} title={t.delete} onClick={() => { setEditing(null); setDropping(c.id); }}><Trash2 aria-hidden /></button>}\n </span>}\n </header>;\n const words = (c: Comment) => editing?.id === c.id ? <div className=\"w100n-text-reply w100n-text-edit\" onClick={e => e.stopPropagation()}>\n <textarea autoFocus value={editing.body} aria-label={t.editComment} onChange={e => setEditing({ ...editing, body: e.target.value })}\n onKeyDown={e => { if (e.key === 'Enter' && (e.metaKey || e.ctrlKey) && editing.body.trim()) void change(c.id, editing.body.trim()); }} />\n <span className=\"w100n-pdf-dialog-end\">\n <button type=\"button\" className=\"w100n-pdf-link\" onClick={() => setEditing(null)}>{t.cancel}</button>\n <button type=\"button\" className=\"w100n-docs-action\" disabled={!editing.body.trim() || editing.body.trim() === c.body || posting === 'busy'} onClick={() => void change(c.id, editing.body.trim())}>\n <Save aria-hidden />{t.save}\n </button>\n </span>\n </div> : dropping === c.id ? <div className=\"w100n-text-confirm\" role=\"group\" aria-label={t.delete} onClick={e => e.stopPropagation()}>\n <p>{c.replyTo || !all.some(r => r.replyTo === c.id) ? t.deleteAsk : t.deleteThread}</p>\n <span className=\"w100n-pdf-dialog-end\">\n <button type=\"button\" className=\"w100n-pdf-link\" autoFocus onClick={() => setDropping(null)}>{t.cancel}</button>\n <button type=\"button\" className=\"w100n-docs-action\" data-tone=\"red\" disabled={posting === 'busy'} onClick={() => void change(c.id, null)}><Trash2 aria-hidden />{t.delete}</button>\n </span>\n </div> : <p>{c.body}</p>;\n const pick = (next: Pop) => setPop(pop === next ? null : next);\n const swatches = (list: string[], current: string | null, set: (color: string | null) => unknown, none: string): ReactNode =>\n <span className=\"w100n-text-pop w100n-text-swatches\" role=\"group\">\n <button type=\"button\" className=\"w100n-text-none\" onClick={() => { set(null); setPop(null); }}>{none}</button>\n {list.map((c, i) => <button key={i} type=\"button\" aria-label={c} aria-pressed={current === c} onClick={() => { set(c); setPop(null); }}><i style={{ background: c }} /></button>)}\n </span>;\n\n const mod = /Mac|iPhone|iPad/.test(navigator.platform) ? '⌘' : 'Ctrl+';\n const item = (label: string, run: () => unknown, more: { on?: boolean; off?: boolean; keys?: string } = {}): Item => ({ label, run, ...more });\n const insertToc = () => {\n const at = editor.state.selection.$from.before(1);\n editor.chain().focus().insertContentAt(at, { type: 'toc', attrs: { entries: JSON.stringify(entries(editor.state.doc, !docx, at - 1)) } }).run();\n };\n const suggest = () => editor.view.dispatch(editor.state.tr.setMeta(suggesting, { on: !state.suggest, me: host?.me.name ?? '' }));\n const aligns = [[AlignLeft, t.alignLeft, 'left'], [AlignCenter, t.alignCenter, 'center'], [AlignRight, t.alignRight, 'right'], [AlignJustify, t.justify, 'justify']] as const;\n const lines = [[1, t.single], [1.15, '1.15'], [1.5, '1.5'], [2, t.double]] as const;\n const menus: [Menu, string, (Item | false)[]][] = [\n ['file', t.menuFile, [\n ...(can.edit ? [\n item(t.save, () => void save(), { keys: `${mod}S`, off: !dirty }),\n item(t.print, print, { keys: `${mod}P` }),\n ...(docx ? ['-' as const, item(t.pageSetup, () => setDraft2({ width: page.width, height: page.height, margins: page.margins.map(cm), ...marginal }))] : []),\n ] : []),\n ...(can.edit && (file?.formats.length || file?.copy || file?.rename) ? ['-' as const] : []),\n ...(file?.formats ?? []).map(f => item(`${t.downloadAs} ${f === 'md' ? 'Markdown' : f.toUpperCase()}`, () => file!.download(f))),\n !!file?.copy && item(t.makeCopy, file.copy),\n !!file?.rename && item(t.rename, file.rename),\n ]],\n ['edit', t.menuEdit, can.edit ? [\n item(t.undo, () => editor.chain().focus().undo().run(), { keys: `${mod}Z`, off: !state.undo }),\n item(t.redo, () => editor.chain().focus().redo().run(), { keys: `${mod}⇧Z`, off: !state.redo }),\n '-', item(t.findReplace, () => setPop('find'), { keys: `${mod}F` }),\n '-', item(t.clearFormat, () => clear(editor), { keys: `${mod}\\\\` }),\n ] : []],\n ['view', t.viewTab, [\n item(t.zoomIn, () => zoomBy(10)), item(t.zoomOut, () => zoomBy(-10)), docx && item(t.fitWidth, () => setZoom(null), { on: zoom === null }), item(t.fit, () => setZoom(100)),\n '-', item(t.outline, () => onPanel?.('outline')),\n '-', item([docx && count.pages ? `${t.pages}: ${count.pages}` : '', `${t.words}: ${count.words.toLocaleString(language)}`].filter(Boolean).join(' · '), () => {}, { off: true }),\n ]],\n ['insert', t.insert, can.edit ? [\n item(t.table, () => setPop('table')), item(t.image, () => { setHref(''); setPop('image'); }), item(t.link, linkUp, { keys: `${mod}K` }),\n docx && item(t.pageBreak, () => editor.chain().focus().insertContent({ type: 'pageBreak' }).run(), { keys: `${mod}↵` }), item(t.rule, () => editor.chain().focus().setHorizontalRule().run()),\n '-', state.toc < 0 ? item(t.tocInsert, insertToc) : item(t.tocRemove, () => editor.chain().focus().deleteRange({ from: state.toc, to: state.toc + editor.state.doc.nodeAt(state.toc)!.nodeSize }).run()),\n can.comment && item(t.addComment, begin, { off: state.empty, keys: `${mod}⌥M` }),\n ] : []],\n ['format', t.menuFormat, can.edit ? [\n ...styles.map(([key, label, run]) => item(label, run, { on: state.style === key })),\n '-', item(t.bold, () => editor.chain().focus().toggleBold().run(), { on: state.bold, keys: `${mod}B` }), item(t.italic, () => editor.chain().focus().toggleItalic().run(), { on: state.italic, keys: `${mod}I` }),\n docx && item(t.underline, () => editor.chain().focus().toggleUnderline().run(), { on: state.underline, keys: `${mod}U` }), item(t.strike, () => editor.chain().focus().toggleStrike().run(), { on: state.strike }),\n docx && item(t.superscript, () => editor.chain().focus().toggleMark('superscript').run(), { on: state.sup, keys: `${mod}.` }),\n docx && item(t.subscript, () => editor.chain().focus().toggleMark('subscript').run(), { on: state.sub, keys: `${mod},` }),\n ...(docx ? ['-' as const, ...aligns.map(([, label, value]) => item(label, () => align(editor, value), { on: state.align === value })),\n '-' as const, ...lines.map(([v, label]) => item(`${t.lineSpacing}: ${label}`, () => spacing(editor, { line: v }), { on: state.line === v }))] : []),\n '-', item(t.bullets, () => editor.chain().focus().toggleBulletList().run(), { on: state.bullets }), item(t.numbers, () => editor.chain().focus().toggleOrderedList().run(), { on: state.numbers }),\n item(t.tasks, () => editor.chain().focus().toggleTaskList().run(), { on: state.tasks }),\n '-', item(t.outdent, () => indent(editor, -1), { keys: `${mod}[` }), item(t.indent, () => indent(editor, 1), { keys: `${mod}]` }),\n ] : []],\n ['tools', t.menuTools, [\n docx && can.edit && item(t.suggest, suggest, { on: state.suggest }),\n docx && can.edit && state.revs.length > 0 && item(t.acceptAll, () => decide(editor, true)),\n docx && can.edit && state.revs.length > 0 && item(t.rejectAll, () => decide(editor, false)),\n !!host?.comments && (can.comment || open.length > 0) && item(t.comments, () => onPanel?.('comments')),\n ]],\n ];\n const menu = ([key, label, list]: [Menu, string, (Item | false)[]]) => <span key={key} className=\"w100n-text-anchor\">\n <button type=\"button\" className=\"w100n-text-menu-button\" data-pop aria-haspopup=\"menu\" aria-expanded={pop === key} onClick={() => pick(key)}>{label}</button>\n {pop === key && <span className=\"w100n-text-pop w100n-text-menu\" role=\"menu\" aria-label={label}>{list.filter(x => x !== false).map((x, i) => x === '-' ? <hr key={i} /> :\n <button key={i} type=\"button\" role={x.on === undefined ? 'menuitem' : 'menuitemcheckbox'} aria-checked={x.on} disabled={x.off} onClick={() => { setPop(null); x.run(); }}>\n <Check aria-hidden /><span>{x.label}</span>{x.keys && <kbd>{x.keys}</kbd>}\n </button>)}</span>}\n </span>;\n const seek = (next: { query?: string; matchCase?: boolean; at?: number }) => {\n editor.view.dispatch(editor.state.tr.setMeta(searching, next));\n const found = searching.getState(editor.state)!;\n const hit = found.hits[found.at];\n if (hit && next.at !== undefined) {\n editor.commands.setTextSelection(hit);\n editor.view.dom.querySelector('.w100n-found.is-current')?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n };\n const found = searching.getState(editor.state);\n const finder = <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'find'} aria-label={t.findReplace} title={t.findReplace} onClick={() => pick('find')}><Search aria-hidden /></button>\n {pop === 'find' && <span className=\"w100n-text-pop w100n-text-find\" role=\"search\" aria-label={t.findReplace}>\n <span className=\"w100n-docs-row\">\n <input autoFocus value={query} placeholder={t.find} aria-label={t.find} onFocus={e => e.currentTarget.select()} onChange={e => { setQuery(e.target.value); seek({ query: e.target.value, at: 0 }); }}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); seek({ at: (found?.at ?? 0) + (e.shiftKey ? -1 : 1) }); } }} />\n <small aria-live=\"polite\">{query ? found?.hits.length ? `${(found.at ?? 0) + 1} / ${found.hits.length}` : t.noHits : ''}</small>\n <button type=\"button\" aria-label={t.previous} title={t.previous} disabled={!found?.hits.length} onClick={() => seek({ at: found!.at - 1 })}><ChevronUp aria-hidden /></button>\n <button type=\"button\" aria-label={t.next} title={t.next} disabled={!found?.hits.length} onClick={() => seek({ at: found!.at + 1 })}><ChevronDown aria-hidden /></button>\n </span>\n {can.edit && <span className=\"w100n-docs-row\">\n <input value={swap} placeholder={t.replaceWith} aria-label={t.replaceWith} onChange={e => setSwap(e.target.value)} />\n <button type=\"button\" className=\"w100n-pdf-link\" disabled={!found?.hits.length} onClick={() => { replace(editor, swap, false); seek({}); }}>{t.replaceOne}</button>\n <button type=\"button\" className=\"w100n-docs-action\" disabled={!found?.hits.length} onClick={() => { replace(editor, swap, true); seek({}); }}>{t.replaceAll}</button>\n </span>}\n <label className=\"w100n-setup-check\"><input type=\"checkbox\" checked={matchCase} onChange={e => { setMatchCase(e.target.checked); seek({ matchCase: e.target.checked, at: 0 }); }} />{t.matchCase}</label>\n </span>}\n </span>;\n const formats = ['bold', 'italic', 'underline', 'strike', 'code', 'highlight', 'textStyle', 'superscript', 'subscript'];\n const take = (keep: boolean) => {\n if (paint && !keep) return setPaint(null);\n const { $from } = editor.state.selection;\n const marks = (editor.state.storedMarks ?? $from.marks()).filter(m => formats.includes(m.type.name)).map(m => ({ type: m.type.name, attrs: m.attrs }));\n setPaint({ marks, block: { align: $from.parent.attrs.align, line: $from.parent.attrs.line, after: $from.parent.attrs.after }, keep });\n };\n const lay = () => {\n if (!paint || editor.state.selection.empty) return;\n const chain = editor.chain().focus();\n for (const name of formats) chain.unsetMark(name);\n for (const m of paint.marks) chain.setMark(m.type, m.attrs);\n chain.run();\n align(editor, paint.block.align as string | null);\n spacing(editor, { line: paint.block.line as number | null, after: paint.block.after as number | null });\n if (!paint.keep) setPaint(null);\n };\n const fontPicker = <span className=\"w100n-text-anchor\">\n <button type=\"button\" className=\"w100n-text-picker\" data-size=\"mid\" data-pop aria-haspopup=\"listbox\" aria-expanded={pop === 'font'} aria-label={t.font} title={t.font} onClick={() => pick('font')}>\n <span style={{ fontFamily: state.font ?? undefined }}>{state.font ?? t.defaultFont}</span><ChevronDown aria-hidden />\n </button>\n {pop === 'font' && <span className=\"w100n-text-pop w100n-text-styles\" role=\"listbox\" aria-label={t.font}>\n <button type=\"button\" role=\"option\" aria-selected={!state.font} onClick={() => { editor.chain().focus().unsetFontFamily().run(); setPop(null); }}>{t.defaultFont}</button>\n {faces.map(f => <button key={f} type=\"button\" role=\"option\" aria-selected={state.font === f} style={{ fontFamily: f }} onClick={() => { editor.chain().focus().setFontFamily(f).run(); setPop(null); }}>{f}</button>)}\n </span>}\n </span>;\n const sizePicker = <span className=\"w100n-text-anchor\">\n <button type=\"button\" className=\"w100n-text-picker\" data-size=\"small\" data-pop aria-haspopup=\"listbox\" aria-expanded={pop === 'size'} aria-label={t.fontSize} title={t.fontSize} onClick={() => pick('size')}>\n {state.size ? parseFloat(state.size) : t.defaultFont}<ChevronDown aria-hidden />\n </button>\n {pop === 'size' && <span className=\"w100n-text-pop w100n-text-styles\" role=\"listbox\" aria-label={t.fontSize}>\n <button type=\"button\" role=\"option\" aria-selected={!state.size} onClick={() => { editor.chain().focus().unsetFontSize().run(); setPop(null); }}>{t.defaultFont}</button>\n {sizes.map(n => <button key={n} type=\"button\" role=\"option\" aria-selected={state.size !== null && parseFloat(state.size) === n} onClick={() => { editor.chain().focus().setFontSize(`${n}pt`).run(); setPop(null); }}>{n}</button>)}\n </span>}\n </span>;\n const spacer = <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'spacing'} aria-label={t.lineSpacing} title={t.lineSpacing} onClick={() => pick('spacing')}><UnfoldVertical aria-hidden /></button>\n {pop === 'spacing' && <span className=\"w100n-text-pop w100n-text-styles\" role=\"listbox\" aria-label={t.lineSpacing}>\n {lines.map(([v, label]) => <button key={v} type=\"button\" role=\"option\" aria-selected={state.line === v} onClick={() => { spacing(editor, { line: v }); setPop(null); }}>{label}</button>)}\n <hr />\n <button type=\"button\" role=\"option\" aria-selected={false} onClick={() => { spacing(editor, { after: state.after === 0 ? 8 : 0 }); setPop(null); }}>{state.after === 0 ? t.spaceAfter : t.noSpaceAfter}</button>\n </span>}\n </span>;\n const applySetup = () => {\n const d = draft2!;\n const next: Page = { width: d.width, height: d.height, margins: d.margins.map(v => Math.round(v / 2.54 * 96 * 100) / 100) as Page['margins'] };\n const marks = { header: d.header.trim(), footer: d.footer.trim(), numbers: d.numbers };\n if (shared) shared.doc.transact(() => {\n const map = shared.doc.getMap<unknown>('setup');\n map.set('page', next);\n for (const [key, v] of Object.entries(marks)) map.set(key, v);\n });\n else {\n setLayout(next);\n setMarg(marks);\n setUnsetup(true);\n }\n setDraft2(null);\n };\n const zooms = [50, 75, 90, 100, 125, 150, 200];\n const zoomer = <span className=\"w100n-text-anchor\">\n <button type=\"button\" className=\"w100n-text-picker\" data-size=\"small\" data-pop aria-haspopup=\"listbox\" aria-expanded={pop === 'zoom'} aria-label={t.zoom} title={t.zoom} onClick={() => pick('zoom')}>\n {percent}%<ChevronDown aria-hidden />\n </button>\n {pop === 'zoom' && <span className=\"w100n-text-pop w100n-text-styles\" role=\"listbox\" aria-label={t.zoom}>\n {docx && <button type=\"button\" role=\"option\" aria-selected={zoom === null} onClick={() => { setZoom(null); setPop(null); }}>{t.fitWidth}</button>}\n {zooms.map(z => <button key={z} type=\"button\" role=\"option\" aria-selected={zoom === z} onClick={() => { setZoom(z); setPop(null); }}>{z}%</button>)}\n </span>}\n </span>;\n\n const Aligned = aligns.find(([, , value]) => value === state.align)?.[0] ?? AlignLeft;\n const aligner = <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'align'} aria-label={t.align} title={t.align} onClick={() => pick('align')}><Aligned aria-hidden /></button>\n {pop === 'align' && <span className=\"w100n-text-pop\" role=\"group\" aria-label={t.align}>\n <span className=\"w100n-text-tools\">{aligns.map(([icon, label, value], i) => <Fragment key={i}>{tool(icon, label, () => { align(editor, value); setPop(null); }, state.align === value)}</Fragment>)}</span>\n </span>}\n </span>;\n const widen = () => {\n localStorage.setItem('w100n-docs-more', more ? '' : '1');\n setMore(!more);\n };\n const main: ReactNode = can.edit ? <>\n <span className=\"w100n-text-anchor\">\n <button type=\"button\" className=\"w100n-text-picker\" data-size=\"mid\" data-pop aria-haspopup=\"listbox\" aria-expanded={pop === 'style'} aria-label={t.paragraphStyle} title={t.paragraphStyle} onClick={() => pick('style')}>\n {styles.find(([key]) => key === state.style)?.[1] ?? t.normal}<ChevronDown aria-hidden />\n </button>\n {pop === 'style' && <span className=\"w100n-text-pop w100n-text-styles\" role=\"listbox\" aria-label={t.paragraphStyle}>\n {styles.map(([key, label, run]) => <button key={key} type=\"button\" role=\"option\" data-style={key} aria-selected={state.style === key}\n onClick={() => { run(); setPop(null); }}>{label}</button>)}\n </span>}\n </span>\n {gap}\n {tool(Bold, t.bold, () => editor.chain().focus().toggleBold().run(), state.bold)}\n {tool(Italic, t.italic, () => editor.chain().focus().toggleItalic().run(), state.italic)}\n {docx ? tool(Underline, t.underline, () => editor.chain().focus().toggleUnderline().run(), state.underline) : tool(Strikethrough, t.strike, () => editor.chain().focus().toggleStrike().run(), state.strike)}\n {!docx && tool(Code, t.code, () => editor.chain().focus().toggleCode().run(), state.code)}\n {docx && <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'color'} aria-label={t.textColour} title={t.textColour} onClick={() => pick('color')}>\n <Baseline aria-hidden /><i className=\"w100n-text-bar\" style={{ background: state.color ?? 'currentColor' }} />\n </button>\n {pop === 'color' && swatches(inks, state.color, c => c ? editor.chain().focus().setColor(c).run() : editor.chain().focus().unsetColor().run(), t.automatic)}\n </span>}\n {gap}\n {docx && aligner}\n {tool(List, t.bullets, () => editor.chain().focus().toggleBulletList().run(), state.bullets)}\n {tool(ListOrdered, t.numbers, () => editor.chain().focus().toggleOrderedList().run(), state.numbers)}\n {!docx && tool(ListChecks, t.tasks, () => editor.chain().focus().toggleTaskList().run(), state.tasks)}\n {gap}\n <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'link'} aria-pressed={state.link} aria-label={t.link} title={t.link} onClick={() => pop === 'link' ? setPop(null) : linkUp()}><Link aria-hidden /></button>\n {pop === 'link' && <span className=\"w100n-text-pop w100n-text-form\">\n <input autoFocus value={href} placeholder={t.linkAddress} aria-label={t.linkAddress} onChange={e => setHref(e.target.value)} onKeyDown={e => { if (e.key === 'Enter') putLink(); }} />\n <span className=\"w100n-docs-row\">\n {state.link && <button type=\"button\" className=\"w100n-pdf-link\" onClick={() => { editor.chain().focus().extendMarkRange('link').unsetLink().run(); setPop(null); }}><Link2Off aria-hidden />{t.unlink}</button>}\n <button type=\"button\" className=\"w100n-docs-action\" disabled={!href.trim()} onClick={putLink}><Link aria-hidden />{t.apply}</button>\n </span>\n </span>}\n </span>\n {can.comment && tool(MessageSquarePlus, t.addComment, begin, undefined, state.empty)}\n <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'image'} aria-label={t.image} title={t.image} onClick={() => { setHref(''); pick('image'); }}><ImagePlus aria-hidden /></button>\n {pop === 'image' && <span className=\"w100n-text-pop w100n-text-form\">\n <input autoFocus value={href} placeholder={t.imageLink} aria-label={t.imageLink} onChange={e => setHref(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter' && href.trim()) { editor.chain().focus().setImage({ src: href.trim() }).run(); setPop(null); } }} />\n <span className=\"w100n-docs-row\">\n {docx && <label className=\"w100n-pdf-link\">{t.chooseFile}<input type=\"file\" accept=\"image/png,image/jpeg,image/gif\" hidden onChange={e => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => { editor.chain().focus().setImage({ src: String(reader.result), alt: file.name }).run(); setPop(null); };\n reader.readAsDataURL(file);\n }} /></label>}\n <button type=\"button\" className=\"w100n-docs-action\" disabled={!href.trim()} onClick={() => { editor.chain().focus().setImage({ src: href.trim() }).run(); setPop(null); }}><ImagePlus aria-hidden />{t.put}</button>\n </span>\n </span>}\n </span>\n <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'table'} aria-label={t.table} title={t.table} onClick={() => pick('table')}><Table aria-hidden /></button>\n {pop === 'table' && <span className=\"w100n-text-pop w100n-text-grid\" role=\"group\" aria-label={t.table} onPointerLeave={() => setGrid({ rows: 0, cols: 0 })}>\n <span>{Array.from({ length: 48 }, (_, i) => {\n const rows = Math.floor(i / 8) + 1;\n const cols = (i % 8) + 1;\n return <button key={i} type=\"button\" aria-label={`${rows} × ${cols}`} data-on={rows <= grid.rows && cols <= grid.cols} onPointerEnter={() => setGrid({ rows, cols })}\n onClick={() => { editor.chain().focus().insertTable({ rows, cols, withHeaderRow: true }).run(); setPop(null); }} />;\n })}</span>\n <small>{grid.rows ? `${grid.rows} × ${grid.cols}` : t.table}</small>\n </span>}\n </span>\n {gap}\n <button type=\"button\" aria-expanded={more} aria-label={more ? t.fewerTools : t.moreTools} title={more ? t.fewerTools : t.moreTools} onClick={widen}>{more ? <ChevronDown aria-hidden /> : <ChevronUp aria-hidden />}</button>\n </> : <>\n <button type=\"button\" className=\"w100n-text-word\" onClick={() => onPanel?.('outline')}><ListTree aria-hidden />{t.outline}</button>\n {can.comment && <><span className=\"w100n-text-grow\" /><button type=\"button\" className=\"w100n-docs-action\" disabled={state.empty} onClick={begin}><MessageSquarePlus aria-hidden />{t.addComment}</button></>}\n {!!host?.comments && (can.comment || open.length > 0) && <button type=\"button\" className=\"w100n-text-word\" onClick={() => onPanel?.('comments')}><MessagesSquare aria-hidden />{t.comments}<b>{open.length}</b></button>}\n </>;\n const extra: ReactNode = can.edit && more && <>\n {docx && <>{fontPicker}{sizePicker}{gap}</>}\n {docx && tool(Strikethrough, t.strike, () => editor.chain().focus().toggleStrike().run(), state.strike)}\n {docx && tool(Superscript, t.superscript, () => editor.chain().focus().toggleMark('superscript').run(), state.sup)}\n {docx && tool(Subscript, t.subscript, () => editor.chain().focus().toggleMark('subscript').run(), state.sub)}\n {docx && <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'mark'} aria-pressed={state.glow} aria-label={t.highlight} title={t.highlight} onClick={() => pick('mark')}><Highlighter aria-hidden /></button>\n {pop === 'mark' && swatches(glows, null, c => c ? editor.chain().focus().setHighlight({ color: c }).run() : editor.chain().focus().unsetHighlight().run(), t.noColour)}\n </span>}\n {docx && <>{gap}{spacer}</>}\n {tool(ListIndentDecrease, t.outdent, () => indent(editor, -1))}\n {tool(ListIndentIncrease, t.indent, () => indent(editor, 1))}\n {docx && tool(ListChecks, t.tasks, () => editor.chain().focus().toggleTaskList().run(), state.tasks)}\n {gap}\n <button type=\"button\" aria-label={t.painter} title={paint ? t.painterHint : t.painter} aria-pressed={!!paint} onClick={() => take(false)} onDoubleClick={() => take(true)}><PaintRoller aria-hidden /></button>\n {tool(RemoveFormatting, t.clearFormat, () => clear(editor))}\n {docx && <>{gap}{tool(FilePenLine, t.suggest, suggest, state.suggest)}</>}\n </>;\n const context: ReactNode = can.edit && (state.table ? <>\n {tool(BetweenHorizontalStart, t.rowAbove, () => editor.chain().focus().addRowBefore().run())}\n {tool(BetweenHorizontalEnd, t.rowBelow, () => editor.chain().focus().addRowAfter().run())}\n {tool(BetweenVerticalStart, t.columnLeft, () => editor.chain().focus().addColumnBefore().run())}\n {tool(BetweenVerticalEnd, t.columnRight, () => editor.chain().focus().addColumnAfter().run())}\n {tool(PanelTop, t.headerRow, () => editor.chain().focus().toggleHeaderRow().run())}\n {docx && tool(TableCellsMerge, t.mergeCells, () => editor.chain().focus().mergeOrSplit().run())}\n {docx && <span className=\"w100n-text-anchor\">\n <button type=\"button\" data-pop aria-expanded={pop === 'fill'} aria-label={t.cellFill} title={t.cellFill} onClick={() => pick('fill')}>\n <PaintBucket aria-hidden /><i className=\"w100n-text-bar\" style={{ background: state.fill ?? 'transparent' }} />\n </button>\n {pop === 'fill' && swatches(glows, state.fill, c => editor.chain().focus().setCellAttribute('background', c).run(), t.noColour)}\n </span>}\n {docx && tool(Grid3x3, t.tableBorders, () => editor.chain().focus().updateAttributes('table', { borders: state.bare ? null : 'none' }).run(), !state.bare)}\n {tool(TableRowsSplit, t.deleteRow, () => editor.chain().focus().deleteRow().run())}\n {tool(TableColumnsSplit, t.deleteColumn, () => editor.chain().focus().deleteColumn().run())}\n {tool(Trash2, t.deleteTable, () => editor.chain().focus().deleteTable().run())}\n </> : state.img && <>\n {([[Image, t.wrapInline, 'inline'], [PanelLeft, t.wrapLeft, 'left'], [PanelRight, t.wrapRight, 'right']] as const).map(([icon, label, value]) =>\n <Fragment key={value}>{tool(icon, label, () => editor.chain().focus().updateAttributes('image', { wrap: value === 'inline' ? null : value }).run(), state.img === value)}</Fragment>)}\n </>);\n const status = (can.edit || live) && <span className=\"w100n-text-end\">\n {live && (live.ready ? !live.online : live.late || live.denied) && <span className=\"w100n-text-live\" title={live.denied ? undefined : t.offlineHint}><WifiOff aria-hidden />{live.denied ? t.liveOff : t.offline}</span>}\n {state.suggest && <span className=\"w100n-docs-badge\">{t.suggesting}</span>}\n {can.edit && saving === 'failed' && <button type=\"button\" className=\"w100n-text-saved\" title={`${t.save} (${mod}S)`} onClick={() => void save()}>\n <CloudAlert aria-hidden /><span>{t.saveFailed}</span>\n </button>}\n {live && live.people.length > 0 && <span className=\"w100n-text-people\" role=\"group\" aria-label={t.people}>\n {live.people.map(p => <span key={p.id} className=\"w100n-text-face\" title={p.me ? `${p.name} (${t.you})` : p.name} style={{ '--face': p.color } as CSSProperties}>\n {p.avatarUrl ? <img src={p.avatarUrl} alt=\"\" /> : p.name.split(/\\s+/).map(w => w[0]).join('').slice(0, 2).toUpperCase()}\n </span>)}\n </span>}\n </span>;\n const menubar = <span className=\"w100n-text-menus\" role=\"menubar\" aria-label={t.textTools}>{menus.filter(([, , list]) => list.some(x => x && x !== '-')).map(menu)}</span>;\n const keep = (e: { target: EventTarget; preventDefault: () => void }) => { if ((e.target as HTMLElement).closest('button')) e.preventDefault(); };\n\n const sheet = docx ? { '--page-w': `${page.width}px`, '--page-h': `${page.height}px`, '--mt': `${page.margins[0]}px`, '--mr': `${page.margins[1]}px`, '--mb': `${page.margins[2]}px`, '--ml': `${page.margins[3]}px` } as CSSProperties : undefined;\n return <div ref={root} className=\"w100n-text\" data-kind={kind} data-docs-find onKeyDown={keys}>\n {head ? <>\n {head.menus && createPortal(<div className=\"w100n-text-ribbon w100n-text-docbar\" onKeyDown={rove} onPointerDown={keep}>{menubar}</div>, head.menus)}\n {head.status && status && createPortal(<div className=\"w100n-text-ribbon w100n-text-docbar\" onPointerDown={keep}>{status}</div>, head.status)}\n </> : <div className=\"w100n-text-ribbon w100n-text-top\" onKeyDown={rove} onPointerDown={keep}>{menubar}{status}</div>}\n <div ref={scroller} className=\"w100n-text-scroll\" data-paint={!!paint} onMouseUp={lay} onClick={e => {\n const id = (e.target as HTMLElement).closest('[data-note]')?.getAttribute('data-note');\n if (!id) return;\n setActive(id);\n onPanel?.('comments');\n }}>\n <div className=\"w100n-text-zoomed\" style={{ zoom: percent / 100 }}>\n <div className={docx ? 'w100n-text-sheet' : 'w100n-docs-page w100n-text-column'} style={sheet}>\n <EditorContent editor={editor} />\n </div>\n </div>\n </div>\n <div className=\"w100n-text-ribbon w100n-text-corner\" data-side=\"left\" onPointerDown={keep}>\n <div className=\"w100n-text-tools\" role=\"group\" aria-label={t.zoom}>{tool(Minus, t.zoomOut, () => zoomBy(-10))}{zoomer}{tool(Plus, t.zoomIn, () => zoomBy(10))}</div>\n </div>\n <div className=\"w100n-text-ribbon w100n-text-island\" role=\"toolbar\" aria-label={t.textTools} onKeyDown={rove} onPointerDown={keep}>\n {context && <div className=\"w100n-text-tools\" role=\"group\" aria-label={state.table ? t.table : t.image}>{context}</div>}\n {extra && <div className=\"w100n-text-tools\" role=\"group\" aria-label={t.moreTools}>{extra}</div>}\n <div className=\"w100n-text-tools\" role=\"group\" aria-label={t.textTools}>{main}</div>\n </div>\n <div className=\"w100n-text-ribbon w100n-text-corner\" data-side=\"right\" onPointerDown={keep}>\n <div className=\"w100n-text-tools\" role=\"group\" aria-label={t.findReplace}>\n {can.edit && <>\n {tool(Undo2, t.undo, () => editor.chain().focus().undo().run(), undefined, !state.undo)}\n {tool(Redo2, t.redo, () => editor.chain().focus().redo().run(), undefined, !state.redo)}\n {gap}\n </>}\n {finder}\n </div>\n </div>\n {draft2 && <div className=\"w100n-pdf-back\" onKeyDown={e => { if (e.key === 'Escape') { e.stopPropagation(); setDraft2(null); } }}>\n <form className=\"w100n-pdf-dialog w100n-setup\" role=\"dialog\" aria-modal aria-label={t.pageSetup} onSubmit={e => { e.preventDefault(); applySetup(); }}>\n <div className=\"w100n-new-head\">\n <span className=\"w100n-new-tile\" data-tone=\"blue\"><Ruler aria-hidden /></span>\n <b className=\"w100n-pdf-dialog-title\">{t.pageSetup}</b>\n <button type=\"button\" className=\"w100n-docs-close\" onClick={() => setDraft2(null)} aria-label={t.close} title={t.close}><X aria-hidden /></button>\n </div>\n <p className=\"w100n-docs-caption\">{t.pageSize}</p>\n <div className=\"w100n-docs-chips\" role=\"group\" aria-label={t.pageSize}>{([['A4', a4], ['Letter', letter], ['Legal', legal]] as const).map(([label, size]) => {\n const land = draft2.width > draft2.height;\n const on = Math.abs(Math.min(draft2.width, draft2.height) - size.width) < 2 && Math.abs(Math.max(draft2.width, draft2.height) - size.height) < 2;\n return <button key={label} type=\"button\" aria-pressed={on} onClick={() => setDraft2({ ...draft2, width: land ? size.height : size.width, height: land ? size.width : size.height })}>{label}</button>;\n })}</div>\n <p className=\"w100n-docs-caption\">{t.orientation}</p>\n <div className=\"w100n-docs-chips\" role=\"group\" aria-label={t.orientation}>{([[false, t.portrait], [true, t.landscape]] as const).map(([land, label]) =>\n <button key={label} type=\"button\" aria-pressed={draft2.width > draft2.height === land}\n onClick={() => { if (draft2.width > draft2.height !== land) setDraft2({ ...draft2, width: draft2.height, height: draft2.width }); }}>{label}</button>)}</div>\n <p className=\"w100n-docs-caption\">{t.marginsCm}</p>\n <div className=\"w100n-docs-chips\" role=\"group\" aria-label={t.margins}>{margins.map(([label, values]) =>\n <button key={label} type=\"button\" aria-pressed={values.every((v, n) => Math.abs(cm(v) - draft2.margins[n]) < 0.05)} onClick={() => setDraft2({ ...draft2, margins: values.map(cm) })}>{label}</button>)}</div>\n <div className=\"w100n-setup-grid\">{[t.mTop, t.mRight, t.mBottom, t.mLeft].map((label, n) => <label key={n}><span>{label}</span>\n <input className=\"w100n-docs-field\" type=\"number\" min={0} max={10} step={0.1} value={draft2.margins[n]}\n onChange={e => setDraft2({ ...draft2, margins: draft2.margins.map((v, i) => i === n ? Math.max(0, Math.min(10, Number(e.target.value) || 0)) : v) })} />\n </label>)}</div>\n <label className=\"w100n-setup-line\"><span>{t.headerText}</span><input className=\"w100n-docs-field\" value={draft2.header} onChange={e => setDraft2({ ...draft2, header: e.target.value })} /></label>\n <label className=\"w100n-setup-line\"><span>{t.footerText}</span><input className=\"w100n-docs-field\" value={draft2.footer} onChange={e => setDraft2({ ...draft2, footer: e.target.value })} /></label>\n <label className=\"w100n-setup-check\"><input type=\"checkbox\" checked={draft2.numbers} onChange={e => setDraft2({ ...draft2, numbers: e.target.checked })} />{t.pageNumbers}</label>\n <div className=\"w100n-pdf-dialog-end\">\n <button type=\"button\" className=\"w100n-pdf-link\" onClick={() => setDraft2(null)}>{t.cancel}</button>\n <button type=\"button\" className=\"w100n-docs-action\" onClick={applySetup}><Check aria-hidden />{t.apply}</button>\n </div>\n </form>\n </div>}\n {slot && createPortal(<div className=\"w100n-text-notes\">\n {draft && <div className=\"w100n-text-card w100n-text-draft\">\n <blockquote>{draft.quote}</blockquote>\n <textarea autoFocus value={draft.body} placeholder={t.writeComment} aria-label={t.writeComment} onChange={e => setDraft({ ...draft, body: e.target.value })}\n onKeyDown={e => { if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) void post(); }} />\n <span className=\"w100n-pdf-dialog-end\">\n <button type=\"button\" className=\"w100n-pdf-link\" onClick={drop}>{t.cancel}</button>\n <button type=\"button\" className=\"w100n-docs-action\" disabled={!draft.body.trim() || posting === 'busy'} onClick={() => void post()}><MessageSquarePlus aria-hidden />{t.post}</button>\n </span>\n </div>}\n {suggested.length > 0 && <>\n <p className=\"w100n-docs-caption\"><FilePenLine aria-hidden />{t.suggestions}<span>{suggested.length}</span></p>\n {suggested.map((c, i) => <article key={i} className=\"w100n-text-card w100n-text-change\" data-kind={c.kind} onClick={() => jump(c.from)}>\n <header>\n <span className=\"w100n-text-face\" aria-hidden>{(c.author || '?').slice(0, 1).toUpperCase()}</span>\n <span className=\"w100n-text-who\"><b>{c.author || t.someone}</b>{c.date && <small>{when(c.date)}</small>}</span>\n </header>\n <p>{c.kind === 'insertion' ? t.added : t.removed} <q>{c.text}</q></p>\n {can.edit && <span className=\"w100n-text-actions\" onClick={e => e.stopPropagation()}>\n <button type=\"button\" className=\"w100n-docs-action\" data-tone=\"green\" onClick={() => decide(editor, true, c.id)}><Check aria-hidden />{t.accept}</button>\n <button type=\"button\" className=\"w100n-docs-action\" data-tone=\"red\" onClick={() => decide(editor, false, c.id)}><X aria-hidden />{t.reject}</button>\n </span>}\n </article>)}\n </>}\n {posting === 'failed' && <p className=\"w100n-docs-muted\" role=\"alert\">{t.commentFailed}</p>}\n {failed && <p className=\"w100n-docs-muted\" role=\"alert\">{t.changeFailed}</p>}\n <div className=\"w100n-docs-row\">\n <p className=\"w100n-docs-caption\"><MessagesSquare aria-hidden />{t.comments}<span>{open.length}</span></p>\n <span className=\"w100n-docs-chips\"><button type=\"button\" aria-pressed={resolved} onClick={() => setResolved(!resolved)}>{t.showResolved}</button></span>\n </div>\n {!threads.length && !draft && <p className=\"w100n-docs-muted\">{can.comment ? t.commentHint : t.noComments}</p>}\n {threads.map(c => <article key={c.id} className=\"w100n-text-card\" aria-current={active === c.id} data-resolved={c.resolved} onClick={() => show(c)}>\n {person(c)}\n {c.quote && <blockquote>{c.quote}</blockquote>}\n {words(c)}\n {all.filter(r => r.replyTo === c.id).map(r => <div key={r.id} className=\"w100n-text-reply\">{person(r)}{words(r)}</div>)}\n {reply?.id === c.id && <div className=\"w100n-text-reply\" onClick={e => e.stopPropagation()}>\n <textarea autoFocus value={reply.body} placeholder={t.writeComment} aria-label={t.reply} onChange={e => setReply({ ...reply, body: e.target.value })}\n onKeyDown={e => { if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) void answer(c); }} />\n <span className=\"w100n-pdf-dialog-end\">\n <button type=\"button\" className=\"w100n-pdf-link\" onClick={() => setReply(null)}>{t.cancel}</button>\n <button type=\"button\" className=\"w100n-docs-action\" disabled={!reply.body.trim() || posting === 'busy'} onClick={() => void answer(c)}><Reply aria-hidden />{t.reply}</button>\n </span>\n </div>}\n {can.comment && reply?.id !== c.id && <span className=\"w100n-text-actions\" onClick={e => e.stopPropagation()}>\n {c.resolved && <span className=\"w100n-docs-badge\">{t.resolved}</span>}\n {!c.resolved && <button type=\"button\" className=\"w100n-docs-action\" onClick={() => setReply({ id: c.id, body: '' })}><Reply aria-hidden />{t.reply}</button>}\n {host?.resolveComment && <button type=\"button\" className=\"w100n-docs-action\" data-tone=\"green\" onClick={() => void settle(c)}>\n {c.resolved ? <RotateCcw aria-hidden /> : <Check aria-hidden />}{c.resolved ? t.reopen : t.resolve}\n </button>}\n </span>}\n </article>)}\n </div>, slot)}\n </div>;\n}\n","import { useLayoutEffect, useRef, useState } from 'react';\nimport { collect, type Heading } from './headings';\n\nexport default function DocxView({ bytes, onOutline, failed }: { bytes: ArrayBuffer; onOutline: (headings: Heading[]) => void; failed: string }) {\n const box = useRef<HTMLDivElement>(null);\n const [error, setError] = useState(false);\n useLayoutEffect(() => {\n let live = true;\n let width = 0;\n const root = box.current!;\n const fit = () => {\n const wrapper = root.querySelector<HTMLElement>('.w100n-docx-wrapper');\n if (wrapper && width) wrapper.style.zoom = String(Math.min(1, root.clientWidth / width));\n };\n const watch = new ResizeObserver(fit);\n root.replaceChildren();\n setError(false);\n import('docx-preview')\n .then(({ renderAsync }) => renderAsync(bytes, root, undefined, { inWrapper: true, className: 'w100n-docx', ignoreLastRenderedPageBreak: true, renderAltChunks: false }))\n .then(() => {\n if (!live) return;\n width = Math.max(0, ...[...root.querySelectorAll<HTMLElement>('section.w100n-docx')].map(page => page.offsetWidth));\n fit();\n watch.observe(root);\n onOutline(collect(root, '[class*=\"heading\"]', el => Number(/heading(\\d)/i.exec(el.className)?.[1] ?? 1)));\n })\n .catch(() => { if (live) setError(true); });\n return () => { live = false; watch.disconnect(); };\n }, [bytes, onOutline]);\n return <>{error && <p className=\"w100n-docs-note\">{failed}</p>}<div ref={box} className=\"w100n-docs-docx\" /></>;\n}\n","export type Heading = { id: string; level: number; text: string; go?: () => void };\nexport type Reading = { documentId: string; id: string | null; progress: number };\n\nlet last = 0;\n\nexport function collect(root: HTMLElement, selector: string, level: (el: Element) => number = el => Number(el.tagName.slice(1))): Heading[] {\n return [...root.querySelectorAll(selector)].flatMap(el => {\n const text = el.textContent?.trim() ?? '';\n if (!text) return [];\n if (!el.id) el.id = `w100n-docs-h${++last}`;\n return [{ id: el.id, level: Math.min(3, Math.max(1, level(el) || 1)), text }];\n });\n}\n"],"mappings":"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","names":["Fragment","useRef","useState","Fragment","jsx","jsxs","useRef","useState","found","last","room","open","all","mod","more","keep","file"]}
@@ -31,9 +31,9 @@ function readable(name, mimeType) {
31
31
  const kind = kindOf(name, mimeType);
32
32
  return kind !== "sheet" || /\.(xlsx|csv)$/i.test(name) || /spreadsheetml|text\/csv/.test(mimeType ?? "") ? kind : null;
33
33
  }
34
- function matches(doc, query, kind) {
34
+ function matches(doc, query, picked) {
35
35
  const words = query.toLocaleLowerCase().split(/\s+/).filter(Boolean);
36
- return (kind === "all" || doc.kind === kind) && words.every((word) => doc.name.toLocaleLowerCase().includes(word));
36
+ return (!picked.length || picked.includes(doc.kind)) && words.every((word) => doc.name.toLocaleLowerCase().includes(word));
37
37
  }
38
38
 
39
39
  export {
@@ -42,4 +42,4 @@ export {
42
42
  readable,
43
43
  matches
44
44
  };
45
- //# sourceMappingURL=chunk-L765DZPO.js.map
45
+ //# sourceMappingURL=chunk-2CA3HQTI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/kinds.ts"],"sourcesContent":["import type { DocumentKind } from './types';\n\nconst byExtension: Record<string, DocumentKind> = {\n docx: 'docx', md: 'markdown', markdown: 'markdown', pdf: 'pdf', xlsx: 'sheet', csv: 'sheet', xls: 'sheet', ods: 'sheet', tsv: 'sheet', html: 'slides', htm: 'slides',\n};\n\nconst byMime: Record<string, DocumentKind> = {\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'text/markdown': 'markdown',\n 'application/pdf': 'pdf',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'sheet',\n 'text/csv': 'sheet',\n 'text/html': 'slides',\n};\n\nexport const kinds: DocumentKind[] = ['docx', 'markdown', 'pdf', 'sheet', 'slides'];\n\nexport function kindOf(name: string, mimeType?: string | null): DocumentKind | null {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return byExtension[extension] ?? (mimeType ? byMime[mimeType.split(';')[0].trim().toLowerCase()] : undefined) ?? null;\n}\n\nexport function readable(name: string, mimeType?: string | null): DocumentKind | null {\n const kind = kindOf(name, mimeType);\n return kind !== 'sheet' || /\\.(xlsx|csv)$/i.test(name) || /spreadsheetml|text\\/csv/.test(mimeType ?? '') ? kind : null;\n}\n\nexport function matches(doc: { name: string; kind: DocumentKind }, query: string, kind: DocumentKind | 'all') {\n const words = query.toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n return (kind === 'all' || doc.kind === kind) && words.every(word => doc.name.toLocaleLowerCase().includes(word));\n}\n"],"mappings":";;;AAEA,IAAM,cAA4C;AAAA,EAChD,MAAM;AAAA,EAAQ,IAAI;AAAA,EAAY,UAAU;AAAA,EAAY,KAAK;AAAA,EAAO,MAAM;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,MAAM;AAAA,EAAU,KAAK;AAC9J;AAEA,IAAM,SAAuC;AAAA,EAC3C,2EAA2E;AAAA,EAC3E,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qEAAqE;AAAA,EACrE,YAAY;AAAA,EACZ,aAAa;AACf;AAEO,IAAM,QAAwB,CAAC,QAAQ,YAAY,OAAO,SAAS,QAAQ;AAE3E,SAAS,OAAO,MAAc,UAA+C;AAClF,QAAM,YAAY,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,EAAG,YAAY,IAAI;AAC9E,SAAO,YAAY,SAAS,MAAM,WAAW,OAAO,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,WAAc;AACnH;AAEO,SAAS,SAAS,MAAc,UAA+C;AACpF,QAAM,OAAO,OAAO,MAAM,QAAQ;AAClC,SAAO,SAAS,WAAW,iBAAiB,KAAK,IAAI,KAAK,0BAA0B,KAAK,YAAY,EAAE,IAAI,OAAO;AACpH;AAEO,SAAS,QAAQ,KAA2C,OAAe,MAA4B;AAC5G,QAAM,QAAQ,MAAM,kBAAkB,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACnE,UAAQ,SAAS,SAAS,IAAI,SAAS,SAAS,MAAM,MAAM,UAAQ,IAAI,KAAK,kBAAkB,EAAE,SAAS,IAAI,CAAC;AACjH;","names":[]}
1
+ {"version":3,"sources":["../src/kinds.ts"],"sourcesContent":["import type { DocumentKind } from './types';\n\nconst byExtension: Record<string, DocumentKind> = {\n docx: 'docx', md: 'markdown', markdown: 'markdown', pdf: 'pdf', xlsx: 'sheet', csv: 'sheet', xls: 'sheet', ods: 'sheet', tsv: 'sheet', html: 'slides', htm: 'slides',\n};\n\nconst byMime: Record<string, DocumentKind> = {\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'text/markdown': 'markdown',\n 'application/pdf': 'pdf',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'sheet',\n 'text/csv': 'sheet',\n 'text/html': 'slides',\n};\n\nexport const kinds: DocumentKind[] = ['docx', 'markdown', 'pdf', 'sheet', 'slides'];\n\nexport function kindOf(name: string, mimeType?: string | null): DocumentKind | null {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return byExtension[extension] ?? (mimeType ? byMime[mimeType.split(';')[0].trim().toLowerCase()] : undefined) ?? null;\n}\n\nexport function readable(name: string, mimeType?: string | null): DocumentKind | null {\n const kind = kindOf(name, mimeType);\n return kind !== 'sheet' || /\\.(xlsx|csv)$/i.test(name) || /spreadsheetml|text\\/csv/.test(mimeType ?? '') ? kind : null;\n}\n\nexport function matches(doc: { name: string; kind: DocumentKind }, query: string, picked: DocumentKind[]) {\n const words = query.toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n return (!picked.length || picked.includes(doc.kind)) && words.every(word => doc.name.toLocaleLowerCase().includes(word));\n}\n"],"mappings":";;;AAEA,IAAM,cAA4C;AAAA,EAChD,MAAM;AAAA,EAAQ,IAAI;AAAA,EAAY,UAAU;AAAA,EAAY,KAAK;AAAA,EAAO,MAAM;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,MAAM;AAAA,EAAU,KAAK;AAC9J;AAEA,IAAM,SAAuC;AAAA,EAC3C,2EAA2E;AAAA,EAC3E,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qEAAqE;AAAA,EACrE,YAAY;AAAA,EACZ,aAAa;AACf;AAEO,IAAM,QAAwB,CAAC,QAAQ,YAAY,OAAO,SAAS,QAAQ;AAE3E,SAAS,OAAO,MAAc,UAA+C;AAClF,QAAM,YAAY,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,EAAG,YAAY,IAAI;AAC9E,SAAO,YAAY,SAAS,MAAM,WAAW,OAAO,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,WAAc;AACnH;AAEO,SAAS,SAAS,MAAc,UAA+C;AACpF,QAAM,OAAO,OAAO,MAAM,QAAQ;AAClC,SAAO,SAAS,WAAW,iBAAiB,KAAK,IAAI,KAAK,0BAA0B,KAAK,YAAY,EAAE,IAAI,OAAO;AACpH;AAEO,SAAS,QAAQ,KAA2C,OAAe,QAAwB;AACxG,QAAM,QAAQ,MAAM,kBAAkB,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACnE,UAAQ,CAAC,OAAO,UAAU,OAAO,SAAS,IAAI,IAAI,MAAM,MAAM,MAAM,UAAQ,IAAI,KAAK,kBAAkB,EAAE,SAAS,IAAI,CAAC;AACzH;","names":[]}