@p10node/office-engine 0.0.0-stage → 0.1.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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -2
  3. package/dist/DocViewer-Cv4LaMB_.js +9342 -0
  4. package/dist/DocViewer-Cv4LaMB_.js.map +1 -0
  5. package/dist/THIRD_PARTY_LICENSES.txt +79 -0
  6. package/dist/assets/worker-CJfZ05I7.js.map +1 -0
  7. package/dist/collab-BzN1ZI-z.js +1984 -0
  8. package/dist/collab-BzN1ZI-z.js.map +1 -0
  9. package/dist/collab.js +2 -0
  10. package/dist/core.js +2 -0
  11. package/dist/default-worker-B5CGBnic.js +9193 -0
  12. package/dist/default-worker-B5CGBnic.js.map +1 -0
  13. package/dist/embed.js +83 -0
  14. package/dist/embed.js.map +1 -0
  15. package/dist/index.js +5 -0
  16. package/dist/office-engine.embed.js +33 -0
  17. package/dist/office-engine.worker.js +9092 -0
  18. package/dist/types/collab/codec.d.ts +3 -0
  19. package/dist/types/collab/docx.d.ts +166 -0
  20. package/dist/types/collab/hosts.d.ts +24 -0
  21. package/dist/types/collab/hub.d.ts +41 -0
  22. package/dist/types/collab/index.d.ts +43 -0
  23. package/dist/types/collab/pptx-ops.d.ts +60 -0
  24. package/dist/types/collab/pptx-worker.d.ts +35 -0
  25. package/dist/types/collab/pptx.d.ts +47 -0
  26. package/dist/types/collab/protocol.d.ts +76 -0
  27. package/dist/types/collab/react.d.ts +23 -0
  28. package/dist/types/collab/session.d.ts +115 -0
  29. package/dist/types/collab/transport.d.ts +47 -0
  30. package/dist/types/collab/xlsx-ops.d.ts +72 -0
  31. package/dist/types/collab/xlsx-worker.d.ts +29 -0
  32. package/dist/types/collab/xlsx.d.ts +51 -0
  33. package/dist/types/core/color.d.ts +25 -0
  34. package/dist/types/core/default-worker.d.ts +1 -0
  35. package/dist/types/core/docx/numbering.d.ts +33 -0
  36. package/dist/types/core/docx/parser.d.ts +126 -0
  37. package/dist/types/core/docx/spec.d.ts +4 -0
  38. package/dist/types/core/docx/styles.d.ts +63 -0
  39. package/dist/types/core/docx/types.d.ts +325 -0
  40. package/dist/types/core/docx/writer.d.ts +35 -0
  41. package/dist/types/core/fonts.d.ts +1 -0
  42. package/dist/types/core/index.d.ts +15 -0
  43. package/dist/types/core/opc.d.ts +56 -0
  44. package/dist/types/core/pptx/edit.d.ts +10 -0
  45. package/dist/types/core/pptx/parser.d.ts +52 -0
  46. package/dist/types/core/pptx/types.d.ts +238 -0
  47. package/dist/types/core/raw.d.ts +40 -0
  48. package/dist/types/core/source.d.ts +65 -0
  49. package/dist/types/core/theme.d.ts +11 -0
  50. package/dist/types/core/units.d.ts +7 -0
  51. package/dist/types/core/worker/client.d.ts +48 -0
  52. package/dist/types/core/worker/engine.d.ts +27 -0
  53. package/dist/types/core/worker/protocol.d.ts +112 -0
  54. package/dist/types/core/worker/worker.d.ts +1 -0
  55. package/dist/types/core/xlsx/calc.d.ts +31 -0
  56. package/dist/types/core/xlsx/editor.d.ts +95 -0
  57. package/dist/types/core/xlsx/formula/assist.d.ts +35 -0
  58. package/dist/types/core/xlsx/formula/catalog.d.ts +14 -0
  59. package/dist/types/core/xlsx/formula/dates.d.ts +23 -0
  60. package/dist/types/core/xlsx/formula/evaluate.d.ts +33 -0
  61. package/dist/types/core/xlsx/formula/fn-date.d.ts +2 -0
  62. package/dist/types/core/xlsx/formula/fn-logic.d.ts +3 -0
  63. package/dist/types/core/xlsx/formula/fn-lookup.d.ts +3 -0
  64. package/dist/types/core/xlsx/formula/fn-math.d.ts +3 -0
  65. package/dist/types/core/xlsx/formula/fn-stats.d.ts +3 -0
  66. package/dist/types/core/xlsx/formula/fn-text.d.ts +3 -0
  67. package/dist/types/core/xlsx/formula/fn.d.ts +64 -0
  68. package/dist/types/core/xlsx/formula/format.d.ts +5 -0
  69. package/dist/types/core/xlsx/formula/functions.d.ts +4 -0
  70. package/dist/types/core/xlsx/formula/index.d.ts +17 -0
  71. package/dist/types/core/xlsx/formula/lexer.d.ts +54 -0
  72. package/dist/types/core/xlsx/formula/parser.d.ts +53 -0
  73. package/dist/types/core/xlsx/formula/refs.d.ts +23 -0
  74. package/dist/types/core/xlsx/formula/transform.d.ts +21 -0
  75. package/dist/types/core/xlsx/formula/types.d.ts +59 -0
  76. package/dist/types/core/xlsx/formula/values.d.ts +49 -0
  77. package/dist/types/core/xlsx/numfmt.d.ts +11 -0
  78. package/dist/types/core/xlsx/structure.d.ts +31 -0
  79. package/dist/types/core/xlsx/styles.d.ts +17 -0
  80. package/dist/types/core/xlsx/types.d.ts +193 -0
  81. package/dist/types/core/xlsx/workbook.d.ts +94 -0
  82. package/dist/types/core/xml.d.ts +80 -0
  83. package/dist/types/core/zip.d.ts +35 -0
  84. package/dist/types/core/zipwrite.d.ts +9 -0
  85. package/dist/types/embed.d.ts +30 -0
  86. package/dist/types/index.d.ts +18 -0
  87. package/dist/types/react/DocViewer.d.ts +43 -0
  88. package/dist/types/react/common/ContextMenu.d.ts +21 -0
  89. package/dist/types/react/common/Dialog.d.ts +27 -0
  90. package/dist/types/react/common/Slots.d.ts +18 -0
  91. package/dist/types/react/common/Status.d.ts +6 -0
  92. package/dist/types/react/common/ZoomControl.d.ts +6 -0
  93. package/dist/types/react/common/hooks.d.ts +20 -0
  94. package/dist/types/react/docx/DocxEditor.d.ts +172 -0
  95. package/dist/types/react/docx/DocxToolbar.d.ts +18 -0
  96. package/dist/types/react/docx/DocxView.d.ts +8 -0
  97. package/dist/types/react/docx/FindBar.d.ts +22 -0
  98. package/dist/types/react/docx/html.d.ts +8 -0
  99. package/dist/types/react/docx/render.d.ts +24 -0
  100. package/dist/types/react/docx/tables.d.ts +20 -0
  101. package/dist/types/react/edit/Toolbar.d.ts +130 -0
  102. package/dist/types/react/edit/input.d.ts +81 -0
  103. package/dist/types/react/edit/rich.d.ts +40 -0
  104. package/dist/types/react/injectStyles.d.ts +4 -0
  105. package/dist/types/react/pptx/PptxEditor.d.ts +95 -0
  106. package/dist/types/react/pptx/PptxToolbar.d.ts +36 -0
  107. package/dist/types/react/pptx/PptxView.d.ts +24 -0
  108. package/dist/types/react/pptx/Presenter.d.ts +9 -0
  109. package/dist/types/react/pptx/Slide.d.ts +28 -0
  110. package/dist/types/react/pptx/geometry.d.ts +5 -0
  111. package/dist/types/react/useDocument.d.ts +11 -0
  112. package/dist/types/react/xlsx/XlsxToolbar.d.ts +27 -0
  113. package/dist/types/react/xlsx/XlsxView.d.ts +16 -0
  114. package/dist/types/react/xlsx/axis.d.ts +19 -0
  115. package/dist/xlsx-ops-CsjNpMI0.js +244 -0
  116. package/dist/xlsx-ops-CsjNpMI0.js.map +1 -0
  117. package/package.json +80 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocViewer-Cv4LaMB_.js","names":["_Fragment","SIZES","BLOCK","styleOf","HIGHLIGHTS","_Fragment","TableView","GAP","PAD","HANDLES","css","VALIGN","_Fragment","_Fragment","colName","_Fragment","cssFont","DEFAULT_PAGE","isWebImage","tokenize","colName","MAX_ROW","MAX_COL","colName$1","quoteSheet","DocumentClient","getPeers","subscribePeers","splitRuns","registerHost","normalize","runsText","RichInput","opInsert","opInsertRuns","formatRange","collapsed","domFromPos","posFromDom","ordered","startCollab","getSel","plen","publishLocal","shiftPa","runAt","Fragment$1","scan","src","e","FormulaSyntaxError","pos","head","isFormula","text","POINT_BEFORE","POINT_AFTER","formulaContext","out","q","caret","t","toks","lost","tail","stack","prev","inside","next","i","wordTok","typed","callTok","okBefore","okAfter","rangeText","pre","sheet","r0","r1","c0","c1","a","closeFormula","openString","depth","at","bang","RAW","cache","functionCatalog","sig","desc","name","parts","variadic","functionInfo","up","f","suggestFunctions","prefix","limit","argSlot","arg","pairs","start","useIsoLayoutEffect","useEffect","useLayoutEffect","useForceUpdate","n","bump","useReducer","x","useSize","ref","useRef","size","setSize","useState","el","update","w","h","s","ro","useScroll","setPos","raf","on","useMediaUrl","url","setUrl","path","enabled","live","client","u","lowerIndex","lo","hi","arr","ans","mid","v","BORDER_GRID","P","Icon","keep","PopBox","dx","setDx","r","vw","props","useDismiss","cb","close","open","Btn","Sep","Dropdown","setOpen","setHi","shift","setShift","listRef","check","sel","options","o","current","pick","show","step","from","k","d","label","Fragment","Select","SizeBox","sizes","SIZES$1","setText","inputRef","base","set","done","title","cur","flatten","Children","children","isValidElement","c","signature","p","ToolbarRow","items","rowRef","widths","fit","setFit","more","setMore","moreRef","measured","cut","layout","ws","total","b","room","used","avail","cs","relayout","isSep","end","rest","all","m","PALETTE","ColorBtn","FONTS","fontOptions","list","fontName","css","download","blob","Menu","Pop","GridPicker","hover","setHover","onPick","pickFiles","input","accept","multiple","resolve","ViewerContext","createContext","useViewer","useContext","EditorBar","bar","createPortal","StatusContext","Status","onStatus","STEPS","ZoomControl","effective","dir","onChange","zoom","ContextMenu","y","onClose","vh","down","key","away","it","MOD","PromptDialog","setV","spec","Toast","id","onDone","inlineSpec","paraSpec","p0","BLOCK$1","SKIP","hex","color","sizePt","styleOf$1","st","deco","bg","pt","toRun","htmlToParas","doc","html","para","walk","child","node","nextList","first","last","gridOf","occ","cells","g","ri","cell","blankCell","tpl","mk","scaleCols","sum","cols","insertRow","target","below","rows","newCells","nCols","above","row","deleteRow","insertCol","right","g0","rowCells","crossing","before","deleteCol","remove","ci","newTable","border","width","colsN","rowsN","pa","moveSel","to","mv","DocxEditor","changed","pb","addr","left","atEnd","count","bi","blocks","nt","j","pas","opts","lastB","lastN","now","selBefore","near","pid","pids","specs","idx","still","anchor","structural","want","sent","op","res","pi","old","touched","locs","paras","l","loc","empty","pasAfter","pasNow","pd","patch","optimistic","kind","nr","nc","method","nextKeys","beforeKeys","anchorP","added","removed","beforeObj","history","after","nextBlock","runs","files","ext","dims","imageSize","scale","href","lk","style","fn","b2","data","links","lines","headingId","img","nw","nh","alt","file","run","rs","HIGHLIGHTS$1","LINE_SPACING","CANON","SYMBOLS","stylePreview","DocxToolbar","setSt","editor","font","dis","sz","line","styleOpts","styles","hint","look","styleValue","image","FindBar","rep","setRep","showRep","setShowRep","UNDERLINE_STYLE","runCss","lineHeight","ps","contextual","paraCss","sp","Img","ctx","InlineView","obj","span","BlockView","ParaView","hang","visible","editable","TableView$1","memo","block","nested","PX","GAP$1","PAD$1","paginate","pages","heights","started","findObj","root","HANDLES$1","outlineOf","titleId","lvl","DocxView","viewer","version","meta","setMeta","setDone","setZoom","initialZoom","scrollRef","scroll","pagesRef","useMemo","isEditing","find","setFind","ctxMenu","setCtxMenu","prompt","setPrompt","toast","setToast","outline","setOutline","painter","setPainter","setImg","imgBox","setImgBox","resizing","resizeRatio","offs","page","contentW","availPx","batch","setBatch","measureRef","widthKey","lastKey","queue","tailEnd","renderStart","measureCtx","hs","dt","pageW","pageH","z","complete","pageHeights","tops","acc","skeleton","totalH","totalW","pageCount","caretBi","caretPage","words","setWords","status","mod","askLink","ds","range","sc","box","matches","gotoMatch","rect","H","reg","curR","replaceMatch","docStyle","askAlt","paste","plain","pic","copyCut","cmd","pickImage","imgEl","imageActions","startResize","w0","h0","x0","y0","ptPerPx","sx","sy","move","ev","dy","maxW","ctxItems","ranged","headings","topBlock","activeHeading","gotoBlock","PageView","index","editing","hfCtx","header","footer","slice","height","styles_default","ID","injectStyles","host","styleOf","toEdit","bulletOf","lvlOf","toTPara","bullet","num","PptxEditor","slide","sid","body","counters","i0","HIGHLIGHTS","SHAPES","LINE_W","DASHES","SPACING","VALIGN$1","PptxToolbar","Presenter","order","setVw","resize","exitFs","go","SlideSlot","poly","pts","adj","def","ellipse","rx","ry","roundRect","regular","rot","star","inner","LINE_GEOMS","geomPath","ss","geom","hl","tx","ty","boxStyle","useFillCss","fill","runStyle","TextView","flow","edit","nodes","Marker","ShapeView","useId","isLine","fillCss","flipped","flip","isRect","solid","PicView","top","sw","sh","strokeCss","CellView","TableView","ElView","SlideView","model","overlay","caches","cacheFor","putSlide","resetSlides","useSlide","setModel","hit","HANDLES","boxOf","els","x1","y1","resized","mode","Selection","onHandle","PAD","GAP","PptxView","rootRef","rootSize","thumbRef","thumbScroll","showThumbs","thumbnails","caretAt","textRoot","selected","setSelected","drag","setDrag","slidesVer","setSlidesVer","presenting","setPresenting","undoDepth","setUndoDepth","fitW","fitH","slideH","slideW","pitch","tScale","tH","tPitch","tFirst","tLast","stopEditing","stopRef","off","modelOf","beginText","onSlideMouseDown","topEl","sidEl","runShapes","ops","selectNew","err","moved","insert","rid","slideAction","goTo","undoShapes","redo","slideCmd","elOf","selRef","shapeCmd","shapeMenu","slideMenu","onShapeKey","nudge","onKeyDown","selOverlay","slots","thumbs","fromStart","useDocument","state","setState","headersKey","worker","credentials","FORMATS","SIZES","BORDERS","BORDER_STYLES","HALIGN","VALIGN","ROTATE","FUNCS","decimals","fmt","XlsxToolbar","bColor","setBColor","bStyle","setBStyle","align","valign","known","formats","Axis","max","min","px","BLOCK","HH","MAX_SCROLL_PX","SheetState","XlsxStore","cached","rowsAt","firstKey","stores","storeFor","XlsxView","active","setActive","initialSheet","store","renaming","setRenaming","tabMenu","setTabMenu","bookOp","setEdit","hold","keepEditing","canPoint","SheetGrid","alertError","fontPx","fitNumber","cw","rotated","JUSTIFY","fc","REF_COLORS","refKey","ARROWS","rectOf","setSelState","detailState","setDetail","detail","detailTick","setDetailTick","dragging","editRef","hlRef","fxRef","sugIdx","setSugIdx","setCtx","afterDrag","findOpts","setFindOpts","setMatches","setResizing","HW","viewW","viewH","rowAxis","frozen","colAxis","frozenW","frozenH","spacerW","spacerH","maxLogicalY","maxScrollY","scrollY","scrollX","mainOx","mainOy","mainW","mainH","visMerges","ar","ac","basePx","mergeAt","peers","useSyncExternalStore","sheetPath","peerSels","setSel","region","rr1","rr0","cc1","cc0","oy","ox","covered","anchors","cellEl","raw","si","wOverride","ch","hOverride","textRotate","justify","textAlign","ov","whiteSpace","merged","filled","alignItems","overflow","findBoxes","refBoxes","colHeaders","rowHeaders","rh","fr","fw","fh","cellBox","scrollIntoView","cellAt","clientX","clientY","lx","ly","focusGrid","shown","startEdit","begin","initialText","value","initial","commit","backTo","moveBy","cancel","onSheet","own","inCell","fctx","pointOk","pointActive","refSpans","colors","word","sugg","sugKey","inputEl","readCaret","onInput","pointAt","s0","e0","pointDrag","movePoint","baseR","baseC","clampR","clampC","extend","dr","dc","noArgs","ins","clearRange","R","activeCss","fmtAt","toggle","undo","tsv","vals","sheetOp","pageRows","moves","onMouseDown","grip","col","axis","pointRange","xf","m0","toggleMerge","merge","freeze","autoFn","sortBy","rowsOp","pasteText","single","onMouseMove","fx","editKeys","arrow","len","assist","slot","edStyle","hlParts","assistPos","transportIds","nextTransportId","optsKey","useCollab","optsRef","sync","initials","LABEL","CollabBar","pending","setPending","PeerOverlay","marks","setMarks","layer","measure","rel","place","collab","schedule","offChange","pr","frame","EXT","fmtBytes","DocViewer","setEditing","dirty","setDirtyState","saving","setSaving","barEl","setBarEl","styleTarget","canEdit","statusEl","setStatusEl","onLoad","error","onError","setDirty","useCallback","onDirtyChange","fileName","save","onSave","api","pct","progress","busy","loading","className","toolbar","toolbarExtra","allowEdit"],"sources":["../src/core/xlsx/formula/assist.ts","../src/core/xlsx/formula/catalog.ts","../src/react/common/hooks.ts","../src/react/edit/Toolbar.tsx","../src/react/common/Slots.tsx","../src/react/common/Status.tsx","../src/react/common/ZoomControl.tsx","../src/react/common/ContextMenu.tsx","../src/react/common/Dialog.tsx","../src/core/docx/spec.ts","../src/react/docx/html.ts","../src/react/docx/tables.ts","../src/react/docx/DocxEditor.ts","../src/react/docx/DocxToolbar.tsx","../src/react/docx/FindBar.tsx","../src/react/docx/render.tsx","../src/react/docx/DocxView.tsx","../src/react/styles.css?inline","../src/react/injectStyles.ts","../src/react/pptx/PptxEditor.ts","../src/react/pptx/PptxToolbar.tsx","../src/react/pptx/Presenter.tsx","../src/react/pptx/geometry.ts","../src/react/pptx/Slide.tsx","../src/react/pptx/PptxView.tsx","../src/react/useDocument.ts","../src/react/xlsx/XlsxToolbar.tsx","../src/react/xlsx/axis.ts","../src/react/xlsx/XlsxView.tsx","../src/collab/react.tsx","../src/react/DocViewer.tsx"],"sourcesContent":["/**\n * Editing helpers for a formula being typed (text starting with '='): tolerant tokenizing,\n * caret context (word to autocomplete, enclosing call, whether a reference can be pointed in),\n * reference spans for highlighting and paren auto-closing. Pure / UI independent.\n */\nimport { FormulaSyntaxError, tokenize, type Token } from './lexer'\nimport { colName, quoteSheet, type RefAddr } from './refs'\nimport { MAX_COL, MAX_ROW } from './types'\n\nexport interface FormulaRef {\n /** span in the full text (including the leading '=') */\n s: number\n e: number\n text: string\n ref: RefAddr\n}\n\nexport interface FormulaContext {\n /** identifier right before the caret (to autocomplete); span in the full text */\n word?: { s: number; e: number; text: string; call: boolean }\n /** innermost function call around the caret; arg is 0-based */\n call?: { name: string; arg: number }\n /** a reference can be inserted at the caret */\n pointable: boolean\n refs: FormulaRef[]\n}\n\ninterface Scan {\n toks: Token[]\n /** offset (in src) where tokenizing failed, the rest is unknown */\n tail: number\n /** the failure was an unterminated string */\n openString: boolean\n}\n\nfunction scan(src: string): Scan {\n try {\n return { toks: tokenize(src), tail: src.length, openString: false }\n } catch (e) {\n if (!(e instanceof FormulaSyntaxError)) return { toks: [], tail: 0, openString: false }\n const pos = Math.max(0, Math.min(e.pos, src.length))\n const head = pos > 0 ? scan(src.slice(0, pos)) : { toks: [], tail: 0, openString: false }\n if (head.tail < pos) return head\n return { toks: head.toks, tail: pos, openString: e.message === 'unterminated string' }\n }\n}\n\nexport const isFormula = (text: string) => text.startsWith('=') && text.length > 0\n\nconst POINT_BEFORE = new Set(['(', ',', ';', '{'])\nconst POINT_AFTER = new Set([')', ',', ';', '}'])\n\n/** Context of the caret inside formula `text` (full cell text, starting with '='). */\nexport function formulaContext(text: string, caret: number): FormulaContext {\n const out: FormulaContext = { pointable: false, refs: [] }\n if (!isFormula(text)) return out\n const src = text.slice(1)\n const q = caret - 1\n const { toks, tail } = scan(src)\n for (const t of toks) if (t.t === 'ref') out.refs.push({ s: t.s + 1, e: t.e + 1, text: src.slice(t.s, t.e), ref: t.ref })\n if (q < 0) return out\n /** caret inside an unterminated string / unparseable tail */\n const lost = q > tail\n\n // enclosing calls\n const stack: { name: string; arg: number }[] = []\n let prev: Token | undefined\n let inside: Token | undefined\n let next: Token | undefined\n for (let i = 0; i < toks.length; i++) {\n const t = toks[i]\n if (t.e <= q) {\n if (t.t === 'punc') {\n if (t.v === '(') stack.push({ name: toks[i - 1]?.t === 'func' && toks[i - 1].e === t.s ? (toks[i - 1] as { v: string }).v : '', arg: 0 })\n else if (t.v === '{') stack.push({ name: '', arg: 0 })\n else if (t.v === ')' || t.v === '}') stack.pop()\n else if ((t.v === ',' || t.v === ';') && stack.length) stack[stack.length - 1].arg++\n }\n if (t.t !== 'ws') prev = t\n } else if (t.s < q) inside = t\n else if (!next && t.t !== 'ws') next = t\n }\n for (let i = stack.length - 1; i >= 0; i--)\n if (stack[i].name) {\n out.call = stack[i]\n break\n }\n if (lost) return out\n\n // word to autocomplete: identifier ending at the caret\n const wordTok = inside ?? (prev && prev.e === q ? prev : undefined)\n if (wordTok && (wordTok.t === 'name' || wordTok.t === 'func' || wordTok.t === 'ref' || wordTok.t === 'bool')) {\n const typed = src.slice(wordTok.s, q)\n const sheetPrefixed = (wordTok.t === 'ref' && wordTok.ref.sheet !== undefined) || (wordTok.t === 'name' && wordTok.sheet !== undefined)\n if (!sheetPrefixed && /^[A-Za-z_][A-Za-z0-9_.]*$/.test(typed)) {\n const callTok = wordTok.t === 'func' || src[wordTok.e] === '('\n out.word = { s: wordTok.s + 1, e: wordTok.e + 1, text: typed, call: callTok }\n }\n }\n\n // point mode: caret between tokens, after an operator / separator, before an end\n if (!inside) {\n const okBefore = !prev || (prev.t === 'punc' && POINT_BEFORE.has(prev.v)) || (prev.t === 'op' && prev.v !== '%')\n const okAfter = !next || (next.t === 'punc' && POINT_AFTER.has(next.v)) || (next.t === 'op' && next.v !== ':')\n out.pointable = okBefore && okAfter\n }\n return out\n}\n\n/** Reference text for a selected block (`A1`, `A1:B3`, `A:A`, `1:1`), sheet-qualified when `sheet` is given. */\nexport function rangeText(r0: number, c0: number, r1: number, c1: number, sheet?: string): string {\n const pre = sheet !== undefined ? quoteSheet(sheet) + '!' : ''\n if (r0 > r1) [r0, r1] = [r1, r0]\n if (c0 > c1) [c0, c1] = [c1, c0]\n if (r0 === 0 && r1 >= MAX_ROW) return `${pre}${colName(c0)}:${colName(c1)}`\n if (c0 === 0 && c1 >= MAX_COL) return `${pre}${r0 + 1}:${r1 + 1}`\n const a = `${colName(c0)}${r0 + 1}`\n return r0 === r1 && c0 === c1 ? pre + a : `${pre}${a}:${colName(c1)}${r1 + 1}`\n}\n\n/**\n * What Excel does on Enter: upper-cases function names, references and booleans,\n * closes an unterminated string and open parentheses.\n */\nexport function closeFormula(text: string): string {\n if (!isFormula(text)) return text\n const src = text.slice(1)\n const { toks, tail, openString } = scan(src)\n if (tail < src.length && !openString) return text\n let depth = 0\n let out = ''\n let at = 0\n for (const t of toks) {\n if (t.t === 'func' || t.t === 'bool' || (t.t === 'ref' && t.ref.sheet === undefined)) {\n out += src.slice(at, t.s) + src.slice(t.s, t.e).toUpperCase()\n at = t.e\n } else if (t.t === 'ref') {\n const bang = src.lastIndexOf('!', t.e)\n out += src.slice(at, bang + 1) + src.slice(bang + 1, t.e).toUpperCase()\n at = t.e\n }\n if (t.t !== 'punc') continue\n if (t.v === '(') depth++\n else if (t.v === ')') depth = Math.max(0, depth - 1)\n }\n out += src.slice(at)\n return '=' + out + (openString ? '\"' : '') + ')'.repeat(depth)\n}\n","/**\n * Function catalog for the formula editor (autocomplete + argument hints).\n * Kept separate from the implementations so the UI bundle stays small.\n * Format: `NAME: 'arg1, [arg2], ...|Description'`.\n */\nconst RAW: Record<string, string> = {\n ABS: 'number|Absolute value of a number.',\n AND: 'logical1, [logical2], ...|TRUE if all arguments are TRUE.',\n AVERAGE: 'number1, [number2], ...|Arithmetic mean of the arguments.',\n AVERAGEIF: 'range, criteria, [average_range]|Average of cells that meet a condition.',\n AVERAGEIFS: 'average_range, criteria_range1, criteria1, ...|Average of cells that meet multiple conditions.',\n CEILING: 'number, significance|Rounds a number up to the nearest multiple of significance.',\n 'CEILING.MATH': 'number, [significance], [mode]|Rounds a number up to the nearest integer or multiple.',\n CHAR: 'number|Character for a character code.',\n CHOOSE: 'index_num, value1, [value2], ...|Picks a value from the list by position.',\n CODE: 'text|Numeric code of the first character.',\n COLUMN: '[reference]|Column number of a reference.',\n COLUMNS: 'array|Number of columns in a reference.',\n CONCAT: 'text1, [text2], ...|Joins several text items into one.',\n CONCATENATE: 'text1, [text2], ...|Joins several text items into one.',\n COUNT: 'value1, [value2], ...|Counts cells that contain numbers.',\n COUNTA: 'value1, [value2], ...|Counts cells that are not empty.',\n COUNTBLANK: 'range|Counts empty cells in a range.',\n COUNTIF: 'range, criteria|Counts cells that meet a condition.',\n COUNTIFS: 'criteria_range1, criteria1, ...|Counts cells that meet multiple conditions.',\n DATE: 'year, month, day|Date serial number from year, month and day.',\n DATEDIF: 'start_date, end_date, unit|Difference between two dates in days, months or years.',\n DAY: 'serial_number|Day of the month (1-31).',\n DAYS: 'end_date, start_date|Number of days between two dates.',\n EDATE: 'start_date, months|Date that is a number of months before or after a date.',\n EOMONTH: 'start_date, months|Last day of the month, months before or after a date.',\n 'ERROR.TYPE': 'error_val|Number that corresponds to an error type.',\n EVEN: 'number|Rounds up to the nearest even integer.',\n EXACT: 'text1, text2|TRUE if two texts are exactly the same.',\n EXP: 'number|e raised to the power of a number.',\n FACT: 'number|Factorial of a number.',\n FALSE: '|The logical value FALSE.',\n FIND: 'find_text, within_text, [start_num]|Position of a text inside another (case-sensitive).',\n FLOOR: 'number, significance|Rounds a number down to the nearest multiple of significance.',\n 'FLOOR.MATH': 'number, [significance], [mode]|Rounds a number down to the nearest integer or multiple.',\n GCD: 'number1, [number2], ...|Greatest common divisor.',\n HLOOKUP: 'lookup_value, table_array, row_index_num, [range_lookup]|Looks up a value in the top row and returns a value from the same column.',\n HOUR: 'serial_number|Hour of a time value (0-23).',\n IF: 'logical_test, [value_if_true], [value_if_false]|Returns one value if a condition is TRUE and another if FALSE.',\n IFERROR: 'value, value_if_error|Returns value_if_error if the expression is an error.',\n IFNA: 'value, value_if_na|Returns value_if_na if the expression is #N/A.',\n IFS: 'logical_test1, value_if_true1, ...|Returns the value of the first TRUE condition.',\n INDEX: 'array, row_num, [column_num]|Value at a given row and column of a range.',\n INDIRECT: 'ref_text, [a1]|Reference given by a text string.',\n INT: 'number|Rounds down to the nearest integer.',\n ISBLANK: 'value|TRUE if the value is empty.',\n ISERR: 'value|TRUE if the value is an error other than #N/A.',\n ISERROR: 'value|TRUE if the value is any error.',\n ISEVEN: 'number|TRUE if the number is even.',\n ISLOGICAL: 'value|TRUE if the value is a logical value.',\n ISNA: 'value|TRUE if the value is #N/A.',\n ISNONTEXT: 'value|TRUE if the value is not text.',\n ISNUMBER: 'value|TRUE if the value is a number.',\n ISODD: 'number|TRUE if the number is odd.',\n ISTEXT: 'value|TRUE if the value is text.',\n LARGE: 'array, k|k-th largest value in a data set.',\n LCM: 'number1, [number2], ...|Least common multiple.',\n LEFT: 'text, [num_chars]|First characters of a text.',\n LEN: 'text|Number of characters in a text.',\n LN: 'number|Natural logarithm.',\n LOG: 'number, [base]|Logarithm to a given base (default 10).',\n LOG10: 'number|Base-10 logarithm.',\n LOOKUP: 'lookup_value, lookup_vector, [result_vector]|Looks up a value in a one-row or one-column range.',\n LOWER: 'text|Converts text to lowercase.',\n MATCH: 'lookup_value, lookup_array, [match_type]|Relative position of a value in a range.',\n MAX: 'number1, [number2], ...|Largest value.',\n MAXIFS: 'max_range, criteria_range1, criteria1, ...|Largest value among cells that meet conditions.',\n MEDIAN: 'number1, [number2], ...|Median of the numbers.',\n MID: 'text, start_num, num_chars|Characters from the middle of a text.',\n MIN: 'number1, [number2], ...|Smallest value.',\n MINIFS: 'min_range, criteria_range1, criteria1, ...|Smallest value among cells that meet conditions.',\n MINUTE: 'serial_number|Minute of a time value (0-59).',\n MOD: 'number, divisor|Remainder after division.',\n MODE: 'number1, [number2], ...|Most frequent value.',\n 'MODE.SNGL': 'number1, [number2], ...|Most frequent value.',\n MONTH: 'serial_number|Month of a date (1-12).',\n N: 'value|Value converted to a number.',\n NA: '|The error value #N/A.',\n NETWORKDAYS: 'start_date, end_date, [holidays]|Number of working days between two dates.',\n NOT: 'logical|Reverses a logical value.',\n NOW: '|Current date and time.',\n ODD: 'number|Rounds up to the nearest odd integer.',\n OFFSET: 'reference, rows, cols, [height], [width]|Reference offset from a starting reference.',\n OR: 'logical1, [logical2], ...|TRUE if any argument is TRUE.',\n PI: '|The value of pi.',\n POWER: 'number, power|A number raised to a power.',\n PRODUCT: 'number1, [number2], ...|Multiplies all the arguments.',\n PROPER: 'text|Capitalizes the first letter of each word.',\n RAND: '|Random number between 0 and 1.',\n RANDBETWEEN: 'bottom, top|Random integer between two numbers.',\n RANK: 'number, ref, [order]|Rank of a number in a list.',\n 'RANK.EQ': 'number, ref, [order]|Rank of a number in a list.',\n REPLACE: 'old_text, start_num, num_chars, new_text|Replaces part of a text by position.',\n REPT: 'text, number_times|Repeats a text a number of times.',\n RIGHT: 'text, [num_chars]|Last characters of a text.',\n ROUND: 'number, num_digits|Rounds a number to a number of digits.',\n ROUNDDOWN: 'number, num_digits|Rounds a number down, toward zero.',\n ROUNDUP: 'number, num_digits|Rounds a number up, away from zero.',\n ROW: '[reference]|Row number of a reference.',\n ROWS: 'array|Number of rows in a reference.',\n SEARCH: 'find_text, within_text, [start_num]|Position of a text inside another (not case-sensitive).',\n SECOND: 'serial_number|Second of a time value (0-59).',\n SIGN: 'number|Sign of a number: 1, 0 or -1.',\n SMALL: 'array, k|k-th smallest value in a data set.',\n SQRT: 'number|Square root.',\n STDEV: 'number1, [number2], ...|Standard deviation of a sample.',\n 'STDEV.P': 'number1, [number2], ...|Standard deviation of a population.',\n 'STDEV.S': 'number1, [number2], ...|Standard deviation of a sample.',\n STDEVP: 'number1, [number2], ...|Standard deviation of a population.',\n SUBSTITUTE: 'text, old_text, new_text, [instance_num]|Replaces existing text with new text.',\n SUM: 'number1, [number2], ...|Adds all the numbers.',\n SUMIF: 'range, criteria, [sum_range]|Adds the cells that meet a condition.',\n SUMIFS: 'sum_range, criteria_range1, criteria1, ...|Adds the cells that meet multiple conditions.',\n SUMPRODUCT: 'array1, [array2], ...|Sum of the products of corresponding items.',\n SWITCH: 'expression, value1, result1, [default_or_value2], ...|Matches an expression against a list of values.',\n T: 'value|Text of a value, or empty text.',\n TEXT: 'value, format_text|Formats a number as text.',\n TEXTJOIN: 'delimiter, ignore_empty, text1, ...|Joins texts with a delimiter.',\n TIME: 'hour, minute, second|Time value from hour, minute and second.',\n TODAY: '|Current date.',\n TRIM: 'text|Removes extra spaces from text.',\n TRUE: '|The logical value TRUE.',\n TRUNC: 'number, [num_digits]|Truncates a number to an integer or number of digits.',\n UPPER: 'text|Converts text to uppercase.',\n VALUE: 'text|Converts text to a number.',\n VAR: 'number1, [number2], ...|Variance of a sample.',\n 'VAR.P': 'number1, [number2], ...|Variance of a population.',\n 'VAR.S': 'number1, [number2], ...|Variance of a sample.',\n VARP: 'number1, [number2], ...|Variance of a population.',\n VLOOKUP: 'lookup_value, table_array, col_index_num, [range_lookup]|Looks up a value in the first column and returns a value from the same row.',\n WEEKDAY: 'serial_number, [return_type]|Day of the week of a date.',\n XLOOKUP: 'lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode]|Searches a range and returns the matching item from another range.',\n XOR: 'logical1, [logical2], ...|TRUE if an odd number of arguments are TRUE.',\n YEAR: 'serial_number|Year of a date.',\n}\n\nexport interface FnInfo {\n name: string\n args: string[]\n /** last argument repeats (`...`) */\n variadic: boolean\n desc: string\n}\n\nlet cache: FnInfo[] | null = null\n\n/** All functions offered to the user, sorted by name. */\nexport function functionCatalog(): FnInfo[] {\n if (!cache) {\n cache = Object.keys(RAW)\n .sort()\n .map((name) => {\n const [sig, desc] = RAW[name].split('|')\n const parts = sig ? sig.split(', ') : []\n const variadic = parts[parts.length - 1] === '...'\n return { name, args: variadic ? parts.slice(0, -1) : parts, variadic, desc }\n })\n }\n return cache\n}\n\nexport function functionInfo(name: string): FnInfo | undefined {\n const up = name.toUpperCase()\n return functionCatalog().find((f) => f.name === up)\n}\n\n/** Functions whose name starts with `prefix` (case-insensitive). */\nexport function suggestFunctions(prefix: string, limit = 10): FnInfo[] {\n const up = prefix.toUpperCase()\n if (!up) return []\n return functionCatalog()\n .filter((f) => f.name.startsWith(up))\n .slice(0, limit)\n}\n\n/** Index of the signature argument to highlight for the `arg`-th (0-based) argument being typed. */\nexport function argSlot(f: FnInfo, arg: number): number {\n if (arg < f.args.length) return arg\n if (!f.variadic) return -1\n // repeating group: e.g. SUMIFS(sum_range, criteria_range1, criteria1, ...) repeats the last 2,\n // SUM(number1, [number2], ...) repeats the last one\n const n = f.args.length\n const pairs = /1$/.test(f.args[n - 1] ?? '') && /1$/.test(f.args[n - 2] ?? '') ? 2 : 1\n const start = n - pairs\n return start + ((arg - start) % pairs)\n}\n","import { useCallback, useEffect, useLayoutEffect, useReducer, useRef, useState } from 'react'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { isWebImage } from '../../core/opc'\n\nexport const useIsoLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect\n\nexport function useForceUpdate(): [number, () => void] {\n const [n, bump] = useReducer((x: number) => x + 1, 0)\n return [n, bump as () => void]\n}\n\n/** Element size via ResizeObserver. */\nexport function useSize<T extends HTMLElement>(): [React.RefObject<T | null>, { w: number; h: number }] {\n const ref = useRef<T>(null)\n const [size, setSize] = useState({ w: 0, h: 0 })\n useIsoLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const update = () => {\n const w = el.clientWidth\n const h = el.clientHeight\n setSize((s) => (s.w === w && s.h === h ? s : { w, h }))\n }\n update()\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n return [ref, size]\n}\n\n/** Scroll position of an element, batched to animation frames. */\nexport function useScroll(ref: React.RefObject<HTMLElement | null>): { x: number; y: number } {\n const [pos, setPos] = useState({ x: 0, y: 0 })\n useEffect(() => {\n const el = ref.current\n if (!el) return\n let raf = 0\n const on = () => {\n if (raf) return\n raf = requestAnimationFrame(() => {\n raf = 0\n setPos({ x: el.scrollLeft, y: el.scrollTop })\n })\n }\n el.addEventListener('scroll', on, { passive: true })\n return () => {\n el.removeEventListener('scroll', on)\n cancelAnimationFrame(raf)\n }\n }, [ref])\n return pos\n}\n\n/** Lazily resolves a package part to an object URL (null while loading / unsupported). */\nexport function useMediaUrl(client: DocumentClient, path: string | undefined, enabled = true): string | null | 'unsupported' {\n const [url, setUrl] = useState<string | null | 'unsupported'>(null)\n useEffect(() => {\n if (!path || !enabled) return\n if (!isWebImage(path)) {\n setUrl('unsupported')\n return\n }\n let live = true\n client.mediaUrl(path).then(\n (u) => live && setUrl(u),\n () => live && setUrl('unsupported'),\n )\n return () => {\n live = false\n }\n }, [client, path, enabled])\n return url\n}\n\n/** Binary search: last index i with arr[i] <= v. */\nexport function lowerIndex(arr: ArrayLike<number>, v: number): number {\n let lo = 0\n let hi = arr.length - 1\n let ans = 0\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n if (arr[mid] <= v) {\n ans = mid\n lo = mid + 1\n } else hi = mid - 1\n }\n return ans\n}\n\nexport function useLatest<T>(v: T) {\n const r = useRef(v)\n r.current = v\n return r\n}\n\nexport function useStableCallback<A extends unknown[], R>(fn: (...a: A) => R) {\n const r = useLatest(fn)\n return useCallback((...a: A) => r.current(...a), [r])\n}\n","import {\n Children,\n Fragment,\n isValidElement,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from 'react'\n\nconst BORDER_GRID = <path d=\"M4 4h16v16H4zM12 4v16M4 12h16\" strokeDasharray=\"1.2 2.6\" opacity={0.5} strokeWidth={1.4} />\n\nconst P: Record<string, ReactNode> = {\n undo: <path d=\"M9 14 4 9l5-5M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" />,\n redo: <path d=\"m15 14 5-5-5-5M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" />,\n bold: <path d=\"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z\" strokeWidth={2.4} />,\n italic: <path d=\"M14 5h-4m4 14h-4m3-14-2 14\" strokeWidth={2.2} />,\n underline: <path d=\"M7 4v7a5 5 0 0 0 10 0V4M5 20h14\" />,\n strike: <path d=\"M16 6.5C15.3 5 13.8 4 12 4c-2.5 0-4 1.3-4 3 0 4 8 2.5 8 7 0 2-1.8 3.5-4.2 3.5-2 0-3.6-1-4.3-2.5M4 12h16\" />,\n color: <path d=\"m6 16 6-12 6 12M8.3 11.5h7.4\" />,\n highlight: <path d=\"m9 11-5 5v3h3l5-5M14.5 5.5l4 4L12 16l-4-4zM15 4l5 5\" />,\n fill: <path d=\"m19 11-8-8-8.5 8.5a2 2 0 0 0 0 2.8l5.7 5.7a2 2 0 0 0 2.8 0zM5 2l5 5M21 15s2 2.5 2 4a2 2 0 0 1-4 0c0-1.5 2-4 2-4\" />,\n alignLeft: <path d=\"M4 6h16M4 10h10M4 14h16M4 18h10\" />,\n alignCenter: <path d=\"M4 6h16M7 10h10M4 14h16M7 18h10\" />,\n alignRight: <path d=\"M4 6h16M10 10h10M4 14h16M10 18h10\" />,\n justify: <path d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />,\n bullets: <path d=\"M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01\" strokeWidth={2.2} />,\n numbers: <path d=\"M10 6h10M10 12h10M10 18h10M4 4.5h1.5v4M4 8.5h3M4 14.5c0-1 2.5-1.2 2.5.3 0 1.2-2.5 1.8-2.5 3.2h2.8\" />,\n indent: <path d=\"M4 5h16M11 10h9M11 14h9M4 19h16M4 9l3 3-3 3\" />,\n outdent: <path d=\"M4 5h16M11 10h9M11 14h9M4 19h16M7 9l-3 3 3 3\" />,\n clear: <path d=\"M5 5h10M10 5l-3 14M14 14l5 5m0-5-5 5\" />,\n search: <path d=\"m20 20-4.2-4.2M17 11a6 6 0 1 1-12 0 6 6 0 0 1 12 0\" />,\n save: <path d=\"M12 4v11m-4.5-4.5L12 15l4.5-4.5M5 19h14\" />,\n wrap: <path d=\"M4 6h16M4 12h13a3 3 0 0 1 0 6h-4m2-2-2 2 2 2M4 18h5\" />,\n edit: <path d=\"m4 20 1-4L16 5l3 3L8 19zM14 7l3 3\" />,\n view: <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12m10 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6\" />,\n close: <path d=\"M6 6l12 12M18 6 6 18\" />,\n image: <path d=\"M4 5h16v14H4zM4 16l5-5 4 4 3-3 4 4M15.5 9.5h.01\" />,\n table: <path d=\"M4 5h16v14H4zM4 10h16M4 15h16M10 5v14M15 5v14\" />,\n link: <path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1\" />,\n pagebreak: <path d=\"M5 4v5h14V4M5 20v-5h14v5M3 12h2m3 0h2m3 0h2m3 0h3\" />,\n sup: <path d=\"m4 8 8 10m0-10L4 18M16 4h4l-4 5h4\" />,\n sub: <path d=\"m4 6 8 10m0-10L4 16M16 15h4l-4 5h4\" />,\n lineSpacing: <path d=\"M10 6h10M10 12h10M10 18h10M5 4v16M3 6l2-2 2 2M3 18l2 2 2-2\" />,\n plus: <path d=\"M12 5v14M5 12h14\" />,\n minus: <path d=\"M5 12h14\" />,\n fit: <path d=\"M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5\" />,\n shape: <path d=\"M4 4h9v9H4zM17 11a4 4 0 1 1 0 8 4 4 0 0 1 0-8\" />,\n textbox: <path d=\"M4 5h16v14H4zM8 9h8M12 9v7\" />,\n slideAdd: <path d=\"M3 6h14v12H3zM20 8v6M17 11h6\" />,\n copy: <path d=\"M8 8h12v12H8zM4 16V4h12\" />,\n trash: <path d=\"M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13\" />,\n play: <path d=\"M7 4l13 8-13 8z\" />,\n front: <path d=\"M8 8h12v12H8zM4 4h10v3M4 4v10h3\" />,\n back: <path d=\"M4 4h12v12H4zM20 8v12H8v-3\" />,\n merge: <path d=\"M4 5h16v14H4zM9 12H4m16 0h-5m-6-3 3 3-3 3m6-6-3 3 3 3\" />,\n borders: <path d=\"M4 4h16v16H4zM12 4v16M4 12h16\" strokeDasharray=\"2 2\" />,\n freeze: <path d=\"M4 4h16v16H4zM4 9h16M9 4v16\" />,\n sum: <path d=\"M17 5H7l6 7-6 7h10\" />,\n rowAdd: <path d=\"M4 4h16v6H4zM12 14v6M9 17h6\" />,\n colAdd: <path d=\"M4 4h6v16H4zM14 12h6M17 9v6\" />,\n sort: <path d=\"M7 4v16M4 17l3 3 3-3M14 6h6M14 12h4M14 18h2\" />,\n up: <path d=\"m6 15 6-6 6 6\" />,\n down: <path d=\"m6 9 6 6 6-6\" />,\n chevron: <path d=\"m7 10 5 5 5-5\" />,\n lineWeight: <><path d=\"M4 6h16\" strokeWidth={1} /><path d=\"M4 11h16\" strokeWidth={2.2} /><path d=\"M4 17.5h16\" strokeWidth={3.6} /></>,\n rotate: <path d=\"M20 11a8 8 0 1 0-2.3 5.7M20 4v7h-7\" />,\n rotateCcw: <path d=\"M4 11a8 8 0 1 1 2.3 5.7M4 4v7h7\" />,\n flipH: <path d=\"M12 3v18M9 7 4 17h5zM15 7l5 10h-5z\" />,\n flipV: <path d=\"M3 12h18M7 9 17 4v5zM7 15l10 5v-5z\" />,\n alignObj: <path d=\"M4 3v18M8 7h12v4H8zM8 14h7v4H8z\" />,\n currency: <path d=\"M12 3v18M16.5 7.5C16 5.9 14.3 5 12 5c-2.6 0-4.5 1.3-4.5 3.3 0 4.7 9 2.6 9 7.4 0 2-1.9 3.3-4.5 3.3-2.4 0-4.2-1-4.7-2.8\" />,\n vTop: <path d=\"M5 4h14M12 20V8M8.5 11.5 12 8l3.5 3.5\" />,\n vMiddle: <path d=\"M5 12h14M12 3v6M9.5 6.5 12 9l2.5-2.5M12 21v-6M9.5 17.5 12 15l2.5 2.5\" />,\n vBottom: <path d=\"M5 20h14M12 4v12M8.5 12.5 12 16l3.5-3.5\" />,\n rotNone: <path d=\"M5 17h14M7 14l3-8 3 8M8 11.5h4\" />,\n rotUp: <path d=\"M5 19h14M6 15l9.5-9.5M9 6.5l4.5 7.5M8 10l4-.5\" />,\n rotDown: <path d=\"M5 5h14M6 9l9.5 9.5M9 17.5l4.5-7.5M8 14l4 .5\" />,\n rotStack: <path d=\"M9 4l2 5 2-5M9.6 6.5h2.8M9 11h4M11 11v4M9 15h4M9 17h3a1.5 1.5 0 0 1 0 3H9z\" strokeWidth={1.5} />,\n rotUp90: <path d=\"M19 5v14M15 18l-8-3 8-3M12.5 13v4M7 7l2-2 2 2M9 5v6\" />,\n rotDown90: <path d=\"M19 5v14M7 6l8 3-8 3M9.5 11V7M13 17l-2 2-2-2M11 19v-6\" />,\n sortAZ: <path d=\"M7 4v16M4 17l3 3 3-3M13 11l2.5-7 2.5 7M13.7 9h3.6M13 14h5l-5 6h5\" />,\n sortZA: <path d=\"M7 4v16M4 17l3 3 3-3M13 4h5l-5 6h5M13 20l2.5-7 2.5 7M13.7 18h3.6\" />,\n gridlines: <path d=\"M4 4h16v16H4zM4 9.3h16M4 14.6h16M9.3 4v16M14.6 4v16\" />,\n lineStyle: <path d=\"M4 6h16M4 12h16M4 18h3M10 18h4M17 18h3\" strokeWidth={2} />,\n paint: <path d=\"M5 4h11v5H5zM16 6.5h3v5l-7 1.5v3M11 16h2v5h-2z\" />,\n omega: <path d=\"M5 19h4v-2.5A6.5 6.5 0 1 1 15 16.5V19h4\" />,\n outline: <path d=\"M4 6h.01M4 12h.01M4 18h.01M8 6h12M11 12h9M11 18h9\" strokeWidth={2} />,\n imgOrig: <path d=\"M4 5h16v14H4zM8 15V9l-1.5 1.5M12 10h.01M12 14h.01M16.5 15V9L15 10.5\" />,\n imgReplace: <path d=\"M4 5h10v8H4zM4 11l3-3 3 3 2-2 2 2M14 19h6v-6M20 19l-5-5M7 16v3h4\" />,\n alt: <path d=\"M4 5h16v14H4zM7.5 15l2.5-6 2.5 6M8.3 13h3.4M15 9v6h2.5\" />,\n cut: <path d=\"M6 6a2.5 2.5 0 1 0 0 .01M6 18a2.5 2.5 0 1 0 0 .01M8 7.5 19 18M8 16.5 19 6\" />,\n paste: <path d=\"M9 4h6v3H9zM15 5h3v15H6V5h3\" />,\n pastePlain: <path d=\"M9 4h6v3H9zM15 5h3v15H6V5h3M9 11h6M12 11v6\" />,\n external: <path d=\"M14 4h6v6M20 4l-9 9M18 14v6H4V6h6\" />,\n unlink: <path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1M3 3l18 18\" />,\n selectAll: <path d=\"M4 4h3M10 4h4M17 4h3v3M20 10v4M20 17v3h-3M14 20h-4M7 20H4v-3M4 14v-4M4 7V4M8 8h8v8H8z\" />,\n hideShow: <path d=\"M3 3l18 18M10.6 6.1A10 10 0 0 1 12 6c6.5 0 10 6 10 6a17 17 0 0 1-3.1 3.8M6.6 7.6C3.8 9.3 2 12 2 12s3.5 6 10 6c1.6 0 3-.4 4.3-1\" />,\n percent: <path d=\"M19 5 5 19M7.5 9.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4M16.5 18.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4\" />,\n decLess: <path d=\"M3.5 16h.01M8 9.5a2.5 3.5 0 1 1 0 7 2.5 3.5 0 0 1 0-7M21 19h-7m0 0 2-2m-2 2 2 2\" strokeWidth={1.7} />,\n decMore: <path d=\"M3.5 16h.01M8 9.5a2.5 3.5 0 1 1 0 7 2.5 3.5 0 0 1 0-7M14.5 9.5a2 3 0 1 1 0 6 2 3 0 0 1 0-6M13 19h8m0 0-2-2m2 2-2 2\" strokeWidth={1.7} />,\n check: <path d=\"m5 12.5 4.5 4.5L19 7.5\" strokeWidth={2.2} />,\n more: <path d=\"M12 5.5h.01M12 12h.01M12 18.5h.01\" strokeWidth={3.2} />,\n bAll: <path d=\"M4 4h16v16H4zM12 4v16M4 12h16\" />,\n bOuter: <>{BORDER_GRID}<path d=\"M4 4h16v16H4z\" /></>,\n bInner: <>{BORDER_GRID}<path d=\"M12 4v16M4 12h16\" /></>,\n bTop: <>{BORDER_GRID}<path d=\"M4 4h16\" strokeWidth={2.2} /></>,\n bBottom: <>{BORDER_GRID}<path d=\"M4 20h16\" strokeWidth={2.2} /></>,\n bLeft: <>{BORDER_GRID}<path d=\"M4 4v16\" strokeWidth={2.2} /></>,\n bRight: <>{BORDER_GRID}<path d=\"M20 4v16\" strokeWidth={2.2} /></>,\n bNone: BORDER_GRID,\n rect: <path d=\"M4 6h16v12H4z\" />,\n roundRect: <path d=\"M8 6h8a4 4 0 0 1 4 4v4a4 4 0 0 1-4 4H8a4 4 0 0 1-4-4v-4a4 4 0 0 1 4-4\" />,\n ellipse: <path d=\"M12 6c4.4 0 8 2.7 8 6s-3.6 6-8 6-8-2.7-8-6 3.6-6 8-6\" />,\n triangle: <path d=\"M12 5l8 14H4z\" />,\n arrow: <path d=\"M4 10h9V6l7 6-7 6v-4H4z\" />,\n star: <path d=\"m12 4 2.4 5 5.6.7-4.1 3.8 1.1 5.5-5-2.8-5 2.8 1.1-5.5L4 9.7 9.6 9z\" />,\n line: <path d=\"M5 19 19 5\" />,\n rowAbove: <path d=\"M4 12h16v8H4zM12 3v6M9 6h6\" />,\n rowBelow: <path d=\"M4 4h16v8H4zM12 15v6M9 18h6\" />,\n colLeft: <path d=\"M12 4h8v16h-8zM3 12h6M6 9v6\" />,\n colRight: <path d=\"M4 4h8v16H4zM15 12h6M18 9v6\" />,\n delRow: <path d=\"M4 8h16v8H4zM9 10.5l6 3m0-3-6 3\" />,\n delCol: <path d=\"M8 4h8v16H8zM10.5 9l3 6m0-6-3 6\" />,\n hide: <path d=\"M3 3l18 18M10.6 6.1A10 10 0 0 1 12 6c6.5 0 10 6 10 6a17 17 0 0 1-3.1 3.8M6.6 7.6C3.8 9.3 2 12 2 12s3.5 6 10 6c1.6 0 3-.4 4.3-1M9.9 9.9a3 3 0 0 0 4.2 4.2\" />,\n}\n\nexport function Icon({ name, size = 18 }: { name: string; size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n {P[name]}\n </svg>\n )\n}\n\nconst keep = (e: React.MouseEvent) => e.preventDefault()\n\n/** popover panel kept inside the viewport horizontally */\nfunction PopBox(props: { className?: string; children: ReactNode; onMouseDown?: (e: React.MouseEvent) => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const [dx, setDx] = useState(0)\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const vw = document.documentElement.clientWidth\n if (r.right > vw - 8) setDx(-Math.min(r.left - 8, r.right - vw + 8))\n else if (r.left < 8) setDx(8 - r.left)\n }, [])\n return (\n <div ref={ref} className={props.className ?? 'de-tb-pop'} style={dx ? { transform: `translateX(${dx}px)` } : undefined} onMouseDown={props.onMouseDown}>\n {props.children}\n </div>\n )\n}\n\n/** closes a popup on outside mousedown (shadow-DOM safe: uses the composed path) */\nexport function useDismiss(ref: RefObject<HTMLElement | null>, open: boolean, close: () => void) {\n const cb = useRef(close)\n cb.current = close\n useEffect(() => {\n if (!open) return\n const on = (e: MouseEvent) => {\n const el = ref.current\n if (el && !e.composedPath().includes(el)) cb.current()\n }\n window.addEventListener('mousedown', on, true)\n return () => window.removeEventListener('mousedown', on, true)\n }, [open, ref])\n}\n\nexport function Btn(props: { icon?: string; label?: ReactNode; title: string; active?: boolean; disabled?: boolean; onClick: () => void; wide?: boolean }) {\n return (\n <button\n type=\"button\"\n className={props.active ? 'de-tb de-tb-on' : 'de-tb'}\n title={props.title}\n aria-label={props.title}\n aria-pressed={props.active}\n disabled={props.disabled}\n onMouseDown={keep}\n onClick={props.onClick}\n style={props.wide ? { width: 'auto', padding: '0 8px' } : undefined}\n >\n {props.icon ? <Icon name={props.icon} /> : props.label}\n </button>\n )\n}\n\nexport const Sep = () => <span className=\"de-tb-sep\" />\n\nexport interface DropOption<T> {\n value: T\n label: string\n /** secondary text on the right (example, shortcut) */\n hint?: string\n icon?: string\n /** label style (font / style previews) */\n style?: CSSProperties\n disabled?: boolean\n /** separator above this option */\n sep?: boolean\n}\n\n/**\n * Styled dropdown (listbox). Never takes focus from the editor: mouse down is prevented and,\n * while open, keys are captured at the window (arrows, Enter, Escape, type-ahead).\n */\nexport function Dropdown<T extends string | number>(props: {\n title: string\n options: DropOption<T>[]\n onChange: (v: T) => void\n /** selected value (check mark); omit for command menus */\n value?: T | ''\n placeholder?: string\n /** fixed trigger content (menus); null = icon only */\n label?: ReactNode\n icon?: string\n width?: number\n menuWidth?: number\n disabled?: boolean\n /** popup aligned to the trigger's right edge */\n alignRight?: boolean\n}) {\n const { options } = props\n const [open, setOpen] = useState(false)\n const [hi, setHi] = useState(-1)\n const [shift, setShift] = useState(0)\n const ref = useRef<HTMLSpanElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const typed = useRef({ text: '', at: 0 })\n const check = props.value !== undefined\n const sel = check ? options.findIndex((o) => o.value === props.value) : -1\n const current = sel >= 0 ? options[sel] : undefined\n useDismiss(ref, open, () => setOpen(false))\n\n const pick = (o: DropOption<T> | undefined) => {\n if (!o || o.disabled) return\n setOpen(false)\n props.onChange(o.value)\n }\n const show = () => {\n setHi(sel >= 0 ? sel : options.findIndex((o) => !o.disabled))\n setShift(0)\n setOpen(true)\n }\n\n // keyboard while open (captured so the document editor does not see the keys)\n useEffect(() => {\n if (!open) return\n const on = (e: KeyboardEvent) => {\n const n = options.length\n const step = (from: number, d: number) => {\n let i = from\n for (let k = 0; k < n; k++) {\n i = (i + d + n) % n\n if (!options[i].disabled) return i\n }\n return from\n }\n if (e.key === 'ArrowDown') setHi((h) => step(h, 1))\n else if (e.key === 'ArrowUp') setHi((h) => step(h < 0 ? 0 : h, -1))\n else if (e.key === 'Home') setHi(step(-1, 1))\n else if (e.key === 'End') setHi(step(0, -1))\n else if (e.key === 'Enter' || (e.key === ' ' && !typed.current.text)) pick(options[hi])\n else if (e.key === 'Escape') setOpen(false)\n else if (e.key === 'Tab') return setOpen(false)\n else if (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n // type-ahead on labels\n const t = typed.current\n t.text = (Date.now() - t.at < 700 ? t.text : '') + e.key.toLowerCase()\n t.at = Date.now()\n const i = options.findIndex((o) => !o.disabled && o.label.toLowerCase().startsWith(t.text))\n if (i >= 0) setHi(i)\n } else return\n e.preventDefault()\n e.stopPropagation()\n }\n window.addEventListener('keydown', on, true)\n return () => window.removeEventListener('keydown', on, true)\n }, [open, hi, options]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // keep the popup inside the viewport, highlighted option visible\n useLayoutEffect(() => {\n const el = listRef.current\n if (!open || !el) return\n const r = el.getBoundingClientRect()\n const vw = document.documentElement.clientWidth\n if (r.right > vw - 8) setShift((s) => s - (r.right - vw + 8))\n else if (r.left < 8) setShift((s) => s + (8 - r.left))\n }, [open])\n useLayoutEffect(() => {\n if (open) listRef.current?.querySelector(`[data-i=\"${hi}\"]`)?.scrollIntoView({ block: 'nearest' })\n }, [open, hi])\n\n const label = props.label !== undefined ? props.label : (current?.label ?? props.placeholder ?? '')\n return (\n <span ref={ref} className=\"de-dd-wrap\">\n <button\n type=\"button\"\n className={open ? 'de-dd de-dd-open' : 'de-dd'}\n style={{ width: props.width }}\n title={props.title}\n aria-label={props.title}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={props.disabled}\n onMouseDown={keep}\n onClick={() => (open ? setOpen(false) : show())}\n onKeyDown={(e) => {\n if (!open && (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n show()\n }\n }}\n >\n {props.icon && <Icon name={props.icon} />}\n {label !== null && <span className={current || props.label !== undefined ? 'de-dd-label' : 'de-dd-label de-dd-ph'}>{label}</span>}\n <Icon name=\"chevron\" size={14} />\n </button>\n {open && (\n <div\n ref={listRef}\n className=\"de-dd-pop\"\n role=\"listbox\"\n aria-label={props.title}\n style={{ minWidth: props.menuWidth, ...(props.alignRight ? { right: -shift } : { left: shift }) }}\n onMouseDown={keep}\n >\n {options.map((o, i) => (\n <Fragment key={String(o.value)}>\n {o.sep && i > 0 && <div className=\"de-dd-sep\" role=\"separator\" />}\n <div\n data-i={i}\n role=\"option\"\n aria-selected={i === sel}\n aria-disabled={o.disabled || undefined}\n className={'de-dd-opt' + (i === hi ? ' de-dd-hi' : '') + (o.disabled ? ' de-dd-dis' : '')}\n onMouseMove={() => i !== hi && !o.disabled && setHi(i)}\n onClick={() => pick(o)}\n >\n {check && <span className=\"de-dd-check\">{i === sel && <Icon name=\"check\" size={16} />}</span>}\n {o.icon && <Icon name={o.icon} />}\n <span className=\"de-dd-text\" style={o.style}>\n {o.label}\n </span>\n {o.hint && <span className=\"de-dd-hint\">{o.hint}</span>}\n </div>\n </Fragment>\n ))}\n </div>\n )}\n </span>\n )\n}\n\n/** Value picker (fonts, styles, formats…). */\nexport function Select<T extends string | number>(props: {\n value: T | ''\n options: DropOption<T>[]\n onChange: (v: T) => void\n title: string\n width?: number\n placeholder?: string\n menuWidth?: number\n disabled?: boolean\n}) {\n return <Dropdown {...props} />\n}\n\n/** Font size box: − [size] + with a list of common sizes (Google Docs style). */\nexport function SizeBox(props: { value?: number; placeholder?: number; sizes?: number[]; onChange: (n: number) => void; title?: string; disabled?: boolean }) {\n const sizes = props.sizes ?? SIZES\n const [text, setText] = useState<string | null>(null)\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLSpanElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n useDismiss(ref, open, () => setOpen(false))\n const base = props.value ?? props.placeholder ?? 11\n const set = (n: number) => {\n setText(null)\n setOpen(false)\n if (Number.isFinite(n) && n >= 1 && n <= 400) props.onChange(Math.round(n * 2) / 2)\n }\n const done = () => {\n if (text !== null) set(parseFloat(text))\n inputRef.current?.blur()\n }\n const title = props.title ?? 'Font size'\n return (\n <span ref={ref} className=\"de-size\">\n <button type=\"button\" className=\"de-tb de-size-step\" title=\"Decrease font size\" aria-label=\"Decrease font size\" disabled={props.disabled} onMouseDown={keep} onClick={() => set(Math.max(1, Math.ceil(base) - 1))}>\n <Icon name=\"minus\" size={16} />\n </button>\n <input\n ref={inputRef}\n className=\"de-size-input\"\n title={title}\n aria-label={title}\n inputMode=\"decimal\"\n disabled={props.disabled}\n value={text ?? (props.value !== undefined ? String(props.value) : '')}\n placeholder={props.placeholder !== undefined ? String(props.placeholder) : ''}\n onFocus={(e) => {\n e.currentTarget.select()\n setOpen(true)\n }}\n onChange={(e) => setText(e.target.value.replace(/[^\\d.]/g, ''))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n done()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n setText(null)\n setOpen(false)\n inputRef.current?.blur()\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault()\n const cur = parseFloat(text ?? String(base))\n const next = e.key === 'ArrowUp' ? sizes.find((n) => n > cur) : [...sizes].reverse().find((n) => n < cur)\n if (next !== undefined) setText(String(next))\n }\n }}\n onBlur={() => {\n if (text !== null) set(parseFloat(text))\n setOpen(false)\n }}\n />\n <button type=\"button\" className=\"de-tb de-size-step\" title=\"Increase font size\" aria-label=\"Increase font size\" disabled={props.disabled} onMouseDown={keep} onClick={() => set(Math.floor(base) + 1)}>\n <Icon name=\"plus\" size={16} />\n </button>\n {open && (\n <div className=\"de-dd-pop de-size-pop\" role=\"listbox\" aria-label={title} onMouseDown={keep}>\n {sizes.map((n) => (\n <div key={n} role=\"option\" aria-selected={n === props.value} className={'de-dd-opt' + (String(n) === (text ?? String(props.value)) ? ' de-dd-hi' : '')} onClick={() => set(n)}>\n {n}\n </div>\n ))}\n </div>\n )}\n </span>\n )\n}\n\n// ---------------------------------------------------------------- responsive toolbar row\n\nfunction flatten(children: ReactNode): ReactElement[] {\n const out: ReactElement[] = []\n Children.forEach(children, (c) => {\n if (!isValidElement(c)) return\n if (c.type === Fragment) out.push(...flatten((c.props as { children?: ReactNode }).children))\n else out.push(c)\n })\n return out\n}\n\nconst signature = (el: ReactElement) => {\n const p = el.props as { title?: string; icon?: string; label?: unknown }\n const t = typeof el.type === 'string' ? el.type : (el.type as { name?: string }).name\n return `${t}:${p.title ?? p.icon ?? (typeof p.label === 'string' ? p.label : '')}`\n}\n\n/**\n * One-line toolbar: items that do not fit move into a \"more\" popover (like Google Docs).\n * Item widths are measured once per set of items and cached for resizes.\n */\nexport function ToolbarRow({ children }: { children: ReactNode }) {\n const items = flatten(children)\n const sig = items.map(signature).join('|')\n const rowRef = useRef<HTMLDivElement>(null)\n const widths = useRef<number[]>([])\n const [fit, setFit] = useState<{ sig: string; cut: number; w: number }>({ sig: '', cut: items.length, w: 0 })\n const [more, setMore] = useState(false)\n const moreRef = useRef<HTMLSpanElement>(null)\n useDismiss(moreRef, more, () => setMore(false))\n const measured = fit.sig === sig\n const cut = measured ? fit.cut : items.length\n\n const layout = (w: number) => {\n const ws = widths.current\n const gap = 2\n const total = ws.reduce((a, b) => a + b + gap, 0)\n let k = items.length\n if (total > w) {\n const room = w - 34\n let used = 0\n k = 0\n while (k < items.length && used + ws[k] + gap <= room) used += ws[k++] + gap\n }\n setFit((f) => (f.sig === sig && f.cut === k && f.w === w ? f : { sig, cut: k, w }))\n }\n const avail = () => {\n const el = rowRef.current\n if (!el) return 0\n const cs = getComputedStyle(el)\n return el.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight)\n }\n\n // new set of items: everything is rendered once, measured, then cut\n useLayoutEffect(() => {\n const el = rowRef.current\n if (!el || measured) return\n widths.current = [...el.querySelectorAll<HTMLElement>(':scope > [data-i]')].map((x) => x.getBoundingClientRect().width)\n layout(avail())\n })\n const relayout = useRef(() => {})\n relayout.current = () => {\n if (widths.current.length === items.length) layout(avail())\n }\n useEffect(() => {\n const el = rowRef.current\n if (!el) return\n const ro = new ResizeObserver(() => relayout.current())\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const isSep = (el: ReactElement | undefined) => !!el && el.type === Sep\n let end = cut\n while (end > 0 && isSep(items[end - 1]) && end < items.length) end--\n const rest = items.slice(cut).filter((el, i, all) => !(isSep(el) && (i === 0 || i === all.length - 1)))\n return (\n <div ref={rowRef} className=\"de-ebar\" role=\"toolbar\">\n {items.slice(0, end).map((el, i) => (\n <span key={i} data-i={i} className=\"de-ebar-it\">\n {el}\n </span>\n ))}\n {rest.length > 0 && (\n <span ref={moreRef} className=\"de-tb-color de-ebar-morewrap\">\n <button type=\"button\" className={more ? 'de-tb de-tb-on' : 'de-tb'} title=\"More\" aria-label=\"More tools\" aria-expanded={more} onMouseDown={keep} onClick={() => setMore((m) => !m)}>\n <Icon name=\"more\" />\n </button>\n {more && (\n <PopBox className=\"de-tb-pop de-ebar-more\">\n {rest.map((el, i) => (\n <span key={i} className=\"de-ebar-it\">\n {el}\n </span>\n ))}\n </PopBox>\n )}\n </span>\n )}\n </div>\n )\n}\n\nconst PALETTE = [\n '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#ffffff',\n '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff',\n '#9900ff', '#ff00ff', '#e6b8af', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3',\n '#c9daf8', '#cfe2f3', '#d9d2e9', '#ead1dc', '#cc4125', '#e06666', '#f6b26b', '#ffd966',\n '#93c47d', '#76a5af', '#6d9eeb', '#6fa8dc', '#8e7cc3', '#c27ba0', '#1155cc', '#38761d',\n]\n\nexport function ColorBtn(props: { icon: string; title: string; value?: string; onPick: (c: string | null) => void; palette?: string[]; noneLabel?: string }) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLSpanElement>(null)\n useDismiss(ref, open, () => setOpen(false))\n return (\n <span ref={ref} className=\"de-tb-color\">\n <button type=\"button\" className={open ? 'de-tb de-tb-on' : 'de-tb'} title={props.title} aria-label={props.title} aria-expanded={open} onMouseDown={keep} onClick={() => setOpen((o) => !o)}>\n <Icon name={props.icon} />\n <span className=\"de-tb-swatch\" style={{ background: props.value ?? 'transparent' }} />\n </button>\n {open && (\n <PopBox onMouseDown={keep}>\n <button type=\"button\" className=\"de-tb-none\" onClick={() => (props.onPick(null), setOpen(false))}>\n {props.noneLabel ?? 'None'}\n </button>\n <div className=\"de-tb-grid\">\n {(props.palette ?? PALETTE).map((c) => (\n <button\n key={c}\n type=\"button\"\n title={c}\n className={props.value?.toLowerCase() === c ? 'on' : undefined}\n style={{ background: c }}\n onClick={() => (props.onPick(c), setOpen(false))}\n />\n ))}\n </div>\n </PopBox>\n )}\n </span>\n )\n}\n\nexport const FONTS = ['Arial', 'Calibri', 'Cambria', 'Courier New', 'Georgia', 'Helvetica', 'Segoe UI', 'Tahoma', 'Times New Roman', 'Verdana']\nexport const SIZES = [8, 9, 10, 10.5, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 48, 60, 72]\n\n/** Font picker options (each shown in its own face); keeps an unknown current font at the top. */\nexport function fontOptions(current?: string): DropOption<string>[] {\n const list = current && !FONTS.includes(current) ? [current, ...FONTS] : FONTS\n return list.map((f, i) => ({ value: f, label: f, style: { fontFamily: `\"${f}\", system-ui, sans-serif` }, sep: i === 1 && list !== FONTS }))\n}\n\n/** Picks the first name of a CSS font stack. */\nexport function fontName(css: string | undefined): string {\n if (!css) return ''\n const m = /^\\s*\"?([^\",]+)\"?/.exec(css)\n return m ? m[1] : ''\n}\n\nexport function download(blob: Blob, name: string) {\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = name\n document.body.appendChild(a)\n a.click()\n a.remove()\n setTimeout(() => URL.revokeObjectURL(url), 30_000)\n}\n\n/** Command menu: fixed label, items with optional icons. */\nexport function Menu(props: { title: string; label: string; icon?: string; items: { value: string; label: string; icon?: string; disabled?: boolean; sep?: boolean; hint?: string }[]; onPick: (v: string) => void; width?: number }) {\n return <Dropdown title={props.title} label={props.label.replace(/\\s*▾$/, '')} icon={props.icon} options={props.items} onChange={props.onPick} />\n}\n\n/** Small popover anchored under a toolbar button. */\nexport function Pop(props: { icon: string; title: string; children: (close: () => void) => ReactNode; active?: boolean; disabled?: boolean; chevron?: boolean }) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLSpanElement>(null)\n useDismiss(ref, open, () => setOpen(false))\n return (\n <span ref={ref} className=\"de-tb-color\">\n <button\n type=\"button\"\n className={(props.active || open ? 'de-tb de-tb-on' : 'de-tb') + (props.chevron ? ' de-tb-chev' : '')}\n title={props.title}\n aria-label={props.title}\n aria-expanded={open}\n disabled={props.disabled}\n onMouseDown={keep}\n onClick={() => setOpen((o) => !o)}\n >\n <Icon name={props.icon} />\n {props.chevron && <Icon name=\"chevron\" size={14} />}\n </button>\n {open && (\n <PopBox onMouseDown={(e) => (e.target as HTMLElement).closest('input, textarea') || e.preventDefault()}>\n {props.children(() => setOpen(false))}\n </PopBox>\n )}\n </span>\n )\n}\n\n/** rows × cols picker for new tables */\nexport function GridPicker({ onPick }: { onPick: (r: number, c: number) => void }) {\n const [hover, setHover] = useState<[number, number]>([0, 0])\n return (\n <div>\n <div className=\"de-gridpick\" onMouseLeave={() => setHover([0, 0])}>\n {Array.from({ length: 64 }, (_, i) => {\n const r = Math.floor(i / 8) + 1\n const c = (i % 8) + 1\n return <button key={i} type=\"button\" className={r <= hover[0] && c <= hover[1] ? 'on' : ''} onMouseEnter={() => setHover([r, c])} onMouseDown={keep} onClick={() => onPick(r, c)} />\n })}\n </div>\n <div className=\"de-gridpick-label\">{hover[0] ? `${hover[0]} × ${hover[1]}` : 'Table size'}</div>\n </div>\n )\n}\n\n/** Inline text prompt (URL, sheet name…) inside a popover. */\nexport function PromptBox(props: { placeholder: string; initial?: string; ok: string; onOk: (v: string) => void; extra?: ReactNode }) {\n const [v, setV] = useState(props.initial ?? '')\n return (\n <form\n className=\"de-prompt\"\n onSubmit={(e) => {\n e.preventDefault()\n props.onOk(v)\n }}\n >\n <input autoFocus value={v} placeholder={props.placeholder} onChange={(e) => setV(e.target.value)} />\n <button type=\"submit\" className=\"de-btn\">\n {props.ok}\n </button>\n {props.extra}\n </form>\n )\n}\n\n/** Opens the OS file picker (images by default). */\nexport function pickFiles(accept = 'image/*', multiple = true): Promise<File[]> {\n return new Promise((resolve) => {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = accept\n input.multiple = multiple\n input.onchange = () => resolve(Array.from(input.files ?? []))\n input.click()\n })\n}\n","import { createContext, useContext, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ToolbarRow } from '../edit/Toolbar'\nimport type { DocumentClient } from '../../core/worker/client'\n\nexport interface ViewerApi {\n /** editor bar mount point (null when the viewer toolbar is hidden) */\n bar: HTMLElement | null\n editable: boolean\n /** report unsaved changes */\n setDirty: (dirty: boolean) => void\n /** build + hand off the edited file */\n save: () => Promise<void>\n client: DocumentClient | null\n}\n\nexport const ViewerContext = createContext<ViewerApi>({\n bar: null,\n editable: false,\n setDirty: () => {},\n save: async () => {},\n client: null,\n})\n\nexport const useViewer = () => useContext(ViewerContext)\n\n/** Renders the editor bar into the viewer's toolbar row. */\nexport function EditorBar({ children }: { children: ReactNode }) {\n const { bar } = useViewer()\n return bar ? createPortal(<ToolbarRow>{children}</ToolbarRow>, bar) : null\n}\n","import { createContext, useContext, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\n\n/** Toolbar slot provided by DocViewer; views portal their status text into it (no parent re-render). */\nexport const StatusContext = createContext<HTMLElement | null>(null)\n\nexport function Status({ text, onStatus }: { text: string; onStatus?: (s: string) => void }) {\n const el = useContext(StatusContext)\n useEffect(() => {\n onStatus?.(text)\n }, [text, onStatus])\n return el ? createPortal(text, el) : null\n}\n","export type Zoom = number | 'fit'\n\nconst STEPS = [0.25, 0.33, 0.5, 0.67, 0.75, 0.9, 1, 1.1, 1.25, 1.5, 1.75, 2, 2.5, 3]\n\nexport function ZoomControl({ zoom, effective, onChange }: { zoom: Zoom; effective: number; onChange: (z: Zoom) => void }) {\n const step = (dir: 1 | -1) => {\n const cur = effective\n const next = dir > 0 ? STEPS.find((s) => s > cur + 0.001) : [...STEPS].reverse().find((s) => s < cur - 0.001)\n if (next) onChange(next)\n }\n return (\n <div className=\"de-zoom\" role=\"group\" aria-label=\"Zoom\">\n <button type=\"button\" aria-label=\"Zoom out\" onClick={() => step(-1)}>\n −\n </button>\n <span title={zoom === 'fit' ? 'Fit width (click for 100%)' : 'Click to fit width'} onClick={() => onChange(zoom === 'fit' ? 1 : 'fit')}>\n {zoom === 'fit' ? 'Fit' : `${Math.round(effective * 100)}%`}\n </span>\n <button type=\"button\" aria-label=\"Zoom in\" onClick={() => step(1)}>\n +\n </button>\n </div>\n )\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { Icon } from '../edit/Toolbar'\n\nexport interface MenuItem {\n label: string\n run: () => void\n disabled?: boolean\n /** separator above this item */\n sep?: boolean\n /** shortcut / secondary text */\n hint?: string\n icon?: string\n /** small section title above this item */\n head?: string\n}\n\n/** Right-click menu at viewport coordinates; never steals focus from the editor. */\nexport function ContextMenu({ x, y, items, onClose }: { x: number; y: number; items: MenuItem[]; onClose: () => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState({ left: x, top: y })\n const [hi, setHi] = useState(-1)\n const close = useRef(onClose)\n close.current = onClose\n\n // keep inside the viewport (flip up / left when needed)\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const vw = document.documentElement.clientWidth\n const vh = document.documentElement.clientHeight\n setPos({\n left: x + r.width > vw - 4 ? Math.max(4, x - r.width) : x,\n top: y + r.height > vh - 4 ? Math.max(4, Math.min(y - r.height, vh - r.height - 4)) : y,\n })\n }, [x, y])\n\n useEffect(() => {\n const down = (e: MouseEvent) => {\n if (ref.current && !e.composedPath().includes(ref.current)) close.current()\n }\n const key = (e: KeyboardEvent) => {\n const n = items.length\n const step = (from: number, d: number) => {\n let i = from\n for (let k = 0; k < n; k++) {\n i = (i + d + n) % n\n if (!items[i].disabled) return i\n }\n return from\n }\n if (e.key === 'Escape') close.current()\n else if (e.key === 'ArrowDown') setHi((h) => step(h, 1))\n else if (e.key === 'ArrowUp') setHi((h) => step(h < 0 ? 0 : h, -1))\n else if (e.key === 'Enter' && hi >= 0 && !items[hi].disabled) {\n close.current()\n items[hi].run()\n } else return\n e.preventDefault()\n e.stopPropagation()\n }\n const away = () => close.current()\n window.addEventListener('mousedown', down, true)\n window.addEventListener('keydown', key, true)\n window.addEventListener('blur', away)\n window.addEventListener('resize', away)\n return () => {\n window.removeEventListener('mousedown', down, true)\n window.removeEventListener('keydown', key, true)\n window.removeEventListener('blur', away)\n window.removeEventListener('resize', away)\n }\n }, [items, hi])\n\n return (\n <div ref={ref} className=\"de-ctx\" style={pos} role=\"menu\" onMouseDown={(e) => e.preventDefault()} onContextMenu={(e) => e.preventDefault()}>\n {items.map((it, i) => (\n <div key={i} className=\"de-ctx-row\">\n {it.sep && i > 0 && <div className=\"de-ctx-sep\" role=\"separator\" />}\n {it.head && <div className=\"de-ctx-head\">{it.head}</div>}\n <button\n type=\"button\"\n role=\"menuitem\"\n className={i === hi ? 'de-ctx-hi' : undefined}\n disabled={it.disabled}\n onMouseEnter={() => setHi(i)}\n onClick={() => {\n close.current()\n it.run()\n }}\n >\n <span className=\"de-ctx-icon\">{it.icon && <Icon name={it.icon} size={16} />}</span>\n <span className=\"de-ctx-label\">{it.label}</span>\n {it.hint && <span className=\"de-ctx-hint\">{it.hint}</span>}\n </button>\n </div>\n ))}\n </div>\n )\n}\n\n/** platform modifier label for shortcut hints */\nexport const MOD = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform) ? '⌘' : 'Ctrl+'\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\n\nexport interface PromptSpec {\n title: string\n label?: string\n initial?: string\n placeholder?: string\n ok?: string\n /** multi-line input */\n area?: boolean\n onOk: (value: string) => void\n /** extra button (e.g. \"Remove link\") */\n extra?: { label: string; run: () => void }\n note?: ReactNode\n}\n\n/** Small modal prompt (no window.prompt: works in sandboxed / embedded pages). */\nexport function PromptDialog({ spec, onClose }: { spec: PromptSpec; onClose: () => void }) {\n const [v, setV] = useState(spec.initial ?? '')\n const ref = useRef<HTMLInputElement & HTMLTextAreaElement>(null)\n useEffect(() => {\n const el = ref.current\n el?.focus()\n el?.select()\n }, [])\n const done = () => {\n onClose()\n spec.onOk(v)\n }\n return (\n <div\n className=\"de-dialog-back\"\n onMouseDown={(e) => e.target === e.currentTarget && onClose()}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose()\n }\n }}\n >\n <form\n className=\"de-dialog\"\n role=\"dialog\"\n aria-label={spec.title}\n onSubmit={(e) => {\n e.preventDefault()\n done()\n }}\n >\n <div className=\"de-dialog-title\">{spec.title}</div>\n {spec.label && <label className=\"de-dialog-label\">{spec.label}</label>}\n {spec.area ? (\n <textarea ref={ref} rows={3} value={v} placeholder={spec.placeholder} onChange={(e) => setV(e.target.value)} />\n ) : (\n <input ref={ref} value={v} placeholder={spec.placeholder} onChange={(e) => setV(e.target.value)} />\n )}\n {spec.note && <div className=\"de-dialog-note\">{spec.note}</div>}\n <div className=\"de-dialog-btns\">\n {spec.extra && (\n <button\n type=\"button\"\n className=\"de-btn de-dialog-extra\"\n onClick={() => {\n onClose()\n spec.extra!.run()\n }}\n >\n {spec.extra.label}\n </button>\n )}\n <button type=\"button\" className=\"de-btn\" onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\" className=\"de-btn de-btn-primary\">\n {spec.ok ?? 'OK'}\n </button>\n </div>\n </form>\n </div>\n )\n}\n\n/** Short-lived message at the bottom of the viewer. */\nexport function Toast({ text, onDone }: { text: string; onDone: () => void }) {\n useEffect(() => {\n const id = setTimeout(onDone, 3500)\n return () => clearTimeout(id)\n }, [text, onDone])\n return (\n <div className=\"de-toast\" role=\"status\">\n {text}\n </div>\n )\n}\n","import type { Inline, Paragraph, ParaSpec, SpecRun } from './types'\n\nexport function inlineSpec(x: Inline): SpecRun {\n switch (x.t) {\n case 'text':\n return { text: x.text, src: x.src, set: x.d && Object.keys(x.d).length ? x.d : undefined, lk: x.lk }\n case 'field':\n return { obj: 'field', kind: x.kind }\n case 'img':\n if (x.src) return { obj: 'copy', src: x.src, size: x.resized ? [x.w, x.h] : undefined, alt: x.altSet ? (x.alt ?? '') : undefined, rid: x.repl ? x.rid : undefined }\n return x.rid ? { obj: 'image', rid: x.rid, w: x.w, h: x.h, alt: x.alt } : { text: '' }\n default:\n return x.src ? { obj: 'copy', src: x.src } : { text: '' }\n }\n}\n\n/** Write-back spec for a paragraph (all page-break parts sharing one pid). */\nexport function paraSpec(parts: Paragraph[]): ParaSpec {\n const p0 = parts[0]\n return {\n pid: p0.pid!,\n from: p0.from ?? p0.pid!,\n orig: p0.orig,\n pd: p0.pd,\n keepSect: p0.keepSect,\n pristine: !parts.some((p) => p.edited) && (p0.from === undefined || p0.from === p0.pid),\n parts: parts.map((p) => p.runs.map(inlineSpec)),\n }\n}\n","import type { Inline, RunSet, RunStyle } from '../../core/docx/types'\nimport { cssFont } from '../../core/fonts'\n\nexport interface PastedPara {\n runs: Inline[]\n heading?: number\n list?: 'bullet' | 'number'\n}\n\ntype Ctx = RunStyle & { href?: string; fontName?: string }\n\nconst BLOCK = new Set(['P', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'LI', 'TR', 'BLOCKQUOTE', 'PRE', 'SECTION', 'ARTICLE', 'HEADER', 'FOOTER', 'UL', 'OL', 'TABLE', 'TBODY', 'THEAD', 'DL', 'DT', 'DD', 'FIGURE'])\nconst SKIP = new Set(['SCRIPT', 'STYLE', 'HEAD', 'TITLE', 'META', 'LINK', 'NOSCRIPT', 'TEMPLATE'])\n\nfunction hex(color: string | null | undefined): string | undefined {\n if (!color) return undefined\n const c = color.trim().toLowerCase()\n if (/^#[0-9a-f]{6}$/.test(c)) return c\n if (/^#[0-9a-f]{3}$/.test(c)) return '#' + [...c.slice(1)].map((x) => x + x).join('')\n const m = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/.exec(c)\n if (m) {\n if (m[4] !== undefined && Number(m[4]) === 0) return undefined\n return '#' + [m[1], m[2], m[3]].map((v) => Number(v).toString(16).padStart(2, '0')).join('')\n }\n return undefined\n}\n\nfunction sizePt(v: string): number | undefined {\n const m = /^([\\d.]+)(pt|px|em|rem)?$/.exec(v.trim())\n if (!m) return undefined\n const n = Number(m[1])\n return m[2] === 'px' ? n * 0.75 : m[2] === 'em' || m[2] === 'rem' ? n * 11 : n\n}\n\nfunction styleOf(el: HTMLElement, base: Ctx): Ctx {\n const s: Ctx = { ...base }\n switch (el.tagName) {\n case 'B':\n case 'STRONG':\n s.b = true\n break\n case 'I':\n case 'EM':\n s.i = true\n break\n case 'U':\n case 'INS':\n s.u = 'single'\n break\n case 'S':\n case 'STRIKE':\n case 'DEL':\n s.strike = true\n break\n case 'SUP':\n s.va = 'sup'\n break\n case 'SUB':\n s.va = 'sub'\n break\n case 'A':\n if ((el as HTMLAnchorElement).href && !(el as HTMLAnchorElement).href.startsWith('javascript:')) {\n s.href = el.getAttribute('href') ?? undefined\n s.u = 'single'\n s.color = '#0563c1'\n }\n break\n case 'FONT': {\n const c = hex(el.getAttribute('color'))\n if (c) s.color = c\n const f = el.getAttribute('face')\n if (f) s.fontName = f.split(',')[0].replace(/['\"]/g, '').trim()\n break\n }\n case 'CODE':\n case 'KBD':\n s.fontName = 'Courier New'\n break\n }\n const st = el.style\n if (st.fontWeight) s.b = st.fontWeight === 'bold' || st.fontWeight === 'bolder' || Number(st.fontWeight) >= 600\n if (st.fontStyle) s.i = st.fontStyle === 'italic' || st.fontStyle === 'oblique'\n const deco = `${st.textDecoration} ${st.textDecorationLine}`\n if (deco.includes('underline')) s.u = 'single'\n if (deco.includes('line-through')) s.strike = true\n if (st.textDecoration === 'none' && el.tagName !== 'A') s.u = undefined\n const c = hex(st.color)\n if (c) s.color = c\n const bg = hex(st.backgroundColor)\n if (bg && bg !== '#ffffff') s.hl = bg\n if (st.fontSize) {\n const pt = sizePt(st.fontSize)\n if (pt && pt >= 4 && pt <= 200) s.sz = Math.round(pt * 2) / 2\n }\n if (st.fontFamily) s.fontName = st.fontFamily.split(',')[0].replace(/['\"]/g, '').trim()\n if (st.verticalAlign === 'super') s.va = 'sup'\n else if (st.verticalAlign === 'sub') s.va = 'sub'\n return s\n}\n\nfunction toRun(text: string, c: Ctx): Inline {\n const { href, fontName, ...rest } = c\n const s: RunStyle = { ...rest }\n if (fontName) s.font = cssFont(fontName)\n const d: RunSet = {}\n if (c.b !== undefined) d.b = c.b\n if (c.i !== undefined) d.i = c.i\n if (c.u) d.u = c.u\n if (c.strike) d.strike = true\n if (c.color) d.color = c.color\n if (c.sz) d.sz = c.sz\n if (fontName) d.font = fontName\n if (c.hl) d.hl = c.hl\n if (c.va) d.va = c.va\n return { t: 'text', text, s, d: Object.keys(d).length ? d : undefined, href } as Inline\n}\n\n/** Converts clipboard HTML (Word, Google Docs, web pages) into paragraphs of formatted runs. */\nexport function htmlToParas(html: string): PastedPara[] {\n const doc = new DOMParser().parseFromString(html, 'text/html')\n const out: PastedPara[] = []\n let cur: PastedPara | null = null\n const para = (props: Partial<PastedPara> = {}) => {\n cur = { runs: [], ...props }\n out.push(cur)\n return cur\n }\n const walk = (node: Node, c: Ctx, list: 'bullet' | 'number' | undefined, pre: boolean) => {\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === 3) {\n let text = child.textContent ?? ''\n if (!pre) text = text.replace(/[\\s ]+/g, (m) => (m.includes(' ') && m.length === 1 ? ' ' : ' '))\n if (!text || (!pre && !cur && !text.trim())) continue\n ;(cur ?? para()).runs.push(toRun(text, c))\n continue\n }\n if (child.nodeType !== 1) continue\n const el = child as HTMLElement\n if (SKIP.has(el.tagName)) continue\n if (el.tagName === 'BR') {\n ;(cur ?? para()).runs.push(toRun('\\n', c))\n continue\n }\n if (el.tagName === 'TD' || el.tagName === 'TH') {\n if (cur && (cur as PastedPara).runs.length) (cur as PastedPara).runs.push(toRun('\\t', c))\n walk(el, styleOf(el, c), list, pre)\n continue\n }\n const st = styleOf(el, c)\n if (BLOCK.has(el.tagName)) {\n const nextList = el.tagName === 'UL' ? 'bullet' : el.tagName === 'OL' ? 'number' : list\n if (el.tagName !== 'UL' && el.tagName !== 'OL' && el.tagName !== 'TABLE' && el.tagName !== 'TBODY' && el.tagName !== 'THEAD') {\n const h = /^H([1-6])$/.exec(el.tagName)\n para({ heading: h ? Number(h[1]) : undefined, list: el.tagName === 'LI' ? nextList ?? 'bullet' : undefined })\n }\n walk(el, st, nextList, pre || el.tagName === 'PRE')\n cur = null\n continue\n }\n walk(el, st, list, pre)\n }\n }\n walk(doc.body, {}, undefined, false)\n // trim whitespace-only edges\n for (const p of out) {\n const first = p.runs[0]\n if (first?.t === 'text') first.text = first.text.replace(/^ +/, '')\n const last = p.runs[p.runs.length - 1]\n if (last?.t === 'text') last.text = last.text.replace(/ +$/, '')\n p.runs = p.runs.filter((r) => r.t !== 'text' || r.text)\n }\n while (out.length && !out[0].runs.length) out.shift()\n while (out.length && !out[out.length - 1].runs.length) out.pop()\n return out\n}\n","import type { Paragraph, Table, TableCell, TableRow } from '../../core/docx/types'\n\nexport interface GridCell {\n ri: number\n ci: number\n g: number\n cell: TableCell\n}\n\n/** Grid positions of every cell (row spans occupy following rows). */\nexport function gridOf(t: Table): { cells: GridCell[]; nCols: number; at: (ri: number, g: number) => GridCell | undefined } {\n const occ: boolean[][] = []\n const cells: GridCell[] = []\n t.rows.forEach((row, ri) => {\n let g = 0\n row.cells.forEach((cell, ci) => {\n while (occ[ri]?.[g]) g++\n for (let r = ri; r < ri + Math.max(1, cell.rowSpan); r++) for (let k = g; k < g + Math.max(1, cell.colSpan); k++) (occ[r] ??= [])[k] = true\n cells.push({ ri, ci, g, cell })\n g += Math.max(1, cell.colSpan)\n })\n })\n const nCols = Math.max(t.cols.length, ...cells.map((c) => c.g + c.cell.colSpan))\n const at = (ri: number, g: number) => cells.find((c) => ri >= c.ri && ri < c.ri + c.cell.rowSpan && g >= c.g && g < c.g + c.cell.colSpan)\n return { cells, nCols, at }\n}\n\nexport type NewPara = (template: TableCell) => Paragraph\n\nfunction blankCell(tpl: TableCell, mk: NewPara, colSpan = 1): TableCell {\n return { ...tpl, blocks: [mk(tpl)], colSpan, rowSpan: 1 }\n}\n\nfunction scaleCols(cols: number[], total: number): number[] {\n const sum = cols.reduce((a, b) => a + b, 0) || 1\n return cols.map((w) => +((w * total) / sum).toFixed(2))\n}\n\nexport function insertRow(t: Table, ri: number, below: boolean, mk: NewPara): Table {\n const { cells, nCols, at } = gridOf(t)\n const target = below ? ri + 1 : ri\n const rows = t.rows.map((r) => ({ ...r, cells: [...r.cells] }))\n const newCells: TableCell[] = []\n for (let g = 0; g < nCols; ) {\n const above = at(below ? ri : ri, g)\n if (!above) {\n g++\n continue\n }\n const spansInto = above.ri < target && above.ri + above.cell.rowSpan > target\n if (spansInto) {\n const r = rows[above.ri]\n r.cells[above.ci] = { ...r.cells[above.ci], rowSpan: r.cells[above.ci].rowSpan + 1 }\n } else newCells.push(blankCell(above.cell, mk, above.cell.colSpan))\n g += above.cell.colSpan\n }\n void cells\n const tplRow = t.rows[ri]\n const row: TableRow = { ...tplRow, cells: newCells }\n rows.splice(target, 0, row)\n return { ...t, rows }\n}\n\nexport function deleteRow(t: Table, ri: number): Table | null {\n if (t.rows.length <= 1) return null\n const { cells } = gridOf(t)\n const rows = t.rows.map((r) => ({ ...r, cells: [...r.cells] }))\n for (const c of cells) {\n if (c.ri < ri && c.ri + c.cell.rowSpan > ri) rows[c.ri].cells[c.ci] = { ...rows[c.ri].cells[c.ci], rowSpan: c.cell.rowSpan - 1 }\n }\n rows.splice(ri, 1)\n return { ...t, rows }\n}\n\nexport function insertCol(t: Table, g0: number, right: boolean, mk: NewPara): Table {\n const { cells, nCols } = gridOf(t)\n const g = right ? g0 + 1 : g0\n const rows = t.rows.map((r) => ({ ...r, cells: [...r.cells] }))\n const total = t.cols.reduce((a, b) => a + b, 0)\n t.rows.forEach((_, ri) => {\n const rowCells = cells.filter((c) => c.ri === ri)\n const crossing = cells.find((c) => c.ri <= ri && ri < c.ri + c.cell.rowSpan && c.g < g && c.g + c.cell.colSpan > g)\n if (crossing) {\n if (crossing.ri === ri) rows[ri].cells[crossing.ci] = { ...rows[ri].cells[crossing.ci], colSpan: crossing.cell.colSpan + 1 }\n return\n }\n const covered = cells.find((c) => c.ri < ri && ri < c.ri + c.cell.rowSpan && c.g + c.cell.colSpan === g)\n if (covered && !rowCells.length) return\n const before = rowCells.filter((c) => c.g < g).length\n const tpl = rowCells[Math.max(0, before - 1)]?.cell ?? rowCells[0]?.cell\n if (tpl) rows[ri].cells.splice(before, 0, blankCell(tpl, mk))\n })\n const cols = [...(t.cols.length ? t.cols : new Array(nCols).fill(total / Math.max(1, nCols)))]\n cols.splice(g, 0, cols[Math.min(g0, cols.length - 1)] ?? 72)\n return { ...t, rows, cols: total ? scaleCols(cols, total) : cols }\n}\n\nexport function deleteCol(t: Table, g: number): Table | null {\n const { cells, nCols } = gridOf(t)\n if (nCols <= 1) return null\n const rows = t.rows.map((r) => ({ ...r, cells: [...r.cells] }))\n const remove = new Set<string>()\n for (const c of cells) {\n if (g < c.g || g >= c.g + c.cell.colSpan) continue\n if (c.cell.colSpan > 1) rows[c.ri].cells[c.ci] = { ...rows[c.ri].cells[c.ci], colSpan: c.cell.colSpan - 1 }\n else remove.add(`${c.ri}:${c.ci}`)\n }\n rows.forEach((r, ri) => (r.cells = r.cells.filter((_, ci) => !remove.has(`${ri}:${ci}`))))\n const total = t.cols.reduce((a, b) => a + b, 0)\n const cols = [...t.cols]\n cols.splice(g, 1)\n return { ...t, rows: rows.filter((r) => r.cells.length), cols: total && cols.length ? scaleCols(cols, total) : cols }\n}\n\n/** New table model (rows × cols) with simple single borders. */\nexport function newTable(rowsN: number, colsN: number, width: number, mk: () => Paragraph): Table {\n const border = '0.5pt solid #000000'\n const w = +(width / colsN).toFixed(2)\n return {\n t: 'tbl',\n cols: new Array(colsN).fill(w),\n rows: Array.from({ length: rowsN }, () => ({\n cells: Array.from({ length: colsN }, () => ({ blocks: [mk()], colSpan: 1, rowSpan: 1, borders: { t: border, r: border, b: border, l: border }, pad: [0, 5.4, 0, 5.4] as [number, number, number, number] })),\n })),\n }\n}\n","/**\n * Main-thread DOCX editing host: owns undo history and paragraph mutations,\n * mirrors every change to the worker (which regenerates the XML).\n */\nimport { paraSpec } from '../../core/docx/spec'\nimport type { Block, CanonStyle, EditOp, EditResult, Inline, Paragraph, ParaDirty, ParaStyle, RunSet, RunStyle, StyleInfo, Table, TableSpec } from '../../core/docx/types'\nimport { cssFont } from '../../core/fonts'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { opInsert, opInsertRuns, ordered, RichInput, type ReplaceOpts, type RichHost } from '../edit/input'\nimport { htmlToParas } from './html'\nimport { deleteCol, deleteRow, gridOf, insertCol, insertRow, newTable } from './tables'\nimport { collapsed, formatRange, plen, runAt, shiftPa, splitRuns, type RRun, type Sel } from '../edit/rich'\n\nexport interface DocState {\n blocks: Block[]\n heights: WeakMap<Block, number>\n dirty: Set<Block>\n /** leading blocks measured at least once */\n frontier: number\n}\n\ninterface Entry {\n pas: string[]\n before: Paragraph[]\n after: Paragraph[]\n /** top-level block replacement (tables) */\n blocks?: { bi: number; before: Block[]; after: Block[] }\n selBefore: Sel\n selAfter: Sel\n label: string\n t: number\n}\n\nexport interface FormatState {\n b: boolean\n i: boolean\n u: boolean\n strike: boolean\n color?: string\n hl?: string\n sz?: number\n font?: string\n align?: string\n style?: string\n lst?: 'bullet' | 'number'\n line?: number\n va?: 'sup' | 'sub'\n link?: string\n /** caret inside a table cell */\n inTable: boolean\n /** a single image is selected */\n img?: { w: number; h: number; alt?: string; target: string; pa: string; o: number }\n canUndo: boolean\n canRedo: boolean\n}\n\nconst path = (pa: string) => pa.split('.').map(Number)\n\n/** selection recorded around address `from`, re-based onto `to` (same container) */\nfunction moveSel(sel: Sel, from: string, to: string): Sel {\n if (from === to) return sel\n const dir = (pa: string) => pa.replace(/\\.?\\d+$/, '')\n const d = Number(to.split('.').pop()) - Number(from.split('.').pop())\n const mv = (p: Sel['a']) => (dir(p.pa) === dir(from) ? { ...p, pa: dir(to) ? `${dir(to)}.${Number(p.pa.split('.').pop()) + d}` : String(Number(p.pa.split('.').pop()) + d) } : p)\n return { a: mv(sel.a), f: mv(sel.f) }\n}\n\n/** a model change: contiguous paragraphs replaced, or top-level blocks replaced */\nexport type DocxCommit = { kind: 'paras'; before: Paragraph[]; next: Paragraph[] } | { kind: 'blocks'; bi: number; before: Block[]; next: Block[] }\n\nexport class DocxEditor implements RichHost<Paragraph> {\n readonly input: RichInput\n pendingSel: Sel | null = null\n styles: StyleInfo[] = []\n private history: Entry[] = []\n private future: Entry[] = []\n private pend: { s: Partial<RunStyle>; d: RunSet; at: { pa: string; o: number } } | null = null\n /** next id for new paragraphs / tables (a collaboration session gives each client its own range) */\n nextPid = 1_000_000_000\n private inflight = 0\n onState?: (s: FormatState | null) => void\n /** image selection changed (overlay with resize handles) */\n onImage?: (img: FormatState['img'] | null) => void\n /** style list changed (a built-in style was added to the document) */\n onStyles?: (styles: StyleInfo[]) => void\n shortcut?: (e: KeyboardEvent) => boolean\n onDirty?: () => void\n /** paint format: run formatting copied from the caret, applied to the next selection */\n painter: RunSet | null = null\n onPainter?: (on: boolean) => void\n /** every model change, after it was mirrored to the worker (collaboration hook) */\n onCommit?: (c: DocxCommit) => void\n\n constructor(\n private client: DocumentClient,\n private st: DocState,\n private changed: () => void,\n ) {\n this.input = new RichInput(this)\n }\n\n // ---------------------------------------------------------------- addressing\n\n private container(pa: string): { list: Block[]; at: number; cell?: [number, number, number] } | undefined {\n const p = path(pa)\n if (p.length === 1) return { list: this.st.blocks, at: p[0] }\n const t = this.st.blocks[p[0]]\n if (t?.t !== 'tbl') return undefined\n const cell = t.rows[p[1]]?.cells[p[2]]\n return cell ? { list: cell.blocks, at: p[3], cell: [p[0], p[1], p[2]] } : undefined\n }\n\n para(pa: string): Paragraph | undefined {\n const c = this.container(pa)\n const b = c?.list[c.at]\n return b && b.t === 'p' && b.pid !== undefined && !b.ro ? b : undefined\n }\n\n span(a: string, b: string): string[] | null {\n const pa = path(a)\n const pb = path(b)\n if (pa.length !== pb.length || pa.slice(0, -1).join('.') !== pb.slice(0, -1).join('.')) return null\n const out: string[] = []\n for (let i = pa[pa.length - 1]; i <= pb[pb.length - 1]; i++) {\n const addr = shiftPa(a, i - pa[pa.length - 1])\n if (!this.para(addr)) return null\n out.push(addr)\n }\n return out\n }\n\n prev(pa: string) {\n const at = path(pa).pop()!\n const q = shiftPa(pa, -1)\n return at > 0 && this.para(q) ? q : undefined\n }\n\n next(pa: string) {\n const q = shiftPa(pa, 1)\n return this.para(q) ? q : undefined\n }\n\n cmp(a: string, b: string): number {\n const x = path(a)\n const y = path(b)\n for (let i = 0; i < Math.min(x.length, y.length); i++) if (x[i] !== y[i]) return x[i] - y[i]\n return x.length - y.length\n }\n\n // ---------------------------------------------------------------- paragraph factories\n\n withRuns(p: Paragraph, runs: RRun[]): Paragraph {\n return { ...p, runs: runs as Inline[], edited: true }\n }\n\n private origOf(p: Paragraph): number[] {\n return p.orig ?? (p.pid === (p.from ?? p.pid) ? [p.pid!] : [])\n }\n\n defaultRun(p: Paragraph): Partial<RRun> | undefined {\n if (p.caret) return { ...(p.caret as RRun), text: '' }\n const last = [...p.runs].reverse().find((r) => r.t === 'text') as RRun | undefined\n if (last) return { ...last, text: '' }\n return { t: 'text', s: { sz: p.markSz, font: p.markFont } } as Partial<RRun>\n }\n\n split(p: Paragraph, left: RRun[], right: RRun[], atEnd: boolean): [Paragraph, Paragraph] {\n const keep = p.keepSect ?? p.pid === (p.from ?? p.pid)\n const a: Paragraph = { ...p, runs: left as Inline[], edited: true, keepSect: false }\n const b: Paragraph = {\n ...p,\n runs: right as Inline[],\n pid: this.nextPid++,\n from: p.from ?? p.pid,\n orig: [],\n edited: true,\n keepSect: keep,\n pb: false,\n ver: 0,\n caret: right.length ? undefined : ((runAt(left, plen(left)) as Inline | undefined) ?? p.caret),\n }\n if (atEnd) {\n const next = this.styles.find((s) => s.id === p.sid)?.next\n if (next && next !== p.sid) {\n b.pd = { ...(b.pd ?? {}), style: next }\n b.sid = next\n }\n }\n return [a, b]\n }\n\n join(a: Paragraph, b: Paragraph, runs: RRun[]): Paragraph {\n return { ...a, runs: runs as Inline[], edited: true, orig: [...this.origOf(a), ...this.origOf(b)], keepSect: (a.keepSect ?? a.pid === (a.from ?? a.pid)) || (b.keepSect ?? b.pid === (b.from ?? b.pid)) }\n }\n\n // ---------------------------------------------------------------- mutation core\n\n private splice(pa: string, count: number, next: Block[]): Block[] {\n const c = this.container(pa)!\n if (!c.cell) {\n this.st.blocks.splice(c.at, count, ...next)\n return this.st.blocks\n }\n const [bi, ri, ci] = c.cell\n const t = this.st.blocks[bi] as Table\n const blocks = [...c.list]\n blocks.splice(c.at, count, ...next)\n const nt: Table = { ...t, rows: t.rows.map((r, i) => (i !== ri ? r : { ...r, cells: r.cells.map((cell, j) => (j !== ci ? cell : { ...cell, blocks })) })) }\n this.st.heights.set(nt, this.st.heights.get(t) ?? 0)\n this.st.dirty.add(nt)\n this.st.blocks[bi] = nt\n return blocks\n }\n\n replace(pas: string[], next: Paragraph[], sel: Sel, opts: ReplaceOpts & { history?: boolean; want?: boolean } = {}): void {\n const before = pas.map((pa) => this.para(pa)!)\n if (before.some((b) => !b)) return\n if (opts.remount) next = next.map((p) => ({ ...p, ver: (p.ver ?? 0) + 1 }))\n const c = this.container(pas[0])!\n const at = c.at\n const list = this.splice(pas[0], pas.length, next)\n // split paragraphs: trailing page-break parts follow the paragraph that now ends the range\n const lastB = before[before.length - 1]\n const lastN = next[next.length - 1]\n if (lastN && lastB.pid !== lastN.pid) {\n for (let k = at + next.length; k < list.length; k++) {\n const b = list[k]\n if (b.t !== 'p' || b.pid !== lastB.pid || !b.pb) break\n list[k] = { ...b, pid: lastN.pid, from: lastN.from ?? lastN.pid, edited: true }\n }\n }\n // heights: estimate from what was there, remeasure soon\n if (!c.cell) {\n next.forEach((p, i) => {\n this.st.heights.set(p, this.st.heights.get(before[i] ?? before[0]) ?? 0)\n this.st.dirty.add(p)\n })\n for (const k of [at - 1, at + next.length]) if (list[k]) this.st.dirty.add(list[k])\n if (at < this.st.frontier) this.st.frontier = Math.max(0, this.st.frontier + next.length - pas.length)\n }\n if (opts.history !== false) {\n const now = Date.now()\n const last = this.history[this.history.length - 1]\n const label = opts.label ?? 'edit'\n const selBefore = this.input.lastSel ?? sel\n if (label === 'type' && last?.label === 'type' && pas.length === 1 && next.length === 1 && last.after.length === 1 && last.pas[0] === pas[0] && now - last.t < 1500) {\n last.after = next\n last.selAfter = sel\n last.t = now\n } else {\n this.history.push({ pas, before, after: next, selBefore, selAfter: sel, label, t: now })\n if (this.history.length > 500) this.history.shift()\n }\n this.future = []\n }\n this.commit(pas[0], before, next, opts.want)\n this.onCommit?.({ kind: 'paras', before, next })\n this.pendingSel = sel\n this.onDirty?.()\n this.changed()\n // the caret may not move (formatting): refresh the toolbar from the new runs\n this.emitState(sel)\n }\n\n /** contiguous blocks sharing `pid` around index `near` */\n private partsOf(list: Block[], pid: number, near: number): Paragraph[] {\n let i = near\n while (i > 0 && (list[i - 1] as Paragraph).pid === pid && list[i - 1].t === 'p') i--\n const out: Paragraph[] = []\n for (; i < list.length && list[i].t === 'p' && (list[i] as Paragraph).pid === pid; i++) out.push(list[i] as Paragraph)\n return out\n }\n\n private commit(pa: string, before: Paragraph[], next: Paragraph[], want?: boolean) {\n const c = this.container(pa)!\n if (c.cell && (this.st.blocks[c.cell[0]] as Table).tid !== undefined) {\n this.commitTable(c.cell[0])\n return\n }\n const list = c.list\n const pids: number[] = []\n next.forEach((p) => p.pid !== undefined && !pids.includes(p.pid) && pids.push(p.pid))\n const specs = pids.map((pid) => {\n const idx = c.at + next.findIndex((p) => p.pid === pid)\n return paraSpec(this.partsOf(list, pid, idx))\n })\n const remove: number[] = []\n for (const b of before) {\n if (b.pid === undefined || pids.includes(b.pid) || remove.includes(b.pid)) continue\n const still = list.findIndex((x) => x.t === 'p' && (x as Paragraph).pid === b.pid)\n if (still >= 0) specs.push(paraSpec(this.partsOf(list, b.pid, still)))\n else remove.push(b.pid)\n }\n const anchor = before[0].pid!\n const structural = want || next.some((p) => p.pd !== before.find((b) => b.pid === p.pid)?.pd)\n const sent = new Set<Paragraph>(next)\n const op: EditOp = { anchor, list: specs, remove, want: structural }\n this.inflight++\n this.client\n .call('docx.edit', op)\n .then((res) => this.applyResult(res, sent))\n .catch((e) => console.error('[office-engine] edit failed', e))\n .finally(() => this.inflight--)\n }\n\n get busy() {\n return this.inflight > 0\n }\n\n private locate(pid: number): { list: Block[]; index: number; pa: string }[] {\n const out: { list: Block[]; index: number; pa: string }[] = []\n this.st.blocks.forEach((b, bi) => {\n if (b.t === 'p' && b.pid === pid) out.push({ list: this.st.blocks, index: bi, pa: String(bi) })\n else if (b.t === 'tbl')\n b.rows.forEach((r, ri) =>\n r.cells.forEach((cell, ci) =>\n cell.blocks.forEach((x, pi) => {\n if (x.t === 'p' && x.pid === pid) out.push({ list: cell.blocks, index: pi, pa: `${bi}.${ri}.${ci}.${pi}` })\n }),\n ),\n )\n })\n return out\n }\n\n private put(pa: string, p: Paragraph) {\n const c = this.container(pa)\n if (!c) return\n const old = c.list[c.at]\n this.splice(pa, 1, [p])\n if (!c.cell) {\n this.st.heights.set(p, this.st.heights.get(old) ?? 0)\n this.st.dirty.add(p)\n }\n }\n\n private applyResult(res: EditResult, sent: Set<Paragraph>) {\n if (this.input.isComposing) return\n let touched = false\n // re-converted paragraphs (style / list changes): only if not edited again meanwhile\n for (const [k, blocks] of Object.entries(res.blocks)) {\n const locs = this.locate(Number(k))\n const paras = blocks.filter((b): b is Paragraph => b.t === 'p')\n if (!locs.length || paras.length !== locs.length) continue\n if (!locs.every((l) => sent.has(l.list[l.index] as Paragraph))) continue\n locs.forEach((l, i) => {\n const cur = l.list[l.index] as Paragraph\n this.put(l.pa, { ...paras[i], from: cur.from, orig: cur.orig, pd: cur.pd, edited: cur.edited, keepSect: cur.keepSect, ver: cur.ver, pb: cur.pb })\n })\n touched = true\n }\n // list numbering changes anywhere in the document\n for (const [k, m] of Object.entries(res.markers)) {\n for (const loc of this.locate(Number(k))) {\n const p = loc.list[loc.index] as Paragraph\n if ((loc.list[loc.index - 1] as Paragraph | undefined)?.pid === p.pid) continue\n this.put(loc.pa, { ...p, marker: m ? { text: m.text, s: m.s, tab: m.tab } : undefined, lst: m?.lst })\n touched = true\n }\n }\n if (touched) this.changed()\n }\n\n // ---------------------------------------------------------------- history\n\n /** current address of the first block of `list` (paragraphs by pid, tables by identity), `empty` for an empty list; undefined when gone */\n private whereNow(list: Block[], empty: string): string | undefined {\n const b = list[0]\n if (!b) return empty\n if (b.t === 'p') return b.pid !== undefined ? this.locate(b.pid)[0]?.pa : undefined\n if (b.t === 'tbl') {\n const i = this.st.blocks.findIndex((x) => x.t === 'tbl' && ((b.tid !== undefined && x.tid === b.tid) || (b.item !== undefined && x.item === b.item)))\n return i >= 0 ? String(i) : undefined\n }\n return empty\n }\n\n /** table undo / redo: paragraphs still in place keep their current text (edited since, maybe by collaborators) */\n private keepCurrent(list: Block[], bi: number, count: number): Block[] {\n const cur = new Map(this.st.blocks.slice(bi, bi + count).flatMap((b) => (b.t === 'p' && b.pid !== undefined ? [[b.pid, b] as const] : [])))\n return list.map((b) => (b.t === 'p' && b.pid !== undefined && cur.has(b.pid) ? cur.get(b.pid)! : b))\n }\n\n undo() {\n const e = this.history.pop()\n if (!e) return\n if (e.blocks) {\n const bi = this.whereNow(e.blocks.after, String(e.blocks.bi))\n // the blocks were removed by a collaborator: nothing left to undo\n if (bi === undefined) return\n this.replaceBlocks(Number(bi), e.blocks.after.length, this.keepCurrent(e.blocks.before, Number(bi), e.blocks.after.length), e.selBefore, false)\n this.future.push(e)\n return\n }\n const at = this.whereNow(e.after, e.pas[0])\n if (at === undefined) return\n const pasAfter = e.after.map((_, i) => shiftPa(at, i))\n // a collaborator changed these paragraphs' structure meanwhile: drop the entry\n if (pasAfter.some((pa, i) => this.para(pa)?.pid !== e.after[i].pid)) return\n this.replace(pasAfter.length ? pasAfter : [at], e.before, moveSel(e.selBefore, e.pas[0], at), { history: false, label: 'undo', want: true })\n this.future.push(e)\n }\n\n redo() {\n const e = this.future.pop()\n if (!e) return\n if (e.blocks) {\n const bi = this.whereNow(e.blocks.before, String(e.blocks.bi))\n if (bi === undefined) return\n this.replaceBlocks(Number(bi), e.blocks.before.length, this.keepCurrent(e.blocks.after, Number(bi), e.blocks.before.length), e.selAfter, false)\n this.history.push(e)\n return\n }\n const at = this.whereNow(e.before, e.pas[0])\n if (at === undefined) return\n const pasNow = e.before.map((_, i) => shiftPa(at, i))\n if (pasNow.some((pa, i) => this.para(pa)?.pid !== e.before[i].pid)) return\n this.replace(pasNow, e.after, moveSel(e.selAfter, e.pas[0], at), { history: false, label: 'redo', want: true })\n this.history.push(e)\n }\n\n get canUndo() {\n return this.history.length > 0\n }\n get canRedo() {\n return this.future.length > 0\n }\n\n // ---------------------------------------------------------------- formatting\n\n pendingStyle(): Partial<RRun> | undefined {\n return this.pend ? ({ s: this.pend.s, d: this.pend.d } as Partial<RRun>) : undefined\n }\n\n clearPending() {\n this.pend = null\n }\n\n private selectedParas(sel: Sel): { pas: string[]; s: { pa: string; o: number }; e: { pa: string; o: number } } | null {\n const [s, e] = ordered(this, sel)\n const pas = s.pa === e.pa ? (this.para(s.pa) ? [s.pa] : null) : this.span(s.pa, e.pa)\n return pas ? { pas, s, e } : null\n }\n\n format(s: Partial<RunStyle>, d: RunSet, opts: { want?: boolean } = {}) {\n const sel = this.input.sel()\n if (!sel) return\n if (collapsed(sel)) {\n this.pend = { s: { ...(this.pend?.s ?? {}), ...s }, d: { ...(this.pend?.d ?? {}), ...d }, at: sel.a }\n this.input.restore(sel)\n this.emitState(sel)\n return\n }\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa, i) => {\n const p = this.para(pa)!\n const a = i === 0 ? r.s.o : 0\n const b = i === r.pas.length - 1 ? r.e.o : plen(p.runs as RRun[])\n return this.withRuns(p, formatRange(p.runs as RRun[], a, b, s, d))\n })\n this.replace(r.pas, next, sel, { label: 'format', want: opts.want })\n }\n\n toggle(key: 'b' | 'i' | 'u' | 'strike') {\n const st = this.state()\n const on = !(st && st[key])\n if (key === 'u') this.format({ u: on ? 'single' : 'none' }, { u: on ? 'single' : 'none' })\n else this.format({ [key]: on }, { [key]: on })\n }\n\n setFont(name: string) {\n this.format({ font: cssFont(name) }, { font: name })\n }\n\n setSize(sz: number) {\n this.format({ sz }, { sz })\n }\n\n setColor(c: string | null) {\n this.format({ color: c ?? undefined }, { color: c })\n }\n\n setHighlight(c: string | null) {\n this.format({ hl: c ?? undefined, shd: undefined }, { hl: c })\n }\n\n clearFormat() {\n this.format({ b: false, i: false, u: 'none', strike: false, hl: undefined }, { b: false, i: false, u: 'none', strike: false, color: null, hl: null, va: null }, { want: true })\n }\n\n setPara(patch: ParaDirty, optimistic: Partial<ParaStyle> = {}, sel = this.input.sel()) {\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa) => {\n const p = this.para(pa)!\n const pd = { ...(p.pd ?? {}), ...patch }\n return { ...p, pd, ps: { ...p.ps, ...optimistic }, edited: true, sid: patch.style ?? p.sid }\n })\n this.replace(r.pas, next, sel, { label: 'para', want: true })\n }\n\n toggleList(kind: 'bullet' | 'number') {\n const sel = this.input.sel()\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const all = r.pas.every((pa) => this.para(pa)?.lst === kind)\n this.setPara({ list: all ? 'none' : kind, ilvl: all ? undefined : 0 }, {}, sel)\n }\n\n indent(dir: 1 | -1, sel = this.input.sel()) {\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa) => {\n const p = this.para(pa)!\n const pd: ParaDirty = { ...(p.pd ?? {}) }\n if (p.lst) pd.ilvl = Math.max(0, Math.min(8, (p.ilvl ?? 0) + dir))\n else pd.indL = Math.max(0, (p.ps.indL ?? 0) + dir * 36)\n return { ...p, pd, ps: p.lst ? p.ps : { ...p.ps, indL: pd.indL }, edited: true }\n })\n this.replace(r.pas, next, sel, { label: 'para', want: true })\n }\n\n tab(sel: Sel, shift: boolean): boolean {\n if (sel.f.pa.includes('.')) {\n // move between table cells (Tab on the last cell adds a row)\n const [bi, ri, ci] = sel.f.pa.split('.').map(Number)\n const t = this.st.blocks[bi] as Table\n const cells = t.rows.flatMap((r, i) => r.cells.map((_, j) => [i, j] as [number, number]))\n const k = cells.findIndex(([i, j]) => i === ri && j === ci) + (shift ? -1 : 1)\n if (k >= cells.length && !shift) {\n this.tableOp('rowBelow')\n return true\n }\n const [nr, nc] = cells[Math.max(0, k)]\n const pa = `${bi}.${nr}.${nc}.0`\n const p = this.para(pa)\n this.input.restore({ a: { pa, o: 0 }, f: { pa, o: p ? plen(p.runs as RRun[]) : 0 } })\n return true\n }\n const p = this.para(sel.a.pa)\n if (!p?.lst) return false\n this.indent(shift ? -1 : 1, sel)\n return true\n }\n\n backspaceAtStart(pa: string, p: Paragraph): boolean {\n if (!p.lst) return false\n this.setPara({ list: 'none' }, {}, { a: { pa, o: 0 }, f: { pa, o: 0 } })\n return true\n }\n\n // ---------------------------------------------------------------- blocks (tables)\n\n /** content width (pt) of the page, for sizing new tables / images */\n contentW = 468\n /** document default font (CSS) / size, shown when a run inherits them */\n defaultFont?: string\n defaultSz?: number\n\n private prevParaPid(bi: number): number | undefined {\n for (let i = bi - 1; i >= 0; i--) {\n const b = this.st.blocks[i]\n if (b.t === 'p' && b.pid !== undefined) return b.pid\n }\n return undefined\n }\n\n private tableSpec(t: Table): TableSpec {\n return {\n tid: t.tid!,\n item: t.item,\n cols: t.cols,\n rows: t.rows.map((r) => ({\n src: r.src,\n cells: r.cells.map((c) => ({\n src: c.src,\n colSpan: c.colSpan,\n rowSpan: c.rowSpan,\n paras: c.blocks.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined).map((p) => paraSpec([p])),\n })),\n })),\n }\n }\n\n private commitTable(bi: number) {\n const t = this.st.blocks[bi] as Table\n if (t?.t !== 'tbl' || t.tid === undefined) return\n this.send('docx.table', { tid: t.tid, item: t.item, anchor: t.item === undefined ? this.prevParaPid(bi) : undefined, spec: this.tableSpec(t) })\n }\n\n private send(method: 'docx.table' | 'docx.edit', op: unknown) {\n this.inflight++\n ;(this.client.call as (m: string, ...a: unknown[]) => Promise<unknown>)(method, op)\n .then((res) => method === 'docx.edit' && this.applyResult(res as EditResult, new Set()))\n .catch((e) => console.error('[office-engine] edit failed', e))\n .finally(() => this.inflight--)\n }\n\n /** Replaces top-level blocks (table insert/delete/restructure) with history + write-back. */\n replaceBlocks(bi: number, count: number, next: Block[], sel: Sel | null, history = true) {\n const before = this.st.blocks.slice(bi, bi + count)\n this.st.blocks.splice(bi, count, ...next)\n next.forEach((b, i) => {\n this.st.heights.set(b, this.st.heights.get(before[i] ?? before[0]) ?? 0)\n this.st.dirty.add(b)\n })\n if (bi < this.st.frontier) this.st.frontier = Math.max(0, this.st.frontier + next.length - count)\n const key = (b: Block) => (b.t === 'tbl' ? `t${b.tid ?? 'i' + b.item}` : b.t === 'p' ? `p${b.pid}` : '')\n const nextKeys = new Set(next.map(key))\n const beforeKeys = new Set(before.map(key))\n // paragraphs that appear / disappear\n const anchorP = [...before, ...next].find((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && beforeKeys.has(key(b)) && nextKeys.has(key(b)))\n const added = next.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && !beforeKeys.has(key(b)))\n const removed = before.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && !nextKeys.has(key(b)))\n // paragraphs kept but replaced by another version (undo, collaborators) must reach the worker too\n const beforeObj = new Map(before.map((b) => [key(b), b]))\n const changed = next.some((b) => b.t === 'p' && b.pid !== undefined && beforeObj.has(key(b)) && beforeObj.get(key(b)) !== b)\n if (anchorP && (added.length || removed.length || changed)) {\n const list = next.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined)\n this.send('docx.edit', { anchor: anchorP.pid, list: list.map((p) => paraSpec([p])), remove: removed.map((p) => p.pid) } as EditOp)\n }\n for (const b of before) if (b.t === 'tbl' && !nextKeys.has(key(b)) && (b.tid !== undefined || b.item !== undefined)) this.send('docx.table', { tid: b.tid ?? -1, item: b.item, spec: null })\n next.forEach((b, i) => b.t === 'tbl' && b.tid !== undefined && this.commitTable(bi + i))\n this.onCommit?.({ kind: 'blocks', bi, before, next })\n if (history) {\n const s = sel ?? this.input.lastSel ?? { a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } }\n this.history.push({ pas: [], before: [], after: [], blocks: { bi, before, after: next }, selBefore: this.input.lastSel ?? s, selAfter: s, label: 'table', t: Date.now() })\n this.future = []\n }\n if (sel) this.pendingSel = sel\n this.onDirty?.()\n this.changed()\n }\n\n private emptyPara(tpl: Paragraph): Paragraph {\n return {\n t: 'p', ps: { ...tpl.ps, indFirst: undefined, indL: undefined }, runs: [], markSz: tpl.markSz, markFont: tpl.markFont,\n pid: this.nextPid++, from: tpl.from ?? tpl.pid, orig: [], edited: true, keepSect: false, pd: { style: '', list: 'none' }, sid: undefined,\n }\n }\n\n insertTable(rowsN: number, colsN: number) {\n const sel = this.input.sel()\n const bi = sel ? Number(sel.f.pa.split('.')[0]) : -1\n const p = this.st.blocks[bi]\n if (!sel || sel.f.pa.includes('.') || p?.t !== 'p' || p.pid === undefined) return\n const t: Table = { ...newTable(rowsN, colsN, this.contentW, () => this.emptyPara(p)), tid: this.nextPid++ }\n const after: Block[] = [p, t]\n const nextBlock = this.st.blocks[bi + 1]\n if (!nextBlock || nextBlock.t !== 'p') after.push(this.emptyPara(p))\n this.replaceBlocks(bi, 1, after, { a: { pa: `${bi + 1}.0.0.0`, o: 0 }, f: { pa: `${bi + 1}.0.0.0`, o: 0 } })\n }\n\n /** Structural table edit at the caret's cell. */\n tableOp(kind: 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'delRow' | 'delCol' | 'delTable') {\n const sel = this.input.sel()\n if (!sel || !sel.f.pa.includes('.')) return\n const [bi, ri, ci] = sel.f.pa.split('.').map(Number)\n const t = this.st.blocks[bi] as Table\n if (t?.t !== 'tbl') return\n const g = gridOf(t).cells.find((c) => c.ri === ri && c.ci === ci)?.g ?? 0\n const mk = (tpl: { blocks: Block[] }) => {\n const p = tpl.blocks.find((b): b is Paragraph => b.t === 'p') ?? (this.st.blocks.find((b) => b.t === 'p' && b.pid !== undefined) as Paragraph)\n return { ...this.emptyPara(p), pd: {}, ps: p.ps, sid: p.sid }\n }\n let next: Table | null = t\n let caret = `${bi}.${ri}.${ci}.0`\n switch (kind) {\n case 'rowAbove':\n next = insertRow(t, ri, false, mk)\n caret = `${bi}.${ri}.0.0`\n break\n case 'rowBelow':\n next = insertRow(t, ri, true, mk)\n caret = `${bi}.${ri + 1}.0.0`\n break\n case 'colLeft':\n next = insertCol(t, g, false, mk)\n break\n case 'colRight':\n next = insertCol(t, g, true, mk)\n caret = `${bi}.${ri}.${ci + 1}.0`\n break\n case 'delRow':\n next = deleteRow(t, ri)\n caret = `${bi}.${Math.max(0, Math.min(ri, (next?.rows.length ?? 1) - 1))}.0.0`\n break\n case 'delCol':\n next = deleteCol(t, g)\n caret = `${bi}.${ri}.${Math.max(0, ci - 1)}.0`\n break\n case 'delTable':\n next = null\n break\n }\n if (!next) {\n const after = this.st.blocks[bi + 1]\n this.replaceBlocks(bi, 1, [], after?.t === 'p' ? { a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } } : null)\n return\n }\n next = { ...next, tid: t.tid ?? this.nextPid++ }\n this.replaceBlocks(bi, 1, [next], { a: { pa: caret, o: 0 }, f: { pa: caret, o: 0 } })\n }\n\n // ---------------------------------------------------------------- inserts\n\n async insertImages(files: Blob[], at?: Sel) {\n const sel = at ?? this.input.sel()\n if (!sel) return\n const runs: Inline[] = []\n for (const f of files) {\n const ext = (f.type.split('/')[1] ?? 'png').replace('svg+xml', 'svg').replace('jpeg', 'jpg')\n const { rid, path } = await this.client.call('docx.image', await f.arrayBuffer(), ext)\n const dims = await imageSize(f)\n const scale = Math.min(1, this.contentW / Math.max(1, dims.w * 0.75))\n runs.push({ t: 'img', target: path, w: +(dims.w * 0.75 * scale).toFixed(1), h: +(dims.h * 0.75 * scale).toFixed(1), rid })\n }\n opInsertRuns(this, sel, [runs as RRun[]], { label: 'image' })\n }\n\n async setLink(url: string | null) {\n const sel = this.input.sel()\n if (!sel) return\n if (!url) {\n this.patchRuns(sel, (r) => ({ ...r, href: undefined, lk: undefined }))\n return\n }\n const href = /^[a-z][\\w+.-]*:/i.test(url) || url.startsWith('#') ? url : 'https://' + url\n const lk = await this.client.call('docx.link', href)\n const style = { color: '#0563c1', u: 'single' }\n if (collapsed(sel)) {\n opInsertRuns(this, sel, [[{ t: 'text', text: url, href, lk, s: { ...(runAt(this.para(sel.a.pa)?.runs as RRun[] ?? [], sel.a.o)?.s ?? {}), ...style }, d: style } as RRun]], { label: 'link' })\n return\n }\n this.patchRuns(sel, (r) => ({ ...r, href, lk, s: { ...(r.s ?? {}), ...style }, d: { ...(r.d ?? {}), ...style } }))\n }\n\n /** applies `fn` to the text runs inside the selection */\n private patchRuns(sel: Sel, fn: (r: RRun) => RRun) {\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa, i) => {\n const p = this.para(pa)!\n const a = i === 0 ? r.s.o : 0\n const b = i === r.pas.length - 1 ? r.e.o : plen(p.runs as RRun[])\n const [left, rest] = splitRuns(p.runs as RRun[], a)\n const [mid, right] = splitRuns(rest, b - a)\n return this.withRuns(p, [...left, ...mid.map((x) => (x.t === 'text' ? fn(x) : x)), ...right])\n })\n this.replace(r.pas, next, sel, { label: 'format' })\n }\n\n insertPageBreak() {\n const sel = this.input.sel()\n if (!sel) return\n const p = this.para(sel.f.pa)\n if (!p || sel.f.pa.includes('.')) return\n const [l, r] = splitRuns(p.runs as RRun[], sel.f.o)\n const [a, b] = this.split(p, l, r, false)\n const b2 = { ...b, pb: true, pd: { ...(b.pd ?? {}), pageBreak: true } }\n this.replace([sel.f.pa], [a, b2], { a: { pa: shiftPa(sel.f.pa, 1), o: 0 }, f: { pa: shiftPa(sel.f.pa, 1), o: 0 } }, { label: 'pagebreak', want: true })\n }\n\n /** scales the selected image (factor) or fits it to the page width */\n resizeImage(f: number | 'fit') {\n const sel = this.input.sel()\n if (!sel) return\n const [s] = ordered(this, sel)\n this.patchObjects(sel, (x) => {\n if (x.t !== 'img') return x\n const k = f === 'fit' ? this.contentW / x.w : f\n return { ...x, w: +(x.w * k).toFixed(1), h: +(x.h * k).toFixed(1), resized: true }\n })\n this.pendingSel = { a: s, f: { ...s, o: s.o + 1 } }\n }\n\n private patchObjects(sel: Sel, fn: (x: Inline) => Inline) {\n const [s, e] = ordered(this, sel)\n const p = this.para(s.pa)\n if (!p || s.pa !== e.pa) return\n const [left, rest] = splitRuns(p.runs as RRun[], s.o)\n const [mid, right] = splitRuns(rest, e.o - s.o)\n this.replace([s.pa], [this.withRuns(p, [...left, ...(mid as Inline[]).map(fn), ...right] as RRun[])], sel, { label: 'image' })\n }\n\n pasteRich(sel: Sel, data: DataTransfer): boolean {\n const files = Array.from(data.files ?? []).filter((f) => f.type.startsWith('image/'))\n if (files.length) {\n void this.insertImages(files, sel)\n return true\n }\n const html = data.getData('text/html')\n if (!html) return false\n const paras = htmlToParas(html)\n if (!paras.length) return false\n void (async () => {\n const links = new Map<string, string>()\n for (const p of paras) for (const r of p.runs) if (r.t === 'text' && r.href && !links.has(r.href)) links.set(r.href, await this.client.call('docx.link', r.href))\n const lines = paras.map((p) => p.runs.map((r) => (r.t === 'text' && r.href ? { ...r, lk: links.get(r.href) } : r)) as RRun[])\n const headingId = (n: number) => this.styles.find((s) => s.name.toLowerCase() === `heading ${n}`)?.id\n const props = paras.map((p) => {\n if (!p.heading && !p.list) return undefined\n return (q: Paragraph) => {\n const pd: ParaDirty = { ...(q.pd ?? {}) }\n const h = p.heading ? headingId(p.heading) : undefined\n if (h) pd.style = h\n if (p.list) pd.list = p.list\n return { ...q, pd, sid: h ?? q.sid, edited: true }\n }\n })\n opInsertRuns(this, sel, lines, { label: 'paste' }, props as unknown as ((p: RichParaLike) => RichParaLike)[])\n })()\n return true\n }\n\n // ---------------------------------------------------------------- styles\n\n /** applies a built-in style (Title, Heading 1…), creating it in the document when missing */\n async applyCanon(kind: CanonStyle) {\n const sel = this.input.sel()\n if (!sel) return\n let id = this.styles.find((s) => s.canon === kind)?.id\n if (!id) {\n const r = await this.client.call('docx.style', kind)\n this.styles = r.styles\n this.onStyles?.(r.styles)\n id = r.id\n }\n if (id) this.setPara({ style: id }, {}, sel)\n }\n\n // ---------------------------------------------------------------- images\n\n /** selects the inline object at (pa, o) */\n selectObject(pa: string, o: number) {\n const sel = { a: { pa, o }, f: { pa, o: o + 1 } }\n this.input.restore(sel)\n this.onSelection(sel)\n }\n\n private imageSel(): Sel | null {\n const sel = this.input.sel()\n const img = sel && this.state(sel)?.img\n return img ? { a: { pa: img.pa, o: img.o }, f: { pa: img.pa, o: img.o + 1 } } : null\n }\n\n private patchImage(fn: (x: Inline & { t: 'img' }) => Inline) {\n const sel = this.imageSel()\n if (!sel) return\n this.patchObjects(sel, (x) => (x.t === 'img' ? fn(x) : x))\n this.pendingSel = sel\n }\n\n /** exact size in pt */\n setImageSize(w: number, h: number) {\n this.patchImage((x) => ({ ...x, w: +Math.max(4, w).toFixed(1), h: +Math.max(4, h).toFixed(1), resized: true }))\n }\n\n /** natural pixel size of the picture → pt, limited to the text width */\n imageOriginal(nw: number, nh: number) {\n const k = Math.min(1, this.contentW / Math.max(1, nw * 0.75))\n this.setImageSize(nw * 0.75 * k, nh * 0.75 * k)\n }\n\n setAltText(alt: string) {\n this.patchImage((x) => ({ ...x, alt: alt || undefined, altSet: true }))\n }\n\n async replaceImage(file: Blob) {\n const sel = this.imageSel()\n if (!sel) return\n const ext = (file.type.split('/')[1] ?? 'png').replace('svg+xml', 'svg').replace('jpeg', 'jpg')\n const { rid, path } = await this.client.call('docx.image', await file.arrayBuffer(), ext)\n const dims = await imageSize(file)\n this.input.restore(sel)\n this.patchImage((x) => {\n // keep the current width, follow the new picture's proportions\n const h = +(x.w * (dims.h / Math.max(1, dims.w))).toFixed(1)\n return { ...x, target: path, rid, repl: !!x.src, h, resized: true }\n })\n }\n\n /** deletes the selection (or the selected object) */\n deleteSelection() {\n const sel = this.input.sel()\n if (sel && !collapsed(sel)) opInsert(this, sel, '')\n }\n\n insertText(text: string) {\n const sel = this.input.sel()\n if (sel) opInsert(this, sel, text)\n }\n\n // ---------------------------------------------------------------- paint format\n\n /** copies the caret's character formatting; the next selection receives it */\n copyFormat() {\n if (this.painter) {\n this.painter = null\n this.onPainter?.(false)\n return\n }\n const st = this.state()\n if (!st) return\n this.painter = {\n b: st.b,\n i: st.i,\n u: st.u ? 'single' : 'none',\n strike: st.strike,\n color: st.color ?? null,\n hl: st.hl ?? null,\n va: st.va ?? null,\n sz: st.sz,\n font: st.font ? (/^\\s*\"?([^\",]+)/.exec(st.font)?.[1] ?? st.font) : undefined,\n } as RunSet\n this.onPainter?.(true)\n }\n\n /** applies the copied formatting to the current selection (after the mouse is released) */\n applyPainter(): boolean {\n const set = this.painter\n const sel = this.input.readSel()\n if (!set || !sel || collapsed(sel)) return false\n this.painter = null\n this.onPainter?.(false)\n const s: Partial<RunStyle> = {}\n for (const [k, v] of Object.entries(set)) {\n if (k === 'font') (s as Record<string, unknown>).font = v ? cssFont(v as string) : undefined\n else if (k === 'u') (s as Record<string, unknown>).u = v\n else (s as Record<string, unknown>)[k] = v === null ? undefined : v\n }\n this.format(s, set)\n return true\n }\n\n // ---------------------------------------------------------------- toolbar state\n\n state(sel = this.input.sel()): FormatState | null {\n if (!sel) return null\n const [s] = ordered(this, sel)\n const p = this.para(s.pa)\n if (!p) return null\n const run = runAt(p.runs as RRun[], collapsed(sel) ? s.o : s.o + (plen(p.runs as RRun[]) > s.o ? 1 : 0)) as (Inline & { t: 'text' }) | undefined\n const rs: RunStyle = { ...(run?.s ?? {}), ...(collapsed(sel) ? this.pend?.s ?? {} : {}) }\n const [, e] = ordered(this, sel)\n let img: FormatState['img']\n if (s.pa === e.pa && e.o === s.o + 1) {\n const [, right] = splitRuns(p.runs as RRun[], s.o)\n const x = right[0] as Inline | undefined\n if (x?.t === 'img') img = { w: x.w, h: x.h, alt: x.alt, target: x.target, pa: s.pa, o: s.o }\n }\n return {\n line: p.pd?.line ?? (p.ps.lineRule === 'auto' || !p.ps.lineRule ? p.ps.line : undefined),\n va: rs.va,\n link: (run as { href?: string } | undefined)?.href,\n inTable: s.pa.includes('.'),\n img,\n b: !!rs.b,\n i: !!rs.i,\n u: !!rs.u && rs.u !== 'none',\n strike: !!rs.strike,\n color: rs.color,\n hl: rs.hl,\n sz: rs.sz ?? p.markSz ?? this.defaultSz,\n font: rs.font ?? p.markFont ?? this.defaultFont,\n align: p.ps.align ?? 'left',\n style: p.sid,\n lst: p.lst,\n canUndo: this.canUndo,\n canRedo: this.canRedo,\n }\n }\n\n private emitState(sel: Sel | null) {\n const st = sel ? this.state(sel) : null\n this.onState?.(st)\n this.onImage?.(st?.img ?? null)\n }\n\n onSelection(sel: Sel | null) {\n if (sel && this.pend && (sel.a.pa !== this.pend.at.pa || sel.a.o !== this.pend.at.o)) this.pend = null\n this.emitState(sel)\n }\n}\n\ntype RichParaLike = Parameters<NonNullable<Parameters<typeof opInsertRuns>[4]>[number]>[0]\n\nfunction imageSize(blob: Blob): Promise<{ w: number; h: number }> {\n return new Promise((resolve) => {\n const url = URL.createObjectURL(blob)\n const img = new Image()\n img.onload = () => {\n resolve({ w: img.naturalWidth || 300, h: img.naturalHeight || 200 })\n URL.revokeObjectURL(url)\n }\n img.onerror = () => {\n resolve({ w: 300, h: 200 })\n URL.revokeObjectURL(url)\n }\n img.src = url\n })\n}\n","import { useEffect, useState, type CSSProperties } from 'react'\nimport type { CanonStyle, StyleInfo } from '../../core/docx/types'\nimport { MOD } from '../common/ContextMenu'\nimport { EditorBar } from '../common/Slots'\nimport { Btn, ColorBtn, Dropdown, fontName, fontOptions, GridPicker, Menu, pickFiles, Pop, Select, Sep, SizeBox, type DropOption } from '../edit/Toolbar'\nimport type { DocxEditor, FormatState } from './DocxEditor'\n\nconst HIGHLIGHTS = ['#ffff00', '#00ff00', '#00ffff', '#ff00ff', '#0000ff', '#ff0000', '#000080', '#008080', '#008000', '#800080', '#800000', '#808000', '#808080', '#c0c0c0', '#000000']\n\nconst LINE_SPACING = [\n { value: 1, label: 'Single' },\n { value: 1.15, label: '1.15' },\n { value: 1.5, label: '1.5' },\n { value: 2, label: 'Double' },\n { value: 2.5, label: '2.5' },\n { value: 3, label: 'Triple' },\n]\n\n/** built-in styles always offered (created in the document on first use) */\nconst CANON: { k: CanonStyle; label: string; look: CSSProperties }[] = [\n { k: 'normal', label: 'Normal text', look: {} },\n { k: 'title', label: 'Title', look: { fontSize: 22 } },\n { k: 'subtitle', label: 'Subtitle', look: { fontSize: 15, color: '#5a5a5a' } },\n { k: 'h1', label: 'Heading 1', look: { fontSize: 18, color: '#2f5496' } },\n { k: 'h2', label: 'Heading 2', look: { fontSize: 16, color: '#2f5496' } },\n { k: 'h3', label: 'Heading 3', look: { fontSize: 14, color: '#1f3763' } },\n { k: 'h4', label: 'Heading 4', look: { fontSize: 13, color: '#2f5496', fontStyle: 'italic' } },\n { k: 'h5', label: 'Heading 5', look: { fontSize: 13, color: '#2f5496' } },\n { k: 'h6', label: 'Heading 6', look: { fontSize: 13, color: '#1f3763', fontStyle: 'italic' } },\n]\n\nconst SYMBOLS = [\n '©', '®', '™', '§', '¶', '†', '‡', '•', '…', '–', '—', '‰',\n '€', '£', '¥', '¢', '₫', '$', '°', '±', '×', '÷', '≈', '≠',\n '≤', '≥', '∞', '√', '∑', '∏', '∫', 'π', 'µ', 'Ω', 'α', 'β',\n '←', '→', '↑', '↓', '↔', '⇒', '✓', '✗', '★', '☆', '♥', '♦',\n '«', '»', '“', '”', '‘', '’', '¼', '½', '¾', '¹', '²', '³',\n]\n\n/** how a style looks in the picker (size clamped to fit the menu) */\nfunction stylePreview(s: StyleInfo | undefined): CSSProperties | undefined {\n const p = s?.preview\n if (!p) return undefined\n return {\n fontSize: p.sz ? Math.max(12, Math.min(22, p.sz)) : undefined,\n fontWeight: p.b ? 700 : undefined,\n fontStyle: p.i ? 'italic' : undefined,\n color: p.color && !/^#?f{6}$/i.test(p.color.replace('#', '')) ? p.color : undefined,\n fontFamily: p.font,\n lineHeight: 1.25,\n }\n}\n\nexport interface ImageActions {\n original: () => void\n replace: () => void\n alt: () => void\n download: () => void\n}\n\nexport function DocxToolbar(props: {\n editor: DocxEditor\n styles: StyleInfo[]\n onFind: () => void\n outline: boolean\n onOutline: () => void\n painter: boolean\n onLink: () => void\n image: ImageActions\n}) {\n const { editor, styles, image } = props\n const [st, setSt] = useState<FormatState | null>(null)\n useEffect(() => {\n editor.onState = setSt\n return () => {\n editor.onState = undefined\n }\n }, [editor])\n const font = fontName(st?.font)\n const dis = !st\n const sz = st?.sz ? Math.round(st.sz * 2) / 2 : undefined\n const line = st?.line ? Math.round(st.line * 100) / 100 : ''\n\n // style picker: built-ins first (with shortcuts), then the document's other quick styles\n const alt = /Mac|iPhone|iPad/.test(typeof navigator !== 'undefined' ? navigator.platform : '') ? '⌥' : 'Alt+'\n const styleOpts: DropOption<string>[] = CANON.map(({ k, label, look }, i) => {\n const s = styles.find((x) => x.canon === k)\n const hint = k === 'normal' ? `${MOD}${alt}0` : k.startsWith('h') ? `${MOD}${alt}${k.slice(1)}` : undefined\n return { value: s?.id ?? `@${k}`, label, hint, style: { lineHeight: 1.25, ...(k === 'normal' ? {} : (stylePreview(s) ?? look)) }, sep: i === 1 }\n })\n styles\n .filter((s) => !s.canon)\n .forEach((s, i) => styleOpts.push({ value: s.id, label: s.name, style: stylePreview(s), sep: i === 0 }))\n const styleValue = st?.style && styleOpts.some((o) => o.value === st.style) ? st.style : st && !st.style ? (styles.find((x) => x.canon === 'normal')?.id ?? '') : ''\n\n return (\n <EditorBar>\n <Btn icon=\"undo\" title={`Undo (${MOD}Z)`} disabled={!editor.canUndo} onClick={() => editor.undo()} />\n <Btn icon=\"redo\" title={`Redo (${MOD}Y)`} disabled={!editor.canRedo} onClick={() => editor.redo()} />\n <Btn icon=\"paint\" title=\"Paint format (click, then select text)\" active={props.painter} disabled={dis} onClick={() => editor.copyFormat()} />\n {st?.inTable && (\n <>\n <Sep />\n <Menu\n title=\"Table\"\n label=\"Table\"\n icon=\"table\"\n items={[\n { value: 'rowAbove', label: 'Insert row above', icon: 'rowAbove' },\n { value: 'rowBelow', label: 'Insert row below', icon: 'rowBelow' },\n { value: 'colLeft', label: 'Insert column left', icon: 'colLeft' },\n { value: 'colRight', label: 'Insert column right', icon: 'colRight' },\n { value: 'delRow', label: 'Delete row', icon: 'delRow', sep: true },\n { value: 'delCol', label: 'Delete column', icon: 'delCol' },\n { value: 'delTable', label: 'Delete table', icon: 'trash' },\n ]}\n onPick={(v) => editor.tableOp(v as Parameters<DocxEditor['tableOp']>[0])}\n />\n </>\n )}\n {st?.img && (\n <>\n <Sep />\n <Btn icon=\"minus\" title=\"Smaller\" onClick={() => editor.resizeImage(0.8)} />\n <span className=\"de-tb-hint\" style={{ margin: 0 }}>\n {Math.round(st.img.w)}×{Math.round(st.img.h)}pt\n </span>\n <Btn icon=\"plus\" title=\"Larger\" onClick={() => editor.resizeImage(1.25)} />\n <Btn icon=\"fit\" title=\"Fit page width\" onClick={() => editor.resizeImage('fit')} />\n <Btn icon=\"imgOrig\" title=\"Original size\" onClick={image.original} />\n <Btn icon=\"imgReplace\" title=\"Replace image\" onClick={image.replace} />\n <Btn icon=\"alt\" title=\"Alt text\" active={!!st.img.alt} onClick={image.alt} />\n <Btn icon=\"save\" title=\"Download image\" onClick={image.download} />\n <Btn icon=\"trash\" title=\"Delete image\" onClick={() => editor.deleteSelection()} />\n </>\n )}\n <Sep />\n <Select\n title=\"Paragraph style\"\n width={118}\n menuWidth={250}\n disabled={dis}\n value={styleValue}\n placeholder=\"Style\"\n options={styleOpts}\n onChange={(v) => (v.startsWith('@') ? void editor.applyCanon(v.slice(1) as CanonStyle) : editor.setPara({ style: v }))}\n />\n <Sep />\n <Select title=\"Font\" width={118} menuWidth={200} disabled={dis} value={font} placeholder=\"Font\" options={fontOptions(font)} onChange={(v) => editor.setFont(v)} />\n <Sep />\n <SizeBox value={sz} disabled={dis} onChange={(v) => editor.setSize(v)} />\n <Sep />\n <Btn icon=\"bold\" title={`Bold (${MOD}B)`} active={st?.b} disabled={dis} onClick={() => editor.toggle('b')} />\n <Btn icon=\"italic\" title={`Italic (${MOD}I)`} active={st?.i} disabled={dis} onClick={() => editor.toggle('i')} />\n <Btn icon=\"underline\" title={`Underline (${MOD}U)`} active={st?.u} disabled={dis} onClick={() => editor.toggle('u')} />\n <Btn icon=\"strike\" title=\"Strikethrough\" active={st?.strike} disabled={dis} onClick={() => editor.toggle('strike')} />\n <ColorBtn icon=\"color\" title=\"Text color\" value={st?.color} onPick={(c) => editor.setColor(c)} noneLabel=\"Automatic\" />\n <ColorBtn icon=\"highlight\" title=\"Highlight color\" value={st?.hl} palette={HIGHLIGHTS} onPick={(c) => editor.setHighlight(c)} />\n <Sep />\n <Btn icon=\"link\" title={`Insert link (${MOD}K)`} active={!!st?.link} disabled={dis} onClick={props.onLink} />\n <Btn icon=\"image\" title=\"Insert image\" disabled={dis} onClick={() => void pickFiles().then((f) => void (f.length && editor.insertImages(f)))} />\n <Pop icon=\"table\" title=\"Insert table\" disabled={dis || st?.inTable}>\n {(close) => <GridPicker onPick={(r, c) => (close(), editor.insertTable(r, c))} />}\n </Pop>\n <Pop icon=\"omega\" title=\"Special characters\" disabled={dis}>\n {(close) => (\n <div className=\"de-symbols\">\n {SYMBOLS.map((c) => (\n <button key={c} type=\"button\" title={`U+${c.codePointAt(0)!.toString(16).toUpperCase().padStart(4, '0')}`} onClick={() => (close(), editor.insertText(c))}>\n {c}\n </button>\n ))}\n </div>\n )}\n </Pop>\n <Sep />\n <Btn icon=\"alignLeft\" title=\"Align left\" active={st?.align === 'left'} disabled={dis} onClick={() => editor.setPara({ align: 'left' }, { align: 'left' })} />\n <Btn icon=\"alignCenter\" title=\"Center\" active={st?.align === 'center'} disabled={dis} onClick={() => editor.setPara({ align: 'center' }, { align: 'center' })} />\n <Btn icon=\"alignRight\" title=\"Align right\" active={st?.align === 'right'} disabled={dis} onClick={() => editor.setPara({ align: 'right' }, { align: 'right' })} />\n <Btn icon=\"justify\" title=\"Justify\" active={st?.align === 'justify'} disabled={dis} onClick={() => editor.setPara({ align: 'justify' }, { align: 'justify' })} />\n <Dropdown\n title=\"Line & paragraph spacing\"\n icon=\"lineSpacing\"\n label={null}\n menuWidth={150}\n disabled={dis}\n value={line}\n options={LINE_SPACING}\n onChange={(v) => editor.setPara({ line: v }, { line: v, lineRule: 'auto' })}\n />\n <Sep />\n <Btn icon=\"bullets\" title=\"Bulleted list\" active={st?.lst === 'bullet'} disabled={dis} onClick={() => editor.toggleList('bullet')} />\n <Btn icon=\"numbers\" title=\"Numbered list\" active={st?.lst === 'number'} disabled={dis} onClick={() => editor.toggleList('number')} />\n <Btn icon=\"outdent\" title=\"Decrease indent (Shift+Tab)\" disabled={dis} onClick={() => editor.indent(-1)} />\n <Btn icon=\"indent\" title=\"Increase indent (Tab)\" disabled={dis} onClick={() => editor.indent(1)} />\n <Sep />\n <Btn icon=\"sup\" title=\"Superscript\" active={st?.va === 'sup'} disabled={dis} onClick={() => editor.format({ va: st?.va === 'sup' ? undefined : 'sup' }, { va: st?.va === 'sup' ? null : 'sup' })} />\n <Btn icon=\"sub\" title=\"Subscript\" active={st?.va === 'sub'} disabled={dis} onClick={() => editor.format({ va: st?.va === 'sub' ? undefined : 'sub' }, { va: st?.va === 'sub' ? null : 'sub' })} />\n <Btn icon=\"pagebreak\" title={`Page break (${MOD}Enter)`} disabled={dis || st?.inTable} onClick={() => editor.insertPageBreak()} />\n <Btn icon=\"clear\" title={`Clear formatting (${MOD}\\\\)`} disabled={dis} onClick={() => editor.clearFormat()} />\n <Sep />\n <Btn icon=\"outline\" title=\"Document outline\" active={props.outline} onClick={props.onOutline} />\n <Btn icon=\"search\" title={`Find & replace (${MOD}F)`} onClick={props.onFind} />\n </EditorBar>\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { Btn } from '../edit/Toolbar'\n\nexport interface Match {\n pa: string\n a: number\n b: number\n bi: number\n}\n\nexport function FindBar(props: {\n query: string\n index: number\n count: number\n editable: boolean\n onQuery: (q: string) => void\n onNav: (d: 1 | -1) => void\n onClose: () => void\n onReplace: (text: string, all: boolean) => void\n placeholder?: string\n /** extra controls (match case…) under the search row */\n options?: ReactNode\n /** open with the replace row visible */\n replace?: boolean\n}) {\n const ref = useRef<HTMLInputElement>(null)\n const [rep, setRep] = useState('')\n const [showRep, setShowRep] = useState(!!props.replace)\n useEffect(() => {\n ref.current?.focus()\n ref.current?.select()\n }, [])\n return (\n <div className=\"de-find\" role=\"search\" onKeyDown={(e) => e.key === 'Escape' && props.onClose()}>\n <div className=\"de-find-row\">\n <input\n ref={ref}\n value={props.query}\n placeholder={props.placeholder ?? 'Find in document'}\n aria-label=\"Find\"\n onChange={(e) => props.onQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n props.onNav(e.shiftKey ? -1 : 1)\n }\n }}\n />\n <span className=\"de-find-count\">{props.query ? (props.count ? `${Math.min(props.index + 1, props.count)} / ${props.count}` : '0 / 0') : ''}</span>\n <Btn icon=\"up\" title=\"Previous (Shift+Enter)\" onClick={() => props.onNav(-1)} disabled={!props.count} />\n <Btn icon=\"down\" title=\"Next (Enter)\" onClick={() => props.onNav(1)} disabled={!props.count} />\n {props.editable && <Btn label=\"⇄\" title=\"Replace\" active={showRep} onClick={() => setShowRep((v) => !v)} />}\n <Btn icon=\"close\" title=\"Close (Esc)\" onClick={props.onClose} />\n </div>\n {props.options && <div className=\"de-find-row de-find-opts\">{props.options}</div>}\n {props.editable && showRep && (\n <div className=\"de-find-row\">\n <input value={rep} placeholder=\"Replace with\" aria-label=\"Replace with\" onChange={(e) => setRep(e.target.value)} />\n <button type=\"button\" className=\"de-btn\" disabled={!props.count} onClick={() => props.onReplace(rep, false)}>\n Replace\n </button>\n <button type=\"button\" className=\"de-btn\" disabled={!props.count} onClick={() => props.onReplace(rep, true)}>\n All\n </button>\n </div>\n )}\n </div>\n )\n}\n","import { memo, type CSSProperties, type ReactNode } from 'react'\nimport type { Block, Inline, Paragraph, ParaStyle, RunStyle, Table } from '../../core/docx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { useMediaUrl } from '../common/hooks'\n\nexport interface RenderCtx {\n client: DocumentClient\n /** 0-based page index, -1 while measuring */\n page: number\n pages: number\n measuring: boolean\n editable: boolean\n}\n\nconst pt = (v: number | undefined) => (v ? `${+v.toFixed(2)}pt` : undefined)\n\nconst UNDERLINE_STYLE: Record<string, CSSProperties['textDecorationStyle']> = {\n double: 'double', dotted: 'dotted', dottedHeavy: 'dotted', dash: 'dashed', dashedHeavy: 'dashed', dashLong: 'dashed',\n wave: 'wavy', wavyHeavy: 'wavy', wavyDouble: 'wavy',\n}\n\nexport function runCss(s: RunStyle | undefined): CSSProperties {\n const css: CSSProperties = {}\n if (!s) return css\n if (s.b) css.fontWeight = 700\n else if (s.b === false) css.fontWeight = 400\n if (s.i) css.fontStyle = 'italic'\n else if (s.i === false) css.fontStyle = 'normal'\n const u = s.u && s.u !== 'none'\n const deco = [u ? 'underline' : '', s.strike || s.dstrike ? 'line-through' : ''].filter(Boolean).join(' ')\n if (deco) css.textDecoration = deco\n else if (s.u === 'none' || s.strike === false) css.textDecoration = 'none'\n if (u && UNDERLINE_STYLE[s.u!]) css.textDecorationStyle = UNDERLINE_STYLE[s.u!]\n if (s.dstrike) css.textDecorationStyle = 'double'\n if (s.color) css.color = s.color\n if (s.sz) css.fontSize = `${s.va ? s.sz * 0.65 : s.sz}pt`\n if (s.font) css.fontFamily = s.font\n if (s.hl || s.shd) css.background = s.hl ?? s.shd\n if (s.va) css.verticalAlign = s.va === 'sup' ? 'super' : 'sub'\n if (s.caps) css.textTransform = 'uppercase'\n if (s.smallCaps) css.fontVariant = 'small-caps'\n if (s.spacing) css.letterSpacing = `${s.spacing}pt`\n return css\n}\n\nfunction lineHeight(ps: ParaStyle): string | number | undefined {\n if (!ps.line) return 1.17\n if (ps.lineRule === 'exact') return `${ps.line}pt`\n if (ps.lineRule === 'atLeast') return `max(${ps.line}pt, 1.17em)`\n return +(ps.line * 1.17).toFixed(3)\n}\n\n/** contextual spacing flags: 'b' drop space before, 'a' drop space after */\nexport type Spacing = '' | 'b' | 'a' | 'ba'\n\nexport function contextual(p: Block | undefined, prev: Block | undefined, next: Block | undefined): Spacing {\n if (!p || p.t !== 'p' || !p.ps.contextual) return ''\n const b = prev?.t === 'p' && prev.sid === p.sid ? 'b' : ''\n const a = next?.t === 'p' && next.sid === p.sid ? 'a' : ''\n return (b + a) as Spacing\n}\n\nfunction paraCss(ps: ParaStyle, sp: Spacing): CSSProperties {\n const css: CSSProperties = {\n paddingTop: sp.includes('b') ? undefined : pt(ps.before),\n paddingBottom: sp.includes('a') ? undefined : pt(ps.after),\n paddingLeft: pt(ps.indL),\n paddingRight: pt(ps.indR),\n textIndent: pt(ps.indFirst),\n textAlign: ps.align,\n lineHeight: lineHeight(ps),\n }\n if (ps.shd) css.background = ps.shd\n const b = (x: ParaStyle['bTop']) => (x ? `${x.w}pt ${x.style} ${x.color}` : undefined)\n if (ps.bTop) css.borderTop = b(ps.bTop)\n if (ps.bBottom) css.borderBottom = b(ps.bBottom)\n if (ps.bLeft) css.borderLeft = b(ps.bLeft)\n if (ps.bRight) css.borderRight = b(ps.bRight)\n return css\n}\n\nfunction Img({ ctx, target, w, h, alt }: { ctx: RenderCtx; target: string; w: number; h: number; alt?: string }) {\n const url = useMediaUrl(ctx.client, target, !ctx.measuring)\n const size = { width: `${w}pt`, height: `${h}pt` }\n if (ctx.measuring || !url) return <span className=\"de-img-missing\" style={{ ...size, borderStyle: 'none' }} />\n if (url === 'unsupported') {\n return (\n <span className=\"de-img-missing\" style={size} title={target}>\n {target.split('.').pop()?.toUpperCase()} image\n </span>\n )\n }\n return <img src={url} alt={alt ?? ''} style={{ ...size, verticalAlign: 'bottom', display: 'inline-block' }} draggable={false} />\n}\n\nfunction InlineView({ x, ctx, o }: { x: Inline; ctx: RenderCtx; o: number }): ReactNode {\n const obj = { 'data-o': o, 'data-obj': '', contentEditable: ctx.editable ? false : undefined } as const\n switch (x.t) {\n case 'text': {\n const span = (\n <span data-o={o} style={runCss(x.s)}>\n {x.text}\n </span>\n )\n return x.href && !ctx.measuring && !ctx.editable ? (\n <a href={x.href} target={x.href.startsWith('#') ? undefined : '_blank'} rel=\"noreferrer noopener\">\n {span}\n </a>\n ) : (\n span\n )\n }\n case 'field': {\n const v = x.kind === 'PAGE' ? (ctx.page >= 0 ? ctx.page + 1 : 1) : ctx.pages || 1\n return (\n <span {...obj} style={runCss(x.s)}>\n {v}\n </span>\n )\n }\n case 'ref':\n return (\n <span {...obj} style={runCss(x.s)}>\n {x.text}\n </span>\n )\n case 'img': {\n const img = <Img ctx={ctx} target={x.target} w={x.w} h={x.h} alt={x.alt} />\n return (\n <span {...obj}>\n {x.href && !ctx.measuring && !ctx.editable ? (\n <a href={x.href} target=\"_blank\" rel=\"noreferrer noopener\">\n {img}\n </a>\n ) : (\n img\n )}\n </span>\n )\n }\n case 'box':\n return (\n <span\n {...obj}\n className=\"de-tbox\"\n style={{ width: x.w ? `${x.w}pt` : undefined, minHeight: x.h ? `${x.h}pt` : undefined, background: x.fill, border: x.border }}\n >\n {x.blocks.map((b, i) => (\n <BlockView key={i} block={b} ctx={ctx} />\n ))}\n </span>\n )\n case 'shape':\n return x.label ? (\n <span {...obj} className=\"de-ph\" style={{ width: `${x.w}pt`, height: `${x.h}pt` }}>\n {x.label}\n </span>\n ) : (\n <span {...obj} />\n )\n }\n}\n\nfunction ParaView({ p, ctx, pa, sp }: { p: Paragraph; ctx: RenderCtx; pa?: string; sp: Spacing }) {\n const hang = p.ps.indFirst && p.ps.indFirst < 0 ? -p.ps.indFirst : 0\n const visible = p.runs.length > 0\n const style = paraCss(p.ps, sp)\n if (!visible) {\n style.fontSize = pt(p.markSz)\n if (p.markFont) style.fontFamily = p.markFont\n }\n const editable = ctx.editable && pa !== undefined\n let o = 0\n const runs = p.runs.map((x, i) => {\n const node = <InlineView key={i} x={x} ctx={ctx} o={o} />\n o += x.t === 'text' ? x.text.length : 1\n return node\n })\n return (\n <div className=\"de-p\" style={style} data-pa={pa} contentEditable={ctx.editable && !editable ? false : undefined}>\n {p.marker && (\n <span className=\"de-marker\" contentEditable={ctx.editable ? false : undefined} style={{ ...runCss(p.marker.s), minWidth: p.marker.tab && hang ? `${hang}pt` : undefined }}>\n {p.marker.text}\n {p.marker.tab && !hang ? '\\t' : ''}\n </span>\n )}\n {runs}\n {!visible &&\n (editable ? (\n <span data-o={0} data-empty=\"\">\n {'\\u200B'}\n </span>\n ) : (\n '\\u200B'\n ))}\n </div>\n )\n}\n\nfunction TableView({ t, ctx, pa }: { t: Table; ctx: RenderCtx; pa?: string }) {\n const total = t.cols.reduce((a, b) => a + b, 0)\n const style: CSSProperties = { width: total ? `${total}pt` : '100%' }\n if (t.align === 'center') style.margin = '0 auto'\n else if (t.align === 'right') style.marginLeft = 'auto'\n else if (t.indL) style.marginLeft = `${t.indL}pt`\n return (\n <table className=\"de-tbl\" style={style}>\n {total > 0 && (\n <colgroup>\n {t.cols.map((w, i) => (\n <col key={i} style={{ width: `${w}pt` }} />\n ))}\n </colgroup>\n )}\n <tbody>\n {t.rows.map((row, ri) => (\n <tr key={ri} style={{ height: row.h ? `${row.h}pt` : undefined }}>\n {row.cells.map((c, ci) => (\n <td\n key={ci}\n colSpan={c.colSpan > 1 ? c.colSpan : undefined}\n rowSpan={c.rowSpan > 1 ? c.rowSpan : undefined}\n style={{\n borderTop: c.borders.t,\n borderRight: c.borders.r,\n borderBottom: c.borders.b,\n borderLeft: c.borders.l,\n background: c.shd,\n verticalAlign: c.vAlign,\n padding: `${c.pad[0]}pt ${c.pad[1]}pt ${c.pad[2]}pt ${c.pad[3]}pt`,\n }}\n >\n {c.blocks.map((b, i) => (\n <BlockView\n key={b.t === 'p' ? `${i}:${b.ver ?? 0}` : i}\n block={b}\n ctx={ctx}\n pa={pa !== undefined && b.t === 'p' && b.pid !== undefined && !b.ro ? `${pa}.${ri}.${ci}.${i}` : undefined}\n sp={contextual(b, c.blocks[i - 1], c.blocks[i + 1])}\n nested\n />\n ))}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport interface BlockViewProps {\n block: Block\n ctx: RenderCtx\n /** editable address (top-level: block index; table: block index used as prefix) */\n pa?: string\n sp?: Spacing\n nested?: boolean\n}\n\nexport const BlockView = memo(function BlockView({ block, ctx, pa, sp = '', nested }: BlockViewProps) {\n switch (block.t) {\n case 'p':\n return <ParaView p={block} ctx={ctx} pa={pa} sp={sp} />\n case 'tbl':\n return (\n <div style={{ overflow: 'visible' }} contentEditable={ctx.editable && (nested || pa === undefined) ? false : undefined}>\n <TableView t={block} ctx={ctx} pa={nested ? undefined : pa} />\n </div>\n )\n default:\n return <div />\n }\n})\n","import { useEffect, useMemo, useRef, useState, type CSSProperties } from 'react'\nimport type { Block, DocxMeta, PageSetup, Paragraph } from '../../core/docx/types'\nimport { DEFAULT_PAGE } from '../../core/docx/types'\nimport { registerHost } from '../../collab/hosts'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { lowerIndex, useForceUpdate, useIsoLayoutEffect, useScroll, useSize } from '../common/hooks'\nimport { useViewer } from '../common/Slots'\nimport { Status } from '../common/Status'\nimport { ZoomControl, type Zoom } from '../common/ZoomControl'\nimport { ContextMenu, MOD, type MenuItem } from '../common/ContextMenu'\nimport { PromptDialog, Toast, type PromptSpec } from '../common/Dialog'\nimport { domFromPos, getSel, opInsert, posFromDom } from '../edit/input'\nimport { download, pickFiles } from '../edit/Toolbar'\nimport { runsText, type RRun } from '../edit/rich'\nimport { DocxEditor, type DocState, type FormatState } from './DocxEditor'\nimport { DocxToolbar } from './DocxToolbar'\nimport { FindBar, type Match } from './FindBar'\nimport { BlockView, contextual, type RenderCtx } from './render'\n\nconst PX = 4 / 3\nconst GAP = 16\nconst PAD = 24\n\ninterface PageSlice {\n start: number\n end: number\n used: number\n}\n\nfunction paginate(blocks: Block[], heights: WeakMap<Block, number>, count: number, avail: number): PageSlice[] {\n const pages: PageSlice[] = []\n let cur: PageSlice = { start: 0, end: 0, used: 0 }\n for (let i = 0; i < count; i++) {\n const b = blocks[i]\n const h = heights.get(b) ?? 0\n if (b.t === 'sect') {\n cur.end = i + 1\n if (b.kind !== 'continuous') {\n pages.push(cur)\n cur = { start: i + 1, end: i + 1, used: 0 }\n }\n continue\n }\n const forced = b.t === 'p' && b.pb && cur.end > cur.start\n if (forced || (cur.used > 0 && cur.used + h > avail)) {\n pages.push(cur)\n cur = { start: i, end: i, used: 0 }\n }\n cur.end = i + 1\n cur.used += h\n }\n if (cur.end > cur.start || !pages.length) pages.push(cur)\n return pages\n}\n\nconst started = new WeakSet<DocumentClient>()\n\n/** the rendered element of the inline object at (pa, o) — its <img> when it is a picture */\nfunction findObj(root: HTMLElement, pa: string, o: number): HTMLElement | null {\n for (const p of root.querySelectorAll<HTMLElement>(`[data-pa=\"${pa}\"]`)) {\n for (const sp of p.querySelectorAll<HTMLElement>(`[data-obj][data-o=\"${o}\"]`)) {\n if (sp.closest('[data-pa]') === p) return sp.querySelector('img') ?? sp\n }\n }\n return null\n}\n\ninterface Box {\n x: number\n y: number\n w: number\n h: number\n}\nconst HANDLES = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'] as const\n\n/** heading entries for the outline panel */\nfunction outlineOf(blocks: Block[], titleId: string | undefined) {\n const out: { bi: number; lvl: number; text: string }[] = []\n blocks.forEach((b, bi) => {\n if (b.t !== 'p' || b.pid === undefined) return\n const title = !!titleId && b.sid === titleId\n const lvl = title ? 0 : b.ps.outline\n if (lvl === undefined || lvl > 5) return\n const text = runsText(b.runs as RRun[]).trim()\n if (text) out.push({ bi, lvl: title ? 0 : lvl + (titleId ? 1 : 0), text })\n })\n return out\n}\nconst editable = (b: Block | undefined): b is Paragraph => !!b && b.t === 'p' && b.pid !== undefined && !b.ro\n\nexport interface DocxViewProps {\n client: DocumentClient\n onStatus?: (s: string) => void\n initialZoom?: Zoom\n}\n\nexport function DocxView({ client, onStatus, initialZoom = 'fit' }: DocxViewProps) {\n const viewer = useViewer()\n const st = useRef<DocState>({ blocks: [], heights: new WeakMap(), dirty: new Set(), frontier: 0 }).current\n const [version, bump] = useForceUpdate()\n const [meta, setMeta] = useState<DocxMeta | null>(null)\n const [done, setDone] = useState<{ error?: string } | null>(null)\n const [zoom, setZoom] = useState<Zoom>(initialZoom)\n const [scrollRef, size] = useSize<HTMLDivElement>()\n const scroll = useScroll(scrollRef)\n const pagesRef = useRef<HTMLDivElement>(null)\n const editor = useMemo(() => new DocxEditor(client, st, bump), [client, st, bump])\n const isEditing = viewer.editable && !!done && !done.error\n const [find, setFind] = useState<{ open: boolean; q: string; idx: number }>({ open: false, q: '', idx: 0 })\n const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number } | null>(null)\n const [prompt, setPrompt] = useState<PromptSpec | null>(null)\n const [toast, setToast] = useState<string | null>(null)\n const [outline, setOutline] = useState(false)\n const [painter, setPainter] = useState(false)\n const [img, setImg] = useState<FormatState['img'] | null>(null)\n const [imgBox, setImgBox] = useState<Box | null>(null)\n const resizing = useRef(false)\n /** pt per screen px of the picture being resized */\n const resizeRatio = useRef<number | null>(null)\n\n useEffect(() => {\n editor.onImage = (x) => setImg((p) => (p?.pa === x?.pa && p?.o === x?.o && p?.w === x?.w && p?.h === x?.h && p?.target === x?.target && p?.alt === x?.alt ? p : x))\n editor.onStyles = (styles) => setMeta((m) => (m ? { ...m, styles } : m))\n editor.onPainter = setPainter\n return () => {\n editor.onImage = editor.onStyles = editor.onPainter = undefined\n }\n }, [editor])\n\n // collaboration sessions edit through this editor once the document is fully loaded\n useEffect(() => (done && !done.error ? registerHost(client, 'docx', { editor, st }) : undefined), [client, editor, st, done])\n\n useEffect(() => {\n const offs = [\n client.on('docx:blocks', (b) => {\n for (const x of b) st.blocks.push(x)\n bump()\n }),\n client.on('docx:meta', (m) => {\n setMeta(m)\n if (m.styles) editor.styles = m.styles\n }),\n client.on('docx:done', setDone),\n ]\n if (!started.has(client)) {\n started.add(client)\n client.call('docx.start').catch(() => {})\n }\n return () => offs.forEach((f) => f())\n }, [client, bump, st, editor])\n\n const page: PageSetup = meta?.page ?? DEFAULT_PAGE\n const contentW = page.w - page.ml - page.mr\n const availPx = (page.h - page.mt - page.mb) * PX\n\n // ---- measurement: edited blocks first, then the not-yet-measured tail (time-sliced) ----\n const [batch, setBatch] = useState(40)\n const measureRef = useRef<HTMLDivElement>(null)\n const widthKey = `${contentW}|${meta?.font}|${meta?.sz}`\n const lastKey = useRef(widthKey)\n if (lastKey.current !== widthKey) {\n lastKey.current = widthKey\n st.heights = new WeakMap()\n st.dirty.clear()\n st.frontier = 0\n }\n const total = st.blocks.length\n const queue: { b: Block; i: number }[] = []\n for (const b of st.dirty) {\n if (queue.length >= 50) break\n const i = st.blocks.indexOf(b)\n if (i < 0) st.dirty.delete(b)\n else queue.push({ b, i })\n }\n const tailEnd = Math.min(total, st.frontier + batch)\n for (let i = st.frontier; i < tailEnd; i++) queue.push({ b: st.blocks[i], i })\n const renderStart = performance.now()\n const measureCtx = useMemo<RenderCtx>(() => ({ client, page: -1, pages: 0, measuring: true, editable: false }), [client])\n\n useIsoLayoutEffect(() => {\n const el = measureRef.current\n if (!el || !queue.length || !meta) return\n const hs = Array.from(el.children).map((c) => (c as HTMLElement).getBoundingClientRect().height)\n const dt = performance.now() - renderStart\n const id = setTimeout(() => {\n queue.forEach((q, k) => {\n st.heights.set(q.b, hs[k] ?? 0)\n st.dirty.delete(q.b)\n })\n if (tailEnd > st.frontier) st.frontier = tailEnd\n setBatch((b) => (dt < 10 ? Math.min(b * 2, 1500) : dt > 30 ? Math.max(10, b >> 1) : b))\n bump()\n }, 0)\n return () => clearTimeout(id)\n })\n\n const pages = useMemo(\n () => paginate(st.blocks, st.heights, Math.min(st.frontier, total), availPx),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [version, availPx, total],\n )\n\n // ---- layout ----\n const pageW = page.w * PX\n const pageH = page.h * PX\n const fit = size.w ? Math.max(0.2, Math.min(2, (size.w - PAD * 2) / pageW)) : 1\n const z = zoom === 'fit' ? Math.min(fit, 1.25) : zoom\n const complete = !!done && st.frontier >= total\n const pageHeights = pages.map((p) => Math.max(pageH, (page.mt + page.mb) * PX + p.used) * z)\n const tops: number[] = []\n let acc = PAD\n for (const h of pageHeights) {\n tops.push(acc)\n acc += h + GAP\n }\n const skeleton = complete ? 0 : 1\n const totalH = acc + skeleton * (pageH * z + GAP) + PAD - GAP\n const totalW = Math.max(size.w, pageW * z + PAD * 2)\n const left = Math.max(PAD, (totalW - pageW * z) / 2)\n\n const first = tops.length ? lowerIndex(tops, scroll.y - pageH * z) : 0\n const last = tops.length ? lowerIndex(tops, scroll.y + size.h + 200) : -1\n const pageCount = complete ? pages.length : 0\n // keep the page holding the caret mounted so the DOM selection survives scrolling\n const caretBi = isEditing && editor.input.lastSel ? Number(editor.input.lastSel.f.pa.split('.')[0]) : -1\n const caretPage = caretBi >= 0 ? pages.findIndex((p) => caretBi >= p.start && caretBi < p.end) : -1\n\n editor.contentW = contentW\n editor.defaultFont = meta?.font\n editor.defaultSz = meta?.sz\n const cur = tops.length ? lowerIndex(tops, scroll.y + size.h / 3) + 1 : 0\n // word count (debounced, off the typing path)\n const [words, setWords] = useState(0)\n useEffect(() => {\n if (!done) return\n const id = setTimeout(() => {\n let n = 0\n const count = (b: Block) => {\n if (b.t === 'p') n += runsText(b.runs as RRun[]).split(/\\s+/).filter((w) => /[\\p{L}\\p{N}]/u.test(w)).length\n else if (b.t === 'tbl') for (const r of b.rows) for (const c of r.cells) c.blocks.forEach(count)\n }\n st.blocks.forEach(count)\n setWords(n)\n }, 600)\n return () => clearTimeout(id)\n }, [version, done, st])\n const status = done?.error\n ? `Error: ${done.error}`\n : complete\n ? `Page ${cur} of ${pages.length} · ${words.toLocaleString()} words`\n : `Page ${cur} of ${pages.length}+ · loading…`\n\n // ---- editing wiring ----\n useEffect(() => {\n const el = pagesRef.current\n if (!isEditing || !el) return\n editor.input.attach(el)\n editor.onDirty = () => viewer.setDirty(true)\n return () => editor.input.detach()\n }, [isEditing, editor, viewer])\n\n useEffect(() => {\n editor.shortcut = (e: KeyboardEvent) => {\n const mod = e.metaKey || e.ctrlKey\n if (mod && e.key.toLowerCase() === 's') {\n void viewer.save()\n return true\n }\n if (mod && e.key.toLowerCase() === 'f') {\n setFind((f) => ({ ...f, open: true }))\n return true\n }\n if (mod && e.key === 'Enter') {\n editor.insertPageBreak()\n return true\n }\n if (mod && e.key.toLowerCase() === 'k') {\n askLink()\n return true\n }\n // Ctrl/⌘+Alt+0…6: Normal text, Heading 1…6\n if (mod && e.altKey && /^Digit[0-6]$/.test(e.code)) {\n const n = Number(e.code.slice(5))\n void editor.applyCanon(n ? (`h${n}` as 'h1') : 'normal')\n return true\n }\n if (mod && e.key === '\\\\') {\n editor.clearFormat()\n return true\n }\n if (e.key === 'Escape' && editor.painter) {\n editor.copyFormat()\n return true\n }\n return false\n }\n }, [editor, viewer]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useIsoLayoutEffect(() => {\n const sel = editor.pendingSel\n if (!sel || !pagesRef.current) return\n if (!editor.input.restore(sel)) {\n // caret paragraph not rendered (scrolled away): bring its page into view, retry next render\n const bi = Number(sel.f.pa.split('.')[0])\n const pi = pages.findIndex((p) => bi >= p.start && bi < p.end)\n if (pi >= 0 && scrollRef.current) scrollRef.current.scrollTop = Math.max(0, tops[pi] - 16)\n if (pi < 0 || (pi >= first && pi <= last)) editor.pendingSel = null\n return\n }\n editor.pendingSel = null\n // keep the caret visible\n const ds = getSel(pagesRef.current)\n const range = ds?.rangeCount ? ds.getRangeAt(0) : null\n const sc = scrollRef.current\n if (range && sc) {\n const r = range.getBoundingClientRect()\n const box = sc.getBoundingClientRect()\n if (r.height && r.bottom > box.bottom - 24) sc.scrollTop += r.bottom - box.bottom + 48\n else if (r.height && r.top < box.top + 8) sc.scrollTop -= box.top - r.top + 48\n }\n })\n\n // ---- find ----\n const matches = useMemo<Match[]>(() => {\n const q = find.q.toLowerCase()\n if (!find.open || !q) return []\n const out: Match[] = []\n const scan = (p: Paragraph, pa: string, bi: number) => {\n const t = runsText(p.runs as RRun[]).toLowerCase()\n for (let i = t.indexOf(q); i >= 0 && out.length < 5000; i = t.indexOf(q, i + q.length)) out.push({ pa, a: i, b: i + q.length, bi })\n }\n st.blocks.forEach((b, bi) => {\n if (editable(b)) scan(b, String(bi), bi)\n else if (b.t === 'tbl')\n b.rows.forEach((r, ri) => r.cells.forEach((c, ci) => c.blocks.forEach((x, pi) => editable(x) && scan(x, `${bi}.${ri}.${ci}.${pi}`, bi))))\n })\n return out\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [find.q, find.open, version])\n\n const gotoMatch = (idx: number) => {\n const m = matches[idx]\n const sc = scrollRef.current\n if (!m || !sc) return\n const pi = pages.findIndex((p) => m.bi >= p.start && m.bi < p.end)\n if (pi >= 0) sc.scrollTop = Math.max(0, tops[pi] - 16)\n setFind((f) => ({ ...f, idx }))\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const root = pagesRef.current\n if (!root) return\n const a = domFromPos(root, { pa: m.pa, o: m.a })\n const b = domFromPos(root, { pa: m.pa, o: m.b })\n if (!a || !b) return\n const r = document.createRange()\n r.setStart(a[0], a[1])\n r.setEnd(b[0], b[1])\n const rect = r.getBoundingClientRect()\n const box = sc.getBoundingClientRect()\n sc.scrollTop += rect.top - box.top - box.height / 3\n if (isEditing) editor.input.restore({ a: { pa: m.pa, o: m.a }, f: { pa: m.pa, o: m.b } }, false)\n }),\n )\n }\n\n // highlight visible matches (CSS Custom Highlight API)\n useIsoLayoutEffect(() => {\n const H = (globalThis as unknown as { Highlight?: new (...r: Range[]) => unknown }).Highlight\n const reg = (CSS as unknown as { highlights?: Map<string, unknown> }).highlights\n if (!H || !reg) return\n const root = pagesRef.current\n if (!root || !matches.length) {\n reg.delete('de-find')\n reg.delete('de-find-cur')\n return\n }\n const all: Range[] = []\n let curR: Range | undefined\n matches.forEach((m, i) => {\n if (m.bi < (pages[first]?.start ?? 0) || m.bi >= (pages[last]?.end ?? 0)) return\n const a = domFromPos(root, { pa: m.pa, o: m.a })\n const b = domFromPos(root, { pa: m.pa, o: m.b })\n if (!a || !b) return\n const r = document.createRange()\n r.setStart(a[0], a[1])\n r.setEnd(b[0], b[1])\n if (i === find.idx) curR = r\n else all.push(r)\n })\n reg.set('de-find', new H(...all))\n if (curR) reg.set('de-find-cur', new H(curR))\n else reg.delete('de-find-cur')\n })\n\n const replaceMatch = (m: Match, text: string) => opInsert(editor, { a: { pa: m.pa, o: m.a }, f: { pa: m.pa, o: m.b } }, text)\n\n const docStyle: CSSProperties = { fontFamily: meta?.font, fontSize: meta ? `${meta.sz}pt` : undefined }\n\n // ---- dialogs / clipboard ----\n const askLink = () => {\n const cur = editor.state()?.link\n setPrompt({\n title: cur ? 'Edit link' : 'Insert link',\n placeholder: 'https://…',\n initial: cur,\n ok: 'Apply',\n onOk: (v) => void editor.setLink(v.trim() || null),\n extra: cur ? { label: 'Remove', run: () => void editor.setLink(null) } : undefined,\n })\n }\n const askAlt = () => {\n const cur = editor.state()?.img\n if (!cur) return\n setPrompt({\n title: 'Alt text',\n label: 'Describe the picture for screen readers',\n initial: cur.alt ?? '',\n area: true,\n ok: 'Save',\n onOk: (v) => editor.setAltText(v.trim()),\n })\n }\n const paste = async (plain: boolean) => {\n const sel = editor.input.sel()\n if (!sel) return\n try {\n if (!plain && navigator.clipboard?.read) {\n for (const it of await navigator.clipboard.read()) {\n const pic = it.types.find((t) => t.startsWith('image/'))\n if (pic) return void editor.insertImages([await it.getType(pic)], sel)\n if (it.types.includes('text/html')) {\n const html = await (await it.getType('text/html')).text()\n const dt = { files: [] as unknown as FileList, getData: (t: string) => (t === 'text/html' ? html : '') } as unknown as DataTransfer\n if (editor.pasteRich(sel, dt)) return\n }\n }\n }\n const text = await navigator.clipboard.readText()\n if (text) opInsert(editor, sel, text)\n } catch {\n setToast(`The browser blocked clipboard access — use ${MOD}V to paste`)\n }\n }\n const copyCut = (cmd: 'copy' | 'cut') => {\n if (!document.execCommand(cmd)) setToast(`Use ${MOD}${cmd === 'copy' ? 'C' : 'X'}`)\n }\n const pickImage = () => void pickFiles().then((f) => void (f.length && editor.insertImages(f)))\n const imgEl = () => (img && pagesRef.current ? (findObj(pagesRef.current, img.pa, img.o) as HTMLImageElement | null) : null)\n const imageActions = {\n original: () => {\n const el = imgEl()\n if (el?.naturalWidth) editor.imageOriginal(el.naturalWidth, el.naturalHeight)\n },\n replace: () => void pickFiles('image/*', false).then((f) => f[0] && editor.replaceImage(f[0])),\n alt: askAlt,\n download: () => {\n const el = imgEl()\n if (!el?.src || !img) return\n void fetch(el.src)\n .then((r) => r.blob())\n .then((b) => download(b, img.target.split('/').pop() ?? 'image'))\n },\n }\n\n // ---- image selection overlay (resize handles) ----\n useIsoLayoutEffect(() => {\n if (resizing.current) return\n const root = pagesRef.current\n const sc = scrollRef.current\n let box: Box | null = null\n if (isEditing && img && root && sc) {\n const el = findObj(root, img.pa, img.o)\n if (el) {\n const r = el.getBoundingClientRect()\n const b = sc.getBoundingClientRect()\n box = { x: r.left - b.left + sc.scrollLeft, y: r.top - b.top + sc.scrollTop, w: r.width, h: r.height }\n }\n }\n setImgBox((p) => (p === box || (p && box && p.x === box.x && p.y === box.y && p.w === box.w && p.h === box.h) ? p : box))\n })\n\n const startResize = (dir: (typeof HANDLES)[number], e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const el = imgEl()\n if (!img || !imgBox || !el) return\n const { w: w0, h: h0, x: x0, y: y0 } = imgBox\n const ptPerPx = img.w / Math.max(1, w0)\n const sx = e.clientX\n const sy = e.clientY\n let w = w0\n let h = h0\n resizing.current = true\n resizeRatio.current = ptPerPx\n const move = (ev: MouseEvent) => {\n const dx = ev.clientX - sx\n const dy = ev.clientY - sy\n let nw = w0 + (dir.includes('e') ? dx : dir.includes('w') ? -dx : 0)\n let nh = h0 + (dir.includes('s') ? dy : dir.includes('n') ? -dy : 0)\n if (dir.length === 2 && !ev.shiftKey) {\n const k = Math.max(nw / w0, nh / h0)\n nw = w0 * k\n nh = h0 * k\n }\n const maxW = (contentW / ptPerPx) * 1.0\n w = Math.max(8, Math.min(nw, maxW * 2))\n h = Math.max(8, nh)\n el.style.width = `${w * ptPerPx}pt`\n el.style.height = `${h * ptPerPx}pt`\n setImgBox({ x: x0, y: y0, w, h })\n }\n const up = () => {\n window.removeEventListener('mousemove', move)\n window.removeEventListener('mouseup', up)\n resizing.current = false\n resizeRatio.current = null\n if (w !== w0 || h !== h0) editor.setImageSize(w * ptPerPx, h * ptPerPx)\n else setImgBox(null)\n }\n window.addEventListener('mousemove', move)\n window.addEventListener('mouseup', up)\n }\n\n // ---- context menu ----\n const ctxItems = (): MenuItem[] => {\n const s = editor.state()\n const sel = editor.input.sel()\n const ranged = !!sel && (sel.a.pa !== sel.f.pa || sel.a.o !== sel.f.o)\n const items: MenuItem[] = []\n if (s?.img) {\n items.push(\n { head: 'Image', label: 'Original size', icon: 'imgOrig', run: imageActions.original },\n { label: 'Fit to page width', icon: 'fit', run: () => editor.resizeImage('fit') },\n { label: 'Replace image…', icon: 'imgReplace', run: imageActions.replace },\n { label: 'Alt text…', icon: 'alt', run: askAlt },\n { label: 'Download image', icon: 'save', run: imageActions.download },\n { label: 'Delete image', icon: 'trash', run: () => editor.deleteSelection() },\n )\n }\n items.push(\n { label: 'Cut', icon: 'cut', hint: `${MOD}X`, disabled: !ranged, run: () => copyCut('cut'), sep: items.length > 0 },\n { label: 'Copy', icon: 'copy', hint: `${MOD}C`, disabled: !ranged, run: () => copyCut('copy') },\n { label: 'Paste', icon: 'paste', hint: `${MOD}V`, run: () => void paste(false) },\n { label: 'Paste without formatting', icon: 'pastePlain', hint: `${MOD}⇧V`, run: () => void paste(true) },\n { label: 'Delete', icon: 'trash', disabled: !ranged || !!s?.img, run: () => editor.deleteSelection() },\n )\n if (s?.link) {\n items.push(\n { label: 'Open link', icon: 'external', sep: true, run: () => window.open(s.link, '_blank', 'noopener') },\n { label: 'Edit link…', icon: 'link', hint: `${MOD}K`, run: askLink },\n { label: 'Remove link', icon: 'unlink', run: () => void editor.setLink(null) },\n )\n } else items.push({ label: 'Insert link…', icon: 'link', hint: `${MOD}K`, sep: true, run: askLink, disabled: !s })\n if (s?.inTable) {\n const op = (k: Parameters<DocxEditor['tableOp']>[0]) => () => editor.tableOp(k)\n items.push(\n { head: 'Table', label: 'Insert row above', icon: 'rowAbove', sep: true, run: op('rowAbove') },\n { label: 'Insert row below', icon: 'rowBelow', run: op('rowBelow') },\n { label: 'Insert column left', icon: 'colLeft', run: op('colLeft') },\n { label: 'Insert column right', icon: 'colRight', run: op('colRight') },\n { label: 'Delete row', icon: 'delRow', run: op('delRow') },\n { label: 'Delete column', icon: 'delCol', run: op('delCol') },\n { label: 'Delete table', icon: 'trash', run: op('delTable') },\n )\n } else {\n items.push(\n { label: 'Insert image…', icon: 'image', sep: true, run: pickImage, disabled: !s },\n { label: 'Insert table', icon: 'table', run: () => editor.insertTable(3, 3), disabled: !s },\n { label: 'Page break', icon: 'pagebreak', hint: `${MOD}↵`, run: () => editor.insertPageBreak(), disabled: !s },\n )\n }\n items.push(\n { label: 'Clear formatting', icon: 'clear', hint: `${MOD}\\\\`, sep: true, run: () => editor.clearFormat(), disabled: !s },\n { label: 'Select all', icon: 'selectAll', hint: `${MOD}A`, run: () => document.execCommand('selectAll') },\n )\n return items\n }\n\n // ---- outline ----\n const titleId = meta?.styles?.find((x) => x.canon === 'title')?.id\n const headings = useMemo(\n () => (outline ? outlineOf(st.blocks, titleId) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [outline, version, titleId],\n )\n const topBlock = pages[Math.max(0, cur - 1)]?.start ?? 0\n const activeHeading = headings.reduce((acc, h, i) => (h.bi <= Math.max(topBlock, caretBi) ? i : acc), -1)\n const gotoBlock = (bi: number) => {\n const sc = scrollRef.current\n const pi = pages.findIndex((p) => bi >= p.start && bi < p.end)\n if (!sc || pi < 0) return\n sc.scrollTop = Math.max(0, tops[pi] - 16)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const el = pagesRef.current?.querySelector(`[data-pa=\"${bi}\"]`)\n if (el) sc.scrollTop += el.getBoundingClientRect().top - sc.getBoundingClientRect().top - 24\n if (isEditing) editor.input.restore({ a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } })\n }),\n )\n }\n\n return (\n <div style={{ position: 'relative', flex: 1, minWidth: 0, display: 'flex' }}>\n <div\n ref={scrollRef}\n className=\"de-scroll\"\n tabIndex={-1}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'f') {\n e.preventDefault()\n setFind((f) => ({ ...f, open: true }))\n }\n }}\n >\n {meta && queue.length > 0 && (\n <div ref={measureRef} className=\"de-measure de-doc\" style={{ ...docStyle, width: `${contentW}pt` }}>\n {queue.map(({ b, i }) => (\n <BlockView key={i} block={b} ctx={measureCtx} sp={contextual(b, st.blocks[i - 1], st.blocks[i + 1])} />\n ))}\n </div>\n )}\n <div\n ref={pagesRef}\n className={isEditing ? 'de-pages de-editing' : 'de-pages'}\n style={{ height: totalH, width: totalW }}\n contentEditable={isEditing || undefined}\n suppressContentEditableWarning\n spellCheck={false}\n onMouseDown={(e) => {\n if (!isEditing) return\n // clicking a picture selects it (resize handles, image tools)\n const t = e.target as HTMLElement\n const obj = t.tagName === 'IMG' ? t.closest<HTMLElement>('[data-obj]') : null\n const pos = obj && pagesRef.current ? posFromDom(pagesRef.current, obj, 0) : null\n if (pos) {\n e.preventDefault()\n editor.selectObject(pos.pa, pos.o)\n }\n }}\n onMouseUp={() => {\n if (editor.painter) setTimeout(() => editor.applyPainter(), 0)\n }}\n onContextMenu={(e) => {\n if (!isEditing) return\n e.preventDefault()\n setCtxMenu({ x: e.clientX, y: e.clientY })\n }}\n >\n {pages.map((p, i) =>\n (i < first || i > last) && i !== caretPage ? null : (\n <PageView\n key={i}\n index={i}\n count={pageCount}\n slice={p}\n blocks={st.blocks}\n meta={meta}\n page={page}\n top={tops[i]}\n left={left}\n height={pageHeights[i]}\n zoom={z}\n client={client}\n docStyle={docStyle}\n editing={isEditing}\n />\n ),\n )}\n {skeleton > 0 && <div className=\"de-page-skeleton\" contentEditable={false} style={{ top: acc, left, width: pageW * z, height: pageH * z }} />}\n </div>\n {imgBox && (\n <div className=\"de-img-sel\" style={{ left: imgBox.x, top: imgBox.y, width: imgBox.w, height: imgBox.h }}>\n {HANDLES.map((d) => (\n <span key={d} className={`de-img-h de-img-${d}`} onMouseDown={(e) => startResize(d, e)} />\n ))}\n {resizeRatio.current && (\n <span className=\"de-img-size\">\n {Math.round(imgBox.w * resizeRatio.current)} × {Math.round(imgBox.h * resizeRatio.current)} pt\n </span>\n )}\n </div>\n )}\n </div>\n {outline && (\n <nav className=\"de-outline\" aria-label=\"Document outline\">\n <div className=\"de-outline-head\">\n <span>Outline</span>\n <button type=\"button\" className=\"de-tb\" title=\"Close outline\" aria-label=\"Close outline\" onClick={() => setOutline(false)}>\n ×\n </button>\n </div>\n {headings.length ? (\n headings.map((h, i) => (\n <button key={h.bi} type=\"button\" className={i === activeHeading ? 'de-outline-item on' : 'de-outline-item'} style={{ paddingLeft: 10 + h.lvl * 14 }} onClick={() => gotoBlock(h.bi)}>\n {h.text}\n </button>\n ))\n ) : (\n <div className=\"de-outline-empty\">Headings you add to the document will appear here.</div>\n )}\n </nav>\n )}\n {find.open && (\n <FindBar\n query={find.q}\n index={find.idx}\n count={matches.length}\n editable={isEditing}\n onQuery={(q) => setFind({ open: true, q, idx: 0 })}\n onNav={(d) => matches.length && gotoMatch((find.idx + d + matches.length) % matches.length)}\n onClose={() => setFind({ open: false, q: find.q, idx: 0 })}\n onReplace={(text, all) => {\n if (!matches.length) return\n if (all) [...matches].reverse().forEach((m) => replaceMatch(m, text))\n else replaceMatch(matches[Math.min(find.idx, matches.length - 1)], text)\n }}\n />\n )}\n {isEditing && (\n <DocxToolbar\n editor={editor}\n styles={meta?.styles ?? []}\n onFind={() => setFind((f) => ({ ...f, open: true }))}\n outline={outline}\n onOutline={() => setOutline((o) => !o)}\n painter={painter}\n onLink={askLink}\n image={imageActions}\n />\n )}\n {!isEditing && done && (\n <button type=\"button\" className={outline ? 'de-outline-toggle on' : 'de-outline-toggle'} title=\"Document outline\" onClick={() => setOutline((o) => !o)}>\n ☰\n </button>\n )}\n {ctxMenu && <ContextMenu x={ctxMenu.x} y={ctxMenu.y} items={ctxItems()} onClose={() => setCtxMenu(null)} />}\n {prompt && <PromptDialog spec={prompt} onClose={() => setPrompt(null)} />}\n {toast && <Toast text={toast} onDone={() => setToast(null)} />}\n <ZoomControl zoom={zoom} effective={z} onChange={setZoom} />\n <Status text={status} onStatus={onStatus} />\n </div>\n )\n}\n\ninterface PageViewProps {\n index: number\n count: number\n slice: PageSlice\n blocks: Block[]\n meta: DocxMeta | null\n page: PageSetup\n top: number\n left: number\n height: number\n zoom: number\n client: DocumentClient\n docStyle: CSSProperties\n editing: boolean\n}\n\nfunction PageView({ index, count, slice, blocks, meta, page, top, left, height, zoom, client, docStyle, editing }: PageViewProps) {\n const ctx = useMemo<RenderCtx>(() => ({ client, page: index, pages: count, measuring: false, editable: editing }), [client, index, count, editing])\n const hfCtx = useMemo<RenderCtx>(() => ({ ...ctx, editable: false }), [ctx])\n const first = index === 0 && meta?.titlePg\n const header = first ? meta?.firstHeader : meta?.header\n const footer = first ? meta?.firstFooter : meta?.footer\n const items = []\n for (let i = slice.start; i < slice.end; i++) {\n const b = blocks[i]\n items.push(\n <BlockView\n key={`${i}:${b.t === 'p' ? b.ver ?? 0 : 0}`}\n block={b}\n ctx={ctx}\n pa={editable(b) || b.t === 'tbl' ? String(i) : undefined}\n sp={contextual(b, blocks[i - 1], blocks[i + 1])}\n />,\n )\n }\n return (\n <div className=\"de-page\" style={{ top, left, width: page.w * PX * zoom, height }} data-page={index + 1}>\n <div className=\"de-page-inner de-doc\" style={{ ...docStyle, width: `${page.w}pt`, height: height / zoom, zoom }}>\n {header && (\n <div className=\"de-hf\" contentEditable={editing ? false : undefined} style={{ top: `${page.header}pt`, padding: `0 ${page.mr}pt 0 ${page.ml}pt` }}>\n {header.map((b, i) => (\n <BlockView key={i} block={b} ctx={hfCtx} />\n ))}\n </div>\n )}\n <div style={{ position: 'absolute', top: `${page.mt}pt`, left: `${page.ml}pt`, width: `${page.w - page.ml - page.mr}pt` }}>{items}</div>\n {footer && (\n <div className=\"de-hf\" contentEditable={editing ? false : undefined} style={{ bottom: `${page.footer}pt`, padding: `0 ${page.mr}pt 0 ${page.ml}pt` }}>\n {footer.map((b, i) => (\n <BlockView key={i} block={b} ctx={hfCtx} />\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n",".de-root {\n --de-bg: #e9ebee;\n --de-chrome: #ffffff;\n --de-border: #dadde1;\n --de-text: #1d2127;\n --de-muted: #69707a;\n --de-accent: #1a73e8;\n --de-accent-soft: rgba(26, 115, 232, 0.12);\n --de-grid: #e2e4e7;\n --de-head: #f6f7f8;\n --de-shadow: 0 1px 2px rgba(15, 23, 42, 0.1), 0 2px 8px rgba(15, 23, 42, 0.06);\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 200px;\n overflow: hidden;\n background: var(--de-bg);\n color: var(--de-text);\n font: 13px/1.4 system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n text-align: left;\n isolation: isolate;\n}\n.de-root *,\n.de-root *::before,\n.de-root *::after {\n box-sizing: border-box;\n}\n.de-root img {\n max-width: none;\n}\n\n/* ---------------------------------------------------------------- chrome */\n.de-bar {\n display: flex;\n align-items: center;\n gap: 10px;\n min-height: 40px;\n padding: 6px 12px;\n background: var(--de-chrome);\n border-bottom: 1px solid var(--de-border);\n flex: none;\n position: relative;\n z-index: 3;\n}\n.de-badge {\n flex: none;\n font: 600 10px/1 system-ui, sans-serif;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n padding: 4px 6px;\n border-radius: 4px;\n color: #fff;\n}\n.de-badge-docx { background: #2b579a; }\n.de-badge-xlsx { background: #217346; }\n.de-badge-pptx { background: #c43e1c; }\n.de-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 600;\n}\n.de-status {\n flex: none;\n color: var(--de-muted);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.de-progress {\n position: absolute;\n left: 0;\n bottom: -1px;\n height: 2px;\n background: var(--de-accent);\n transition: width 0.2s ease, opacity 0.4s ease;\n}\n.de-body {\n position: relative;\n flex: 1;\n min-height: 0;\n display: flex;\n}\n.de-scroll {\n position: relative;\n flex: 1;\n min-width: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n.de-center {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n gap: 12px;\n color: var(--de-muted);\n padding: 24px;\n text-align: center;\n}\n.de-spinner {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n border: 3px solid var(--de-accent-soft);\n border-top-color: var(--de-accent);\n animation: de-spin 0.8s linear infinite;\n}\n@keyframes de-spin { to { transform: rotate(360deg); } }\n.de-error {\n max-width: 460px;\n color: #b42318;\n background: #fff;\n border: 1px solid #f3c2bd;\n border-radius: 8px;\n padding: 14px 18px;\n box-shadow: var(--de-shadow);\n}\n.de-zoom {\n position: absolute;\n right: 16px;\n bottom: 16px;\n z-index: 4;\n display: flex;\n align-items: center;\n background: var(--de-chrome);\n border: 1px solid var(--de-border);\n border-radius: 8px;\n box-shadow: var(--de-shadow);\n overflow: hidden;\n}\n.de-zoom button,\n.de-tab,\n.de-btn {\n appearance: none;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n}\n.de-zoom button {\n width: 32px;\n height: 30px;\n font-size: 16px;\n line-height: 1;\n}\n.de-zoom button:hover,\n.de-btn:hover { background: var(--de-accent-soft); }\n.de-zoom span {\n min-width: 52px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n font-size: 12px;\n cursor: pointer;\n}\n.de-btn {\n padding: 4px 8px;\n border-radius: 6px;\n}\n\n/* ---------------------------------------------------------------- docx */\n.de-pages { position: relative; }\n.de-page {\n position: absolute;\n background: #fff;\n box-shadow: var(--de-shadow);\n overflow: hidden;\n}\n.de-page-inner {\n position: relative;\n transform-origin: 0 0;\n}\n.de-page-skeleton {\n position: absolute;\n background: #fff;\n box-shadow: var(--de-shadow);\n opacity: 0.6;\n}\n.de-page-skeleton::after {\n content: '';\n position: absolute;\n inset: 12% 12%;\n background: repeating-linear-gradient(#eef0f2 0 10px, transparent 10px 24px);\n animation: de-pulse 1.4s ease-in-out infinite;\n}\n@keyframes de-pulse { 50% { opacity: 0.45; } }\n.de-doc {\n color: #000;\n font-kerning: normal;\n text-rendering: optimizeLegibility;\n}\n.de-doc a { color: inherit; text-decoration: inherit; }\n.de-hf {\n position: absolute;\n left: 0;\n right: 0;\n}\n.de-measure {\n position: absolute;\n left: -100000px;\n top: 0;\n visibility: hidden;\n pointer-events: none;\n contain: layout style;\n}\n.de-p {\n margin: 0;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n tab-size: 36pt;\n -moz-tab-size: 36pt;\n}\n.de-p > span { white-space: inherit; }\n.de-marker { display: inline-block; text-indent: 0; white-space: pre; }\n.de-tbl {\n border-collapse: collapse;\n table-layout: fixed;\n}\n.de-tbl td {\n vertical-align: top;\n overflow-wrap: break-word;\n text-indent: 0;\n padding: 0;\n}\n.de-img-missing,\n.de-ph {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px dashed #b8bec6;\n background: repeating-linear-gradient(45deg, #f6f7f9 0 8px, #eff1f4 8px 16px);\n color: #6a737d;\n font: 12px/1.2 system-ui, sans-serif;\n text-indent: 0;\n vertical-align: bottom;\n overflow: hidden;\n}\n.de-tbox {\n display: inline-block;\n vertical-align: top;\n text-indent: 0;\n padding: 3.6pt 7.2pt;\n overflow: hidden;\n}\n\n/* ---------------------------------------------------------------- xlsx */\n.de-xlsx {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n.de-fx {\n display: flex;\n align-items: stretch;\n height: 30px;\n flex: none;\n background: var(--de-chrome);\n border-bottom: 1px solid var(--de-border);\n font: 12px/30px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n.de-fx-ref {\n width: 88px;\n flex: none;\n padding: 0 10px;\n border-right: 1px solid var(--de-border);\n color: var(--de-muted);\n}\n.de-fx-val {\n flex: 1;\n min-width: 0;\n padding: 0 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.de-grid {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: #fff;\n outline: none;\n}\n.de-grid-view {\n position: sticky;\n top: 0;\n left: 0;\n overflow: hidden;\n z-index: 1;\n}\n.de-region {\n position: absolute;\n overflow: hidden;\n}\n.de-gl-h,\n.de-gl-v {\n position: absolute;\n background: var(--de-grid);\n}\n.de-gl-h { height: 1px; left: 0; right: 0; }\n.de-gl-v { width: 1px; top: 0; bottom: 0; }\n.de-cell {\n position: absolute;\n display: flex;\n align-items: flex-end;\n padding: 0 3px 1px;\n overflow: hidden;\n white-space: pre;\n line-height: 1.2;\n}\n.de-cell > span { min-width: 0; }\n.de-cell.de-ov { overflow: visible; }\n.de-head-c,\n.de-head-r {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--de-head);\n color: #5f6368;\n font: 11px/1 system-ui, sans-serif;\n font-variant-numeric: tabular-nums;\n border-right: 1px solid #d3d6da;\n border-bottom: 1px solid #d3d6da;\n user-select: none;\n}\n.de-head-on { background: #d3e3fd; color: #0b57d0; font-weight: 600; }\n.de-corner {\n position: absolute;\n left: 0;\n top: 0;\n background: var(--de-head);\n border-right: 1px solid #c4c7cc;\n border-bottom: 1px solid #c4c7cc;\n z-index: 2;\n}\n.de-freeze-h,\n.de-freeze-v {\n position: absolute;\n background: #b9bdc3;\n z-index: 2;\n}\n.de-sel {\n position: absolute;\n border: 2px solid var(--de-accent);\n pointer-events: none;\n z-index: 3;\n}\n.de-tabs {\n display: flex;\n align-items: stretch;\n gap: 2px;\n height: 34px;\n flex: none;\n padding: 0 8px;\n background: var(--de-head);\n border-top: 1px solid var(--de-border);\n overflow-x: auto;\n scrollbar-width: thin;\n}\n.de-tab {\n flex: none;\n padding: 0 14px;\n color: var(--de-muted);\n border-radius: 0 0 6px 6px;\n white-space: nowrap;\n}\n.de-tab:hover { background: #eceef1; }\n.de-tab[aria-selected='true'] {\n background: #fff;\n color: #188038;\n font-weight: 600;\n box-shadow: inset 0 2px 0 #188038;\n}\n\n/* ---------------------------------------------------------------- pptx */\n.de-thumbs {\n width: 188px;\n flex: none;\n overflow-y: auto;\n border-right: 1px solid var(--de-border);\n background: var(--de-chrome);\n position: relative;\n}\n.de-thumb {\n position: absolute;\n left: 0;\n right: 0;\n display: flex;\n gap: 6px;\n padding: 0 10px 0 6px;\n cursor: pointer;\n}\n.de-thumb-n {\n width: 18px;\n flex: none;\n text-align: right;\n color: var(--de-muted);\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n}\n.de-thumb .de-slide { outline: 1px solid var(--de-border); }\n.de-thumb[aria-current='true'] .de-slide { outline: 2px solid var(--de-accent); }\n.de-slide {\n position: relative;\n overflow: hidden;\n background: #fff;\n}\n.de-slide-frame {\n position: absolute;\n box-shadow: var(--de-shadow);\n}\n.de-slide-inner {\n position: absolute;\n left: 0;\n top: 0;\n transform-origin: 0 0;\n overflow: hidden;\n color: #000;\n}\n.de-el { position: absolute; }\n.de-txt {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n}\n.de-txt > div {\n white-space: pre-wrap;\n overflow-wrap: break-word;\n}\n.de-txt.de-nowrap > div { white-space: pre; }\n.de-bul { display: inline-block; text-indent: 0; white-space: pre; }\n.de-stbl {\n border-collapse: collapse;\n table-layout: fixed;\n width: 100%;\n}\n.de-stbl td {\n position: relative;\n padding: 0;\n vertical-align: top;\n}\n.de-hidden-slide { opacity: 0.55; }\n\n/* ---------------------------------------------------------------- editing */\n.de-mode {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 28px;\n padding: 0 10px;\n border: 1px solid var(--de-border);\n border-radius: 6px;\n background: var(--de-chrome);\n color: inherit;\n font: inherit;\n font-weight: 500;\n cursor: pointer;\n flex: none;\n}\n.de-mode:hover { background: var(--de-accent-soft); }\n.de-mode-on { border-color: var(--de-accent); color: var(--de-accent); }\n.de-save-dirty { background: var(--de-accent); border-color: var(--de-accent); color: #fff; }\n.de-save-dirty:hover { background: #1765cc; }\n.de-mode:disabled { opacity: 0.6; cursor: default; }\n.de-ebar-host {\n flex: none;\n padding: 6px 10px;\n background: var(--de-chrome);\n border-bottom: 1px solid var(--de-border);\n position: relative;\n z-index: 20;\n}\n.de-ebar {\n --de-tb-ink: #444746;\n --de-tb-hover: rgba(68, 71, 70, 0.08);\n --de-tb-on: #d3e3fd;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n gap: 2px;\n min-width: 0;\n height: 40px;\n padding: 0 8px;\n background: #eef2f9;\n border-radius: 20px;\n color: var(--de-tb-ink);\n}\n.de-ebar-it { display: inline-flex; align-items: center; flex: none; }\n.de-ebar-morewrap { margin-left: auto; }\n.de-tb-pop.de-ebar-more {\n left: auto;\n right: 0;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 2px;\n width: max-content;\n max-width: min(360px, 90vw);\n padding: 6px;\n background: #eef2f9;\n}\n.de-tb {\n appearance: none;\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--de-tb-ink, #444746);\n font: 600 14px/1 system-ui, sans-serif;\n cursor: pointer;\n transition: background-color 0.1s;\n}\n.de-tb:hover:not(:disabled) { background: var(--de-tb-hover, rgba(68, 71, 70, 0.08)); }\n.de-tb:focus-visible, .de-dd:focus-visible { outline: 2px solid var(--de-accent); outline-offset: -2px; }\n.de-tb-on { background: var(--de-tb-on, #d3e3fd) !important; color: #041e49; }\n.de-tb:disabled { opacity: 0.38; cursor: default; }\n.de-tb-chev { width: auto; padding: 0 2px 0 4px; gap: 0; }\n.de-tb-sep { width: 1px; height: 20px; margin: 0 5px; background: #c7c7c7; flex: none; }\n.de-tb-color { position: relative; display: inline-flex; }\n.de-tb-swatch {\n position: absolute;\n left: 6px;\n right: 6px;\n bottom: 3px;\n height: 3px;\n border-radius: 1px;\n box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);\n}\n.de-tb-pop {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: 30;\n padding: 10px;\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 2px 6px 2px rgba(60, 64, 67, 0.15), 0 1px 2px rgba(60, 64, 67, 0.3);\n}\n.de-tb-none {\n width: 100%;\n margin-bottom: 8px;\n padding: 5px;\n border: 1px solid var(--de-border);\n border-radius: 4px;\n background: #fff;\n font: inherit;\n cursor: pointer;\n}\n.de-tb-none:hover { background: #f1f3f4; }\n/* dropdown */\n.de-dd-wrap { position: relative; display: inline-flex; }\n.de-dd {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 28px;\n padding: 0 2px 0 6px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: #1f1f1f;\n font: 13px/1 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n cursor: pointer;\n transition: background-color 0.1s;\n}\n.de-dd:hover:not(:disabled), .de-dd-open { background: var(--de-tb-hover, rgba(68, 71, 70, 0.08)); }\n.de-dd:disabled { opacity: 0.38; cursor: default; }\n.de-dd > svg { flex: none; color: var(--de-tb-ink, #444746); }\n.de-dd-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; }\n.de-dd-ph { color: var(--de-muted); }\n.de-dd-pop {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 40;\n min-width: 100%;\n max-height: min(380px, 60vh);\n overflow-y: auto;\n padding: 6px 0;\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 2px 6px 2px rgba(60, 64, 67, 0.15), 0 1px 2px rgba(60, 64, 67, 0.3);\n color: #1f1f1f;\n font: 13px/1.3 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n}\n.de-dd-opt {\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: 32px;\n padding: 4px 16px 4px 10px;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n}\n.de-dd-opt > svg { flex: none; color: #444746; }\n.de-dd-hi { background: #f1f3f4; }\n.de-dd-dis { opacity: 0.4; cursor: default; }\n.de-dd-check { display: inline-flex; width: 16px; flex: none; color: #0b57d0; }\n.de-dd-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }\n.de-dd-hint { margin-left: auto; padding-left: 28px; color: var(--de-muted); font-size: 12px; font-variant-numeric: tabular-nums; }\n.de-dd-sep { height: 1px; margin: 6px 0; background: #e3e3e3; }\n/* font size box */\n.de-size { position: relative; display: inline-flex; align-items: center; gap: 1px; }\n.de-size-step { width: 24px; }\n.de-size-input {\n width: 38px;\n height: 26px;\n padding: 0;\n border: 1px solid #747775;\n border-radius: 4px;\n background: transparent;\n color: #1f1f1f;\n font: 13px/1 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n text-align: center;\n outline: none;\n}\n.de-size-input:focus { border-color: var(--de-accent); box-shadow: inset 0 0 0 1px var(--de-accent); background: #fff; }\n.de-size-input:disabled { opacity: 0.38; }\n.de-size-pop { left: 25px; min-width: 40px; width: 40px; padding: 4px 0; }\n.de-size-pop .de-dd-opt { justify-content: center; min-height: 28px; padding: 0; }\n/* border picker */\n.de-borders { display: grid; grid-template-columns: repeat(4, 30px); gap: 4px; }\n.de-borders .de-tb { width: 30px; height: 30px; }\n.de-tb-grid { display: grid; grid-template-columns: repeat(8, 18px); gap: 4px; }\n.de-tb-grid button {\n width: 18px;\n height: 18px;\n padding: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 50%;\n cursor: pointer;\n}\n.de-tb-grid button:hover { transform: scale(1.15); }\n.de-tb-grid button.on { box-shadow: 0 0 0 2px #fff, 0 0 0 3.5px var(--de-accent); }\n.de-editing { outline: none; caret-color: #000; }\n.de-editing .de-page-inner { cursor: text; }\n.de-editing [contenteditable='false'] { cursor: default; }\n.de-find {\n position: absolute;\n top: 10px;\n right: 18px;\n z-index: 6;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 6px;\n background: #fff;\n border: 1px solid var(--de-border);\n border-radius: 8px;\n box-shadow: var(--de-shadow);\n}\n.de-find-row { display: flex; align-items: center; gap: 2px; }\n.de-find input {\n width: 200px;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--de-border);\n border-radius: 6px;\n font: inherit;\n outline: none;\n}\n.de-find input:focus { border-color: var(--de-accent); }\n.de-find-count { min-width: 56px; text-align: center; color: var(--de-muted); font-size: 12px; font-variant-numeric: tabular-nums; }\n::highlight(de-find) { background-color: #fde293; }\n::highlight(de-find-cur) { background-color: #ff9632; }\n.de-range {\n position: absolute;\n background: rgba(26, 115, 232, 0.1);\n border: 1px solid rgba(26, 115, 232, 0.6);\n pointer-events: none;\n z-index: 2;\n}\n.de-cell-edit {\n position: absolute;\n z-index: 5;\n padding: 1px 3px;\n border: 2px solid var(--de-accent);\n outline: none;\n resize: none;\n overflow: hidden;\n background: #fff;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n line-height: 1.2;\n white-space: pre-wrap;\n}\n.de-fx-input { border: 0; outline: none; background: transparent; font: inherit; color: inherit; }\n.de-fx-input:focus { background: #fff; box-shadow: inset 0 -2px 0 var(--de-accent); }\n.de-tb-hint { margin-left: 8px; color: var(--de-muted); font-size: 12px; }\n.de-slide-editable [data-sid] { cursor: text; }\n.de-slide-editable [data-sid]:hover { outline: 1px dashed rgba(26, 115, 232, 0.6); }\n.de-txt-edit { outline: 2px solid var(--de-accent); outline-offset: 0; caret-color: #000; cursor: text; z-index: 2; }\n.de-gridpick { display: grid; grid-template-columns: repeat(8, 16px); gap: 3px; }\n.de-gridpick button { width: 16px; height: 16px; padding: 0; border: 1px solid #c8ccd1; border-radius: 2px; background: #fff; cursor: pointer; }\n.de-gridpick button.on { background: #d3e3fd; border-color: var(--de-accent); }\n.de-gridpick-label { margin-top: 6px; text-align: center; color: var(--de-muted); font-size: 12px; }\n.de-prompt { display: flex; gap: 6px; align-items: center; }\n.de-prompt input { width: 240px; height: 28px; padding: 0 8px; border: 1px solid var(--de-border); border-radius: 6px; font: inherit; outline: none; }\n.de-prompt input:focus { border-color: var(--de-accent); }\n.de-prompt .de-btn { border: 1px solid var(--de-border); background: #fff; }\n.de-shape-sel { position: absolute; border: 1.5px solid var(--de-accent); pointer-events: none; z-index: 5; transform-origin: 50% 50%; }\n.de-handle { position: absolute; background: #fff; border: 1px solid var(--de-accent); border-radius: 2px; pointer-events: auto; }\n.de-h-nw, .de-h-se { cursor: nwse-resize; }\n.de-h-ne, .de-h-sw { cursor: nesw-resize; }\n.de-h-n, .de-h-s { cursor: ns-resize; }\n.de-h-e, .de-h-w { cursor: ew-resize; }\n.de-slide-editable [data-top] { cursor: move; }\n.de-slide-editable [data-sid] { cursor: text; }\n.de-present {\n position: fixed;\n inset: 0;\n z-index: 2147483000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #000;\n outline: none;\n cursor: none;\n}\n.de-present .de-slide { box-shadow: none; }\n.de-present-n { position: absolute; right: 16px; bottom: 12px; color: rgba(255, 255, 255, 0.5); font: 12px system-ui, sans-serif; }\n.de-present-btn {\n position: absolute;\n right: 16px;\n bottom: 56px;\n z-index: 4;\n}\n.de-grip-c { position: absolute; top: 0; width: 6px; cursor: col-resize; z-index: 3; }\n.de-grip-r { position: absolute; left: 0; height: 6px; cursor: row-resize; z-index: 3; }\n.de-grip-c:hover, .de-grip-r:hover { background: rgba(26, 115, 232, 0.35); }\n.de-ctx {\n position: fixed;\n z-index: 50;\n min-width: 240px;\n max-width: 340px;\n padding: 6px 0;\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 2px 6px 2px rgba(60, 64, 67, 0.15), 0 1px 2px rgba(60, 64, 67, 0.3);\n font: 13px/1.3 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n color: #1f1f1f;\n user-select: none;\n}\n.de-ctx-row { display: contents; }\n.de-ctx button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n min-height: 30px;\n padding: 4px 16px 4px 12px;\n border: 0;\n background: transparent;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n.de-ctx button.de-ctx-hi:not(:disabled) { background: #f1f3f4; }\n.de-ctx button:disabled { color: #b0b4ba; cursor: default; }\n.de-ctx-icon { display: inline-flex; width: 16px; flex: none; color: #444746; }\n.de-ctx button:disabled .de-ctx-icon { opacity: 0.4; }\n.de-ctx-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.de-ctx-hint { margin-left: 16px; color: var(--de-muted); font-size: 12px; }\n.de-ctx-sep { height: 1px; margin: 6px 0; background: #e3e3e3; }\n.de-ctx-head { padding: 6px 16px 2px 38px; color: var(--de-muted); font-size: 11px; font-weight: 600; letter-spacing: 0.03em; text-transform: uppercase; }\n.de-tab-add { font-size: 18px; padding: 0 10px; }\n.de-tab-input { width: 120px; margin: 4px 2px; padding: 0 6px; border: 1px solid var(--de-accent); border-radius: 4px; font: inherit; }\n/* formula editing: reference boxes, colored references, autocomplete */\n.de-fx { position: relative; }\n.de-fref { position: absolute; border: 2px solid; pointer-events: none; z-index: 2; }\n.de-fref-pt { border-style: dashed; }\n.de-cell-hl { z-index: 4; pointer-events: none; color: #202124; overflow: hidden; overflow-wrap: break-word; }\n.de-cell-edit { overflow-wrap: break-word; }\n.de-cell-edit-fx { background: transparent; color: transparent; caret-color: #202124; box-shadow: none; }\n.de-cell-edit-fx::selection { color: transparent; background: rgba(26, 115, 232, 0.25); }\n.de-fassist-at { position: absolute; z-index: 30; }\n.de-fassist {\n min-width: 240px;\n max-width: 420px;\n padding: 4px 0;\n background: #fff;\n border: 1px solid var(--de-border);\n border-radius: 6px;\n box-shadow: 0 4px 16px rgba(15, 23, 42, 0.16);\n font: 12px/1.45 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n color: var(--de-text);\n text-align: left;\n white-space: normal;\n}\n.de-fsug { padding: 3px 10px; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.de-fsug.on { background: #e8f0fe; }\n.de-fsug-name { font-weight: 600; }\n.de-fsug-args { margin-left: 2px; color: var(--de-muted); }\n.de-fsug-desc { margin-top: 2px; color: var(--de-muted); font-size: 11.5px; white-space: normal; }\n.de-fhint { padding: 6px 10px; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }\n.de-fhint .de-fsug-desc { font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; }\n.de-fhint b { color: var(--de-accent); }\n\n/* docx: picture selection, outline, dialogs */\n.de-img-sel { position: absolute; z-index: 4; border: 1.5px solid var(--de-accent); pointer-events: none; }\n.de-img-h {\n position: absolute;\n width: 9px;\n height: 9px;\n margin: -5px 0 0 -5px;\n background: #fff;\n border: 1.5px solid var(--de-accent);\n border-radius: 2px;\n pointer-events: auto;\n}\n.de-img-nw { left: 0; top: 0; cursor: nwse-resize; }\n.de-img-n { left: 50%; top: 0; cursor: ns-resize; }\n.de-img-ne { left: 100%; top: 0; cursor: nesw-resize; }\n.de-img-e { left: 100%; top: 50%; cursor: ew-resize; }\n.de-img-se { left: 100%; top: 100%; cursor: nwse-resize; }\n.de-img-s { left: 50%; top: 100%; cursor: ns-resize; }\n.de-img-sw { left: 0; top: 100%; cursor: nesw-resize; }\n.de-img-w { left: 0; top: 50%; cursor: ew-resize; }\n.de-img-size {\n position: absolute;\n left: 50%;\n bottom: -28px;\n transform: translateX(-50%);\n padding: 2px 6px;\n border-radius: 4px;\n background: rgba(32, 33, 36, 0.85);\n color: #fff;\n font: 11px/1.4 system-ui, sans-serif;\n white-space: nowrap;\n}\n.de-outline {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 6;\n display: flex;\n flex-direction: column;\n width: 240px;\n max-height: calc(100% - 24px);\n overflow-y: auto;\n padding: 6px 6px 10px;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 2px 6px 2px rgba(60, 64, 67, 0.15), 0 1px 2px rgba(60, 64, 67, 0.3);\n font: 13px/1.35 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n}\n.de-outline-head { flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; padding: 4px 4px 6px 10px; font-weight: 600; color: #1f1f1f; }\n.de-outline-item {\n display: block;\n flex-shrink: 0;\n width: 100%;\n padding: 5px 10px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: #3c4043;\n font: inherit;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n}\n.de-outline-item:hover { background: #f1f3f4; }\n.de-outline-item.on { color: #0b57d0; font-weight: 600; }\n.de-outline-empty { flex-shrink: 0; padding: 8px 10px; color: var(--de-muted); }\n.de-outline-toggle {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 6;\n width: 34px;\n height: 34px;\n border: 1px solid var(--de-border);\n border-radius: 8px;\n background: #fff;\n box-shadow: var(--de-shadow);\n font-size: 16px;\n cursor: pointer;\n}\n.de-outline-toggle.on { display: none; }\n.de-symbols { display: grid; grid-template-columns: repeat(12, 26px); gap: 2px; }\n.de-symbols button {\n width: 26px;\n height: 26px;\n padding: 0;\n border: 0;\n border-radius: 4px;\n background: transparent;\n font: 15px/1 system-ui, sans-serif;\n color: #1f1f1f;\n cursor: pointer;\n}\n.de-symbols button:hover { background: #e8f0fe; }\n.de-dialog-back {\n position: fixed;\n inset: 0;\n z-index: 60;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 18vh;\n background: rgba(32, 33, 36, 0.32);\n}\n.de-dialog {\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: min(420px, calc(100vw - 32px));\n padding: 20px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 28px rgba(0, 0, 0, 0.28);\n font: 14px/1.4 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n color: #1f1f1f;\n}\n.de-dialog-title { font-size: 16px; font-weight: 600; }\n.de-dialog-label, .de-dialog-note { color: var(--de-muted); font-size: 12.5px; }\n.de-dialog input, .de-dialog textarea {\n width: 100%;\n padding: 8px 10px;\n border: 1px solid #747775;\n border-radius: 6px;\n font: inherit;\n outline: none;\n resize: vertical;\n}\n.de-dialog input:focus, .de-dialog textarea:focus { border-color: var(--de-accent); box-shadow: inset 0 0 0 1px var(--de-accent); }\n.de-dialog-btns { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; }\n.de-dialog-btns .de-btn { padding: 7px 14px; border: 1px solid var(--de-border); border-radius: 18px; background: #fff; }\n.de-dialog-btns .de-btn-primary { background: var(--de-accent); border-color: var(--de-accent); color: #fff; }\n.de-dialog-btns .de-btn-primary:hover { background: #1765cc; }\n.de-dialog-extra { margin-right: auto; }\n.de-toast {\n position: absolute;\n left: 50%;\n bottom: 24px;\n z-index: 60;\n transform: translateX(-50%);\n padding: 10px 16px;\n border-radius: 6px;\n background: #323232;\n color: #fff;\n font: 13px/1.4 system-ui, sans-serif;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n}\n\n/* xlsx: find, borders popover */\n.de-xlsx { position: relative; }\n.de-xlsx .de-find { top: 40px; }\n.de-find-opts { gap: 10px; padding: 2px 4px; color: #3c4043; font-size: 12px; }\n.de-find-opt { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; user-select: none; }\n.de-findcell { position: absolute; z-index: 1; background: rgba(251, 188, 4, 0.28); pointer-events: none; }\n.de-findcell.on { background: rgba(255, 150, 50, 0.45); box-shadow: inset 0 0 0 1.5px #e37400; }\n.de-borders-pop { display: flex; gap: 8px; align-items: flex-start; }\n.de-borders-side { display: flex; flex-direction: column; gap: 4px; padding-left: 8px; border-left: 1px solid #e3e3e3; }\n.de-find .de-find-opt input { width: auto; height: auto; margin: 0; padding: 0; accent-color: var(--de-accent); }\n.de-find-opts { justify-content: flex-start; }\n\n/* ---------------------------------------------------------------- collaboration */\n.de-collab { display: inline-flex; align-items: center; gap: 8px; flex: none; }\n.de-collab-status { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 9px; border-radius: 12px; font-size: 12px; color: var(--de-muted); background: var(--de-head); white-space: nowrap; }\n.de-collab-dot { width: 7px; height: 7px; border-radius: 50%; background: #9aa0a6; flex: none; }\n.de-collab-live .de-collab-dot { background: #1e8e3e; box-shadow: 0 0 0 3px rgba(30, 142, 62, 0.18); }\n.de-collab-live { color: #137333; }\n.de-collab-connecting .de-collab-dot,\n.de-collab-syncing .de-collab-dot { background: #f9ab00; animation: de-collab-pulse 1s ease-in-out infinite alternate; }\n.de-collab-offline .de-collab-dot { background: #9aa0a6; }\n.de-collab-error { color: #c5221f; }\n.de-collab-error .de-collab-dot { background: #d93025; }\n@keyframes de-collab-pulse { to { opacity: 0.35; } }\n@media (max-width: 640px) { .de-collab-label { display: none; } }\n.de-peers { display: inline-flex; align-items: center; }\n.de-peer {\n display: inline-grid; place-items: center; width: 26px; height: 26px; margin-left: -6px; border-radius: 50%;\n border: 2px solid var(--de-chrome); color: #fff; font-size: 11px; font-weight: 600; letter-spacing: 0.02em; cursor: default; user-select: none;\n}\n.de-peer:first-child { margin-left: 0; }\n.de-peer-more { background: var(--de-muted); }\n.de-peer-layer { position: absolute; inset: 0; pointer-events: none; overflow: hidden; z-index: 4; }\n.de-peer-caret { position: absolute; width: 2px; margin-left: -1px; background: var(--peer); border-radius: 1px; }\n.de-peer-caret::before { content: ''; position: absolute; top: -3px; left: -2px; width: 6px; height: 6px; border-radius: 50%; background: var(--peer); }\n.de-peer-flag {\n position: absolute; bottom: 100%; left: -1px; margin-bottom: 2px; padding: 1px 6px; border-radius: 4px 4px 4px 0; background: var(--peer);\n color: #fff; font: 600 11px/16px system-ui, -apple-system, 'Segoe UI', sans-serif; white-space: nowrap;\n}\n.de-peer-sel { position: absolute; background: var(--peer); opacity: 0.18; border-radius: 1px; }\n.de-peer-outline { position: absolute; border: 2px solid var(--peer); border-radius: 3px; }\n.de-peer-outline > .de-peer-flag { left: -2px; margin-bottom: 1px; }\n.de-peer-range { position: absolute; border: 2px solid; pointer-events: none; z-index: 2; }\n.de-peer-tag {\n position: absolute; top: -17px; left: -2px; padding: 0 5px; border-radius: 3px 3px 3px 0; color: #fff;\n font: 600 10px/15px system-ui, -apple-system, 'Segoe UI', sans-serif; white-space: nowrap;\n}\n","import css from './styles.css?inline'\n\nconst ID = 'office-engine-styles'\n\n/** Injects the viewer stylesheet once into a document or shadow root. */\nexport function injectStyles(target: Document | ShadowRoot | undefined = typeof document !== 'undefined' ? document : undefined) {\n if (!target) return\n const host = target instanceof Document ? target.head : target\n if (host.querySelector?.(`style#${ID}`)) return\n const el = (target instanceof Document ? target : target.ownerDocument).createElement('style')\n el.id = ID\n el.textContent = css\n host.appendChild(el)\n}\n\nexport { css as stylesText }\n","import { cssFont } from '../../core/fonts'\nimport type { PParaSpec, PRunSet, SlideModel, TextBody, TPara, TRun } from '../../core/pptx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { ordered, RichInput, type ReplaceOpts, type RichHost } from '../edit/input'\nimport { collapsed, formatRange, normalize, plen, runAt, type RRun, type Sel } from '../edit/rich'\n\ntype RunStyle = Omit<TRun, 'text' | 'br' | 'fld' | 'src' | 'href'>\n\nexport interface EPara {\n runs: RRun[]\n base: TPara\n algn: TPara['algn']\n algnSet?: boolean\n /** paragraph changes made here (written back) */\n pp?: { lvl?: number; bullet?: 'none' | 'bullet' | 'number'; lnPct?: number }\n k?: number\n caret?: RRun\n}\n\ninterface Entry {\n before: EPara[]\n after: EPara[]\n selBefore: Sel\n selAfter: Sel\n label: string\n t: number\n}\n\nexport interface PptxFormat {\n b: boolean\n i: boolean\n u: boolean\n strike: boolean\n sz?: number\n color?: string\n font?: string\n algn?: string\n hl?: string\n baseline?: number\n bullet?: 'none' | 'bullet' | 'number'\n lvl: number\n lnPct?: number\n}\n\nconst styleOf = (r: TRun): RunStyle => ({ sz: r.sz, b: r.b, i: r.i, u: r.u, strike: r.strike, color: r.color, font: r.font, baseline: r.baseline, caps: r.caps, hl: r.hl })\n\nfunction toEdit(p: TPara): EPara {\n const runs: RRun[] = p.runs.map((r) =>\n r.fld ? { t: 'fld', text: r.text, s: styleOf(r), src: r.src } : { t: 'text', text: r.br ? '\\n' : r.text, s: styleOf(r), src: r.src },\n )\n return { runs: normalize(runs), base: p, algn: p.algn, k: p.k }\n}\n\nconst bulletOf = (p: EPara) => p.pp?.bullet ?? p.base.buKind ?? 'none'\nconst lvlOf = (p: EPara) => p.pp?.lvl ?? p.base.lvl ?? 0\n\nexport function toTPara(p: EPara, num = 0): TPara {\n const kind = bulletOf(p)\n const lvl = lvlOf(p)\n const sz = (p.runs.find((r) => r.t === 'text')?.s as RunStyle | undefined)?.sz ?? p.base.endSz\n // approximate the look of edited bullets / levels until the slide is re-rendered\n const bullet = !p.pp?.bullet ? p.base.bullet : kind === 'none' ? undefined : { text: kind === 'bullet' ? '•' : `${num}.`, sz, color: p.base.bullet?.color }\n const shift = (lvl - (p.base.lvl ?? 0)) * 48\n const hang = p.pp?.bullet && kind !== 'none' && !p.base.bullet ? 27 : 0\n return {\n ...p.base,\n bullet,\n marL: Math.max(0, p.base.marL + shift + hang),\n indent: hang ? -hang : p.base.indent,\n lnPct: p.pp?.lnPct ?? p.base.lnPct,\n algn: p.algn,\n runs: p.runs.map((r) => (r.t === 'fld' ? { ...(r.s as RunStyle), text: r.text ?? '', fld: true } : { ...(r.s as RunStyle), text: r.text ?? '' })) as TRun[],\n }\n}\n\n/** Text editing of one shape on one slide. */\nexport class PptxEditor implements RichHost<EPara> {\n readonly input: RichInput\n paras: EPara[] = []\n body?: TextBody\n slide = -1\n sid = -1\n pendingSel: Sel | null = null\n private history: Entry[] = []\n private future: Entry[] = []\n private pend: { s: Partial<RunStyle>; d: PRunSet; at: { pa: string; o: number } } | null = null\n private timer: ReturnType<typeof setTimeout> | undefined\n private changedSinceCommit = false\n onChange?: () => void\n onCommitted?: (slide: number, model: SlideModel) => void\n onDirty?: () => void\n onState?: (s: PptxFormat | null) => void\n\n constructor(private client: DocumentClient) {\n this.input = new RichInput(this)\n }\n\n get active() {\n return this.sid >= 0\n }\n\n begin(slide: number, sid: number, body: TextBody) {\n this.end()\n this.slide = slide\n this.sid = sid\n this.body = body\n this.paras = (body.paras.length ? body.paras : [{ algn: 'left', marL: 0, indent: 0, spcBef: 0, spcAft: 0, runs: [], endSz: 18 } as TPara]).map(toEdit)\n this.history = []\n this.future = []\n this.pend = null\n }\n\n end() {\n if (this.sid >= 0 && this.changedSinceCommit) this.commit()\n this.input.detach()\n this.sid = -1\n this.slide = -1\n this.body = undefined\n this.onState?.(null)\n }\n\n text(): TextBody | undefined {\n if (!this.body) return undefined\n const counters: number[] = []\n const paras = this.paras.map((p) => {\n const lvl = lvlOf(p)\n if (bulletOf(p) === 'number') counters[lvl] = (counters[lvl] ?? 0) + 1\n else counters[lvl] = 0\n counters.length = lvl + 1\n return toTPara(p, counters[lvl])\n })\n return { ...this.body, empty: false, paras }\n }\n\n // ---------------------------------------------------------------- RichHost\n\n para(pa: string) {\n return this.paras[Number(pa)]\n }\n span(a: string, b: string) {\n const out: string[] = []\n for (let i = Number(a); i <= Number(b); i++) out.push(String(i))\n return out\n }\n prev(pa: string) {\n return Number(pa) > 0 ? String(Number(pa) - 1) : undefined\n }\n next(pa: string) {\n return Number(pa) < this.paras.length - 1 ? String(Number(pa) + 1) : undefined\n }\n cmp(a: string, b: string) {\n return Number(a) - Number(b)\n }\n withRuns(p: EPara, runs: RRun[]): EPara {\n return { ...p, runs }\n }\n split(p: EPara, left: RRun[], right: RRun[]): [EPara, EPara] {\n return [\n { ...p, runs: left },\n { ...p, runs: right, caret: right.length ? undefined : runAt(left, plen(left)) ?? p.caret },\n ]\n }\n join(a: EPara, _b: EPara, runs: RRun[]): EPara {\n return { ...a, runs }\n }\n defaultRun(p: EPara): Partial<RRun> | undefined {\n if (p.caret) return { ...p.caret, text: '' }\n const last = [...p.runs].reverse().find((r) => r.t === 'text')\n return last ? { ...last, text: '' } : { t: 'text', s: { sz: p.base.endSz } }\n }\n pendingStyle() {\n return this.pend ? ({ s: this.pend.s, d: this.pend.d } as Partial<RRun>) : undefined\n }\n clearPending() {\n this.pend = null\n }\n\n replace(pas: string[], next: EPara[], sel: Sel, opts: ReplaceOpts & { history?: boolean } = {}) {\n const before = this.paras\n const i0 = Number(pas[0])\n this.paras = [...before.slice(0, i0), ...next, ...before.slice(i0 + pas.length)]\n if (opts.history !== false) {\n const now = Date.now()\n const last = this.history[this.history.length - 1]\n const label = opts.label ?? 'edit'\n if (label === 'type' && last?.label === 'type' && now - last.t < 1500) {\n last.after = this.paras\n last.selAfter = sel\n last.t = now\n } else this.history.push({ before, after: this.paras, selBefore: this.input.lastSel ?? sel, selAfter: sel, label, t: now })\n this.future = []\n }\n this.pendingSel = sel\n this.changedSinceCommit = true\n this.onDirty?.()\n clearTimeout(this.timer)\n this.timer = setTimeout(() => this.commit(), 400)\n this.onChange?.()\n this.onState?.(this.state(sel))\n }\n\n undo() {\n const e = this.history.pop()\n if (!e) return\n this.future.push(e)\n this.restore(e.before, e.selBefore)\n }\n redo() {\n const e = this.future.pop()\n if (!e) return\n this.history.push(e)\n this.restore(e.after, e.selAfter)\n }\n private restore(paras: EPara[], sel: Sel) {\n this.paras = paras\n this.pendingSel = sel\n this.changedSinceCommit = true\n clearTimeout(this.timer)\n this.timer = setTimeout(() => this.commit(), 400)\n this.onChange?.()\n this.onState?.(this.state(sel))\n }\n\n commit() {\n clearTimeout(this.timer)\n if (this.sid < 0 || !this.changedSinceCommit) return\n this.changedSinceCommit = false\n const slide = this.slide\n const specs: PParaSpec[] = this.paras.map((p) => ({\n k: p.k,\n algn: p.algnSet ? p.algn : undefined,\n ...p.pp,\n runs: p.runs.map((r) =>\n r.t === 'fld' ? { text: '', src: r.src as [number, number], fld: true } : { text: r.text ?? '', src: r.src as [number, number] | undefined, set: r.d as PRunSet | undefined },\n ),\n }))\n this.client\n .call('pptx.setText', slide, this.sid, specs)\n .then((m) => this.onCommitted?.(slide, m))\n .catch((e) => console.error('[office-engine] slide edit failed', e))\n }\n\n // ---------------------------------------------------------------- formatting\n\n format(s: Partial<RunStyle>, d: PRunSet) {\n const sel = this.input.sel()\n if (!sel) return\n if (collapsed(sel)) {\n this.pend = { s: { ...(this.pend?.s ?? {}), ...s }, d: { ...(this.pend?.d ?? {}), ...d }, at: sel.a }\n this.input.restore(sel)\n this.onState?.(this.state(sel))\n return\n }\n const [a, b] = ordered(this, sel)\n const pas = this.span(a.pa, b.pa)\n const next = pas.map((pa, i) => {\n const p = this.para(pa)\n const from = i === 0 ? a.o : 0\n const to = i === pas.length - 1 ? b.o : plen(p.runs)\n return this.withRuns(p, formatRange(p.runs, from, to, s, d))\n })\n this.replace(pas, next, sel, { label: 'format' })\n }\n\n toggle(key: 'b' | 'i' | 'u' | 'strike') {\n const st = this.state()\n const on = !(st && st[key])\n this.format({ [key]: on }, { [key]: on })\n }\n\n setSize(sz: number) {\n this.format({ sz }, { sz })\n }\n setColor(c: string | null) {\n this.format({ color: c ?? undefined }, { color: c })\n }\n setFont(name: string) {\n this.format({ font: cssFont(name) }, { font: name })\n }\n\n setAlign(algn: TPara['algn']) {\n const sel = this.input.sel()\n if (!sel) return\n const [a, b] = ordered(this, sel)\n const pas = this.span(a.pa, b.pa)\n this.replace(pas, pas.map((pa) => ({ ...this.para(pa), algn, algnSet: true })), sel, { label: 'align' })\n }\n\n /** applies a paragraph-level change to the selected paragraphs */\n private paraOp(fn: (p: EPara) => EPara, label: string) {\n const sel = this.input.sel()\n if (!sel) return\n const [a, b] = ordered(this, sel)\n const pas = this.span(a.pa, b.pa)\n this.replace(pas, pas.map((pa) => fn(this.para(pa))), sel, { label })\n }\n\n toggleBullet(kind: 'bullet' | 'number') {\n const st = this.state()\n const next = st?.bullet === kind ? 'none' : kind\n this.paraOp((p) => ({ ...p, pp: { ...p.pp, bullet: next } }), 'bullet')\n }\n\n indentLevel(d: 1 | -1) {\n this.paraOp((p) => ({ ...p, pp: { ...p.pp, lvl: Math.max(0, Math.min(8, lvlOf(p) + d)) } }), 'indent')\n }\n\n setLineSpacing(x: number) {\n this.paraOp((p) => ({ ...p, pp: { ...p.pp, lnPct: x } }), 'spacing')\n }\n\n setHighlight(c: string | null) {\n this.format({ hl: c ?? undefined }, { hl: c })\n }\n\n toggleBaseline(kind: 'sup' | 'sub') {\n const cur = this.state()?.baseline ?? 0\n const v = kind === 'sup' ? (cur > 0 ? 0 : 30) : cur < 0 ? 0 : -25\n this.format({ baseline: v || undefined }, { baseline: v || null })\n }\n\n clearFormat() {\n this.format({ b: false, i: false, u: false, strike: false, hl: undefined, baseline: undefined }, { b: false, i: false, u: false, strike: false, hl: null, baseline: null })\n }\n\n state(sel = this.input.sel()): PptxFormat | null {\n if (!sel || this.sid < 0) return null\n const [a] = ordered(this, sel)\n const p = this.para(a.pa)\n if (!p) return null\n const run = runAt(p.runs, collapsed(sel) ? a.o : a.o + 1)\n const s = { ...((run?.s ?? {}) as RunStyle), ...(collapsed(sel) ? this.pend?.s ?? {} : {}) }\n return {\n b: !!s.b,\n i: !!s.i,\n u: !!s.u,\n strike: !!s.strike,\n sz: s.sz,\n color: s.color,\n font: s.font,\n algn: p.algn,\n hl: s.hl,\n baseline: s.baseline,\n bullet: bulletOf(p),\n lvl: lvlOf(p),\n lnPct: p.pp?.lnPct ?? p.base.lnPct,\n }\n }\n\n onSelection(sel: Sel | null) {\n if (sel && this.pend && (sel.a.pa !== this.pend.at.pa || sel.a.o !== this.pend.at.o)) this.pend = null\n this.onState?.(sel ? this.state(sel) : null)\n }\n\n shortcut?: (e: KeyboardEvent) => boolean\n}\n","import { useEffect, useState } from 'react'\nimport type { ShapeKind } from '../../core/pptx/types'\nimport { MOD } from '../common/ContextMenu'\nimport { EditorBar } from '../common/Slots'\nimport { Btn, ColorBtn, Dropdown, fontName, fontOptions, Menu, Select, Sep, SizeBox, type DropOption } from '../edit/Toolbar'\nimport type { PptxEditor, PptxFormat } from './PptxEditor'\n\nconst HIGHLIGHTS = ['#ffff00', '#00ff00', '#00ffff', '#ff00ff', '#ff0000', '#0000ff', '#ffc000', '#92d050', '#c0c0c0', '#000000']\n\nexport const SHAPES: DropOption<string>[] = [\n { value: 'text', label: 'Text box', icon: 'textbox' },\n { value: 'image', label: 'Image…', icon: 'image' },\n { value: 'line', label: 'Line', icon: 'line' },\n { value: 'rect', label: 'Rectangle', icon: 'rect', sep: true },\n { value: 'roundRect', label: 'Rounded rectangle', icon: 'roundRect' },\n { value: 'ellipse', label: 'Ellipse', icon: 'ellipse' },\n { value: 'triangle', label: 'Triangle', icon: 'triangle' },\n { value: 'rtTriangle', label: 'Right triangle' },\n { value: 'diamond', label: 'Diamond' },\n { value: 'parallelogram', label: 'Parallelogram' },\n { value: 'trapezoid', label: 'Trapezoid' },\n { value: 'pentagon', label: 'Pentagon' },\n { value: 'hexagon', label: 'Hexagon' },\n { value: 'octagon', label: 'Octagon' },\n { value: 'donut', label: 'Donut' },\n { value: 'can', label: 'Cylinder' },\n { value: 'heart', label: 'Heart' },\n { value: 'plus', label: 'Plus' },\n { value: 'rightArrow', label: 'Arrow right', icon: 'arrow', sep: true },\n { value: 'leftArrow', label: 'Arrow left' },\n { value: 'upArrow', label: 'Arrow up' },\n { value: 'downArrow', label: 'Arrow down' },\n { value: 'leftRightArrow', label: 'Double arrow' },\n { value: 'chevron', label: 'Chevron' },\n { value: 'homePlate', label: 'Pentagon arrow' },\n { value: 'star4', label: '4-point star', sep: true },\n { value: 'star5', label: '5-point star', icon: 'star' },\n { value: 'star6', label: '6-point star' },\n { value: 'wedgeRectCallout', label: 'Callout', sep: true },\n { value: 'wedgeRoundRectCallout', label: 'Rounded callout' },\n]\n\nconst LINE_W = [0.75, 1, 1.5, 2.25, 3, 4.5, 6].map((w) => ({ value: w, label: `${w} pt` }))\nconst DASHES = [\n { value: 'solid', label: 'Solid', hint: '────' },\n { value: 'sysDot', label: 'Dotted', hint: '········' },\n { value: 'dash', label: 'Dashed', hint: '- - - -' },\n { value: 'lgDash', label: 'Long dash', hint: '— — —' },\n { value: 'dashDot', label: 'Dash dot', hint: '-·-·-·' },\n]\nconst SPACING = [1, 1.15, 1.5, 2].map((v) => ({ value: v, label: v === 1 ? 'Single' : v === 2 ? 'Double' : String(v) }))\nconst VALIGN = [\n { value: 't', label: 'Top', icon: 'vTop' },\n { value: 'ctr', label: 'Middle', icon: 'vMiddle' },\n { value: 'b', label: 'Bottom', icon: 'vBottom' },\n] as const\n\nexport type Arrange = 'front' | 'forward' | 'backward' | 'back'\nexport type Rotate = 'cw' | 'ccw' | 'flipH' | 'flipV'\nexport type AlignTo = 'left' | 'center' | 'right' | 'top' | 'middle' | 'bottom'\nexport type SlideCmd = 'add' | 'duplicate' | 'delete' | 'up' | 'down' | 'hide'\n\nexport function PptxToolbar(props: {\n editor: PptxEditor\n /** selected shape (not editing its text) */\n shape: { canText: boolean; anchor?: 't' | 'ctr' | 'b' } | null\n /** anchor of the text box being edited */\n textAnchor?: 't' | 'ctr' | 'b'\n canUndo: boolean\n onUndo: (redo: boolean) => void\n onInsert: (k: ShapeKind) => void\n onFill: (c: string | null) => void\n onLine: (p: { color?: string | null; w?: number; dash?: string }) => void\n onArrange: (k: Arrange) => void\n onRotate: (k: Rotate) => void\n onAlign: (k: AlignTo) => void\n onAnchor: (a: 't' | 'ctr' | 'b') => void\n onDuplicate: () => void\n onDelete: () => void\n onBackground: (c: string | null) => void\n onSlide: (k: SlideCmd) => void\n onPresent: (fromStart: boolean) => void\n}) {\n const { editor } = props\n const [st, setSt] = useState<PptxFormat | null>(null)\n useEffect(() => {\n editor.onState = setSt\n return () => {\n editor.onState = undefined\n }\n }, [editor])\n const text = !!st && editor.active\n const font = fontName(st?.font)\n const sz = st?.sz ? Math.round(st.sz * 2) / 2 : undefined\n const anchor = text ? props.textAnchor : props.shape?.anchor\n return (\n <EditorBar>\n <Btn icon=\"undo\" title={`Undo (${MOD}Z)`} disabled={!text && !props.canUndo} onClick={() => (text ? editor.undo() : props.onUndo(false))} />\n <Btn icon=\"redo\" title={`Redo (${MOD}Y)`} onClick={() => (text ? editor.redo() : props.onUndo(true))} />\n <Sep />\n <Menu title=\"Insert\" label=\"Insert\" icon=\"plus\" items={SHAPES as { value: string; label: string; icon?: string; sep?: boolean }[]} onPick={(v) => props.onInsert(v)} />\n <Menu\n title=\"Slide\"\n label=\"Slide\"\n icon=\"slideAdd\"\n items={[\n { value: 'add', label: 'New slide', icon: 'slideAdd', hint: `${MOD}M` },\n { value: 'duplicate', label: 'Duplicate slide', icon: 'copy' },\n { value: 'delete', label: 'Delete slide', icon: 'trash' },\n { value: 'up', label: 'Move slide up', icon: 'up', sep: true },\n { value: 'down', label: 'Move slide down', icon: 'down' },\n { value: 'hide', label: 'Hide / show slide', icon: 'hide', sep: true },\n ]}\n onPick={(v) => props.onSlide(v as SlideCmd)}\n />\n <Sep />\n {text ? (\n <>\n <Select title=\"Font\" width={112} menuWidth={200} value={font} placeholder=\"Font\" options={fontOptions(font)} onChange={(v) => editor.setFont(v)} />\n <Sep />\n <SizeBox value={sz} onChange={(v) => editor.setSize(v)} />\n <Sep />\n <Btn icon=\"bold\" title={`Bold (${MOD}B)`} active={st?.b} onClick={() => editor.toggle('b')} />\n <Btn icon=\"italic\" title={`Italic (${MOD}I)`} active={st?.i} onClick={() => editor.toggle('i')} />\n <Btn icon=\"underline\" title={`Underline (${MOD}U)`} active={st?.u} onClick={() => editor.toggle('u')} />\n <Btn icon=\"strike\" title=\"Strikethrough\" active={st?.strike} onClick={() => editor.toggle('strike')} />\n <ColorBtn icon=\"color\" title=\"Text color\" value={st?.color} onPick={(c) => editor.setColor(c)} noneLabel=\"Automatic\" />\n <ColorBtn icon=\"highlight\" title=\"Highlight color\" value={st?.hl} palette={HIGHLIGHTS} onPick={(c) => editor.setHighlight(c)} />\n <Btn icon=\"sup\" title=\"Superscript\" active={(st?.baseline ?? 0) > 0} onClick={() => editor.toggleBaseline('sup')} />\n <Btn icon=\"sub\" title=\"Subscript\" active={(st?.baseline ?? 0) < 0} onClick={() => editor.toggleBaseline('sub')} />\n <Sep />\n <Btn icon=\"alignLeft\" title=\"Align left\" active={st?.algn === 'left'} onClick={() => editor.setAlign('left')} />\n <Btn icon=\"alignCenter\" title=\"Center\" active={st?.algn === 'center'} onClick={() => editor.setAlign('center')} />\n <Btn icon=\"alignRight\" title=\"Align right\" active={st?.algn === 'right'} onClick={() => editor.setAlign('right')} />\n <Btn icon=\"justify\" title=\"Justify\" active={st?.algn === 'justify'} onClick={() => editor.setAlign('justify')} />\n <Dropdown title=\"Vertical align\" icon={VALIGN.find((x) => x.value === anchor)?.icon ?? 'vTop'} label={null} menuWidth={140} value={anchor ?? 't'} options={VALIGN.map((x) => ({ ...x }))} onChange={props.onAnchor} />\n <Dropdown\n title=\"Line spacing\"\n icon=\"lineSpacing\"\n label={null}\n menuWidth={140}\n value={st?.lnPct ? Math.round(st.lnPct * 100) / 100 : ''}\n options={SPACING}\n onChange={(v) => editor.setLineSpacing(v)}\n />\n <Sep />\n <Btn icon=\"bullets\" title=\"Bulleted list\" active={st?.bullet === 'bullet'} onClick={() => editor.toggleBullet('bullet')} />\n <Btn icon=\"numbers\" title=\"Numbered list\" active={st?.bullet === 'number'} onClick={() => editor.toggleBullet('number')} />\n <Btn icon=\"outdent\" title=\"Decrease indent (Shift+Tab)\" disabled={!st?.lvl} onClick={() => editor.indentLevel(-1)} />\n <Btn icon=\"indent\" title=\"Increase indent\" onClick={() => editor.indentLevel(1)} />\n <Btn icon=\"clear\" title=\"Clear formatting\" onClick={() => editor.clearFormat()} />\n </>\n ) : props.shape ? (\n <>\n <ColorBtn icon=\"fill\" title=\"Fill color\" onPick={props.onFill} noneLabel=\"Transparent\" />\n <ColorBtn icon=\"borders\" title=\"Border color\" onPick={(c) => props.onLine({ color: c })} noneLabel=\"Transparent\" />\n <Dropdown title=\"Border weight\" icon=\"lineWeight\" label={null} menuWidth={120} options={LINE_W} onChange={(w) => props.onLine({ w })} />\n <Dropdown title=\"Border dash\" icon=\"lineStyle\" label={null} menuWidth={170} options={DASHES} onChange={(dash) => props.onLine({ dash })} />\n <Sep />\n <Menu\n title=\"Arrange\"\n label=\"Arrange\"\n icon=\"front\"\n items={[\n { value: 'front', label: 'Bring to front', icon: 'front', hint: `${MOD}⇧↑` },\n { value: 'forward', label: 'Bring forward', hint: `${MOD}↑` },\n { value: 'backward', label: 'Send backward', hint: `${MOD}↓` },\n { value: 'back', label: 'Send to back', icon: 'back', hint: `${MOD}⇧↓` },\n ]}\n onPick={(v) => props.onArrange(v as Arrange)}\n />\n <Dropdown\n title=\"Rotate\"\n icon=\"rotate\"\n label={null}\n menuWidth={220}\n options={[\n { value: 'cw', label: 'Rotate 90° clockwise', icon: 'rotate' },\n { value: 'ccw', label: 'Rotate 90° counter-clockwise', icon: 'rotateCcw' },\n { value: 'flipH', label: 'Flip horizontally', icon: 'flipH', sep: true },\n { value: 'flipV', label: 'Flip vertically', icon: 'flipV' },\n ]}\n onChange={(v) => props.onRotate(v as Rotate)}\n />\n <Dropdown\n title=\"Align on slide\"\n icon=\"alignObj\"\n label={null}\n menuWidth={150}\n options={[\n { value: 'left', label: 'Left', icon: 'alignLeft' },\n { value: 'center', label: 'Center', icon: 'alignCenter' },\n { value: 'right', label: 'Right', icon: 'alignRight' },\n { value: 'top', label: 'Top', icon: 'vTop', sep: true },\n { value: 'middle', label: 'Middle', icon: 'vMiddle' },\n { value: 'bottom', label: 'Bottom', icon: 'vBottom' },\n ]}\n onChange={(v) => props.onAlign(v as AlignTo)}\n />\n {props.shape.canText && (\n <Dropdown title=\"Vertical text align\" icon={VALIGN.find((x) => x.value === anchor)?.icon ?? 'vTop'} label={null} menuWidth={140} value={anchor ?? 't'} options={VALIGN.map((x) => ({ ...x }))} onChange={props.onAnchor} />\n )}\n <Sep />\n <Btn icon=\"copy\" title={`Duplicate (${MOD}D)`} onClick={props.onDuplicate} />\n <Btn icon=\"trash\" title=\"Delete (Del)\" onClick={props.onDelete} />\n </>\n ) : (\n <>\n <ColorBtn icon=\"fill\" title=\"Slide background\" onPick={props.onBackground} noneLabel=\"Layout default\" />\n <span className=\"de-tb-hint\">Click a shape or text to edit it</span>\n </>\n )}\n <Sep />\n <Dropdown\n title=\"Present\"\n icon=\"play\"\n label=\"Present\"\n menuWidth={200}\n options={[\n { value: 'cur', label: 'From current slide', hint: 'F5' },\n { value: 'start', label: 'From beginning', hint: '⇧F5' },\n ]}\n onChange={(v) => props.onPresent(v === 'start')}\n />\n </EditorBar>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { PresentationMeta } from '../../core/pptx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { SlideSlot } from './PptxView'\n\n/** Full-screen slideshow: ←/→/Space/PageUp/PageDown/Home/End, click = next, Esc = exit. */\nexport function Presenter({ client, meta, start, onClose }: { client: DocumentClient; meta: PresentationMeta; start: number; onClose: () => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const visible = meta.slides.filter((s) => !s.hidden).map((s) => s.index)\n const order = visible.length ? visible : meta.slides.map((s) => s.index)\n const [pos, setPos] = useState(Math.max(0, order.findIndex((i) => i >= start)))\n const [vw, setVw] = useState({ w: window.innerWidth, h: window.innerHeight })\n\n useEffect(() => {\n const el = ref.current\n el?.focus()\n el?.requestFullscreen?.().catch(() => {})\n const resize = () => setVw({ w: window.innerWidth, h: window.innerHeight })\n const exitFs = () => !document.fullscreenElement && onClose()\n window.addEventListener('resize', resize)\n document.addEventListener('fullscreenchange', exitFs)\n return () => {\n window.removeEventListener('resize', resize)\n document.removeEventListener('fullscreenchange', exitFs)\n if (document.fullscreenElement) document.exitFullscreen().catch(() => {})\n }\n }, [onClose])\n\n const go = (d: number) => setPos((p) => Math.max(0, Math.min(order.length - 1, p + d)))\n const scale = Math.min(vw.w / meta.w, vw.h / meta.h)\n return (\n <div\n ref={ref}\n className=\"de-present\"\n tabIndex={-1}\n onClick={() => go(1)}\n onContextMenu={(e) => {\n e.preventDefault()\n go(-1)\n }}\n onKeyDown={(e) => {\n if (['ArrowRight', 'ArrowDown', 'PageDown', ' ', 'Enter', 'n'].includes(e.key)) go(1)\n else if (['ArrowLeft', 'ArrowUp', 'PageUp', 'Backspace', 'p'].includes(e.key)) go(-1)\n else if (e.key === 'Home') setPos(0)\n else if (e.key === 'End') setPos(order.length - 1)\n else if (e.key === 'Escape') onClose()\n else return\n e.preventDefault()\n }}\n >\n <div style={{ width: meta.w * scale, height: meta.h * scale }}>\n <SlideSlot key={order[pos]} client={client} index={order[pos]} meta={meta} scale={scale} live />\n </div>\n <div className=\"de-present-n\">\n {pos + 1} / {order.length}\n </div>\n </div>\n )\n}\n","/** SVG paths for common DrawingML preset geometries (box-local px). Unknown presets fall back to a rectangle. */\ntype Adj = Record<string, number> | undefined\n\nconst f = (n: number) => +n.toFixed(2)\nconst poly = (pts: [number, number][]) => 'M' + pts.map(([x, y]) => `${f(x)} ${f(y)}`).join(' L') + ' Z'\nconst a = (adj: Adj, name: string, def: number) => (adj?.[name] ?? def) / 100000\n\nfunction ellipse(w: number, h: number) {\n const rx = w / 2\n const ry = h / 2\n return `M0 ${f(ry)} A${f(rx)} ${f(ry)} 0 1 0 ${f(w)} ${f(ry)} A${f(rx)} ${f(ry)} 0 1 0 0 ${f(ry)} Z`\n}\n\nfunction roundRect(w: number, h: number, r: number) {\n r = Math.min(r, w / 2, h / 2)\n return `M${f(r)} 0 H${f(w - r)} A${f(r)} ${f(r)} 0 0 1 ${f(w)} ${f(r)} V${f(h - r)} A${f(r)} ${f(r)} 0 0 1 ${f(w - r)} ${f(h)} H${f(r)} A${f(r)} ${f(r)} 0 0 1 0 ${f(h - r)} V${f(r)} A${f(r)} ${f(r)} 0 0 1 ${f(r)} 0 Z`\n}\n\nfunction regular(w: number, h: number, n: number, rot = -Math.PI / 2) {\n const pts: [number, number][] = []\n for (let i = 0; i < n; i++) {\n const t = rot + (i * 2 * Math.PI) / n\n pts.push([w / 2 + (w / 2) * Math.cos(t), h / 2 + (h / 2) * Math.sin(t)])\n }\n return poly(pts)\n}\n\nfunction star(w: number, h: number, n: number, inner: number) {\n const pts: [number, number][] = []\n for (let i = 0; i < n * 2; i++) {\n const t = -Math.PI / 2 + (i * Math.PI) / n\n const r = i % 2 ? inner : 1\n pts.push([w / 2 + (w / 2) * r * Math.cos(t), h / 2 + (h / 2) * r * Math.sin(t)])\n }\n return poly(pts)\n}\n\nexport const LINE_GEOMS = new Set(['line', 'straightConnector1', 'bentConnector2', 'bentConnector3', 'bentConnector4', 'curvedConnector3', 'curvedConnector2', 'curvedConnector4'])\n\nexport function geomPath(geom: string, w: number, h: number, adj: Adj): string {\n const ss = Math.min(w, h)\n switch (geom) {\n case 'ellipse':\n case 'flowChartConnector':\n case 'cloud':\n return ellipse(w, h)\n case 'roundRect':\n case 'flowChartAlternateProcess':\n return roundRect(w, h, ss * a(adj, 'adj', 16667))\n case 'flowChartTerminator':\n return roundRect(w, h, h / 2)\n case 'triangle': {\n const x = w * a(adj, 'adj', 50000)\n return poly([[x, 0], [w, h], [0, h]])\n }\n case 'rtTriangle':\n return poly([[0, 0], [w, h], [0, h]])\n case 'diamond':\n case 'flowChartDecision':\n return poly([[w / 2, 0], [w, h / 2], [w / 2, h], [0, h / 2]])\n case 'parallelogram':\n case 'flowChartInputOutput': {\n const o = ss * a(adj, 'adj', 25000)\n return poly([[o, 0], [w, 0], [w - o, h], [0, h]])\n }\n case 'trapezoid': {\n const o = ss * a(adj, 'adj', 25000)\n return poly([[o, 0], [w - o, 0], [w, h], [0, h]])\n }\n case 'pentagon':\n return regular(w, h, 5)\n case 'hexagon': {\n const o = ss * a(adj, 'adj', 25000)\n return poly([[o, 0], [w - o, 0], [w, h / 2], [w - o, h], [o, h], [0, h / 2]])\n }\n case 'heptagon':\n return regular(w, h, 7)\n case 'octagon': {\n const o = ss * a(adj, 'adj', 29289)\n return poly([[o, 0], [w - o, 0], [w, o], [w, h - o], [w - o, h], [o, h], [0, h - o], [0, o]])\n }\n case 'decagon':\n return regular(w, h, 10)\n case 'dodecagon':\n return regular(w, h, 12)\n case 'star4':\n return star(w, h, 4, 0.38)\n case 'star5':\n return star(w, h, 5, 0.38)\n case 'star6':\n return star(w, h, 6, 0.5)\n case 'star8':\n return star(w, h, 8, 0.6)\n case 'star10':\n case 'star12':\n case 'star16':\n case 'star24':\n return star(w, h, Number(geom.slice(4)), 0.7)\n case 'homePlate': {\n const o = ss * a(adj, 'adj', 50000)\n return poly([[0, 0], [w - o, 0], [w, h / 2], [w - o, h], [0, h]])\n }\n case 'chevron': {\n const o = ss * a(adj, 'adj', 50000)\n return poly([[0, 0], [w - o, 0], [w, h / 2], [w - o, h], [0, h], [o, h / 2]])\n }\n case 'rightArrow':\n case 'leftArrow': {\n const t = h * a(adj, 'adj1', 50000)\n const hl = ss * a(adj, 'adj2', 50000)\n const y0 = (h - t) / 2\n const pts: [number, number][] = [[0, y0], [w - hl, y0], [w - hl, 0], [w, h / 2], [w - hl, h], [w - hl, y0 + t], [0, y0 + t]]\n return poly(geom === 'leftArrow' ? pts.map(([x, y]) => [w - x, y]) : pts)\n }\n case 'upArrow':\n case 'downArrow': {\n const t = w * a(adj, 'adj1', 50000)\n const hl = ss * a(adj, 'adj2', 50000)\n const x0 = (w - t) / 2\n const pts: [number, number][] = [[x0, h], [x0, hl], [0, hl], [w / 2, 0], [w, hl], [x0 + t, hl], [x0 + t, h]]\n return poly(geom === 'downArrow' ? pts.map(([x, y]) => [x, h - y]) : pts)\n }\n case 'leftRightArrow': {\n const t = h * a(adj, 'adj1', 50000)\n const hl = ss * a(adj, 'adj2', 50000)\n const y0 = (h - t) / 2\n return poly([[0, h / 2], [hl, 0], [hl, y0], [w - hl, y0], [w - hl, 0], [w, h / 2], [w - hl, h], [w - hl, y0 + t], [hl, y0 + t], [hl, h]])\n }\n case 'plus':\n case 'mathPlus': {\n const o = ss * a(adj, 'adj', 25000)\n return poly([[o, 0], [w - o, 0], [w - o, o], [w, o], [w, h - o], [w - o, h - o], [w - o, h], [o, h], [o, h - o], [0, h - o], [0, o], [o, o]])\n }\n case 'snip1Rect': {\n const o = ss * a(adj, 'adj', 16667)\n return poly([[0, 0], [w - o, 0], [w, o], [w, h], [0, h]])\n }\n case 'snip2SameRect': {\n const o = ss * a(adj, 'adj1', 16667)\n return poly([[o, 0], [w - o, 0], [w, o], [w, h], [0, h], [0, o]])\n }\n case 'round1Rect':\n case 'round2SameRect': {\n const r = ss * a(adj, 'adj1', 16667) || ss * a(adj, 'adj', 16667)\n return `M${f(r)} 0 H${f(w - r)} A${f(r)} ${f(r)} 0 0 1 ${f(w)} ${f(r)} V${f(h)} H0 V${f(r)} A${f(r)} ${f(r)} 0 0 1 ${f(r)} 0 Z`\n }\n case 'can':\n case 'flowChartMagneticDisk': {\n const ry = ss * a(adj, 'adj', 25000) / 2\n return `M0 ${f(ry)} A${f(w / 2)} ${f(ry)} 0 0 1 ${f(w)} ${f(ry)} V${f(h - ry)} A${f(w / 2)} ${f(ry)} 0 0 1 0 ${f(h - ry)} Z M0 ${f(ry)} A${f(w / 2)} ${f(ry)} 0 0 0 ${f(w)} ${f(ry)}`\n }\n case 'donut': {\n const t = ss * a(adj, 'adj', 25000)\n return ellipse(w, h) + ` M${f(t)} ${f(h / 2)} A${f(w / 2 - t)} ${f(h / 2 - t)} 0 1 1 ${f(w - t)} ${f(h / 2)} A${f(w / 2 - t)} ${f(h / 2 - t)} 0 1 1 ${f(t)} ${f(h / 2)} Z`\n }\n case 'heart':\n return `M${f(w / 2)} ${f(h * 0.25)} C${f(w / 2)} 0 0 0 0 ${f(h * 0.3)} C0 ${f(h * 0.6)} ${f(w / 2)} ${f(h * 0.8)} ${f(w / 2)} ${f(h)} C${f(w / 2)} ${f(h * 0.8)} ${f(w)} ${f(h * 0.6)} ${f(w)} ${f(h * 0.3)} C${f(w)} 0 ${f(w / 2)} 0 ${f(w / 2)} ${f(h * 0.25)} Z`\n case 'wedgeRectCallout':\n case 'wedgeRoundRectCallout': {\n const tx = w / 2 + w * a(adj, 'adj1', -20833)\n const ty = h / 2 + h * a(adj, 'adj2', 62500)\n return poly([[0, 0], [w, 0], [w, h], [w * 0.58, h], [tx, ty], [w * 0.42, h], [0, h]])\n }\n case 'line':\n case 'straightConnector1':\n return `M0 0 L${f(w)} ${f(h)}`\n case 'bentConnector2':\n return `M0 0 H${f(w)} V${f(h)}`\n case 'bentConnector3': {\n const x = w * a(adj, 'adj1', 50000)\n return `M0 0 H${f(x)} V${f(h)} H${f(w)}`\n }\n case 'bentConnector4':\n return `M0 0 H${f(w / 2)} V${f(h)} H${f(w)}`\n case 'curvedConnector2':\n case 'curvedConnector3':\n case 'curvedConnector4':\n return `M0 0 C${f(w / 2)} 0 ${f(w / 2)} ${f(h)} ${f(w)} ${f(h)}`\n default:\n return `M0 0 H${f(w)} V${f(h)} H0 Z`\n }\n}\n","import { memo, useId, type CSSProperties, type ReactNode } from 'react'\nimport type { Box, Fill, SlideEl, SlideModel, Stroke, TCell, TextBody, TRun } from '../../core/pptx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { useMediaUrl } from '../common/hooks'\nimport { geomPath, LINE_GEOMS } from './geometry'\n\nfunction boxStyle(b: Box): CSSProperties {\n const t: string[] = []\n if (b.rot) t.push(`rotate(${b.rot}deg)`)\n return { left: b.x, top: b.y, width: b.w, height: b.h, transform: t.length ? t.join(' ') : undefined }\n}\n\nfunction useFillCss(client: DocumentClient, fill: Fill | undefined, enabled: boolean): CSSProperties | undefined {\n const url = useMediaUrl(client, fill?.t === 'img' ? fill.target : undefined, enabled)\n if (!fill) return undefined\n switch (fill.t) {\n case 'solid':\n return { background: fill.c }\n case 'grad':\n return { background: fill.css }\n case 'img':\n return url && url !== 'unsupported'\n ? { backgroundImage: `url(\"${url}\")`, backgroundSize: fill.tile ? 'auto' : '100% 100%', backgroundRepeat: fill.tile ? 'repeat' : 'no-repeat' }\n : undefined\n default:\n return undefined\n }\n}\n\nfunction runStyle(r: TRun): CSSProperties {\n const s: CSSProperties = { fontSize: `${r.baseline ? r.sz * 0.65 : r.sz}pt` }\n if (r.b) s.fontWeight = 700\n if (r.i) s.fontStyle = 'italic'\n const deco = [r.u ? 'underline' : '', r.strike ? 'line-through' : ''].filter(Boolean).join(' ')\n if (deco) s.textDecoration = deco\n if (r.color) s.color = r.color\n if (r.font) s.fontFamily = r.font\n if (r.baseline) s.verticalAlign = r.baseline > 0 ? 'super' : 'sub'\n if (r.caps) s.textTransform = 'uppercase'\n if (r.hl) s.background = r.hl\n return s\n}\n\nexport interface TextEdit {\n /** contentEditable root callback */\n root: (el: HTMLDivElement | null) => void\n}\n\nexport function TextView({ text, flow, edit }: { text: TextBody; flow?: boolean; edit?: TextEdit }) {\n const [l, t, r, b] = text.ins\n const style: CSSProperties = {\n ...(flow ? { position: 'relative', inset: 'auto', minHeight: '100%' } : {}),\n padding: `${t}px ${r}px ${b}px ${l}px`,\n justifyContent: text.anchor === 'ctr' ? 'center' : text.anchor === 'b' ? 'flex-end' : 'flex-start',\n }\n if (text.vert) style.writingMode = text.vert === 'vert270' ? 'sideways-lr' : 'vertical-rl'\n if (text.empty && !edit) return <div className=\"de-txt\" style={style} />\n return (\n <div\n ref={edit?.root}\n className={(text.wrap ? 'de-txt' : 'de-txt de-nowrap') + (edit ? ' de-txt-edit' : '')}\n style={style}\n contentEditable={edit ? true : undefined}\n suppressContentEditableWarning\n spellCheck={edit ? false : undefined}\n >\n {text.paras.map((p, i) => {\n const ps: CSSProperties = {\n textAlign: p.algn,\n paddingLeft: p.marL || undefined,\n textIndent: p.indent || undefined,\n paddingTop: p.spcBef || undefined,\n paddingBottom: p.spcAft || undefined,\n lineHeight: p.lnPx ? `${p.lnPx}px` : p.lnPct ? +(p.lnPct * 1.2).toFixed(3) : 1.2,\n }\n if (!p.runs.length || p.runs.every((x) => !x.text && !x.br)) ps.fontSize = `${p.endSz}pt`\n const hang = p.indent < 0 ? -p.indent : 0\n let o = 0\n const nodes: ReactNode[] = p.runs.map((r, k) => {\n const at = o\n o += r.fld ? 1 : r.br ? 1 : r.text.length\n if (edit) {\n if (r.fld)\n return (\n <span key={k} data-o={at} data-obj=\"\" contentEditable={false} style={runStyle(r)}>\n {r.text}\n </span>\n )\n return (\n <span key={k} data-o={at} style={runStyle(r)}>\n {r.br ? '\\n' : r.text}\n </span>\n )\n }\n return r.br ? (\n <br key={k} />\n ) : r.href ? (\n <a key={k} href={r.href} target=\"_blank\" rel=\"noreferrer noopener\" style={{ color: 'inherit' }}>\n <span style={runStyle(r)}>{r.text}</span>\n </a>\n ) : (\n <span key={k} style={runStyle(r)}>\n {r.text}\n </span>\n )\n })\n const empty = o === 0\n return (\n <div key={i} style={ps} data-pa={edit ? String(i) : undefined}>\n {p.bullet && !empty && (\n <span\n className=\"de-bul\"\n contentEditable={edit ? false : undefined}\n style={{ minWidth: hang || undefined, paddingRight: hang ? undefined : '0.4em', fontSize: `${p.bullet.sz}pt`, color: p.bullet.color, fontFamily: p.bullet.font }}\n >\n {p.bullet.text}\n </span>\n )}\n {nodes}\n {empty &&\n (edit ? (\n <span data-o={0} data-empty=\"\">\n {'\\u200B'}\n </span>\n ) : (\n '\\u200B'\n ))}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction Marker({ id, s }: { id: string; s: Stroke }) {\n return (\n <marker id={id} viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerWidth=\"4\" markerHeight=\"4\" orient=\"auto-start-reverse\">\n <path d=\"M0 0 L10 5 L0 10 Z\" fill={s.c} />\n </marker>\n )\n}\n\nexport interface SlideEditing {\n sid: number\n text: TextBody\n edit: TextEdit\n}\n\nfunction ShapeView({ el, client, live, editing }: { el: Extract<SlideEl, { t: 'shape' }>; client: DocumentClient; live: boolean; editing?: SlideEditing }) {\n const id = useId().replace(/:/g, '')\n const { box } = el\n const isLine = LINE_GEOMS.has(el.geom)\n const fillCss = useFillCss(client, el.fill, live)\n const d = el.path ?? geomPath(el.geom, box.w, box.h, el.adj)\n const flipped = box.flipH || box.flipV\n const flip = flipped ? `translate(${box.flipH ? box.w : 0} ${box.flipV ? box.h : 0}) scale(${box.flipH ? -1 : 1} ${box.flipV ? -1 : 1})` : undefined\n const isRect = !isLine && !el.path && (el.geom === 'rect' || el.geom === 'flowChartProcess')\n const solid = !isLine && el.fill?.t === 'solid' ? el.fill.c : undefined\n const css = !isLine && fillCss && el.fill?.t !== 'solid' ? fillCss : undefined\n const s = el.stroke\n const w = Math.max(box.w, 1)\n const h = Math.max(box.h, 1)\n return (\n <div className=\"de-el\" style={boxStyle(box)} data-sid={el.sid !== undefined && el.text ? el.sid : undefined} data-top={el.top}>\n {isRect && !s && (solid || css) ? (\n <div style={{ position: 'absolute', inset: 0, ...(css ?? { background: solid }) }} />\n ) : (\n <>\n {css && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n ...css,\n clipPath: isRect ? undefined : `path(\"${d}\")`,\n transform: flipped ? `scale(${box.flipH ? -1 : 1}, ${box.flipV ? -1 : 1})` : undefined,\n }}\n />\n )}\n {(solid || s) && (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ position: 'absolute', left: 0, top: 0, overflow: 'visible' }}>\n {s && (s.head || s.tail) && (\n <defs>\n {s.head && <Marker id={`h${id}`} s={s} />}\n {s.tail && <Marker id={`t${id}`} s={s} />}\n </defs>\n )}\n <path\n d={d}\n transform={flip}\n fill={solid ?? 'none'}\n fillRule=\"evenodd\"\n stroke={s?.c ?? 'none'}\n strokeWidth={s?.w}\n strokeDasharray={s?.dash}\n strokeLinejoin=\"round\"\n markerStart={s?.head ? `url(#h${id})` : undefined}\n markerEnd={s?.tail ? `url(#t${id})` : undefined}\n />\n </svg>\n )}\n </>\n )}\n {editing && editing.sid === el.sid ? <TextView text={editing.text} edit={editing.edit} /> : el.text && <TextView text={el.text} />}\n </div>\n )\n}\n\nfunction PicView({ el, client, live }: { el: Extract<SlideEl, { t: 'pic' }>; client: DocumentClient; live: boolean }) {\n const url = useMediaUrl(client, el.target, live)\n const { box } = el\n const style: CSSProperties = { ...boxStyle(box), overflow: 'hidden' }\n const top = el.top\n if (el.geom === 'ellipse') style.borderRadius = '50%'\n else if (el.geom === 'roundRect') style.borderRadius = Math.min(box.w, box.h) * 0.1667\n if (el.stroke) style.outline = `${el.stroke.w}px solid ${el.stroke.c}`\n let img: CSSProperties = { position: 'absolute', left: 0, top: 0, width: '100%', height: '100%' }\n if (el.crop) {\n const [l, t, r, b] = el.crop\n const sw = box.w / Math.max(0.01, 1 - l - r)\n const sh = box.h / Math.max(0.01, 1 - t - b)\n img = { position: 'absolute', left: -l * sw, top: -t * sh, width: sw, height: sh }\n }\n const flip = box.flipH || box.flipV ? `scale(${box.flipH ? -1 : 1}, ${box.flipV ? -1 : 1})` : undefined\n if (flip) img.transform = flip\n return (\n <div className=\"de-el\" style={style} data-top={top}>\n {url && url !== 'unsupported' ? (\n <img src={url} alt=\"\" style={img} draggable={false} />\n ) : url === 'unsupported' ? (\n <div className=\"de-ph\" style={{ width: '100%', height: '100%' }}>\n {el.target?.split('.').pop()?.toUpperCase()} image\n </div>\n ) : null}\n {el.video && <div className=\"de-ph\" style={{ position: 'absolute', right: 8, bottom: 8, padding: '2px 6px', border: 0, background: 'rgba(0,0,0,.6)', color: '#fff' }}>▶ media</div>}\n </div>\n )\n}\n\nconst strokeCss = (s: Stroke | undefined) => (s ? `${Math.max(1, s.w)}px solid ${s.c}` : undefined)\n\nfunction CellView({ cell, client, live, h }: { cell: TCell; client: DocumentClient; live: boolean; h: number }) {\n const fill = useFillCss(client, cell.fill, live)\n return (\n <td\n colSpan={cell.colSpan > 1 ? cell.colSpan : undefined}\n rowSpan={cell.rowSpan > 1 ? cell.rowSpan : undefined}\n style={{ ...(fill ?? {}), borderLeft: strokeCss(cell.bl), borderRight: strokeCss(cell.br), borderTop: strokeCss(cell.bt), borderBottom: strokeCss(cell.bb), height: h }}\n >\n {cell.text && <TextView text={cell.text} flow />}\n </td>\n )\n}\n\nfunction TableView({ el, client, live }: { el: Extract<SlideEl, { t: 'table' }>; client: DocumentClient; live: boolean }) {\n return (\n <div className=\"de-el\" style={{ ...boxStyle(el.box), height: 'auto' }} data-top={el.top}>\n <table className=\"de-stbl\">\n <colgroup>\n {el.cols.map((w, i) => (\n <col key={i} style={{ width: w }} />\n ))}\n </colgroup>\n <tbody>\n {el.rows.map((r, ri) => (\n <tr key={ri}>\n {r.cells.map((c, ci) => (c.hidden ? null : <CellView key={ci} cell={c} client={client} live={live} h={r.h} />))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction ElView({ el, client, live, editing }: { el: SlideEl; client: DocumentClient; live: boolean; editing?: SlideEditing }) {\n switch (el.t) {\n case 'shape':\n return <ShapeView el={el} client={client} live={live} editing={editing} />\n case 'pic':\n return <PicView el={el} client={client} live={live} />\n case 'table':\n return <TableView el={el} client={client} live={live} />\n case 'placeholder':\n return (\n <div className=\"de-el de-ph\" style={{ ...boxStyle(el.box), display: 'flex' }} data-top={el.top}>\n {el.label}\n </div>\n )\n }\n}\n\nexport interface SlideViewProps {\n model: SlideModel\n client: DocumentClient\n scale: number\n /** load media (false for far-away thumbnails) */\n live?: boolean\n editing?: SlideEditing\n /** extra layer drawn in slide coordinates (selection handles) */\n overlay?: ReactNode\n}\n\nexport const SlideView = memo(function SlideView({ model, client, scale, live = true, editing, overlay }: SlideViewProps) {\n const bg = useFillCss(client, model.bg, live)\n return (\n <div className={model.hidden ? 'de-slide de-hidden-slide' : 'de-slide'} style={{ width: model.w * scale, height: model.h * scale }}>\n <div className=\"de-slide-inner\" style={{ width: model.w, height: model.h, transform: `scale(${scale})`, background: '#fff', ...(bg ?? {}) }}>\n {model.els.map((el, i) => (\n <ElView key={i} el={el} client={client} live={live} editing={editing} />\n ))}\n {overlay}\n </div>\n </div>\n )\n})\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { Box, PresentationMeta, ShapeKind, ShapeOp, SlideModel, SlideOp } from '../../core/pptx/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { useForceUpdate, useIsoLayoutEffect, useScroll, useSize } from '../common/hooks'\nimport { useViewer } from '../common/Slots'\nimport { Status } from '../common/Status'\nimport { ZoomControl, type Zoom } from '../common/ZoomControl'\nimport { getSel } from '../edit/input'\nimport { PptxEditor } from './PptxEditor'\nimport { PptxToolbar, type AlignTo, type Arrange, type Rotate, type SlideCmd } from './PptxToolbar'\nimport { ContextMenu, MOD, type MenuItem } from '../common/ContextMenu'\nimport { Presenter } from './Presenter'\nimport { pickFiles } from '../edit/Toolbar'\nimport { SlideView, type SlideEditing } from './Slide'\nimport { publishLocal, registerHost } from '../../collab/hosts'\n\ninterface SlideCache {\n models: Map<number, SlideModel>\n pending: Map<number, Promise<SlideModel>>\n listeners: Map<number, Set<(m: SlideModel) => void>>\n}\n\nconst caches = new WeakMap<DocumentClient, SlideCache>()\n\nfunction cacheFor(client: DocumentClient): SlideCache {\n let c = caches.get(client)\n if (!c) caches.set(client, (c = { models: new Map(), pending: new Map(), listeners: new Map() }))\n return c\n}\n\n/** replaces a cached slide (after an edit) and notifies mounted views */\nfunction putSlide(client: DocumentClient, index: number, m: SlideModel) {\n const c = cacheFor(client)\n c.models.set(index, m)\n for (const fn of c.listeners.get(index) ?? []) fn(m)\n}\n\n/** forget every cached slide (after slides were added / removed / reordered) */\nfunction resetSlides(client: DocumentClient) {\n const c = cacheFor(client)\n c.models.clear()\n c.pending.clear()\n}\n\nexport function useSlide(client: DocumentClient, index: number): SlideModel | { error: string } | undefined {\n const cache = cacheFor(client)\n const [model, setModel] = useState<SlideModel | { error: string } | undefined>(() => cache.models.get(index))\n useEffect(() => {\n let set = cache.listeners.get(index)\n if (!set) cache.listeners.set(index, (set = new Set()))\n const fn = (m: SlideModel) => setModel(m)\n set.add(fn)\n return () => {\n set!.delete(fn)\n }\n }, [cache, index])\n useEffect(() => {\n const hit = cache.models.get(index)\n if (hit) return setModel(hit)\n let live = true\n let p = cache.pending.get(index)\n if (!p) {\n p = client.call('pptx.slide', index)\n cache.pending.set(index, p)\n p.then((m) => {\n cache.models.set(index, m)\n cache.pending.delete(index)\n if (cache.models.size > 120) cache.models.delete(cache.models.keys().next().value as number)\n }, () => cache.pending.delete(index))\n }\n p.then(\n (m) => live && setModel(m),\n (e) => live && setModel({ error: (e as Error).message }),\n )\n return () => {\n live = false\n }\n }, [client, cache, index])\n return model\n}\n\nexport function SlideSlot(props: { client: DocumentClient; index: number; meta: PresentationMeta; scale: number; live: boolean; editing?: SlideEditing; overlay?: ReactNode }) {\n const { client, index, meta, scale, live, editing, overlay } = props\n const model = useSlide(client, index)\n if (!model) return <div className=\"de-slide\" style={{ width: meta.w * scale, height: meta.h * scale, background: '#fff' }} />\n if ('error' in model) {\n return (\n <div className=\"de-slide de-ph\" style={{ width: meta.w * scale, height: meta.h * scale, display: 'flex' }}>\n {model.error}\n </div>\n )\n }\n return <SlideView model={model} client={client} scale={scale} live={live} editing={editing} overlay={overlay} />\n}\n\ntype DragMode = 'move' | 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw'\nconst HANDLES: DragMode[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w']\n\nfunction boxOf(model: SlideModel | undefined, top: number): Box | undefined {\n const els = model?.els.filter((e) => e.top === top) ?? []\n if (!els.length) return undefined\n const x0 = Math.min(...els.map((e) => e.box.x))\n const y0 = Math.min(...els.map((e) => e.box.y))\n const x1 = Math.max(...els.map((e) => e.box.x + e.box.w))\n const y1 = Math.max(...els.map((e) => e.box.y + e.box.h))\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0, rot: els.length === 1 ? els[0].box.rot : undefined }\n}\n\nfunction resized(b: Box, mode: DragMode, dx: number, dy: number, keep: boolean): Box {\n if (mode === 'move') return { ...b, x: b.x + dx, y: b.y + dy }\n let { x, y, w, h } = b\n if (mode.includes('e')) w += dx\n if (mode.includes('s')) h += dy\n if (mode.includes('w')) {\n x += dx\n w -= dx\n }\n if (mode.includes('n')) {\n y += dy\n h -= dy\n }\n if (keep && mode.length === 2 && b.w && b.h) {\n const k = Math.max(w / b.w, h / b.h)\n const nw = b.w * k\n const nh = b.h * k\n if (mode.includes('w')) x = b.x + b.w - nw\n if (mode.includes('n')) y = b.y + b.h - nh\n w = nw\n h = nh\n }\n return { ...b, x, y, w: Math.max(4, w), h: Math.max(4, h) }\n}\n\nfunction Selection({ box, scale, onHandle }: { box: Box; scale: number; onHandle: (m: DragMode, e: React.MouseEvent) => void }) {\n const hs = 9 / scale\n const pos: Record<DragMode, [number, number]> = { nw: [0, 0], n: [0.5, 0], ne: [1, 0], e: [1, 0.5], se: [1, 1], s: [0.5, 1], sw: [0, 1], w: [0, 0.5], move: [0, 0] }\n return (\n <div className=\"de-shape-sel\" style={{ left: box.x, top: box.y, width: box.w, height: box.h, borderWidth: 1.5 / scale, transform: box.rot ? `rotate(${box.rot}deg)` : undefined }}>\n {HANDLES.map((m) => (\n <div\n key={m}\n className={`de-handle de-h-${m}`}\n style={{ width: hs, height: hs, left: pos[m][0] * box.w - hs / 2, top: pos[m][1] * box.h - hs / 2, borderWidth: 1 / scale }}\n onMouseDown={(e) => {\n e.stopPropagation()\n e.preventDefault()\n onHandle(m, e)\n }}\n />\n ))}\n </div>\n )\n}\n\nexport interface PptxViewProps {\n client: DocumentClient\n onStatus?: (s: string) => void\n initialZoom?: Zoom\n thumbnails?: boolean\n}\n\nconst PAD = 24\nconst GAP = 24\nconst THUMB_W = 188\n\nexport function PptxView({ client, onStatus, initialZoom = 'fit', thumbnails = true }: PptxViewProps) {\n const viewer = useViewer()\n const meta = client.info.pptx as PresentationMeta\n const [rootRef, rootSize] = useSize<HTMLDivElement>()\n const [scrollRef, size] = useSize<HTMLDivElement>()\n const scroll = useScroll(scrollRef)\n const thumbRef = useRef<HTMLDivElement>(null)\n const thumbScroll = useScroll(thumbRef)\n const [zoom, setZoom] = useState<Zoom>(initialZoom)\n const showThumbs = thumbnails && rootSize.w >= 720 && meta.count > 1\n const [, bump] = useForceUpdate()\n const editor = useMemo(() => new PptxEditor(client), [client])\n const caretAt = useRef<{ x: number; y: number } | null>(null)\n const textRoot = useRef<HTMLDivElement | null>(null)\n const [selected, setSelected] = useState<{ slide: number; top: number } | null>(null)\n const [drag, setDrag] = useState<{ slide: number; top: number; mode: DragMode; sx: number; sy: number; box: Box; cur: Box; moved: boolean; sid?: number; px: number; py: number } | null>(null)\n const [slidesVer, setSlidesVer] = useState(0)\n const [presenting, setPresenting] = useState<number | null>(null)\n const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number; items: MenuItem[] } | null>(null)\n /** shape edits that can be undone */\n const [undoDepth, setUndoDepth] = useState(0)\n\n const fitW = size.w ? (size.w - PAD * 2) / meta.w : 1\n const fitH = size.h ? (size.h - PAD * 2) / meta.h : 1\n const fit = Math.max(0.1, Math.min(fitW, Math.max(fitH, fitW * 0.6), 2))\n const scale = zoom === 'fit' ? fit : zoom\n const slideH = meta.h * scale\n const slideW = meta.w * scale\n const pitch = slideH + GAP\n const totalH = PAD * 2 + meta.count * pitch - GAP\n const totalW = Math.max(size.w, slideW + PAD * 2)\n const left = Math.max(PAD, (totalW - slideW) / 2)\n const first = Math.max(0, Math.floor((scroll.y - PAD) / pitch) - 1)\n const last = Math.min(meta.count - 1, Math.floor((scroll.y + size.h) / pitch) + 1)\n const current = Math.min(meta.count - 1, Math.max(0, Math.floor((scroll.y + size.h / 3 - PAD) / pitch)))\n\n // thumbnails\n const tScale = (THUMB_W - 46) / meta.w\n const tH = meta.h * tScale\n const tPitch = tH + 14\n const tFirst = Math.max(0, Math.floor(thumbScroll.y / tPitch) - 1)\n const tLast = Math.min(meta.count - 1, Math.floor((thumbScroll.y + size.h) / tPitch) + 1)\n\n // keep the active thumbnail in view\n useEffect(() => {\n const el = thumbRef.current\n if (!el) return\n const y = 10 + current * tPitch\n if (y < el.scrollTop || y + tH > el.scrollTop + el.clientHeight) el.scrollTop = y - el.clientHeight / 2 + tH / 2\n }, [current, tPitch, tH])\n\n // ---- editing ----\n useEffect(() => {\n editor.onChange = bump\n editor.onDirty = () => viewer.setDirty(true)\n editor.onCommitted = (slide, m) => putSlide(client, slide, m)\n editor.shortcut = (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 's') {\n void viewer.save()\n return true\n }\n if (e.key === 'Escape') {\n stopEditing()\n return true\n }\n return false\n }\n })\n useEffect(() => {\n if (!viewer.editable) stopEditing()\n return () => editor.end()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [viewer.editable])\n\n const stopEditing = () => {\n if (!editor.active) return\n editor.end()\n if (textRoot.current) getSel(textRoot.current)?.removeAllRanges()\n // keep keyboard shortcuts (Del, ⌘D, arrows…) working on the shape that stays selected\n scrollRef.current?.focus({ preventScroll: true })\n bump()\n }\n\n // ---- collaboration (src/collab) ----\n const stopRef = useRef(stopEditing)\n stopRef.current = stopEditing\n useEffect(() => registerHost(client, 'pptx', { endEditing: () => stopRef.current() }), [client])\n useEffect(\n () =>\n client.on('collab:pptx', (r) => {\n if (r.meta) {\n resetSlides(client)\n setSelected(null)\n setSlidesVer((v) => v + 1)\n } else if (r.slide !== undefined && r.model) putSlide(client, r.slide, r.model)\n }),\n [client],\n )\n useEffect(() => publishLocal(client, { slide: selected?.slide ?? current, top: selected?.top }), [client, selected?.slide, selected?.top, current])\n\n const editing: SlideEditing | undefined =\n editor.active && editor.text()\n ? {\n sid: editor.sid,\n text: editor.text()!,\n edit: {\n root: (el) => {\n textRoot.current = el\n if (el) editor.input.attach(el)\n },\n },\n }\n : undefined\n\n useIsoLayoutEffect(() => {\n const root = textRoot.current\n if (!editor.active || !root) return\n if (caretAt.current) {\n const { x, y } = caretAt.current\n caretAt.current = null\n root.focus({ preventScroll: true })\n const d = root.ownerDocument as Document & { caretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null }\n const pos = d.caretPositionFromPoint?.(x, y)\n const range = pos ? null : d.caretRangeFromPoint?.(x, y)\n const node = pos?.offsetNode ?? range?.startContainer\n const off = pos?.offset ?? range?.startOffset ?? 0\n const s = getSel(root)\n if (node && root.contains(node)) s?.collapse(node, off)\n else {\n s?.selectAllChildren(root)\n s?.collapseToEnd()\n }\n editor.input.lastSel = editor.input.readSel()\n return\n }\n const sel = editor.pendingSel\n if (sel) {\n editor.pendingSel = null\n editor.input.restore(sel)\n }\n })\n\n const modelOf = (i: number) => cacheFor(client).models.get(i)\n\n const beginText = (index: number, sid: number, x: number, y: number) => {\n const el = modelOf(index)?.els.find((e) => e.t === 'shape' && e.sid === sid)\n if (!el || el.t !== 'shape' || !el.text) return\n editor.begin(index, sid, el.text)\n caretAt.current = { x, y }\n bump()\n }\n\n const onSlideMouseDown = (index: number, e: React.MouseEvent) => {\n if (!viewer.editable || e.button !== 0) return\n const t = e.target as HTMLElement\n if (editor.active && textRoot.current?.contains(t)) return\n const topEl = t.closest('[data-top]') as HTMLElement | null\n const top = topEl ? Number(topEl.dataset.top) : NaN\n stopEditing()\n if (!topEl || Number.isNaN(top)) {\n setSelected(null)\n return\n }\n e.preventDefault()\n scrollRef.current?.focus({ preventScroll: true })\n const box = boxOf(modelOf(index), top)\n setSelected({ slide: index, top })\n if (!box) return\n const sidEl = t.closest('[data-sid]') as HTMLElement | null\n setDrag({ slide: index, top, mode: 'move', sx: e.clientX, sy: e.clientY, box, cur: box, moved: false, sid: sidEl ? Number(sidEl.dataset.sid) : undefined, px: e.clientX, py: e.clientY })\n }\n\n const runShapes = async (slide: number, ops: ShapeOp[], selectNew = false) => {\n try {\n const m = await client.call('pptx.shapes', slide, ops)\n putSlide(client, slide, m)\n viewer.setDirty(true)\n setUndoDepth((d) => d + 1)\n if (selectNew) {\n const tops = m.els.map((x) => x.top ?? -1)\n setSelected({ slide, top: Math.max(...tops) })\n }\n return m\n } catch (err) {\n console.error('[office-engine]', err)\n }\n }\n\n useEffect(() => {\n if (!drag) return\n const move = (e: MouseEvent) => {\n const dx = (e.clientX - drag.sx) / scale\n const dy = (e.clientY - drag.sy) / scale\n const moved = drag.moved || Math.abs(e.clientX - drag.sx) + Math.abs(e.clientY - drag.sy) > 3\n setDrag({ ...drag, moved, cur: moved ? resized(drag.box, drag.mode, dx, dy, e.shiftKey) : drag.box })\n }\n const up = () => {\n const d = drag\n setDrag(null)\n if (d.moved) void runShapes(d.slide, [{ op: 'xfrm', top: d.top, box: d.cur }])\n // a click on text edits it (Esc then selects the whole shape, like PowerPoint)\n else if (d.mode === 'move' && d.sid !== undefined) beginText(d.slide, d.sid, d.px, d.py)\n }\n window.addEventListener('mousemove', move)\n window.addEventListener('mouseup', up, { once: true })\n return () => {\n window.removeEventListener('mousemove', move)\n window.removeEventListener('mouseup', up)\n }\n })\n\n const insert = async (kind: ShapeKind, at?: number) => {\n const slide = at ?? selected?.slide ?? current\n const w = kind === 'text' ? meta.w * 0.4 : kind === 'line' ? meta.w * 0.25 : meta.w * 0.2\n const h = kind === 'text' ? meta.h * 0.1 : kind === 'line' ? 1 : meta.w * 0.2\n let box: Box = { x: (meta.w - w) / 2, y: (meta.h - h) / 2, w, h }\n let rid: string | undefined\n if (kind === 'image') {\n const [f] = await pickFiles('image/*', false)\n if (!f) return\n rid = await client.call('pptx.image', slide, await f.arrayBuffer(), (f.type.split('/')[1] ?? 'png').replace('svg+xml', 'svg'))\n const dims = await new Promise<{ w: number; h: number }>((res) => {\n const img = new Image()\n img.onload = () => res({ w: img.naturalWidth, h: img.naturalHeight })\n img.onerror = () => res({ w: 400, h: 300 })\n img.src = URL.createObjectURL(f)\n })\n const k = Math.min(1, (meta.w * 0.6) / dims.w, (meta.h * 0.6) / dims.h)\n box = { x: (meta.w - dims.w * k) / 2, y: (meta.h - dims.h * k) / 2, w: dims.w * k, h: dims.h * k }\n }\n const m = await runShapes(slide, [{ op: 'insert', kind, box, rid, text: kind === 'text' ? 'Text' : undefined }], true)\n if (m && kind === 'text') {\n const el = m.els[m.els.length - 1]\n if (el?.t === 'shape' && el.sid !== undefined && el.text) {\n editor.begin(slide, el.sid, el.text)\n bump()\n }\n }\n }\n\n const slideAction = async (op: SlideOp, goTo?: number) => {\n stopEditing()\n setSelected(null)\n const next = await client.call('pptx.slides', op)\n Object.assign(meta, next)\n resetSlides(client)\n viewer.setDirty(true)\n setSlidesVer((v) => v + 1)\n if (goTo !== undefined) requestAnimationFrame(() => go(goTo))\n }\n\n const undoShapes = async (redo: boolean) => {\n const r = await client.call('pptx.undo', redo)\n if (!r) return\n putSlide(client, r.index, r.model)\n setUndoDepth((d) => Math.max(0, d + (redo ? 1 : -1)))\n setSelected(null)\n go(r.index)\n }\n\n const slideCmd = (kind: SlideCmd, i = current) => {\n if (kind === 'add') void slideAction({ op: 'add', after: i }, i + 1)\n else if (kind === 'duplicate') void slideAction({ op: 'duplicate', index: i }, i + 1)\n else if (kind === 'delete') void slideAction({ op: 'delete', index: i }, Math.max(0, i - 1))\n else if (kind === 'up') i > 0 && void slideAction({ op: 'move', from: i, to: i - 1 }, i - 1)\n else if (kind === 'down') i < meta.count - 1 && void slideAction({ op: 'move', from: i, to: i + 1 }, i + 1)\n else if (kind === 'hide') void slideAction({ op: 'hide', index: i, hidden: !modelOf(i)?.hidden }, i)\n }\n\n const elOf = (sel: { slide: number; top: number } | null) => (sel ? modelOf(sel.slide)?.els.find((x) => x.top === sel.top) : undefined)\n // menus act on the shape that was right-clicked even before React re-renders\n const selRef = useRef(selected)\n selRef.current = selected\n const shapeCmd = {\n arrange: (to: Arrange) => {\n const selected = selRef.current\n if (selected) void runShapes(selected.slide, [{ op: 'order', top: selected.top, to }])\n },\n duplicate: () => {\n const selected = selRef.current\n if (selected) void runShapes(selected.slide, [{ op: 'duplicate', top: selected.top }], true)\n },\n remove: () => {\n const selected = selRef.current\n if (selected) void runShapes(selected.slide, [{ op: 'delete', top: selected.top }])\n setSelected(null)\n },\n rotate: (k: Rotate) => {\n const selected = selRef.current\n const el = elOf(selected)\n const box = selected && boxOf(modelOf(selected.slide), selected.top)\n if (!selected || !box) return\n const b: Box = { ...box, flipH: el?.box.flipH, flipV: el?.box.flipV }\n if (k === 'cw') b.rot = (b.rot ?? 0) + 90\n else if (k === 'ccw') b.rot = (b.rot ?? 0) - 90\n else if (k === 'flipH') b.flipH = !b.flipH\n else b.flipV = !b.flipV\n void runShapes(selected.slide, [{ op: 'xfrm', top: selected.top, box: b }])\n },\n align: (k: AlignTo | 'both') => {\n const selected = selRef.current\n const box = selected && boxOf(modelOf(selected.slide), selected.top)\n if (!selected || !box) return\n const b = { ...box }\n // align the visible (rotated) extent\n const r = ((box.rot ?? 0) * Math.PI) / 180\n const vw = Math.abs(box.w * Math.cos(r)) + Math.abs(box.h * Math.sin(r))\n const vh = Math.abs(box.w * Math.sin(r)) + Math.abs(box.h * Math.cos(r))\n const dx = (vw - box.w) / 2\n const dy = (vh - box.h) / 2\n if (k === 'left') b.x = dx\n else if (k === 'center' || k === 'both') b.x = (meta.w - b.w) / 2\n else if (k === 'right') b.x = meta.w - b.w - dx\n else if (k === 'top') b.y = dy\n else if (k === 'middle') b.y = (meta.h - b.h) / 2\n else if (k === 'bottom') b.y = meta.h - b.h - dy\n if (k === 'both') b.y = (meta.h - b.h) / 2\n void runShapes(selected.slide, [{ op: 'xfrm', top: selected.top, box: b }])\n },\n anchor: (a: 't' | 'ctr' | 'b') => {\n if (editor.active && editor.body) {\n editor.body = { ...editor.body, anchor: a }\n void runShapes(editor.slide, [{ op: 'anchor', sid: editor.sid, anchor: a }])\n bump()\n return\n }\n const selected = selRef.current\n const el = elOf(selected)\n if (selected && el?.t === 'shape' && el.sid !== undefined) void runShapes(selected.slide, [{ op: 'anchor', sid: el.sid, anchor: a }])\n },\n }\n\n const shapeMenu = (): MenuItem[] => [\n { label: 'Duplicate', icon: 'copy', hint: `${MOD}D`, run: shapeCmd.duplicate },\n { label: 'Delete', icon: 'trash', hint: 'Del', run: shapeCmd.remove },\n { label: 'Bring to front', icon: 'front', hint: `${MOD}⇧↑`, sep: true, run: () => shapeCmd.arrange('front') },\n { label: 'Bring forward', hint: `${MOD}↑`, run: () => shapeCmd.arrange('forward') },\n { label: 'Send backward', hint: `${MOD}↓`, run: () => shapeCmd.arrange('backward') },\n { label: 'Send to back', icon: 'back', hint: `${MOD}⇧↓`, run: () => shapeCmd.arrange('back') },\n { label: 'Rotate 90° clockwise', icon: 'rotate', sep: true, run: () => shapeCmd.rotate('cw') },\n { label: 'Rotate 90° counter-clockwise', icon: 'rotateCcw', run: () => shapeCmd.rotate('ccw') },\n { label: 'Flip horizontally', icon: 'flipH', run: () => shapeCmd.rotate('flipH') },\n { label: 'Flip vertically', icon: 'flipV', run: () => shapeCmd.rotate('flipV') },\n { label: 'Center on slide', icon: 'alignObj', sep: true, run: () => shapeCmd.align('both') },\n ]\n const slideMenu = (i: number): MenuItem[] => [\n { label: 'New slide', icon: 'slideAdd', hint: `${MOD}M`, run: () => slideCmd('add', i) },\n { label: 'Duplicate slide', icon: 'copy', run: () => slideCmd('duplicate', i) },\n { label: 'Delete slide', icon: 'trash', run: () => slideCmd('delete', i), disabled: meta.count <= 1 },\n { label: modelOf(i)?.hidden ? 'Show slide' : 'Hide slide', icon: 'hide', run: () => slideCmd('hide', i) },\n { label: 'Move slide up', icon: 'up', sep: true, run: () => slideCmd('up', i), disabled: i === 0 },\n { label: 'Move slide down', icon: 'down', run: () => slideCmd('down', i), disabled: i >= meta.count - 1 },\n { label: 'Insert text box', icon: 'textbox', sep: true, run: () => void insert('text', i) },\n { label: 'Insert image…', icon: 'image', run: () => void insert('image', i) },\n { label: 'Present from this slide', icon: 'play', sep: true, run: () => setPresenting(i) },\n ]\n\n const onShapeKey = (e: React.KeyboardEvent) => {\n if (!selected || editor.active || !viewer.editable) return false\n const box = boxOf(modelOf(selected.slide), selected.top)\n const step = e.shiftKey ? 10 : 1\n const nudge: Record<string, [number, number]> = { ArrowUp: [0, -step], ArrowDown: [0, step], ArrowLeft: [-step, 0], ArrowRight: [step, 0] }\n const mod = e.metaKey || e.ctrlKey\n if (mod && e.key.toLowerCase() === 'd') shapeCmd.duplicate()\n else if (mod && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) shapeCmd.arrange(e.key === 'ArrowUp' ? (e.shiftKey ? 'front' : 'forward') : e.shiftKey ? 'back' : 'backward')\n else if (e.key === 'Delete' || e.key === 'Backspace') {\n void runShapes(selected.slide, [{ op: 'delete', top: selected.top }])\n setSelected(null)\n } else if (nudge[e.key] && box) void runShapes(selected.slide, [{ op: 'xfrm', top: selected.top, box: { ...box, x: box.x + nudge[e.key][0], y: box.y + nudge[e.key][1] } }])\n else if (e.key === 'Escape') setSelected(null)\n else return false\n e.preventDefault()\n return true\n }\n\n const go = (i: number) => {\n const el = scrollRef.current\n if (el) el.scrollTop = PAD + Math.max(0, Math.min(meta.count - 1, i)) * pitch - Math.max(0, (size.h - slideH) / 2)\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n // already handled by the text editor (e.g. Esc that just left text editing)\n if (editor.active || e.defaultPrevented) return\n if (onShapeKey(e)) return\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 's') {\n e.preventDefault()\n void viewer.save()\n return\n }\n if (e.key === 'F5') {\n e.preventDefault()\n setPresenting(e.shiftKey ? 0 : current)\n return\n }\n const mod = e.metaKey || e.ctrlKey\n if (viewer.editable && mod && (e.key.toLowerCase() === 'z' || e.key.toLowerCase() === 'y')) {\n e.preventDefault()\n void undoShapes(e.key.toLowerCase() === 'y' || e.shiftKey)\n return\n }\n if (viewer.editable && mod && e.key.toLowerCase() === 'm') {\n e.preventDefault()\n slideCmd('add')\n return\n }\n if (e.key === 'PageDown' || e.key === 'ArrowRight' || (e.key === ' ' && !e.shiftKey)) go(current + 1)\n else if (e.key === 'PageUp' || e.key === 'ArrowLeft') go(current - 1)\n else if (e.key === 'Home') go(0)\n else if (e.key === 'End') go(meta.count - 1)\n else return\n e.preventDefault()\n }\n\n const selOverlay = (i: number) => {\n const box = drag && drag.slide === i && drag.moved ? drag.cur : selected ? boxOf(modelOf(i), selected.top) : undefined\n if (!box || !selected) return undefined\n return (\n <Selection\n box={box}\n scale={scale}\n onHandle={(mode, e) => {\n const b = boxOf(modelOf(i), selected.top)\n if (b) setDrag({ slide: i, top: selected.top, mode, sx: e.clientX, sy: e.clientY, box: b, cur: b, moved: false, px: e.clientX, py: e.clientY })\n }}\n />\n )\n }\n\n const slots = []\n for (let i = first; i <= last; i++) {\n slots.push(\n <div key={`${slidesVer}:${i}`} className={viewer.editable ? 'de-slide-frame de-slide-editable' : 'de-slide-frame'} style={{ top: PAD + i * pitch, left }} data-slide={i + 1}\n onMouseDown={(e) => onSlideMouseDown(i, e)}\n onContextMenu={(e) => {\n if (!viewer.editable) return\n const t = e.target as HTMLElement\n if (editor.active && textRoot.current?.contains(t)) return\n e.preventDefault()\n const topEl = t.closest('[data-top]') as HTMLElement | null\n if (topEl) {\n stopEditing()\n const sel = { slide: i, top: Number(topEl.dataset.top) }\n selRef.current = sel\n setSelected(sel)\n setCtxMenu({ x: e.clientX, y: e.clientY, items: shapeMenu() })\n } else setCtxMenu({ x: e.clientX, y: e.clientY, items: slideMenu(i) })\n }}\n >\n <SlideSlot\n client={client}\n index={i}\n meta={meta}\n scale={scale}\n live\n editing={editor.slide === i ? editing : undefined}\n overlay={viewer.editable && selected?.slide === i ? selOverlay(i) : undefined}\n />\n </div>,\n )\n }\n if (editor.active && (editor.slide < first || editor.slide > last)) stopEditing()\n const thumbs = []\n if (showThumbs) {\n for (let i = tFirst; i <= tLast; i++) {\n thumbs.push(\n <div\n key={`${slidesVer}:${i}`}\n className=\"de-thumb\"\n style={{ top: 10 + i * tPitch }}\n aria-current={i === current}\n onClick={() => go(i)}\n onContextMenu={(e) => {\n if (!viewer.editable) return\n e.preventDefault()\n go(i)\n setCtxMenu({ x: e.clientX, y: e.clientY, items: slideMenu(i) })\n }}\n >\n <span className=\"de-thumb-n\">{i + 1}</span>\n <SlideSlot client={client} index={i} meta={meta} scale={tScale} live />\n </div>,\n )\n }\n }\n\n return (\n <div ref={rootRef} style={{ display: 'flex', flex: 1, minWidth: 0 }}>\n {showThumbs && (\n <div ref={thumbRef} className=\"de-thumbs\">\n <div style={{ height: 20 + meta.count * tPitch, position: 'relative' }}>{thumbs}</div>\n </div>\n )}\n <div style={{ position: 'relative', flex: 1, minWidth: 0, display: 'flex' }}>\n <div ref={scrollRef} className=\"de-scroll\" tabIndex={0} onKeyDown={onKeyDown} style={{ outline: 'none' }} onMouseDown={(e) => e.target === e.currentTarget && stopEditing()}>\n <div style={{ position: 'relative', height: totalH, width: totalW }} onMouseDown={(e) => e.target === e.currentTarget && stopEditing()}>\n {slots}\n </div>\n </div>\n <ZoomControl zoom={zoom} effective={scale} onChange={setZoom} />\n {!viewer.editable && (\n <button type=\"button\" className=\"de-mode de-present-btn\" title=\"Present (F5)\" onClick={() => setPresenting(current)}>\n ▶ Present\n </button>\n )}\n <Status text={`Slide ${current + 1} of ${meta.count}`} onStatus={onStatus} />\n {viewer.editable && (\n <PptxToolbar\n editor={editor}\n shape={\n selected && !editor.active\n ? (() => {\n const el = elOf(selected)\n const sh = el?.t === 'shape' ? el : undefined\n return { canText: sh?.sid !== undefined, anchor: sh?.text?.anchor }\n })()\n : null\n }\n textAnchor={editor.body?.anchor}\n canUndo={undoDepth > 0}\n onUndo={(redo) => void undoShapes(redo)}\n onInsert={(k) => void insert(k)}\n onFill={(color) => selected && void runShapes(selected.slide, [{ op: 'fill', top: selected.top, color }])}\n onLine={(p) => selected && void runShapes(selected.slide, [{ op: 'line', top: selected.top, ...p }])}\n onArrange={shapeCmd.arrange}\n onRotate={shapeCmd.rotate}\n onAlign={shapeCmd.align}\n onAnchor={shapeCmd.anchor}\n onDuplicate={shapeCmd.duplicate}\n onDelete={shapeCmd.remove}\n onBackground={(color) => void runShapes(current, [{ op: 'bg', color }])}\n onSlide={(k) => slideCmd(k)}\n onPresent={(fromStart) => setPresenting(fromStart ? 0 : current)}\n />\n )}\n {ctxMenu && <ContextMenu x={ctxMenu.x} y={ctxMenu.y} items={ctxMenu.items} onClose={() => setCtxMenu(null)} />}\n {presenting !== null && <Presenter client={client} meta={meta} start={presenting} onClose={() => setPresenting(null)} />}\n </div>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport type { DocSource } from '../core/source'\nimport { DocumentClient, type OpenOptions } from '../core/worker/client'\nimport type { Events } from '../core/worker/protocol'\n\nexport interface DocumentState {\n client: DocumentClient | null\n error: Error | null\n loading: boolean\n progress: Events['progress'] | null\n}\n\n/** Opens a document in a worker and closes it on unmount / source change. */\nexport function useDocument(src: DocSource | null | undefined, options: OpenOptions = {}): DocumentState {\n const [state, setState] = useState<DocumentState>({ client: null, error: null, loading: !!src, progress: null })\n const { name, worker, credentials } = options\n const headersKey = options.headers ? JSON.stringify(options.headers) : ''\n useEffect(() => {\n if (!src) {\n setState({ client: null, error: null, loading: false, progress: null })\n return\n }\n let live = true\n let client: DocumentClient | null = null\n setState({ client: null, error: null, loading: true, progress: null })\n DocumentClient.open(src, {\n name,\n worker,\n credentials,\n headers: headersKey ? JSON.parse(headersKey) : undefined,\n onProgress: (p) => live && setState((s) => ({ ...s, progress: p })),\n }).then(\n (c) => {\n if (!live) return c.destroy()\n client = c\n c.on('progress', (p) => live && setState((s) => ({ ...s, progress: p })))\n setState((s) => ({ ...s, client: c, loading: false }))\n },\n (e: Error) => live && setState({ client: null, error: e, loading: false, progress: null }),\n )\n return () => {\n live = false\n client?.destroy()\n }\n }, [src, name, worker, credentials, headersKey])\n return state\n}\n","import { useState } from 'react'\nimport type { BorderKind, FmtPatch } from '../../core/xlsx/types'\nimport { MOD } from '../common/ContextMenu'\nimport { EditorBar } from '../common/Slots'\nimport { Btn, ColorBtn, Dropdown, fontName, fontOptions, Icon, Menu, Pop, Select, Sep, SizeBox } from '../edit/Toolbar'\n\nconst FORMATS = [\n { value: 'General', label: 'Automatic', hint: '1000.12' },\n { value: '@', label: 'Plain text', hint: 'abc' },\n { value: '0', label: 'Number', hint: '1000', sep: true },\n { value: '0.00', label: 'Number', hint: '1000.12' },\n { value: '#,##0', label: 'Number', hint: '1,000' },\n { value: '#,##0.00', label: 'Number', hint: '1,000.12' },\n { value: '0.00E+00', label: 'Scientific', hint: '1.01E+03' },\n { value: '0%', label: 'Percent', hint: '10%', sep: true },\n { value: '0.00%', label: 'Percent', hint: '10.12%' },\n { value: '\"$\"#,##0.00', label: 'Currency', hint: '$1,000.12', sep: true },\n { value: '\"$\"#,##0', label: 'Currency rounded', hint: '$1,000' },\n { value: '_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)', label: 'Accounting', hint: '$ (1,000.12)' },\n { value: '#,##0 \"₫\"', label: 'Currency', hint: '1,000 ₫' },\n { value: '# ?/?', label: 'Fraction', hint: '1000 1/8' },\n { value: 'yyyy-mm-dd', label: 'Date', hint: '2026-09-26', sep: true },\n { value: 'dd/mm/yyyy', label: 'Date', hint: '26/09/2026' },\n { value: 'd mmmm yyyy', label: 'Long date', hint: '26 September 2026' },\n { value: 'h:mm', label: 'Time', hint: '15:59' },\n { value: 'h:mm:ss AM/PM', label: 'Time', hint: '3:59:00 PM' },\n { value: 'yyyy-mm-dd h:mm', label: 'Date time', hint: '2026-09-26 15:59' },\n { value: '[h]:mm:ss', label: 'Duration', hint: '24:01:00' },\n]\nconst SIZES = [6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 36, 48]\nconst BORDERS: { k: BorderKind; icon: string; title: string }[] = [\n { k: 'all', icon: 'bAll', title: 'All borders' },\n { k: 'inner', icon: 'bInner', title: 'Inner borders' },\n { k: 'outer', icon: 'bOuter', title: 'Outer borders' },\n { k: 'none', icon: 'bNone', title: 'Clear borders' },\n { k: 'top', icon: 'bTop', title: 'Top border' },\n { k: 'bottom', icon: 'bBottom', title: 'Bottom border' },\n { k: 'left', icon: 'bLeft', title: 'Left border' },\n { k: 'right', icon: 'bRight', title: 'Right border' },\n]\nconst BORDER_STYLES = [\n { value: 'thin', label: 'Thin', hint: '───' },\n { value: 'medium', label: 'Medium', hint: '━━━' },\n { value: 'thick', label: 'Thick', hint: '▬▬▬' },\n { value: 'dashed', label: 'Dashed', hint: '- - -' },\n { value: 'dotted', label: 'Dotted', hint: '·····' },\n { value: 'double', label: 'Double', hint: '═══' },\n] as const\nconst HALIGN = [\n { value: 'left', label: 'Left', icon: 'alignLeft' },\n { value: 'center', label: 'Center', icon: 'alignCenter' },\n { value: 'right', label: 'Right', icon: 'alignRight' },\n] as const\nconst VALIGN = [\n { value: 'top', label: 'Top', icon: 'vTop' },\n { value: 'center', label: 'Middle', icon: 'vMiddle' },\n { value: 'bottom', label: 'Bottom', icon: 'vBottom' },\n] as const\nconst ROTATE = [\n { value: 0, label: 'None', icon: 'rotNone' },\n { value: 45, label: 'Tilt up', icon: 'rotUp' },\n { value: -45, label: 'Tilt down', icon: 'rotDown' },\n { value: 255, label: 'Stack vertically', icon: 'rotStack' },\n { value: 90, label: 'Rotate up', icon: 'rotUp90' },\n { value: -90, label: 'Rotate down', icon: 'rotDown90' },\n]\nconst FUNCS = ['SUM', 'AVERAGE', 'COUNT', 'MAX', 'MIN']\n\nexport type MergeMode = 'all' | 'across' | 'down' | 'unmerge'\n\n/** number format with one decimal place more / less (Google Sheets .0 / .00 buttons) */\nfunction decimals(fmt: string, d: number): string {\n const base = fmt === 'General' || fmt === '@' ? '0' : fmt\n const m = /0(\\.0*)?/.exec(base)\n if (!m) return d > 0 ? '0.0' : '0'\n const n = Math.max(0, (m[1] ? m[1].length - 1 : 0) + d)\n return base.slice(0, m.index) + '0' + (n ? '.' + '0'.repeat(n) : '') + base.slice(m.index + m[0].length)\n}\n\nexport function XlsxToolbar(props: {\n css: Record<string, string | number>\n /** workbook default font (cells without an explicit font) */\n base: { fontFamily?: string; fontSize?: string | number }\n format: string\n merged: boolean\n frozen: boolean\n gridlines: boolean\n painter: boolean\n onToggle: (k: 'b' | 'i' | 'u' | 'strike') => void\n onFormat: (p: FmtPatch) => void\n onUndo: () => void\n onRedo: () => void\n onPaint: () => void\n onMerge: (mode: MergeMode) => void\n onFreeze: (k: 'none' | 'row' | 'col' | 'sel') => void\n onGridlines: () => void\n onFunc: (fn: string | null) => void\n onSort: (desc: boolean) => void\n onRows: (k: 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'delRow' | 'delCol' | 'hideRows' | 'hideCols' | 'unhideRows' | 'unhideCols') => void\n onFind: () => void\n}) {\n const { css, onFormat: f } = props\n const [bColor, setBColor] = useState('#000000')\n const [bStyle, setBStyle] = useState<(typeof BORDER_STYLES)[number]['value']>('thin')\n const deco = String(css.textDecoration ?? '')\n const align = (css.textAlign as string | undefined) ?? ''\n const valign = css.alignItems === 'flex-start' ? 'top' : css.alignItems === 'center' ? 'center' : 'bottom'\n const rot = Number(css.textRotate ?? 0)\n const pt = (v: unknown) => (typeof v === 'string' && v.endsWith('pt') ? parseFloat(v) : typeof v === 'number' ? Math.round(v * 0.75 * 2) / 2 : undefined)\n const sz = pt(css.fontSize) ?? pt(props.base.fontSize)\n const font = fontName((css.fontFamily ?? props.base.fontFamily) as string | undefined)\n const known = FORMATS.find((x) => x.value === props.format)\n const formats = known ? FORMATS : [{ value: props.format, label: 'Custom', hint: props.format }, ...FORMATS]\n return (\n <EditorBar>\n <Btn icon=\"undo\" title={`Undo (${MOD}Z)`} onClick={props.onUndo} />\n <Btn icon=\"redo\" title={`Redo (${MOD}Y)`} onClick={props.onRedo} />\n <Btn icon=\"paint\" title=\"Paint format (click, then select cells)\" active={props.painter} onClick={props.onPaint} />\n <Sep />\n <Btn icon=\"currency\" title=\"Format as currency\" onClick={() => f({ numFmt: '\"$\"#,##0.00' })} />\n <Btn icon=\"percent\" title=\"Format as percent\" onClick={() => f({ numFmt: '0%' })} />\n <Btn icon=\"decLess\" title=\"Decrease decimal places\" onClick={() => f({ numFmt: decimals(props.format, -1) })} />\n <Btn icon=\"decMore\" title=\"Increase decimal places\" onClick={() => f({ numFmt: decimals(props.format, 1) })} />\n <Select title={`Number format: ${known?.label ?? 'Custom'}`} width={96} menuWidth={270} value={props.format} options={formats} onChange={(v) => f({ numFmt: v })} />\n <Sep />\n <Select title=\"Font\" width={112} menuWidth={200} value={font} placeholder=\"Font\" options={fontOptions(font)} onChange={(v) => f({ font: v })} />\n <Sep />\n <SizeBox value={sz} sizes={SIZES} onChange={(v) => f({ sz: v })} />\n <Sep />\n <Btn icon=\"bold\" title={`Bold (${MOD}B)`} active={css.fontWeight === 700} onClick={() => props.onToggle('b')} />\n <Btn icon=\"italic\" title={`Italic (${MOD}I)`} active={css.fontStyle === 'italic'} onClick={() => props.onToggle('i')} />\n <Btn icon=\"underline\" title={`Underline (${MOD}U)`} active={deco.includes('underline')} onClick={() => props.onToggle('u')} />\n <Btn icon=\"strike\" title={`Strikethrough (${MOD}⇧X)`} active={deco.includes('line-through')} onClick={() => props.onToggle('strike')} />\n <ColorBtn icon=\"color\" title=\"Text color\" value={css.color as string | undefined} onPick={(c) => f({ color: c })} noneLabel=\"Automatic\" />\n <Sep />\n <ColorBtn icon=\"fill\" title=\"Fill color\" value={typeof css.background === 'string' && !css.background.includes('gradient') ? css.background : undefined} onPick={(c) => f({ fill: c })} noneLabel=\"No fill\" />\n <Pop icon=\"borders\" title=\"Borders\" chevron>\n {(close) => (\n <div className=\"de-borders-pop\">\n <div className=\"de-borders\" role=\"group\" aria-label=\"Borders\">\n {BORDERS.map((x) => (\n <button\n key={x.k}\n type=\"button\"\n className=\"de-tb\"\n title={x.title}\n aria-label={x.title}\n onClick={() => {\n close()\n f({ border: x.k, borderColor: bColor, borderStyle: bStyle })\n }}\n >\n <Icon name={x.icon} />\n </button>\n ))}\n </div>\n <div className=\"de-borders-side\">\n <ColorBtn icon=\"color\" title=\"Border color\" value={bColor} onPick={(c) => setBColor(c ?? '#000000')} noneLabel=\"Black\" />\n <Dropdown title=\"Border style\" icon=\"lineStyle\" label={null} menuWidth={150} value={bStyle} options={[...BORDER_STYLES]} onChange={(v) => setBStyle(v)} />\n </div>\n </div>\n )}\n </Pop>\n <Dropdown\n title=\"Merge cells\"\n icon=\"merge\"\n label={null}\n menuWidth={190}\n options={[\n { value: 'all', label: 'Merge all' },\n { value: 'across', label: 'Merge horizontally' },\n { value: 'down', label: 'Merge vertically' },\n { value: 'unmerge', label: 'Unmerge', disabled: !props.merged, sep: true },\n ]}\n onChange={(v) => props.onMerge(v as MergeMode)}\n />\n <Sep />\n <Dropdown\n title=\"Horizontal align\"\n icon={HALIGN.find((x) => x.value === align)?.icon ?? 'alignLeft'}\n label={null}\n menuWidth={140}\n value={align}\n options={HALIGN.map((x) => ({ ...x }))}\n onChange={(v) => f({ align: v === align ? null : (v as 'left') })}\n />\n <Dropdown title=\"Vertical align\" icon={VALIGN.find((x) => x.value === valign)!.icon} label={null} menuWidth={140} value={valign} options={VALIGN.map((x) => ({ ...x }))} onChange={(v) => f({ valign: v })} />\n <Btn icon=\"wrap\" title=\"Wrap text\" active={css.whiteSpace === 'pre-wrap'} onClick={() => f({ wrap: css.whiteSpace !== 'pre-wrap' })} />\n <Dropdown title=\"Text rotation\" icon={ROTATE.find((x) => x.value === rot)?.icon ?? 'rotNone'} label={null} menuWidth={180} value={rot} options={ROTATE} onChange={(v) => f({ rotate: v || null })} />\n <Sep />\n <Menu\n title=\"Insert, delete or hide rows & columns\"\n label=\"Rows\"\n icon=\"rowAdd\"\n items={[\n { value: 'rowAbove', label: 'Insert row above', icon: 'rowAbove' },\n { value: 'rowBelow', label: 'Insert row below', icon: 'rowBelow' },\n { value: 'colLeft', label: 'Insert column left', icon: 'colLeft' },\n { value: 'colRight', label: 'Insert column right', icon: 'colRight' },\n { value: 'delRow', label: 'Delete row(s)', icon: 'delRow', sep: true },\n { value: 'delCol', label: 'Delete column(s)', icon: 'delCol' },\n { value: 'hideRows', label: 'Hide row(s)', icon: 'hide', sep: true },\n { value: 'hideCols', label: 'Hide column(s)', icon: 'hide' },\n { value: 'unhideRows', label: 'Unhide rows', icon: 'view' },\n { value: 'unhideCols', label: 'Unhide columns', icon: 'view' },\n ]}\n onPick={(v) => props.onRows(v as 'rowAbove')}\n />\n <Dropdown\n title=\"Functions\"\n icon=\"sum\"\n label={null}\n menuWidth={170}\n options={[...FUNCS.map((x) => ({ value: x, label: x })), { value: '', label: 'More functions…', sep: true }]}\n onChange={(v) => props.onFunc(v || null)}\n />\n <Dropdown\n title=\"Sort range\"\n icon=\"sort\"\n label={null}\n menuWidth={200}\n options={[\n { value: 'asc', label: 'Sort range A → Z', icon: 'sortAZ' },\n { value: 'desc', label: 'Sort range Z → A', icon: 'sortZA' },\n ]}\n onChange={(v) => props.onSort(v === 'desc')}\n />\n <Menu\n title=\"View: freeze, gridlines\"\n label=\"View\"\n icon=\"freeze\"\n items={[\n { value: 'row', label: 'Freeze 1 row' },\n { value: 'col', label: 'Freeze 1 column' },\n { value: 'sel', label: 'Freeze up to current cell' },\n { value: 'none', label: 'Unfreeze', disabled: !props.frozen },\n { value: 'grid', label: props.gridlines ? 'Hide gridlines' : 'Show gridlines', icon: 'gridlines', sep: true },\n ]}\n onPick={(v) => (v === 'grid' ? props.onGridlines() : props.onFreeze(v as 'row'))}\n />\n <Sep />\n <Btn icon=\"clear\" title={`Clear formatting (${MOD}\\\\)`} onClick={() => f({ clear: true })} />\n <Btn icon=\"search\" title={`Find & replace (${MOD}F)`} onClick={props.onFind} />\n </EditorBar>\n )\n}\n","/** Variable-size axis (rows or columns): default size + sparse overrides, O(log n) lookups. */\nexport class Axis {\n count = 0\n private custom = new Map<number, number>()\n private keys: number[] = []\n private cum: number[] = [] // cumulative delta (size - def) up to and including keys[i]\n private dirty = false\n\n constructor(public def: number) {}\n\n set(i: number, size: number) {\n if (size === this.def) this.custom.delete(i)\n else this.custom.set(i, size)\n this.dirty = true\n }\n\n setRange(min: number, max: number, size: number) {\n const hi = Math.min(max, min + 20000)\n for (let i = min; i <= hi; i++) this.set(i, size)\n }\n\n private build() {\n if (!this.dirty) return\n this.keys = [...this.custom.keys()].sort((a, b) => a - b)\n let acc = 0\n this.cum = this.keys.map((k) => (acc += this.custom.get(k)! - this.def))\n this.dirty = false\n }\n\n size(i: number): number {\n return this.custom.get(i) ?? this.def\n }\n\n /** Start offset of index i. */\n pos(i: number): number {\n this.build()\n let lo = 0\n let hi = this.keys.length - 1\n let k = -1\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n if (this.keys[mid] < i) {\n k = mid\n lo = mid + 1\n } else hi = mid - 1\n }\n return i * this.def + (k >= 0 ? this.cum[k] : 0)\n }\n\n total(): number {\n return this.pos(this.count)\n }\n\n /** Index containing offset px (clamped to [0, count-1]). */\n index(px: number): number {\n if (px <= 0) return 0\n let lo = 0\n let hi = Math.max(0, this.count - 1)\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1\n if (this.pos(mid) <= px) lo = mid\n else hi = mid - 1\n }\n return lo\n }\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, type CSSProperties, type MutableRefObject, type ReactNode } from 'react'\nimport type { BookOp, CellDetail, CellOut, FindMatch, FindOptions, FmtPatch, Merge, Range, SheetOp, SheetProgress, WorkbookMeta, XlsxEditResult } from '../../core/xlsx/types'\nimport { colName } from '../../core/xlsx/workbook'\nimport { closeFormula, formulaContext, isFormula, rangeText, type FormulaContext } from '../../core/xlsx/formula/assist'\nimport { argSlot, functionInfo, suggestFunctions, type FnInfo } from '../../core/xlsx/formula/catalog'\nimport { MAX_COL, MAX_ROW } from '../../core/xlsx/formula/types'\nimport type { DocumentClient } from '../../core/worker/client'\nimport { getPeers, publishLocal, subscribePeers } from '../../collab/hosts'\nimport { useForceUpdate, useScroll, useSize } from '../common/hooks'\nimport { useViewer } from '../common/Slots'\nimport { Status } from '../common/Status'\nimport { ContextMenu, MOD, type MenuItem } from '../common/ContextMenu'\nimport { Toast } from '../common/Dialog'\nimport { FindBar } from '../docx/FindBar'\nimport { XlsxToolbar, type MergeMode } from './XlsxToolbar'\nimport { Axis } from './axis'\n\nconst BLOCK = 128\nconst HH = 22\nconst MAX_SCROLL_PX = 12_000_000\n\ninterface CachedBlock {\n rows: Map<number, CellOut[]>\n complete: boolean\n rowsAt: number\n}\n\nclass SheetState {\n rows = 0\n cols = 0\n done = false\n error?: string\n header = false\n rowAxis = new Axis(20)\n colAxis = new Axis(64)\n merges: Merge[] = []\n frozen = { rows: 0, cols: 0 }\n gridLines = true\n blocks = new Map<number, CachedBlock>()\n inflight = new Set<number>()\n /** view state kept while another sheet is shown */\n sel?: Selection\n scrollPos?: { x: number; y: number }\n}\n\nclass XlsxStore {\n sheets = new Map<number, SheetState>()\n /** focus the grid when the next sheet grid mounts */\n focusGrid = false\n private listeners = new Set<() => void>()\n private off: () => void\n\n constructor(private client: DocumentClient) {\n const offs = [\n client.on('xlsx:progress', (p) => this.onProgress(p)),\n // edits of collaborators (src/collab)\n client.on('collab:xlsx', (res) => this.applied(res, client.info.xlsx as WorkbookMeta)),\n ]\n this.off = () => offs.forEach((f) => f())\n }\n\n subscribe(fn: () => void) {\n this.listeners.add(fn)\n return () => {\n this.listeners.delete(fn)\n }\n }\n\n private emit() {\n for (const fn of this.listeners) fn()\n }\n\n sheet(i: number): SheetState {\n let s = this.sheets.get(i)\n if (!s) {\n s = new SheetState()\n this.sheets.set(i, s)\n this.client.call('xlsx.load', i).catch((e) => {\n s!.error = (e as Error).message\n s!.done = true\n this.emit()\n })\n }\n return s\n }\n\n private onProgress(p: SheetProgress) {\n const s = this.sheet(p.sheet)\n if (p.defaultRowH !== undefined && !s.header) {\n s.header = true\n s.rowAxis.def = p.defaultRowH || 20\n s.colAxis.def = p.defaultColW || 64\n for (const ci of p.colInfo ?? []) s.colAxis.setRange(ci.min, ci.max, ci.w)\n s.frozen = p.frozen ?? s.frozen\n s.gridLines = p.gridLines ?? true\n }\n for (const [r, px] of p.rowSizes) s.rowAxis.set(r, px)\n if (p.recalc) s.blocks.clear()\n s.rows = Math.max(s.rows, p.rows)\n s.cols = Math.max(s.cols, p.cols)\n if (p.merges) s.merges = p.merges\n if (p.error) s.error = p.error\n s.done = p.done\n this.emit()\n }\n\n ensure(sheet: number, r0: number, r1: number) {\n const s = this.sheet(sheet)\n if (!s.header && !s.done) return\n for (let b = Math.floor(r0 / BLOCK); b <= Math.floor(r1 / BLOCK); b++) {\n const cached = s.blocks.get(b)\n if (s.inflight.has(b)) continue\n if (cached && (cached.complete || (cached.rowsAt === s.rows && !s.done))) continue\n if (b * BLOCK > s.rows && !s.done && cached) continue\n s.inflight.add(b)\n const rowsAt = s.rows\n this.client\n .call('xlsx.block', sheet, b * BLOCK, (b + 1) * BLOCK)\n .then((res) => {\n const rows = new Map<number, CellOut[]>()\n for (const r of res.rows) rows.set(r.r, r.cells)\n s.blocks.set(b, { rows, complete: res.complete, rowsAt })\n if (s.blocks.size > 400) {\n const firstKey = s.blocks.keys().next().value as number\n s.blocks.delete(firstKey)\n }\n })\n .catch(() => {})\n .finally(() => {\n s.inflight.delete(b)\n this.emit()\n })\n }\n }\n\n /** drop cached rows so they are fetched again (after edits) */\n invalidate(sheet: number, r0: number, r1: number) {\n const s = this.sheet(sheet)\n for (let b = Math.floor(r0 / BLOCK); b <= Math.floor(r1 / BLOCK); b++) s.blocks.delete(b)\n s.rows = Math.max(s.rows, r1 + 1)\n this.emit()\n }\n\n /** applies an edit result: new styles, layout, sheet list + refetch of touched rows */\n applied(res: XlsxEditResult | null, meta: WorkbookMeta) {\n if (!res) return\n for (const st of res.styles ?? []) {\n meta.styles[st.index] = st.css\n meta.formats[st.index] = st.format\n }\n for (const i of res.recalc ?? []) this.sheets.get(i)?.blocks.clear()\n if (res.sheets) {\n meta.sheets = res.sheets\n this.sheets.clear()\n this.emit()\n return\n }\n const s = this.sheet(res.sheet)\n if (res.layout) {\n const l = res.layout\n s.rowAxis = new Axis(l.defaultRowH || s.rowAxis.def)\n s.colAxis = new Axis(l.defaultColW || s.colAxis.def)\n for (const ci of l.colInfo ?? []) s.colAxis.setRange(ci.min, ci.max, ci.w)\n for (const [r, px] of l.rowSizes) s.rowAxis.set(r, px)\n s.merges = l.merges ?? []\n s.frozen = l.frozen ?? s.frozen\n if (l.gridLines !== undefined) s.gridLines = l.gridLines\n s.rows = l.rows\n s.cols = l.cols\n s.blocks.clear()\n this.emit()\n return\n }\n s.cols = Math.max(s.cols, res.range.c1 + 1)\n this.invalidate(res.sheet, res.range.r0, res.range.r1)\n }\n\n row(sheet: number, r: number): CellOut[] | undefined {\n return this.sheets.get(sheet)?.blocks.get(Math.floor(r / BLOCK))?.rows.get(r)\n }\n\n dispose() {\n this.off()\n this.listeners.clear()\n }\n}\n\nconst stores = new WeakMap<DocumentClient, XlsxStore>()\nfunction storeFor(client: DocumentClient) {\n let s = stores.get(client)\n if (!s) stores.set(client, (s = new XlsxStore(client)))\n return s\n}\n\nexport interface XlsxViewProps {\n client: DocumentClient\n onStatus?: (s: string) => void\n initialSheet?: number\n}\n\nexport function XlsxView({ client, onStatus, initialSheet }: XlsxViewProps) {\n const meta = client.info.xlsx as WorkbookMeta\n const visible = meta.sheets.filter((s) => !s.hidden)\n const [active, setActive] = useState(initialSheet ?? visible[0]?.index ?? 0)\n const store = useMemo(() => storeFor(client), [client])\n const [, bump] = useForceUpdate()\n useEffect(() => store.subscribe(bump), [store, bump])\n const state = store.sheet(active)\n\n const status = state.error\n ? `Error: ${state.error}`\n : `${state.rows.toLocaleString()} rows × ${state.cols.toLocaleString()} cols${state.done ? '' : ' · loading…'}`\n\n const viewer = useViewer()\n const [renaming, setRenaming] = useState<number | null>(null)\n const [tabMenu, setTabMenu] = useState<{ index: number; x: number; y: number } | null>(null)\n const bookOp = async (op: BookOp, goTo?: number) => {\n try {\n const res = await client.call('xlsx.bookOp', op)\n store.applied(res, meta)\n viewer.setDirty(true)\n if (goTo !== undefined) setActive(Math.max(0, Math.min(goTo, meta.sheets.length - 1)))\n bump()\n } catch (e) {\n alertError(e)\n }\n }\n const cur = Math.min(active, meta.sheets.length - 1)\n const [edit, setEdit] = useState<EditState | null>(null)\n /** set while switching sheets during a formula edit: blur must not commit */\n const hold = useRef(false)\n const keepEditing = !!edit && isFormula(edit.value) && canPoint(edit, formulaContext(edit.value, edit.caret))\n\n return (\n <div className=\"de-xlsx\">\n <Status text={status} onStatus={onStatus} />\n <SheetGrid\n key={`${cur}:${meta.sheets[cur]?.path}`}\n store={store}\n sheet={cur}\n meta={meta}\n client={client}\n edit={edit}\n setEdit={setEdit}\n hold={hold}\n onSheet={setActive}\n />\n <div className=\"de-tabs\" role=\"tablist\">\n {viewer.editable && (\n <button type=\"button\" className=\"de-tab de-tab-add\" title=\"Add sheet\" onClick={() => void bookOp({ op: 'add', after: cur }, cur + 1)}>\n +\n </button>\n )}\n {meta.sheets.filter((s) => !s.hidden).map((s) =>\n renaming === s.index ? (\n <input\n key={s.index}\n className=\"de-tab-input\"\n autoFocus\n defaultValue={s.name}\n onBlur={(e) => {\n setRenaming(null)\n if (e.target.value.trim() && e.target.value !== s.name) void bookOp({ op: 'rename', index: s.index, name: e.target.value })\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') setRenaming(null)\n }}\n />\n ) : (\n <button\n key={s.index}\n type=\"button\"\n role=\"tab\"\n className=\"de-tab\"\n aria-selected={s.index === cur}\n onMouseDown={(e) => {\n // formula being typed: clicking another sheet keeps editing (cross-sheet references)\n if (!keepEditing) return\n e.preventDefault()\n if (s.index !== cur) hold.current = true\n }}\n onClick={() => setActive(s.index)}\n onDoubleClick={() => viewer.editable && setRenaming(s.index)}\n onContextMenu={(e) => {\n if (!viewer.editable) return\n e.preventDefault()\n setTabMenu({ index: s.index, x: e.clientX, y: e.clientY })\n }}\n >\n {s.name}\n </button>\n ),\n )}\n </div>\n {tabMenu && (\n <ContextMenu\n x={tabMenu.x}\n y={tabMenu.y}\n onClose={() => setTabMenu(null)}\n items={[\n { label: 'Rename', run: () => setRenaming(tabMenu.index) },\n { label: 'Duplicate name → new sheet', run: () => void bookOp({ op: 'add', after: tabMenu.index, name: meta.sheets[tabMenu.index].name + ' (2)' }, tabMenu.index + 1) },\n { label: 'Move left', disabled: tabMenu.index === 0, run: () => void bookOp({ op: 'move', from: tabMenu.index, to: tabMenu.index - 1 }, tabMenu.index - 1) },\n { label: 'Move right', disabled: tabMenu.index >= meta.sheets.length - 1, run: () => void bookOp({ op: 'move', from: tabMenu.index, to: tabMenu.index + 1 }, tabMenu.index + 1) },\n { label: 'Delete sheet', disabled: meta.sheets.length <= 1, run: () => void bookOp({ op: 'delete', index: tabMenu.index }, Math.max(0, tabMenu.index - 1)) },\n ]}\n />\n )}\n </div>\n )\n}\n\nfunction alertError(e: unknown) {\n console.error('[office-engine]', e)\n}\n\nexport { ContextMenu, type MenuItem } from '../common/ContextMenu'\n\ninterface GridProps {\n store: XlsxStore\n sheet: number\n meta: WorkbookMeta\n client: DocumentClient\n edit: EditState | null\n setEdit: React.Dispatch<React.SetStateAction<EditState | null>>\n hold: MutableRefObject<boolean>\n onSheet: (i: number) => void\n}\n\nconst fontPx = (v: string | number | undefined, base: number) =>\n typeof v === 'string' && v.endsWith('pt') ? (parseFloat(v) * 4) / 3 : typeof v === 'number' ? v : base\n\n/** Excel-like: shrink General decimals to fit, otherwise show ### when a number is too wide. */\nfunction fitNumber(text: string, width: number, px: number): string {\n const cw = px * 0.56\n if (text.length * cw <= width) return text\n const m = /^(-?\\d+)\\.(\\d+)$/.exec(text)\n if (m && (m[1].length + (text.startsWith('-') ? 0 : 0)) * cw <= width) {\n const keep = Math.max(0, Math.floor(width / cw) - m[1].length - 1)\n const v = Number(text).toFixed(keep)\n if (v.length * cw <= width) return v\n }\n return '#'.repeat(Math.max(1, Math.floor(width / cw)))\n}\n\n/** text rotation (OOXML degrees, + = counter-clockwise, 255 = stacked) */\nfunction rotated(rot: number): CSSProperties {\n if (rot === 255) return { writingMode: 'vertical-rl', textOrientation: 'upright', whiteSpace: 'nowrap' }\n if (rot === 90) return { writingMode: 'vertical-rl', transform: 'rotate(180deg)', whiteSpace: 'nowrap' }\n if (rot === -90) return { writingMode: 'vertical-rl', whiteSpace: 'nowrap' }\n return { display: 'inline-block', transform: `rotate(${-rot}deg)`, whiteSpace: 'nowrap' }\n}\n\nconst JUSTIFY: Record<string, string> = { center: 'center', right: 'flex-end', left: 'flex-start', justify: 'flex-start' }\n\ninterface Selection {\n ar: number\n ac: number\n fr: number\n fc: number\n}\n\ninterface EditState {\n /** sheet of the edited cell (may differ from the shown sheet while pointing) */\n sheet: number\n r: number\n c: number\n value: string\n initial: string\n /** editing in the formula bar */\n bar: boolean\n /** 'enter': started by typing (arrows point / commit), 'edit': F2, double click, formula bar */\n mode: 'enter' | 'edit'\n caret: number\n caretEnd: number\n /** bump to push caret/focus into the input */\n sync: number\n /** reference inserted by pointing: span in `value` + pointed block */\n point?: { s: number; e: number; sheet: number; ar: number; ac: number; fr: number; fc: number }\n /** autocomplete dismissed (Escape) for the word starting here */\n noSuggest?: number\n}\n\n/** pointing a reference is possible at the caret */\nfunction canPoint(e: EditState, fc: FormulaContext | null): boolean {\n if (!fc) return false\n if (e.point && e.point.e === e.caret && e.caret === e.caretEnd) return true\n if (e.caret !== e.caretEnd) return fc.refs.some((r) => r.s === e.caret && r.e === e.caretEnd)\n return fc.pointable\n}\n\nconst REF_COLORS = ['#1a73e8', '#e8710a', '#9334e6', '#188038', '#d93025', '#12a4b8', '#e52592', '#b08800']\nconst refKey = (t: string) => t.replace(/\\$/g, '').toUpperCase()\n\nconst ARROWS: Record<string, [number, number]> = { ArrowUp: [-1, 0], ArrowDown: [1, 0], ArrowLeft: [0, -1], ArrowRight: [0, 1] }\n\nexport const rectOf = (s: Selection): Range => ({ r0: Math.min(s.ar, s.fr), c0: Math.min(s.ac, s.fc), r1: Math.max(s.ar, s.fr), c1: Math.max(s.ac, s.fc) })\n\nfunction SheetGrid({ store, sheet, meta, client, edit, setEdit, hold, onSheet }: GridProps) {\n const viewer = useViewer()\n const editable = viewer.editable\n const s = store.sheet(sheet)\n const [scrollRef, size] = useSize<HTMLDivElement>()\n const scroll = useScroll(scrollRef)\n const [sel, setSelState] = useState<Selection>(() => s.sel ?? { ar: 0, ac: 0, fr: 0, fc: 0 })\n s.sel = sel\n const [detailState, setDetail] = useState<{ r: number; c: number; d?: CellDetail } | null>(null)\n const detail = detailState && detailState.r === sel.ar && detailState.c === sel.ac ? detailState.d : undefined\n const [detailTick, setDetailTick] = useState(0)\n const dragging = useRef(false)\n const editRef = useRef<HTMLTextAreaElement>(null)\n const hlRef = useRef<HTMLDivElement>(null)\n const fxRef = useRef<HTMLInputElement>(null)\n const [sugIdx, setSugIdx] = useState(0)\n const [ctx, setCtx] = useState<{ x: number; y: number } | null>(null)\n /** paint format: style index copied from the active cell, applied to the next selection */\n const [painter, setPainter] = useState<number | null>(null)\n const afterDrag = useRef<(() => void) | null>(null)\n const [find, setFind] = useState<{ open: boolean; q: string; idx: number; replace: boolean; tick: number }>({ open: false, q: '', idx: 0, replace: false, tick: 0 })\n const [findOpts, setFindOpts] = useState<FindOptions>({})\n const [matches, setMatches] = useState<FindMatch[]>([])\n const [toast, setToast] = useState<string | null>(null)\n const [resizing, setResizing] = useState<{ axis: 'col' | 'row'; i: number; start: number; size: number } | null>(null)\n\n const { rowAxis, colAxis, frozen } = s\n const HW = Math.max(40, 12 + 7 * String(Math.max(s.rows, 1000)).length)\n const viewW = Math.max(0, size.w - HW)\n const viewH = Math.max(0, size.h - HH)\n rowAxis.count = Math.max(s.rows + (s.done ? 20 : 1), Math.ceil(viewH / rowAxis.def) + 1, frozen.rows + 1, sel.fr + 2)\n colAxis.count = Math.max(s.cols + 3, 26, Math.ceil(viewW / Math.max(1, colAxis.def)) + 1, frozen.cols + 1, sel.fc + 2)\n const frozenW = colAxis.pos(frozen.cols)\n const frozenH = rowAxis.pos(frozen.rows)\n const totalW = colAxis.total()\n const totalH = rowAxis.total()\n\n // virtual scroll with clamped spacer height (browsers cap element size)\n const spacerW = HW + totalW\n const spacerH = Math.min(HH + totalH, MAX_SCROLL_PX)\n const maxLogicalY = Math.max(0, HH + totalH - size.h)\n const maxScrollY = Math.max(0, spacerH - size.h)\n const scrollY = maxScrollY > 0 ? Math.min(maxLogicalY, (scroll.y / maxScrollY) * maxLogicalY) : 0\n const scrollX = scroll.x\n\n const mainOx = frozenW + scrollX\n const mainOy = frozenH + scrollY\n const mainW = Math.max(0, viewW - frozenW)\n const mainH = Math.max(0, viewH - frozenH)\n const r0 = rowAxis.index(mainOy)\n const r1 = Math.min(rowAxis.count - 1, rowAxis.index(mainOy + mainH))\n const c0 = colAxis.index(mainOx)\n const c1 = Math.min(colAxis.count - 1, colAxis.index(mainOx + mainW))\n\n // merges touching the visible area (+ frozen panes)\n const visMerges = useMemo(() => {\n const inRange = (m: Merge) =>\n (m.r1 >= r0 && m.r0 <= r1) || m.r0 < frozen.rows ? (m.c1 >= c0 && m.c0 <= c1) || m.c0 < frozen.cols : false\n return s.merges.filter(inRange)\n }, [s.merges, r0, r1, c0, c1, frozen.rows, frozen.cols])\n\n useEffect(() => {\n if (frozen.rows) store.ensure(sheet, 0, frozen.rows - 1)\n store.ensure(sheet, Math.max(0, r0 - 20), r1 + 40)\n for (const m of visMerges) if (m.r0 < r0) store.ensure(sheet, m.r0, m.r0)\n })\n\n useEffect(() => {\n let live = true\n const { ar, ac } = sel\n client.call('xlsx.cell', sheet, ar, ac).then((d) => live && setDetail({ r: ar, c: ac, d }), () => {})\n return () => {\n live = false\n }\n }, [client, sheet, sel.ar, sel.ac, s.done, detailTick])\n\n const styles = meta.styles\n const basePx = fontPx(meta.baseFont.fontSize, 14.67)\n const mergeAt = (r: number, c: number) => s.merges.find((m) => r >= m.r0 && r <= m.r1 && c >= m.c0 && c <= m.c1)\n const rect = rectOf(sel)\n const selRef = useRef(rect)\n selRef.current = rect\n // collaboration: share the selection, show the collaborators' ones\n useEffect(() => publishLocal(client, { sheet, range: rect, ar: sel.ar, ac: sel.ac }), [client, sheet, rect.r0, rect.c0, rect.r1, rect.c1, sel.ar, sel.ac]) // eslint-disable-line react-hooks/exhaustive-deps\n const peers = useSyncExternalStore(\n (fn) => subscribePeers(client, fn),\n () => getPeers(client),\n )\n const sheetPath = meta.sheets[sheet]?.path\n const peerSels = peers.flatMap((p) => {\n const x = p.presence as { k?: string; sheet?: string; range?: Range; ar?: number; ac?: number } | undefined\n return x?.k === 'xlsx' && x.sheet === sheetPath && x.range ? [{ ...p, range: x.range, ar: x.ar ?? x.range.r0, ac: x.ac ?? x.range.c0 }] : []\n })\n\n useLayoutEffect(() => {\n hold.current = false\n const el = scrollRef.current\n if (el && s.scrollPos) {\n el.scrollLeft = s.scrollPos.x\n el.scrollTop = s.scrollPos.y\n }\n if (store.focusGrid) {\n store.focusGrid = false\n el?.focus({ preventScroll: true })\n }\n return () => {\n if (el?.isConnected) s.scrollPos = { x: el.scrollLeft, y: el.scrollTop }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n const setSel = (next: Selection) => {\n const m = mergeAt(next.ar, next.ac)\n if (m) next = { ...next, ar: m.r0, ac: m.c0 }\n setSelState(next)\n }\n\n // ---------------------------------------------------------------- rendering helpers\n\n function region(key: string, rr0: number, rr1: number, cc0: number, cc1: number, ox: number, oy: number, left: number, top: number, w: number, h: number) {\n if (w <= 0 || h <= 0 || rr1 < rr0 || cc1 < cc0) return null\n const out: ReactNode[] = []\n if (s.gridLines) {\n for (let r = rr0; r <= rr1; r++) out.push(<div key={'h' + r} className=\"de-gl-h\" style={{ top: rowAxis.pos(r + 1) - oy - 1 }} />)\n for (let c = cc0; c <= cc1; c++) out.push(<div key={'v' + c} className=\"de-gl-v\" style={{ left: colAxis.pos(c + 1) - ox - 1 }} />)\n }\n const covered = new Set<number>()\n const anchors: Merge[] = []\n for (const m of visMerges) {\n if (m.r1 < rr0 || m.r0 > rr1 || m.c1 < cc0 || m.c0 > cc1) continue\n anchors.push(m)\n for (let r = Math.max(m.r0, rr0); r <= Math.min(m.r1, rr1); r++)\n for (let c = Math.max(m.c0, cc0); c <= Math.min(m.c1, cc1); c++) covered.add(r * 16384 + c)\n }\n const cellEl = (r: number, cell: CellOut, wOverride?: number, hOverride?: number, filled?: Set<number>, merged = false) => {\n const [c, raw, si, kind, color] = cell\n const cw = wOverride ?? colAxis.size(c)\n const ch = hOverride ?? rowAxis.size(r)\n if (!cw || !ch) return null\n const css = (styles[si] ?? {}) as Record<string, string | number>\n let text = raw\n if (kind === 1 && raw) text = fitNumber(raw, cw - 6, fontPx(css.fontSize, basePx))\n const { textAlign, textRotate, alignItems, whiteSpace, ...rest } = css\n const rot = Number(textRotate ?? 0)\n const justify = (textAlign && JUSTIFY[textAlign as string]) || (kind === 1 ? 'flex-end' : kind === 2 ? 'center' : 'flex-start')\n let ov = 0\n if (text && !rot && !whiteSpace && justify === 'flex-start' && !merged && filled) {\n let next = c + 1\n while (next <= cc1 + 8 && !filled.has(next) && !covered.has(r * 16384 + next)) next++\n ov = colAxis.pos(next) - colAxis.pos(c)\n }\n const style: CSSProperties = {\n ...(rest as CSSProperties),\n left: colAxis.pos(c) - ox,\n top: rowAxis.pos(r) - oy,\n width: cw,\n height: ch,\n justifyContent: justify,\n alignItems: (alignItems as string) ?? 'flex-end',\n textAlign: (textAlign as CSSProperties['textAlign']) ?? undefined,\n }\n if (color) style.color = color\n if (whiteSpace) style.whiteSpace = whiteSpace as CSSProperties['whiteSpace']\n const overflow = ov > cw\n return (\n <div key={`${r}:${c}`} className={overflow ? 'de-cell de-ov' : 'de-cell'} style={style}>\n {text && <span style={rot ? rotated(rot) : overflow ? { maxWidth: ov - 6, overflow: 'hidden', flex: 'none' } : undefined}>{text}</span>}\n </div>\n )\n }\n for (const m of anchors) {\n const row = store.row(sheet, m.r0)\n const cell = row?.find((x) => x[0] === m.c0) ?? ([m.c0, '', 0, 0] as CellOut)\n out.push(cellEl(m.r0, cell, colAxis.pos(m.c1 + 1) - colAxis.pos(m.c0), rowAxis.pos(m.r1 + 1) - rowAxis.pos(m.r0), undefined, true))\n }\n for (let r = rr0; r <= rr1; r++) {\n const row = store.row(sheet, r)\n if (!row) continue\n let filled: Set<number> | undefined\n for (const cell of row) {\n const c = cell[0]\n if (c < cc0 - 8 || c > cc1) continue\n if (covered.has(r * 16384 + c)) continue\n if (c < cc0 && (!cell[1] || cell[3] !== 0)) continue\n if (anchors.some((m) => m.r0 === r && m.c0 === c)) continue\n if (!filled && cell[3] === 0 && cell[1]) filled = new Set(row.filter((x) => x[1] !== '').map((x) => x[0]))\n out.push(cellEl(r, cell, undefined, undefined, filled))\n }\n }\n // selection range + active cell\n if (rect.r1 >= rr0 && rect.r0 <= rr1 && rect.c1 >= cc0 && rect.c0 <= cc1 && (rect.r0 !== rect.r1 || rect.c0 !== rect.c1)) {\n out.push(\n <div\n key=\"range\"\n className=\"de-range\"\n style={{\n left: colAxis.pos(rect.c0) - ox,\n top: rowAxis.pos(rect.r0) - oy,\n width: colAxis.pos(rect.c1 + 1) - colAxis.pos(rect.c0),\n height: rowAxis.pos(rect.r1 + 1) - rowAxis.pos(rect.r0),\n }}\n />,\n )\n }\n if (sel.ar >= rr0 - 1 && sel.ar <= rr1 && sel.ac >= cc0 - 1 && sel.ac <= cc1) {\n const m = mergeAt(sel.ar, sel.ac)\n const sw = m ? colAxis.pos(m.c1 + 1) - colAxis.pos(m.c0) : colAxis.size(sel.ac)\n const sh = m ? rowAxis.pos(m.r1 + 1) - rowAxis.pos(m.r0) : rowAxis.size(sel.ar)\n out.push(<div key=\"sel\" className=\"de-sel\" style={{ left: colAxis.pos(sel.ac) - ox - 1, top: rowAxis.pos(sel.ar) - oy - 1, width: sw + 1, height: sh + 1 }} />)\n }\n // collaborators' selections\n for (const p of peerSels) {\n const b = p.range\n if (b.r1 < rr0 || b.r0 > rr1 || b.c1 < cc0 || b.c0 > cc1) continue\n const x0 = colAxis.pos(b.c0)\n const y0 = rowAxis.pos(b.r0)\n const x1 = colAxis.pos(b.c1 + 1)\n const y1 = rowAxis.pos(b.r1 + 1)\n out.push(\n <div key={'peer' + p.site} className=\"de-peer-range\" style={{ left: x0 - ox - 1, top: y0 - oy - 1, width: x1 - x0 + 1, height: y1 - y0 + 1, borderColor: p.color, background: p.color + '12' }}>\n {p.ar >= rr0 && p.ar <= rr1 && p.ac >= cc0 && p.ac <= cc1 && (\n <span className=\"de-peer-tag\" style={{ background: p.color }}>\n {p.name}\n </span>\n )}\n </div>,\n )\n }\n // find matches\n findBoxes.forEach((m, i) => {\n if (m.r < rr0 || m.r > rr1 || m.c < cc0 || m.c > cc1) return\n out.push(\n <div\n key={'fm' + i}\n className={i === find.idx ? 'de-findcell on' : 'de-findcell'}\n style={{ left: colAxis.pos(m.c) - ox, top: rowAxis.pos(m.r) - oy, width: colAxis.size(m.c), height: rowAxis.size(m.r) }}\n />,\n )\n })\n // references of the formula being edited\n refBoxes.forEach((b, i) => {\n if (b.r1 < rr0 || b.r0 > rr1 || b.c1 < cc0 || b.c0 > cc1) return\n const y0 = rowAxis.pos(Math.max(b.r0, rr0 - 1))\n const y1 = rowAxis.pos(Math.min(b.r1, rr1 + 1) + 1)\n const x0 = colAxis.pos(Math.max(b.c0, cc0 - 1))\n const x1 = colAxis.pos(Math.min(b.c1, cc1 + 1) + 1)\n out.push(\n <div\n key={'fr' + i}\n className={b.point ? 'de-fref de-fref-pt' : 'de-fref'}\n style={{ left: x0 - ox - 1, top: y0 - oy - 1, width: x1 - x0 + 1, height: y1 - y0 + 1, borderColor: b.color, background: b.color + '14' }}\n />,\n )\n })\n return (\n <div key={key} className=\"de-region\" style={{ left, top, width: w, height: h }}>\n {out}\n </div>\n )\n }\n\n function colHeaders(key: string, cc0: number, cc1: number, ox: number, left: number, w: number) {\n if (w <= 0) return null\n const out: ReactNode[] = []\n for (let c = cc0; c <= cc1; c++) {\n const cw = colAxis.size(c)\n if (!cw) continue\n out.push(\n <div key={c} data-col={c} className={c >= rect.c0 && c <= rect.c1 ? 'de-head-c de-head-on' : 'de-head-c'} style={{ left: colAxis.pos(c) - ox, top: 0, width: cw, height: HH }}>\n {colName(c)}\n </div>,\n )\n if (editable) out.push(<div key={'g' + c} data-grip-col={c} className=\"de-grip-c\" style={{ left: colAxis.pos(c + 1) - ox - 3, height: HH }} />)\n }\n return (\n <div key={key} className=\"de-region\" style={{ left, top: 0, width: w, height: HH }}>\n {out}\n </div>\n )\n }\n\n function rowHeaders(key: string, rr0: number, rr1: number, oy: number, top: number, h: number) {\n if (h <= 0) return null\n const out: ReactNode[] = []\n for (let r = rr0; r <= rr1; r++) {\n const rh = rowAxis.size(r)\n if (!rh) continue\n out.push(\n <div key={r} data-row={r} className={r >= rect.r0 && r <= rect.r1 ? 'de-head-r de-head-on' : 'de-head-r'} style={{ left: 0, top: rowAxis.pos(r) - oy, width: HW, height: rh }}>\n {r + 1}\n </div>,\n )\n if (editable) out.push(<div key={'g' + r} data-grip-row={r} className=\"de-grip-r\" style={{ top: rowAxis.pos(r + 1) - oy - 3, width: HW }} />)\n }\n return (\n <div key={key} className=\"de-region\" style={{ left: 0, top, width: HW, height: h }}>\n {out}\n </div>\n )\n }\n\n const fr = frozen.rows\n const fc = frozen.cols\n const fw = Math.min(frozenW, viewW)\n const fh = Math.min(frozenH, viewH)\n\n /** cell rectangle in grid-view coordinates (frozen-pane aware) */\n const cellBox = (r: number, c: number) => {\n const m = mergeAt(r, c)\n const x = HW + colAxis.pos(c) - (c >= fc ? scrollX : 0)\n const y = HH + rowAxis.pos(r) - (r >= fr ? scrollY : 0)\n return {\n x,\n y,\n w: m ? colAxis.pos(m.c1 + 1) - colAxis.pos(m.c0) : colAxis.size(c),\n h: m ? rowAxis.pos(m.r1 + 1) - rowAxis.pos(m.r0) : rowAxis.size(r),\n }\n }\n\n const scrollIntoView = (r: number, c: number) => {\n const el = scrollRef.current\n if (!el) return\n const x = colAxis.pos(c)\n const y = rowAxis.pos(r)\n if (c >= fc) {\n if (x - frozenW < scrollX) el.scrollLeft = x - frozenW\n else if (x + colAxis.size(c) > mainOx + mainW) el.scrollLeft = x + colAxis.size(c) - frozenW - mainW\n }\n if (r >= fr && maxLogicalY > 0) {\n let ty = scrollY\n if (y - frozenH < scrollY) ty = y - frozenH\n else if (y + rowAxis.size(r) > mainOy + mainH) ty = y + rowAxis.size(r) - frozenH - mainH\n if (ty !== scrollY) el.scrollTop = (ty / maxLogicalY) * maxScrollY\n }\n }\n\n const cellAt = (clientX: number, clientY: number, el: HTMLElement) => {\n const b = el.getBoundingClientRect()\n const x = clientX - b.left - HW\n const y = clientY - b.top - HH\n const lx = x < frozenW ? x : x + scrollX\n const ly = y < frozenH ? y : y + scrollY\n return { r: y < 0 ? -1 : rowAxis.index(Math.max(0, ly)), c: x < 0 ? -1 : colAxis.index(Math.max(0, lx)) }\n }\n\n // ---------------------------------------------------------------- editing\n\n const focusGrid = () => scrollRef.current?.focus({ preventScroll: true })\n const styleOf = (r: number, c: number) => store.row(sheet, r)?.find((x) => x[0] === c)?.[2] ?? 0\n\n const run = async (p: Promise<XlsxEditResult | null>) => {\n try {\n const res = await p\n store.applied(res, meta)\n if (res) viewer.setDirty(true)\n setDetailTick((t) => t + 1)\n } catch (e) {\n console.error('[office-engine]', e)\n }\n }\n\n const shown = (d: CellDetail | undefined, r: number, c: number) => {\n if (!d) return ''\n if (d.formula) return d.formula\n // dates & times: show the formatted value rather than the serial number\n if (d.type === 'number' && /[dmyhs]/i.test((meta.formats[styleOf(r, c)] ?? '').replace(/\"[^\"]*\"|\\[[^\\]]*\\]/g, ''))) {\n return store.row(sheet, r)?.find((x) => x[0] === c)?.[1] ?? d.value\n }\n return d.value\n }\n\n const startEdit = async (initial?: string, bar = false) => {\n if (!editable || !s.done || edit) return\n const { ar, ac } = sel\n const begin = (value: string, initialText: string, mode: EditState['mode']) =>\n setEdit({ sheet, r: ar, c: ac, value, initial: initialText, bar, mode, caret: value.length, caretEnd: value.length, sync: bar ? 0 : 1 })\n // typing replaces the content: no need to know the current value\n if (initial !== undefined) return begin(initial, '\\u0000', 'enter')\n const d = detailState && detailState.r === ar && detailState.c === ac ? detailState.d : await client.call('xlsx.cell', sheet, ar, ac).catch(() => undefined)\n const current = shown(d, ar, ac)\n begin(current, current, 'edit')\n }\n\n const commit = (move?: [number, number]) => {\n const e = edit\n if (!e) return\n setEdit(null)\n const value = closeFormula(e.value)\n if (value !== e.initial) void run(client.call('xlsx.set', e.sheet, [{ r: e.r, c: e.c, input: value }]))\n if (e.sheet !== sheet) return backTo(e, move)\n if (move) moveBy(move[0], move[1], false)\n focusGrid()\n }\n\n const cancel = () => {\n const e = edit\n setEdit(null)\n if (e && e.sheet !== sheet) return backTo(e)\n focusGrid()\n }\n\n /** formula edited from another sheet: return to the edited cell's sheet */\n const backTo = (e: EditState, move?: [number, number]) => {\n const r = Math.max(0, e.r + (move?.[0] ?? 0))\n const c = Math.max(0, e.c + (move?.[1] ?? 0))\n store.sheet(e.sheet).sel = { ar: r, ac: c, fr: r, fc: c }\n store.focusGrid = true\n onSheet(e.sheet)\n }\n\n // ---------------------------------------------------------------- formula assist\n\n const own = !!edit && edit.sheet === sheet\n const inCell = own && !edit?.bar\n const fctx = edit && isFormula(edit.value) ? formulaContext(edit.value, edit.caret) : null\n const pointOk = !!edit && canPoint(edit, fctx)\n const pointActive = !!edit?.point && edit.point.e === edit.caret && edit.caret === edit.caretEnd\n\n // references of the formula being edited: colored spans + boxes on this sheet\n const refSpans: { s: number; e: number; color: string }[] = []\n const refBoxes: { r0: number; c0: number; r1: number; c1: number; color: string; point: boolean }[] = []\n if (fctx && edit) {\n const colors = new Map<string, string>()\n for (const f of fctx.refs) {\n const k = refKey(f.text)\n let color = colors.get(k)\n if (!color) colors.set(k, (color = REF_COLORS[colors.size % REF_COLORS.length]))\n refSpans.push({ s: f.s, e: f.e, color })\n const sh = f.ref.sheet\n const target = sh === undefined ? edit.sheet : meta.sheets.findIndex((x) => x.name.toLowerCase() === sh.toLowerCase())\n if (target === sheet) refBoxes.push({ r0: f.ref.r0, c0: f.ref.c0, r1: f.ref.r1, c1: f.ref.c1, color, point: pointActive && f.s === edit.point!.s })\n }\n }\n\n const word = fctx?.word && edit?.noSuggest !== fctx.word.s && edit?.caret === edit?.caretEnd ? fctx.word : undefined\n const sugg: FnInfo[] = word ? suggestFunctions(word.text, 8) : []\n const hint = !sugg.length && fctx?.call ? functionInfo(fctx.call.name) : undefined\n const sugKey = word ? `${word.s}:${word.text}` : ''\n useEffect(() => setSugIdx(0), [sugKey])\n\n const inputEl = (): HTMLTextAreaElement | HTMLInputElement | null => (inCell ? editRef.current : fxRef.current)\n\n // push focus + caret into the active input (start, pointing, autocomplete, sheet switch)\n useLayoutEffect(() => {\n if (!edit) return\n const el = inputEl()\n if (!el) return\n const root = el.getRootNode() as Document | ShadowRoot\n if (root.activeElement !== el) el.focus({ preventScroll: true })\n if (edit.sync) el.setSelectionRange(edit.caret, edit.caretEnd)\n }, [edit?.sync, inCell, edit !== null]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const readCaret = (el: HTMLTextAreaElement | HTMLInputElement) => {\n const a = el.selectionStart ?? el.value.length\n const b = el.selectionEnd ?? a\n setEdit((p) => (p && (p.caret !== a || p.caretEnd !== b) ? { ...p, caret: a, caretEnd: b } : p))\n }\n\n const onInput = (el: HTMLTextAreaElement | HTMLInputElement) => {\n const v = el.value\n const a = el.selectionStart ?? v.length\n const b = el.selectionEnd ?? a\n setEdit((p) => (p ? { ...p, value: v, caret: a, caretEnd: b, point: undefined } : p))\n }\n\n /** inserts / replaces the pointed reference at the caret */\n const pointAt = (ar: number, ac: number, fr: number, fc: number) => {\n setEdit((p) => {\n if (!p) return p\n const text = rangeText(ar, ac, fr, fc, sheet !== p.sheet ? meta.sheets[sheet]?.name : undefined)\n const live = p.point && p.point.e === p.caret && p.caret === p.caretEnd\n const s0 = live ? p.point!.s : p.caret\n const e0 = live ? p.point!.e : p.caretEnd\n if (live && p.value.slice(s0, e0) === text) return p\n const end = s0 + text.length\n return { ...p, value: p.value.slice(0, s0) + text + p.value.slice(e0), caret: end, caretEnd: end, sync: p.sync + 1, point: { s: s0, e: end, sheet, ar, ac, fr, fc } }\n })\n }\n\n const pointDrag = useRef<{ ar: number; ac: number; axis: 'cell' | 'col' | 'row' } | null>(null)\n\n /** keyboard pointing (Enter mode): arrows move the reference, Shift extends it */\n const movePoint = (dr: number, dc: number, extend: boolean) => {\n const p = edit?.point && pointActive && edit.point.sheet === sheet ? edit.point : null\n const baseR = p ? p.ar : own ? edit!.r : sel.ar\n const baseC = p ? p.ac : own ? edit!.c : sel.ac\n const clampR = (r: number) => Math.max(0, Math.min(rowAxis.count - 1, r))\n const clampC = (c: number) => Math.max(0, Math.min(colAxis.count - 1, c))\n if (extend) {\n const fr = clampR((p ? p.fr : baseR) + dr)\n const fc = clampC((p ? p.fc : baseC) + dc)\n pointAt(baseR, baseC, fr, fc)\n scrollIntoView(fr, fc)\n } else {\n const r = clampR(baseR + dr)\n const c = clampC(baseC + dc)\n pointAt(r, c, r, c)\n scrollIntoView(r, c)\n }\n }\n\n const accept = (f: FnInfo) => {\n const w = word\n if (!w) return\n setEdit((p) => {\n if (!p) return p\n const noArgs = !f.args.length && !f.variadic\n const ins = f.name + (w.call ? '' : noArgs ? '()' : '(')\n const caret = w.s + f.name.length + (noArgs && !w.call ? 2 : 1)\n return { ...p, value: p.value.slice(0, w.s) + ins + p.value.slice(w.e), caret, caretEnd: caret, sync: p.sync + 1, point: undefined }\n })\n }\n\n const moveBy = (dr: number, dc: number, extend: boolean) => {\n const baseR = extend ? sel.fr : sel.ar\n const baseC = extend ? sel.fc : sel.ac\n const m = !extend ? mergeAt(sel.ar, sel.ac) : undefined\n let r = baseR + dr\n let c = baseC + dc\n if (m && dr > 0) r = m.r1 + dr\n if (m && dc > 0) c = m.c1 + dc\n r = Math.max(0, Math.min(rowAxis.count - 1, r))\n c = Math.max(0, Math.min(colAxis.count - 1, c))\n while (r > 0 && rowAxis.size(r) === 0 && dr < 0) r--\n while (rowAxis.size(r) === 0 && r < rowAxis.count - 1) r++\n while (c > 0 && colAxis.size(c) === 0 && dc < 0) c--\n while (colAxis.size(c) === 0 && c < colAxis.count - 1) c++\n if (extend) setSelState({ ...sel, fr: r, fc: c })\n else setSel({ ar: r, ac: c, fr: r, fc: c })\n scrollIntoView(r, c)\n }\n\n const clearRange = () => {\n const cells = []\n const R = { ...rect, r1: Math.min(rect.r1, rect.r0 + 5000), c1: Math.min(rect.c1, rect.c0 + 200) }\n for (let r = R.r0; r <= R.r1; r++) {\n const row = store.row(sheet, r)\n for (let c = R.c0; c <= R.c1; c++) if (row?.some((x) => x[0] === c && x[1] !== '')) cells.push({ r, c, input: '' })\n }\n if (cells.length) void run(client.call('xlsx.set', sheet, cells))\n }\n\n const activeCss = (styles[styleOf(sel.ar, sel.ac)] ?? {}) as Record<string, string | number>\n const fmt = (patch: FmtPatch) => fmtAt(rect, patch)\n const fmtAt = (range: Range, patch: FmtPatch) => {\n void run(client.call('xlsx.format', sheet, range, patch))\n focusGrid()\n }\n const toggle = (k: 'b' | 'i' | 'u' | 'strike') => {\n const on =\n k === 'b' ? activeCss.fontWeight === 700 : k === 'i' ? activeCss.fontStyle === 'italic' : String(activeCss.textDecoration ?? '').includes(k === 'u' ? 'underline' : 'line-through')\n fmt({ [k]: !on })\n }\n const undo = () => void run(client.call('xlsx.undo'))\n const redo = () => void run(client.call('xlsx.redo'))\n\n const tsv = () => {\n const lines: string[] = []\n const R = { ...rect, r1: Math.min(rect.r1, rect.r0 + 20000) }\n for (let r = R.r0; r <= R.r1; r++) {\n const row = store.row(sheet, r)\n const vals: string[] = []\n for (let c = R.c0; c <= R.c1; c++) vals.push(row?.find((x) => x[0] === c)?.[1] ?? '')\n lines.push(vals.join('\\t'))\n }\n return lines.join('\\n')\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (edit) return\n const mod = e.metaKey || e.ctrlKey\n const k = e.key.toLowerCase()\n if (mod && k === 's') {\n e.preventDefault()\n void viewer.save()\n return\n }\n if (editable && mod && !e.altKey) {\n if (k === 'z') {\n e.preventDefault()\n if (e.shiftKey) redo()\n else undo()\n return\n }\n if (k === 'y') {\n e.preventDefault()\n redo()\n return\n }\n if (k === 'b' || k === 'i' || k === 'u') {\n e.preventDefault()\n toggle(k)\n return\n }\n if (k === 'd' || k === 'r') {\n e.preventDefault()\n void sheetOp({ op: 'fill', range: rect, dir: k === 'd' ? 'down' : 'right' })\n return\n }\n if (k === '\\\\') {\n e.preventDefault()\n fmt({ clear: true })\n return\n }\n if (k === 'x' && e.shiftKey) {\n e.preventDefault()\n toggle('strike')\n return\n }\n }\n if (mod && (k === 'f' || k === 'h')) {\n e.preventDefault()\n setFind((f) => ({ ...f, open: true, replace: k === 'h' || f.replace, tick: f.tick + 1 }))\n return\n }\n if (e.key === 'Escape' && painter !== null) {\n setPainter(null)\n return\n }\n const pageRows = Math.max(1, Math.floor(mainH / rowAxis.def) - 1)\n const moves: Record<string, [number, number]> = {\n ArrowUp: [-1, 0], ArrowDown: [1, 0], ArrowLeft: [0, -1], ArrowRight: [0, 1],\n PageDown: [pageRows, 0], PageUp: [-pageRows, 0],\n }\n if (moves[e.key]) {\n e.preventDefault()\n const [dr, dc] = moves[e.key]\n if (mod) moveBy(dr ? (dr > 0 ? Math.max(0, s.rows - 1 - (e.shiftKey ? sel.fr : sel.ar)) : -1e9) : 0, dc ? (dc > 0 ? Math.max(0, s.cols - 1 - (e.shiftKey ? sel.fc : sel.ac)) : -1e9) : 0, e.shiftKey)\n else moveBy(dr, dc, e.shiftKey)\n return\n }\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault()\n if (e.key === 'Enter') moveBy(e.shiftKey ? -1 : 1, 0, false)\n else moveBy(0, e.shiftKey ? -1 : 1, false)\n return\n }\n if (!editable) return\n if (e.key === 'F2') {\n e.preventDefault()\n void startEdit()\n } else if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault()\n clearRange()\n } else if (e.key.length === 1 && !mod && !e.altKey) {\n e.preventDefault()\n void startEdit(e.key)\n }\n }\n\n const onMouseDown = (e: React.MouseEvent) => {\n if (e.button !== 0) return\n const grip = (e.target as HTMLElement).closest('[data-grip-col],[data-grip-row]') as HTMLElement | null\n if (grip) {\n e.preventDefault()\n const col = grip.dataset.gripCol\n const i = Number(col ?? grip.dataset.gripRow)\n setResizing(col !== undefined ? { axis: 'col', i, start: e.clientX, size: colAxis.size(i) } : { axis: 'row', i, start: e.clientY, size: rowAxis.size(i) })\n return\n }\n const el = e.currentTarget as HTMLElement\n const { r, c } = cellAt(e.clientX, e.clientY, el)\n if (edit && pointOk) {\n // formula: clicking / dragging cells inserts references, the input keeps focus\n e.preventDefault()\n if (r < 0 && c < 0) return\n const axis = r < 0 ? 'col' : c < 0 ? 'row' : 'cell'\n let [ar, ac] = [Math.max(r, 0), Math.max(c, 0)]\n const m = axis === 'cell' ? mergeAt(r, c) : undefined\n if (m) [ar, ac] = [m.r0, m.c0]\n const p = e.shiftKey && pointActive && edit.point!.sheet === sheet ? edit.point! : null\n if (p) [ar, ac] = [p.ar, p.ac]\n pointDrag.current = { ar, ac, axis }\n pointRange(ar, ac, r, c, axis)\n return\n }\n if (edit) commit()\n e.preventDefault()\n if (painter !== null && r >= 0 && c >= 0) {\n const xf = painter\n afterDrag.current = () => {\n setPainter(null)\n fmtAt(selRef.current, { xf })\n }\n }\n focusGrid()\n if (r < 0 && c < 0) {\n setSel({ ar: 0, ac: 0, fr: Math.max(0, s.rows - 1), fc: Math.max(0, s.cols - 1) })\n return\n }\n if (r < 0) setSel({ ar: 0, ac: c, fr: Math.max(0, s.rows - 1), fc: c })\n else if (c < 0) setSel({ ar: r, ac: 0, fr: r, fc: Math.max(0, s.cols - 1) })\n else if (e.shiftKey) setSelState({ ...sel, fr: r, fc: c })\n else setSel({ ar: r, ac: c, fr: r, fc: c })\n if (r >= 0 && c >= 0) dragging.current = true\n }\n\n /** pointed block from the drag anchor to (r, c); header drags select whole columns / rows */\n const pointRange = (ar: number, ac: number, r: number, c: number, axis: 'cell' | 'col' | 'row') => {\n if (axis === 'col') pointAt(0, ac, MAX_ROW, Math.max(0, c))\n else if (axis === 'row') pointAt(ar, 0, Math.max(0, r), MAX_COL)\n else {\n const m0 = mergeAt(r, c)\n // inside the anchor's merge: just the anchor cell\n const m = m0 && !(ar >= m0.r0 && ar <= m0.r1 && ac >= m0.c0 && ac <= m0.c1) ? m0 : undefined\n // dragging over a merge takes all of it\n const fr = m ? (m.r0 < ar ? m.r0 : m.r1) : Math.max(0, r)\n const fc = m ? (m.c0 < ac ? m.c0 : m.c1) : Math.max(0, c)\n pointAt(ar, ac, fr, fc)\n }\n }\n\n useEffect(() => {\n const up = () => {\n dragging.current = false\n pointDrag.current = null\n const fn = afterDrag.current\n afterDrag.current = null\n if (fn) setTimeout(fn, 0)\n }\n window.addEventListener('mouseup', up)\n return () => window.removeEventListener('mouseup', up)\n }, [])\n\n useEffect(() => {\n if (!resizing) return\n const axis = resizing.axis === 'col' ? colAxis : rowAxis\n const move = (e: MouseEvent) => {\n const d = (resizing.axis === 'col' ? e.clientX : e.clientY) - resizing.start\n axis.set(resizing.i, Math.max(resizing.axis === 'col' ? 8 : 6, Math.round(resizing.size + d)))\n setDetailTick((t) => t + 1)\n }\n const up = () => {\n const px = axis.size(resizing.i)\n setResizing(null)\n // resize every selected full column / row together\n const full = resizing.axis === 'col' ? rect.r0 === 0 && rect.r1 >= s.rows - 1 && resizing.i >= rect.c0 && resizing.i <= rect.c1 : rect.c0 === 0 && rect.c1 >= s.cols - 1 && resizing.i >= rect.r0 && resizing.i <= rect.r1\n const [a, b] = full ? (resizing.axis === 'col' ? [rect.c0, rect.c1] : [rect.r0, rect.r1]) : [resizing.i, resizing.i]\n void sheetOp(resizing.axis === 'col' ? { op: 'colWidth', c0: a, c1: b, px } : { op: 'rowHeight', r0: a, r1: b, px })\n }\n window.addEventListener('mousemove', move)\n window.addEventListener('mouseup', up, { once: true })\n return () => {\n window.removeEventListener('mousemove', move)\n window.removeEventListener('mouseup', up)\n }\n })\n\n const sheetOp = (op: SheetOp) => run(client.call('xlsx.sheetOp', sheet, op))\n const merged = !!s.merges.find((m) => m.r0 === rect.r0 && m.c0 === rect.c0 && m.r1 === rect.r1 && m.c1 === rect.c1)\n const toggleMerge = () => void sheetOp({ op: merged ? 'unmerge' : 'merge', range: rect })\n const merge = (mode: MergeMode) => void sheetOp(mode === 'unmerge' ? { op: 'unmerge', range: rect } : { op: 'merge', range: rect, mode })\n const freeze = (kind: 'none' | 'row' | 'col' | 'sel') =>\n void sheetOp({ op: 'freeze', rows: kind === 'row' ? 1 : kind === 'sel' ? sel.ar : 0, cols: kind === 'col' ? 1 : kind === 'sel' ? sel.ac : 0 })\n /** AutoSum-style: the function over the numbers above (or left of) the active cell */\n const autoFn = (fn = 'SUM') => {\n const { ar, ac } = sel\n if (rect.r0 !== rect.r1 || rect.c0 !== rect.c1) {\n // a selected block: result goes under it\n const ref = `${colName(rect.c0)}${rect.r0 + 1}:${colName(rect.c1)}${rect.r1 + 1}`\n void run(client.call('xlsx.set', sheet, [{ r: rect.r1 + 1, c: rect.c0, input: `=${fn}(${ref})` }]))\n return\n }\n const num = (r: number, c: number) => store.row(sheet, r)?.find((x) => x[0] === c)?.[3] === 1\n let r = ar - 1\n while (r >= 0 && num(r, ac)) r--\n let ref = ''\n if (r < ar - 1) ref = `${colName(ac)}${r + 2}:${colName(ac)}${ar}`\n else {\n let c = ac - 1\n while (c >= 0 && num(ar, c)) c--\n if (c < ac - 1) ref = `${colName(c + 1)}${ar + 1}:${colName(ac - 1)}${ar + 1}`\n }\n if (!ref) return void startEdit(`=${fn}(`)\n void run(client.call('xlsx.set', sheet, [{ r: ar, c: ac, input: `=${fn}(${ref})` }]))\n }\n const sortBy = (desc: boolean) => {\n // one cell: sort the data below the frozen header by the active column\n const single = rect.r0 === rect.r1\n const range = single ? { r0: frozen.rows, c0: 0, r1: Math.max(frozen.rows, s.rows - 1), c1: Math.max(0, s.cols - 1) } : rect\n void sheetOp({ op: 'sort', range, col: sel.ac, desc })\n }\n const rowsOp = (k: string) => {\n const nr = rect.r1 - rect.r0 + 1\n const nc = rect.c1 - rect.c0 + 1\n const ops: Record<string, SheetOp> = {\n rowAbove: { op: 'insertRows', at: rect.r0, n: nr },\n rowBelow: { op: 'insertRows', at: rect.r1 + 1, n: nr },\n colLeft: { op: 'insertCols', at: rect.c0, n: nc },\n colRight: { op: 'insertCols', at: rect.c1 + 1, n: nc },\n delRow: { op: 'deleteRows', at: rect.r0, n: nr },\n delCol: { op: 'deleteCols', at: rect.c0, n: nc },\n hideRows: { op: 'hideRows', a: rect.r0, b: rect.r1, hidden: true },\n hideCols: { op: 'hideCols', a: rect.c0, b: rect.c1, hidden: true },\n // unhide what lies inside (or right around) the selection\n unhideRows: { op: 'hideRows', a: Math.max(0, rect.r0 - (nr === 1 ? 1 : 0)), b: rect.r1 + (nr === 1 ? 1 : 0), hidden: false },\n unhideCols: { op: 'hideCols', a: Math.max(0, rect.c0 - (nc === 1 ? 1 : 0)), b: rect.c1 + (nc === 1 ? 1 : 0), hidden: false },\n }\n if (ops[k]) void sheetOp(ops[k])\n }\n const pasteText = (raw: string) => {\n const text = raw.replace(/\\r\\n?/g, '\\n').replace(/\\n$/, '')\n const cells = text.split('\\n').flatMap((line, i) => line.split('\\t').map((v, j) => ({ r: sel.ar + i, c: sel.ac + j, input: v })))\n if (cells.length) void run(client.call('xlsx.set', sheet, cells.slice(0, 100_000)))\n }\n const ctxItems = (): MenuItem[] => {\n const nr = rect.r1 - rect.r0 + 1\n const nc = rect.c1 - rect.c0 + 1\n const rows = nr === 1 ? `row ${rect.r0 + 1}` : `rows ${rect.r0 + 1}–${rect.r1 + 1}`\n const cols = nc === 1 ? `column ${colName(rect.c0)}` : `columns ${colName(rect.c0)}–${colName(rect.c1)}`\n const single = nr === 1 && nc === 1\n return [\n { label: 'Cut', icon: 'cut', hint: `${MOD}X`, run: () => document.execCommand('cut') },\n { label: 'Copy', icon: 'copy', hint: `${MOD}C`, run: () => document.execCommand('copy') },\n {\n label: 'Paste',\n icon: 'paste',\n hint: `${MOD}V`,\n run: () =>\n void navigator.clipboard\n ?.readText()\n .then(pasteText)\n .catch(() => setToast(`The browser blocked clipboard access — use ${MOD}V to paste`)),\n },\n { label: `Insert ${nr} row${nr > 1 ? 's' : ''} above`, icon: 'rowAbove', sep: true, run: () => rowsOp('rowAbove') },\n { label: `Insert ${nr} row${nr > 1 ? 's' : ''} below`, icon: 'rowBelow', run: () => rowsOp('rowBelow') },\n { label: `Insert ${nc} column${nc > 1 ? 's' : ''} left`, icon: 'colLeft', run: () => rowsOp('colLeft') },\n { label: `Insert ${nc} column${nc > 1 ? 's' : ''} right`, icon: 'colRight', run: () => rowsOp('colRight') },\n { label: `Delete ${rows}`, icon: 'delRow', sep: true, run: () => rowsOp('delRow') },\n { label: `Delete ${cols}`, icon: 'delCol', run: () => rowsOp('delCol') },\n { label: `Hide ${rows}`, icon: 'hide', sep: true, run: () => rowsOp('hideRows') },\n { label: `Hide ${cols}`, icon: 'hide', run: () => rowsOp('hideCols') },\n { label: 'Unhide rows', icon: 'view', run: () => rowsOp('unhideRows') },\n { label: 'Unhide columns', icon: 'view', run: () => rowsOp('unhideCols') },\n { label: merged ? 'Unmerge cells' : 'Merge cells', icon: 'merge', sep: true, run: toggleMerge, disabled: single && !merged },\n { label: `Sort ${single ? 'sheet' : 'range'} by ${colName(sel.ac)}, A → Z`, icon: 'sortAZ', run: () => sortBy(false) },\n { label: `Sort ${single ? 'sheet' : 'range'} by ${colName(sel.ac)}, Z → A`, icon: 'sortZA', run: () => sortBy(true) },\n { label: 'Fill down', icon: 'down', hint: `${MOD}D`, run: () => void sheetOp({ op: 'fill', range: rect, dir: 'down' }), disabled: nr === 1 },\n { label: 'Fill right', hint: `${MOD}R`, run: () => void sheetOp({ op: 'fill', range: rect, dir: 'right' }), disabled: nc === 1 },\n { label: 'Clear contents', icon: 'trash', hint: 'Del', sep: true, run: clearRange },\n { label: 'Clear formatting', icon: 'clear', hint: `${MOD}\\\\`, run: () => fmt({ clear: true }) },\n { label: `Freeze up to ${colName(sel.ac)}${sel.ar + 1}`, icon: 'freeze', sep: true, run: () => freeze('sel') },\n { label: 'Unfreeze', run: () => freeze('none'), disabled: !frozen.rows && !frozen.cols },\n ]\n }\n\n // ---------------------------------------------------------------- find & replace\n useEffect(() => {\n if (!find.open || !find.q) {\n setMatches([])\n return\n }\n let live = true\n const id = setTimeout(() => {\n client.call('xlsx.find', sheet, find.q, findOpts).then((m) => live && setMatches(m), () => {})\n }, 150)\n return () => {\n live = false\n clearTimeout(id)\n }\n }, [client, sheet, find.open, find.q, find.tick, findOpts, detailTick])\n const gotoMatch = (i: number) => {\n const m = matches[i]\n if (!m) return\n setFind((f) => ({ ...f, idx: i }))\n setSel({ ar: m.r, ac: m.c, fr: m.r, fc: m.c })\n scrollIntoView(m.r, m.c)\n }\n const findBoxes = find.open ? matches : []\n\n const onMouseMove = (e: React.MouseEvent) => {\n const pd = pointDrag.current\n if (pd) {\n const { r, c } = cellAt(e.clientX, e.clientY, e.currentTarget as HTMLElement)\n pointRange(pd.ar, pd.ac, r, c, pd.axis)\n return\n }\n if (!dragging.current) return\n const { r, c } = cellAt(e.clientX, e.clientY, e.currentTarget as HTMLElement)\n if (r >= 0 && c >= 0 && (r !== sel.fr || c !== sel.fc)) setSelState((p) => ({ ...p, fr: r, fc: c }))\n }\n\n const box = edit && own ? cellBox(edit.r, edit.c) : null\n const fx = edit ? edit.value : shown(detail, sel.ar, sel.ac)\n const editKeys = (e: React.KeyboardEvent<HTMLTextAreaElement | HTMLInputElement>) => {\n if (!edit || e.nativeEvent.isComposing) return\n const mod = e.metaKey || e.ctrlKey\n if (sugg.length) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n const n = sugg.length\n setSugIdx((i) => (Math.min(i, n - 1) + (e.key === 'ArrowDown' ? 1 : n - 1)) % n)\n return\n }\n if (e.key === 'Tab' || (e.key === 'Enter' && !e.altKey && !e.shiftKey)) {\n e.preventDefault()\n accept(sugg[Math.min(sugIdx, sugg.length - 1)])\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n const at = word?.s\n setEdit((p) => (p ? { ...p, noSuggest: at } : p))\n return\n }\n }\n const arrow = ARROWS[e.key]\n if (arrow && !mod && !e.altKey && edit.mode === 'enter') {\n if (pointOk) {\n e.preventDefault()\n movePoint(arrow[0], arrow[1], e.shiftKey)\n return\n }\n if (inCell && !e.shiftKey) {\n e.preventDefault()\n commit(arrow)\n return\n }\n }\n if ((e.key === 'Home' || e.key === 'End') && !mod && !e.altKey) {\n // macOS scrolls the page on Home/End: move the caret instead\n e.preventDefault()\n const el = e.currentTarget\n const len = el.value.length\n if (e.key === 'Home') el.setSelectionRange(0, e.shiftKey ? (el.selectionEnd ?? 0) : 0, e.shiftKey ? 'backward' : 'none')\n else el.setSelectionRange(e.shiftKey ? (el.selectionStart ?? len) : len, len)\n readCaret(el)\n } else if (e.key === 'F2') {\n e.preventDefault()\n setEdit((p) => (p ? { ...p, mode: p.mode === 'enter' ? 'edit' : 'enter' } : p))\n } else if (e.key === 'Enter' && !e.altKey) {\n e.preventDefault()\n commit([e.shiftKey ? -1 : 1, 0])\n } else if (e.key === 'Tab') {\n e.preventDefault()\n commit([0, e.shiftKey ? -1 : 1])\n } else if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n }\n }\n\n // autocomplete list / argument hint under the active input\n let assist: ReactNode = null\n if (edit && (sugg.length || hint)) {\n const slot = hint && fctx?.call ? argSlot(hint, fctx.call.arg) : -1\n assist = sugg.length ? (\n <div className=\"de-fassist\" role=\"listbox\" onMouseDown={(e) => e.preventDefault()}>\n {sugg.map((f, i) => {\n const on = i === Math.min(sugIdx, sugg.length - 1)\n return (\n <div key={f.name} role=\"option\" aria-selected={on} className={on ? 'de-fsug on' : 'de-fsug'} onMouseEnter={() => setSugIdx(i)} onClick={() => accept(f)}>\n <span className=\"de-fsug-name\">{f.name}</span>\n <span className=\"de-fsug-args\">({[...f.args, ...(f.variadic ? ['...'] : [])].join(', ')})</span>\n {on && <div className=\"de-fsug-desc\">{f.desc}</div>}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"de-fassist de-fhint\" onMouseDown={(e) => e.preventDefault()}>\n <div>\n {hint!.name}(\n {[...hint!.args, ...(hint!.variadic ? ['...'] : [])].map((a, i, all) => (\n <span key={i}>\n {i === slot ? <b>{a}</b> : a}\n {i < all.length - 1 ? ', ' : ''}\n </span>\n ))}\n )\n </div>\n <div className=\"de-fsug-desc\">{hint!.desc}</div>\n </div>\n )\n }\n\n // in-cell editor geometry (shared by the textarea and its highlight layer)\n const edStyle: CSSProperties | undefined =\n edit && box\n ? {\n left: box.x - 1,\n top: box.y - 1,\n minWidth: box.w + 2,\n width: Math.max(box.w + 2, Math.min(480, edit.value.length * 8 + 16)),\n height: Math.max(box.h + 2, edit.value.split('\\n').length * 18 + 4),\n ...(meta.baseFont as CSSProperties),\n }\n : undefined\n const hlParts: ReactNode[] = []\n if (edit && refSpans.length) {\n let at = 0\n for (const r of refSpans) {\n if (r.s > at) hlParts.push(edit.value.slice(at, r.s))\n hlParts.push(\n <span key={r.s} style={{ color: r.color }}>\n {edit.value.slice(r.s, r.e)}\n </span>,\n )\n at = r.e\n }\n hlParts.push(edit.value.slice(at) + '\\u200b')\n }\n const assistPos = (() => {\n if (!edStyle || !assist) return undefined\n const top = (edStyle.top as number) + (edStyle.height as number) + 2\n return top + 200 > size.h && (edStyle.top as number) > 200 ? { left: edStyle.left as number, bottom: size.h - (edStyle.top as number) + 2 } : { left: edStyle.left as number, top }\n })()\n\n return (\n <>\n <div className=\"de-fx\">\n <div className=\"de-fx-ref\">\n {colName(sel.ac)}\n {sel.ar + 1}\n {(rect.r0 !== rect.r1 || rect.c0 !== rect.c1) && `:${colName(rect.c1)}${rect.r1 + 1}`}\n </div>\n {editable ? (\n <input\n ref={fxRef}\n className=\"de-fx-val de-fx-input\"\n value={fx}\n spellCheck={false}\n aria-label=\"Cell content\"\n onFocus={() => !edit && void startEdit(undefined, true)}\n onChange={(e) => onInput(e.target)}\n onSelect={(e) => readCaret(e.currentTarget)}\n onKeyDown={editKeys}\n onBlur={() => {\n if (hold.current) return\n if (edit && (edit.bar || !own)) commit()\n }}\n />\n ) : (\n <div className=\"de-fx-val\" title={fx}>\n {fx}\n </div>\n )}\n {edit && !inCell && assist && <div className=\"de-fassist-at\" style={{ left: 88, top: 30 }}>{assist}</div>}\n </div>\n <div\n ref={scrollRef}\n className=\"de-grid\"\n tabIndex={0}\n onKeyDown={onKeyDown}\n onCopy={(e) => {\n if (edit) return\n e.preventDefault()\n e.clipboardData.setData('text/plain', tsv())\n }}\n onCut={(e) => {\n if (edit || !editable) return\n e.preventDefault()\n e.clipboardData.setData('text/plain', tsv())\n clearRange()\n }}\n onPaste={(e) => {\n if (edit || !editable) return\n e.preventDefault()\n pasteText(e.clipboardData.getData('text/plain'))\n }}\n >\n <div style={{ position: 'relative', width: Math.max(spacerW, size.w), height: Math.max(spacerH, size.h) }}>\n <div\n className=\"de-grid-view\"\n style={{ width: size.w, height: size.h, ...(meta.baseFont as CSSProperties) }}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onContextMenu={(e) => {\n if (!editable) return\n e.preventDefault()\n const { r, c } = cellAt(e.clientX, e.clientY, e.currentTarget as HTMLElement)\n if (r >= 0 && c >= 0 && (r < rect.r0 || r > rect.r1 || c < rect.c0 || c > rect.c1)) setSel({ ar: r, ac: c, fr: r, fc: c })\n setCtx({ x: e.clientX, y: e.clientY })\n }}\n onDoubleClick={() => !edit && void startEdit()}\n >\n {region('main', r0, r1, c0, c1, mainOx, mainOy, HW + fw, HH + fh, mainW, mainH)}\n {fr > 0 && region('top', 0, fr - 1, c0, c1, mainOx, 0, HW + fw, HH, mainW, fh)}\n {fc > 0 && region('left', r0, r1, 0, fc - 1, 0, mainOy, HW, HH + fh, fw, mainH)}\n {fr > 0 && fc > 0 && region('tl', 0, fr - 1, 0, fc - 1, 0, 0, HW, HH, fw, fh)}\n {colHeaders('ch', c0, c1, mainOx, HW + fw, mainW)}\n {fc > 0 && colHeaders('chf', 0, fc - 1, 0, HW, fw)}\n {rowHeaders('rh', r0, r1, mainOy, HH + fh, mainH)}\n {fr > 0 && rowHeaders('rhf', 0, fr - 1, 0, HH, fh)}\n {fr > 0 && <div className=\"de-freeze-h\" style={{ left: 0, top: HH + fh - 1, width: size.w, height: 2 }} />}\n {fc > 0 && <div className=\"de-freeze-v\" style={{ left: HW + fw - 1, top: 0, width: 2, height: size.h }} />}\n <div className=\"de-corner\" style={{ width: HW, height: HH }} />\n {edit && inCell && edStyle && (\n <>\n {hlParts.length > 0 && (\n <div ref={hlRef} className=\"de-cell-edit de-cell-hl\" style={edStyle} aria-hidden>\n {hlParts}\n </div>\n )}\n <textarea\n ref={editRef}\n className={hlParts.length ? 'de-cell-edit de-cell-edit-fx' : 'de-cell-edit'}\n spellCheck={false}\n value={edit.value}\n style={edStyle}\n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => onInput(e.target)}\n onSelect={(e) => readCaret(e.currentTarget)}\n onScroll={(e) => {\n if (hlRef.current) hlRef.current.scrollTop = e.currentTarget.scrollTop\n }}\n onKeyDown={editKeys}\n onBlur={(e) => {\n if (hold.current) return\n // moving into the formula bar keeps editing there\n if (e.relatedTarget && e.relatedTarget === fxRef.current) return setEdit((p) => (p ? { ...p, bar: true, sync: 0 } : p))\n commit()\n }}\n />\n {assist && assistPos && (\n <div className=\"de-fassist-at\" style={assistPos}>\n {assist}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n {editable && (\n <XlsxToolbar\n css={activeCss}\n base={meta.baseFont as { fontFamily?: string; fontSize?: string | number }}\n format={meta.formats[styleOf(sel.ar, sel.ac)] ?? 'General'}\n merged={merged}\n frozen={!!(frozen.rows || frozen.cols)}\n gridlines={s.gridLines}\n painter={painter !== null}\n onToggle={toggle}\n onFormat={fmt}\n onUndo={undo}\n onRedo={redo}\n onPaint={() => {\n setPainter((p) => (p === null ? styleOf(sel.ar, sel.ac) : null))\n focusGrid()\n }}\n onMerge={merge}\n onFreeze={freeze}\n onGridlines={() => void sheetOp({ op: 'gridlines', show: !s.gridLines })}\n onFunc={(fn) => (fn ? autoFn(fn) : void startEdit('='))}\n onSort={sortBy}\n onRows={rowsOp}\n onFind={() => setFind((f) => ({ ...f, open: true, tick: f.tick + 1 }))}\n />\n )}\n {find.open && (\n <FindBar\n query={find.q}\n index={find.idx}\n count={matches.length}\n editable={editable}\n replace={find.replace}\n placeholder=\"Find in sheet\"\n onQuery={(q) => setFind((f) => ({ ...f, q, idx: 0 }))}\n onNav={(d) => matches.length && gotoMatch((find.idx + d + matches.length) % matches.length)}\n onClose={() => {\n setFind((f) => ({ ...f, open: false }))\n focusGrid()\n }}\n onReplace={(text, all) => {\n const m = matches[Math.min(find.idx, matches.length - 1)]\n if (!m) return\n void run(client.call('xlsx.replace', sheet, find.q, text, findOpts, all ? undefined : { r: m.r, c: m.c }))\n }}\n options={\n <>\n {(\n [\n ['matchCase', 'Match case'],\n ['whole', 'Entire cell'],\n ['formulas', 'In formulas'],\n ] as const\n ).map(([k, label]) => (\n <label key={k} className=\"de-find-opt\">\n <input type=\"checkbox\" checked={!!findOpts[k]} onChange={(e) => setFindOpts((o) => ({ ...o, [k]: e.target.checked }))} />\n {label}\n </label>\n ))}\n </>\n }\n />\n )}\n {toast && <Toast text={toast} onDone={() => setToast(null)} />}\n {ctx && <ContextMenu x={ctx.x} y={ctx.y} items={ctxItems()} onClose={() => setCtx(null)} />}\n </>\n )\n}\n","/** React bindings: session lifecycle, presence avatars / status, collaborators' cursors. */\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore, type CSSProperties } from 'react'\nimport type { PresentationMeta } from '../core/pptx/types'\nimport type { DocumentClient } from '../core/worker/client'\nimport { getPeers, subscribePeers, type PeerView } from './hosts'\nimport { startCollab, type Collab, type CollabOptions } from './index'\nimport type { CollabStatus } from './session'\n\nconst transportIds = new WeakMap<object, number>()\nlet nextTransportId = 0\n\nfunction optsKey(o: CollabOptions | undefined): string {\n if (!o) return ''\n let t: string\n if (typeof o.transport === 'string') t = o.transport\n else {\n let id = transportIds.get(o.transport)\n if (id === undefined) transportIds.set(o.transport, (id = ++nextTransportId))\n t = `#${id}`\n }\n return `${t}|${o.room}|${o.user.id ?? ''}|${o.user.name}|${o.user.color ?? ''}`\n}\n\nexport interface CollabState {\n collab: Collab | null\n status: CollabStatus | null\n error?: string\n}\n\n/** runs a collaboration session for `client` while `opts` is set */\nexport function useCollab(client: DocumentClient | null | undefined, opts: CollabOptions | undefined): CollabState {\n const [state, setState] = useState<CollabState>({ collab: null, status: null })\n const key = optsKey(opts)\n const optsRef = useRef(opts)\n optsRef.current = opts\n useEffect(() => {\n const o = optsRef.current\n if (!client || !o) {\n setState({ collab: null, status: null })\n return\n }\n let c: Collab\n try {\n c = startCollab(client, o)\n } catch (e) {\n setState({ collab: null, status: 'error', error: (e as Error).message })\n return\n }\n const sync = () => setState({ collab: c, status: c.status, error: c.session.error })\n sync()\n const offs = [c.on('status', sync), c.on('error', sync)]\n return () => {\n offs.forEach((f) => f())\n c.close()\n }\n }, [client, key])\n return state\n}\n\nconst initials = (name: string) =>\n name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0]!.toUpperCase())\n .join('') || '?'\n\nconst LABEL: Record<CollabStatus, string> = {\n connecting: 'Connecting…',\n syncing: 'Syncing…',\n live: 'Live',\n offline: 'Offline · changes will sync',\n error: 'Not synced',\n}\n\n/** status chip + collaborators' avatars (top bar) */\nexport function CollabBar({ client, state }: { client: DocumentClient; state: CollabState }) {\n const peers = useSyncExternalStore(\n (fn) => subscribePeers(client, fn),\n () => getPeers(client),\n )\n const [pending, setPending] = useState(0)\n useEffect(() => {\n const s = state.collab?.session\n if (!s) return\n const t = setInterval(() => setPending(s.pending), 500)\n return () => clearInterval(t)\n }, [state.collab])\n if (!state.status) return null\n const title = state.status === 'error' ? state.error ?? 'Collaboration stopped' : state.status === 'live' && pending ? `Saving ${pending} change${pending > 1 ? 's' : ''}…` : LABEL[state.status]\n return (\n <span className=\"de-collab\">\n <span className={`de-collab-status de-collab-${state.status}`} title={title}>\n <span className=\"de-collab-dot\" />\n <span className=\"de-collab-label\">{state.status === 'live' ? (peers.length ? `${peers.length + 1} editing` : 'Live') : LABEL[state.status]}</span>\n </span>\n {peers.length > 0 && (\n <span className=\"de-peers\">\n {peers.slice(0, 5).map((p) => (\n <span key={p.site} className=\"de-peer\" style={{ background: p.color }} title={p.name}>\n {initials(p.name)}\n </span>\n ))}\n {peers.length > 5 && (\n <span className=\"de-peer de-peer-more\" title={peers.slice(5).map((p) => p.name).join(', ')}>\n +{peers.length - 5}\n </span>\n )}\n </span>\n )}\n </span>\n )\n}\n\ninterface Mark {\n key: string\n color: string\n name: string\n caret?: { x: number; y: number; h: number }\n boxes: { x: number; y: number; w: number; h: number }[]\n outline?: { x: number; y: number; w: number; h: number }\n}\n\n/**\n * Collaborators' cursors drawn over the document (DOCX carets / selections, PPTX selected shapes).\n * Spreadsheets draw their own (in-grid) selection boxes. Render inside a positioned container.\n */\nexport function PeerOverlay({ client, collab }: { client: DocumentClient; collab: Collab | null }) {\n const ref = useRef<HTMLDivElement>(null)\n const peers = useSyncExternalStore(\n (fn) => subscribePeers(client, fn),\n () => getPeers(client),\n )\n const [marks, setMarks] = useState<Mark[]>([])\n const active = useMemo(() => peers.filter((p) => p.presence && (p.presence as { k?: string }).k !== 'xlsx'), [peers])\n\n useEffect(() => {\n const layer = ref.current\n const root = layer?.parentElement\n if (!layer || !root || !active.length) {\n setMarks([])\n return\n }\n let raf = 0\n const measure = () => {\n raf = 0\n const base = layer.getBoundingClientRect()\n const rel = (r: DOMRect) => ({ x: r.left - base.left, y: r.top - base.top, w: r.width, h: r.height })\n const out: Mark[] = []\n for (const p of active) {\n const m = place(p, root, collab, client)\n if (!m) continue\n out.push({\n key: String(p.site),\n color: p.color,\n name: p.name,\n caret: m.caret ? { x: m.caret.left - base.left, y: m.caret.top - base.top, h: m.caret.height || 16 } : undefined,\n boxes: m.sel.map(rel),\n outline: m.outline ? rel(m.outline) : undefined,\n })\n }\n setMarks(out)\n }\n const schedule = () => {\n if (!raf) raf = requestAnimationFrame(measure)\n }\n schedule()\n root.addEventListener('scroll', schedule, true)\n window.addEventListener('resize', schedule)\n const offChange = collab?.on('change', schedule)\n // views re-render asynchronously (paging, slide loading): keep up cheaply\n const t = setInterval(schedule, 400)\n return () => {\n cancelAnimationFrame(raf)\n root.removeEventListener('scroll', schedule, true)\n window.removeEventListener('resize', schedule)\n offChange?.()\n clearInterval(t)\n }\n }, [active, collab, client])\n\n return (\n <div ref={ref} className=\"de-peer-layer\" aria-hidden>\n {marks.map((m) => (\n <div key={m.key} style={{ '--peer': m.color } as CSSProperties}>\n {m.boxes.map((b, i) => (\n <div key={i} className=\"de-peer-sel\" style={{ left: b.x, top: b.y, width: b.w, height: b.h }} />\n ))}\n {m.outline && (\n <div className=\"de-peer-outline\" style={{ left: m.outline.x - 3, top: m.outline.y - 3, width: m.outline.w + 6, height: m.outline.h + 6 }}>\n <span className=\"de-peer-flag\">{m.name}</span>\n </div>\n )}\n {m.caret && (\n <div className=\"de-peer-caret\" style={{ left: m.caret.x, top: m.caret.y, height: m.caret.h }}>\n <span className=\"de-peer-flag\">{m.name}</span>\n </div>\n )}\n </div>\n ))}\n </div>\n )\n}\n\nfunction place(p: PeerView, root: HTMLElement, collab: Collab | null, client: DocumentClient): { caret?: DOMRect | null; sel: DOMRect[]; outline?: DOMRect } | null {\n const pr = p.presence as { k?: string; slide?: string; top?: number }\n if (pr.k === 'docx') {\n const r = collab?.rects(root, p)\n return r ? { caret: r.caret, sel: r.sel } : null\n }\n if (pr.k === 'pptx' && pr.slide) {\n const meta = client.info.pptx as PresentationMeta | undefined\n const i = meta?.slides.findIndex((s) => s.path === pr.slide) ?? -1\n const frame = i >= 0 ? root.querySelector<HTMLElement>(`[data-slide=\"${i + 1}\"]`) : null\n if (!frame) return null\n const el = pr.top !== undefined ? frame.querySelector<HTMLElement>(`[data-top=\"${pr.top}\"]`) : null\n return { sel: [], outline: (el ?? frame).getBoundingClientRect() }\n }\n return null\n}\n","import { useCallback, useEffect, useInsertionEffect, useMemo, useState, type CSSProperties, type ReactNode } from 'react'\nimport type { DocSource } from '../core/source'\nimport type { DocumentClient, OpenOptions } from '../core/worker/client'\nimport type { Zoom } from './common/ZoomControl'\nimport { DocxView } from './docx/DocxView'\nimport { ViewerContext, type ViewerApi } from './common/Slots'\nimport { StatusContext } from './common/Status'\nimport { download, Icon } from './edit/Toolbar'\nimport { injectStyles } from './injectStyles'\nimport { PptxView } from './pptx/PptxView'\nimport { useDocument } from './useDocument'\nimport { XlsxView } from './xlsx/XlsxView'\nimport type { CollabOptions } from '../collab'\nimport { CollabBar, PeerOverlay, useCollab } from '../collab/react'\n\nexport interface DocViewerProps {\n /** File, Blob, ArrayBuffer, Uint8Array or URL (HTTP Range requests are used when the server supports them). */\n src: DocSource | null | undefined\n /** Display name (defaults to File.name or the URL's last segment). */\n name?: string\n className?: string\n style?: CSSProperties\n /** Show the top bar (name, status, progress). Default true. */\n toolbar?: boolean\n /** Extra toolbar content (rendered at the right). */\n toolbarExtra?: ReactNode\n /** Initial zoom for documents and presentations. Default 'fit'. */\n zoom?: Zoom\n /** Show slide thumbnails for presentations. Default true. */\n thumbnails?: boolean\n headers?: Record<string, string>\n credentials?: RequestCredentials\n /** Custom worker factory, or false to parse on the main thread. */\n worker?: OpenOptions['worker']\n /** Where to inject the stylesheet (document or a shadow root). */\n styleTarget?: Document | ShadowRoot\n onLoad?: (client: DocumentClient) => void\n onError?: (error: Error) => void\n /** Start in edit mode. Default false (view). */\n editable?: boolean\n /** Show the Edit/View toggle. Default true. */\n allowEdit?: boolean\n /** Receives the saved file instead of downloading it. */\n onSave?: (file: Blob, name: string) => void | Promise<void>\n /** Called when the document gets / loses unsaved changes. */\n onDirtyChange?: (dirty: boolean) => void\n /**\n * Real-time collaboration: everyone opening the same base document (`src`) with the same `room`\n * edits it together through the hub at `transport` (see src/collab).\n */\n collab?: CollabOptions\n}\n\nconst EXT: Record<string, string> = { docx: '.docx', xlsx: '.xlsx', pptx: '.pptx' }\n\nfunction fmtBytes(n: number) {\n if (n < 1024) return `${n} B`\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(0)} KB`\n return `${(n / 1024 / 1024).toFixed(1)} MB`\n}\n\nexport function DocViewer(props: DocViewerProps) {\n const { src, name, className, style, toolbar = true, toolbarExtra, zoom, thumbnails, headers, credentials, worker, styleTarget, onLoad, onError } = props\n const { allowEdit = true, onSave, onDirtyChange } = props\n const [editing, setEditing] = useState(!!props.editable)\n useEffect(() => {\n if (props.editable !== undefined) setEditing(!!props.editable)\n }, [props.editable])\n const [dirty, setDirtyState] = useState(false)\n const [saving, setSaving] = useState(false)\n const [barEl, setBarEl] = useState<HTMLDivElement | null>(null)\n useInsertionEffect(() => injectStyles(styleTarget), [styleTarget])\n const { client, error, loading, progress } = useDocument(src, { name, headers, credentials, worker })\n const collab = useCollab(client, props.collab)\n // with collaboration, editing waits for the shared history (offline edits sync on reconnect)\n const canEdit = !props.collab || collab.status === 'live' || collab.status === 'offline'\n const [statusEl, setStatusEl] = useState<HTMLSpanElement | null>(null)\n\n useEffect(() => {\n if (client) onLoad?.(client)\n }, [client, onLoad])\n useEffect(() => {\n if (error) onError?.(error)\n }, [error, onError])\n\n useEffect(() => {\n setDirtyState(false)\n }, [client])\n const setDirty = useCallback(\n (d: boolean) =>\n setDirtyState((prev) => {\n if (prev !== d) onDirtyChange?.(d)\n return d\n }),\n [onDirtyChange],\n )\n const fileName = (client?.name || name || 'document').replace(/\\.[^.]+$/, '') + (client ? EXT[client.kind] : '')\n const save = useCallback(async () => {\n if (!client || saving) return\n setSaving(true)\n try {\n const blob = await client.call('save')\n if (onSave) await onSave(blob, fileName)\n else download(blob, fileName)\n setDirty(false)\n } catch (e) {\n onError?.(e as Error)\n console.error('[office-engine] save failed', e)\n } finally {\n setSaving(false)\n }\n }, [client, saving, onSave, fileName, setDirty, onError])\n const api = useMemo<ViewerApi>(() => ({ bar: barEl, editable: editing && canEdit, setDirty, save, client }), [barEl, editing, canEdit, setDirty, save, client])\n\n const pct = progress && progress.total > 0 ? Math.min(100, (progress.loaded / progress.total) * 100) : 0\n const busy = loading || (!!progress && pct < 100)\n const title = client?.name ?? name ?? (typeof src === 'string' ? decodeURIComponent(src.split(/[?#]/)[0].split('/').pop() ?? '') : (src as File | undefined)?.name) ?? ''\n\n let body: ReactNode\n if (error) {\n body = (\n <div className=\"de-center\">\n <div className=\"de-error\" role=\"alert\">\n <strong>Cannot open document.</strong>\n <div>{error.message}</div>\n </div>\n </div>\n )\n } else if (!client) {\n body = src ? (\n <div className=\"de-center\">\n <div className=\"de-spinner\" />\n <div>{progress?.phase === 'download' && progress.total ? `Downloading… ${fmtBytes(progress.loaded)} / ${fmtBytes(progress.total)}` : 'Opening…'}</div>\n </div>\n ) : (\n <div className=\"de-center\">No document</div>\n )\n } else if (client.kind === 'docx') body = <DocxView key={String(client.name) + client.size} client={client} initialZoom={zoom} />\n else if (client.kind === 'xlsx') body = <XlsxView client={client} />\n else body = <PptxView client={client} initialZoom={zoom} thumbnails={thumbnails} />\n\n return (\n <div className={className ? `de-root ${className}` : 'de-root'} style={style}>\n {toolbar && (\n <div className=\"de-bar\">\n {client && <span className={`de-badge de-badge-${client.kind}`}>{client.kind}</span>}\n <span className=\"de-title\" title={title}>\n {title}\n </span>\n <span className=\"de-status\" ref={setStatusEl} hidden={!client} />\n {client && client.size > 0 && <span className=\"de-status\">{fmtBytes(client.size)}</span>}\n {client && props.collab && <CollabBar client={client} state={collab} />}\n {toolbarExtra}\n {client && allowEdit && (\n <button type=\"button\" className={editing ? 'de-mode de-mode-on' : 'de-mode'} onClick={() => setEditing((v) => !v)} title={editing ? 'Switch to viewing' : 'Edit document'}>\n <Icon name={editing ? 'view' : 'edit'} size={16} />\n {editing ? 'View' : 'Edit'}\n </button>\n )}\n {client && (editing || dirty) && (\n <button type=\"button\" className={dirty ? 'de-mode de-save-dirty' : 'de-mode'} disabled={saving} onClick={() => void save()} title=\"Save a copy (Ctrl+S)\">\n <Icon name=\"save\" size={16} />\n {saving ? 'Saving…' : dirty ? 'Save' : 'Download'}\n </button>\n )}\n <div className=\"de-progress\" style={{ width: `${busy ? Math.max(pct, 3) : 100}%`, opacity: busy ? 1 : 0 }} />\n </div>\n )}\n {toolbar && client && editing && canEdit && <div className=\"de-ebar-host\" ref={setBarEl} />}\n <div className=\"de-body\">\n <ViewerContext.Provider value={api}>\n <StatusContext.Provider value={statusEl}>{body}</StatusContext.Provider>\n </ViewerContext.Provider>\n {client && collab.collab && <PeerOverlay client={client} collab={collab.collab} />}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}